trash.page.tsx 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. import React from 'react';
  2. import type { IUser, IUserHasId } from '@growi/core';
  3. import { NextPage, GetServerSideProps, GetServerSidePropsContext } from 'next';
  4. import { serverSideTranslations } from 'next-i18next/serverSideTranslations';
  5. import dynamic from 'next/dynamic';
  6. import type { CrowiRequest } from '~/interfaces/crowi-request';
  7. import type { IUserUISettings } from '~/interfaces/user-ui-settings';
  8. import type { UserUISettingsModel } from '~/server/models/user-ui-settings';
  9. import { BasicLayout } from '../components/Layout/BasicLayout';
  10. import GrowiContextualSubNavigation from '../components/Navbar/GrowiContextualSubNavigation';
  11. import {
  12. useCurrentUser, useCurrentPageId, useCurrentPagePath, useCurrentPathname,
  13. useIsSearchServiceConfigured, useIsSearchServiceReachable,
  14. useIsSearchScopeChildrenAsDefault, useIsSearchPage, useShowPageLimitationXL,
  15. } from '../stores/context';
  16. import {
  17. CommonProps, getServerSideCommonProps, getNextI18NextConfig, useCustomTitle,
  18. } from './utils/commons';
  19. const TrashPageList = dynamic(() => import('~/components/TrashPageList').then(mod => mod.TrashPageList), { ssr: false });
  20. const EmptyTrashModal = dynamic(() => import('~/components/EmptyTrashModal'), { ssr: false });
  21. const PutbackPageModal = dynamic(() => import('~/components/PutbackPageModal'), { ssr: false });
  22. type Props = CommonProps & {
  23. currentUser: IUser,
  24. isSearchServiceConfigured: boolean,
  25. isSearchServiceReachable: boolean,
  26. isSearchScopeChildrenAsDefault: boolean,
  27. userUISettings?: IUserUISettings,
  28. showPageLimitationXL: number,
  29. };
  30. const TrashPage: NextPage<CommonProps> = (props: Props) => {
  31. useCurrentUser(props.currentUser ?? null);
  32. useIsSearchServiceConfigured(props.isSearchServiceConfigured);
  33. useIsSearchServiceReachable(props.isSearchServiceReachable);
  34. useIsSearchScopeChildrenAsDefault(props.isSearchScopeChildrenAsDefault);
  35. useIsSearchPage(false);
  36. useCurrentPageId(null);
  37. useCurrentPathname('/trash');
  38. useCurrentPagePath('/trash');
  39. useShowPageLimitationXL(props.showPageLimitationXL);
  40. return (
  41. <>
  42. <BasicLayout title={useCustomTitle(props, 'GROWI')} >
  43. <header className="py-0 position-relative">
  44. <GrowiContextualSubNavigation isLinkSharingDisabled={false} />
  45. </header>
  46. <div className="grw-container-convertible mb-5 pb-5">
  47. <TrashPageList />
  48. </div>
  49. <div id="grw-fav-sticky-trigger" className="sticky-top"></div>
  50. </BasicLayout>
  51. <EmptyTrashModal />
  52. <PutbackPageModal />
  53. </>
  54. );
  55. };
  56. async function injectUserUISettings(context: GetServerSidePropsContext, props: Props): Promise<void> {
  57. const { model: mongooseModel } = await import('mongoose');
  58. const req = context.req as CrowiRequest<IUserHasId & any>;
  59. const { user } = req;
  60. const UserUISettings = mongooseModel('UserUISettings') as UserUISettingsModel;
  61. const userUISettings = user == null ? null : await UserUISettings.findOne({ user: user._id }).exec();
  62. if (userUISettings != null) {
  63. props.userUISettings = userUISettings.toObject();
  64. }
  65. }
  66. function injectServerConfigurations(context: GetServerSidePropsContext, props: Props): void {
  67. const req: CrowiRequest = context.req as CrowiRequest;
  68. const { crowi } = req;
  69. const {
  70. searchService, configManager,
  71. } = crowi;
  72. props.isSearchServiceConfigured = searchService.isConfigured;
  73. props.isSearchServiceReachable = searchService.isReachable;
  74. props.isSearchScopeChildrenAsDefault = configManager.getConfig('crowi', 'customize:isSearchScopeChildrenAsDefault');
  75. props.showPageLimitationXL = crowi.configManager.getConfig('crowi', 'customize:showPageLimitationXL');
  76. }
  77. /**
  78. * for Server Side Translations
  79. * @param context
  80. * @param props
  81. * @param namespacesRequired
  82. */
  83. async function injectNextI18NextConfigurations(context: GetServerSidePropsContext, props: Props, namespacesRequired?: string[] | undefined): Promise<void> {
  84. const nextI18NextConfig = await getNextI18NextConfig(serverSideTranslations, context, namespacesRequired);
  85. props._nextI18Next = nextI18NextConfig._nextI18Next;
  86. }
  87. export const getServerSideProps: GetServerSideProps = async(context: GetServerSidePropsContext) => {
  88. const req = context.req as CrowiRequest<IUserHasId & any>;
  89. const { user } = req;
  90. const result = await getServerSideCommonProps(context);
  91. if (!('props' in result)) {
  92. throw new Error('invalid getSSP result');
  93. }
  94. const props: Props = result.props as Props;
  95. if (user != null) {
  96. props.currentUser = user.toObject();
  97. }
  98. await injectUserUISettings(context, props);
  99. injectServerConfigurations(context, props);
  100. await injectNextI18NextConfigurations(context, props, ['translation']);
  101. return {
  102. props,
  103. };
  104. };
  105. export default TrashPage;