ContextExtractor.tsx 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. import React, { FC, useEffect, useState } from 'react';
  2. import { pagePathUtils } from '@growi/core';
  3. import {
  4. useCreatedAt, useDeleteUsername, useDeletedAt, useHasChildren, useHasDraftOnHackmd, useIsAbleToDeleteCompletely,
  5. useIsDeletable, useIsDeleted, useIsNotCreatable, useIsPageExist, useIsTrashPage, useIsUserPage, useLastUpdateUsername,
  6. useCurrentPageId, usePageIdOnHackmd, usePageUser, useCurrentPagePath, useRevisionCreatedAt, useRevisionId, useRevisionIdHackmdSynced,
  7. useShareLinkId, useShareLinksNumber, useTemplateTagData, useUpdatedAt, useCreator, useRevisionAuthor, useCurrentUser, useTargetAndAncestors, useSlackChannels,
  8. } from '../../stores/context';
  9. import {
  10. useIsDeviceSmallerThanMd,
  11. usePreferDrawerModeByUser, usePreferDrawerModeOnEditByUser, useSidebarCollapsed, useCurrentSidebarContents, useCurrentProductNavWidth,
  12. } from '~/stores/ui';
  13. import { IUserUISettings } from '~/interfaces/user-ui-settings';
  14. const { isTrashPage: _isTrashPage } = pagePathUtils;
  15. const jsonNull = 'null';
  16. const ContextExtractorOnce: FC = () => {
  17. const mainContent = document.querySelector('#content-main');
  18. /*
  19. * App Context from DOM
  20. */
  21. const currentUser = JSON.parse(document.getElementById('growi-current-user')?.textContent || jsonNull);
  22. /*
  23. * UserUISettings from DOM
  24. */
  25. const userUISettings: Partial<IUserUISettings> = JSON.parse(document.getElementById('growi-user-ui-settings')?.textContent || jsonNull);
  26. /*
  27. * Page Context from DOM
  28. */
  29. const revisionId = mainContent?.getAttribute('data-page-revision-id');
  30. const path = decodeURI(mainContent?.getAttribute('data-path') || '');
  31. const pageId = mainContent?.getAttribute('data-page-id') || null;
  32. const revisionCreatedAt = +(mainContent?.getAttribute('data-page-revision-created') || '');
  33. const createdAt = mainContent?.getAttribute('data-page-created-at');
  34. const updatedAt = mainContent?.getAttribute('data-page-updated-at');
  35. const deletedAt = mainContent?.getAttribute('data-page-deleted-at') || null;
  36. const isUserPage = JSON.parse(mainContent?.getAttribute('data-page-user') || jsonNull);
  37. const isTrashPage = _isTrashPage(path);
  38. const isDeleted = JSON.parse(mainContent?.getAttribute('data-page-is-deleted') || jsonNull);
  39. const isDeletable = JSON.parse(mainContent?.getAttribute('data-page-is-deletable') || jsonNull);
  40. const isNotCreatable = JSON.parse(mainContent?.getAttribute('data-page-is-not-creatable') || jsonNull);
  41. const isAbleToDeleteCompletely = JSON.parse(mainContent?.getAttribute('data-page-is-able-to-delete-completely') || jsonNull);
  42. const isPageExist = mainContent?.getAttribute('data-page-id') != null;
  43. const pageUser = JSON.parse(mainContent?.getAttribute('data-page-user') || jsonNull);
  44. const hasChildren = JSON.parse(mainContent?.getAttribute('data-page-has-children') || jsonNull);
  45. const templateTagData = mainContent?.getAttribute('data-template-tags') || null;
  46. const shareLinksNumber = mainContent?.getAttribute('data-share-links-number');
  47. const shareLinkId = JSON.parse(mainContent?.getAttribute('data-share-link-id') || jsonNull);
  48. const revisionIdHackmdSynced = mainContent?.getAttribute('data-page-revision-id-hackmd-synced') || null;
  49. const lastUpdateUsername = mainContent?.getAttribute('data-page-last-update-username') || null;
  50. const deleteUsername = mainContent?.getAttribute('data-page-delete-username') || null;
  51. const pageIdOnHackmd = mainContent?.getAttribute('data-page-id-on-hackmd') || null;
  52. const hasDraftOnHackmd = !!mainContent?.getAttribute('data-page-has-draft-on-hackmd');
  53. const creator = JSON.parse(mainContent?.getAttribute('data-page-creator') || jsonNull);
  54. const revisionAuthor = JSON.parse(mainContent?.getAttribute('data-page-revision-author') || jsonNull);
  55. const targetAndAncestors = JSON.parse(mainContent?.getAttribute('data-target-and-ancestors') || jsonNull);
  56. const slackChannels = mainContent?.getAttribute('data-slack-channels') || '';
  57. /*
  58. * use static swr
  59. */
  60. // App
  61. useCurrentUser(currentUser);
  62. // UserUISettings
  63. usePreferDrawerModeByUser(userUISettings?.preferDrawerModeByUser);
  64. usePreferDrawerModeOnEditByUser(userUISettings?.preferDrawerModeOnEditByUser);
  65. useSidebarCollapsed(userUISettings?.isSidebarCollapsed);
  66. useCurrentSidebarContents(userUISettings?.currentSidebarContents);
  67. useCurrentProductNavWidth(userUISettings?.currentProductNavWidth);
  68. // Page
  69. useCreatedAt(createdAt);
  70. useDeleteUsername(deleteUsername);
  71. useDeletedAt(deletedAt);
  72. useHasChildren(hasChildren);
  73. useHasDraftOnHackmd(hasDraftOnHackmd);
  74. useIsAbleToDeleteCompletely(isAbleToDeleteCompletely);
  75. useIsDeletable(isDeletable);
  76. useIsDeleted(isDeleted);
  77. useIsNotCreatable(isNotCreatable);
  78. useIsPageExist(isPageExist);
  79. useIsTrashPage(isTrashPage);
  80. useIsUserPage(isUserPage);
  81. useLastUpdateUsername(lastUpdateUsername);
  82. useCurrentPageId(pageId);
  83. usePageIdOnHackmd(pageIdOnHackmd);
  84. usePageUser(pageUser);
  85. useCurrentPagePath(path);
  86. useRevisionCreatedAt(revisionCreatedAt);
  87. useRevisionId(revisionId);
  88. useRevisionIdHackmdSynced(revisionIdHackmdSynced);
  89. useShareLinkId(shareLinkId);
  90. useShareLinksNumber(shareLinksNumber);
  91. useTemplateTagData(templateTagData);
  92. useUpdatedAt(updatedAt);
  93. useCreator(creator);
  94. useRevisionAuthor(revisionAuthor);
  95. useTargetAndAncestors(targetAndAncestors);
  96. // Navigation
  97. usePreferDrawerModeByUser();
  98. usePreferDrawerModeOnEditByUser();
  99. useIsDeviceSmallerThanMd();
  100. // Navigation
  101. usePreferDrawerModeByUser();
  102. usePreferDrawerModeOnEditByUser();
  103. useIsDeviceSmallerThanMd();
  104. // Editor
  105. useSlackChannels(slackChannels);
  106. return null;
  107. };
  108. const ContextExtractor: FC = React.memo(() => {
  109. const [isRunOnce, setRunOnce] = useState(false);
  110. useEffect(() => {
  111. setRunOnce(true);
  112. }, []);
  113. return isRunOnce ? null : <ContextExtractorOnce></ContextExtractorOnce>;
  114. });
  115. export default ContextExtractor;