import { CreatePromocodeBody, PromocodeList } from "@root/model/promocodes"; import { enqueueSnackbar } from "notistack"; import { useCallback, useRef } from "react"; import useSwr, { mutate } from "swr"; import { promocodeApi } from "./requests"; export function usePromocodes(page: number, pageSize: number) { const promocodesCountRef = useRef(0); const swrResponse = useSwr( ["promocodes", page, pageSize], async (key) => { const result = await promocodeApi.getPromocodeList({ limit: key[2], filter: { active: true, }, page: key[1], }); promocodesCountRef.current = result.count; return result; }, { onError(err) { console.log("Error fetching promocodes", err); enqueueSnackbar(err.message, { variant: "error" }); }, focusThrottleInterval: 60e3, keepPreviousData: true, } ); const createPromocode = useCallback(async function (body: CreatePromocodeBody) { try { await promocodeApi.createPromocode(body); mutate(["promocodes", page, pageSize]); } catch (error) { console.log("Error creating promocode", error); if (error instanceof Error) enqueueSnackbar(error.message, { variant: "error" }); } }, [page, pageSize]); const deletePromocode = useCallback(async function (id: string) { try { await mutate( ["promocodes", page, pageSize], promocodeApi.deletePromocode(id), { optimisticData(currentData, displayedData) { if (!displayedData) return; return { count: displayedData.count - 1, items: displayedData.items.filter((item) => item.id !== id), }; }, rollbackOnError: true, populateCache(result, currentData) { if (!currentData) return; return { count: currentData.count - 1, items: currentData.items.filter((item) => item.id !== id), }; }, } ); } catch (error) { console.log("Error deleting promocode", error); if (error instanceof Error) enqueueSnackbar(error.message, { variant: "error" }); } }, [page, pageSize]); return { ...swrResponse, createPromocode, deletePromocode, promocodesCount: promocodesCountRef.current, }; }