personal-settings.tsx 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. import type { IExternalAccountHasId, IExternalAuthProviderType, IUser } from '@growi/core';
  2. import { useTranslation } from 'next-i18next';
  3. import useSWR, { SWRConfiguration, SWRResponse } from 'swr';
  4. import { useIsGuestUser } from '~/stores/context';
  5. import loggerFactory from '~/utils/logger';
  6. import { apiv3Get, apiv3Put } from '../client/util/apiv3-client';
  7. import { useStaticSWR } from './use-static-swr';
  8. const logger = loggerFactory('growi:stores:personal-settings');
  9. export const useSWRxPersonalSettings = (config?: SWRConfiguration): SWRResponse<IUser, Error> => {
  10. const { data: isGuestUser } = useIsGuestUser();
  11. const key = !isGuestUser ? '/personal-setting' : null;
  12. return useSWR(
  13. key,
  14. endpoint => apiv3Get(endpoint).then(response => response.data.currentUser),
  15. config,
  16. );
  17. };
  18. export type IPersonalSettingsInfoOption = {
  19. sync: () => void,
  20. updateBasicInfo: () => Promise<void>,
  21. associateLdapAccount: (account: { username: string, password: string }) => Promise<void>,
  22. disassociateLdapAccount: (account: { providerType: IExternalAuthProviderType, accountId: string }) => Promise<void>,
  23. }
  24. export const usePersonalSettings = (config?: SWRConfiguration): SWRResponse<IUser, Error> & IPersonalSettingsInfoOption => {
  25. const { i18n } = useTranslation();
  26. const { data: personalSettingsDataFromDB, mutate: revalidate } = useSWRxPersonalSettings(config);
  27. const key = personalSettingsDataFromDB != null ? 'personalSettingsInfo' : null;
  28. const swrResult = useStaticSWR<IUser, Error>(key, undefined, { fallbackData: personalSettingsDataFromDB });
  29. // Sync with database
  30. const sync = async(): Promise<void> => {
  31. const { mutate } = swrResult;
  32. const result = await revalidate();
  33. mutate(result);
  34. };
  35. const updateBasicInfo = async(): Promise<void> => {
  36. const { data } = swrResult;
  37. if (data == null) {
  38. return;
  39. }
  40. const updateData = {
  41. name: data.name,
  42. email: data.email,
  43. isEmailPublished: data.isEmailPublished,
  44. lang: data.lang,
  45. slackMemberId: data.slackMemberId,
  46. };
  47. // invoke API
  48. try {
  49. await apiv3Put('/personal-setting/', updateData);
  50. i18n.changeLanguage(updateData.lang);
  51. }
  52. catch (errs) {
  53. logger.error(errs);
  54. throw errs;
  55. }
  56. };
  57. const associateLdapAccount = async(account): Promise<void> => {
  58. try {
  59. await apiv3Put('/personal-setting/associate-ldap', account);
  60. }
  61. catch (err) {
  62. logger.error(err);
  63. throw new Error('Failed to associate ldap account');
  64. }
  65. };
  66. const disassociateLdapAccount = async(account): Promise<void> => {
  67. try {
  68. await apiv3Put('/personal-setting/disassociate-ldap', account);
  69. }
  70. catch (err) {
  71. logger.error(err);
  72. throw new Error('Failed to disassociate ldap account');
  73. }
  74. };
  75. return {
  76. ...swrResult,
  77. sync,
  78. updateBasicInfo,
  79. associateLdapAccount,
  80. disassociateLdapAccount,
  81. };
  82. };
  83. export const useSWRxPersonalExternalAccounts = (): SWRResponse<IExternalAccountHasId[], Error> => {
  84. return useSWR(
  85. '/personal-setting/external-accounts',
  86. endpoint => apiv3Get(endpoint).then(response => response.data.externalAccounts),
  87. );
  88. };