import { useState } from "react"; import fetcher from "src/lib/fetcher"; import poster from "src/lib/poster"; import useSWRImmutable from "swr/immutable"; import useSWRMutation from "swr/mutation"; // TODO: type & centralize types for all tasks export interface TaskResponse { id: string; userId: string; task: TaskType; } export const useGenericTaskAPI = (taskApiEndpoint: string) => { type ConcreteTaskResponse = TaskResponse; const [tasks, setTasks] = useState([]); const { isLoading, mutate, error } = useSWRImmutable( "/api/new_task/" + taskApiEndpoint, fetcher, { onSuccess: (data) => setTasks([data]), revalidateOnMount: true, } ); const { trigger } = useSWRMutation("/api/update_task", poster, { onSuccess: async (response) => { const newTask: ConcreteTaskResponse = await response.json(); setTasks((oldTasks) => [...oldTasks, newTask]); }, }); return { tasks, isLoading, trigger, error, reset: mutate }; };