Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

user-setting-hooks.tsx 8.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354
  1. import { LanguageTranslationMap } from '@/constants/common';
  2. import { ResponseGetType } from '@/interfaces/database/base';
  3. import { IToken } from '@/interfaces/database/chat';
  4. import { ITenantInfo } from '@/interfaces/database/knowledge';
  5. import {
  6. ISystemStatus,
  7. ITenant,
  8. ITenantUser,
  9. IUserInfo,
  10. } from '@/interfaces/database/user-setting';
  11. import userService, {
  12. addTenantUser,
  13. agreeTenant,
  14. deleteTenantUser,
  15. listTenant,
  16. listTenantUser,
  17. } from '@/services/user-service';
  18. import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
  19. import { Modal, message } from 'antd';
  20. import DOMPurify from 'dompurify';
  21. import { isEmpty } from 'lodash';
  22. import { useCallback, useMemo, useState } from 'react';
  23. import { useTranslation } from 'react-i18next';
  24. import { history } from 'umi';
  25. export const useFetchUserInfo = (): ResponseGetType<IUserInfo> => {
  26. const { i18n } = useTranslation();
  27. const { data, isFetching: loading } = useQuery({
  28. queryKey: ['userInfo'],
  29. initialData: {},
  30. gcTime: 0,
  31. queryFn: async () => {
  32. const { data } = await userService.user_info();
  33. if (data.code === 0) {
  34. i18n.changeLanguage(
  35. LanguageTranslationMap[
  36. data.data.language as keyof typeof LanguageTranslationMap
  37. ],
  38. );
  39. }
  40. return data?.data ?? {};
  41. },
  42. });
  43. return { data, loading };
  44. };
  45. export const useFetchTenantInfo = (): ResponseGetType<ITenantInfo> => {
  46. const { t } = useTranslation();
  47. const { data, isFetching: loading } = useQuery({
  48. queryKey: ['tenantInfo'],
  49. initialData: {},
  50. gcTime: 0,
  51. queryFn: async () => {
  52. const { data: res } = await userService.get_tenant_info();
  53. if (res.code === 0) {
  54. // llm_id is chat_id
  55. // asr_id is speech2txt
  56. const { data } = res;
  57. if (isEmpty(data.embd_id) || isEmpty(data.llm_id)) {
  58. Modal.warning({
  59. title: t('common.warn'),
  60. content: (
  61. <div
  62. dangerouslySetInnerHTML={{
  63. __html: DOMPurify.sanitize(t('setting.modelProvidersWarn')),
  64. }}
  65. ></div>
  66. ),
  67. onOk() {
  68. history.push('/user-setting/model');
  69. },
  70. });
  71. }
  72. data.chat_id = data.llm_id;
  73. data.speech2text_id = data.asr_id;
  74. return data;
  75. }
  76. return res;
  77. },
  78. });
  79. return { data, loading };
  80. };
  81. export const useSelectParserList = (): Array<{
  82. value: string;
  83. label: string;
  84. }> => {
  85. const { data: tenantInfo } = useFetchTenantInfo();
  86. const parserList = useMemo(() => {
  87. const parserArray: Array<string> = tenantInfo?.parser_ids?.split(',') ?? [];
  88. return parserArray.map((x) => {
  89. const arr = x.split(':');
  90. return { value: arr[0], label: arr[1] };
  91. });
  92. }, [tenantInfo]);
  93. return parserList;
  94. };
  95. export const useSaveSetting = () => {
  96. const queryClient = useQueryClient();
  97. const { t } = useTranslation();
  98. const {
  99. data,
  100. isPending: loading,
  101. mutateAsync,
  102. } = useMutation({
  103. mutationKey: ['saveSetting'],
  104. mutationFn: async (
  105. userInfo: { new_password: string } | Partial<IUserInfo>,
  106. ) => {
  107. const { data } = await userService.setting(userInfo);
  108. if (data.code === 0) {
  109. message.success(t('message.modified'));
  110. queryClient.invalidateQueries({ queryKey: ['userInfo'] });
  111. }
  112. return data?.code;
  113. },
  114. });
  115. return { data, loading, saveSetting: mutateAsync };
  116. };
  117. export const useFetchSystemVersion = () => {
  118. const [version, setVersion] = useState('');
  119. const [loading, setLoading] = useState(false);
  120. const fetchSystemVersion = useCallback(async () => {
  121. try {
  122. setLoading(true);
  123. const { data } = await userService.getSystemVersion();
  124. if (data.code === 0) {
  125. setVersion(data.data);
  126. setLoading(false);
  127. }
  128. } catch (error) {
  129. setLoading(false);
  130. }
  131. }, []);
  132. return { fetchSystemVersion, version, loading };
  133. };
  134. export const useFetchSystemStatus = () => {
  135. const [systemStatus, setSystemStatus] = useState<ISystemStatus>(
  136. {} as ISystemStatus,
  137. );
  138. const [loading, setLoading] = useState(false);
  139. const fetchSystemStatus = useCallback(async () => {
  140. setLoading(true);
  141. const { data } = await userService.getSystemStatus();
  142. if (data.code === 0) {
  143. setSystemStatus(data.data);
  144. setLoading(false);
  145. }
  146. }, []);
  147. return {
  148. systemStatus,
  149. fetchSystemStatus,
  150. loading,
  151. };
  152. };
  153. export const useFetchSystemTokenList = (params: Record<string, any>) => {
  154. const {
  155. data,
  156. isFetching: loading,
  157. refetch,
  158. } = useQuery<IToken[]>({
  159. queryKey: ['fetchSystemTokenList', params],
  160. initialData: [],
  161. gcTime: 0,
  162. queryFn: async () => {
  163. const { data } = await userService.listToken(params);
  164. return data?.data ?? [];
  165. },
  166. });
  167. return { data, loading, refetch };
  168. };
  169. export const useRemoveSystemToken = () => {
  170. const queryClient = useQueryClient();
  171. const { t } = useTranslation();
  172. const {
  173. data,
  174. isPending: loading,
  175. mutateAsync,
  176. } = useMutation({
  177. mutationKey: ['removeSystemToken'],
  178. mutationFn: async (token: string) => {
  179. const { data } = await userService.removeToken({}, token);
  180. if (data.code === 0) {
  181. message.success(t('message.deleted'));
  182. queryClient.invalidateQueries({ queryKey: ['fetchSystemTokenList'] });
  183. }
  184. return data?.data ?? [];
  185. },
  186. });
  187. return { data, loading, removeToken: mutateAsync };
  188. };
  189. export const useCreateSystemToken = () => {
  190. const queryClient = useQueryClient();
  191. const {
  192. data,
  193. isPending: loading,
  194. mutateAsync,
  195. } = useMutation({
  196. mutationKey: ['createSystemToken'],
  197. mutationFn: async (params: Record<string, any>) => {
  198. const { data } = await userService.createToken(params);
  199. if (data.code === 0) {
  200. queryClient.invalidateQueries({ queryKey: ['fetchSystemTokenList'] });
  201. }
  202. return data?.data ?? [];
  203. },
  204. });
  205. return { data, loading, createToken: mutateAsync };
  206. };
  207. export const useListTenantUser = () => {
  208. const { data: tenantInfo } = useFetchTenantInfo();
  209. const tenantId = tenantInfo.tenant_id;
  210. const {
  211. data,
  212. isFetching: loading,
  213. refetch,
  214. } = useQuery<ITenantUser[]>({
  215. queryKey: ['listTenantUser', tenantId],
  216. initialData: [],
  217. gcTime: 0,
  218. enabled: !!tenantId,
  219. queryFn: async () => {
  220. const { data } = await listTenantUser(tenantId);
  221. return data?.data ?? [];
  222. },
  223. });
  224. return { data, loading, refetch };
  225. };
  226. export const useAddTenantUser = () => {
  227. const { data: tenantInfo } = useFetchTenantInfo();
  228. const queryClient = useQueryClient();
  229. const {
  230. data,
  231. isPending: loading,
  232. mutateAsync,
  233. } = useMutation({
  234. mutationKey: ['addTenantUser'],
  235. mutationFn: async (email: string) => {
  236. const { data } = await addTenantUser(tenantInfo.tenant_id, email);
  237. if (data.code === 0) {
  238. queryClient.invalidateQueries({ queryKey: ['listTenantUser'] });
  239. }
  240. return data?.code;
  241. },
  242. });
  243. return { data, loading, addTenantUser: mutateAsync };
  244. };
  245. export const useDeleteTenantUser = () => {
  246. const { data: tenantInfo } = useFetchTenantInfo();
  247. const queryClient = useQueryClient();
  248. const { t } = useTranslation();
  249. const {
  250. data,
  251. isPending: loading,
  252. mutateAsync,
  253. } = useMutation({
  254. mutationKey: ['deleteTenantUser'],
  255. mutationFn: async ({
  256. userId,
  257. tenantId,
  258. }: {
  259. userId: string;
  260. tenantId?: string;
  261. }) => {
  262. const { data } = await deleteTenantUser({
  263. tenantId: tenantId ?? tenantInfo.tenant_id,
  264. userId,
  265. });
  266. if (data.code === 0) {
  267. message.success(t('message.deleted'));
  268. queryClient.invalidateQueries({ queryKey: ['listTenantUser'] });
  269. queryClient.invalidateQueries({ queryKey: ['listTenant'] });
  270. }
  271. return data?.data ?? [];
  272. },
  273. });
  274. return { data, loading, deleteTenantUser: mutateAsync };
  275. };
  276. export const useListTenant = () => {
  277. const { data: tenantInfo } = useFetchTenantInfo();
  278. const tenantId = tenantInfo.tenant_id;
  279. const {
  280. data,
  281. isFetching: loading,
  282. refetch,
  283. } = useQuery<ITenant[]>({
  284. queryKey: ['listTenant', tenantId],
  285. initialData: [],
  286. gcTime: 0,
  287. enabled: !!tenantId,
  288. queryFn: async () => {
  289. const { data } = await listTenant();
  290. return data?.data ?? [];
  291. },
  292. });
  293. return { data, loading, refetch };
  294. };
  295. export const useAgreeTenant = () => {
  296. const queryClient = useQueryClient();
  297. const { t } = useTranslation();
  298. const {
  299. data,
  300. isPending: loading,
  301. mutateAsync,
  302. } = useMutation({
  303. mutationKey: ['agreeTenant'],
  304. mutationFn: async (tenantId: string) => {
  305. const { data } = await agreeTenant(tenantId);
  306. if (data.code === 0) {
  307. message.success(t('message.operated'));
  308. queryClient.invalidateQueries({ queryKey: ['listTenant'] });
  309. }
  310. return data?.data ?? [];
  311. },
  312. });
  313. return { data, loading, agreeTenant: mutateAsync };
  314. };