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

58 lines
1.8 KiB

/**
* 会员服务使用申请 hook:拉取本人的服务申请记录,并提供提交申请的能力。
* 权益兑现载体——已开通会员提交后由律师/顾问跟进。
*/
import { useCallback, useEffect, useState } from 'react';
import { createLegalServiceRequest, fetchLegalServiceRequests } from '../api';
import type { LegalServiceRequest } from '../types';
export interface LegalServiceRequestsState {
/** 申请记录(倒序) */
requests: LegalServiceRequest[];
/** 首次加载中 */
loading: boolean;
/** 错误对象 */
error: Error | null;
/** 提交中 */
submitting: boolean;
/** 刷新申请记录 */
refresh: () => Promise<void>;
/** 提交申请 */
submit: (serviceId: string, content: string) => Promise<LegalServiceRequest>;
}
export function useLegalServiceRequests(): LegalServiceRequestsState {
const [requests, setRequests] = useState<LegalServiceRequest[]>([]);
const [loading, setLoading] = useState(true);
const [error, setError] = useState<Error | null>(null);
const [submitting, setSubmitting] = useState(false);
const refresh = useCallback(async () => {
try {
setLoading(true);
setError(null);
setRequests(await fetchLegalServiceRequests());
} catch (e) {
setError(e as Error);
} finally {
setLoading(false);
}
}, []);
useEffect(() => {
refresh();
}, [refresh]);
const submit = useCallback(async (serviceId: string, content: string) => {
setSubmitting(true);
try {
const created = await createLegalServiceRequest(serviceId, content);
setRequests((prev) => [created, ...prev]);
return created;
} finally {
setSubmitting(false);
}
}, []);
return { requests, loading, error, submitting, refresh, submit };
}