ContextExtractor.tsx 5.0 KB

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