You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
46 lines
1.3 KiB
46 lines
1.3 KiB
/**
|
|
* 薪资计算记录 hook:封装记录列表的取数与保存/删除变更。
|
|
* 列表通过通用 useAsyncData 管理 loading/error/refresh 三态;
|
|
* save/remove 为变更操作,执行后调用 refresh 以 storage 为唯一真相源重新取数。
|
|
*/
|
|
import { useCallback } from 'react';
|
|
import { useAsyncData } from './useAsyncData';
|
|
import { deleteSalaryRecord, fetchSalaryRecords, saveSalaryRecord } from '../api';
|
|
import type {
|
|
SalaryCalcInput,
|
|
SalaryCalcRecord,
|
|
SalaryCalcResult,
|
|
} from '../types';
|
|
|
|
export function useSalaryRecords() {
|
|
const fetcher = useCallback(() => fetchSalaryRecords(), []);
|
|
const { data, loading, error, refresh } = useAsyncData<SalaryCalcRecord[]>(fetcher);
|
|
|
|
/** 保存当前计算结果,成功后刷新列表 */
|
|
const save = useCallback(
|
|
async (input: SalaryCalcInput, result: SalaryCalcResult, note?: string) => {
|
|
const record = await saveSalaryRecord(input, result, note);
|
|
refresh();
|
|
return record;
|
|
},
|
|
[refresh],
|
|
);
|
|
|
|
/** 删除某条记录,成功后刷新列表 */
|
|
const remove = useCallback(
|
|
async (id: string) => {
|
|
await deleteSalaryRecord(id);
|
|
refresh();
|
|
},
|
|
[refresh],
|
|
);
|
|
|
|
return {
|
|
records: data ?? [],
|
|
loading,
|
|
error,
|
|
refresh,
|
|
save,
|
|
remove,
|
|
};
|
|
}
|
|
|