diff --git a/frontend/pages/products.vue b/frontend/pages/products.vue index 443a4c2..4561e8b 100644 --- a/frontend/pages/products.vue +++ b/frontend/pages/products.vue @@ -8,31 +8,48 @@ import { PRODUCT_RANGE } from "~/constants"; // state -const route = useRoute(); +const params: GetProductsFilters = useUrlSearchParams("history", { + initialValue: { + search: "", + sort: "newest", + price_gte: PRODUCT_RANGE.min, + price_lte: PRODUCT_RANGE.max, + in_stock: false, + has_discount: false, + category: "", + page: "1", + }, +}); -const params: GetProductsFilters & { page: number } = - useUrlSearchParams("history"); +const search = ref(params.search ?? ""); +const searchDebounced = refDebounced(search, 1000); -// computed +// provide / inject -const page = computed(() => (route.query["page"] ? +route.query["page"] : 1)); +provide("params", params); // queries -const { data: products, isLoading: productsIsLoading } = useGetProducts( - params, - page -); +const { data, isLoading: productsIsLoading } = useGetProducts(params); -// life-cycle - -onMounted(() => { - if (!("range" in params)) { - params.range = []; - params.range[0] = PRODUCT_RANGE.min; - params.range[1] = PRODUCT_RANGE.max; - } +const products = computed(() => { + return data.value?.results.flat(); }); + +const paginationData = computed(() => { + return data!.value?.results.map((_, i: number) => { + return { type: "page", value: i }; + }); +}); + +// watch + +watch( + () => searchDebounced.value, + (newValue) => { + params.search = newValue; + } +);