轻松聘
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

/**
* 薪资计算记录 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,
};
}