user-activation.page.tsx 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. import { NextPage, GetServerSideProps, GetServerSidePropsContext } from 'next';
  2. import { serverSideTranslations } from 'next-i18next/serverSideTranslations';
  3. import CompleteUserRegistrationForm from '~/components/CompleteUserRegistrationForm';
  4. import { NoLoginLayout } from '~/components/Layout/NoLoginLayout';
  5. import type { CrowiRequest } from '~/interfaces/crowi-request';
  6. import type { UserActivationErrorCode } from '~/interfaces/errors/user-activation';
  7. import type { RegistrationMode } from '~/interfaces/registration-mode';
  8. import { IUserRegistrationOrder } from '~/server/models/user-registration-order';
  9. import {
  10. getServerSideCommonProps, getNextI18NextConfig, useCustomTitle, CommonProps,
  11. } from './utils/commons';
  12. type Props = CommonProps & {
  13. token: string
  14. email: string
  15. errorCode?: UserActivationErrorCode
  16. registrationMode: RegistrationMode
  17. isEmailAuthenticationEnabled: boolean
  18. }
  19. const UserActivationPage: NextPage<Props> = (props: Props) => {
  20. return (
  21. <NoLoginLayout title={useCustomTitle(props, 'GROWI')}>
  22. <CompleteUserRegistrationForm
  23. token={props.token}
  24. email={props.email}
  25. errorCode={props.errorCode}
  26. registrationMode={props.registrationMode}
  27. isEmailAuthenticationEnabled={props.isEmailAuthenticationEnabled}
  28. />
  29. </NoLoginLayout>
  30. );
  31. };
  32. /**
  33. * for Server Side Translations
  34. * @param context
  35. * @param props
  36. * @param namespacesRequired
  37. */
  38. async function injectNextI18NextConfigurations(context: GetServerSidePropsContext, props: Props, namespacesRequired?: string[] | undefined): Promise<void> {
  39. const nextI18NextConfig = await getNextI18NextConfig(serverSideTranslations, context, namespacesRequired);
  40. props._nextI18Next = nextI18NextConfig._nextI18Next;
  41. }
  42. export const getServerSideProps: GetServerSideProps = async(context: GetServerSidePropsContext) => {
  43. const result = await getServerSideCommonProps(context);
  44. const req: CrowiRequest = context.req as CrowiRequest;
  45. // check for presence
  46. // see: https://github.com/vercel/next.js/issues/19271#issuecomment-730006862
  47. if (!('props' in result)) {
  48. throw new Error('invalid getSSP result');
  49. }
  50. const props: Props = result.props as Props;
  51. if (context.query.userRegistrationOrder != null) {
  52. const userRegistrationOrder = context.query.userRegistrationOrder as unknown as IUserRegistrationOrder;
  53. props.email = userRegistrationOrder.email;
  54. props.token = userRegistrationOrder.token;
  55. }
  56. if (typeof context.query.errorCode === 'string') {
  57. props.errorCode = context.query.errorCode as UserActivationErrorCode;
  58. }
  59. props.registrationMode = req.crowi.configManager.getConfig('crowi', 'security:registrationMode');
  60. props.isEmailAuthenticationEnabled = req.crowi.configManager.getConfig('crowi', 'security:passport-local:isEmailAuthenticationEnabled');
  61. await injectNextI18NextConfigurations(context, props, ['translation']);
  62. return {
  63. props,
  64. };
  65. };
  66. export default UserActivationPage;