mirror of
https://github.com/wassname/Open-Assistant.git
synced 2026-06-30 16:40:05 +08:00
38 lines
1.0 KiB
TypeScript
38 lines
1.0 KiB
TypeScript
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<TaskType> {
|
|
id: string;
|
|
userId: string;
|
|
task: TaskType;
|
|
}
|
|
|
|
export const useGenericTaskAPI = <TaskType,>(taskApiEndpoint: string) => {
|
|
type ConcreteTaskResponse = TaskResponse<TaskType>;
|
|
|
|
const [tasks, setTasks] = useState<ConcreteTaskResponse[]>([]);
|
|
|
|
const { isLoading, mutate, error } = useSWRImmutable<ConcreteTaskResponse>(
|
|
"/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 };
|
|
};
|