hooks.ts 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. import {addUser, editUser, getAllDepartment, getAllRoleList, getUserInfo} from '@apis';
  2. import {yupResolver} from '@hookform/resolvers/yup';
  3. import {AddUserParams} from '@models';
  4. import {useMutation, useQuery} from '@tanstack/react-query';
  5. import {message} from 'antd';
  6. import {useEffect} from 'react';
  7. import {useForm, useFormContext} from 'react-hook-form';
  8. import {object, string} from 'yup';
  9. export type FormState = {
  10. userName: string;
  11. userPassword: string;
  12. userRealName: string;
  13. userEmail: string;
  14. userLandline: string;
  15. userPhone: string;
  16. userDepartment: string;
  17. userRole: string;
  18. };
  19. const validate = object({
  20. userName: string().required('请输入用户名'),
  21. userPassword: string().required('请输入用户密码'),
  22. userRealName: string().required('请输入真实姓名'),
  23. userDepartment: string().required('请选择部门'),
  24. userRole: string().required('请选择角色'),
  25. });
  26. function useAdd(onClose: () => void, onFetch: () => void) {
  27. const {isLoading, mutate} = useMutation(
  28. addUser,
  29. {
  30. onSuccess(data) {
  31. if (data.msg === '200') {
  32. onClose();
  33. onFetch();
  34. message.success('新增成功');
  35. }
  36. },
  37. },
  38. );
  39. return [isLoading, mutate] as const;
  40. }
  41. function useEdit(onClose: () => void, onFetch: () => void) {
  42. const {isLoading, mutate} = useMutation(
  43. editUser,
  44. {
  45. onSuccess(data) {
  46. if (data.msg === '200') {
  47. onClose();
  48. onFetch();
  49. message.success('修改成功');
  50. }
  51. },
  52. },
  53. );
  54. return [isLoading, mutate] as const;
  55. }
  56. export function useFormState(
  57. {onClose, onFetch, id, visible}:
  58. {onClose: () => void, onFetch: () => void, id: string, visible: boolean},
  59. ) {
  60. const formInstance = useForm<FormState>({
  61. defaultValues: {
  62. userName: '',
  63. userPassword: '',
  64. userRealName: '',
  65. userEmail: '',
  66. userLandline: '',
  67. userPhone: '',
  68. userDepartment: '',
  69. userRole: '',
  70. },
  71. resolver: yupResolver(validate),
  72. });
  73. const {handleSubmit, clearErrors} = formInstance;
  74. useEffect(function() {
  75. visible && clearErrors();
  76. }, [clearErrors, visible]);
  77. const [isAddLoading, addMutate] = useAdd(onClose, onFetch);
  78. const [isEditLoading, editMutate] = useEdit(onClose, onFetch);
  79. const isLoading = isAddLoading || isEditLoading;
  80. const onSubmit = handleSubmit(function({
  81. userName,
  82. userPassword,
  83. userRealName,
  84. userEmail,
  85. userLandline,
  86. userPhone,
  87. userDepartment,
  88. userRole,
  89. }) {
  90. const params: Omit<AddUserParams, 'password'> = {
  91. userName,
  92. realName: userRealName,
  93. email: userEmail,
  94. landline: userLandline,
  95. phone: userPhone,
  96. department: userDepartment,
  97. role: userRole,
  98. };
  99. id
  100. ? editMutate({...params, id: Number(id)})
  101. : addMutate({...params, password: userPassword});
  102. });
  103. return [{isLoading, formInstance}, {onSubmit}] as const;
  104. }
  105. export function useOptions() {
  106. const {data: roleOptions} = useQuery(
  107. [getAllRoleList.name],
  108. async function() {
  109. const data = await getAllRoleList();
  110. if (data.msg === '200')
  111. return data.data.map(({id, roleName}) => ({value: String(id), label: roleName}));
  112. return [];
  113. }
  114. ,
  115. {initialData: [], retry: 3},
  116. );
  117. const {data: departmentOptions} = useQuery(
  118. [getAllDepartment.name],
  119. async function() {
  120. const data = await getAllDepartment();
  121. if (data.msg === '200')
  122. return data.data.map(
  123. ({id, departmentName}) => ({
  124. value: String(id), label: departmentName,
  125. }),
  126. );
  127. return [];
  128. }
  129. ,
  130. {initialData: [], retry: 3},
  131. );
  132. return {roleOptions, departmentOptions};
  133. }
  134. export function useField() {
  135. return useFormContext<FormState>();
  136. }
  137. export function useFetchUserInfo(id: string) {
  138. const {data} = useQuery(
  139. [id, getUserInfo.name],
  140. async function() {
  141. const data = await getUserInfo(id);
  142. if (data.msg === '200') {
  143. if (data.data.list[0])
  144. return data.data.list[0];
  145. throw new Error('未获取到用户信息');
  146. }
  147. throw new Error(data.errMsg);
  148. },
  149. {
  150. suspense: true,
  151. enabled: Boolean(id),
  152. },
  153. );
  154. const {setValue} = useFormContext<FormState>();
  155. useEffect(function() {
  156. setValue('userName', data?.userName ?? '');
  157. setValue('userPassword', data?.password ?? '');
  158. setValue('userRealName', data?.realName ?? '');
  159. setValue('userEmail', data?.email ?? '');
  160. setValue('userLandline', data?.landline ?? '');
  161. setValue('userPhone', data?.phone ?? '');
  162. setValue('userRole', data?.roleId ?? '');
  163. setValue('userDepartment', data?.departmentId ?? '');
  164. }, [data, setValue]);
  165. }