personal-settings.tsx 3.3 KB

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