import React from 'react'; import { DndProvider } from 'react-dnd'; import { HTML5Backend } from 'react-dnd-html5-backend'; import ReactDOM from 'react-dom'; import { I18nextProvider } from 'react-i18next'; import { SWRConfig } from 'swr'; import { Provider } from 'unstated'; import CommentContainer from '~/client/services/CommentContainer'; import ContextExtractor from '~/client/services/ContextExtractor'; import EditorContainer from '~/client/services/EditorContainer'; import PageContainer from '~/client/services/PageContainer'; import PageHistoryContainer from '~/client/services/PageHistoryContainer'; import PersonalContainer from '~/client/services/PersonalContainer'; import RevisionComparerContainer from '~/client/services/RevisionComparerContainer'; import IdenticalPathPage from '~/components/IdenticalPathPage'; import PrivateLegacyPages from '~/components/PrivateLegacyPages'; import loggerFactory from '~/utils/logger'; import { swrGlobalConfiguration } from '~/utils/swr-utils'; import ErrorBoundary from '../components/ErrorBoudary'; import Fab from '../components/Fab'; import ForbiddenPage from '../components/ForbiddenPage'; import RecentlyCreatedIcon from '../components/Icons/RecentlyCreatedIcon'; import InAppNotificationPage from '../components/InAppNotification/InAppNotificationPage'; import MaintenanceModeContent from '../components/MaintenanceModeContent'; import PersonalSettings from '../components/Me/PersonalSettings'; import MyDraftList from '../components/MyDraftList/MyDraftList'; import GrowiContextualSubNavigation from '../components/Navbar/GrowiContextualSubNavigation'; import GrowiSubNavigationSwitcher from '../components/Navbar/GrowiSubNavigationSwitcher'; import NotFoundPage from '../components/NotFoundPage'; import Page from '../components/Page'; import DisplaySwitcher from '../components/Page/DisplaySwitcher'; import FixPageGrantAlert from '../components/Page/FixPageGrantAlert'; import RedirectedAlert from '../components/Page/RedirectedAlert'; import ShareLinkAlert from '../components/Page/ShareLinkAlert'; import TrashPageAlert from '../components/Page/TrashPageAlert'; import PageComment from '../components/PageComment'; import CommentEditorLazyRenderer from '../components/PageComment/CommentEditorLazyRenderer'; import PageContentFooter from '../components/PageContentFooter'; import BookmarkList from '../components/PageList/BookmarkList'; import PageStatusAlert from '../components/PageStatusAlert'; import PageTimeline from '../components/PageTimeline'; import RecentCreated from '../components/RecentCreated/RecentCreated'; import { SearchPage } from '../components/SearchPage'; import Sidebar from '../components/Sidebar'; import TagPage from '../components/TagPage'; import TrashPageList from '../components/TrashPageList'; import { appContainer, componentMappings } from './base'; import { toastError } from './util/apiNotification'; const logger = loggerFactory('growi:cli:app'); appContainer.initContents(); const { i18n } = appContainer; const socketIoContainer = appContainer.getContainer('SocketIoContainer'); // create unstated container instance const pageContainer = new PageContainer(appContainer); const pageHistoryContainer = new PageHistoryContainer(appContainer, pageContainer); const revisionComparerContainer = new RevisionComparerContainer(appContainer, pageContainer); const commentContainer = new CommentContainer(appContainer); const editorContainer = new EditorContainer(appContainer); const personalContainer = new PersonalContainer(appContainer); const injectableContainers = [ appContainer, socketIoContainer, pageContainer, pageHistoryContainer, revisionComparerContainer, commentContainer, editorContainer, personalContainer, ]; logger.info('unstated containers have been initialized'); /** * define components * key: id of element * value: React Element */ Object.assign(componentMappings, { 'grw-sidebar-wrapper': , 'search-page': , 'private-regacy-pages': , 'all-in-app-notifications': , 'identical-path-page': , // 'revision-history': , 'tags-page': , 'grw-page-status-alert-container': , 'maintenance-mode-content': , 'trash-page-alert': , 'trash-page-list-container': , 'not-found-page': , 'forbidden-page': , 'page-timeline': , 'personal-setting': , 'my-drafts': , 'grw-fab-container': , 'share-link-alert': , 'redirected-alert': , }); // additional definitions if data exists if (pageContainer.state.pageId != null) { Object.assign(componentMappings, { 'page-comments-list': , 'page-comment-write': , 'page-content-footer': , 'recent-created-icon': , }); if (!pageContainer.state.isEmpty) { Object.assign(componentMappings, { 'fix-page-grant-alert': , }); } // show the Page accessory modal when query of "compare" is requested if (revisionComparerContainer.getRevisionIDsToCompareAsParam().length > 0) { toastError('Sorry, opening PageAccessoriesModal is not implemented yet in v5.'); // pageAccessoriesContainer.openPageAccessoriesModal('pageHistory'); } } if (pageContainer.state.creator != null) { Object.assign(componentMappings, { 'user-created-list': , 'user-bookmark-list': , }); } if (pageContainer.state.path != null) { Object.assign(componentMappings, { // eslint-disable-next-line quote-props 'page': , 'grw-subnav-container': , 'grw-subnav-switcher-container': , 'display-switcher': , }); } const renderMainComponents = () => { Object.keys(componentMappings).forEach((key) => { const elem = document.getElementById(key); if (elem) { ReactDOM.render( {componentMappings[key]} , elem, ); } }); }; // extract context before rendering main components const elem = document.getElementById('growi-context-extractor'); if (elem != null) { ReactDOM.render( , elem, renderMainComponents, ); } else { renderMainComponents(); } // initialize scrollpos-styler ScrollPosStyler.init();