55 lines
1.2 KiB
JavaScript
55 lines
1.2 KiB
JavaScript
import useSWR from 'swr';
|
|||
|
|
import { getRecords, createRecord, updateRecord, deleteRecord } from '../lib/api';
|
||
|
|
|
||
|
|
export function useRecords(month, type = 'all') {
|
||
|
|
const key = month ? ['records', month, type] : null;
|
||
|
|
|
||
|
|
const { data, error, isLoading, mutate } = useSWR(
|
||
|
|
key,
|
||
|
|
() => getRecords(month, type),
|
||
|
|
{
|
||
|
|
revalidateOnFocus: false,
|
||
|
|
dedupingInterval: 5000,
|
||
|
|
}
|
||
|
|
);
|
||
|
|
|
||
|
|
// 乐观更新:添加记录
|
||
|
|
const addRecord = async (recordData) => {
|
||
|
|
const newRecord = await createRecord(recordData);
|
||
|
|
mutate(
|
||
|
|
(current) => (current ? [...current, newRecord] : [newRecord]),
|
||
|
|
{ revalidate: false }
|
||
|
|
);
|
||
|
|
return newRecord;
|
||
|
|
};
|
||
|
|
|
||
|
|
// 乐观更新:更新记录
|
||
|
|
const editRecord = async (id, recordData) => {
|
||
|
|
await updateRecord(id, recordData);
|
||
|
|
mutate(
|
||
|
|
(current) =>
|
||
|
|
current?.map((r) => (r.id === id ? { ...r, ...recordData } : r)),
|
||
|
|
{ revalidate: false }
|
||
|
|
);
|
||
|
|
};
|
||
|
|
|
||
|
|
// 乐观更新:删除记录
|
||
|
|
const removeRecord = async (id) => {
|
||
|
|
await deleteRecord(id);
|
||
|
|
mutate(
|
||
|
|
(current) => current?.filter((r) => r.id !== id),
|
||
|
|
{ revalidate: false }
|
||
|
|
);
|
||
|
|
};
|
||
|
|
|
||
|
|
return {
|
||
|
|
records: data || [],
|
||
|
|
isLoading,
|
||
|
|
error,
|
||
|
|
mutate,
|
||
|
|
addRecord,
|
||
|
|
editRecord,
|
||
|
|
removeRecord,
|
||
|
|
};
|
||
|
|
}
|