import { createContext, useContext } from "react"; import toast from "react-hot-toast"; import type { NewPotenziali, PotenzialiId } from "~/schemas/public/Potenziali"; import type { PotenzialiGroups, PotenzialiGroupsId, } from "~/schemas/public/PotenzialiGroups"; import type { PotenzialeData } from "~/server/services/potenziali.service"; import { api } from "~/utils/api"; type PotenzialiContextType = { data: PotenzialeData[]; columns: PotenzialiGroups[]; setData: (data: PotenzialeData[]) => void; updateCall: () => void; addItem: (item: NewPotenziali) => void; removeItem: (id: PotenzialiId) => void; removeColumn: (id: PotenzialiGroupsId) => void; addColumn: (name: string) => void; updateItem: (item: PotenzialeData) => void; }; const PotenzialiContext = createContext(null); type PotenzialiProviderProps = { children: React.ReactNode; }; export const PotenzialiProvider = ({ children }: PotenzialiProviderProps) => { const { data } = api.potenziali.getPotenziali.useQuery(); const { data: columns } = api.potenziali.getPotenzialiGroups.useQuery(); const utils = api.useUtils(); const { mutate: addItemMutation } = api.potenziali.addPotenziale.useMutation({ onSuccess: async () => { toast.success("Elemento aggiunto con successo"); await utils.potenziali.getPotenziali.invalidate(); await utils.potenziali.getPotenzialiGroups.invalidate(); }, }); const addItem = (item: NewPotenziali) => { addItemMutation({ data: item, }); }; const { mutate: removeItemMutation } = api.potenziali.deletePotenziale.useMutation({ onSuccess: async () => { toast.success("Elemento rimosso con successo"); await utils.potenziali.getPotenziali.invalidate(); await utils.potenziali.getPotenzialiGroups.invalidate(); }, }); const removeItem = (id: PotenzialiId) => { removeItemMutation({ potenzialiId: id, }); }; const setData = (newData: PotenzialeData[]) => { utils.potenziali.getPotenziali.setData(undefined, newData); }; const { mutate: updatePotenzialiMutation } = api.potenziali.updatePotenziali.useMutation({ onSuccess: async () => { await utils.potenziali.getPotenziali.invalidate(); }, }); const updateCall = () => { updatePotenzialiMutation({ data: utils.potenziali.getPotenziali.getData() || [], }); }; const { mutate: addColumnMutation } = api.potenziali.addPotenzialeGroup.useMutation({ onSuccess: async () => { toast.success("Colonna aggiunta con successo"); await utils.potenziali.getPotenziali.invalidate(); await utils.potenziali.getPotenzialiGroups.invalidate(); }, }); const addColumn = (name: string) => { addColumnMutation({ name, }); }; const { mutate: updateItemMutation } = api.potenziali.updatePotenziale.useMutation({ onSuccess: async () => { toast.success("Elemento aggiornato con successo"); await utils.potenziali.getPotenziali.invalidate(); }, }); const updateItem = (item: PotenzialeData) => { const { column, username: _username, ...rest } = item; updateItemMutation({ potenzialiId: item.id, data: { ...rest, potenziali_group_id: column as PotenzialiGroupsId, }, }); }; const { mutate: removeColumnMutation } = api.potenziali.deletePotenzialeGroup.useMutation({ onSuccess: async () => { toast.success("Colonna rimossa con successo"); await utils.potenziali.getPotenziali.invalidate(); await utils.potenziali.getPotenzialiGroups.invalidate(); }, }); const removeColumn = (id: PotenzialiGroupsId) => { removeColumnMutation({ potenzialiGroupId: id, }); }; return ( {children} ); }; export const usePotenziali = () => { const context = useContext(PotenzialiContext); if (!context) { throw new Error("usePotenziali must be used within a PotenzialiProvider"); } return context; };