From fcb0ba252b43d691e1ad90af41f8230f4a36f822 Mon Sep 17 00:00:00 2001 From: Eric Vicenti Date: Tue, 25 Jun 2024 11:39:48 +0200 Subject: [PATCH] Move from app package to desktop --- frontend/apps/desktop/env.d.ts | 10 + frontend/apps/desktop/package.json | 70 +- frontend/apps/desktop/src/app-account.tsx | 6 +- frontend/apps/desktop/src/app-api.ts | 13 +- .../apps/desktop/src/app-context-provider.tsx | 90 + frontend/apps/desktop/src/app-context.tsx | 91 + .../app => apps/desktop/src}/app-ipc.tsx | 0 frontend/apps/desktop/src/app-menu.ts | 6 +- frontend/apps/desktop/src/app-recents.ts | 2 +- frontend/apps/desktop/src/app-windows.ts | 10 +- .../src/blocknote-react/types/styles.d.ts | 1 + frontend/apps/desktop/src/changes-list.tsx | 18 +- .../src}/components/accessory-sidebar.tsx | 0 .../desktop/src}/components/account-card.tsx | 0 .../src}/components/account-link-avatar.tsx | 20 +- .../src}/components/accounts-combobox.css | 0 .../desktop/src}/components/alert.tsx | 0 .../desktop/src}/components/app-banner.tsx | 0 .../desktop/src}/components/app-embeds.tsx | 0 .../apps/desktop/src/components/app-error.tsx | 2 +- .../desktop/src}/components/avatar-form.tsx | 16 +- .../desktop/src}/components/avatar.tsx | 0 .../src}/components/citations-context.tsx | 6 +- .../apps/desktop/src/components/citations.tsx | 16 +- .../apps/desktop/src/components/comments.tsx | 388 +++++ .../src}/components/commit-draft-button.tsx | 34 +- .../src}/components/contacts-prompt.tsx | 0 .../components/copy-gateway-reference.tsx | 0 .../desktop/src}/components/debug-data.tsx | 0 .../delete-comment-draft-dialog.tsx | 0 .../desktop/src}/components/delete-dialog.tsx | 0 .../src}/components/delete-draft-dialog.tsx | 10 +- .../desktop/src}/components/dialog.tsx | 0 .../src}/components/discard-draft-button.tsx | 12 +- .../desktop/src}/components/dropdown.tsx | 0 .../src}/components/edit-doc-button.tsx | 10 +- .../src}/components/edit-profile-dialog.tsx | 0 .../apps/desktop/src/components/editor.tsx | 12 +- .../desktop/src}/components/empty-list.tsx | 0 .../apps/desktop/src/components/error-bar.tsx | 6 +- .../desktop/src}/components/favoriting.tsx | 0 .../src}/components/first-publish-dialog.tsx | 0 .../desktop/src}/components/footer.tsx | 20 +- .../desktop/src}/components/form-input.tsx | 0 .../desktop/src}/components/forms.tsx | 0 .../desktop/src}/components/indicator.tsx | 0 .../desktop/src}/components/launcher.tsx | 37 +- .../desktop/src}/components/link.tsx | 0 .../desktop/src}/components/list-item.tsx | 0 .../desktop/src}/components/main-wrapper.tsx | 12 +- .../desktop/src}/components/media-dialog.tsx | 0 .../src}/components/network-dialog.tsx | 0 .../src}/components/options-dropdown.tsx | 0 .../src}/components/placeholder-box.tsx | 0 .../desktop/src}/components/prompt.tsx | 0 .../src}/components/publication-list-item.tsx | 4 +- .../src}/components/publication-list.tsx | 2 +- .../desktop/src}/components/seed-icon.tsx | 0 .../desktop/src}/components/select-input.tsx | 0 .../desktop/src/components/sidebar-base.tsx | 20 +- .../desktop/src/components/sidebar-neo.tsx | 18 +- .../apps/desktop/src/components/sidebar.tsx | 16 +- .../desktop/src}/components/slash.tsx | 0 .../src/components/titlebar-common.tsx | 38 +- .../desktop/src/components/titlebar-title.tsx | 14 +- .../src/components/titlebar-windows-linux.tsx | 2 +- .../apps/desktop/src/components/titlebar.tsx | 10 +- .../desktop/src}/components/variants.tsx | 8 +- .../src}/components/window-controls.tsx | 10 +- .../src/components/windows-linux-titlebar.tsx | 14 +- .../desktop}/src/document-settings.tsx | 12 +- .../desktop}/src/draft-focusing.tsx | 0 .../desktop/src}/editor/autocomplete.tsx | 0 .../desktop/src}/editor/block-utils.ts | 0 .../editor/blocknote/core/BlockNoteEditor.ts | 0 .../blocknote/core/BlockNoteExtensions.ts | 2 +- .../blockManipulation/blockManipulation.ts | 0 .../formatConversions/formatConversions.ts | 0 .../removeUnderlinesRehypePlugin.ts | 0 .../simplifyBlocksRehypePlugin.ts | 0 .../api/nodeConversions/nodeConversions.ts | 0 .../core/api/nodeConversions/testUtil.ts | 0 .../blocknote/core/api/util/nodeUtil.ts | 0 .../blocknote/core/assets/fonts-inter.css | 0 .../inter-v12-latin/inter-v12-latin-100.woff | Bin .../inter-v12-latin/inter-v12-latin-100.woff2 | Bin .../inter-v12-latin/inter-v12-latin-200.woff | Bin .../inter-v12-latin/inter-v12-latin-200.woff2 | Bin .../inter-v12-latin/inter-v12-latin-300.woff | Bin .../inter-v12-latin/inter-v12-latin-300.woff2 | Bin .../inter-v12-latin/inter-v12-latin-500.woff | Bin .../inter-v12-latin/inter-v12-latin-500.woff2 | Bin .../inter-v12-latin/inter-v12-latin-600.woff | Bin .../inter-v12-latin/inter-v12-latin-600.woff2 | Bin .../inter-v12-latin/inter-v12-latin-700.woff | Bin .../inter-v12-latin/inter-v12-latin-700.woff2 | Bin .../inter-v12-latin/inter-v12-latin-800.woff | Bin .../inter-v12-latin/inter-v12-latin-800.woff2 | Bin .../inter-v12-latin/inter-v12-latin-900.woff | Bin .../inter-v12-latin/inter-v12-latin-900.woff2 | Bin .../inter-v12-latin-regular.woff | Bin .../inter-v12-latin-regular.woff2 | Bin .../editor/blocknote/core/editor.module.css | 0 .../BackgroundColorExtension.ts | 0 .../BackgroundColor/BackgroundColorMark.ts | 0 .../BlockManipulationExtension.ts | 0 .../Blocks/PreviousBlockTypePlugin.ts | 0 .../core/extensions/Blocks/api/block.ts | 0 .../core/extensions/Blocks/api/blockTypes.ts | 0 .../Blocks/api/cursorPositionTypes.ts | 0 .../extensions/Blocks/api/defaultBlocks.ts | 0 .../Blocks/api/inlineContentTypes.ts | 0 .../extensions/Blocks/api/selectionTypes.ts | 0 .../extensions/Blocks/api/serialization.ts | 0 .../extensions/Blocks/helpers/findBlock.ts | 0 .../Blocks/helpers/getBlockInfoFromPos.ts | 0 .../Blocks/helpers/getGroupInfoFromPos.ts | 0 .../blocknote/core/extensions/Blocks/index.ts | 0 .../extensions/Blocks/nodes/Block.module.css | 0 .../Blocks/nodes/BlockAttributes.ts | 0 .../extensions/Blocks/nodes/BlockContainer.ts | 0 .../HeadingBlockContent.ts | 0 .../BulletListItemBlockContent.ts | 0 .../ListItemKeyboardShortcuts.ts | 0 .../NumberedListIndexingPlugin.ts | 0 .../NumberedListItemBlockContent.ts | 0 .../ParagraphBlockContent.ts | 0 .../extensions/Blocks/nodes/BlockGroup.ts | 0 .../extensions/DragMedia/DragExtension.ts | 0 .../BlockSideMenuFactoryTypes.ts | 0 .../DraggableBlocksExtension.ts | 0 .../DraggableBlocks/DraggableBlocksPlugin.ts | 0 .../DraggableBlocks/MultipleNodeSelection.ts | 0 .../FormattingToolbarPlugin.ts | 0 .../HyperlinkToolbarPlugin.ts | 0 .../core/extensions/LinkMenu/LinkMenuItem.ts | 0 .../extensions/LinkMenu/LinkMenuPlugin.ts | 0 .../LinkMenu/defaultLinkMenuItems.tsx | 79 +- .../extensions/Markdown/MarkdownExtension.ts | 0 .../Placeholder/PlaceholderExtension.ts | 0 .../SideMenu/MultipleNodeSelection.ts | 0 .../extensions/SideMenu/SideMenuPlugin.ts | 0 .../extensions/SlashMenu/BaseSlashMenuItem.ts | 0 .../extensions/SlashMenu/SlashMenuPlugin.ts | 0 .../SlashMenu/defaultSlashMenuItems.ts | 0 .../TextAlignment/TextAlignmentExtension.ts | 0 .../TextColor/TextColorExtension.ts | 0 .../extensions/TextColor/TextColorMark.ts | 0 .../TrailingNode/TrailingNodeExtension.ts | 0 .../core/extensions/UniqueID/UniqueID.ts | 0 .../src}/editor/blocknote/core/index.ts | 0 .../core/shared/BaseUiElementTypes.ts | 0 .../blocknote/core/shared/EditorElement.ts | 0 .../blocknote/core/shared/EventEmitter.ts | 0 .../plugins/suggestion/SuggestionItem.ts | 0 .../plugins/suggestion/SuggestionPlugin.ts | 0 .../editor/blocknote/core/shared/utils.ts | 0 .../src}/editor/blocknote/core/style.css | 0 .../desktop/src}/editor/blocknote/index.ts | 0 .../editor/blocknote/react/BlockNoteTheme.ts | 2 +- .../editor/blocknote/react/BlockNoteView.tsx | 44 +- .../blocknote/react/Editor/EditorContent.tsx | 0 .../DefaultButtons/ColorStyleButton.tsx | 24 +- .../DefaultButtons/CreateLinkButton.tsx | 8 +- .../DefaultButtons/NestBlockButtons.tsx | 14 +- .../DefaultButtons/TextAlignButton.tsx | 20 +- .../DefaultButtons/ToggledStyleButton.tsx | 16 +- .../DefaultDropdowns/BlockTypeDropdown.tsx | 20 +- .../components/DefaultFormattingToolbar.tsx | 10 +- .../FormattingToolbarPositioner.tsx | 8 +- .../components/LinkToolbarButton.tsx | 0 .../components/EditHyperlinkMenu.tsx | 0 .../components/EditHyperlinkMenuItem.tsx | 0 .../components/EditHyperlinkMenuItemIcon.tsx | 0 .../components/EditHyperlinkMenuItemInput.tsx | 0 .../components/DefaultHyperlinkToolbar.tsx | 0 .../components/HyperlinkToolbarPositioner.tsx | 8 +- .../LinkMenu/components/DefaultLinkMenu.tsx | 10 +- .../LinkMenu/components/LinkMenuItem.tsx | 0 .../components/LinkMenuPositioner.tsx | 16 +- .../editor/blocknote/react/ReactBlockSpec.tsx | 12 +- .../ColorPicker/components/ColorIcon.tsx | 0 .../ColorPicker/components/ColorPicker.tsx | 0 .../Toolbar/components/Toolbar.tsx | 0 .../Toolbar/components/ToolbarButton.tsx | 0 .../Toolbar/components/ToolbarDropdown.tsx | 0 .../components/ToolbarDropdownItem.tsx | 0 .../components/ToolbarDropdownTarget.tsx | 0 .../Tooltip/components/TooltipContent.tsx | 0 .../DefaultButtons/AddBlockButton.tsx | 8 +- .../components/DefaultButtons/DragHandle.tsx | 12 +- .../SideMenu/components/DefaultSideMenu.tsx | 15 + .../DefaultButtons/BlockColorsButton.tsx | 28 +- .../DefaultButtons/CopyLinkToBlockButton.tsx | 12 +- .../DefaultButtons/RemoveBlockButton.tsx | 21 + .../DragHandleMenu/DefaultDragHandleMenu.tsx | 26 +- .../DragHandleMenu/DragHandleMenu.tsx | 10 +- .../DragHandleMenu/DragHandleMenuItem.tsx | 0 .../react/SideMenu/components/SideMenu.tsx | 0 .../SideMenu/components/SideMenuButton.tsx | 0 .../components/SideMenuPositioner.tsx | 8 +- .../react/SlashMenu/ReactSlashMenuItem.ts | 2 +- .../SlashMenu/components/DefaultSlashMenu.tsx | 10 +- .../SlashMenu/components/SlashMenuItem.tsx | 0 .../components/SlashMenuPositioner.tsx | 16 +- .../SlashMenu/defaultReactSlashMenuItems.tsx | 6 +- .../editor/blocknote/react/defaultThemes.ts | 0 .../blocknote/react/hooks/useBlockNote.ts | 4 +- .../react/hooks/useEditorContentChange.ts | 5 +- .../react/hooks/useEditorForceUpdate.tsx | 0 .../react/hooks/useEditorSelectionChange.ts | 5 +- .../src}/editor/blocknote/react/index.ts | 0 .../src}/editor/blocknote/react/utils.ts | 0 .../desktop/src}/editor/diffExtension.ts | 0 .../desktop/src}/editor/editor-types.ts | 0 .../desktop/src}/editor/editor.css | 0 .../desktop/src}/editor/embed-block.tsx | 72 +- .../app => apps/desktop/src}/editor/file.tsx | 0 .../editor/handle-local-media-paste-plugin.ts | 0 .../src}/editor/heading-component-plugin.tsx | 0 .../src}/editor/hm-formatting-toolbar.tsx | 0 .../src}/editor/hm-toolbar-link-button.tsx | 0 .../desktop/src}/editor/hyperlink-toolbar.tsx | 0 .../src}/editor/hypermedia-link-plugin.tsx | 18 +- .../desktop/src}/editor/image-placeholder.ts | 0 .../app => apps/desktop/src}/editor/image.css | 0 .../app => apps/desktop/src}/editor/image.tsx | 38 +- .../app => apps/desktop/src}/editor/index.ts | 0 .../desktop/src}/editor/inline-embed.css | 0 .../desktop/src}/editor/keyboard-helpers.ts | 0 .../app => apps/desktop/src}/editor/math.tsx | 0 .../desktop/src}/editor/media-container.tsx | 0 .../desktop/src}/editor/media-render.tsx | 0 .../desktop/src}/editor/mentions-plugin.tsx | 20 +- .../app => apps/desktop/src}/editor/nostr.tsx | 0 .../app => apps/desktop/src}/editor/schema.ts | 0 .../code-block-lowlight.tsx | 12 +- .../code-block-view.tsx | 0 .../tiptap-extension-code-block/code-block.ts | 2 +- .../tiptap-extension-code-block/index.ts | 0 .../lowlight-plugin.ts | 0 .../tiptap-extension-link/helpers/autolink.ts | 0 .../helpers/clickHandler.ts | 0 .../helpers/pasteHandler.ts | 8 +- .../editor/tiptap-extension-link/index.ts | 0 .../src}/editor/tiptap-extension-link/link.ts | 0 .../desktop/src}/editor/use-popover-state.ts | 0 .../app => apps/desktop/src}/editor/utils.ts | 0 .../app => apps/desktop/src}/editor/video.tsx | 43 +- .../desktop/src}/editor/web-embed.tsx | 22 +- .../app => apps/desktop/src}/errors.tsx | 0 frontend/apps/desktop/src/find-in-page.tsx | 2 +- frontend/apps/desktop/src/ipc.ts | 4 +- frontend/apps/desktop/src/main.ts | 23 +- .../desktop/src}/models/accounts.ts | 8 +- .../desktop/src}/models/app-settings.ts | 0 .../desktop/src}/models/changes.ts | 0 .../desktop/src}/models/comments.ts | 6 +- .../desktop/src}/models/contacts.ts | 3 +- .../desktop/src}/models/content-graph.ts | 0 frontend/apps/desktop/src/models/daemon.ts | 63 +- frontend/apps/desktop/src/models/documents.ts | 1521 ++++++++++++++++- .../desktop/src}/models/draft-machine.ts | 0 .../desktop/src}/models/editor-utils.ts | 0 .../desktop/src}/models/entities.ts | 0 .../desktop/src}/models/experiments.ts | 0 .../desktop/src}/models/favorites.ts | 0 .../app => apps/desktop/src}/models/feed.ts | 3 +- .../desktop/src}/models/gateway-settings.ts | 0 .../desktop/src}/models/networking.ts | 2 +- .../desktop/src}/models/payments.ts | 0 .../desktop/src}/models/publication.ts | 0 .../desktop/src}/models/query-keys.ts | 0 .../desktop/src}/models/recents.ts | 0 .../app => apps/desktop/src}/models/search.ts | 0 .../app => apps/desktop/src}/models/wallet.ts | 0 .../desktop/src}/models/web-importer.ts | 0 .../desktop/src}/models/web-links.ts | 2 +- .../desktop/src/models}/window-utils.ts | 0 frontend/apps/desktop/src/open-url.ts | 9 +- .../src/pages/account-content-page.tsx | 10 +- .../apps/desktop/src/pages/account-page.tsx | 36 +- frontend/apps/desktop/src/pages/blocknote.tsx | 2 +- .../apps/desktop/src/pages/comment-draft.tsx | 16 +- frontend/apps/desktop/src/pages/comment.tsx | 10 +- .../apps/desktop/src/pages/contacts-page.tsx | 30 +- .../desktop/src/pages/deleted-content.tsx | 2 +- .../src/pages/document-placeholder.tsx | 2 +- frontend/apps/desktop/src/pages/document.tsx | 34 +- .../apps/desktop/src/pages/draft-rebase.tsx | 2 +- frontend/apps/desktop/src/pages/draft.tsx | 30 +- frontend/apps/desktop/src/pages/explore.tsx | 6 +- frontend/apps/desktop/src/pages/favorites.tsx | 16 +- frontend/apps/desktop/src/pages/feed.tsx | 18 +- .../apps/desktop/src/pages/find-in-page.tsx | 2 +- frontend/apps/desktop/src/pages/home.tsx | 4 +- frontend/apps/desktop/src/pages/main.tsx | 16 +- .../apps/desktop/src/pages/onboarding.tsx | 16 +- .../pages/publication-content-provider.tsx | 8 +- frontend/apps/desktop/src/pages/settings.tsx | 37 +- .../apps/desktop/src/preload-find-in-page.ts | 2 +- frontend/apps/desktop/src/preload.ts | 2 +- .../app => apps/desktop/src}/query-client.ts | 4 +- frontend/apps/desktop/src/root.tsx | 14 +- .../desktop}/src/sidebar-context.tsx | 12 +- .../desktop}/src/slash-menu-items.tsx | 26 +- frontend/apps/desktop/src/types/code.tsx | 95 + frontend/apps/desktop/src/types/image.css | 3 + frontend/apps/desktop/src/types/image.tsx | 474 +++++ frontend/apps/desktop/src/types/video.tsx | 52 + .../desktop/src}/use-popover-state.ts | 0 .../desktop/src}/utils/account-url.ts | 0 .../desktop/src}/utils/classnames.ts | 0 .../app => apps/desktop/src}/utils/logger.ts | 0 .../desktop/src}/utils/media-drag.ts | 0 .../desktop/src}/utils/mege-refs.ts | 0 .../src}/utils/navigation-container.tsx | 0 .../desktop/src}/utils/navigation.tsx | 0 .../desktop/src}/utils/object-keys.ts | 0 .../desktop/src}/utils/open-draft.ts | 4 +- .../app => apps/desktop/src}/utils/path.ts | 0 .../desktop/src}/utils/route-context.ts | 0 .../desktop/src}/utils/route-encoding.ts | 0 .../app => apps/desktop/src}/utils/routes.tsx | 0 .../desktop/src}/utils/site-hostname.ts | 0 .../desktop/src}/utils/useNavigate.tsx | 0 .../desktop/src}/utils/window-events.ts | 0 .../desktop/src}/utils/window-types.ts | 0 frontend/packages/app/.gitignore | 5 - frontend/packages/app/.prettierrc.js | 1 - frontend/packages/app/app-context.tsx | 168 -- frontend/packages/app/client/example-docs.ts | 202 --- .../SideMenu/components/DefaultSideMenu.tsx | 15 - .../DefaultButtons/RemoveBlockButton.tsx | 21 - frontend/packages/app/env.d.ts | 9 - frontend/packages/app/index.ts | 4 - frontend/packages/app/logger.ts | 6 - frontend/packages/app/models/daemon.ts | 61 - frontend/packages/app/models/documents.ts | 1509 ---------------- frontend/packages/app/package.json | 102 -- frontend/packages/app/tamagui.config.ts | 13 - frontend/packages/app/tsconfig.json | 14 - .../shared/src/client/from-hm-block.ts | 6 +- frontend/packages/shared/src/hm-types.ts | 2 +- .../shared/src/publication-content.tsx | 3 +- tsconfig.json | 15 +- yarn.lock | 98 +- 347 files changed, 3707 insertions(+), 2980 deletions(-) create mode 100644 frontend/apps/desktop/src/app-context-provider.tsx create mode 100644 frontend/apps/desktop/src/app-context.tsx rename frontend/{packages/app => apps/desktop/src}/app-ipc.tsx (100%) create mode 100644 frontend/apps/desktop/src/blocknote-react/types/styles.d.ts rename frontend/{packages/app => apps/desktop/src}/components/accessory-sidebar.tsx (100%) rename frontend/{packages/app => apps/desktop/src}/components/account-card.tsx (100%) rename frontend/{packages/app => apps/desktop/src}/components/account-link-avatar.tsx (76%) rename frontend/{packages/app => apps/desktop/src}/components/accounts-combobox.css (100%) rename frontend/{packages/app => apps/desktop/src}/components/alert.tsx (100%) rename frontend/{packages/app => apps/desktop/src}/components/app-banner.tsx (100%) rename frontend/{packages/app => apps/desktop/src}/components/app-embeds.tsx (100%) rename frontend/{packages/app => apps/desktop/src}/components/avatar-form.tsx (80%) rename frontend/{packages/app => apps/desktop/src}/components/avatar.tsx (100%) rename frontend/{packages/app => apps/desktop/src}/components/citations-context.tsx (86%) create mode 100644 frontend/apps/desktop/src/components/comments.tsx rename frontend/{packages/app => apps/desktop/src}/components/commit-draft-button.tsx (80%) rename frontend/{packages/app => apps/desktop/src}/components/contacts-prompt.tsx (100%) rename frontend/{packages/app => apps/desktop/src}/components/copy-gateway-reference.tsx (100%) rename frontend/{packages/app => apps/desktop/src}/components/debug-data.tsx (100%) rename frontend/{packages/app => apps/desktop/src}/components/delete-comment-draft-dialog.tsx (100%) rename frontend/{packages/app => apps/desktop/src}/components/delete-dialog.tsx (100%) rename frontend/{packages/app => apps/desktop/src}/components/delete-draft-dialog.tsx (78%) rename frontend/{packages/app => apps/desktop/src}/components/dialog.tsx (100%) rename frontend/{packages/app => apps/desktop/src}/components/discard-draft-button.tsx (65%) rename frontend/{packages/app => apps/desktop/src}/components/dropdown.tsx (100%) rename frontend/{packages/app => apps/desktop/src}/components/edit-doc-button.tsx (92%) rename frontend/{packages/app => apps/desktop/src}/components/edit-profile-dialog.tsx (100%) rename frontend/{packages/app => apps/desktop/src}/components/empty-list.tsx (100%) rename frontend/{packages/app => apps/desktop/src}/components/favoriting.tsx (100%) rename frontend/{packages/app => apps/desktop/src}/components/first-publish-dialog.tsx (100%) rename frontend/{packages/app => apps/desktop/src}/components/footer.tsx (75%) rename frontend/{packages/app => apps/desktop/src}/components/form-input.tsx (100%) rename frontend/{packages/app => apps/desktop/src}/components/forms.tsx (100%) rename frontend/{packages/app => apps/desktop/src}/components/indicator.tsx (100%) rename frontend/{packages/app => apps/desktop/src}/components/launcher.tsx (92%) rename frontend/{packages/app => apps/desktop/src}/components/link.tsx (100%) rename frontend/{packages/app => apps/desktop/src}/components/list-item.tsx (100%) rename frontend/{packages/app => apps/desktop/src}/components/main-wrapper.tsx (64%) rename frontend/{packages/app => apps/desktop/src}/components/media-dialog.tsx (100%) rename frontend/{packages/app => apps/desktop/src}/components/network-dialog.tsx (100%) rename frontend/{packages/app => apps/desktop/src}/components/options-dropdown.tsx (100%) rename frontend/{packages/app => apps/desktop/src}/components/placeholder-box.tsx (100%) rename frontend/{packages/app => apps/desktop/src}/components/prompt.tsx (100%) rename frontend/{packages/app => apps/desktop/src}/components/publication-list-item.tsx (97%) rename frontend/{packages/app => apps/desktop/src}/components/publication-list.tsx (98%) rename frontend/{packages/app => apps/desktop/src}/components/seed-icon.tsx (100%) rename frontend/{packages/app => apps/desktop/src}/components/select-input.tsx (100%) rename frontend/{packages/app => apps/desktop/src}/components/slash.tsx (100%) rename frontend/{packages/app => apps/desktop/src}/components/variants.tsx (98%) rename frontend/{packages/app => apps/desktop/src}/components/window-controls.tsx (87%) rename frontend/{packages/app => apps/desktop}/src/document-settings.tsx (86%) rename frontend/{packages/app => apps/desktop}/src/draft-focusing.tsx (100%) rename frontend/{packages/app => apps/desktop/src}/editor/autocomplete.tsx (100%) rename frontend/{packages/app => apps/desktop/src}/editor/block-utils.ts (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/BlockNoteEditor.ts (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/BlockNoteExtensions.ts (98%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/api/blockManipulation/blockManipulation.ts (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/api/formatConversions/formatConversions.ts (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/api/formatConversions/removeUnderlinesRehypePlugin.ts (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/api/formatConversions/simplifyBlocksRehypePlugin.ts (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/api/nodeConversions/nodeConversions.ts (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/api/nodeConversions/testUtil.ts (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/api/util/nodeUtil.ts (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/assets/fonts-inter.css (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-100.woff (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-100.woff2 (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-200.woff (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-200.woff2 (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-300.woff (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-300.woff2 (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-500.woff (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-500.woff2 (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-600.woff (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-600.woff2 (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-700.woff (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-700.woff2 (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-800.woff (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-800.woff2 (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-900.woff (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-900.woff2 (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-regular.woff (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-regular.woff2 (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/editor.module.css (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/extensions/BackgroundColor/BackgroundColorExtension.ts (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/extensions/BackgroundColor/BackgroundColorMark.ts (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/extensions/BlockManipulation/BlockManipulationExtension.ts (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/extensions/Blocks/PreviousBlockTypePlugin.ts (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/extensions/Blocks/api/block.ts (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/extensions/Blocks/api/blockTypes.ts (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/extensions/Blocks/api/cursorPositionTypes.ts (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/extensions/Blocks/api/defaultBlocks.ts (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/extensions/Blocks/api/inlineContentTypes.ts (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/extensions/Blocks/api/selectionTypes.ts (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/extensions/Blocks/api/serialization.ts (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/extensions/Blocks/helpers/findBlock.ts (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/extensions/Blocks/helpers/getBlockInfoFromPos.ts (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/extensions/Blocks/helpers/getGroupInfoFromPos.ts (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/extensions/Blocks/index.ts (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/extensions/Blocks/nodes/Block.module.css (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/extensions/Blocks/nodes/BlockAttributes.ts (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/extensions/Blocks/nodes/BlockContainer.ts (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/extensions/Blocks/nodes/BlockContent/HeadingBlockContent/HeadingBlockContent.ts (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/extensions/Blocks/nodes/BlockContent/ListItemBlockContent/BulletListItemBlockContent/BulletListItemBlockContent.ts (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/extensions/Blocks/nodes/BlockContent/ListItemBlockContent/ListItemKeyboardShortcuts.ts (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/extensions/Blocks/nodes/BlockContent/ListItemBlockContent/NumberedListItemBlockContent/NumberedListIndexingPlugin.ts (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/extensions/Blocks/nodes/BlockContent/ListItemBlockContent/NumberedListItemBlockContent/NumberedListItemBlockContent.ts (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/extensions/Blocks/nodes/BlockContent/ParagraphBlockContent/ParagraphBlockContent.ts (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/extensions/Blocks/nodes/BlockGroup.ts (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/extensions/DragMedia/DragExtension.ts (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/extensions/DraggableBlocks/BlockSideMenuFactoryTypes.ts (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/extensions/DraggableBlocks/DraggableBlocksExtension.ts (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/extensions/DraggableBlocks/DraggableBlocksPlugin.ts (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/extensions/DraggableBlocks/MultipleNodeSelection.ts (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/extensions/FormattingToolbar/FormattingToolbarPlugin.ts (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/extensions/HyperlinkToolbar/HyperlinkToolbarPlugin.ts (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/extensions/LinkMenu/LinkMenuItem.ts (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/extensions/LinkMenu/LinkMenuPlugin.ts (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/extensions/LinkMenu/defaultLinkMenuItems.tsx (85%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/extensions/Markdown/MarkdownExtension.ts (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/extensions/Placeholder/PlaceholderExtension.ts (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/extensions/SideMenu/MultipleNodeSelection.ts (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/extensions/SideMenu/SideMenuPlugin.ts (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/extensions/SlashMenu/BaseSlashMenuItem.ts (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/extensions/SlashMenu/SlashMenuPlugin.ts (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/extensions/SlashMenu/defaultSlashMenuItems.ts (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/extensions/TextAlignment/TextAlignmentExtension.ts (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/extensions/TextColor/TextColorExtension.ts (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/extensions/TextColor/TextColorMark.ts (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/extensions/TrailingNode/TrailingNodeExtension.ts (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/extensions/UniqueID/UniqueID.ts (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/index.ts (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/shared/BaseUiElementTypes.ts (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/shared/EditorElement.ts (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/shared/EventEmitter.ts (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/shared/plugins/suggestion/SuggestionItem.ts (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/shared/plugins/suggestion/SuggestionPlugin.ts (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/shared/utils.ts (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/core/style.css (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/index.ts (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/react/BlockNoteTheme.ts (99%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/react/BlockNoteView.tsx (59%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/react/Editor/EditorContent.tsx (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/react/FormattingToolbar/components/DefaultButtons/ColorStyleButton.tsx (67%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/react/FormattingToolbar/components/DefaultButtons/CreateLinkButton.tsx (79%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/react/FormattingToolbar/components/DefaultButtons/NestBlockButtons.tsx (74%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/react/FormattingToolbar/components/DefaultButtons/TextAlignButton.tsx (81%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/react/FormattingToolbar/components/DefaultButtons/ToggledStyleButton.tsx (76%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/react/FormattingToolbar/components/DefaultDropdowns/BlockTypeDropdown.tsx (82%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/react/FormattingToolbar/components/DefaultFormattingToolbar.tsx (80%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/react/FormattingToolbar/components/FormattingToolbarPositioner.tsx (89%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/react/FormattingToolbar/components/LinkToolbarButton.tsx (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/react/HyperlinkToolbar/EditHyperlinkMenu/components/EditHyperlinkMenu.tsx (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/react/HyperlinkToolbar/EditHyperlinkMenu/components/EditHyperlinkMenuItem.tsx (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/react/HyperlinkToolbar/EditHyperlinkMenu/components/EditHyperlinkMenuItemIcon.tsx (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/react/HyperlinkToolbar/EditHyperlinkMenu/components/EditHyperlinkMenuItemInput.tsx (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/react/HyperlinkToolbar/components/DefaultHyperlinkToolbar.tsx (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/react/HyperlinkToolbar/components/HyperlinkToolbarPositioner.tsx (91%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/react/LinkMenu/components/DefaultLinkMenu.tsx (82%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/react/LinkMenu/components/LinkMenuItem.tsx (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/react/LinkMenu/components/LinkMenuPositioner.tsx (89%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/react/ReactBlockSpec.tsx (94%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/react/SharedComponents/ColorPicker/components/ColorIcon.tsx (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/react/SharedComponents/ColorPicker/components/ColorPicker.tsx (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/react/SharedComponents/Toolbar/components/Toolbar.tsx (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/react/SharedComponents/Toolbar/components/ToolbarButton.tsx (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/react/SharedComponents/Toolbar/components/ToolbarDropdown.tsx (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/react/SharedComponents/Toolbar/components/ToolbarDropdownItem.tsx (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/react/SharedComponents/Toolbar/components/ToolbarDropdownTarget.tsx (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/react/SharedComponents/Tooltip/components/TooltipContent.tsx (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/react/SideMenu/components/DefaultButtons/AddBlockButton.tsx (53%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/react/SideMenu/components/DefaultButtons/DragHandle.tsx (68%) create mode 100644 frontend/apps/desktop/src/editor/blocknote/react/SideMenu/components/DefaultSideMenu.tsx rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/react/SideMenu/components/DragHandleMenu/DefaultButtons/BlockColorsButton.tsx (66%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/react/SideMenu/components/DragHandleMenu/DefaultButtons/CopyLinkToBlockButton.tsx (52%) create mode 100644 frontend/apps/desktop/src/editor/blocknote/react/SideMenu/components/DragHandleMenu/DefaultButtons/RemoveBlockButton.tsx rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/react/SideMenu/components/DragHandleMenu/DefaultDragHandleMenu.tsx (80%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/react/SideMenu/components/DragHandleMenu/DragHandleMenu.tsx (60%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/react/SideMenu/components/DragHandleMenu/DragHandleMenuItem.tsx (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/react/SideMenu/components/SideMenu.tsx (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/react/SideMenu/components/SideMenuButton.tsx (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/react/SideMenu/components/SideMenuPositioner.tsx (92%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/react/SlashMenu/ReactSlashMenuItem.ts (84%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/react/SlashMenu/components/DefaultSlashMenu.tsx (86%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/react/SlashMenu/components/SlashMenuItem.tsx (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/react/SlashMenu/components/SlashMenuPositioner.tsx (88%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/react/SlashMenu/defaultReactSlashMenuItems.tsx (95%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/react/defaultThemes.ts (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/react/hooks/useBlockNote.ts (91%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/react/hooks/useEditorContentChange.ts (79%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/react/hooks/useEditorForceUpdate.tsx (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/react/hooks/useEditorSelectionChange.ts (80%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/react/index.ts (100%) rename frontend/{packages/app => apps/desktop/src}/editor/blocknote/react/utils.ts (100%) rename frontend/{packages/app => apps/desktop/src}/editor/diffExtension.ts (100%) rename frontend/{packages/app => apps/desktop/src}/editor/editor-types.ts (100%) rename frontend/{packages/app => apps/desktop/src}/editor/editor.css (100%) rename frontend/{packages/app => apps/desktop/src}/editor/embed-block.tsx (89%) rename frontend/{packages/app => apps/desktop/src}/editor/file.tsx (100%) rename frontend/{packages/app => apps/desktop/src}/editor/handle-local-media-paste-plugin.ts (100%) rename frontend/{packages/app => apps/desktop/src}/editor/heading-component-plugin.tsx (100%) rename frontend/{packages/app => apps/desktop/src}/editor/hm-formatting-toolbar.tsx (100%) rename frontend/{packages/app => apps/desktop/src}/editor/hm-toolbar-link-button.tsx (100%) rename frontend/{packages/app => apps/desktop/src}/editor/hyperlink-toolbar.tsx (100%) rename frontend/{packages/app => apps/desktop/src}/editor/hypermedia-link-plugin.tsx (87%) rename frontend/{packages/app => apps/desktop/src}/editor/image-placeholder.ts (100%) rename frontend/{packages/app => apps/desktop/src}/editor/image.css (100%) rename frontend/{packages/app => apps/desktop/src}/editor/image.tsx (87%) rename frontend/{packages/app => apps/desktop/src}/editor/index.ts (100%) rename frontend/{packages/app => apps/desktop/src}/editor/inline-embed.css (100%) rename frontend/{packages/app => apps/desktop/src}/editor/keyboard-helpers.ts (100%) rename frontend/{packages/app => apps/desktop/src}/editor/math.tsx (100%) rename frontend/{packages/app => apps/desktop/src}/editor/media-container.tsx (100%) rename frontend/{packages/app => apps/desktop/src}/editor/media-render.tsx (100%) rename frontend/{packages/app => apps/desktop/src}/editor/mentions-plugin.tsx (86%) rename frontend/{packages/app => apps/desktop/src}/editor/nostr.tsx (100%) rename frontend/{packages/app => apps/desktop/src}/editor/schema.ts (100%) rename frontend/{packages/app => apps/desktop/src}/editor/tiptap-extension-code-block/code-block-lowlight.tsx (83%) rename frontend/{packages/app => apps/desktop/src}/editor/tiptap-extension-code-block/code-block-view.tsx (100%) rename frontend/{packages/app => apps/desktop/src}/editor/tiptap-extension-code-block/code-block.ts (99%) rename frontend/{packages/app => apps/desktop/src}/editor/tiptap-extension-code-block/index.ts (100%) rename frontend/{packages/app => apps/desktop/src}/editor/tiptap-extension-code-block/lowlight-plugin.ts (100%) rename frontend/{packages/app => apps/desktop/src}/editor/tiptap-extension-link/helpers/autolink.ts (100%) rename frontend/{packages/app => apps/desktop/src}/editor/tiptap-extension-link/helpers/clickHandler.ts (100%) rename frontend/{packages/app => apps/desktop/src}/editor/tiptap-extension-link/helpers/pasteHandler.ts (98%) rename frontend/{packages/app => apps/desktop/src}/editor/tiptap-extension-link/index.ts (100%) rename frontend/{packages/app => apps/desktop/src}/editor/tiptap-extension-link/link.ts (100%) rename frontend/{packages/app => apps/desktop/src}/editor/use-popover-state.ts (100%) rename frontend/{packages/app => apps/desktop/src}/editor/utils.ts (100%) rename frontend/{packages/app => apps/desktop/src}/editor/video.tsx (86%) rename frontend/{packages/app => apps/desktop/src}/editor/web-embed.tsx (83%) rename frontend/{packages/app => apps/desktop/src}/errors.tsx (100%) rename frontend/{packages/app => apps/desktop/src}/models/accounts.ts (94%) rename frontend/{packages/app => apps/desktop/src}/models/app-settings.ts (100%) rename frontend/{packages/app => apps/desktop/src}/models/changes.ts (100%) rename frontend/{packages/app => apps/desktop/src}/models/comments.ts (98%) rename frontend/{packages/app => apps/desktop/src}/models/contacts.ts (97%) rename frontend/{packages/app => apps/desktop/src}/models/content-graph.ts (100%) rename frontend/{packages/app => apps/desktop/src}/models/draft-machine.ts (100%) rename frontend/{packages/app => apps/desktop/src}/models/editor-utils.ts (100%) rename frontend/{packages/app => apps/desktop/src}/models/entities.ts (100%) rename frontend/{packages/app => apps/desktop/src}/models/experiments.ts (100%) rename frontend/{packages/app => apps/desktop/src}/models/favorites.ts (100%) rename frontend/{packages/app => apps/desktop/src}/models/feed.ts (98%) rename frontend/{packages/app => apps/desktop/src}/models/gateway-settings.ts (100%) rename frontend/{packages/app => apps/desktop/src}/models/networking.ts (99%) rename frontend/{packages/app => apps/desktop/src}/models/payments.ts (100%) rename frontend/{packages/app => apps/desktop/src}/models/publication.ts (100%) rename frontend/{packages/app => apps/desktop/src}/models/query-keys.ts (100%) rename frontend/{packages/app => apps/desktop/src}/models/recents.ts (100%) rename frontend/{packages/app => apps/desktop/src}/models/search.ts (100%) rename frontend/{packages/app => apps/desktop/src}/models/wallet.ts (100%) rename frontend/{packages/app => apps/desktop/src}/models/web-importer.ts (100%) rename frontend/{packages/app => apps/desktop/src}/models/web-links.ts (97%) rename frontend/{packages/app => apps/desktop/src/models}/window-utils.ts (100%) rename frontend/{packages/app => apps/desktop/src}/query-client.ts (94%) rename frontend/{packages/app => apps/desktop}/src/sidebar-context.tsx (86%) rename frontend/{packages/app => apps/desktop}/src/slash-menu-items.tsx (88%) create mode 100644 frontend/apps/desktop/src/types/code.tsx create mode 100644 frontend/apps/desktop/src/types/image.css create mode 100644 frontend/apps/desktop/src/types/image.tsx create mode 100644 frontend/apps/desktop/src/types/video.tsx rename frontend/{packages/app => apps/desktop/src}/use-popover-state.ts (100%) rename frontend/{packages/app => apps/desktop/src}/utils/account-url.ts (100%) rename frontend/{packages/app => apps/desktop/src}/utils/classnames.ts (100%) rename frontend/{packages/app => apps/desktop/src}/utils/logger.ts (100%) rename frontend/{packages/app => apps/desktop/src}/utils/media-drag.ts (100%) rename frontend/{packages/app => apps/desktop/src}/utils/mege-refs.ts (100%) rename frontend/{packages/app => apps/desktop/src}/utils/navigation-container.tsx (100%) rename frontend/{packages/app => apps/desktop/src}/utils/navigation.tsx (100%) rename frontend/{packages/app => apps/desktop/src}/utils/object-keys.ts (100%) rename frontend/{packages/app => apps/desktop/src}/utils/open-draft.ts (93%) rename frontend/{packages/app => apps/desktop/src}/utils/path.ts (100%) rename frontend/{packages/app => apps/desktop/src}/utils/route-context.ts (100%) rename frontend/{packages/app => apps/desktop/src}/utils/route-encoding.ts (100%) rename frontend/{packages/app => apps/desktop/src}/utils/routes.tsx (100%) rename frontend/{packages/app => apps/desktop/src}/utils/site-hostname.ts (100%) rename frontend/{packages/app => apps/desktop/src}/utils/useNavigate.tsx (100%) rename frontend/{packages/app => apps/desktop/src}/utils/window-events.ts (100%) rename frontend/{packages/app => apps/desktop/src}/utils/window-types.ts (100%) delete mode 100644 frontend/packages/app/.gitignore delete mode 100644 frontend/packages/app/.prettierrc.js delete mode 100644 frontend/packages/app/app-context.tsx delete mode 100644 frontend/packages/app/client/example-docs.ts delete mode 100644 frontend/packages/app/editor/blocknote/react/SideMenu/components/DefaultSideMenu.tsx delete mode 100644 frontend/packages/app/editor/blocknote/react/SideMenu/components/DragHandleMenu/DefaultButtons/RemoveBlockButton.tsx delete mode 100644 frontend/packages/app/env.d.ts delete mode 100644 frontend/packages/app/index.ts delete mode 100644 frontend/packages/app/logger.ts delete mode 100644 frontend/packages/app/models/daemon.ts delete mode 100644 frontend/packages/app/models/documents.ts delete mode 100644 frontend/packages/app/package.json delete mode 100644 frontend/packages/app/tamagui.config.ts delete mode 100644 frontend/packages/app/tsconfig.json diff --git a/frontend/apps/desktop/env.d.ts b/frontend/apps/desktop/env.d.ts index 970934bc90..e6baf29c75 100644 --- a/frontend/apps/desktop/env.d.ts +++ b/frontend/apps/desktop/env.d.ts @@ -4,3 +4,13 @@ declare const MAIN_WINDOW_VITE_DEV_SERVER_URL: string declare const MAIN_WINDOW_VITE_NAME: string declare const FIND_IN_PAGE_VITE_DEV_SERVER_URL: string declare const FIND_IN_PAGE_VITE_NAME: string + +interface ImportMetaEnv { + readonly VITE_HTTP_PORT: string + readonly VITE_GRPC_PORT: string + readonly VITE_P2P_PORT: string +} + +interface ImportMeta { + readonly env: ImportMetaEnv +} diff --git a/frontend/apps/desktop/package.json b/frontend/apps/desktop/package.json index a3860ba1ce..a293d54917 100644 --- a/frontend/apps/desktop/package.json +++ b/frontend/apps/desktop/package.json @@ -32,20 +32,50 @@ "@ariakit/react": "0.3.5", "@bufbuild/protobuf": "^1.10.0", "@connectrpc/connect-web": "1.1.3", + "@dnd-kit/core": "^6.1.0", + "@dnd-kit/sortable": "^8.0.0", "@electron-forge/maker-dmg": "7.1.0", "@electron-forge/maker-rpm": "7.1.0", + "@emotion/cache": "11.11.0", + "@emotion/react": "11.11.1", + "@emotion/serialize": "1.1.2", + "@emotion/utils": "1.2.1", + "@hookform/resolvers": "3.3.1", "@juggle/resize-observer": "3.4.0", + "@mantine/core": "6.0.13", + "@mantine/hooks": "6.0.13", + "@manuscripts/prosemirror-recreate-steps": "^0.1.4", + "@radix-ui/colors": "0.1.9", + "@radix-ui/react-dropdown-menu": "2.0.5", "@sentry/electron": "4.7.0", + "@sentry/tracing": "7.49.0", "@sentry/vite-plugin": "latest", - "@shm/app": "*", "@shm/prettier": "*", "@shm/shared": "*", "@shm/ui": "*", "@tanstack/react-query": "4.33.0", "@tanstack/react-query-devtools": "4.33.0", + "@tippyjs/react": "4.2.6", + "@tiptap/core": "2.0.3", + "@tiptap/extension-bold": "2.0.3", + "@tiptap/extension-code": "2.0.3", + "@tiptap/extension-collaboration": "2.0.3", + "@tiptap/extension-collaboration-cursor": "2.0.3", + "@tiptap/extension-dropcursor": "2.0.3", + "@tiptap/extension-gapcursor": "2.0.3", + "@tiptap/extension-hard-break": "2.0.3", + "@tiptap/extension-history": "2.0.3", + "@tiptap/extension-italic": "2.0.3", + "@tiptap/extension-strike": "2.0.3", + "@tiptap/extension-text": "2.0.3", + "@tiptap/extension-underline": "2.0.3", + "@tiptap/pm": "2.0.3", + "@tiptap/react": "2.0.3", "@trpc/client": "10.40.0", "@trpc/react-query": "10.40.0", "@trpc/server": "10.40.0", + "@xstate/react": "beta", + "allotment": "1.18.1", "cheerio": "1.0.0-rc.12", "console-log-colors": "0.4.0", "electron-context-menu": "3.6.1", @@ -53,13 +83,42 @@ "electron-squirrel-startup": "1.0.0", "electron-store": "8.1.0", "electron-trpc": "0.5.2", + "fast-deep-equal": "^3.1.3", "fs-extra": "11.1.1", + "graphql-request": "6.0.0", + "hast-util-from-dom": "4.2.0", + "highlight.js": "11.9.0", + "katex": "^0.16.9", + "linkifyjs": "4.1.1", + "lowlight": "3.1.0", + "lz-string": "1.5.0", "match-sorter": "6.3.1", + "nanoid": "4.0.2", + "nostr-tools": "1.16.0", "prom-client": "15.1.0", + "prosemirror-state": "1.4.3", "react": "18.2.0", "react-dom": "18.2.0", + "react-error-boundary": "4.0.11", + "react-hook-form": "7.46.1", + "react-icons": "4.9.0", + "react-tweet": "^3.2.0", + "rehype": "12.0.1", + "rehype-parse": "8.0.4", + "rehype-remark": "9.1.2", + "rehype-stringify": "9.0.3", + "remark-gfm": "3.0.1", + "remark-parse": "10.0.1", + "remark-rehype": "10.1.0", + "remark-stringify": "10.0.2", + "unified": "10.1.2", + "use-prefers-color-scheme": "1.1.3", "winston": "3.11.0", "winston-daily-rotate-file": "4.7.1", + "xstate": "beta", + "y-prosemirror": "1.2.1", + "y-protocols": "1.0.5", + "yjs": "13.6.4", "zod": "3.22.2" }, "devDependencies": { @@ -72,17 +131,26 @@ "@playwright/test": "1.40.1", "@shm/prettier": "*", "@tamagui/vite-plugin": "1.95.0", + "@types/node": "20.6.5", + "@types/prosemirror-dev-tools": "3.0.3", "@types/react": "18.2.21", "@types/react-dom": "18.2.7", "@vitejs/plugin-react": "4.0.4", + "copy-text-to-clipboard": "3.1.0", "electron": "26.0.0", "electron-playwright-helpers": "1.6.0", + "happy-dom": "7.8.1", + "jsdom": "22.1.0", "loglevel": "1.8.1", + "prettier": "3.0.2", + "prosemirror-dev-tools": "4.0.0", "react-devtools": "4.28.0", "react-error-boundary": "4.0.11", "tamagui": "1.95.0", + "typescript": "5.5.1-rc", "vite": "4.4.9", "vite-tsconfig-paths": "4.2.0", + "vitest": "0.34.2", "xvfb-maybe": "0.2.1" } } diff --git a/frontend/apps/desktop/src/app-account.tsx b/frontend/apps/desktop/src/app-account.tsx index f5e5200102..dc661684fc 100644 --- a/frontend/apps/desktop/src/app-account.tsx +++ b/frontend/apps/desktop/src/app-account.tsx @@ -1,6 +1,6 @@ -import { useGRPCClient } from '@shm/app/app-context' -import { DialogTitle } from '@shm/app/components/dialog' -import { queryKeys } from '@shm/app/models/query-keys' +import { useGRPCClient } from '@shm/desktop/src/app-context' +import { DialogTitle } from '@shm/desktop/src/components/dialog' +import { queryKeys } from '@shm/desktop/src/models/query-keys' import { eventStream } from '@shm/shared' import { Add, diff --git a/frontend/apps/desktop/src/app-api.ts b/frontend/apps/desktop/src/app-api.ts index 5911624b6f..aa234bb4e6 100644 --- a/frontend/apps/desktop/src/app-api.ts +++ b/frontend/apps/desktop/src/app-api.ts @@ -1,7 +1,12 @@ -import {resolveHmIdToAppRoute} from '@shm/app/utils/navigation' -import {NavRoute, defaultRoute, navRouteSchema} from '@shm/app/utils/routes' -import type {AppWindowEvent} from '@shm/app/utils/window-events' -import {API_GRPC_URL, API_HTTP_URL} from '@shm/shared' +import {resolveHmIdToAppRoute} from '@shm/desktop/src/utils/navigation' +import { + NavRoute, + defaultRoute, + navRouteSchema, +} from '@shm/desktop/src/utils/routes' +import type {AppWindowEvent} from '@shm/desktop/src/utils/window-events' +import {API_GRPC_URL, API_HTTP_URL} from '@shm/shared/src/constants' + import { BrowserWindow, NativeImage, diff --git a/frontend/apps/desktop/src/app-context-provider.tsx b/frontend/apps/desktop/src/app-context-provider.tsx new file mode 100644 index 0000000000..0202d2d9bb --- /dev/null +++ b/frontend/apps/desktop/src/app-context-provider.tsx @@ -0,0 +1,90 @@ +import { GRPCClient } from '@shm/shared' +import { TamaguiProvider, TamaguiProviderProps, View } from '@shm/ui' +import { QueryClientProvider } from '@tanstack/react-query' +import { ReactQueryDevtools } from '@tanstack/react-query-devtools' +import { ReactNode, useMemo } from 'react' + +import tamaguiConfig from '../tamagui.config' +import { AppIPC } from './app-ipc' +import { useExperiments } from './models/experiments' + +import { AppContext, AppPlatform } from './app-context' +import { WindowUtils } from './models/window-utils' +import { AppQueryClient } from './query-client' + + +export function AppContextProvider({ + children, + platform, + grpcClient, + queryClient, + ipc, + externalOpen, + windowUtils, + saveCidAsFile, + darkMode, +}: { + children: ReactNode + platform: AppPlatform + grpcClient: GRPCClient + queryClient: AppQueryClient + ipc: AppIPC + externalOpen: (url: string) => Promise + windowUtils: WindowUtils + saveCidAsFile: (cid: string, name: string) => Promise + darkMode: boolean +}) { + const appCtx = useMemo( + () => ({ + // platform: 'win32', // to test from macOS + platform, + grpcClient, + queryClient, + ipc, + externalOpen, + windowUtils, + saveCidAsFile, + }), + [], + ) + if (!queryClient) + throw new Error('queryClient is required for AppContextProvider') + return ( + + + {children} + + + + ) +} + +function ReactQueryTools() { + const { data: experiments } = useExperiments() + return experiments?.developerTools ? ( + + + + ) : null +} + +export function StyleProvider({ + children, + darkMode, + ...rest +}: Omit & { darkMode: boolean }) { + return ( + + {children} + + ) +} diff --git a/frontend/apps/desktop/src/app-context.tsx b/frontend/apps/desktop/src/app-context.tsx new file mode 100644 index 0000000000..0b46a58c0d --- /dev/null +++ b/frontend/apps/desktop/src/app-context.tsx @@ -0,0 +1,91 @@ +import { GRPCClient } from '@shm/shared' +import { createContext, useContext, useEffect } from 'react' + +import { AppIPC, Event, EventCallback } from './app-ipc' + +import { WindowUtils } from './models/window-utils' +import { AppQueryClient } from './query-client' + + +export type AppPlatform = typeof process.platform + +export type AppContext = { + platform: AppPlatform + grpcClient: GRPCClient + queryClient: AppQueryClient + ipc: AppIPC + externalOpen: (url: string) => Promise + windowUtils: WindowUtils + saveCidAsFile: (cid: string, name: string) => Promise +} + +export const AppContext = createContext(null) + + +export function useAppContext() { + const context = useContext(AppContext) + if (!context) + throw new Error('useAppContext must be used within a AppContextProvider') + + return context +} + +export function useGRPCClient(): GRPCClient { + const context = useContext(AppContext) + if (!context) + throw new Error('useGRPCClient must be used within a AppContextProvider') + return context.grpcClient +} + +export function useIPC(): AppIPC { + const context = useContext(AppContext) + if (!context) + throw new Error('useIPC must be used within a AppContextProvider') + + return context.ipc +} + +export function useQueryInvalidator() { + const context = useContext(AppContext) + if (!context) + throw new Error( + 'useQueryInvalidator must be used within a AppContextProvider', + ) + + return context.queryClient.invalidate +} + +export function useWindowUtils(): WindowUtils { + const context = useContext(AppContext) + if (!context) + throw new Error('useWindowUtils must be used within a AppContextProvider') + + return context.windowUtils +} + +export function useListen( + cmd: string, + handler: EventCallback, + deps: React.DependencyList = [], +) { + const { listen } = useIPC() + useEffect(() => { + if (!listen) { + throw new Error('useListen called before listen is defined') + } + let isSubscribed = true + let unlisten: () => void + + listen(cmd, (event: Event) => { + if (!isSubscribed) { + return unlisten() + } + + handler(event) + }).then((_unlisten) => (unlisten = _unlisten)) + + return () => { + isSubscribed = false + } + }, deps) +} diff --git a/frontend/packages/app/app-ipc.tsx b/frontend/apps/desktop/src/app-ipc.tsx similarity index 100% rename from frontend/packages/app/app-ipc.tsx rename to frontend/apps/desktop/src/app-ipc.tsx diff --git a/frontend/apps/desktop/src/app-menu.ts b/frontend/apps/desktop/src/app-menu.ts index 89b603306b..c6ccf61089 100644 --- a/frontend/apps/desktop/src/app-menu.ts +++ b/frontend/apps/desktop/src/app-menu.ts @@ -1,9 +1,9 @@ // this menu is visible on macOS only // the keyboard shortcuts apply to every platform -import { defaultRoute } from '@shm/app/utils/routes' -import { Menu, MenuItem } from 'electron' -import { dispatchFocusedWindowAppEvent, openRoute, trpc } from './app-api' +import {defaultRoute} from '@shm/desktop/src/utils/routes' +import {Menu, MenuItem} from 'electron' +import {dispatchFocusedWindowAppEvent, openRoute, trpc} from './app-api' export function createAppMenu() { const appMenu = new Menu() diff --git a/frontend/apps/desktop/src/app-recents.ts b/frontend/apps/desktop/src/app-recents.ts index 6172fd2003..0b5d1c8036 100644 --- a/frontend/apps/desktop/src/app-recents.ts +++ b/frontend/apps/desktop/src/app-recents.ts @@ -1,4 +1,4 @@ -import {NavRoute, getRecentsRouteEntityUrl} from '@shm/app/utils/routes' +import {NavRoute, getRecentsRouteEntityUrl} from '@shm/desktop/src/utils/routes' import {getPublicationVariant} from '@shm/shared' import {z} from 'zod' import {grpcClient} from './app-grpc' diff --git a/frontend/apps/desktop/src/app-windows.ts b/frontend/apps/desktop/src/app-windows.ts index 129562cf94..b60e4d2dfc 100644 --- a/frontend/apps/desktop/src/app-windows.ts +++ b/frontend/apps/desktop/src/app-windows.ts @@ -1,8 +1,8 @@ -import appError from '@shm/app/errors' -import type {NavState} from '@shm/app/utils/navigation' -import {NavRoute, defaultRoute} from '@shm/app/utils/routes' -import type {AppWindowEvent} from '@shm/app/utils/window-events' -import {getRouteWindowType} from '@shm/app/utils/window-types' +import appError from '@shm/desktop/src/errors' +import type {NavState} from '@shm/desktop/src/utils/navigation' +import {NavRoute, defaultRoute} from '@shm/desktop/src/utils/routes' +import type {AppWindowEvent} from '@shm/desktop/src/utils/window-events' +import {getRouteWindowType} from '@shm/desktop/src/utils/window-types' import { BrowserView, BrowserWindow, diff --git a/frontend/apps/desktop/src/blocknote-react/types/styles.d.ts b/frontend/apps/desktop/src/blocknote-react/types/styles.d.ts new file mode 100644 index 0000000000..f57bdaee63 --- /dev/null +++ b/frontend/apps/desktop/src/blocknote-react/types/styles.d.ts @@ -0,0 +1 @@ +declare module "*.module.css"; \ No newline at end of file diff --git a/frontend/apps/desktop/src/changes-list.tsx b/frontend/apps/desktop/src/changes-list.tsx index 71620f35b0..cf7ab5fbec 100644 --- a/frontend/apps/desktop/src/changes-list.tsx +++ b/frontend/apps/desktop/src/changes-list.tsx @@ -1,16 +1,16 @@ -import { AccessoryContainer } from '@shm/app/components/accessory-sidebar' -import { AccountLinkAvatar } from '@shm/app/components/account-link-avatar' +import { AccessoryContainer } from '@shm/desktop/src/components/accessory-sidebar' +import { AccountLinkAvatar } from '@shm/desktop/src/components/account-link-avatar' import { MenuItemType, OptionsDropdown, -} from '@shm/app/components/options-dropdown' -import { useAccount } from '@shm/app/models/accounts' -import { TimelineChange, useDocHistory } from '@shm/app/models/changes' -import { useGatewayUrl } from '@shm/app/models/gateway-settings' -import { useNavRoute } from '@shm/app/utils/navigation' -import { NavRoute } from '@shm/app/utils/routes' -import { useNavigate } from '@shm/app/utils/useNavigate' +} from '@shm/desktop/src/components/options-dropdown' +import { useAccount } from '@shm/desktop/src/models/accounts' +import { TimelineChange, useDocHistory } from '@shm/desktop/src/models/changes' +import { useGatewayUrl } from '@shm/desktop/src/models/gateway-settings' import { useOpenUrl } from '@shm/desktop/src/open-url' +import { useNavRoute } from '@shm/desktop/src/utils/navigation' +import { NavRoute } from '@shm/desktop/src/utils/routes' +import { useNavigate } from '@shm/desktop/src/utils/useNavigate' import { Change, createHmId, diff --git a/frontend/packages/app/components/accessory-sidebar.tsx b/frontend/apps/desktop/src/components/accessory-sidebar.tsx similarity index 100% rename from frontend/packages/app/components/accessory-sidebar.tsx rename to frontend/apps/desktop/src/components/accessory-sidebar.tsx diff --git a/frontend/packages/app/components/account-card.tsx b/frontend/apps/desktop/src/components/account-card.tsx similarity index 100% rename from frontend/packages/app/components/account-card.tsx rename to frontend/apps/desktop/src/components/account-card.tsx diff --git a/frontend/packages/app/components/account-link-avatar.tsx b/frontend/apps/desktop/src/components/account-link-avatar.tsx similarity index 76% rename from frontend/packages/app/components/account-link-avatar.tsx rename to frontend/apps/desktop/src/components/account-link-avatar.tsx index 5946318157..35adba312f 100644 --- a/frontend/packages/app/components/account-link-avatar.tsx +++ b/frontend/apps/desktop/src/components/account-link-avatar.tsx @@ -1,11 +1,11 @@ -import {Avatar} from '@shm/app/components/avatar' -import appError from '@shm/app/errors' -import {useAccount} from '@shm/app/models/accounts' -import {useNavigate} from '@shm/app/utils/useNavigate' -import {Account} from '@shm/shared' -import {Button, FontSizeTokens, Tooltip, YStack} from '@shm/ui' -import {AlertCircle} from '@tamagui/lucide-icons' -import {getAvatarUrl} from '../utils/account-url' +import { Avatar } from '@shm/desktop/src/components/avatar' +import appError from '@shm/desktop/src/errors' +import { useAccount } from '@shm/desktop/src/models/accounts' +import { useNavigate } from '@shm/desktop/src/utils/useNavigate' +import { Account } from '@shm/shared' +import { Button, FontSizeTokens, Tooltip, YStack } from '@shm/ui' +import { AlertCircle } from '@tamagui/lucide-icons' +import { getAvatarUrl } from '../utils/account-url' export function ErrorDot() { return ( @@ -77,7 +77,7 @@ export function BaseAccountLinkAvatar({ className="no-window-drag" size="$1" backgroundColor="transparent" - hoverStyle={{backgroundColor: 'transparent'}} + hoverStyle={{ backgroundColor: 'transparent' }} minWidth={20} minHeight={20} padding={0} @@ -85,7 +85,7 @@ export function BaseAccountLinkAvatar({ e.preventDefault() e.stopPropagation() if (!accountId) return appError('No account ready to load') - navigate({key: 'account', accountId}) + navigate({ key: 'account', accountId }) }} position="relative" height={size} diff --git a/frontend/packages/app/components/accounts-combobox.css b/frontend/apps/desktop/src/components/accounts-combobox.css similarity index 100% rename from frontend/packages/app/components/accounts-combobox.css rename to frontend/apps/desktop/src/components/accounts-combobox.css diff --git a/frontend/packages/app/components/alert.tsx b/frontend/apps/desktop/src/components/alert.tsx similarity index 100% rename from frontend/packages/app/components/alert.tsx rename to frontend/apps/desktop/src/components/alert.tsx diff --git a/frontend/packages/app/components/app-banner.tsx b/frontend/apps/desktop/src/components/app-banner.tsx similarity index 100% rename from frontend/packages/app/components/app-banner.tsx rename to frontend/apps/desktop/src/components/app-banner.tsx diff --git a/frontend/packages/app/components/app-embeds.tsx b/frontend/apps/desktop/src/components/app-embeds.tsx similarity index 100% rename from frontend/packages/app/components/app-embeds.tsx rename to frontend/apps/desktop/src/components/app-embeds.tsx diff --git a/frontend/apps/desktop/src/components/app-error.tsx b/frontend/apps/desktop/src/components/app-error.tsx index 7c416533a3..d09d412cc5 100644 --- a/frontend/apps/desktop/src/components/app-error.tsx +++ b/frontend/apps/desktop/src/components/app-error.tsx @@ -1,4 +1,4 @@ -import { useSidebarContext } from '@shm/app/src/sidebar-context' +import { useSidebarContext } from '@shm/desktop/src/sidebar-context' import { Button, Heading, SizableText, XStack, YStack, useStream } from '@shm/ui' import { FallbackProps } from 'react-error-boundary' import { ErrorBar } from './error-bar' diff --git a/frontend/packages/app/components/avatar-form.tsx b/frontend/apps/desktop/src/components/avatar-form.tsx similarity index 80% rename from frontend/packages/app/components/avatar-form.tsx rename to frontend/apps/desktop/src/components/avatar-form.tsx index 8ef0102a38..2f30afc17a 100644 --- a/frontend/packages/app/components/avatar-form.tsx +++ b/frontend/apps/desktop/src/components/avatar-form.tsx @@ -1,8 +1,8 @@ -import {Avatar} from '@shm/app/components/avatar' -import {useMyAccount} from '@shm/app/models/accounts' -import {API_FILE_UPLOAD_URL} from '@shm/shared' -import {Stack, Tooltip} from '@shm/ui' -import {ChangeEvent} from 'react' +import { Avatar } from '@shm/desktop/src/components/avatar' +import { useMyAccount } from '@shm/desktop/src/models/accounts' +import { API_FILE_UPLOAD_URL } from '@shm/shared' +import { Stack, Tooltip } from '@shm/ui' +import { ChangeEvent } from 'react' import appError from '../errors' export function AvatarForm({ @@ -20,9 +20,9 @@ export function AvatarForm({ const file = fileList?.[0] if (!file) return handleUpload(file) - .then(() => {}) + .then(() => { }) .catch((error) => { - appError(`Failed to upload avatar: ${e.message}`, {error}) + appError(`Failed to upload avatar: ${e.message}`, { error }) }) .finally(() => { event.target.value = '' @@ -54,7 +54,7 @@ export function AvatarForm({ if (disabled) return avatarImage return ( - + + + {group.comments?.map((comment) => { + if (!comment.createTime) return null + const lastComment = group.comments.at(-1) + return ( + { + createComment(targetDocEid, targetDocVersion, comment.id) + }, + }, + { + key: 'copyLink', + label: 'Copy Link', + icon: Copy, + onPress: () => { + copyUrlToClipboardWithFeedback(comment.id, 'Comment') + }, + }, + { + key: 'openNewWindow', + label: 'Open in New Window', + icon: ArrowUpRight, + onPress: () => { + spawn({ + key: 'comment', + commentId: comment.id, + showThread: false, + }) + }, + }, + ]} + onReplyBlock={(blockId: string) => { + if (!lastComment) return + const targetId = unpackHmId(lastComment.id) + const quotingCommentId = unpackHmId(comment.id) + if (!targetId || !quotingCommentId) return + createComment( + targetDocEid, + targetDocVersion, + lastComment.id, + createHmId('c', quotingCommentId.eid, { + blockRef: blockId, + }), + ) + }} + /> + ) + })} + + {group.moreCommentsCount ? ( + + ) : ( + + )} + + + ) +} + +export function CommentThread({ + targetCommentId, + targetDocEid, + onReplyBlock, +}: { + targetCommentId: string + targetDocEid: string + onReplyBlock: (commentId: string, blockId: string) => void +}) { + const thread = useCommentReplies(targetCommentId, targetDocEid) + return ( + <> + + {thread?.map((comment) => { + if (!comment) return null + return ( + { + onReplyBlock(comment.id, blockId) + }} + /> + ) + })} + + + ) +} + +export function EntityCommentsAccessory({ + id, + activeVersion, +}: { + id: UnpackedHypermediaId + activeVersion: string +}) { + const navigate = useNavigate() + const commentGroups = usePublicationCommentGroups(id.eid) + const createComment = trpc.comments.createCommentDraft.useMutation() + return ( + + + + } + > + + {commentGroups.map((group) => ( + + ))} + + + ) +} + +export function CommentPresentation({ + comment, + menuItems, + onReplyBlock, +}: { + comment: HMComment + menuItems?: (MenuItemType | null)[] + onReplyBlock?: (blockId: string) => void +}) { + const account = useAccount(comment.author) + + return ( + + + + + {account.data?.profile?.alias} + + {menuItems ? ( + + ) : null} + + {comment.createTime ? ( + + + {formattedDateMedium(comment.createTime)} + + + ) : null} + + { + const url = `${comment.id}#${blockId}${serializeBlockRange( + blockRange, + )}` + copyUrlToClipboardWithFeedback(url, 'Comment Block') + }} + > + + + + + ) +} + +export function CommentPageTitlebar({ + icon, + children, +}: { + icon?: React.ReactNode + children?: React.ReactNode +}) { + const { platform } = useAppContext() + const isWindowsLinux = platform !== 'darwin' + return ( + + {!isWindowsLinux ? : null} + + + {icon || ( + + + + )} + {children} + + + {isWindowsLinux ? : null} + + ) +} + +export function CommentPageTitlebarWithDocId({ + targetDocId, + targetDocIdStream, +}: { + targetDocId?: string | null + targetDocIdStream?: StateStream +}) { + const docId = useStream(targetDocIdStream) + const usableDocId = targetDocId || docId || undefined + const pub = usePublication({ id: usableDocId }) + const publication = pub.data + const spawn = useNavigate('spawn') + const author = publication?.document?.author + const title = publication?.document?.title + if (!publication || !author || !title || !usableDocId) + return ( + + Comment + + ) + return ( + + + Comment on{' '} + { + spawn({ + key: 'document', + documentId: usableDocId, + versionId: pub.data?.version, + }) + }} + > + {title} + + + + ) +} diff --git a/frontend/packages/app/components/commit-draft-button.tsx b/frontend/apps/desktop/src/components/commit-draft-button.tsx similarity index 80% rename from frontend/packages/app/components/commit-draft-button.tsx rename to frontend/apps/desktop/src/components/commit-draft-button.tsx index 2671402d29..d8e62b0658 100644 --- a/frontend/packages/app/components/commit-draft-button.tsx +++ b/frontend/apps/desktop/src/components/commit-draft-button.tsx @@ -1,5 +1,5 @@ -import {useNavRoute} from '@shm/app/utils/navigation' -import {AuthorVariant} from '@shm/shared' +import { useNavRoute } from '@shm/desktop/src/utils/navigation' +import { AuthorVariant } from '@shm/shared' import { AlertCircle, Button, @@ -9,14 +9,14 @@ import { YStackProps, toast, } from '@shm/ui' -import {Check} from '@tamagui/lucide-icons' -import {PropsWithChildren} from 'react' -import {useGRPCClient} from '../app-context' -import {useMyAccount} from '../models/accounts' -import {usePublishDraft, usePushPublication} from '../models/documents' -import {DraftStatusContext} from '../models/draft-machine' -import {useGatewayHost, usePushOnPublish} from '../models/gateway-settings' -import {useMediaDialog} from './media-dialog' +import { Check } from '@tamagui/lucide-icons' +import { PropsWithChildren } from 'react' +import { useGRPCClient } from '../app-context' +import { useMyAccount } from '../models/accounts' +import { usePublishDraft, usePushPublication } from '../models/documents' +import { DraftStatusContext } from '../models/draft-machine' +import { useGatewayHost, usePushOnPublish } from '../models/gateway-settings' +import { useMediaDialog } from './media-dialog' export default function CommitDraftButton() { const route = useNavRoute() @@ -28,9 +28,9 @@ export default function CommitDraftButton() { const myAccount = useMyAccount() const myAuthorVariant: AuthorVariant | null = myAccount.data?.id ? { - key: 'author', - author: myAccount.data.id, - } + key: 'author', + author: myAccount.data.id, + } : null const mediaDialog = useMediaDialog() const canPublish = DraftStatusContext.useSelector( @@ -43,7 +43,7 @@ export default function CommitDraftButton() { const push = usePushPublication() const gwHost = useGatewayHost() const publish = usePublishDraft({ - onSuccess: ({pub: publishedDoc}) => { + onSuccess: ({ pub: publishedDoc }) => { if (!publishedDoc || !draftId || !myAuthorVariant) return if (pushOnPublish.data === 'always') { toast.promise(push.mutateAsync(draftId), { @@ -81,7 +81,7 @@ export default function CommitDraftButton() { disabled={!canPublish || hasUpdateError} opacity={!canPublish ? 0.5 : 1} onPress={() => { - grpcClient.drafts.getDraft({documentId: draftId}).then((draft) => { + grpcClient.drafts.getDraft({ documentId: draftId }).then((draft) => { const hasEmptyMedia = draft.children.find((block) => { return ( block.block && @@ -95,7 +95,7 @@ export default function CommitDraftButton() { publish, }) } else { - publish.mutate({draftId}) + publish.mutate({ draftId }) } }) }} @@ -108,7 +108,7 @@ export default function CommitDraftButton() { ) } -function StatusWrapper({children, ...props}: PropsWithChildren) { +function StatusWrapper({ children, ...props }: PropsWithChildren) { return ( {children} diff --git a/frontend/packages/app/components/contacts-prompt.tsx b/frontend/apps/desktop/src/components/contacts-prompt.tsx similarity index 100% rename from frontend/packages/app/components/contacts-prompt.tsx rename to frontend/apps/desktop/src/components/contacts-prompt.tsx diff --git a/frontend/packages/app/components/copy-gateway-reference.tsx b/frontend/apps/desktop/src/components/copy-gateway-reference.tsx similarity index 100% rename from frontend/packages/app/components/copy-gateway-reference.tsx rename to frontend/apps/desktop/src/components/copy-gateway-reference.tsx diff --git a/frontend/packages/app/components/debug-data.tsx b/frontend/apps/desktop/src/components/debug-data.tsx similarity index 100% rename from frontend/packages/app/components/debug-data.tsx rename to frontend/apps/desktop/src/components/debug-data.tsx diff --git a/frontend/packages/app/components/delete-comment-draft-dialog.tsx b/frontend/apps/desktop/src/components/delete-comment-draft-dialog.tsx similarity index 100% rename from frontend/packages/app/components/delete-comment-draft-dialog.tsx rename to frontend/apps/desktop/src/components/delete-comment-draft-dialog.tsx diff --git a/frontend/packages/app/components/delete-dialog.tsx b/frontend/apps/desktop/src/components/delete-dialog.tsx similarity index 100% rename from frontend/packages/app/components/delete-dialog.tsx rename to frontend/apps/desktop/src/components/delete-dialog.tsx diff --git a/frontend/packages/app/components/delete-draft-dialog.tsx b/frontend/apps/desktop/src/components/delete-draft-dialog.tsx similarity index 78% rename from frontend/packages/app/components/delete-draft-dialog.tsx rename to frontend/apps/desktop/src/components/delete-draft-dialog.tsx index 102f4a02a3..22551a3c51 100644 --- a/frontend/packages/app/components/delete-draft-dialog.tsx +++ b/frontend/apps/desktop/src/components/delete-draft-dialog.tsx @@ -1,9 +1,9 @@ -import {useDeleteDraft} from '@shm/app/models/documents' -import {AlertDialog, Button, XStack, YStack} from '@shm/ui' -import {useAppDialog} from './dialog' +import { useDeleteDraft } from '@shm/desktop/src/models/documents' +import { AlertDialog, Button, XStack, YStack } from '@shm/ui' +import { useAppDialog } from './dialog' export function useDeleteDraftDialog() { - return useAppDialog(DeleteDraftDialog, {isAlert: true}) + return useAppDialog(DeleteDraftDialog, { isAlert: true }) } function DeleteDraftDialog({ @@ -11,7 +11,7 @@ function DeleteDraftDialog({ input, }: { onClose: () => void - input: {draftId: string; onSuccess?: () => void} + input: { draftId: string; onSuccess?: () => void } }) { const deleteDraft = useDeleteDraft({ onSuccess: input.onSuccess, diff --git a/frontend/packages/app/components/dialog.tsx b/frontend/apps/desktop/src/components/dialog.tsx similarity index 100% rename from frontend/packages/app/components/dialog.tsx rename to frontend/apps/desktop/src/components/dialog.tsx diff --git a/frontend/packages/app/components/discard-draft-button.tsx b/frontend/apps/desktop/src/components/discard-draft-button.tsx similarity index 65% rename from frontend/packages/app/components/discard-draft-button.tsx rename to frontend/apps/desktop/src/components/discard-draft-button.tsx index ee91c23c77..f12d293381 100644 --- a/frontend/packages/app/components/discard-draft-button.tsx +++ b/frontend/apps/desktop/src/components/discard-draft-button.tsx @@ -1,8 +1,8 @@ -import {useDeleteDraftDialog} from '@shm/app/components/delete-draft-dialog' -import {useNavRoute} from '@shm/app/utils/navigation' -import {Button, Tooltip} from '@shm/ui' -import {Trash} from '@tamagui/lucide-icons' -import {useNavigationDispatch} from '../utils/navigation' +import { useDeleteDraftDialog } from '@shm/desktop/src/components/delete-draft-dialog' +import { useNavRoute } from '@shm/desktop/src/utils/navigation' +import { Button, Tooltip } from '@shm/ui' +import { Trash } from '@tamagui/lucide-icons' +import { useNavigationDispatch } from '../utils/navigation' export default function DiscardDraftButton() { const route = useNavRoute() @@ -21,7 +21,7 @@ export default function DiscardDraftButton() { deleteDialog.open({ draftId, onSuccess: () => { - dispatch({type: 'closeBack'}) + dispatch({ type: 'closeBack' }) }, }) } diff --git a/frontend/packages/app/components/dropdown.tsx b/frontend/apps/desktop/src/components/dropdown.tsx similarity index 100% rename from frontend/packages/app/components/dropdown.tsx rename to frontend/apps/desktop/src/components/dropdown.tsx diff --git a/frontend/packages/app/components/edit-doc-button.tsx b/frontend/apps/desktop/src/components/edit-doc-button.tsx similarity index 92% rename from frontend/packages/app/components/edit-doc-button.tsx rename to frontend/apps/desktop/src/components/edit-doc-button.tsx index b9cdb66abb..abcff6df51 100644 --- a/frontend/packages/app/components/edit-doc-button.tsx +++ b/frontend/apps/desktop/src/components/edit-doc-button.tsx @@ -1,8 +1,8 @@ -import { useGRPCClient } from '@shm/app/app-context' -import { useDraftList } from '@shm/app/models/documents' -import { usePublicationVariant } from '@shm/app/models/publication' -import { NavMode } from '@shm/app/utils/navigation' -import { useNavigate } from '@shm/app/utils/useNavigate' +import { useGRPCClient } from '@shm/desktop/src/app-context' +import { useDraftList } from '@shm/desktop/src/models/documents' +import { usePublicationVariant } from '@shm/desktop/src/models/publication' +import { NavMode } from '@shm/desktop/src/utils/navigation' +import { useNavigate } from '@shm/desktop/src/utils/useNavigate' import { HMBlock, PublicationVariant } from '@shm/shared' import { Button, Tooltip, toast } from '@shm/ui' import { Pencil } from '@tamagui/lucide-icons' diff --git a/frontend/packages/app/components/edit-profile-dialog.tsx b/frontend/apps/desktop/src/components/edit-profile-dialog.tsx similarity index 100% rename from frontend/packages/app/components/edit-profile-dialog.tsx rename to frontend/apps/desktop/src/components/edit-profile-dialog.tsx diff --git a/frontend/apps/desktop/src/components/editor.tsx b/frontend/apps/desktop/src/components/editor.tsx index 597adbe3a2..b9e7606e08 100644 --- a/frontend/apps/desktop/src/components/editor.tsx +++ b/frontend/apps/desktop/src/components/editor.tsx @@ -5,12 +5,12 @@ import { LinkMenuPositioner, SideMenuPositioner, SlashMenuPositioner, -} from '@shm/app/editor/blocknote' -import '@shm/app/editor/blocknote/core/style.css' -import '@shm/app/editor/editor.css' -import { HMFormattingToolbar } from '@shm/app/editor/hm-formatting-toolbar' -import { HypermediaLinkToolbar } from '@shm/app/editor/hyperlink-toolbar' -import { HyperDocsEditor } from '@shm/app/models/documents' +} from '@shm/desktop/src/editor/blocknote' +import '@shm/desktop/src/editor/blocknote/core/style.css' +import '@shm/desktop/src/editor/editor.css' +import { HMFormattingToolbar } from '@shm/desktop/src/editor/hm-formatting-toolbar' +import { HypermediaLinkToolbar } from '@shm/desktop/src/editor/hyperlink-toolbar' +import { HyperDocsEditor } from '@shm/desktop/src/models/documents' import { useOpenUrl } from '@shm/desktop/src/open-url' import { YStack } from '@shm/ui' diff --git a/frontend/packages/app/components/empty-list.tsx b/frontend/apps/desktop/src/components/empty-list.tsx similarity index 100% rename from frontend/packages/app/components/empty-list.tsx rename to frontend/apps/desktop/src/components/empty-list.tsx diff --git a/frontend/apps/desktop/src/components/error-bar.tsx b/frontend/apps/desktop/src/components/error-bar.tsx index e30ad27947..1c6dc7ffda 100644 --- a/frontend/apps/desktop/src/components/error-bar.tsx +++ b/frontend/apps/desktop/src/components/error-bar.tsx @@ -1,5 +1,5 @@ -import {AppPlatform, useAppContext} from '@shm/app/app-context' -import {lazy} from 'react' +import { AppPlatform, useAppContext } from '@shm/desktop/src/app-context' +import { lazy } from 'react' var ErrorBarMacos = lazy(() => import('./error-bar-macos')) var ErrorBarWindowsLinux = lazy(() => import('./error-bar-windows-linux')) @@ -9,7 +9,7 @@ export type ErrorBarProps = { } export function ErrorBar(props: ErrorBarProps) { - const {platform} = useAppContext() + const { platform } = useAppContext() let Component = getErrorBar(platform) return } diff --git a/frontend/packages/app/components/favoriting.tsx b/frontend/apps/desktop/src/components/favoriting.tsx similarity index 100% rename from frontend/packages/app/components/favoriting.tsx rename to frontend/apps/desktop/src/components/favoriting.tsx diff --git a/frontend/packages/app/components/first-publish-dialog.tsx b/frontend/apps/desktop/src/components/first-publish-dialog.tsx similarity index 100% rename from frontend/packages/app/components/first-publish-dialog.tsx rename to frontend/apps/desktop/src/components/first-publish-dialog.tsx diff --git a/frontend/packages/app/components/footer.tsx b/frontend/apps/desktop/src/components/footer.tsx similarity index 75% rename from frontend/packages/app/components/footer.tsx rename to frontend/apps/desktop/src/components/footer.tsx index fc4b1ffdce..43dd2273ef 100644 --- a/frontend/packages/app/components/footer.tsx +++ b/frontend/apps/desktop/src/components/footer.tsx @@ -1,11 +1,11 @@ -import {useConnectionSummary} from '@shm/app/models/contacts' -import {useNavRoute} from '@shm/app/utils/navigation' -import {VERSION} from '@shm/shared' -import {Button, ButtonProps, FooterWrapper, SizableText, XStack} from '@shm/ui' -import {Cable} from '@tamagui/lucide-icons' -import {ReactNode} from 'react' -import {OnlineIndicator} from './indicator' -import {useNetworkDialog} from './network-dialog' +import { useConnectionSummary } from '@shm/desktop/src/models/contacts' +import { useNavRoute } from '@shm/desktop/src/utils/navigation' +import { VERSION } from '@shm/shared' +import { Button, ButtonProps, FooterWrapper, SizableText, XStack } from '@shm/ui' +import { Cable } from '@tamagui/lucide-icons' +import { ReactNode } from 'react' +import { OnlineIndicator } from './indicator' +import { useNetworkDialog } from './network-dialog' export function FooterButton({ active, @@ -58,9 +58,9 @@ function FooterNetworkingButton() { ) } -export default function Footer({children}: {children?: ReactNode}) { +export default function Footer({ children }: { children?: ReactNode }) { return ( - + + return } -export function MainWrapper({children, ...props}: YStackProps & {}) { +export function MainWrapper({ children, ...props }: YStackProps & {}) { return ( @@ -19,7 +19,7 @@ export function MainWrapper({children, ...props}: YStackProps & {}) { ) } -export function MainWrapperStandalone({children, ...props}: YStackProps & {}) { +export function MainWrapperStandalone({ children, ...props }: YStackProps & {}) { return ( {/* TODO: we cannot remove this ID here because the SlashMenu is referencing @@ -29,7 +29,7 @@ export function MainWrapperStandalone({children, ...props}: YStackProps & {}) { ) } -export function MainWrapperNoScroll({children, ...props}: YStackProps & {}) { +export function MainWrapperNoScroll({ children, ...props }: YStackProps & {}) { return ( diff --git a/frontend/packages/app/components/media-dialog.tsx b/frontend/apps/desktop/src/components/media-dialog.tsx similarity index 100% rename from frontend/packages/app/components/media-dialog.tsx rename to frontend/apps/desktop/src/components/media-dialog.tsx diff --git a/frontend/packages/app/components/network-dialog.tsx b/frontend/apps/desktop/src/components/network-dialog.tsx similarity index 100% rename from frontend/packages/app/components/network-dialog.tsx rename to frontend/apps/desktop/src/components/network-dialog.tsx diff --git a/frontend/packages/app/components/options-dropdown.tsx b/frontend/apps/desktop/src/components/options-dropdown.tsx similarity index 100% rename from frontend/packages/app/components/options-dropdown.tsx rename to frontend/apps/desktop/src/components/options-dropdown.tsx diff --git a/frontend/packages/app/components/placeholder-box.tsx b/frontend/apps/desktop/src/components/placeholder-box.tsx similarity index 100% rename from frontend/packages/app/components/placeholder-box.tsx rename to frontend/apps/desktop/src/components/placeholder-box.tsx diff --git a/frontend/packages/app/components/prompt.tsx b/frontend/apps/desktop/src/components/prompt.tsx similarity index 100% rename from frontend/packages/app/components/prompt.tsx rename to frontend/apps/desktop/src/components/prompt.tsx diff --git a/frontend/packages/app/components/publication-list-item.tsx b/frontend/apps/desktop/src/components/publication-list-item.tsx similarity index 97% rename from frontend/packages/app/components/publication-list-item.tsx rename to frontend/apps/desktop/src/components/publication-list-item.tsx index b014dc9c78..6477768db5 100644 --- a/frontend/packages/app/components/publication-list-item.tsx +++ b/frontend/apps/desktop/src/components/publication-list-item.tsx @@ -1,5 +1,5 @@ -import { useNavRoute } from '@shm/app/utils/navigation' -import { useClickNavigate } from '@shm/app/utils/useNavigate' +import { useNavRoute } from '@shm/desktop/src/utils/navigation' +import { useClickNavigate } from '@shm/desktop/src/utils/useNavigate' import { Document, HMAccount, diff --git a/frontend/packages/app/components/publication-list.tsx b/frontend/apps/desktop/src/components/publication-list.tsx similarity index 98% rename from frontend/packages/app/components/publication-list.tsx rename to frontend/apps/desktop/src/components/publication-list.tsx index 8708b49d23..cbda076290 100644 --- a/frontend/packages/app/components/publication-list.tsx +++ b/frontend/apps/desktop/src/components/publication-list.tsx @@ -1,4 +1,4 @@ -import { useDraftList } from '@shm/app/models/documents' +import { useDraftList } from '@shm/desktop/src/models/documents' import { Delete, List, Spinner } from '@shm/ui' import { Document, PublicationVariant, unpackHmId } from '@shm/shared' diff --git a/frontend/packages/app/components/seed-icon.tsx b/frontend/apps/desktop/src/components/seed-icon.tsx similarity index 100% rename from frontend/packages/app/components/seed-icon.tsx rename to frontend/apps/desktop/src/components/seed-icon.tsx diff --git a/frontend/packages/app/components/select-input.tsx b/frontend/apps/desktop/src/components/select-input.tsx similarity index 100% rename from frontend/packages/app/components/select-input.tsx rename to frontend/apps/desktop/src/components/select-input.tsx diff --git a/frontend/apps/desktop/src/components/sidebar-base.tsx b/frontend/apps/desktop/src/components/sidebar-base.tsx index 88784ee9c3..e562f04b93 100644 --- a/frontend/apps/desktop/src/components/sidebar-base.tsx +++ b/frontend/apps/desktop/src/components/sidebar-base.tsx @@ -1,13 +1,13 @@ -import { useAppContext } from '@shm/app/app-context' -import { Avatar } from '@shm/app/components/avatar' -import { MenuItemType, OptionsDropdown } from '@shm/app/components/options-dropdown' -import appError from '@shm/app/errors' -import { EmbedsContent } from '@shm/app/models/documents' -import { SidebarWidth, useSidebarContext } from '@shm/app/src/sidebar-context' -import { getAvatarUrl } from '@shm/app/utils/account-url' -import { NavRoute } from '@shm/app/utils/routes' -import { useNavigate } from '@shm/app/utils/useNavigate' -import { useTriggerWindowEvent } from '@shm/app/utils/window-events' +import { useAppContext } from '@shm/desktop/src/app-context' +import { Avatar } from '@shm/desktop/src/components/avatar' +import { MenuItemType, OptionsDropdown } from '@shm/desktop/src/components/options-dropdown' +import appError from '@shm/desktop/src/errors' +import { EmbedsContent } from '@shm/desktop/src/models/documents' +import { SidebarWidth, useSidebarContext } from '@shm/desktop/src/sidebar-context' +import { getAvatarUrl } from '@shm/desktop/src/utils/account-url' +import { NavRoute } from '@shm/desktop/src/utils/routes' +import { useNavigate } from '@shm/desktop/src/utils/useNavigate' +import { useTriggerWindowEvent } from '@shm/desktop/src/utils/window-events' import { Account, getBlockNode, diff --git a/frontend/apps/desktop/src/components/sidebar-neo.tsx b/frontend/apps/desktop/src/components/sidebar-neo.tsx index 164c9d0605..98362bc39a 100644 --- a/frontend/apps/desktop/src/components/sidebar-neo.tsx +++ b/frontend/apps/desktop/src/components/sidebar-neo.tsx @@ -1,17 +1,17 @@ -import { useAccount, useMyAccount } from '@shm/app/models/accounts' +import { focusDraftBlock } from '@shm/desktop/src/draft-focusing' +import { useAccount, useMyAccount } from '@shm/desktop/src/models/accounts' import { getEntityRoutes, useEntitiesContent, useEntityContent, useEntityRoutes, -} from '@shm/app/models/entities' -import { useFavorites } from '@shm/app/models/favorites' -import { useDocumentDrafts, usePublicationVariant } from '@shm/app/models/publication' -import { focusDraftBlock } from '@shm/app/src/draft-focusing' -import { appRouteOfId, getRouteKey, useNavRoute } from '@shm/app/utils/navigation' -import { getRouteContext } from '@shm/app/utils/route-context' -import { BaseAccountRoute, BaseEntityRoute, NavRoute } from '@shm/app/utils/routes' -import { useNavigate } from '@shm/app/utils/useNavigate' +} from '@shm/desktop/src/models/entities' +import { useFavorites } from '@shm/desktop/src/models/favorites' +import { useDocumentDrafts, usePublicationVariant } from '@shm/desktop/src/models/publication' +import { appRouteOfId, getRouteKey, useNavRoute } from '@shm/desktop/src/utils/navigation' +import { getRouteContext } from '@shm/desktop/src/utils/route-context' +import { BaseAccountRoute, BaseEntityRoute, NavRoute } from '@shm/desktop/src/utils/routes' +import { useNavigate } from '@shm/desktop/src/utils/useNavigate' import { HMAccount, HMBlockNode, diff --git a/frontend/apps/desktop/src/components/sidebar.tsx b/frontend/apps/desktop/src/components/sidebar.tsx index bf1488b21a..25bba7b0ef 100644 --- a/frontend/apps/desktop/src/components/sidebar.tsx +++ b/frontend/apps/desktop/src/components/sidebar.tsx @@ -1,16 +1,16 @@ -import { useAccount } from '@shm/app/models/accounts' -import { useDocumentEmbeds } from '@shm/app/models/documents' -import { useFavorites } from '@shm/app/models/favorites' -import { appRouteOfId, getRouteKey, useNavRoute } from '@shm/app/utils/navigation' -import { getRouteContext, getRouteParentContext } from '@shm/app/utils/route-context' +import { CurrentAccountSidebarSection } from '@shm/desktop/src/app-account' +import { useAccount } from '@shm/desktop/src/models/accounts' +import { useDocumentEmbeds } from '@shm/desktop/src/models/documents' +import { useFavorites } from '@shm/desktop/src/models/favorites' +import { appRouteOfId, getRouteKey, useNavRoute } from '@shm/desktop/src/utils/navigation' +import { getRouteContext, getRouteParentContext } from '@shm/desktop/src/utils/route-context' import { AccountRoute, BaseEntityRoute, DocumentRoute, NavRoute, -} from '@shm/app/utils/routes' -import { useNavigate } from '@shm/app/utils/useNavigate' -import { CurrentAccountSidebarSection } from '@shm/desktop/src/app-account' +} from '@shm/desktop/src/utils/routes' +import { useNavigate } from '@shm/desktop/src/utils/useNavigate' import { HMBlockNode, HMDocument, diff --git a/frontend/packages/app/components/slash.tsx b/frontend/apps/desktop/src/components/slash.tsx similarity index 100% rename from frontend/packages/app/components/slash.tsx rename to frontend/apps/desktop/src/components/slash.tsx diff --git a/frontend/apps/desktop/src/components/titlebar-common.tsx b/frontend/apps/desktop/src/components/titlebar-common.tsx index 73994405de..432b0e068c 100644 --- a/frontend/apps/desktop/src/components/titlebar-common.tsx +++ b/frontend/apps/desktop/src/components/titlebar-common.tsx @@ -1,30 +1,30 @@ -import { useAppContext } from '@shm/app/app-context' -import { ContactsPrompt } from '@shm/app/components/contacts-prompt' -import { useCopyGatewayReference } from '@shm/app/components/copy-gateway-reference' -import { useDeleteDialog } from '@shm/app/components/delete-dialog' -import { useAppDialog } from '@shm/app/components/dialog' -import { EditDocButton } from '@shm/app/components/edit-doc-button' -import { useEditProfileDialog } from '@shm/app/components/edit-profile-dialog' -import { useFavoriteMenuItem } from '@shm/app/components/favoriting' -import { MenuItemType, OptionsDropdown } from '@shm/app/components/options-dropdown' +import { useAppContext } from '@shm/desktop/src/app-context' +import { ContactsPrompt } from '@shm/desktop/src/components/contacts-prompt' +import { useCopyGatewayReference } from '@shm/desktop/src/components/copy-gateway-reference' +import { useDeleteDialog } from '@shm/desktop/src/components/delete-dialog' +import { useAppDialog } from '@shm/desktop/src/components/dialog' +import { EditDocButton } from '@shm/desktop/src/components/edit-doc-button' +import { useEditProfileDialog } from '@shm/desktop/src/components/edit-profile-dialog' +import { useFavoriteMenuItem } from '@shm/desktop/src/components/favoriting' +import { MenuItemType, OptionsDropdown } from '@shm/desktop/src/components/options-dropdown' import { DraftPublicationButtons, PublicationVariants, VersionContext, -} from '@shm/app/components/variants' -import { useAccount, useMyAccount } from '@shm/app/models/accounts' -import { usePushPublication } from '@shm/app/models/documents' -import { useGatewayHost, useGatewayUrl } from '@shm/app/models/gateway-settings' -import { usePublicationVariant } from '@shm/app/models/publication' -import { SidebarWidth, useSidebarContext } from '@shm/app/src/sidebar-context' +} from '@shm/desktop/src/components/variants' +import { useAccount, useMyAccount } from '@shm/desktop/src/models/accounts' +import { usePushPublication } from '@shm/desktop/src/models/documents' +import { useGatewayHost, useGatewayUrl } from '@shm/desktop/src/models/gateway-settings' +import { usePublicationVariant } from '@shm/desktop/src/models/publication' +import { SidebarWidth, useSidebarContext } from '@shm/desktop/src/sidebar-context' import { useNavRoute, useNavigationDispatch, useNavigationState, -} from '@shm/app/utils/navigation' -import { useOpenDraft } from '@shm/app/utils/open-draft' -import { NavRoute } from '@shm/app/utils/routes' -import { useNavigate } from '@shm/app/utils/useNavigate' +} from '@shm/desktop/src/utils/navigation' +import { useOpenDraft } from '@shm/desktop/src/utils/open-draft' +import { NavRoute } from '@shm/desktop/src/utils/routes' +import { useNavigate } from '@shm/desktop/src/utils/useNavigate' import { BlockRange, ExpandedBlockRange, diff --git a/frontend/apps/desktop/src/components/titlebar-title.tsx b/frontend/apps/desktop/src/components/titlebar-title.tsx index 845282beb3..8685068d3e 100644 --- a/frontend/apps/desktop/src/components/titlebar-title.tsx +++ b/frontend/apps/desktop/src/components/titlebar-title.tsx @@ -1,15 +1,15 @@ -import { useSizeObserver } from '@shm/app/components/app-embeds' -import { useDraftTitle } from '@shm/app/models/documents' -import { useEntitiesContent, useEntityRoutes } from '@shm/app/models/entities' -import { usePublicationVariant } from '@shm/app/models/publication' -import { useNavRoute } from '@shm/app/utils/navigation' +import { useSizeObserver } from '@shm/desktop/src/components/app-embeds' +import { useDraftTitle } from '@shm/desktop/src/models/documents' +import { useEntitiesContent, useEntityRoutes } from '@shm/desktop/src/models/entities' +import { usePublicationVariant } from '@shm/desktop/src/models/publication' +import { useNavRoute } from '@shm/desktop/src/utils/navigation' import { AccountRoute, DocumentRoute, DraftRoute, NavRoute -} from '@shm/app/utils/routes' -import { useNavigate } from '@shm/app/utils/useNavigate' +} from '@shm/desktop/src/utils/routes' +import { useNavigate } from '@shm/desktop/src/utils/useNavigate' import { getDocumentTitle } from '@shm/shared' import { Button, diff --git a/frontend/apps/desktop/src/components/titlebar-windows-linux.tsx b/frontend/apps/desktop/src/components/titlebar-windows-linux.tsx index b252c7389a..b5ec650ed1 100644 --- a/frontend/apps/desktop/src/components/titlebar-windows-linux.tsx +++ b/frontend/apps/desktop/src/components/titlebar-windows-linux.tsx @@ -1,4 +1,4 @@ -import { CloseButton, WindowsLinuxWindowControls } from '@shm/app/components/window-controls' +import { CloseButton, WindowsLinuxWindowControls } from '@shm/desktop/src/components/window-controls' import { TitleText, TitlebarRow, diff --git a/frontend/apps/desktop/src/components/titlebar.tsx b/frontend/apps/desktop/src/components/titlebar.tsx index 6a61e3a997..25ba850ad0 100644 --- a/frontend/apps/desktop/src/components/titlebar.tsx +++ b/frontend/apps/desktop/src/components/titlebar.tsx @@ -1,6 +1,6 @@ -import {AppPlatform, useAppContext} from '@shm/app/app-context' -import {TitlebarWrapper} from '@shm/ui' -import {Suspense, lazy} from 'react' +import { AppPlatform, useAppContext } from '@shm/desktop/src/app-context' +import { TitlebarWrapper } from '@shm/ui' +import { Suspense, lazy } from 'react' var TitleBarMacos = lazy(() => import('./titlebar-macos')) var TitleBarWindowsLinux = lazy(() => import('./titlebar-windows-linux')) @@ -11,10 +11,10 @@ export interface TitleBarProps { } export function TitleBar(props: TitleBarProps) { - const {platform} = useAppContext() + const { platform } = useAppContext() let Component = getTitleBar(platform) return ( - }> + }> ) diff --git a/frontend/packages/app/components/variants.tsx b/frontend/apps/desktop/src/components/variants.tsx similarity index 98% rename from frontend/packages/app/components/variants.tsx rename to frontend/apps/desktop/src/components/variants.tsx index e89330bde1..fc80dc634c 100644 --- a/frontend/packages/app/components/variants.tsx +++ b/frontend/apps/desktop/src/components/variants.tsx @@ -1,9 +1,9 @@ -import { useMyAccount } from '@shm/app/models/accounts' -import { usePublicationVariant } from '@shm/app/models/publication' +import { useMyAccount } from '@shm/desktop/src/models/accounts' +import { usePublicationVariant } from '@shm/desktop/src/models/publication' import { useNavRoute -} from '@shm/app/utils/navigation' -import { useNavigate } from '@shm/app/utils/useNavigate' +} from '@shm/desktop/src/utils/navigation' +import { useNavigate } from '@shm/desktop/src/utils/useNavigate' import { API_FILE_URL, AuthorVariant, diff --git a/frontend/packages/app/components/window-controls.tsx b/frontend/apps/desktop/src/components/window-controls.tsx similarity index 87% rename from frontend/packages/app/components/window-controls.tsx rename to frontend/apps/desktop/src/components/window-controls.tsx index 54adb1a560..202eba9d18 100644 --- a/frontend/packages/app/components/window-controls.tsx +++ b/frontend/apps/desktop/src/components/window-controls.tsx @@ -1,8 +1,8 @@ -import {useWindowUtils} from '@shm/app/app-context' -import {Button, Close, XStack, useTheme} from '@shm/ui' +import { useWindowUtils } from '@shm/desktop/src/app-context' +import { Button, Close, XStack, useTheme } from '@shm/ui' export function CloseButton() { - const {close} = useWindowUtils() + const { close } = useWindowUtils() return ( ([]) const [targetIndex, setTargetIndex] = useState([]) - console.log('INDEXES', {sourceIndex, targetIndex}) + console.log('INDEXES', { sourceIndex, targetIndex }) useEffect(() => { if (timeline.data?.changesByTime.length) { let sv = route.sourceVersion.split('.').map((v) => { diff --git a/frontend/packages/app/src/draft-focusing.tsx b/frontend/apps/desktop/src/draft-focusing.tsx similarity index 100% rename from frontend/packages/app/src/draft-focusing.tsx rename to frontend/apps/desktop/src/draft-focusing.tsx diff --git a/frontend/packages/app/editor/autocomplete.tsx b/frontend/apps/desktop/src/editor/autocomplete.tsx similarity index 100% rename from frontend/packages/app/editor/autocomplete.tsx rename to frontend/apps/desktop/src/editor/autocomplete.tsx diff --git a/frontend/packages/app/editor/block-utils.ts b/frontend/apps/desktop/src/editor/block-utils.ts similarity index 100% rename from frontend/packages/app/editor/block-utils.ts rename to frontend/apps/desktop/src/editor/block-utils.ts diff --git a/frontend/packages/app/editor/blocknote/core/BlockNoteEditor.ts b/frontend/apps/desktop/src/editor/blocknote/core/BlockNoteEditor.ts similarity index 100% rename from frontend/packages/app/editor/blocknote/core/BlockNoteEditor.ts rename to frontend/apps/desktop/src/editor/blocknote/core/BlockNoteEditor.ts diff --git a/frontend/packages/app/editor/blocknote/core/BlockNoteExtensions.ts b/frontend/apps/desktop/src/editor/blocknote/core/BlockNoteExtensions.ts similarity index 98% rename from frontend/packages/app/editor/blocknote/core/BlockNoteExtensions.ts rename to frontend/apps/desktop/src/editor/blocknote/core/BlockNoteExtensions.ts index c7252ada0f..729a9738fb 100644 --- a/frontend/packages/app/editor/blocknote/core/BlockNoteExtensions.ts +++ b/frontend/apps/desktop/src/editor/blocknote/core/BlockNoteExtensions.ts @@ -3,7 +3,7 @@ import {HMBlockSchema} from '../../schema' import {BlockNoteEditor} from './BlockNoteEditor' -import {LocalMediaPastePlugin} from '@shm/app/editor/handle-local-media-paste-plugin' +import {LocalMediaPastePlugin} from '@shm/desktop/src/editor/handle-local-media-paste-plugin' import {Bold} from '@tiptap/extension-bold' import {Code} from '@tiptap/extension-code' import Collaboration from '@tiptap/extension-collaboration' diff --git a/frontend/packages/app/editor/blocknote/core/api/blockManipulation/blockManipulation.ts b/frontend/apps/desktop/src/editor/blocknote/core/api/blockManipulation/blockManipulation.ts similarity index 100% rename from frontend/packages/app/editor/blocknote/core/api/blockManipulation/blockManipulation.ts rename to frontend/apps/desktop/src/editor/blocknote/core/api/blockManipulation/blockManipulation.ts diff --git a/frontend/packages/app/editor/blocknote/core/api/formatConversions/formatConversions.ts b/frontend/apps/desktop/src/editor/blocknote/core/api/formatConversions/formatConversions.ts similarity index 100% rename from frontend/packages/app/editor/blocknote/core/api/formatConversions/formatConversions.ts rename to frontend/apps/desktop/src/editor/blocknote/core/api/formatConversions/formatConversions.ts diff --git a/frontend/packages/app/editor/blocknote/core/api/formatConversions/removeUnderlinesRehypePlugin.ts b/frontend/apps/desktop/src/editor/blocknote/core/api/formatConversions/removeUnderlinesRehypePlugin.ts similarity index 100% rename from frontend/packages/app/editor/blocknote/core/api/formatConversions/removeUnderlinesRehypePlugin.ts rename to frontend/apps/desktop/src/editor/blocknote/core/api/formatConversions/removeUnderlinesRehypePlugin.ts diff --git a/frontend/packages/app/editor/blocknote/core/api/formatConversions/simplifyBlocksRehypePlugin.ts b/frontend/apps/desktop/src/editor/blocknote/core/api/formatConversions/simplifyBlocksRehypePlugin.ts similarity index 100% rename from frontend/packages/app/editor/blocknote/core/api/formatConversions/simplifyBlocksRehypePlugin.ts rename to frontend/apps/desktop/src/editor/blocknote/core/api/formatConversions/simplifyBlocksRehypePlugin.ts diff --git a/frontend/packages/app/editor/blocknote/core/api/nodeConversions/nodeConversions.ts b/frontend/apps/desktop/src/editor/blocknote/core/api/nodeConversions/nodeConversions.ts similarity index 100% rename from frontend/packages/app/editor/blocknote/core/api/nodeConversions/nodeConversions.ts rename to frontend/apps/desktop/src/editor/blocknote/core/api/nodeConversions/nodeConversions.ts diff --git a/frontend/packages/app/editor/blocknote/core/api/nodeConversions/testUtil.ts b/frontend/apps/desktop/src/editor/blocknote/core/api/nodeConversions/testUtil.ts similarity index 100% rename from frontend/packages/app/editor/blocknote/core/api/nodeConversions/testUtil.ts rename to frontend/apps/desktop/src/editor/blocknote/core/api/nodeConversions/testUtil.ts diff --git a/frontend/packages/app/editor/blocknote/core/api/util/nodeUtil.ts b/frontend/apps/desktop/src/editor/blocknote/core/api/util/nodeUtil.ts similarity index 100% rename from frontend/packages/app/editor/blocknote/core/api/util/nodeUtil.ts rename to frontend/apps/desktop/src/editor/blocknote/core/api/util/nodeUtil.ts diff --git a/frontend/packages/app/editor/blocknote/core/assets/fonts-inter.css b/frontend/apps/desktop/src/editor/blocknote/core/assets/fonts-inter.css similarity index 100% rename from frontend/packages/app/editor/blocknote/core/assets/fonts-inter.css rename to frontend/apps/desktop/src/editor/blocknote/core/assets/fonts-inter.css diff --git a/frontend/packages/app/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-100.woff b/frontend/apps/desktop/src/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-100.woff similarity index 100% rename from frontend/packages/app/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-100.woff rename to frontend/apps/desktop/src/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-100.woff diff --git a/frontend/packages/app/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-100.woff2 b/frontend/apps/desktop/src/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-100.woff2 similarity index 100% rename from frontend/packages/app/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-100.woff2 rename to frontend/apps/desktop/src/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-100.woff2 diff --git a/frontend/packages/app/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-200.woff b/frontend/apps/desktop/src/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-200.woff similarity index 100% rename from frontend/packages/app/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-200.woff rename to frontend/apps/desktop/src/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-200.woff diff --git a/frontend/packages/app/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-200.woff2 b/frontend/apps/desktop/src/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-200.woff2 similarity index 100% rename from frontend/packages/app/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-200.woff2 rename to frontend/apps/desktop/src/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-200.woff2 diff --git a/frontend/packages/app/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-300.woff b/frontend/apps/desktop/src/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-300.woff similarity index 100% rename from frontend/packages/app/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-300.woff rename to frontend/apps/desktop/src/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-300.woff diff --git a/frontend/packages/app/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-300.woff2 b/frontend/apps/desktop/src/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-300.woff2 similarity index 100% rename from frontend/packages/app/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-300.woff2 rename to frontend/apps/desktop/src/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-300.woff2 diff --git a/frontend/packages/app/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-500.woff b/frontend/apps/desktop/src/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-500.woff similarity index 100% rename from frontend/packages/app/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-500.woff rename to frontend/apps/desktop/src/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-500.woff diff --git a/frontend/packages/app/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-500.woff2 b/frontend/apps/desktop/src/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-500.woff2 similarity index 100% rename from frontend/packages/app/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-500.woff2 rename to frontend/apps/desktop/src/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-500.woff2 diff --git a/frontend/packages/app/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-600.woff b/frontend/apps/desktop/src/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-600.woff similarity index 100% rename from frontend/packages/app/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-600.woff rename to frontend/apps/desktop/src/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-600.woff diff --git a/frontend/packages/app/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-600.woff2 b/frontend/apps/desktop/src/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-600.woff2 similarity index 100% rename from frontend/packages/app/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-600.woff2 rename to frontend/apps/desktop/src/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-600.woff2 diff --git a/frontend/packages/app/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-700.woff b/frontend/apps/desktop/src/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-700.woff similarity index 100% rename from frontend/packages/app/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-700.woff rename to frontend/apps/desktop/src/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-700.woff diff --git a/frontend/packages/app/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-700.woff2 b/frontend/apps/desktop/src/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-700.woff2 similarity index 100% rename from frontend/packages/app/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-700.woff2 rename to frontend/apps/desktop/src/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-700.woff2 diff --git a/frontend/packages/app/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-800.woff b/frontend/apps/desktop/src/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-800.woff similarity index 100% rename from frontend/packages/app/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-800.woff rename to frontend/apps/desktop/src/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-800.woff diff --git a/frontend/packages/app/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-800.woff2 b/frontend/apps/desktop/src/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-800.woff2 similarity index 100% rename from frontend/packages/app/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-800.woff2 rename to frontend/apps/desktop/src/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-800.woff2 diff --git a/frontend/packages/app/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-900.woff b/frontend/apps/desktop/src/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-900.woff similarity index 100% rename from frontend/packages/app/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-900.woff rename to frontend/apps/desktop/src/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-900.woff diff --git a/frontend/packages/app/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-900.woff2 b/frontend/apps/desktop/src/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-900.woff2 similarity index 100% rename from frontend/packages/app/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-900.woff2 rename to frontend/apps/desktop/src/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-900.woff2 diff --git a/frontend/packages/app/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-regular.woff b/frontend/apps/desktop/src/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-regular.woff similarity index 100% rename from frontend/packages/app/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-regular.woff rename to frontend/apps/desktop/src/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-regular.woff diff --git a/frontend/packages/app/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-regular.woff2 b/frontend/apps/desktop/src/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-regular.woff2 similarity index 100% rename from frontend/packages/app/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-regular.woff2 rename to frontend/apps/desktop/src/editor/blocknote/core/assets/inter-v12-latin/inter-v12-latin-regular.woff2 diff --git a/frontend/packages/app/editor/blocknote/core/editor.module.css b/frontend/apps/desktop/src/editor/blocknote/core/editor.module.css similarity index 100% rename from frontend/packages/app/editor/blocknote/core/editor.module.css rename to frontend/apps/desktop/src/editor/blocknote/core/editor.module.css diff --git a/frontend/packages/app/editor/blocknote/core/extensions/BackgroundColor/BackgroundColorExtension.ts b/frontend/apps/desktop/src/editor/blocknote/core/extensions/BackgroundColor/BackgroundColorExtension.ts similarity index 100% rename from frontend/packages/app/editor/blocknote/core/extensions/BackgroundColor/BackgroundColorExtension.ts rename to frontend/apps/desktop/src/editor/blocknote/core/extensions/BackgroundColor/BackgroundColorExtension.ts diff --git a/frontend/packages/app/editor/blocknote/core/extensions/BackgroundColor/BackgroundColorMark.ts b/frontend/apps/desktop/src/editor/blocknote/core/extensions/BackgroundColor/BackgroundColorMark.ts similarity index 100% rename from frontend/packages/app/editor/blocknote/core/extensions/BackgroundColor/BackgroundColorMark.ts rename to frontend/apps/desktop/src/editor/blocknote/core/extensions/BackgroundColor/BackgroundColorMark.ts diff --git a/frontend/packages/app/editor/blocknote/core/extensions/BlockManipulation/BlockManipulationExtension.ts b/frontend/apps/desktop/src/editor/blocknote/core/extensions/BlockManipulation/BlockManipulationExtension.ts similarity index 100% rename from frontend/packages/app/editor/blocknote/core/extensions/BlockManipulation/BlockManipulationExtension.ts rename to frontend/apps/desktop/src/editor/blocknote/core/extensions/BlockManipulation/BlockManipulationExtension.ts diff --git a/frontend/packages/app/editor/blocknote/core/extensions/Blocks/PreviousBlockTypePlugin.ts b/frontend/apps/desktop/src/editor/blocknote/core/extensions/Blocks/PreviousBlockTypePlugin.ts similarity index 100% rename from frontend/packages/app/editor/blocknote/core/extensions/Blocks/PreviousBlockTypePlugin.ts rename to frontend/apps/desktop/src/editor/blocknote/core/extensions/Blocks/PreviousBlockTypePlugin.ts diff --git a/frontend/packages/app/editor/blocknote/core/extensions/Blocks/api/block.ts b/frontend/apps/desktop/src/editor/blocknote/core/extensions/Blocks/api/block.ts similarity index 100% rename from frontend/packages/app/editor/blocknote/core/extensions/Blocks/api/block.ts rename to frontend/apps/desktop/src/editor/blocknote/core/extensions/Blocks/api/block.ts diff --git a/frontend/packages/app/editor/blocknote/core/extensions/Blocks/api/blockTypes.ts b/frontend/apps/desktop/src/editor/blocknote/core/extensions/Blocks/api/blockTypes.ts similarity index 100% rename from frontend/packages/app/editor/blocknote/core/extensions/Blocks/api/blockTypes.ts rename to frontend/apps/desktop/src/editor/blocknote/core/extensions/Blocks/api/blockTypes.ts diff --git a/frontend/packages/app/editor/blocknote/core/extensions/Blocks/api/cursorPositionTypes.ts b/frontend/apps/desktop/src/editor/blocknote/core/extensions/Blocks/api/cursorPositionTypes.ts similarity index 100% rename from frontend/packages/app/editor/blocknote/core/extensions/Blocks/api/cursorPositionTypes.ts rename to frontend/apps/desktop/src/editor/blocknote/core/extensions/Blocks/api/cursorPositionTypes.ts diff --git a/frontend/packages/app/editor/blocknote/core/extensions/Blocks/api/defaultBlocks.ts b/frontend/apps/desktop/src/editor/blocknote/core/extensions/Blocks/api/defaultBlocks.ts similarity index 100% rename from frontend/packages/app/editor/blocknote/core/extensions/Blocks/api/defaultBlocks.ts rename to frontend/apps/desktop/src/editor/blocknote/core/extensions/Blocks/api/defaultBlocks.ts diff --git a/frontend/packages/app/editor/blocknote/core/extensions/Blocks/api/inlineContentTypes.ts b/frontend/apps/desktop/src/editor/blocknote/core/extensions/Blocks/api/inlineContentTypes.ts similarity index 100% rename from frontend/packages/app/editor/blocknote/core/extensions/Blocks/api/inlineContentTypes.ts rename to frontend/apps/desktop/src/editor/blocknote/core/extensions/Blocks/api/inlineContentTypes.ts diff --git a/frontend/packages/app/editor/blocknote/core/extensions/Blocks/api/selectionTypes.ts b/frontend/apps/desktop/src/editor/blocknote/core/extensions/Blocks/api/selectionTypes.ts similarity index 100% rename from frontend/packages/app/editor/blocknote/core/extensions/Blocks/api/selectionTypes.ts rename to frontend/apps/desktop/src/editor/blocknote/core/extensions/Blocks/api/selectionTypes.ts diff --git a/frontend/packages/app/editor/blocknote/core/extensions/Blocks/api/serialization.ts b/frontend/apps/desktop/src/editor/blocknote/core/extensions/Blocks/api/serialization.ts similarity index 100% rename from frontend/packages/app/editor/blocknote/core/extensions/Blocks/api/serialization.ts rename to frontend/apps/desktop/src/editor/blocknote/core/extensions/Blocks/api/serialization.ts diff --git a/frontend/packages/app/editor/blocknote/core/extensions/Blocks/helpers/findBlock.ts b/frontend/apps/desktop/src/editor/blocknote/core/extensions/Blocks/helpers/findBlock.ts similarity index 100% rename from frontend/packages/app/editor/blocknote/core/extensions/Blocks/helpers/findBlock.ts rename to frontend/apps/desktop/src/editor/blocknote/core/extensions/Blocks/helpers/findBlock.ts diff --git a/frontend/packages/app/editor/blocknote/core/extensions/Blocks/helpers/getBlockInfoFromPos.ts b/frontend/apps/desktop/src/editor/blocknote/core/extensions/Blocks/helpers/getBlockInfoFromPos.ts similarity index 100% rename from frontend/packages/app/editor/blocknote/core/extensions/Blocks/helpers/getBlockInfoFromPos.ts rename to frontend/apps/desktop/src/editor/blocknote/core/extensions/Blocks/helpers/getBlockInfoFromPos.ts diff --git a/frontend/packages/app/editor/blocknote/core/extensions/Blocks/helpers/getGroupInfoFromPos.ts b/frontend/apps/desktop/src/editor/blocknote/core/extensions/Blocks/helpers/getGroupInfoFromPos.ts similarity index 100% rename from frontend/packages/app/editor/blocknote/core/extensions/Blocks/helpers/getGroupInfoFromPos.ts rename to frontend/apps/desktop/src/editor/blocknote/core/extensions/Blocks/helpers/getGroupInfoFromPos.ts diff --git a/frontend/packages/app/editor/blocknote/core/extensions/Blocks/index.ts b/frontend/apps/desktop/src/editor/blocknote/core/extensions/Blocks/index.ts similarity index 100% rename from frontend/packages/app/editor/blocknote/core/extensions/Blocks/index.ts rename to frontend/apps/desktop/src/editor/blocknote/core/extensions/Blocks/index.ts diff --git a/frontend/packages/app/editor/blocknote/core/extensions/Blocks/nodes/Block.module.css b/frontend/apps/desktop/src/editor/blocknote/core/extensions/Blocks/nodes/Block.module.css similarity index 100% rename from frontend/packages/app/editor/blocknote/core/extensions/Blocks/nodes/Block.module.css rename to frontend/apps/desktop/src/editor/blocknote/core/extensions/Blocks/nodes/Block.module.css diff --git a/frontend/packages/app/editor/blocknote/core/extensions/Blocks/nodes/BlockAttributes.ts b/frontend/apps/desktop/src/editor/blocknote/core/extensions/Blocks/nodes/BlockAttributes.ts similarity index 100% rename from frontend/packages/app/editor/blocknote/core/extensions/Blocks/nodes/BlockAttributes.ts rename to frontend/apps/desktop/src/editor/blocknote/core/extensions/Blocks/nodes/BlockAttributes.ts diff --git a/frontend/packages/app/editor/blocknote/core/extensions/Blocks/nodes/BlockContainer.ts b/frontend/apps/desktop/src/editor/blocknote/core/extensions/Blocks/nodes/BlockContainer.ts similarity index 100% rename from frontend/packages/app/editor/blocknote/core/extensions/Blocks/nodes/BlockContainer.ts rename to frontend/apps/desktop/src/editor/blocknote/core/extensions/Blocks/nodes/BlockContainer.ts diff --git a/frontend/packages/app/editor/blocknote/core/extensions/Blocks/nodes/BlockContent/HeadingBlockContent/HeadingBlockContent.ts b/frontend/apps/desktop/src/editor/blocknote/core/extensions/Blocks/nodes/BlockContent/HeadingBlockContent/HeadingBlockContent.ts similarity index 100% rename from frontend/packages/app/editor/blocknote/core/extensions/Blocks/nodes/BlockContent/HeadingBlockContent/HeadingBlockContent.ts rename to frontend/apps/desktop/src/editor/blocknote/core/extensions/Blocks/nodes/BlockContent/HeadingBlockContent/HeadingBlockContent.ts diff --git a/frontend/packages/app/editor/blocknote/core/extensions/Blocks/nodes/BlockContent/ListItemBlockContent/BulletListItemBlockContent/BulletListItemBlockContent.ts b/frontend/apps/desktop/src/editor/blocknote/core/extensions/Blocks/nodes/BlockContent/ListItemBlockContent/BulletListItemBlockContent/BulletListItemBlockContent.ts similarity index 100% rename from frontend/packages/app/editor/blocknote/core/extensions/Blocks/nodes/BlockContent/ListItemBlockContent/BulletListItemBlockContent/BulletListItemBlockContent.ts rename to frontend/apps/desktop/src/editor/blocknote/core/extensions/Blocks/nodes/BlockContent/ListItemBlockContent/BulletListItemBlockContent/BulletListItemBlockContent.ts diff --git a/frontend/packages/app/editor/blocknote/core/extensions/Blocks/nodes/BlockContent/ListItemBlockContent/ListItemKeyboardShortcuts.ts b/frontend/apps/desktop/src/editor/blocknote/core/extensions/Blocks/nodes/BlockContent/ListItemBlockContent/ListItemKeyboardShortcuts.ts similarity index 100% rename from frontend/packages/app/editor/blocknote/core/extensions/Blocks/nodes/BlockContent/ListItemBlockContent/ListItemKeyboardShortcuts.ts rename to frontend/apps/desktop/src/editor/blocknote/core/extensions/Blocks/nodes/BlockContent/ListItemBlockContent/ListItemKeyboardShortcuts.ts diff --git a/frontend/packages/app/editor/blocknote/core/extensions/Blocks/nodes/BlockContent/ListItemBlockContent/NumberedListItemBlockContent/NumberedListIndexingPlugin.ts b/frontend/apps/desktop/src/editor/blocknote/core/extensions/Blocks/nodes/BlockContent/ListItemBlockContent/NumberedListItemBlockContent/NumberedListIndexingPlugin.ts similarity index 100% rename from frontend/packages/app/editor/blocknote/core/extensions/Blocks/nodes/BlockContent/ListItemBlockContent/NumberedListItemBlockContent/NumberedListIndexingPlugin.ts rename to frontend/apps/desktop/src/editor/blocknote/core/extensions/Blocks/nodes/BlockContent/ListItemBlockContent/NumberedListItemBlockContent/NumberedListIndexingPlugin.ts diff --git a/frontend/packages/app/editor/blocknote/core/extensions/Blocks/nodes/BlockContent/ListItemBlockContent/NumberedListItemBlockContent/NumberedListItemBlockContent.ts b/frontend/apps/desktop/src/editor/blocknote/core/extensions/Blocks/nodes/BlockContent/ListItemBlockContent/NumberedListItemBlockContent/NumberedListItemBlockContent.ts similarity index 100% rename from frontend/packages/app/editor/blocknote/core/extensions/Blocks/nodes/BlockContent/ListItemBlockContent/NumberedListItemBlockContent/NumberedListItemBlockContent.ts rename to frontend/apps/desktop/src/editor/blocknote/core/extensions/Blocks/nodes/BlockContent/ListItemBlockContent/NumberedListItemBlockContent/NumberedListItemBlockContent.ts diff --git a/frontend/packages/app/editor/blocknote/core/extensions/Blocks/nodes/BlockContent/ParagraphBlockContent/ParagraphBlockContent.ts b/frontend/apps/desktop/src/editor/blocknote/core/extensions/Blocks/nodes/BlockContent/ParagraphBlockContent/ParagraphBlockContent.ts similarity index 100% rename from frontend/packages/app/editor/blocknote/core/extensions/Blocks/nodes/BlockContent/ParagraphBlockContent/ParagraphBlockContent.ts rename to frontend/apps/desktop/src/editor/blocknote/core/extensions/Blocks/nodes/BlockContent/ParagraphBlockContent/ParagraphBlockContent.ts diff --git a/frontend/packages/app/editor/blocknote/core/extensions/Blocks/nodes/BlockGroup.ts b/frontend/apps/desktop/src/editor/blocknote/core/extensions/Blocks/nodes/BlockGroup.ts similarity index 100% rename from frontend/packages/app/editor/blocknote/core/extensions/Blocks/nodes/BlockGroup.ts rename to frontend/apps/desktop/src/editor/blocknote/core/extensions/Blocks/nodes/BlockGroup.ts diff --git a/frontend/packages/app/editor/blocknote/core/extensions/DragMedia/DragExtension.ts b/frontend/apps/desktop/src/editor/blocknote/core/extensions/DragMedia/DragExtension.ts similarity index 100% rename from frontend/packages/app/editor/blocknote/core/extensions/DragMedia/DragExtension.ts rename to frontend/apps/desktop/src/editor/blocknote/core/extensions/DragMedia/DragExtension.ts diff --git a/frontend/packages/app/editor/blocknote/core/extensions/DraggableBlocks/BlockSideMenuFactoryTypes.ts b/frontend/apps/desktop/src/editor/blocknote/core/extensions/DraggableBlocks/BlockSideMenuFactoryTypes.ts similarity index 100% rename from frontend/packages/app/editor/blocknote/core/extensions/DraggableBlocks/BlockSideMenuFactoryTypes.ts rename to frontend/apps/desktop/src/editor/blocknote/core/extensions/DraggableBlocks/BlockSideMenuFactoryTypes.ts diff --git a/frontend/packages/app/editor/blocknote/core/extensions/DraggableBlocks/DraggableBlocksExtension.ts b/frontend/apps/desktop/src/editor/blocknote/core/extensions/DraggableBlocks/DraggableBlocksExtension.ts similarity index 100% rename from frontend/packages/app/editor/blocknote/core/extensions/DraggableBlocks/DraggableBlocksExtension.ts rename to frontend/apps/desktop/src/editor/blocknote/core/extensions/DraggableBlocks/DraggableBlocksExtension.ts diff --git a/frontend/packages/app/editor/blocknote/core/extensions/DraggableBlocks/DraggableBlocksPlugin.ts b/frontend/apps/desktop/src/editor/blocknote/core/extensions/DraggableBlocks/DraggableBlocksPlugin.ts similarity index 100% rename from frontend/packages/app/editor/blocknote/core/extensions/DraggableBlocks/DraggableBlocksPlugin.ts rename to frontend/apps/desktop/src/editor/blocknote/core/extensions/DraggableBlocks/DraggableBlocksPlugin.ts diff --git a/frontend/packages/app/editor/blocknote/core/extensions/DraggableBlocks/MultipleNodeSelection.ts b/frontend/apps/desktop/src/editor/blocknote/core/extensions/DraggableBlocks/MultipleNodeSelection.ts similarity index 100% rename from frontend/packages/app/editor/blocknote/core/extensions/DraggableBlocks/MultipleNodeSelection.ts rename to frontend/apps/desktop/src/editor/blocknote/core/extensions/DraggableBlocks/MultipleNodeSelection.ts diff --git a/frontend/packages/app/editor/blocknote/core/extensions/FormattingToolbar/FormattingToolbarPlugin.ts b/frontend/apps/desktop/src/editor/blocknote/core/extensions/FormattingToolbar/FormattingToolbarPlugin.ts similarity index 100% rename from frontend/packages/app/editor/blocknote/core/extensions/FormattingToolbar/FormattingToolbarPlugin.ts rename to frontend/apps/desktop/src/editor/blocknote/core/extensions/FormattingToolbar/FormattingToolbarPlugin.ts diff --git a/frontend/packages/app/editor/blocknote/core/extensions/HyperlinkToolbar/HyperlinkToolbarPlugin.ts b/frontend/apps/desktop/src/editor/blocknote/core/extensions/HyperlinkToolbar/HyperlinkToolbarPlugin.ts similarity index 100% rename from frontend/packages/app/editor/blocknote/core/extensions/HyperlinkToolbar/HyperlinkToolbarPlugin.ts rename to frontend/apps/desktop/src/editor/blocknote/core/extensions/HyperlinkToolbar/HyperlinkToolbarPlugin.ts diff --git a/frontend/packages/app/editor/blocknote/core/extensions/LinkMenu/LinkMenuItem.ts b/frontend/apps/desktop/src/editor/blocknote/core/extensions/LinkMenu/LinkMenuItem.ts similarity index 100% rename from frontend/packages/app/editor/blocknote/core/extensions/LinkMenu/LinkMenuItem.ts rename to frontend/apps/desktop/src/editor/blocknote/core/extensions/LinkMenu/LinkMenuItem.ts diff --git a/frontend/packages/app/editor/blocknote/core/extensions/LinkMenu/LinkMenuPlugin.ts b/frontend/apps/desktop/src/editor/blocknote/core/extensions/LinkMenu/LinkMenuPlugin.ts similarity index 100% rename from frontend/packages/app/editor/blocknote/core/extensions/LinkMenu/LinkMenuPlugin.ts rename to frontend/apps/desktop/src/editor/blocknote/core/extensions/LinkMenu/LinkMenuPlugin.ts diff --git a/frontend/packages/app/editor/blocknote/core/extensions/LinkMenu/defaultLinkMenuItems.tsx b/frontend/apps/desktop/src/editor/blocknote/core/extensions/LinkMenu/defaultLinkMenuItems.tsx similarity index 85% rename from frontend/packages/app/editor/blocknote/core/extensions/LinkMenu/defaultLinkMenuItems.tsx rename to frontend/apps/desktop/src/editor/blocknote/core/extensions/LinkMenu/defaultLinkMenuItems.tsx index 68a51f966d..f5bc913994 100644 --- a/frontend/packages/app/editor/blocknote/core/extensions/LinkMenu/defaultLinkMenuItems.tsx +++ b/frontend/apps/desktop/src/editor/blocknote/core/extensions/LinkMenu/defaultLinkMenuItems.tsx @@ -1,4 +1,4 @@ -import {youtubeParser} from '@shm/app/editor/utils' +import { youtubeParser } from '@shm/desktop/src/editor/utils' import { HYPERMEDIA_ENTITY_TYPES, StateStream, @@ -7,11 +7,11 @@ import { isPublicGatewayLink, normalizeHmId, } from '@shm/shared' -import {Globe, Link, Spinner, SquareAsterisk, TwitterXIcon} from '@shm/ui' -import {Node} from '@tiptap/pm/model' -import {BlockNoteEditor} from '../../BlockNoteEditor' -import {getBlockInfoFromPos} from '../Blocks/helpers/getBlockInfoFromPos' -import {LinkMenuItem} from './LinkMenuItem' +import { Globe, Link, Spinner, SquareAsterisk, TwitterXIcon } from '@shm/ui' +import { Node } from '@tiptap/pm/model' +import { BlockNoteEditor } from '../../BlockNoteEditor' +import { getBlockInfoFromPos } from '../Blocks/helpers/getBlockInfoFromPos' +import { LinkMenuItem } from './LinkMenuItem' export function getLinkMenuItems({ isLoading, @@ -39,8 +39,8 @@ export function getLinkMenuItems({ disabled: false, icon: , execute: (editor: BlockNoteEditor, ref: string) => { - const {state, schema, view} = editor._tiptapEditor - const {selection} = state + const { state, schema, view } = editor._tiptapEditor + const { selection } = state const pos = selection.from - docTitle!.length view.dispatch( view.state.tr @@ -65,7 +65,7 @@ export function getLinkMenuItems({ name: 'Checking link...', icon: , disabled: true, - execute: (editor, ref) => {}, + execute: (editor, ref) => { }, } linkMenuItems = [loadingItem, ...linkMenuItems] @@ -76,11 +76,10 @@ export function getLinkMenuItems({ linkMenuItems = [ { - name: `Insert Card of ${ - docTitle + name: `Insert Card of ${docTitle ? '"' + docTitle + '"' : HYPERMEDIA_ENTITY_TYPES[hmId.type] - }`, + }`, disabled: false, icon: , execute: (editor: BlockNoteEditor, ref: string) => { @@ -89,8 +88,8 @@ export function getLinkMenuItems({ if (!hmId) return ref = hmId } - const {state, schema} = editor._tiptapEditor - const {selection} = state + const { state, schema } = editor._tiptapEditor + const { selection } = state if (!selection.empty) return const node = schema.nodes.embed.create( { @@ -110,11 +109,10 @@ export function getLinkMenuItems({ if (hmId.type) { linkMenuItems = [ { - name: `Embed ${HYPERMEDIA_ENTITY_TYPES[hmId.type]} ${ - docTitle + name: `Embed ${HYPERMEDIA_ENTITY_TYPES[hmId.type]} ${docTitle ? '"' + docTitle + '"' : HYPERMEDIA_ENTITY_TYPES[hmId.type] - }`, + }`, disabled: false, icon: , execute: (editor: BlockNoteEditor, ref: string) => { @@ -123,8 +121,8 @@ export function getLinkMenuItems({ if (!hmId) return ref = hmId } - const {state, schema} = editor._tiptapEditor - const {selection} = state + const { state, schema } = editor._tiptapEditor + const { selection } = state if (!selection.empty) return const node = schema.nodes.embed.create( { @@ -161,8 +159,8 @@ export function getLinkMenuItems({ if (!hmId) return ref = hmId } - const {state, schema} = editor._tiptapEditor - const {selection} = state + const { state, schema } = editor._tiptapEditor + const { selection } = state if (!selection.empty) return const node = schema.nodes['inline-embed'].create( { @@ -179,19 +177,18 @@ export function getLinkMenuItems({ } } else if (media) { const mediaItem = { - name: `Convert to ${ - media === 'twitter' + name: `Convert to ${media === 'twitter' ? 'X Post embed' : media.charAt(0).toUpperCase() + media.slice(1) - }`, + }`, disabled: false, icon: media === 'twitter' ? ( ) : undefined, execute: (editor: BlockNoteEditor, ref: string) => { - const {state, schema} = editor._tiptapEditor - const {selection} = state + const { state, schema } = editor._tiptapEditor + const { selection } = state if (!selection.empty) return let embedUrl = '' if (media === 'video') { @@ -214,13 +211,13 @@ export function getLinkMenuItems({ const node = media !== 'twitter' ? schema.nodes[media].create({ - url: embedUrl ? embedUrl : '', - src: embedUrl ? '' : ref, - name: fileName ? fileName : '', - }) + url: embedUrl ? embedUrl : '', + src: embedUrl ? '' : ref, + name: fileName ? fileName : '', + }) : schema.nodes['web-embed'].create({ - url: ref, - }) + url: ref, + }) insertNode(editor, sourceUrl ? sourceUrl : ref, node) }, @@ -234,9 +231,9 @@ export function getLinkMenuItems({ } function insertNode(editor: BlockNoteEditor, ref: string, node: Node) { - const {state, schema, view} = editor._tiptapEditor - const {doc, selection} = state - const {$from} = selection + const { state, schema, view } = editor._tiptapEditor + const { doc, selection } = state + const { $from } = selection const block = getBlockInfoFromPos(doc, selection.$anchor.pos) let tr = state.tr @@ -284,9 +281,9 @@ function insertMentionNode( title: string, node: Node, ) { - const {state, schema, view} = editor._tiptapEditor - const {doc, selection} = state - const {$from} = selection + const { state, schema, view } = editor._tiptapEditor + const { doc, selection } = state + const { $from } = selection const block = getBlockInfoFromPos(doc, selection.$anchor.pos) let tr = state.tr @@ -330,8 +327,8 @@ function insertMentionNode( } function findClosestLinkRangeBefore(state) { - const {doc, selection} = state - const {from} = selection + const { doc, selection } = state + const { from } = selection let closestLinkRange = null // Iterate over the nodes in reverse order from the current selection position @@ -347,7 +344,7 @@ function findClosestLinkRangeBefore(state) { !closestLinkRange || Math.abs(linkStart - from) < Math.abs(closestLinkRange.from - from) ) { - closestLinkRange = {from: linkStart, to: linkEnd} + closestLinkRange = { from: linkStart, to: linkEnd } } } }) diff --git a/frontend/packages/app/editor/blocknote/core/extensions/Markdown/MarkdownExtension.ts b/frontend/apps/desktop/src/editor/blocknote/core/extensions/Markdown/MarkdownExtension.ts similarity index 100% rename from frontend/packages/app/editor/blocknote/core/extensions/Markdown/MarkdownExtension.ts rename to frontend/apps/desktop/src/editor/blocknote/core/extensions/Markdown/MarkdownExtension.ts diff --git a/frontend/packages/app/editor/blocknote/core/extensions/Placeholder/PlaceholderExtension.ts b/frontend/apps/desktop/src/editor/blocknote/core/extensions/Placeholder/PlaceholderExtension.ts similarity index 100% rename from frontend/packages/app/editor/blocknote/core/extensions/Placeholder/PlaceholderExtension.ts rename to frontend/apps/desktop/src/editor/blocknote/core/extensions/Placeholder/PlaceholderExtension.ts diff --git a/frontend/packages/app/editor/blocknote/core/extensions/SideMenu/MultipleNodeSelection.ts b/frontend/apps/desktop/src/editor/blocknote/core/extensions/SideMenu/MultipleNodeSelection.ts similarity index 100% rename from frontend/packages/app/editor/blocknote/core/extensions/SideMenu/MultipleNodeSelection.ts rename to frontend/apps/desktop/src/editor/blocknote/core/extensions/SideMenu/MultipleNodeSelection.ts diff --git a/frontend/packages/app/editor/blocknote/core/extensions/SideMenu/SideMenuPlugin.ts b/frontend/apps/desktop/src/editor/blocknote/core/extensions/SideMenu/SideMenuPlugin.ts similarity index 100% rename from frontend/packages/app/editor/blocknote/core/extensions/SideMenu/SideMenuPlugin.ts rename to frontend/apps/desktop/src/editor/blocknote/core/extensions/SideMenu/SideMenuPlugin.ts diff --git a/frontend/packages/app/editor/blocknote/core/extensions/SlashMenu/BaseSlashMenuItem.ts b/frontend/apps/desktop/src/editor/blocknote/core/extensions/SlashMenu/BaseSlashMenuItem.ts similarity index 100% rename from frontend/packages/app/editor/blocknote/core/extensions/SlashMenu/BaseSlashMenuItem.ts rename to frontend/apps/desktop/src/editor/blocknote/core/extensions/SlashMenu/BaseSlashMenuItem.ts diff --git a/frontend/packages/app/editor/blocknote/core/extensions/SlashMenu/SlashMenuPlugin.ts b/frontend/apps/desktop/src/editor/blocknote/core/extensions/SlashMenu/SlashMenuPlugin.ts similarity index 100% rename from frontend/packages/app/editor/blocknote/core/extensions/SlashMenu/SlashMenuPlugin.ts rename to frontend/apps/desktop/src/editor/blocknote/core/extensions/SlashMenu/SlashMenuPlugin.ts diff --git a/frontend/packages/app/editor/blocknote/core/extensions/SlashMenu/defaultSlashMenuItems.ts b/frontend/apps/desktop/src/editor/blocknote/core/extensions/SlashMenu/defaultSlashMenuItems.ts similarity index 100% rename from frontend/packages/app/editor/blocknote/core/extensions/SlashMenu/defaultSlashMenuItems.ts rename to frontend/apps/desktop/src/editor/blocknote/core/extensions/SlashMenu/defaultSlashMenuItems.ts diff --git a/frontend/packages/app/editor/blocknote/core/extensions/TextAlignment/TextAlignmentExtension.ts b/frontend/apps/desktop/src/editor/blocknote/core/extensions/TextAlignment/TextAlignmentExtension.ts similarity index 100% rename from frontend/packages/app/editor/blocknote/core/extensions/TextAlignment/TextAlignmentExtension.ts rename to frontend/apps/desktop/src/editor/blocknote/core/extensions/TextAlignment/TextAlignmentExtension.ts diff --git a/frontend/packages/app/editor/blocknote/core/extensions/TextColor/TextColorExtension.ts b/frontend/apps/desktop/src/editor/blocknote/core/extensions/TextColor/TextColorExtension.ts similarity index 100% rename from frontend/packages/app/editor/blocknote/core/extensions/TextColor/TextColorExtension.ts rename to frontend/apps/desktop/src/editor/blocknote/core/extensions/TextColor/TextColorExtension.ts diff --git a/frontend/packages/app/editor/blocknote/core/extensions/TextColor/TextColorMark.ts b/frontend/apps/desktop/src/editor/blocknote/core/extensions/TextColor/TextColorMark.ts similarity index 100% rename from frontend/packages/app/editor/blocknote/core/extensions/TextColor/TextColorMark.ts rename to frontend/apps/desktop/src/editor/blocknote/core/extensions/TextColor/TextColorMark.ts diff --git a/frontend/packages/app/editor/blocknote/core/extensions/TrailingNode/TrailingNodeExtension.ts b/frontend/apps/desktop/src/editor/blocknote/core/extensions/TrailingNode/TrailingNodeExtension.ts similarity index 100% rename from frontend/packages/app/editor/blocknote/core/extensions/TrailingNode/TrailingNodeExtension.ts rename to frontend/apps/desktop/src/editor/blocknote/core/extensions/TrailingNode/TrailingNodeExtension.ts diff --git a/frontend/packages/app/editor/blocknote/core/extensions/UniqueID/UniqueID.ts b/frontend/apps/desktop/src/editor/blocknote/core/extensions/UniqueID/UniqueID.ts similarity index 100% rename from frontend/packages/app/editor/blocknote/core/extensions/UniqueID/UniqueID.ts rename to frontend/apps/desktop/src/editor/blocknote/core/extensions/UniqueID/UniqueID.ts diff --git a/frontend/packages/app/editor/blocknote/core/index.ts b/frontend/apps/desktop/src/editor/blocknote/core/index.ts similarity index 100% rename from frontend/packages/app/editor/blocknote/core/index.ts rename to frontend/apps/desktop/src/editor/blocknote/core/index.ts diff --git a/frontend/packages/app/editor/blocknote/core/shared/BaseUiElementTypes.ts b/frontend/apps/desktop/src/editor/blocknote/core/shared/BaseUiElementTypes.ts similarity index 100% rename from frontend/packages/app/editor/blocknote/core/shared/BaseUiElementTypes.ts rename to frontend/apps/desktop/src/editor/blocknote/core/shared/BaseUiElementTypes.ts diff --git a/frontend/packages/app/editor/blocknote/core/shared/EditorElement.ts b/frontend/apps/desktop/src/editor/blocknote/core/shared/EditorElement.ts similarity index 100% rename from frontend/packages/app/editor/blocknote/core/shared/EditorElement.ts rename to frontend/apps/desktop/src/editor/blocknote/core/shared/EditorElement.ts diff --git a/frontend/packages/app/editor/blocknote/core/shared/EventEmitter.ts b/frontend/apps/desktop/src/editor/blocknote/core/shared/EventEmitter.ts similarity index 100% rename from frontend/packages/app/editor/blocknote/core/shared/EventEmitter.ts rename to frontend/apps/desktop/src/editor/blocknote/core/shared/EventEmitter.ts diff --git a/frontend/packages/app/editor/blocknote/core/shared/plugins/suggestion/SuggestionItem.ts b/frontend/apps/desktop/src/editor/blocknote/core/shared/plugins/suggestion/SuggestionItem.ts similarity index 100% rename from frontend/packages/app/editor/blocknote/core/shared/plugins/suggestion/SuggestionItem.ts rename to frontend/apps/desktop/src/editor/blocknote/core/shared/plugins/suggestion/SuggestionItem.ts diff --git a/frontend/packages/app/editor/blocknote/core/shared/plugins/suggestion/SuggestionPlugin.ts b/frontend/apps/desktop/src/editor/blocknote/core/shared/plugins/suggestion/SuggestionPlugin.ts similarity index 100% rename from frontend/packages/app/editor/blocknote/core/shared/plugins/suggestion/SuggestionPlugin.ts rename to frontend/apps/desktop/src/editor/blocknote/core/shared/plugins/suggestion/SuggestionPlugin.ts diff --git a/frontend/packages/app/editor/blocknote/core/shared/utils.ts b/frontend/apps/desktop/src/editor/blocknote/core/shared/utils.ts similarity index 100% rename from frontend/packages/app/editor/blocknote/core/shared/utils.ts rename to frontend/apps/desktop/src/editor/blocknote/core/shared/utils.ts diff --git a/frontend/packages/app/editor/blocknote/core/style.css b/frontend/apps/desktop/src/editor/blocknote/core/style.css similarity index 100% rename from frontend/packages/app/editor/blocknote/core/style.css rename to frontend/apps/desktop/src/editor/blocknote/core/style.css diff --git a/frontend/packages/app/editor/blocknote/index.ts b/frontend/apps/desktop/src/editor/blocknote/index.ts similarity index 100% rename from frontend/packages/app/editor/blocknote/index.ts rename to frontend/apps/desktop/src/editor/blocknote/index.ts diff --git a/frontend/packages/app/editor/blocknote/react/BlockNoteTheme.ts b/frontend/apps/desktop/src/editor/blocknote/react/BlockNoteTheme.ts similarity index 99% rename from frontend/packages/app/editor/blocknote/react/BlockNoteTheme.ts rename to frontend/apps/desktop/src/editor/blocknote/react/BlockNoteTheme.ts index e7ba627165..cc2a42165c 100644 --- a/frontend/packages/app/editor/blocknote/react/BlockNoteTheme.ts +++ b/frontend/apps/desktop/src/editor/blocknote/react/BlockNoteTheme.ts @@ -1,5 +1,5 @@ import {CSSObject, MantineThemeOverride} from '@mantine/core' -import {bnBlockStyles} from '@shm/app/editor/blocknote/core' +import {bnBlockStyles} from '@shm/desktop/src/editor/blocknote/core' import _ from 'lodash' export type CombinedColor = { diff --git a/frontend/packages/app/editor/blocknote/react/BlockNoteView.tsx b/frontend/apps/desktop/src/editor/blocknote/react/BlockNoteView.tsx similarity index 59% rename from frontend/packages/app/editor/blocknote/react/BlockNoteView.tsx rename to frontend/apps/desktop/src/editor/blocknote/react/BlockNoteView.tsx index ae523e0241..38365ed688 100644 --- a/frontend/packages/app/editor/blocknote/react/BlockNoteView.tsx +++ b/frontend/apps/desktop/src/editor/blocknote/react/BlockNoteView.tsx @@ -1,19 +1,19 @@ -import {MantineProvider, createStyles} from '@mantine/core' +import { MantineProvider, createStyles } from '@mantine/core' import { BlockNoteEditor, BlockSchema, mergeCSSClasses, -} from '@shm/app/editor/blocknote/core' -import {EditorContent} from '@tiptap/react' -import {HTMLAttributes, ReactNode, useMemo} from 'react' -import {usePrefersColorScheme} from 'use-prefers-color-scheme' -import {Theme, blockNoteToMantineTheme} from './BlockNoteTheme' -import {darkDefaultTheme, lightDefaultTheme} from './defaultThemes' -import {FormattingToolbarPositioner} from './FormattingToolbar/components/FormattingToolbarPositioner' -import {HyperlinkToolbarPositioner} from './HyperlinkToolbar/components/HyperlinkToolbarPositioner' -import {LinkMenuPositioner} from './LinkMenu/components/LinkMenuPositioner' -import {SideMenuPositioner} from './SideMenu/components/SideMenuPositioner' -import {SlashMenuPositioner} from './SlashMenu/components/SlashMenuPositioner' +} from '@shm/desktop/src/editor/blocknote/core' +import { EditorContent } from '@tiptap/react' +import { HTMLAttributes, ReactNode, useMemo } from 'react' +import { usePrefersColorScheme } from 'use-prefers-color-scheme' +import { Theme, blockNoteToMantineTheme } from './BlockNoteTheme' +import { darkDefaultTheme, lightDefaultTheme } from './defaultThemes' +import { FormattingToolbarPositioner } from './FormattingToolbar/components/FormattingToolbarPositioner' +import { HyperlinkToolbarPositioner } from './HyperlinkToolbar/components/HyperlinkToolbarPositioner' +import { LinkMenuPositioner } from './LinkMenu/components/LinkMenuPositioner' +import { SideMenuPositioner } from './SideMenu/components/SideMenuPositioner' +import { SlashMenuPositioner } from './SlashMenu/components/SlashMenuPositioner' // Renders the editor as well as all menus & toolbars using default styles. function BaseBlockNoteView( @@ -22,11 +22,11 @@ function BaseBlockNoteView( children?: ReactNode } & HTMLAttributes, ) { - const {classes} = createStyles({root: {}})(undefined, { + const { classes } = createStyles({ root: {} })(undefined, { name: 'Editor', }) - const {editor, children, className, ...rest} = props + const { editor, children, className, ...rest } = props return ( ( props: { editor: BlockNoteEditor theme?: - | 'light' - | 'dark' - | Theme - | { - light: Theme - dark: Theme - } + | 'light' + | 'dark' + | Theme + | { + light: Theme + dark: Theme + } children?: ReactNode } & HTMLAttributes, ) { - const {theme = {light: lightDefaultTheme, dark: darkDefaultTheme}, ...rest} = + const { theme = { light: lightDefaultTheme, dark: darkDefaultTheme }, ...rest } = props const preferredTheme = usePrefersColorScheme() diff --git a/frontend/packages/app/editor/blocknote/react/Editor/EditorContent.tsx b/frontend/apps/desktop/src/editor/blocknote/react/Editor/EditorContent.tsx similarity index 100% rename from frontend/packages/app/editor/blocknote/react/Editor/EditorContent.tsx rename to frontend/apps/desktop/src/editor/blocknote/react/Editor/EditorContent.tsx diff --git a/frontend/packages/app/editor/blocknote/react/FormattingToolbar/components/DefaultButtons/ColorStyleButton.tsx b/frontend/apps/desktop/src/editor/blocknote/react/FormattingToolbar/components/DefaultButtons/ColorStyleButton.tsx similarity index 67% rename from frontend/packages/app/editor/blocknote/react/FormattingToolbar/components/DefaultButtons/ColorStyleButton.tsx rename to frontend/apps/desktop/src/editor/blocknote/react/FormattingToolbar/components/DefaultButtons/ColorStyleButton.tsx index e299f79f20..5447eb2fa9 100644 --- a/frontend/packages/app/editor/blocknote/react/FormattingToolbar/components/DefaultButtons/ColorStyleButton.tsx +++ b/frontend/apps/desktop/src/editor/blocknote/react/FormattingToolbar/components/DefaultButtons/ColorStyleButton.tsx @@ -1,11 +1,11 @@ -import {Menu} from '@mantine/core' -import {BlockNoteEditor, BlockSchema} from '@shm/app/editor/blocknote/core' -import {useCallback, useState} from 'react' -import {ColorIcon} from '../../../SharedComponents/ColorPicker/components/ColorIcon' -import {ColorPicker} from '../../../SharedComponents/ColorPicker/components/ColorPicker' -import {ToolbarButton} from '../../../SharedComponents/Toolbar/components/ToolbarButton' -import {useEditorContentChange} from '../../../hooks/useEditorContentChange' -import {useEditorSelectionChange} from '../../../hooks/useEditorSelectionChange' +import { Menu } from '@mantine/core' +import { BlockNoteEditor, BlockSchema } from '@shm/desktop/src/editor/blocknote/core' +import { useCallback, useState } from 'react' +import { ColorIcon } from '../../../SharedComponents/ColorPicker/components/ColorIcon' +import { ColorPicker } from '../../../SharedComponents/ColorPicker/components/ColorPicker' +import { ToolbarButton } from '../../../SharedComponents/Toolbar/components/ToolbarButton' +import { useEditorContentChange } from '../../../hooks/useEditorContentChange' +import { useEditorSelectionChange } from '../../../hooks/useEditorSelectionChange' export const ColorStyleButton = (props: { editor: BlockNoteEditor @@ -35,8 +35,8 @@ export const ColorStyleButton = (props: { (color: string) => { props.editor.focus() color === 'default' - ? props.editor.removeStyles({textColor: color}) - : props.editor.addStyles({textColor: color}) + ? props.editor.removeStyles({ textColor: color }) + : props.editor.addStyles({ textColor: color }) }, [props.editor], ) @@ -45,8 +45,8 @@ export const ColorStyleButton = (props: { (color: string) => { props.editor.focus() color === 'default' - ? props.editor.removeStyles({backgroundColor: color}) - : props.editor.addStyles({backgroundColor: color}) + ? props.editor.removeStyles({ backgroundColor: color }) + : props.editor.addStyles({ backgroundColor: color }) }, [props.editor], ) diff --git a/frontend/packages/app/editor/blocknote/react/FormattingToolbar/components/DefaultButtons/CreateLinkButton.tsx b/frontend/apps/desktop/src/editor/blocknote/react/FormattingToolbar/components/DefaultButtons/CreateLinkButton.tsx similarity index 79% rename from frontend/packages/app/editor/blocknote/react/FormattingToolbar/components/DefaultButtons/CreateLinkButton.tsx rename to frontend/apps/desktop/src/editor/blocknote/react/FormattingToolbar/components/DefaultButtons/CreateLinkButton.tsx index 8b5b6268fa..c7eae9919d 100644 --- a/frontend/packages/app/editor/blocknote/react/FormattingToolbar/components/DefaultButtons/CreateLinkButton.tsx +++ b/frontend/apps/desktop/src/editor/blocknote/react/FormattingToolbar/components/DefaultButtons/CreateLinkButton.tsx @@ -1,7 +1,7 @@ -import {BlockNoteEditor, BlockSchema} from '@shm/app/editor/blocknote/core' -import {useCallback, useState} from 'react' -import {RiLink} from 'react-icons/ri' -import {useEditorSelectionChange} from '../../../hooks/useEditorSelectionChange' +import { BlockNoteEditor, BlockSchema } from '@shm/desktop/src/editor/blocknote/core' +import { useCallback, useState } from 'react' +import { RiLink } from 'react-icons/ri' +import { useEditorSelectionChange } from '../../../hooks/useEditorSelectionChange' import LinkToolbarButton from '../LinkToolbarButton' export const CreateLinkButton = (props: { diff --git a/frontend/packages/app/editor/blocknote/react/FormattingToolbar/components/DefaultButtons/NestBlockButtons.tsx b/frontend/apps/desktop/src/editor/blocknote/react/FormattingToolbar/components/DefaultButtons/NestBlockButtons.tsx similarity index 74% rename from frontend/packages/app/editor/blocknote/react/FormattingToolbar/components/DefaultButtons/NestBlockButtons.tsx rename to frontend/apps/desktop/src/editor/blocknote/react/FormattingToolbar/components/DefaultButtons/NestBlockButtons.tsx index fc2cc98795..fa79766604 100644 --- a/frontend/packages/app/editor/blocknote/react/FormattingToolbar/components/DefaultButtons/NestBlockButtons.tsx +++ b/frontend/apps/desktop/src/editor/blocknote/react/FormattingToolbar/components/DefaultButtons/NestBlockButtons.tsx @@ -1,10 +1,10 @@ -import {BlockNoteEditor, BlockSchema} from '@shm/app/editor/blocknote/core' -import {useCallback, useState} from 'react' -import {RiIndentDecrease, RiIndentIncrease} from 'react-icons/ri' -import {ToolbarButton} from '../../../SharedComponents/Toolbar/components/ToolbarButton' -import {useEditorContentChange} from '../../../hooks/useEditorContentChange' -import {useEditorSelectionChange} from '../../../hooks/useEditorSelectionChange' -import {formatKeyboardShortcut} from '../../../utils' +import { BlockNoteEditor, BlockSchema } from '@shm/desktop/src/editor/blocknote/core' +import { useCallback, useState } from 'react' +import { RiIndentDecrease, RiIndentIncrease } from 'react-icons/ri' +import { ToolbarButton } from '../../../SharedComponents/Toolbar/components/ToolbarButton' +import { useEditorContentChange } from '../../../hooks/useEditorContentChange' +import { useEditorSelectionChange } from '../../../hooks/useEditorSelectionChange' +import { formatKeyboardShortcut } from '../../../utils' export const NestBlockButton = (props: { editor: BlockNoteEditor diff --git a/frontend/packages/app/editor/blocknote/react/FormattingToolbar/components/DefaultButtons/TextAlignButton.tsx b/frontend/apps/desktop/src/editor/blocknote/react/FormattingToolbar/components/DefaultButtons/TextAlignButton.tsx similarity index 81% rename from frontend/packages/app/editor/blocknote/react/FormattingToolbar/components/DefaultButtons/TextAlignButton.tsx rename to frontend/apps/desktop/src/editor/blocknote/react/FormattingToolbar/components/DefaultButtons/TextAlignButton.tsx index 338e5a1227..9c0a5c92b8 100644 --- a/frontend/packages/app/editor/blocknote/react/FormattingToolbar/components/DefaultButtons/TextAlignButton.tsx +++ b/frontend/apps/desktop/src/editor/blocknote/react/FormattingToolbar/components/DefaultButtons/TextAlignButton.tsx @@ -3,18 +3,18 @@ import { BlockSchema, DefaultProps, PartialBlock, -} from '@shm/app/editor/blocknote/core' -import {useCallback, useMemo, useState} from 'react' -import {IconType} from 'react-icons' +} from '@shm/desktop/src/editor/blocknote/core' +import { useCallback, useMemo, useState } from 'react' +import { IconType } from 'react-icons' import { RiAlignCenter, RiAlignJustify, RiAlignLeft, RiAlignRight, } from 'react-icons/ri' -import {ToolbarButton} from '../../../SharedComponents/Toolbar/components/ToolbarButton' -import {useEditorContentChange} from '../../../hooks/useEditorContentChange' -import {useEditorSelectionChange} from '../../../hooks/useEditorSelectionChange' +import { ToolbarButton } from '../../../SharedComponents/Toolbar/components/ToolbarButton' +import { useEditorContentChange } from '../../../hooks/useEditorContentChange' +import { useEditorSelectionChange } from '../../../hooks/useEditorSelectionChange' type TextAlignment = DefaultProps['textAlignment']['values'][number] @@ -84,14 +84,14 @@ export const TextAlignButton = (props: { if (selection) { for (const block of selection.blocks) { props.editor.updateBlock(block, { - props: {textAlignment: textAlignment}, + props: { textAlignment: textAlignment }, } as PartialBlock) } } else { const block = props.editor.getTextCursorPosition().block props.editor.updateBlock(block, { - props: {textAlignment: textAlignment}, + props: { textAlignment: textAlignment }, } as PartialBlock) } }, @@ -110,8 +110,8 @@ export const TextAlignButton = (props: { props.textAlignment === 'justify' ? 'Justify Text' : 'Align Text ' + - props.textAlignment.slice(0, 1).toUpperCase() + - props.textAlignment.slice(1) + props.textAlignment.slice(0, 1).toUpperCase() + + props.textAlignment.slice(1) } icon={icons[props.textAlignment]} /> diff --git a/frontend/packages/app/editor/blocknote/react/FormattingToolbar/components/DefaultButtons/ToggledStyleButton.tsx b/frontend/apps/desktop/src/editor/blocknote/react/FormattingToolbar/components/DefaultButtons/ToggledStyleButton.tsx similarity index 76% rename from frontend/packages/app/editor/blocknote/react/FormattingToolbar/components/DefaultButtons/ToggledStyleButton.tsx rename to frontend/apps/desktop/src/editor/blocknote/react/FormattingToolbar/components/DefaultButtons/ToggledStyleButton.tsx index a405b9ea3e..411a1c91f2 100644 --- a/frontend/packages/app/editor/blocknote/react/FormattingToolbar/components/DefaultButtons/ToggledStyleButton.tsx +++ b/frontend/apps/desktop/src/editor/blocknote/react/FormattingToolbar/components/DefaultButtons/ToggledStyleButton.tsx @@ -2,9 +2,9 @@ import { BlockNoteEditor, BlockSchema, ToggledStyle, -} from '@shm/app/editor/blocknote/core' -import {useState} from 'react' -import {IconType} from 'react-icons' +} from '@shm/desktop/src/editor/blocknote/core' +import { useState } from 'react' +import { IconType } from 'react-icons' import { RiBold, RiCodeFill, @@ -12,10 +12,10 @@ import { RiStrikethrough, RiUnderline, } from 'react-icons/ri' -import {ToolbarButton} from '../../../SharedComponents/Toolbar/components/ToolbarButton' -import {useEditorContentChange} from '../../../hooks/useEditorContentChange' -import {useEditorSelectionChange} from '../../../hooks/useEditorSelectionChange' -import {formatKeyboardShortcut} from '../../../utils' +import { ToolbarButton } from '../../../SharedComponents/Toolbar/components/ToolbarButton' +import { useEditorContentChange } from '../../../hooks/useEditorContentChange' +import { useEditorSelectionChange } from '../../../hooks/useEditorSelectionChange' +import { formatKeyboardShortcut } from '../../../utils' const shortcuts: Record = { bold: 'Mod+B', @@ -54,7 +54,7 @@ export const ToggledStyleButton = (props: { const toggleStyle = (style: ToggledStyle) => { props.editor.focus() - props.editor.toggleStyles({[style]: true}) + props.editor.toggleStyles({ [style]: true }) } return ( diff --git a/frontend/packages/app/editor/blocknote/react/FormattingToolbar/components/DefaultDropdowns/BlockTypeDropdown.tsx b/frontend/apps/desktop/src/editor/blocknote/react/FormattingToolbar/components/DefaultDropdowns/BlockTypeDropdown.tsx similarity index 82% rename from frontend/packages/app/editor/blocknote/react/FormattingToolbar/components/DefaultDropdowns/BlockTypeDropdown.tsx rename to frontend/apps/desktop/src/editor/blocknote/react/FormattingToolbar/components/DefaultDropdowns/BlockTypeDropdown.tsx index fd1838583c..fa4da54e35 100644 --- a/frontend/packages/app/editor/blocknote/react/FormattingToolbar/components/DefaultDropdowns/BlockTypeDropdown.tsx +++ b/frontend/apps/desktop/src/editor/blocknote/react/FormattingToolbar/components/DefaultDropdowns/BlockTypeDropdown.tsx @@ -1,12 +1,12 @@ -import {updateGroup} from '@shm/app/editor/block-utils' -import {BlockNoteEditor, BlockSchema} from '@shm/app/editor/blocknote/core' -import {useMemo, useState} from 'react' -import {IconType} from 'react-icons' -import {RiH2, RiListOrdered, RiListUnordered, RiText} from 'react-icons/ri' -import {ToolbarDropdown} from '../../../SharedComponents/Toolbar/components/ToolbarDropdown' -import {ToolbarDropdownItemProps} from '../../../SharedComponents/Toolbar/components/ToolbarDropdownItem' -import {useEditorContentChange} from '../../../hooks/useEditorContentChange' -import {useEditorSelectionChange} from '../../../hooks/useEditorSelectionChange' +import { updateGroup } from '@shm/desktop/src/editor/block-utils' +import { BlockNoteEditor, BlockSchema } from '@shm/desktop/src/editor/blocknote/core' +import { useMemo, useState } from 'react' +import { IconType } from 'react-icons' +import { RiH2, RiListOrdered, RiListUnordered, RiText } from 'react-icons/ri' +import { ToolbarDropdown } from '../../../SharedComponents/Toolbar/components/ToolbarDropdown' +import { ToolbarDropdownItemProps } from '../../../SharedComponents/Toolbar/components/ToolbarDropdownItem' +import { useEditorContentChange } from '../../../hooks/useEditorContentChange' +import { useEditorSelectionChange } from '../../../hooks/useEditorSelectionChange' export type BlockTypeDropdownItem = { name: string @@ -24,7 +24,7 @@ export const defaultBlockTypeDropdownItems: BlockTypeDropdownItem[] = [ { name: 'Heading', type: 'heading', - props: {level: '2'}, + props: { level: '2' }, icon: RiH2, }, // { diff --git a/frontend/packages/app/editor/blocknote/react/FormattingToolbar/components/DefaultFormattingToolbar.tsx b/frontend/apps/desktop/src/editor/blocknote/react/FormattingToolbar/components/DefaultFormattingToolbar.tsx similarity index 80% rename from frontend/packages/app/editor/blocknote/react/FormattingToolbar/components/DefaultFormattingToolbar.tsx rename to frontend/apps/desktop/src/editor/blocknote/react/FormattingToolbar/components/DefaultFormattingToolbar.tsx index 88cbf171fd..4521b2162e 100644 --- a/frontend/packages/app/editor/blocknote/react/FormattingToolbar/components/DefaultFormattingToolbar.tsx +++ b/frontend/apps/desktop/src/editor/blocknote/react/FormattingToolbar/components/DefaultFormattingToolbar.tsx @@ -1,15 +1,15 @@ -import {BlockSchema} from '@shm/app/editor/blocknote/core' +import { BlockSchema } from '@shm/desktop/src/editor/blocknote/core' -import {Toolbar} from '../../SharedComponents/Toolbar/components/Toolbar' -import {ToggledStyleButton} from './DefaultButtons/ToggledStyleButton' +import { Toolbar } from '../../SharedComponents/Toolbar/components/Toolbar' +import { ToggledStyleButton } from './DefaultButtons/ToggledStyleButton' import { BlockTypeDropdown, BlockTypeDropdownItem, } from './DefaultDropdowns/BlockTypeDropdown' -import {FormattingToolbarProps} from './FormattingToolbarPositioner' +import { FormattingToolbarProps } from './FormattingToolbarPositioner' // import {TextAlignButton} from './DefaultButtons/TextAlignButton' // import {ColorStyleButton} from './DefaultButtons/ColorStyleButton' -import {CreateLinkButton} from './DefaultButtons/CreateLinkButton' +import { CreateLinkButton } from './DefaultButtons/CreateLinkButton' import { NestBlockButton, UnnestBlockButton, diff --git a/frontend/packages/app/editor/blocknote/react/FormattingToolbar/components/FormattingToolbarPositioner.tsx b/frontend/apps/desktop/src/editor/blocknote/react/FormattingToolbar/components/FormattingToolbarPositioner.tsx similarity index 89% rename from frontend/packages/app/editor/blocknote/react/FormattingToolbar/components/FormattingToolbarPositioner.tsx rename to frontend/apps/desktop/src/editor/blocknote/react/FormattingToolbar/components/FormattingToolbarPositioner.tsx index 7014b66e7c..d1dfa5bba6 100644 --- a/frontend/packages/app/editor/blocknote/react/FormattingToolbar/components/FormattingToolbarPositioner.tsx +++ b/frontend/apps/desktop/src/editor/blocknote/react/FormattingToolbar/components/FormattingToolbarPositioner.tsx @@ -2,12 +2,12 @@ import { BlockNoteEditor, BlockSchema, DefaultBlockSchema, -} from '@shm/app/editor/blocknote/core' +} from '@shm/desktop/src/editor/blocknote/core' import Tippy from '@tippyjs/react' -import {FC, useEffect, useMemo, useRef, useState} from 'react' -import {sticky} from 'tippy.js' +import { FC, useEffect, useMemo, useRef, useState } from 'react' +import { sticky } from 'tippy.js' -import {DefaultFormattingToolbar} from './DefaultFormattingToolbar' +import { DefaultFormattingToolbar } from './DefaultFormattingToolbar' export type FormattingToolbarProps< BSchema extends BlockSchema = DefaultBlockSchema, diff --git a/frontend/packages/app/editor/blocknote/react/FormattingToolbar/components/LinkToolbarButton.tsx b/frontend/apps/desktop/src/editor/blocknote/react/FormattingToolbar/components/LinkToolbarButton.tsx similarity index 100% rename from frontend/packages/app/editor/blocknote/react/FormattingToolbar/components/LinkToolbarButton.tsx rename to frontend/apps/desktop/src/editor/blocknote/react/FormattingToolbar/components/LinkToolbarButton.tsx diff --git a/frontend/packages/app/editor/blocknote/react/HyperlinkToolbar/EditHyperlinkMenu/components/EditHyperlinkMenu.tsx b/frontend/apps/desktop/src/editor/blocknote/react/HyperlinkToolbar/EditHyperlinkMenu/components/EditHyperlinkMenu.tsx similarity index 100% rename from frontend/packages/app/editor/blocknote/react/HyperlinkToolbar/EditHyperlinkMenu/components/EditHyperlinkMenu.tsx rename to frontend/apps/desktop/src/editor/blocknote/react/HyperlinkToolbar/EditHyperlinkMenu/components/EditHyperlinkMenu.tsx diff --git a/frontend/packages/app/editor/blocknote/react/HyperlinkToolbar/EditHyperlinkMenu/components/EditHyperlinkMenuItem.tsx b/frontend/apps/desktop/src/editor/blocknote/react/HyperlinkToolbar/EditHyperlinkMenu/components/EditHyperlinkMenuItem.tsx similarity index 100% rename from frontend/packages/app/editor/blocknote/react/HyperlinkToolbar/EditHyperlinkMenu/components/EditHyperlinkMenuItem.tsx rename to frontend/apps/desktop/src/editor/blocknote/react/HyperlinkToolbar/EditHyperlinkMenu/components/EditHyperlinkMenuItem.tsx diff --git a/frontend/packages/app/editor/blocknote/react/HyperlinkToolbar/EditHyperlinkMenu/components/EditHyperlinkMenuItemIcon.tsx b/frontend/apps/desktop/src/editor/blocknote/react/HyperlinkToolbar/EditHyperlinkMenu/components/EditHyperlinkMenuItemIcon.tsx similarity index 100% rename from frontend/packages/app/editor/blocknote/react/HyperlinkToolbar/EditHyperlinkMenu/components/EditHyperlinkMenuItemIcon.tsx rename to frontend/apps/desktop/src/editor/blocknote/react/HyperlinkToolbar/EditHyperlinkMenu/components/EditHyperlinkMenuItemIcon.tsx diff --git a/frontend/packages/app/editor/blocknote/react/HyperlinkToolbar/EditHyperlinkMenu/components/EditHyperlinkMenuItemInput.tsx b/frontend/apps/desktop/src/editor/blocknote/react/HyperlinkToolbar/EditHyperlinkMenu/components/EditHyperlinkMenuItemInput.tsx similarity index 100% rename from frontend/packages/app/editor/blocknote/react/HyperlinkToolbar/EditHyperlinkMenu/components/EditHyperlinkMenuItemInput.tsx rename to frontend/apps/desktop/src/editor/blocknote/react/HyperlinkToolbar/EditHyperlinkMenu/components/EditHyperlinkMenuItemInput.tsx diff --git a/frontend/packages/app/editor/blocknote/react/HyperlinkToolbar/components/DefaultHyperlinkToolbar.tsx b/frontend/apps/desktop/src/editor/blocknote/react/HyperlinkToolbar/components/DefaultHyperlinkToolbar.tsx similarity index 100% rename from frontend/packages/app/editor/blocknote/react/HyperlinkToolbar/components/DefaultHyperlinkToolbar.tsx rename to frontend/apps/desktop/src/editor/blocknote/react/HyperlinkToolbar/components/DefaultHyperlinkToolbar.tsx diff --git a/frontend/packages/app/editor/blocknote/react/HyperlinkToolbar/components/HyperlinkToolbarPositioner.tsx b/frontend/apps/desktop/src/editor/blocknote/react/HyperlinkToolbar/components/HyperlinkToolbarPositioner.tsx similarity index 91% rename from frontend/packages/app/editor/blocknote/react/HyperlinkToolbar/components/HyperlinkToolbarPositioner.tsx rename to frontend/apps/desktop/src/editor/blocknote/react/HyperlinkToolbar/components/HyperlinkToolbarPositioner.tsx index cb2edb3816..064af7562d 100644 --- a/frontend/packages/app/editor/blocknote/react/HyperlinkToolbar/components/HyperlinkToolbarPositioner.tsx +++ b/frontend/apps/desktop/src/editor/blocknote/react/HyperlinkToolbar/components/HyperlinkToolbarPositioner.tsx @@ -5,12 +5,12 @@ import { DefaultBlockSchema, HyperlinkToolbarProsemirrorPlugin, HyperlinkToolbarState, -} from '@shm/app/editor/blocknote/core' +} from '@shm/desktop/src/editor/blocknote/core' import Tippy from '@tippyjs/react' -import {FC, useEffect, useMemo, useRef, useState} from 'react' +import { FC, useEffect, useMemo, useRef, useState } from 'react' -import {HMBlockSchema} from '@shm/app/editor/schema' -import {DefaultHyperlinkToolbar} from './DefaultHyperlinkToolbar' +import { HMBlockSchema } from '@shm/desktop/src/editor/schema' +import { DefaultHyperlinkToolbar } from './DefaultHyperlinkToolbar' export type HyperlinkToolbarProps = Pick< HyperlinkToolbarProsemirrorPlugin, diff --git a/frontend/packages/app/editor/blocknote/react/LinkMenu/components/DefaultLinkMenu.tsx b/frontend/apps/desktop/src/editor/blocknote/react/LinkMenu/components/DefaultLinkMenu.tsx similarity index 82% rename from frontend/packages/app/editor/blocknote/react/LinkMenu/components/DefaultLinkMenu.tsx rename to frontend/apps/desktop/src/editor/blocknote/react/LinkMenu/components/DefaultLinkMenu.tsx index c41aef76a7..8954d681f9 100644 --- a/frontend/packages/app/editor/blocknote/react/LinkMenu/components/DefaultLinkMenu.tsx +++ b/frontend/apps/desktop/src/editor/blocknote/react/LinkMenu/components/DefaultLinkMenu.tsx @@ -1,13 +1,13 @@ -import {createStyles, Menu} from '@mantine/core' +import { createStyles, Menu } from '@mantine/core' -import {BlockSchema} from '@shm/app/editor/blocknote/core' -import {LinkMenuItem} from './LinkMenuItem' -import {LinkMenuProps} from './LinkMenuPositioner' +import { BlockSchema } from '@shm/desktop/src/editor/blocknote/core' +import { LinkMenuItem } from './LinkMenuItem' +import { LinkMenuProps } from './LinkMenuPositioner' export function DefaultLinkMenu( props: LinkMenuProps, ) { - const {classes} = createStyles({root: {}})(undefined, { + const { classes } = createStyles({ root: {} })(undefined, { name: 'LinkMenu', }) const renderedItems: any[] = [] diff --git a/frontend/packages/app/editor/blocknote/react/LinkMenu/components/LinkMenuItem.tsx b/frontend/apps/desktop/src/editor/blocknote/react/LinkMenu/components/LinkMenuItem.tsx similarity index 100% rename from frontend/packages/app/editor/blocknote/react/LinkMenu/components/LinkMenuItem.tsx rename to frontend/apps/desktop/src/editor/blocknote/react/LinkMenu/components/LinkMenuItem.tsx diff --git a/frontend/packages/app/editor/blocknote/react/LinkMenu/components/LinkMenuPositioner.tsx b/frontend/apps/desktop/src/editor/blocknote/react/LinkMenu/components/LinkMenuPositioner.tsx similarity index 89% rename from frontend/packages/app/editor/blocknote/react/LinkMenu/components/LinkMenuPositioner.tsx rename to frontend/apps/desktop/src/editor/blocknote/react/LinkMenu/components/LinkMenuPositioner.tsx index 5d891db432..b3c4f523de 100644 --- a/frontend/packages/app/editor/blocknote/react/LinkMenu/components/LinkMenuPositioner.tsx +++ b/frontend/apps/desktop/src/editor/blocknote/react/LinkMenu/components/LinkMenuPositioner.tsx @@ -4,19 +4,19 @@ import { DefaultBlockSchema, LinkMenuProsemirrorPlugin, LinkMenuState, -} from '@shm/app/editor/blocknote/core' +} from '@shm/desktop/src/editor/blocknote/core' import Tippy from '@tippyjs/react' -import {FC, useEffect, useMemo, useRef, useState} from 'react' +import { FC, useEffect, useMemo, useRef, useState } from 'react' -import {LinkMenuItem} from '@shm/app/editor/blocknote/core/extensions/LinkMenu/LinkMenuItem' -import {DefaultLinkMenu} from './DefaultLinkMenu' +import { LinkMenuItem } from '@shm/desktop/src/editor/blocknote/core/extensions/LinkMenu/LinkMenuItem' +import { DefaultLinkMenu } from './DefaultLinkMenu' export type LinkMenuProps = Pick, 'itemCallback'> & - Pick< - LinkMenuState>, - 'items' | 'keyboardHoveredItemIndex' - > + Pick< + LinkMenuState>, + 'items' | 'keyboardHoveredItemIndex' + > export const LinkMenuPositioner = < BSchema extends BlockSchema = DefaultBlockSchema, diff --git a/frontend/packages/app/editor/blocknote/react/ReactBlockSpec.tsx b/frontend/apps/desktop/src/editor/blocknote/react/ReactBlockSpec.tsx similarity index 94% rename from frontend/packages/app/editor/blocknote/react/ReactBlockSpec.tsx rename to frontend/apps/desktop/src/editor/blocknote/react/ReactBlockSpec.tsx index f7f0e5acf8..cabe93bf54 100644 --- a/frontend/packages/app/editor/blocknote/react/ReactBlockSpec.tsx +++ b/frontend/apps/desktop/src/editor/blocknote/react/ReactBlockSpec.tsx @@ -12,15 +12,15 @@ import { PropSchema, propsToAttributes, render, -} from '@shm/app/editor/blocknote/core' -import {TagParseRule} from '@tiptap/pm/model' +} from '@shm/desktop/src/editor/blocknote/core' +import { TagParseRule } from '@tiptap/pm/model' import { NodeViewContent, NodeViewProps, NodeViewWrapper, ReactNodeViewRenderer, } from '@tiptap/react' -import {createContext, ElementType, FC, HTMLProps, useContext} from 'react' +import { createContext, ElementType, FC, HTMLProps, useContext } from 'react' // extend BlockConfig but use a React render function export type ReactBlockConfig< @@ -58,7 +58,7 @@ export type ReactBlockConfig< const BlockNoteDOMAttributesContext = createContext({}) export const InlineContent = ( - props: {as?: Tag} & HTMLProps, + props: { as?: Tag } & HTMLProps, ) => { const inlineContentDOMAttributes = useContext(BlockNoteDOMAttributesContext).inlineContent || {} @@ -119,7 +119,7 @@ export function createReactBlockSpec< return parse(blockConfig) }, - renderHTML({HTMLAttributes}) { + renderHTML({ HTMLAttributes }) { return render(blockConfig, HTMLAttributes) }, @@ -144,7 +144,7 @@ export function createReactBlockSpec< // Gets BlockNote editor instance const editor = this.options.editor! as BlockNoteEditor< - BSchema & {[k in BType]: BlockSpec} + BSchema & { [k in BType]: BlockSpec } > // Gets position of the node const pos = diff --git a/frontend/packages/app/editor/blocknote/react/SharedComponents/ColorPicker/components/ColorIcon.tsx b/frontend/apps/desktop/src/editor/blocknote/react/SharedComponents/ColorPicker/components/ColorIcon.tsx similarity index 100% rename from frontend/packages/app/editor/blocknote/react/SharedComponents/ColorPicker/components/ColorIcon.tsx rename to frontend/apps/desktop/src/editor/blocknote/react/SharedComponents/ColorPicker/components/ColorIcon.tsx diff --git a/frontend/packages/app/editor/blocknote/react/SharedComponents/ColorPicker/components/ColorPicker.tsx b/frontend/apps/desktop/src/editor/blocknote/react/SharedComponents/ColorPicker/components/ColorPicker.tsx similarity index 100% rename from frontend/packages/app/editor/blocknote/react/SharedComponents/ColorPicker/components/ColorPicker.tsx rename to frontend/apps/desktop/src/editor/blocknote/react/SharedComponents/ColorPicker/components/ColorPicker.tsx diff --git a/frontend/packages/app/editor/blocknote/react/SharedComponents/Toolbar/components/Toolbar.tsx b/frontend/apps/desktop/src/editor/blocknote/react/SharedComponents/Toolbar/components/Toolbar.tsx similarity index 100% rename from frontend/packages/app/editor/blocknote/react/SharedComponents/Toolbar/components/Toolbar.tsx rename to frontend/apps/desktop/src/editor/blocknote/react/SharedComponents/Toolbar/components/Toolbar.tsx diff --git a/frontend/packages/app/editor/blocknote/react/SharedComponents/Toolbar/components/ToolbarButton.tsx b/frontend/apps/desktop/src/editor/blocknote/react/SharedComponents/Toolbar/components/ToolbarButton.tsx similarity index 100% rename from frontend/packages/app/editor/blocknote/react/SharedComponents/Toolbar/components/ToolbarButton.tsx rename to frontend/apps/desktop/src/editor/blocknote/react/SharedComponents/Toolbar/components/ToolbarButton.tsx diff --git a/frontend/packages/app/editor/blocknote/react/SharedComponents/Toolbar/components/ToolbarDropdown.tsx b/frontend/apps/desktop/src/editor/blocknote/react/SharedComponents/Toolbar/components/ToolbarDropdown.tsx similarity index 100% rename from frontend/packages/app/editor/blocknote/react/SharedComponents/Toolbar/components/ToolbarDropdown.tsx rename to frontend/apps/desktop/src/editor/blocknote/react/SharedComponents/Toolbar/components/ToolbarDropdown.tsx diff --git a/frontend/packages/app/editor/blocknote/react/SharedComponents/Toolbar/components/ToolbarDropdownItem.tsx b/frontend/apps/desktop/src/editor/blocknote/react/SharedComponents/Toolbar/components/ToolbarDropdownItem.tsx similarity index 100% rename from frontend/packages/app/editor/blocknote/react/SharedComponents/Toolbar/components/ToolbarDropdownItem.tsx rename to frontend/apps/desktop/src/editor/blocknote/react/SharedComponents/Toolbar/components/ToolbarDropdownItem.tsx diff --git a/frontend/packages/app/editor/blocknote/react/SharedComponents/Toolbar/components/ToolbarDropdownTarget.tsx b/frontend/apps/desktop/src/editor/blocknote/react/SharedComponents/Toolbar/components/ToolbarDropdownTarget.tsx similarity index 100% rename from frontend/packages/app/editor/blocknote/react/SharedComponents/Toolbar/components/ToolbarDropdownTarget.tsx rename to frontend/apps/desktop/src/editor/blocknote/react/SharedComponents/Toolbar/components/ToolbarDropdownTarget.tsx diff --git a/frontend/packages/app/editor/blocknote/react/SharedComponents/Tooltip/components/TooltipContent.tsx b/frontend/apps/desktop/src/editor/blocknote/react/SharedComponents/Tooltip/components/TooltipContent.tsx similarity index 100% rename from frontend/packages/app/editor/blocknote/react/SharedComponents/Tooltip/components/TooltipContent.tsx rename to frontend/apps/desktop/src/editor/blocknote/react/SharedComponents/Tooltip/components/TooltipContent.tsx diff --git a/frontend/packages/app/editor/blocknote/react/SideMenu/components/DefaultButtons/AddBlockButton.tsx b/frontend/apps/desktop/src/editor/blocknote/react/SideMenu/components/DefaultButtons/AddBlockButton.tsx similarity index 53% rename from frontend/packages/app/editor/blocknote/react/SideMenu/components/DefaultButtons/AddBlockButton.tsx rename to frontend/apps/desktop/src/editor/blocknote/react/SideMenu/components/DefaultButtons/AddBlockButton.tsx index ae41d8298a..0e28d0dd7f 100644 --- a/frontend/packages/app/editor/blocknote/react/SideMenu/components/DefaultButtons/AddBlockButton.tsx +++ b/frontend/apps/desktop/src/editor/blocknote/react/SideMenu/components/DefaultButtons/AddBlockButton.tsx @@ -1,7 +1,7 @@ -import {BlockSchema} from '@shm/app/editor/blocknote/core' -import {AiOutlinePlus} from 'react-icons/ai' -import {SideMenuButton} from '../SideMenuButton' -import {SideMenuProps} from '../SideMenuPositioner' +import { BlockSchema } from '@shm/desktop/src/editor/blocknote/core' +import { AiOutlinePlus } from 'react-icons/ai' +import { SideMenuButton } from '../SideMenuButton' +import { SideMenuProps } from '../SideMenuPositioner' export const AddBlockButton = ( props: SideMenuProps, diff --git a/frontend/packages/app/editor/blocknote/react/SideMenu/components/DefaultButtons/DragHandle.tsx b/frontend/apps/desktop/src/editor/blocknote/react/SideMenu/components/DefaultButtons/DragHandle.tsx similarity index 68% rename from frontend/packages/app/editor/blocknote/react/SideMenu/components/DefaultButtons/DragHandle.tsx rename to frontend/apps/desktop/src/editor/blocknote/react/SideMenu/components/DefaultButtons/DragHandle.tsx index 340ae95e92..77ffdeffbd 100644 --- a/frontend/packages/app/editor/blocknote/react/SideMenu/components/DefaultButtons/DragHandle.tsx +++ b/frontend/apps/desktop/src/editor/blocknote/react/SideMenu/components/DefaultButtons/DragHandle.tsx @@ -1,9 +1,9 @@ -import {Menu} from '@mantine/core' -import {BlockSchema} from '@shm/app/editor/blocknote/core' -import {MdDragIndicator} from 'react-icons/md' -import {DefaultDragHandleMenu} from '../DragHandleMenu/DefaultDragHandleMenu' -import {SideMenuButton} from '../SideMenuButton' -import {SideMenuProps} from '../SideMenuPositioner' +import { Menu } from '@mantine/core' +import { BlockSchema } from '@shm/desktop/src/editor/blocknote/core' +import { MdDragIndicator } from 'react-icons/md' +import { DefaultDragHandleMenu } from '../DragHandleMenu/DefaultDragHandleMenu' +import { SideMenuButton } from '../SideMenuButton' +import { SideMenuProps } from '../SideMenuPositioner' export const DragHandle = ( props: SideMenuProps, diff --git a/frontend/apps/desktop/src/editor/blocknote/react/SideMenu/components/DefaultSideMenu.tsx b/frontend/apps/desktop/src/editor/blocknote/react/SideMenu/components/DefaultSideMenu.tsx new file mode 100644 index 0000000000..a9dc6350ff --- /dev/null +++ b/frontend/apps/desktop/src/editor/blocknote/react/SideMenu/components/DefaultSideMenu.tsx @@ -0,0 +1,15 @@ +import { BlockSchema } from '@shm/desktop/src/editor/blocknote/core' + +import { AddBlockButton } from './DefaultButtons/AddBlockButton' +import { DragHandle } from './DefaultButtons/DragHandle' +import { SideMenu } from './SideMenu' +import { SideMenuProps } from './SideMenuPositioner' + +export const DefaultSideMenu = ( + props: SideMenuProps, +) => ( + + + + +) diff --git a/frontend/packages/app/editor/blocknote/react/SideMenu/components/DragHandleMenu/DefaultButtons/BlockColorsButton.tsx b/frontend/apps/desktop/src/editor/blocknote/react/SideMenu/components/DragHandleMenu/DefaultButtons/BlockColorsButton.tsx similarity index 66% rename from frontend/packages/app/editor/blocknote/react/SideMenu/components/DragHandleMenu/DefaultButtons/BlockColorsButton.tsx rename to frontend/apps/desktop/src/editor/blocknote/react/SideMenu/components/DragHandleMenu/DefaultButtons/BlockColorsButton.tsx index 84c7832c35..1615103c8a 100644 --- a/frontend/packages/app/editor/blocknote/react/SideMenu/components/DragHandleMenu/DefaultButtons/BlockColorsButton.tsx +++ b/frontend/apps/desktop/src/editor/blocknote/react/SideMenu/components/DragHandleMenu/DefaultButtons/BlockColorsButton.tsx @@ -1,14 +1,14 @@ -import {Box, Menu} from '@mantine/core' -import {BlockSchema, PartialBlock} from '@shm/app/editor/blocknote/core' -import {ReactNode, useCallback, useRef, useState} from 'react' -import {HiChevronRight} from 'react-icons/hi' +import { Box, Menu } from '@mantine/core' +import { BlockSchema, PartialBlock } from '@shm/desktop/src/editor/blocknote/core' +import { ReactNode, useCallback, useRef, useState } from 'react' +import { HiChevronRight } from 'react-icons/hi' -import {ColorPicker} from '../../../../SharedComponents/ColorPicker/components/ColorPicker' -import {DragHandleMenuProps} from '../DragHandleMenu' -import {DragHandleMenuItem} from '../DragHandleMenuItem' +import { ColorPicker } from '../../../../SharedComponents/ColorPicker/components/ColorPicker' +import { DragHandleMenuProps } from '../DragHandleMenu' +import { DragHandleMenuItem } from '../DragHandleMenuItem' export const BlockColorsButton = ( - props: DragHandleMenuProps & {children: ReactNode}, + props: DragHandleMenuProps & { children: ReactNode }, ) => { const [opened, setOpened] = useState(false) @@ -44,9 +44,9 @@ export const BlockColorsButton = ( > -
-
{props.children}
- +
+
{props.children}
+
@@ -54,7 +54,7 @@ export const BlockColorsButton = ( ( backgroundColor={props.block.props.backgroundColor || 'default'} setTextColor={(color) => props.editor.updateBlock(props.block, { - props: {textColor: color}, + props: { textColor: color }, } as PartialBlock) } setBackgroundColor={(color) => props.editor.updateBlock(props.block, { - props: {backgroundColor: color}, + props: { backgroundColor: color }, } as PartialBlock) } /> diff --git a/frontend/packages/app/editor/blocknote/react/SideMenu/components/DragHandleMenu/DefaultButtons/CopyLinkToBlockButton.tsx b/frontend/apps/desktop/src/editor/blocknote/react/SideMenu/components/DragHandleMenu/DefaultButtons/CopyLinkToBlockButton.tsx similarity index 52% rename from frontend/packages/app/editor/blocknote/react/SideMenu/components/DragHandleMenu/DefaultButtons/CopyLinkToBlockButton.tsx rename to frontend/apps/desktop/src/editor/blocknote/react/SideMenu/components/DragHandleMenu/DefaultButtons/CopyLinkToBlockButton.tsx index 170264ff1e..9416078d5d 100644 --- a/frontend/packages/app/editor/blocknote/react/SideMenu/components/DragHandleMenu/DefaultButtons/CopyLinkToBlockButton.tsx +++ b/frontend/apps/desktop/src/editor/blocknote/react/SideMenu/components/DragHandleMenu/DefaultButtons/CopyLinkToBlockButton.tsx @@ -1,14 +1,14 @@ -import {BlockSchema} from '@shm/app/editor/blocknote/core' +import { BlockSchema } from '@shm/desktop/src/editor/blocknote/core' -import {usePublicationContentContext} from '@shm/shared' -import {Link, XStack} from '@shm/ui' -import {DragHandleMenuProps} from '../DragHandleMenu' -import {DragHandleMenuItem} from '../DragHandleMenuItem' +import { usePublicationContentContext } from '@shm/shared' +import { Link, XStack } from '@shm/ui' +import { DragHandleMenuProps } from '../DragHandleMenu' +import { DragHandleMenuItem } from '../DragHandleMenuItem' export const CopyLinkToBlockButton = ({ block, }: DragHandleMenuProps) => { - const {onCopyBlock} = usePublicationContentContext() + const { onCopyBlock } = usePublicationContentContext() if (!onCopyBlock) return null return ( ( + props: DragHandleMenuProps & { children: ReactNode }, +) => { + return ( + props.editor.removeBlocks([props.block])} + > + + + {props.children} + + + ) +} diff --git a/frontend/packages/app/editor/blocknote/react/SideMenu/components/DragHandleMenu/DefaultDragHandleMenu.tsx b/frontend/apps/desktop/src/editor/blocknote/react/SideMenu/components/DragHandleMenu/DefaultDragHandleMenu.tsx similarity index 80% rename from frontend/packages/app/editor/blocknote/react/SideMenu/components/DragHandleMenu/DefaultDragHandleMenu.tsx rename to frontend/apps/desktop/src/editor/blocknote/react/SideMenu/components/DragHandleMenu/DefaultDragHandleMenu.tsx index 14120edf94..c060c351fc 100644 --- a/frontend/packages/app/editor/blocknote/react/SideMenu/components/DragHandleMenu/DefaultDragHandleMenu.tsx +++ b/frontend/apps/desktop/src/editor/blocknote/react/SideMenu/components/DragHandleMenu/DefaultDragHandleMenu.tsx @@ -1,8 +1,8 @@ -import {Box, Menu} from '@mantine/core' -import {BlockNoteEditor, HMBlockSchema} from '@shm/app/editor' -import {updateGroup} from '@shm/app/editor/block-utils' -import {Forward, RefreshCcw, XStack} from '@shm/ui' -import {useCallback, useRef, useState} from 'react' +import { Box, Menu } from '@mantine/core' +import { BlockNoteEditor, HMBlockSchema } from '@shm/desktop/src/editor' +import { updateGroup } from '@shm/desktop/src/editor/block-utils' +import { Forward, RefreshCcw, XStack } from '@shm/ui' +import { useCallback, useRef, useState } from 'react' import { RiHeading, RiListOrdered, @@ -10,10 +10,10 @@ import { RiMenuLine, RiText, } from 'react-icons/ri' -import {CopyLinkToBlockButton} from './DefaultButtons/CopyLinkToBlockButton' -import {RemoveBlockButton} from './DefaultButtons/RemoveBlockButton' -import {DragHandleMenu, DragHandleMenuProps} from './DragHandleMenu' -import {DragHandleMenuItem} from './DragHandleMenuItem' +import { CopyLinkToBlockButton } from './DefaultButtons/CopyLinkToBlockButton' +import { RemoveBlockButton } from './DefaultButtons/RemoveBlockButton' +import { DragHandleMenu, DragHandleMenuProps } from './DragHandleMenu' +import { DragHandleMenuItem } from './DragHandleMenuItem' export const DefaultDragHandleMenu = ( props: DragHandleMenuProps, @@ -59,8 +59,8 @@ function TurnIntoMenu(props: DragHandleMenuProps) { -
Turn into
- +
Turn into
+
@@ -68,9 +68,9 @@ function TurnIntoMenu(props: DragHandleMenuProps) { - {turnIntoItems.map(({Icon, label, onClick}) => ( + {turnIntoItems.map(({ Icon, label, onClick }) => ( { diff --git a/frontend/packages/app/editor/blocknote/react/SideMenu/components/DragHandleMenu/DragHandleMenu.tsx b/frontend/apps/desktop/src/editor/blocknote/react/SideMenu/components/DragHandleMenu/DragHandleMenu.tsx similarity index 60% rename from frontend/packages/app/editor/blocknote/react/SideMenu/components/DragHandleMenu/DragHandleMenu.tsx rename to frontend/apps/desktop/src/editor/blocknote/react/SideMenu/components/DragHandleMenu/DragHandleMenu.tsx index 4f171d4a64..0026a78645 100644 --- a/frontend/packages/app/editor/blocknote/react/SideMenu/components/DragHandleMenu/DragHandleMenu.tsx +++ b/frontend/apps/desktop/src/editor/blocknote/react/SideMenu/components/DragHandleMenu/DragHandleMenu.tsx @@ -1,18 +1,18 @@ -import {Menu, createStyles} from '@mantine/core' +import { Menu, createStyles } from '@mantine/core' import { Block, BlockNoteEditor, BlockSchema, -} from '@shm/app/editor/blocknote/core' -import {ReactNode} from 'react' +} from '@shm/desktop/src/editor/blocknote/core' +import { ReactNode } from 'react' export type DragHandleMenuProps = { editor: BlockNoteEditor block: Block } -export const DragHandleMenu = (props: {children: ReactNode}) => { - const {classes} = createStyles({ +export const DragHandleMenu = (props: { children: ReactNode }) => { + const { classes } = createStyles({ root: { minWidth: 180, }, diff --git a/frontend/packages/app/editor/blocknote/react/SideMenu/components/DragHandleMenu/DragHandleMenuItem.tsx b/frontend/apps/desktop/src/editor/blocknote/react/SideMenu/components/DragHandleMenu/DragHandleMenuItem.tsx similarity index 100% rename from frontend/packages/app/editor/blocknote/react/SideMenu/components/DragHandleMenu/DragHandleMenuItem.tsx rename to frontend/apps/desktop/src/editor/blocknote/react/SideMenu/components/DragHandleMenu/DragHandleMenuItem.tsx diff --git a/frontend/packages/app/editor/blocknote/react/SideMenu/components/SideMenu.tsx b/frontend/apps/desktop/src/editor/blocknote/react/SideMenu/components/SideMenu.tsx similarity index 100% rename from frontend/packages/app/editor/blocknote/react/SideMenu/components/SideMenu.tsx rename to frontend/apps/desktop/src/editor/blocknote/react/SideMenu/components/SideMenu.tsx diff --git a/frontend/packages/app/editor/blocknote/react/SideMenu/components/SideMenuButton.tsx b/frontend/apps/desktop/src/editor/blocknote/react/SideMenu/components/SideMenuButton.tsx similarity index 100% rename from frontend/packages/app/editor/blocknote/react/SideMenu/components/SideMenuButton.tsx rename to frontend/apps/desktop/src/editor/blocknote/react/SideMenu/components/SideMenuButton.tsx diff --git a/frontend/packages/app/editor/blocknote/react/SideMenu/components/SideMenuPositioner.tsx b/frontend/apps/desktop/src/editor/blocknote/react/SideMenu/components/SideMenuPositioner.tsx similarity index 92% rename from frontend/packages/app/editor/blocknote/react/SideMenu/components/SideMenuPositioner.tsx rename to frontend/apps/desktop/src/editor/blocknote/react/SideMenu/components/SideMenuPositioner.tsx index 3f7eb487db..5c76cc00a7 100644 --- a/frontend/packages/app/editor/blocknote/react/SideMenu/components/SideMenuPositioner.tsx +++ b/frontend/apps/desktop/src/editor/blocknote/react/SideMenu/components/SideMenuPositioner.tsx @@ -4,11 +4,11 @@ import { BlockSchema, DefaultBlockSchema, SideMenuProsemirrorPlugin, -} from '@shm/app/editor/blocknote/core' +} from '@shm/desktop/src/editor/blocknote/core' import Tippy from '@tippyjs/react' -import {FC, useEffect, useMemo, useRef, useState} from 'react' -import {DefaultSideMenu} from './DefaultSideMenu' -import {DragHandleMenuProps} from './DragHandleMenu/DragHandleMenu' +import { FC, useEffect, useMemo, useRef, useState } from 'react' +import { DefaultSideMenu } from './DefaultSideMenu' +import { DragHandleMenuProps } from './DragHandleMenu/DragHandleMenu' export type SideMenuProps = Pick< diff --git a/frontend/packages/app/editor/blocknote/react/SlashMenu/ReactSlashMenuItem.ts b/frontend/apps/desktop/src/editor/blocknote/react/SlashMenu/ReactSlashMenuItem.ts similarity index 84% rename from frontend/packages/app/editor/blocknote/react/SlashMenu/ReactSlashMenuItem.ts rename to frontend/apps/desktop/src/editor/blocknote/react/SlashMenu/ReactSlashMenuItem.ts index c1360a7821..1d977e5c21 100644 --- a/frontend/packages/app/editor/blocknote/react/SlashMenu/ReactSlashMenuItem.ts +++ b/frontend/apps/desktop/src/editor/blocknote/react/SlashMenu/ReactSlashMenuItem.ts @@ -2,7 +2,7 @@ import { BaseSlashMenuItem, BlockSchema, DefaultBlockSchema, -} from '@shm/app/editor/blocknote/core' +} from '@shm/desktop/src/editor/blocknote/core' export type ReactSlashMenuItem< BSchema extends BlockSchema = DefaultBlockSchema, diff --git a/frontend/packages/app/editor/blocknote/react/SlashMenu/components/DefaultSlashMenu.tsx b/frontend/apps/desktop/src/editor/blocknote/react/SlashMenu/components/DefaultSlashMenu.tsx similarity index 86% rename from frontend/packages/app/editor/blocknote/react/SlashMenu/components/DefaultSlashMenu.tsx rename to frontend/apps/desktop/src/editor/blocknote/react/SlashMenu/components/DefaultSlashMenu.tsx index c39dc40c07..e061b9685f 100644 --- a/frontend/packages/app/editor/blocknote/react/SlashMenu/components/DefaultSlashMenu.tsx +++ b/frontend/apps/desktop/src/editor/blocknote/react/SlashMenu/components/DefaultSlashMenu.tsx @@ -1,14 +1,14 @@ -import {createStyles, Menu} from '@mantine/core' +import { createStyles, Menu } from '@mantine/core' import * as _ from 'lodash' -import {BlockSchema} from '@shm/app/editor/blocknote/core' -import {SlashMenuItem} from './SlashMenuItem' -import {SlashMenuProps} from './SlashMenuPositioner' +import { BlockSchema } from '@shm/desktop/src/editor/blocknote/core' +import { SlashMenuItem } from './SlashMenuItem' +import { SlashMenuProps } from './SlashMenuPositioner' export function DefaultSlashMenu( props: SlashMenuProps, ) { - const {classes} = createStyles({root: {}})(undefined, { + const { classes } = createStyles({ root: {} })(undefined, { name: 'SlashMenu', }) const renderedItems: any[] = [] diff --git a/frontend/packages/app/editor/blocknote/react/SlashMenu/components/SlashMenuItem.tsx b/frontend/apps/desktop/src/editor/blocknote/react/SlashMenu/components/SlashMenuItem.tsx similarity index 100% rename from frontend/packages/app/editor/blocknote/react/SlashMenu/components/SlashMenuItem.tsx rename to frontend/apps/desktop/src/editor/blocknote/react/SlashMenu/components/SlashMenuItem.tsx diff --git a/frontend/packages/app/editor/blocknote/react/SlashMenu/components/SlashMenuPositioner.tsx b/frontend/apps/desktop/src/editor/blocknote/react/SlashMenu/components/SlashMenuPositioner.tsx similarity index 88% rename from frontend/packages/app/editor/blocknote/react/SlashMenu/components/SlashMenuPositioner.tsx rename to frontend/apps/desktop/src/editor/blocknote/react/SlashMenu/components/SlashMenuPositioner.tsx index e1b72ae394..537246d5fb 100644 --- a/frontend/packages/app/editor/blocknote/react/SlashMenu/components/SlashMenuPositioner.tsx +++ b/frontend/apps/desktop/src/editor/blocknote/react/SlashMenu/components/SlashMenuPositioner.tsx @@ -4,19 +4,19 @@ import { DefaultBlockSchema, SlashMenuProsemirrorPlugin, SuggestionsMenuState, -} from '@shm/app/editor/blocknote/core' +} from '@shm/desktop/src/editor/blocknote/core' import Tippy from '@tippyjs/react' -import {FC, useEffect, useMemo, useRef, useState} from 'react' +import { FC, useEffect, useMemo, useRef, useState } from 'react' -import {ReactSlashMenuItem} from '../ReactSlashMenuItem' -import {DefaultSlashMenu} from './DefaultSlashMenu' +import { ReactSlashMenuItem } from '../ReactSlashMenuItem' +import { DefaultSlashMenu } from './DefaultSlashMenu' export type SlashMenuProps = Pick, 'itemCallback'> & - Pick< - SuggestionsMenuState>, - 'filteredItems' | 'keyboardHoveredItemIndex' - > + Pick< + SuggestionsMenuState>, + 'filteredItems' | 'keyboardHoveredItemIndex' + > export const SlashMenuPositioner = < BSchema extends BlockSchema = DefaultBlockSchema, diff --git a/frontend/packages/app/editor/blocknote/react/SlashMenu/defaultReactSlashMenuItems.tsx b/frontend/apps/desktop/src/editor/blocknote/react/SlashMenu/defaultReactSlashMenuItems.tsx similarity index 95% rename from frontend/packages/app/editor/blocknote/react/SlashMenu/defaultReactSlashMenuItems.tsx rename to frontend/apps/desktop/src/editor/blocknote/react/SlashMenu/defaultReactSlashMenuItems.tsx index 256b7b132f..d5b07c527a 100644 --- a/frontend/packages/app/editor/blocknote/react/SlashMenu/defaultReactSlashMenuItems.tsx +++ b/frontend/apps/desktop/src/editor/blocknote/react/SlashMenu/defaultReactSlashMenuItems.tsx @@ -4,8 +4,8 @@ import { defaultBlockSchema, DefaultBlockSchema, getDefaultSlashMenuItems, -} from '@shm/app/editor/blocknote/core' -import {MdPreview} from 'react-icons/md' +} from '@shm/desktop/src/editor/blocknote/core' +import { MdPreview } from 'react-icons/md' import { RiChatQuoteLine, RiCodeLine, @@ -14,7 +14,7 @@ import { RiPlayCircleLine, RiText, } from 'react-icons/ri' -import {ReactSlashMenuItem} from './ReactSlashMenuItem' +import { ReactSlashMenuItem } from './ReactSlashMenuItem' const extraFields: Record< string, diff --git a/frontend/packages/app/editor/blocknote/react/defaultThemes.ts b/frontend/apps/desktop/src/editor/blocknote/react/defaultThemes.ts similarity index 100% rename from frontend/packages/app/editor/blocknote/react/defaultThemes.ts rename to frontend/apps/desktop/src/editor/blocknote/react/defaultThemes.ts diff --git a/frontend/packages/app/editor/blocknote/react/hooks/useBlockNote.ts b/frontend/apps/desktop/src/editor/blocknote/react/hooks/useBlockNote.ts similarity index 91% rename from frontend/packages/app/editor/blocknote/react/hooks/useBlockNote.ts rename to frontend/apps/desktop/src/editor/blocknote/react/hooks/useBlockNote.ts index 87a93c8fd8..acd5cadd10 100644 --- a/frontend/packages/app/editor/blocknote/react/hooks/useBlockNote.ts +++ b/frontend/apps/desktop/src/editor/blocknote/react/hooks/useBlockNote.ts @@ -3,8 +3,8 @@ import { BlockNoteEditorOptions, defaultBlockSchema, DefaultBlockSchema, -} from '@shm/app/editor/blocknote/core' -import {HMBlockSchema} from '@shm/app/editor/schema' +} from '@shm/desktop/src/editor/blocknote/core' +import {HMBlockSchema} from '@shm/desktop/src/editor/schema' import {DependencyList, useMemo, useRef} from 'react' import {getDefaultReactSlashMenuItems} from '../SlashMenu/defaultReactSlashMenuItems' diff --git a/frontend/packages/app/editor/blocknote/react/hooks/useEditorContentChange.ts b/frontend/apps/desktop/src/editor/blocknote/react/hooks/useEditorContentChange.ts similarity index 79% rename from frontend/packages/app/editor/blocknote/react/hooks/useEditorContentChange.ts rename to frontend/apps/desktop/src/editor/blocknote/react/hooks/useEditorContentChange.ts index 9c767dc026..4a194a1e41 100644 --- a/frontend/packages/app/editor/blocknote/react/hooks/useEditorContentChange.ts +++ b/frontend/apps/desktop/src/editor/blocknote/react/hooks/useEditorContentChange.ts @@ -1,4 +1,7 @@ -import {BlockNoteEditor, BlockSchema} from '@shm/app/editor/blocknote/core' +import { + BlockNoteEditor, + BlockSchema, +} from '@shm/desktop/src/editor/blocknote/core' import {useEffect} from 'react' export function useEditorContentChange( diff --git a/frontend/packages/app/editor/blocknote/react/hooks/useEditorForceUpdate.tsx b/frontend/apps/desktop/src/editor/blocknote/react/hooks/useEditorForceUpdate.tsx similarity index 100% rename from frontend/packages/app/editor/blocknote/react/hooks/useEditorForceUpdate.tsx rename to frontend/apps/desktop/src/editor/blocknote/react/hooks/useEditorForceUpdate.tsx diff --git a/frontend/packages/app/editor/blocknote/react/hooks/useEditorSelectionChange.ts b/frontend/apps/desktop/src/editor/blocknote/react/hooks/useEditorSelectionChange.ts similarity index 80% rename from frontend/packages/app/editor/blocknote/react/hooks/useEditorSelectionChange.ts rename to frontend/apps/desktop/src/editor/blocknote/react/hooks/useEditorSelectionChange.ts index 988d9b96c9..ef401a213a 100644 --- a/frontend/packages/app/editor/blocknote/react/hooks/useEditorSelectionChange.ts +++ b/frontend/apps/desktop/src/editor/blocknote/react/hooks/useEditorSelectionChange.ts @@ -1,4 +1,7 @@ -import {BlockNoteEditor, BlockSchema} from '@shm/app/editor/blocknote/core' +import { + BlockNoteEditor, + BlockSchema, +} from '@shm/desktop/src/editor/blocknote/core' import {useEffect} from 'react' export function useEditorSelectionChange( diff --git a/frontend/packages/app/editor/blocknote/react/index.ts b/frontend/apps/desktop/src/editor/blocknote/react/index.ts similarity index 100% rename from frontend/packages/app/editor/blocknote/react/index.ts rename to frontend/apps/desktop/src/editor/blocknote/react/index.ts diff --git a/frontend/packages/app/editor/blocknote/react/utils.ts b/frontend/apps/desktop/src/editor/blocknote/react/utils.ts similarity index 100% rename from frontend/packages/app/editor/blocknote/react/utils.ts rename to frontend/apps/desktop/src/editor/blocknote/react/utils.ts diff --git a/frontend/packages/app/editor/diffExtension.ts b/frontend/apps/desktop/src/editor/diffExtension.ts similarity index 100% rename from frontend/packages/app/editor/diffExtension.ts rename to frontend/apps/desktop/src/editor/diffExtension.ts diff --git a/frontend/packages/app/editor/editor-types.ts b/frontend/apps/desktop/src/editor/editor-types.ts similarity index 100% rename from frontend/packages/app/editor/editor-types.ts rename to frontend/apps/desktop/src/editor/editor-types.ts diff --git a/frontend/packages/app/editor/editor.css b/frontend/apps/desktop/src/editor/editor.css similarity index 100% rename from frontend/packages/app/editor/editor.css rename to frontend/apps/desktop/src/editor/editor.css diff --git a/frontend/packages/app/editor/embed-block.tsx b/frontend/apps/desktop/src/editor/embed-block.tsx similarity index 89% rename from frontend/packages/app/editor/embed-block.tsx rename to frontend/apps/desktop/src/editor/embed-block.tsx index d46166fce7..8c19dfa071 100644 --- a/frontend/packages/app/editor/embed-block.tsx +++ b/frontend/apps/desktop/src/editor/embed-block.tsx @@ -1,8 +1,8 @@ -import {useAppContext} from '@shm/app/app-context' -import {useGatewayUrlStream} from '@shm/app/models/gateway-settings' -import {fetchWebLink} from '@shm/app/models/web-links' -import {usePopoverState} from '@shm/app/use-popover-state' -import {useOpenUrl} from '@shm/desktop/src/open-url' +import { useAppContext } from '@shm/desktop/src/app-context' +import { useGatewayUrlStream } from '@shm/desktop/src/models/gateway-settings' +import { fetchWebLink } from '@shm/desktop/src/models/web-links' +import { useOpenUrl } from '@shm/desktop/src/open-url' +import { usePopoverState } from '@shm/desktop/src/use-popover-state' import { BlockContentEmbed, createHmDocLink, @@ -13,7 +13,7 @@ import { unpackHmId, useHover, } from '@shm/shared' -import {ErrorBlock} from '@shm/shared/src/publication-content' +import { ErrorBlock } from '@shm/shared/src/publication-content' import { Button, Check, @@ -29,13 +29,13 @@ import { XStack, YGroup, } from '@shm/ui' -import {Fragment} from '@tiptap/pm/model' -import {forwardRef, useCallback, useMemo} from 'react' -import {ErrorBoundary} from 'react-error-boundary' -import {Block, BlockNoteEditor, HMBlockSchema} from '.' -import {createReactBlockSpec} from './blocknote/react' -import {MediaContainer} from './media-container' -import {DisplayComponentProps, MediaRender, MediaType} from './media-render' +import { Fragment } from '@tiptap/pm/model' +import { forwardRef, useCallback, useMemo } from 'react' +import { ErrorBoundary } from 'react-error-boundary' +import { Block, BlockNoteEditor, HMBlockSchema } from '.' +import { createReactBlockSpec } from './blocknote/react' +import { MediaContainer } from './media-container' +import { DisplayComponentProps, MediaRender, MediaType } from './media-render' function EmbedError() { return @@ -81,7 +81,7 @@ const Render = ( block: Block, editor: BlockNoteEditor, ) => { - const {queryClient} = useAppContext() + const { queryClient } = useAppContext() const gwUrl = useGatewayUrlStream() const submitEmbed = async ( url: string, @@ -92,7 +92,7 @@ const Render = ( if (isPublicGatewayLink(url, gwUrl) || isHypermediaScheme(url)) { const hmLink = normalizeHmId(url, gwUrl) const newUrl = hmLink ? hmLink : url - assign({props: {url: newUrl}} as MediaType) + assign({ props: { url: newUrl } } as MediaType) const cursorPosition = editor.getTextCursorPosition() editor.focus() if (cursorPosition.block.id === block.id) { @@ -100,7 +100,7 @@ const Render = ( editor.setTextCursorPosition(cursorPosition.nextBlock, 'start') else { editor.insertBlocks( - [{type: 'paragraph', content: ''}], + [{ type: 'paragraph', content: '' }], block.id, 'after', ) @@ -120,7 +120,7 @@ const Render = ( res?.blockRef, ) if (fullHmId) { - assign({props: {url: fullHmId}} as MediaType) + assign({ props: { url: fullHmId } } as MediaType) const cursorPosition = editor.getTextCursorPosition() editor.focus() if (cursorPosition.block.id === block.id) { @@ -128,7 +128,7 @@ const Render = ( editor.setTextCursorPosition(cursorPosition.nextBlock, 'start') else { editor.insertBlocks( - [{type: 'paragraph', content: ''}], + [{ type: 'paragraph', content: '' }], block.id, 'after', ) @@ -190,8 +190,8 @@ const display = ({ { return () => { - assign({props: {view}}) + assign({ props: { view } }) popoverViewState.onOpenChange(false) } }, []) @@ -313,7 +313,7 @@ function EmbedControl({ opacity={popoverState.open ? 1 : 0} padding="$2" gap="$2" - $group-item-hover={{opacity: 1}} + $group-item-hover={{ opacity: 1 }} > ) : null} @@ -493,8 +493,8 @@ function EmbedControl({ }, }, ]} - enterStyle={{y: -10, opacity: 0}} - exitStyle={{y: -10, opacity: 0}} + enterStyle={{ y: -10, opacity: 0 }} + exitStyle={{ y: -10, opacity: 0 }} elevate={true} > @@ -506,7 +506,7 @@ function EmbedControl({ handleBlockToDocument() }} title="Convert to Document Embed" - // icon={item.icon} + // icon={item.icon} /> ) : null} @@ -520,8 +520,8 @@ function EmbedControl({ const EmbedSideAnnotation = forwardRef< HTMLDivElement, - {hmId: string; sidePos: 'bottom' | 'right'} ->(function EmbedSideAnnotation({hmId, sidePos}, ref) { + { hmId: string; sidePos: 'bottom' | 'right' } +>(function EmbedSideAnnotation({ hmId, sidePos }, ref) { const unpacked = unpackHmId(hmId) if (unpacked && unpacked.type != 'd') return null const pub = usePublication({ @@ -534,11 +534,11 @@ const EmbedSideAnnotation = forwardRef< const sideStyles: YStackProps = sidePos == 'right' ? { - position: 'absolute', - top: 32, - right: -16, - transform: 'translateX(100%)', - } + position: 'absolute', + top: 32, + right: -16, + transform: 'translateX(100%)', + } : {} return ( diff --git a/frontend/packages/app/editor/file.tsx b/frontend/apps/desktop/src/editor/file.tsx similarity index 100% rename from frontend/packages/app/editor/file.tsx rename to frontend/apps/desktop/src/editor/file.tsx diff --git a/frontend/packages/app/editor/handle-local-media-paste-plugin.ts b/frontend/apps/desktop/src/editor/handle-local-media-paste-plugin.ts similarity index 100% rename from frontend/packages/app/editor/handle-local-media-paste-plugin.ts rename to frontend/apps/desktop/src/editor/handle-local-media-paste-plugin.ts diff --git a/frontend/packages/app/editor/heading-component-plugin.tsx b/frontend/apps/desktop/src/editor/heading-component-plugin.tsx similarity index 100% rename from frontend/packages/app/editor/heading-component-plugin.tsx rename to frontend/apps/desktop/src/editor/heading-component-plugin.tsx diff --git a/frontend/packages/app/editor/hm-formatting-toolbar.tsx b/frontend/apps/desktop/src/editor/hm-formatting-toolbar.tsx similarity index 100% rename from frontend/packages/app/editor/hm-formatting-toolbar.tsx rename to frontend/apps/desktop/src/editor/hm-formatting-toolbar.tsx diff --git a/frontend/packages/app/editor/hm-toolbar-link-button.tsx b/frontend/apps/desktop/src/editor/hm-toolbar-link-button.tsx similarity index 100% rename from frontend/packages/app/editor/hm-toolbar-link-button.tsx rename to frontend/apps/desktop/src/editor/hm-toolbar-link-button.tsx diff --git a/frontend/packages/app/editor/hyperlink-toolbar.tsx b/frontend/apps/desktop/src/editor/hyperlink-toolbar.tsx similarity index 100% rename from frontend/packages/app/editor/hyperlink-toolbar.tsx rename to frontend/apps/desktop/src/editor/hyperlink-toolbar.tsx diff --git a/frontend/packages/app/editor/hypermedia-link-plugin.tsx b/frontend/apps/desktop/src/editor/hypermedia-link-plugin.tsx similarity index 87% rename from frontend/packages/app/editor/hypermedia-link-plugin.tsx rename to frontend/apps/desktop/src/editor/hypermedia-link-plugin.tsx index 9346a67023..2a85a18839 100644 --- a/frontend/packages/app/editor/hypermedia-link-plugin.tsx +++ b/frontend/apps/desktop/src/editor/hypermedia-link-plugin.tsx @@ -1,8 +1,8 @@ -import {fetchWebLink} from '@shm/app/models/web-links' -import {AppQueryClient} from '@shm/app/query-client' -import {extractBlockRefOfUrl, hmIdWithVersion} from '@shm/shared' -import {EditorView} from '@tiptap/pm/view' -import {Plugin, PluginKey} from 'prosemirror-state' +import { fetchWebLink } from '@shm/desktop/src/models/web-links' +import { AppQueryClient } from '@shm/desktop/src/query-client' +import { extractBlockRefOfUrl, hmIdWithVersion } from '@shm/shared' +import { EditorView } from '@tiptap/pm/view' +import { Plugin, PluginKey } from 'prosemirror-state' export const hypermediaPluginKey = new PluginKey('hypermedia-link') @@ -69,10 +69,10 @@ async function checkHyperLink( entry: [key: string, value: string], ): Promise< | { - documentId: string - versionId?: string - blockId?: string - } + documentId: string + versionId?: string + blockId?: string + } | undefined > { let [id, entryUrl] = entry diff --git a/frontend/packages/app/editor/image-placeholder.ts b/frontend/apps/desktop/src/editor/image-placeholder.ts similarity index 100% rename from frontend/packages/app/editor/image-placeholder.ts rename to frontend/apps/desktop/src/editor/image-placeholder.ts diff --git a/frontend/packages/app/editor/image.css b/frontend/apps/desktop/src/editor/image.css similarity index 100% rename from frontend/packages/app/editor/image.css rename to frontend/apps/desktop/src/editor/image.css diff --git a/frontend/packages/app/editor/image.tsx b/frontend/apps/desktop/src/editor/image.tsx similarity index 87% rename from frontend/packages/app/editor/image.tsx rename to frontend/apps/desktop/src/editor/image.tsx index 5e1e609cd8..e0f73dcb64 100644 --- a/frontend/packages/app/editor/image.tsx +++ b/frontend/apps/desktop/src/editor/image.tsx @@ -1,17 +1,17 @@ -import {isValidUrl, timeoutPromise} from '@shm/app/editor/utils' -import {getCIDFromIPFSUrl, usePublicationContentContext} from '@shm/shared' -import {ResizeHandle, useTheme} from '@shm/ui' -import {useEffect, useState} from 'react' -import {RiImage2Line} from 'react-icons/ri' +import { isValidUrl, timeoutPromise } from '@shm/desktop/src/editor/utils' +import { getCIDFromIPFSUrl, usePublicationContentContext } from '@shm/shared' +import { ResizeHandle, useTheme } from '@shm/ui' +import { useEffect, useState } from 'react' +import { RiImage2Line } from 'react-icons/ri' import { Block, BlockNoteEditor, createReactBlockSpec, defaultProps, } from './blocknote' -import {MediaContainer} from './media-container' -import {DisplayComponentProps, MediaRender, MediaType} from './media-render' -import {HMBlockSchema} from './schema' +import { MediaContainer } from './media-container' +import { DisplayComponentProps, MediaRender, MediaType } from './media-render' +import { HMBlockSchema } from './schema' export const ImageBlock = createReactBlockSpec({ type: 'image', @@ -48,7 +48,7 @@ export const ImageBlock = createReactBlockSpec({ { tag: 'img[src]', getAttrs: (element) => { - return {src: element.getAttribute('src'), width: element.style.width} + return { src: element.getAttribute('src'), width: element.style.width } }, node: 'image', }, @@ -60,7 +60,7 @@ const Render = ( editor: BlockNoteEditor, ) => { const theme = useTheme() - const {importWebFile} = usePublicationContentContext() + const { importWebFile } = usePublicationContentContext() const submitImage = ( url: string, @@ -84,7 +84,7 @@ const Render = ( }) return } - assign({props: {url: `ipfs://${imageData.cid}`}} as MediaType) + assign({ props: { url: `ipfs://${imageData.cid}` } } as MediaType) setLoading(false) } else { let imgTypeSplit = imageData.type.split('/') @@ -102,7 +102,7 @@ const Render = ( }) setLoading(false) }) - } else setFileName({name: 'The provided URL is invalid.', color: 'red'}) + } else setFileName({ name: 'The provided URL is invalid.', color: 'red' }) const cursorPosition = editor.getTextCursorPosition() editor.focus() @@ -111,7 +111,7 @@ const Render = ( editor.setTextCursorPosition(cursorPosition.nextBlock, 'start') else { editor.insertBlocks( - [{type: 'paragraph', content: ''}], + [{ type: 'paragraph', content: '' }], block.id, 'after', ) @@ -141,7 +141,7 @@ const display = ({ setSelected, assign, }: DisplayComponentProps) => { - const {ipfsBlobPrefix} = usePublicationContentContext() + const { ipfsBlobPrefix } = usePublicationContentContext() const imageUrl = block.props.url.includes('.') ? null : `${ipfsBlobPrefix}${getCIDFromIPFSUrl(block.props.url)}` @@ -154,10 +154,10 @@ const display = ({ const [showHandle, setShowHandle] = useState(false) let resizeParams: | { - handleUsed: 'left' | 'right' - initialWidth: number - initialClientX: number - } + handleUsed: 'left' | 'right' + initialWidth: number + initialClientX: number + } | undefined useEffect(() => { @@ -295,7 +295,7 @@ const display = ({ )} {imageUrl && ( {block.props.name { @@ -52,7 +52,7 @@ export function createInlineEmbedNode(bnEditor: any) { getAttrs: (dom) => { if (dom instanceof HTMLElement) { var value = dom.getAttribute('data-inline-embed') - return {ref: value} + return { ref: value } } return false }, @@ -85,7 +85,7 @@ function InlineEmbedNodeComponent(props: any) { ) } -export function MentionToken(props: {value: string; selected?: boolean}) { +export function MentionToken(props: { value: string; selected?: boolean }) { const unpackedRef = unpackHmId(props.value) if (unpackedRef?.type == 'a') { diff --git a/frontend/packages/app/editor/nostr.tsx b/frontend/apps/desktop/src/editor/nostr.tsx similarity index 100% rename from frontend/packages/app/editor/nostr.tsx rename to frontend/apps/desktop/src/editor/nostr.tsx diff --git a/frontend/packages/app/editor/schema.ts b/frontend/apps/desktop/src/editor/schema.ts similarity index 100% rename from frontend/packages/app/editor/schema.ts rename to frontend/apps/desktop/src/editor/schema.ts diff --git a/frontend/packages/app/editor/tiptap-extension-code-block/code-block-lowlight.tsx b/frontend/apps/desktop/src/editor/tiptap-extension-code-block/code-block-lowlight.tsx similarity index 83% rename from frontend/packages/app/editor/tiptap-extension-code-block/code-block-lowlight.tsx rename to frontend/apps/desktop/src/editor/tiptap-extension-code-block/code-block-lowlight.tsx index 0c80731dde..0c5f7406f2 100644 --- a/frontend/packages/app/editor/tiptap-extension-code-block/code-block-lowlight.tsx +++ b/frontend/apps/desktop/src/editor/tiptap-extension-code-block/code-block-lowlight.tsx @@ -1,14 +1,14 @@ -import styles from '@shm/app/editor/blocknote/core/extensions/Blocks/nodes/Block.module.css' +import styles from '@shm/desktop/src/editor/blocknote/core/extensions/Blocks/nodes/Block.module.css' import { NodeViewProps, NodeViewWrapper, ReactNodeViewRenderer, } from '@tiptap/react' -import {FC} from 'react' -import {mergeCSSClasses} from '..' -import {CodeBlock, CodeBlockOptions} from './code-block' -import {CodeBlockView} from './code-block-view' -import {LowlightPlugin} from './lowlight-plugin.js' +import { FC } from 'react' +import { mergeCSSClasses } from '..' +import { CodeBlock, CodeBlockOptions } from './code-block' +import { CodeBlockView } from './code-block-view' +import { LowlightPlugin } from './lowlight-plugin.js' export interface CodeBlockLowlightOptions extends CodeBlockOptions { lowlight: any diff --git a/frontend/packages/app/editor/tiptap-extension-code-block/code-block-view.tsx b/frontend/apps/desktop/src/editor/tiptap-extension-code-block/code-block-view.tsx similarity index 100% rename from frontend/packages/app/editor/tiptap-extension-code-block/code-block-view.tsx rename to frontend/apps/desktop/src/editor/tiptap-extension-code-block/code-block-view.tsx diff --git a/frontend/packages/app/editor/tiptap-extension-code-block/code-block.ts b/frontend/apps/desktop/src/editor/tiptap-extension-code-block/code-block.ts similarity index 99% rename from frontend/packages/app/editor/tiptap-extension-code-block/code-block.ts rename to frontend/apps/desktop/src/editor/tiptap-extension-code-block/code-block.ts index 286e456e72..f1a946b2d3 100644 --- a/frontend/packages/app/editor/tiptap-extension-code-block/code-block.ts +++ b/frontend/apps/desktop/src/editor/tiptap-extension-code-block/code-block.ts @@ -1,4 +1,4 @@ -import styles from '@shm/app/editor/blocknote/core/extensions/Blocks/nodes/Block.module.css' +import styles from '@shm/desktop/src/editor/blocknote/core/extensions/Blocks/nodes/Block.module.css' import { Editor, mergeAttributes, diff --git a/frontend/packages/app/editor/tiptap-extension-code-block/index.ts b/frontend/apps/desktop/src/editor/tiptap-extension-code-block/index.ts similarity index 100% rename from frontend/packages/app/editor/tiptap-extension-code-block/index.ts rename to frontend/apps/desktop/src/editor/tiptap-extension-code-block/index.ts diff --git a/frontend/packages/app/editor/tiptap-extension-code-block/lowlight-plugin.ts b/frontend/apps/desktop/src/editor/tiptap-extension-code-block/lowlight-plugin.ts similarity index 100% rename from frontend/packages/app/editor/tiptap-extension-code-block/lowlight-plugin.ts rename to frontend/apps/desktop/src/editor/tiptap-extension-code-block/lowlight-plugin.ts diff --git a/frontend/packages/app/editor/tiptap-extension-link/helpers/autolink.ts b/frontend/apps/desktop/src/editor/tiptap-extension-link/helpers/autolink.ts similarity index 100% rename from frontend/packages/app/editor/tiptap-extension-link/helpers/autolink.ts rename to frontend/apps/desktop/src/editor/tiptap-extension-link/helpers/autolink.ts diff --git a/frontend/packages/app/editor/tiptap-extension-link/helpers/clickHandler.ts b/frontend/apps/desktop/src/editor/tiptap-extension-link/helpers/clickHandler.ts similarity index 100% rename from frontend/packages/app/editor/tiptap-extension-link/helpers/clickHandler.ts rename to frontend/apps/desktop/src/editor/tiptap-extension-link/helpers/clickHandler.ts diff --git a/frontend/packages/app/editor/tiptap-extension-link/helpers/pasteHandler.ts b/frontend/apps/desktop/src/editor/tiptap-extension-link/helpers/pasteHandler.ts similarity index 98% rename from frontend/packages/app/editor/tiptap-extension-link/helpers/pasteHandler.ts rename to frontend/apps/desktop/src/editor/tiptap-extension-link/helpers/pasteHandler.ts index 811c61be4d..f82a080572 100644 --- a/frontend/packages/app/editor/tiptap-extension-link/helpers/pasteHandler.ts +++ b/frontend/apps/desktop/src/editor/tiptap-extension-link/helpers/pasteHandler.ts @@ -1,7 +1,7 @@ -import {getLinkMenuItems} from '@shm/app/editor/blocknote/core' -import {linkMenuPluginKey} from '@shm/app/editor/blocknote/core/extensions/LinkMenu/LinkMenuPlugin' -import {fetchWebLink} from '@shm/app/models/web-links' -import {AppQueryClient} from '@shm/app/query-client' +import {getLinkMenuItems} from '@shm/desktop/src/editor/blocknote/core' +import {linkMenuPluginKey} from '@shm/desktop/src/editor/blocknote/core/extensions/LinkMenu/LinkMenuPlugin' +import {fetchWebLink} from '@shm/desktop/src/models/web-links' +import type {AppQueryClient} from '@shm/desktop/src/query-client' import { GRPCClient, StateStream, diff --git a/frontend/packages/app/editor/tiptap-extension-link/index.ts b/frontend/apps/desktop/src/editor/tiptap-extension-link/index.ts similarity index 100% rename from frontend/packages/app/editor/tiptap-extension-link/index.ts rename to frontend/apps/desktop/src/editor/tiptap-extension-link/index.ts diff --git a/frontend/packages/app/editor/tiptap-extension-link/link.ts b/frontend/apps/desktop/src/editor/tiptap-extension-link/link.ts similarity index 100% rename from frontend/packages/app/editor/tiptap-extension-link/link.ts rename to frontend/apps/desktop/src/editor/tiptap-extension-link/link.ts diff --git a/frontend/packages/app/editor/use-popover-state.ts b/frontend/apps/desktop/src/editor/use-popover-state.ts similarity index 100% rename from frontend/packages/app/editor/use-popover-state.ts rename to frontend/apps/desktop/src/editor/use-popover-state.ts diff --git a/frontend/packages/app/editor/utils.ts b/frontend/apps/desktop/src/editor/utils.ts similarity index 100% rename from frontend/packages/app/editor/utils.ts rename to frontend/apps/desktop/src/editor/utils.ts diff --git a/frontend/packages/app/editor/video.tsx b/frontend/apps/desktop/src/editor/video.tsx similarity index 86% rename from frontend/packages/app/editor/video.tsx rename to frontend/apps/desktop/src/editor/video.tsx index f09f135ddc..c124901c68 100644 --- a/frontend/packages/app/editor/video.tsx +++ b/frontend/apps/desktop/src/editor/video.tsx @@ -1,17 +1,17 @@ -import {isValidUrl, youtubeParser} from '@shm/app/editor/utils' -import {API_FILE_URL} from '@shm/shared' -import {ResizeHandle, SizableText, XStack, useTheme} from '@shm/ui' -import {useEffect, useState} from 'react' -import {RiVideoAddLine} from 'react-icons/ri' +import { isValidUrl, youtubeParser } from '@shm/desktop/src/editor/utils' +import { API_FILE_URL } from '@shm/shared' +import { ResizeHandle, SizableText, XStack, useTheme } from '@shm/ui' +import { useEffect, useState } from 'react' +import { RiVideoAddLine } from 'react-icons/ri' import { Block, BlockNoteEditor, createReactBlockSpec, defaultProps, } from './blocknote' -import {MediaContainer} from './media-container' -import {DisplayComponentProps, MediaRender, MediaType} from './media-render' -import {HMBlockSchema} from './schema' +import { MediaContainer } from './media-container' +import { DisplayComponentProps, MediaRender, MediaType } from './media-render' +import { HMBlockSchema } from './schema' export const getSourceType = (name: string) => { const nameArray = name.split('.') @@ -55,13 +55,13 @@ export const VideoBlock = createReactBlockSpec({ { tag: 'video[src]', getAttrs: (element) => { - return {src: element.getAttribute('src')} + return { src: element.getAttribute('src') } }, }, { tag: 'iframe', getAttrs: (element) => { - return {src: element.getAttribute('src')} + return { src: element.getAttribute('src') } }, }, ], @@ -80,20 +80,19 @@ const Render = ( if (ytId) { embedUrl = embedUrl + ytId } else { - setFileName({name: `Unsupported Youtube Url:${url}`, color: 'red'}) + setFileName({ name: `Unsupported Youtube Url:${url}`, color: 'red' }) return } } else if (url.includes('vimeo')) { const urlArray = url.split('/') - embedUrl = `https://player.vimeo.com/video/${ - urlArray[urlArray.length - 1] - }` + embedUrl = `https://player.vimeo.com/video/${urlArray[urlArray.length - 1] + }` } else { - setFileName({name: 'Unsupported video source.', color: 'red'}) + setFileName({ name: 'Unsupported video source.', color: 'red' }) return } - assign({props: {url: embedUrl}} as MediaType) - } else setFileName({name: 'The provided URL is invalid.', color: 'red'}) + assign({ props: { url: embedUrl } } as MediaType) + } else setFileName({ name: 'The provided URL is invalid.', color: 'red' }) const cursorPosition = editor.getTextCursorPosition() editor.focus() if (cursorPosition.block.id === block.id) { @@ -101,7 +100,7 @@ const Render = ( editor.setTextCursorPosition(cursorPosition.nextBlock, 'start') else { editor.insertBlocks( - [{type: 'paragraph', content: ''}], + [{ type: 'paragraph', content: '' }], block.id, 'after', ) @@ -141,10 +140,10 @@ const display = ({ const [showHandle, setShowHandle] = useState(false) let resizeParams: | { - handleUsed: 'left' | 'right' - initialWidth: number - initialClientX: number - } + handleUsed: 'left' | 'right' + initialWidth: number + initialClientX: number + } | undefined useEffect(() => { diff --git a/frontend/packages/app/editor/web-embed.tsx b/frontend/apps/desktop/src/editor/web-embed.tsx similarity index 83% rename from frontend/packages/app/editor/web-embed.tsx rename to frontend/apps/desktop/src/editor/web-embed.tsx index 627807388b..5a69af5c3b 100644 --- a/frontend/packages/app/editor/web-embed.tsx +++ b/frontend/apps/desktop/src/editor/web-embed.tsx @@ -1,7 +1,7 @@ -import {isValidUrl} from '@shm/app/editor/utils' -import {useOpenUrl} from '@shm/desktop/src/open-url' -import {TwitterXIcon, XPostNotFound, XPostSkeleton, useTheme} from '@shm/ui' -import {Fragment} from '@tiptap/pm/model' +import { isValidUrl } from '@shm/desktop/src/editor/utils' +import { useOpenUrl } from '@shm/desktop/src/open-url' +import { TwitterXIcon, XPostNotFound, XPostSkeleton, useTheme } from '@shm/ui' +import { Fragment } from '@tiptap/pm/model' import { QuotedTweet, TweetBody, @@ -18,9 +18,9 @@ import { createReactBlockSpec, defaultProps, } from './blocknote' -import {MediaContainer} from './media-container' -import {DisplayComponentProps, MediaRender, MediaType} from './media-render' -import {HMBlockSchema} from './schema' +import { MediaContainer } from './media-container' +import { DisplayComponentProps, MediaRender, MediaType } from './media-render' +import { HMBlockSchema } from './schema' export const WebEmbed = createReactBlockSpec({ type: 'web-embed', @@ -64,7 +64,7 @@ const Render = ( const submitTwitterLink = (url: string, assign: any, setFileName: any) => { if (isValidUrl(url)) { if (url.includes('twitter') || url.includes('x.com')) { - assign({props: {url: url}} as MediaType) + assign({ props: { url: url } } as MediaType) } else { setFileName({ name: `The provided URL is not a twitter URL`, @@ -72,7 +72,7 @@ const Render = ( }) return } - } else setFileName({name: 'The provided URL is invalid.', color: 'red'}) + } else setFileName({ name: 'The provided URL is invalid.', color: 'red' }) const cursorPosition = editor.getTextCursorPosition() editor.focus() if (cursorPosition.block.id === block.id) { @@ -80,7 +80,7 @@ const Render = ( editor.setTextCursorPosition(cursorPosition.nextBlock, 'start') else { editor.insertBlocks( - [{type: 'paragraph', content: ''}], + [{ type: 'paragraph', content: '' }], block.id, 'after', ) @@ -112,7 +112,7 @@ const display = ({ }: DisplayComponentProps) => { const urlArray = block.props.url.split('/') const xPostId = urlArray[urlArray.length - 1].split('?')[0] - const {data, error, isLoading} = useTweet(xPostId) + const { data, error, isLoading } = useTweet(xPostId) const openUrl = useOpenUrl() let xPostContent diff --git a/frontend/packages/app/errors.tsx b/frontend/apps/desktop/src/errors.tsx similarity index 100% rename from frontend/packages/app/errors.tsx rename to frontend/apps/desktop/src/errors.tsx diff --git a/frontend/apps/desktop/src/find-in-page.tsx b/frontend/apps/desktop/src/find-in-page.tsx index 44466ff334..cf72651655 100644 --- a/frontend/apps/desktop/src/find-in-page.tsx +++ b/frontend/apps/desktop/src/find-in-page.tsx @@ -1,4 +1,4 @@ -import { StyleProvider } from '@shm/app/app-context' +import { StyleProvider } from '@shm/desktop/src/app-context-provider' import { useStream } from '@shm/ui' import '@tamagui/core/reset.css' import '@tamagui/font-inter/css/400.css' diff --git a/frontend/apps/desktop/src/ipc.ts b/frontend/apps/desktop/src/ipc.ts index 679ea3661e..7508430105 100644 --- a/frontend/apps/desktop/src/ipc.ts +++ b/frontend/apps/desktop/src/ipc.ts @@ -1,6 +1,6 @@ -import {AppIPC} from '@shm/app/app-ipc' +import {AppIPC} from '@shm/desktop/src/app-ipc' -import {decodeRouteFromPath} from '@shm/app/utils/route-encoding' +import {decodeRouteFromPath} from '@shm/desktop/src/utils/route-encoding' import {client} from './trpc' export function createIPC(): AppIPC { diff --git a/frontend/apps/desktop/src/main.ts b/frontend/apps/desktop/src/main.ts index 1c0bc88cd5..61cf08a842 100644 --- a/frontend/apps/desktop/src/main.ts +++ b/frontend/apps/desktop/src/main.ts @@ -1,6 +1,6 @@ import * as Sentry from '@sentry/electron/main' -import { defaultRoute } from '@shm/app/utils/routes' -import { ELECTRON_HTTP_PORT, IS_PROD_DESKTOP } from '@shm/shared' +import {defaultRoute} from '@shm/desktop/src/utils/routes' +import {ELECTRON_HTTP_PORT, IS_PROD_DESKTOP} from '@shm/shared' import { BrowserWindow, Menu, @@ -10,6 +10,7 @@ import { nativeTheme, shell, } from 'electron' + import contextMenu from 'electron-context-menu' import log from 'electron-log/main' import squirrelStartup from 'electron-squirrel-startup' @@ -20,14 +21,18 @@ import { openInitialWindows, trpc, } from './app-api' -import { createAppMenu } from './app-menu' -import { startMetricsServer } from './app-metrics' -import { initPaths } from './app-paths' -import { APP_AUTO_UPDATE_PREFERENCE } from './app-settings' -import { appStore } from './app-store' +import {createAppMenu} from './app-menu' +import {startMetricsServer} from './app-metrics' +import {initPaths} from './app-paths' + +import {APP_AUTO_UPDATE_PREFERENCE} from './app-settings' +import {appStore} from './app-store' import autoUpdate from './auto-update' -import { startMainDaemon } from './daemon' -import { saveCidAsFile } from './save-cid-as-file' +import {startMainDaemon} from './daemon' +import {saveCidAsFile} from './save-cid-as-file' + +// @ts-ignore +global.electronTRPC = {} const OS_REGISTER_SCHEME = 'hm' diff --git a/frontend/packages/app/models/accounts.ts b/frontend/apps/desktop/src/models/accounts.ts similarity index 94% rename from frontend/packages/app/models/accounts.ts rename to frontend/apps/desktop/src/models/accounts.ts index 95817e2732..4e04398619 100644 --- a/frontend/packages/app/models/accounts.ts +++ b/frontend/apps/desktop/src/models/accounts.ts @@ -1,8 +1,8 @@ import {ConnectError} from '@connectrpc/connect' -import {useGRPCClient, useQueryInvalidator} from '@shm/app/app-context' -import appError from '@shm/app/errors' -import {useDaemonInfo} from '@shm/app/models/daemon' -import {queryKeys} from '@shm/app/models/query-keys' +import {useGRPCClient, useQueryInvalidator} from '@shm/desktop/src/app-context' +import appError from '@shm/desktop/src/errors' +import {useDaemonInfo} from '@shm/desktop/src/models/daemon' +import {queryKeys} from '@shm/desktop/src/models/query-keys' import {GRPCClient, HMAccount, Profile, hmAccount} from '@shm/shared' import { UseMutationOptions, diff --git a/frontend/packages/app/models/app-settings.ts b/frontend/apps/desktop/src/models/app-settings.ts similarity index 100% rename from frontend/packages/app/models/app-settings.ts rename to frontend/apps/desktop/src/models/app-settings.ts diff --git a/frontend/packages/app/models/changes.ts b/frontend/apps/desktop/src/models/changes.ts similarity index 100% rename from frontend/packages/app/models/changes.ts rename to frontend/apps/desktop/src/models/changes.ts diff --git a/frontend/packages/app/models/comments.ts b/frontend/apps/desktop/src/models/comments.ts similarity index 98% rename from frontend/packages/app/models/comments.ts rename to frontend/apps/desktop/src/models/comments.ts index ed48821f02..d43f07331d 100644 --- a/frontend/packages/app/models/comments.ts +++ b/frontend/apps/desktop/src/models/comments.ts @@ -1,7 +1,7 @@ -import {useAppContext} from '@shm/app/app-context' -import {createHypermediaDocLinkPlugin} from '@shm/app/editor' -import {slashMenuItems} from '@shm/app/src/slash-menu-items' +import {useAppContext} from '@shm/desktop/src/app-context' +import {createHypermediaDocLinkPlugin} from '@shm/desktop/src/editor' import {useOpenUrl} from '@shm/desktop/src/open-url' +import {slashMenuItems} from '@shm/desktop/src/slash-menu-items' import {client, trpc} from '@shm/desktop/src/trpc' import { HMComment, diff --git a/frontend/packages/app/models/contacts.ts b/frontend/apps/desktop/src/models/contacts.ts similarity index 97% rename from frontend/packages/app/models/contacts.ts rename to frontend/apps/desktop/src/models/contacts.ts index f6e5ad56c3..537d8794e6 100644 --- a/frontend/packages/app/models/contacts.ts +++ b/frontend/apps/desktop/src/models/contacts.ts @@ -1,4 +1,3 @@ -import {queryKeys} from '@shm/app/models/query-keys' import {Device} from '@shm/shared' import {UseMutationOptions, useMutation} from '@tanstack/react-query' import {decompressFromEncodedURIComponent} from 'lz-string' @@ -6,7 +5,7 @@ import {useGRPCClient, useQueryInvalidator} from '../app-context' import appError from '../errors' import {useAccount} from './accounts' import {useConnectedPeers} from './networking' -import {fullInvalidate} from './query-keys' +import {fullInvalidate, queryKeys} from './query-keys' export function useConnectionSummary() { const peerInfo = useConnectedPeers({ diff --git a/frontend/packages/app/models/content-graph.ts b/frontend/apps/desktop/src/models/content-graph.ts similarity index 100% rename from frontend/packages/app/models/content-graph.ts rename to frontend/apps/desktop/src/models/content-graph.ts diff --git a/frontend/apps/desktop/src/models/daemon.ts b/frontend/apps/desktop/src/models/daemon.ts index 5b09be41be..dea90072d1 100644 --- a/frontend/apps/desktop/src/models/daemon.ts +++ b/frontend/apps/desktop/src/models/daemon.ts @@ -1,6 +1,65 @@ -import {useGRPCClient} from '@shm/app/app-context' -import {queryKeys} from '@shm/app/models/query-keys' +import {useGRPCClient} from '@shm/desktop/src/app-context' import {useQuery} from '@tanstack/react-query' +import {queryKeys} from './query-keys' + +import {GRPCClient, Info} from '@shm/shared' +import { + FetchQueryOptions, + UseMutationOptions, + UseQueryOptions, + useMutation, +} from '@tanstack/react-query' + +function queryDaemonInfo( + grpcClient: GRPCClient, + opts: UseQueryOptions | FetchQueryOptions = {}, +): UseQueryOptions | FetchQueryOptions { + return { + ...opts, + queryKey: [queryKeys.GET_DAEMON_INFO], + queryFn: async () => { + try { + return await grpcClient.daemon.getInfo({}) + } catch (error) { + if (error) { + console.log('error check make sure not set up condition..', error) + } + } + return null + }, + refetchInterval: 10_000, + useErrorBoundary: false, + } +} +export function useDaemonInfo(opts: UseQueryOptions = {}) { + const grpcClient = useGRPCClient() + return useQuery(queryDaemonInfo(grpcClient, opts)) +} + +export function useMnemonics() { + const grpcClient = useGRPCClient() + return useQuery({ + queryKey: ['onboarding', 'mnemonics'], + queryFn: async () => { + const data = await grpcClient.daemon.genMnemonic({}) + return data.mnemonic + }, + refetchOnReconnect: false, + refetchOnWindowFocus: false, + }) +} + +export function useAccountRegistration( + opts?: UseMutationOptions, +) { + const grpcClient = useGRPCClient() + return useMutation({ + mutationFn: async (words: string[]) => { + await grpcClient.daemon.register({mnemonic: words}) + }, + ...opts, + }) +} export function useAccountKeys() { const client = useGRPCClient() diff --git a/frontend/apps/desktop/src/models/documents.ts b/frontend/apps/desktop/src/models/documents.ts index 5f2c935935..c267240a0c 100644 --- a/frontend/apps/desktop/src/models/documents.ts +++ b/frontend/apps/desktop/src/models/documents.ts @@ -1,8 +1,1519 @@ -import {toPlainMessage} from '@bufbuild/protobuf' -import {useGRPCClient} from '@shm/app/app-context' -import {queryKeys} from '@shm/app/models/query-keys' -import {GRPCClient, HMDocument} from '@shm/shared' -import {useQueries, useQuery, UseQueryOptions} from '@tanstack/react-query' +import {Timestamp, toPlainMessage} from '@bufbuild/protobuf' +import { + useAppContext, + useGRPCClient, + useQueryInvalidator, +} from '@shm/desktop/src/app-context' +import {createHypermediaDocLinkPlugin} from '@shm/desktop/src/editor' +import { + useAccounts, + useAllAccounts, + useMyAccount, +} from '@shm/desktop/src/models/accounts' +import {queryKeys} from '@shm/desktop/src/models/query-keys' +import {useOpenUrl} from '@shm/desktop/src/open-url' +import {slashMenuItems} from '@shm/desktop/src/slash-menu-items' +import {trpc} from '@shm/desktop/src/trpc' +import { + Document, + DocumentChange, + GRPCClient, + HMAccount, + HMBlock, + HMBlockNode, + HMDocument, + HMPublication, + ListPublicationsResponse, + UnpackedHypermediaId, + fromHMBlock, + hmDocument, + hmPublication, + toHMBlock, + unpackDocId, + unpackHmId, + writeableStateStream, +} from '@shm/shared' +import {UpdateDraftResponse} from '@shm/shared/src/client/.generated/documents/v1alpha/documents_pb' +import { + FetchQueryOptions, + UseInfiniteQueryOptions, + UseMutationOptions, + UseQueryOptions, + useInfiniteQuery, + useMutation, + useQueries, + useQuery, +} from '@tanstack/react-query' +import {Extension, findParentNode} from '@tiptap/core' +import {NodeSelection} from '@tiptap/pm/state' +import {useMachine} from '@xstate/react' +import _ from 'lodash' +import {useEffect, useMemo, useRef, useState} from 'react' +import {ContextFrom, fromPromise} from 'xstate' +import { + BlockNoteEditor, + Block as EditorBlock, + hmBlockSchema, + useBlockNote, +} from '../editor' +import {useNavRoute} from '../utils/navigation' +import {pathNameify} from '../utils/path' +import {NavRoute} from '../utils/routes' +import {useNavigate} from '../utils/useNavigate' +import {DraftStatusContext, draftMachine} from './draft-machine' +import {getBlockGroup, setGroupTypes} from './editor-utils' +import {useGatewayUrl, useGatewayUrlStream} from './gateway-settings' +import {useInlineMentions} from './search' + +export function usePublicationList( + opts?: UseInfiniteQueryOptions & { + trustedOnly: boolean + }, +) { + const {trustedOnly, ...queryOpts} = opts || {} + const grpcClient = useGRPCClient() + const pubListQuery = useInfiniteQuery({ + ...queryOpts, + queryKey: [queryKeys.DOCUMENT_LIST, trustedOnly ? 'trusted' : 'global'], + refetchOnMount: true, + queryFn: async (context) => { + const result = await grpcClient.publications.listPublications({ + trustedOnly: trustedOnly, + pageSize: 50, + pageToken: context.pageParam, + }) + const publications = result.publications || [] + + return { + ...result, + publications, + } + }, + getNextPageParam: (lastPage) => { + return lastPage.nextPageToken + }, + }) + + const allPublications = + pubListQuery.data?.pages.flatMap((page) => page.publications) || [] + return { + ...pubListQuery, + data: { + ...pubListQuery.data, + publications: allPublications, + }, + } +} + +export function usePublicationFullList( + opts?: UseInfiniteQueryOptions & { + trustedOnly: boolean + }, +) { + const pubList = usePublicationList(opts) + const accounts = useAllAccounts() + const data = useMemo(() => { + function lookupAccount(accountId: string | undefined) { + if (!accountId) return undefined + return accounts.data?.accounts.find((acc) => acc.id === accountId) + } + return pubList.data?.publications.map((pub) => { + return { + publication: pub, + author: lookupAccount(pub?.document?.author), + editors: pub?.document?.editors?.map(lookupAccount) || [], + } + }) + }, [pubList.data, accounts.data]) + return {...pubList, data} +} + +export function useDraftList( + opts: UseQueryOptions = {}, +) { + const grpcClient = useGRPCClient() + const draftListQuery = useInfiniteQuery({ + queryKey: [queryKeys.GET_DRAFT_LIST], + refetchOnMount: true, + queryFn: async (context) => { + const result = await grpcClient.drafts.listDrafts({ + pageToken: context.pageParam, + pageSize: 2000000, // temp large page size because we do not paginate drafts from the frontend + }) + + const documents = + result.documents.sort((a, b) => + sortDocuments(a.updateTime, b.updateTime), + ) || [] + return { + ...result, + documents: documents.map(hmDocument), + } + }, + getNextPageParam: (lastPage) => { + return lastPage.nextPageToken || undefined + }, + ...opts, + }) + + const allDrafts = + draftListQuery.data?.pages.flatMap((page) => page.documents) || [] + + return { + ...draftListQuery, + data: { + ...draftListQuery.data, + documents: allDrafts, + }, + } +} + +export function useDeleteDraft( + opts: UseMutationOptions, +) { + const {queryClient} = useAppContext() + const grpcClient = useGRPCClient() + const invalidate = useQueryInvalidator() + return useMutation({ + ...opts, + mutationFn: async (documentId) => { + await grpcClient.drafts.deleteDraft({documentId}) + }, + onSuccess: (response, documentId, context) => { + setTimeout(() => { + invalidate([queryKeys.GET_DRAFT_LIST]) + invalidate([queryKeys.DOCUMENT_DRAFTS, documentId]) + invalidate([queryKeys.ENTITY_TIMELINE, documentId]) + invalidate([queryKeys.EDITOR_DRAFT, documentId]) + queryClient.client.removeQueries([queryKeys.EDITOR_DRAFT, documentId]) + }, 200) + opts?.onSuccess?.(response, documentId, context) + }, + }) +} + +export function usePublication( + { + id, + version, + }: { + id?: string + version?: string + }, + options?: UseQueryOptions, +) { + const grpcClient = useGRPCClient() + return useQuery({ + ...queryPublication(grpcClient, id, version), + ...(options || {}), + }) +} + +export function usePublications( + pubs: { + id?: string + version?: string | null + }[], + options?: UseQueryOptions, +) { + const grpcClient = useGRPCClient() + return useQueries({ + queries: pubs.map((pub) => + queryPublication(grpcClient, pub.id, pub.version || undefined), + ), + ...(options || {}), + }) +} + +export function queryPublication( + grpcClient: GRPCClient, + documentId?: string, + versionId?: string, +): UseQueryOptions | FetchQueryOptions { + return { + queryKey: [queryKeys.DOCUMENT, documentId, versionId], + enabled: !!documentId, + // retry: false, // to test error handling faster + // default is 5. the backend waits ~1s for discovery, so we retry for a little while in case document is on its way. + retry: 10, + // about 15 seconds total right now + queryFn: async () => { + const pub = await grpcClient.publications.getPublication({ + documentId, + version: versionId, + }) + const hmPub = hmPublication(pub) + if (!hmPub) throw new Error('Failed to produce HMPublication') + return hmPub + }, + } +} + +type ListedEmbed = { + blockId: string + ref: string + refId: UnpackedHypermediaId +} + +function extractRefs( + children: HMBlockNode[], + skipCards?: boolean, +): ListedEmbed[] { + let refs: ListedEmbed[] = [] + function extractRefsFromBlock(block: HMBlockNode) { + if (block.block?.type === 'embed' && block.block.ref) { + if (block.block.attributes?.view === 'card' && skipCards) return + const refId = unpackHmId(block.block.ref) + if (refId) + refs.push({ + blockId: block.block.id, + ref: block.block.ref, + refId, + }) + } + if (block.children) { + block.children.forEach(extractRefsFromBlock) + } + } + children.forEach(extractRefsFromBlock) + // console.log('extractRefs', children, refs) + return refs +} + +export type EmbedsContent = Record< + string, + | { + type: 'd' + data: HMPublication + query: {refId: UnpackedHypermediaId; blockId: string} + } + | { + type: 'a' + data: HMAccount + query: {refId: UnpackedHypermediaId; blockId: string} + } + | undefined +> + +export function useDocumentEmbeds( + doc: HMDocument | undefined, + enabled?: boolean, + opts?: {skipCards: boolean}, +): EmbedsContent { + const {queryPublications, queryGroups, queryAccounts} = useMemo(() => { + if (!enabled) + return {queryPublications: [], queryGroups: [], queryAccounts: []} + const queryPublications: { + blockId: string + refId: UnpackedHypermediaId + }[] = [] + const queryAccounts: {blockId: string; refId: UnpackedHypermediaId}[] = [] + const queryGroups: { + blockId: string + refId: UnpackedHypermediaId + }[] = [] + extractRefs(doc?.children || [], opts?.skipCards).forEach( + ({refId, blockId}) => { + if (refId.type === 'a') { + queryAccounts.push({blockId, refId}) + } else if (refId.type === 'd') { + queryPublications.push({blockId, refId}) + } + }, + ) + return { + queryPublications, + queryGroups, + queryAccounts, + } + }, [doc, enabled]) + const pubs = usePublications( + queryPublications.map((q) => ({id: q.refId.qid, version: q.refId.version})), + ) + const accounts = useAccounts(queryAccounts.map((q) => q.refId.eid)) + const embeds = Object.fromEntries([ + ...pubs.map((pub, idx) => [ + queryPublications[idx].blockId, + {type: 'd', query: queryPublications[idx], data: pub.data}, + ]), + ...accounts.map((account, idx) => [ + queryAccounts[idx].blockId, + {type: 'a', query: queryAccounts[idx], data: account.data}, + ]), + ]) as EmbedsContent + return embeds +} + +export function useDocumentVersions( + documentId: string | undefined, + versions: string[], +) { + const grpcClient = useGRPCClient() + return useQueries({ + queries: versions.map((version) => + queryPublication(grpcClient, documentId, version), + ), + }) +} +// TODO: Duplicate (apps/site/server/routers/_app.ts#~187) +export function sortDocuments(a?: Timestamp, b?: Timestamp) { + let dateA = a ? a.toDate() : 0 + let dateB = b ? b.toDate() : 1 + + // @ts-ignore + return dateB - dateA +} + +export function getDefaultShortname( + docTitle: string | undefined, + docId: string, +) { + const unpackedId = unpackDocId(docId) + const idShortname = unpackedId ? unpackedId.eid.slice(0, 5).toLowerCase() : '' + const kebabName = docTitle ? pathNameify(docTitle) : idShortname + const shortName = + kebabName.length > 40 ? kebabName.substring(0, 40) : kebabName + return shortName +} + +function useDraftDiagnosis() { + const appendDraft = trpc.diagnosis.appendDraftLog.useMutation() + const completeDraft = trpc.diagnosis.completeDraftLog.useMutation() + return { + append(draftId, event) { + return appendDraft.mutateAsync({draftId, event}) + }, + complete(draftId, event) { + return completeDraft.mutateAsync({draftId, event}) + }, + } +} + +function changesToJSON(changes: DocumentChange[]) { + return changes.map((change) => { + if (change.op.case === 'replaceBlock') { + return {...change.op} + } + return change.op + }) +} + +export function usePublishDraft( + opts?: UseMutationOptions< + { + pub: Document + isFirstPublish: boolean + isProfileDocument: boolean + }, + unknown, + { + draftId: string + } + >, +) { + const queryClient = useAppContext().queryClient + const markDocPublish = trpc.welcoming.markDocPublish.useMutation() + const grpcClient = useGRPCClient() + const route = useNavRoute() + const draftRoute = route.key === 'draft' ? route : undefined + const myAccount = useMyAccount() + const isProfileDocument = + draftRoute?.isProfileDocument || + myAccount.data?.profile?.rootDocument === draftRoute?.draftId + const {client, invalidate} = queryClient + const diagnosis = useDraftDiagnosis() + return useMutation({ + ...opts, + mutationFn: async ({ + draftId, + }: { + draftId: string + }): Promise<{ + pub: Document + isFirstPublish: boolean + isProfileDocument: boolean + }> => { + const pub = await grpcClient.drafts.publishDraft({documentId: draftId}) + await diagnosis.complete(draftId, { + key: 'did.publishDraft', + value: hmPublication(pub), + }) + const isFirstPublish = await markDocPublish.mutateAsync(draftId) + const publishedId = pub.document?.id + if (!publishedId) + throw new Error('Could not get ID of published document') + if (isProfileDocument) { + if (myAccount.data?.profile?.rootDocument !== publishedId) { + await grpcClient.accounts.updateProfile({ + ...myAccount.data?.profile, + rootDocument: publishedId, + }) + } + } + return {isFirstPublish, pub, isProfileDocument} + }, + onSuccess: (result, variables, context) => { + const documentId = result.pub.document?.id + opts?.onSuccess?.(result, variables, context) + invalidate([queryKeys.FEED_LATEST_EVENT]) + invalidate([queryKeys.RESOURCE_FEED_LATEST_EVENT]) + invalidate([queryKeys.DOCUMENT_LIST]) + invalidate([queryKeys.GET_DRAFT_LIST]) + invalidate([queryKeys.DOCUMENT_DRAFTS, documentId]) + invalidate([queryKeys.DOCUMENT, documentId]) + invalidate([queryKeys.ENTITY_TIMELINE, documentId]) + invalidate([queryKeys.GET_ALL_ACCOUNTS]) // accounts invalidate because profile doc may be updated + invalidate([queryKeys.GET_ACCOUNT, myAccount.data?.id]) + invalidate([queryKeys.ENTITY_CITATIONS]) + setTimeout(() => { + client.removeQueries([queryKeys.EDITOR_DRAFT, documentId]) + // otherwise it will re-query for a draft that no longer exists and an error happens + }, 250) + }, + }) +} + +export type EditorDraftState = { + id: string + children: Array + title: string + changes: DraftChangesState + webUrl: string + updatedAt: any +} + +export function useDraftTitle( + input: UseQueryOptions & {documentId?: string | undefined}, +) { + const draft = useDraft({documentId: input.documentId}) + return draft.data?.title || undefined +} + +type DraftChangesState = { + moves: MoveBlockAction[] + changed: Set + deleted: Set + webUrl?: string +} + +type MoveBlockAction = { + blockId: string + leftSibling: string + parent: string +} + +export function useDraft({ + draftId, + ...options +}: UseQueryOptions & { + draftId?: string +}) { + const grpcClient = useGRPCClient() + const diagnosis = useDraftDiagnosis() + return useQuery(queryDraft({draftId, grpcClient, diagnosis, ...options})) +} + +export function useDrafts( + ids: string[], + options?: UseQueryOptions, +) { + const grpcClient = useGRPCClient() + return useQueries({ + queries: ids.map((draftId) => queryDraft({draftId: draftId, grpcClient})), + ...(options || {}), + }) +} + +export function queryDraft({ + draftId, + grpcClient, + diagnosis, + ...options +}: { + draftId?: string + grpcClient: GRPCClient + diagnosis?: ReturnType +} & UseQueryOptions): UseQueryOptions { + return { + enabled: !!draftId, + queryKey: [queryKeys.EDITOR_DRAFT, draftId], + useErrorBoundary: false, + queryFn: async () => { + try { + let serverDraft = await grpcClient.drafts.getDraft({ + draftId, + }) + + // const doc = serverDraft + const doc = serverDraft ? hmDocument(serverDraft) : null + + diagnosis?.append(draftId!, { + key: 'getDraft', + value: doc, + }) + + return doc + } catch (error) { + diagnosis?.append(draftId!, { + key: 'getDraftError', + value: JSON.stringify(error), + }) + return null + } + }, + ...options, + } +} + +/** + * + * Draft Machine logic + * + * - initialize machine with all the context data: + * - draft: Document + * - + * - fetch draft + * - Error: show draft error (maybe retry or do extra checks before showing the error) + * - OK: + */ + +export function useDraftEditor({ + documentId, + route, + checkWebUrl, +}: { + documentId?: string + route: NavRoute + checkWebUrl: any +}) { + const grpcClient = useGRPCClient() + const openUrl = useOpenUrl() + const replace = useNavigate('replace') + const queryClient = useAppContext().queryClient + const {invalidate, client} = queryClient + const diagnosis = useDraftDiagnosis() + const gotEdited = useRef(false) + const {inlineMentionsData, inlineMentionsQuery} = useInlineMentions() + const [writeEditorStream, editorStream] = useRef( + writeableStateStream(null), + ).current + const showNostr = trpc.experiments.get.useQuery().data?.nostr + + // fetch draft + const backendDraft = useDraft({ + documentId, + onError: (error) => { + send({type: 'GET.DRAFT.ERROR', error}) + }, + }) + + const draftStatusActor = DraftStatusContext.useActorRef() + + const [state, send, actor] = useMachine( + draftMachine.provide({ + actions: { + populateEditor: ({event}) => { + if ( + event.type == 'GET.DRAFT.SUCCESS' && + event.draft.children?.length + ) { + let editorBlocks = toHMBlock(event.draft.children) + const tiptap = editor?._tiptapEditor + // editor.removeBlocks(editor.topLevelBlocks) + editor.replaceBlocks(editor.topLevelBlocks, editorBlocks) + // this is a hack to set the current blockGroups in the editor to the correct type, because from the BN API we don't have access to those nodes. + setGroupTypes(tiptap, editorBlocks) + } + }, + focusEditor: () => { + const tiptap = editor?._tiptapEditor + if (tiptap && !tiptap.isFocused) { + editor._tiptapEditor.commands.focus() + } + }, + onSaveSuccess: ({event}) => { + // because this action is called as a result of a promised actor, that's why there are errors and is not well typed + // @ts-expect-error + if (event.output) { + invalidate([queryKeys.GET_DRAFT_LIST]) + invalidate([queryKeys.DOCUMENT_DRAFTS, documentId]) + invalidate([queryKeys.EDITOR_DRAFT, documentId]) + } + }, + indicatorChange: () => + draftStatusActor.send({type: 'INDICATOR.CHANGE'}), + indicatorSaving: () => + draftStatusActor.send({type: 'INDICATOR.SAVING'}), + indicatorSaved: () => draftStatusActor.send({type: 'INDICATOR.SAVED'}), + indicatorError: () => draftStatusActor.send({type: 'INDICATOR.ERROR'}), + indicatorIdle: () => draftStatusActor.send({type: 'INDICATOR.IDLE'}), + resetDraftAndRedirectToDraftList: () => { + try { + grpcClient.drafts + .deleteDraft({documentId}) + .catch((error) => { + diagnosis?.append(documentId!, { + key: 'deleteDraft', + value: `Error deleting draft ${documentId}: ${error.message}`, + }) + }) + .then(() => { + diagnosis?.append(documentId!, { + key: 'deleteDraft', + value: `Delete draft ${documentId} success`, + }) + invalidate([queryKeys.GET_DRAFT_LIST]) + invalidate([queryKeys.DOCUMENT_DRAFTS, documentId]) + }) + } catch (error) { + diagnosis?.append(documentId!, { + key: 'deleteDraft', + value: `Error deleting draft ${documentId}: ${error.message}`, + }) + } + + replace({key: 'feed', tab: 'trusted'}) + }, + }, + actors: { + updateDraft: fromPromise< + UpdateDraftResponse | string, + ContextFrom + >(async ({input}) => { + // delay the time we save to the backend to force editor changes. + // await delay(0) + return updateDraft({ + editor, + blocksMap: input.blocksMap, + title: input.title, + draft: input.draft, + }) + }), + restoreDraft: fromPromise< + UpdateDraftResponse | string, + ContextFrom + >(async ({input}) => { + const prevDraft = input.draft ? hmDocument(input.draft) : null + if (!prevDraft) throw new Error('Expecting previous draft to restore') + if (!prevDraft.children) + throw new Error('Expecting previous draft with children to restore') + const prevBlocksMap = input.blocksMap + try { + // delete draft + await grpcClient.drafts.deleteDraft({documentId}) + // create new draft + const newDraftRaw = await grpcClient.drafts.createDraft({ + existingDocumentId: documentId, + }) + const newDraft = newDraftRaw ? hmDocument(newDraftRaw) : null + + const newBlocksMap = newDraft?.children + ? createBlocksMap(newDraft.children, '') + : {} + // prevDraft is the final result I want + + let {changes, touchedBlocks} = compareDraftWithMap( + newBlocksMap, + prevDraft?.children, + '', + ) + + let deletedBlocks = extractDeletes(newBlocksMap, touchedBlocks) + + // TODO: update title too + + let capturedChanges = [...changes, ...deletedBlocks] + + if (capturedChanges.length) { + // capturedChanges = capturedChanges.map((i) => i.toJson()) + diagnosis.append(documentId, { + key: 'will.restoreDraft', + // note: 'regular updateDraft', + value: { + changes: changesToJSON(capturedChanges), + newBlocksMap, + // prevDraft, + }, + }) + + return await grpcClient.drafts + .updateDraft({ + documentId, + changes: capturedChanges, + }) + .then((res) => { + if (res.updatedDocument) { + client.setQueryData( + [queryKeys.EDITOR_DRAFT, documentId], + res.updatedDocument, + ) + } + + diagnosis.append(documentId, { + key: 'did.restoredDraft', + // note: 'regular updateDraft', + value: JSON.stringify(res), + }) + + invalidate([queryKeys.GET_DRAFT_LIST]) + invalidate([queryKeys.DOCUMENT_DRAFTS, documentId]) + + return res + }) + } + } catch (error) { + return Promise.reject(`Error restoring: ${JSON.stringify(error)}`) + } + }), + resetDraft: fromPromise< + UpdateDraftResponse | string, + ContextFrom + >(async () => { + try { + // delete draft + await grpcClient.drafts.deleteDraft({documentId}) + // create new draft + const newDraft = await grpcClient.drafts.createDraft({ + existingDocumentId: documentId, + }) + + invalidate([queryKeys.GET_DRAFT_LIST]) + invalidate([queryKeys.DOCUMENT_DRAFTS, documentId]) + + return newDraft + } catch (error) { + throw new Error(`Error resetting: ${JSON.stringify(error)}`) + } + }), + }, + delays: { + // This is the time the machine waits after the last keystroke event before starting to save. + autosaveTimeout: 500, + }, + }), + ) + + const gwUrl = useGatewayUrlStream() + + // create editor + const editor = useBlockNote({ + onEditorContentChange(editor: BlockNoteEditor) { + if (!gotEdited.current) { + gotEdited.current = true + } + + writeEditorStream(editor.topLevelBlocks) + observeBlocks( + editor, + editor.topLevelBlocks, + () => {}, + // send({type: 'CHANGE'}), + ) + send({type: 'CHANGE'}) + }, + onTextCursorPositionChange(editor: BlockNoteEditor) { + const {view} = editor._tiptapEditor + const {selection} = view.state + if ( + selection.from !== selection.to && + !(selection instanceof NodeSelection) + ) + return + const domAtPos = view.domAtPos(selection.from) + try { + const rect: DOMRect = domAtPos.node.getBoundingClientRect() + // Check if the cursor is off screen + if ((rect && rect.top < 0) || rect.bottom > window.innerHeight) { + // Scroll the cursor into view + domAtPos.node.scrollIntoView({block: 'center'}) + } + } catch {} + return + }, + + linkExtensionOptions: { + openOnClick: false, + queryClient, + grpcClient, + gwUrl, + openUrl, + checkWebUrl: checkWebUrl.mutate, + }, + onMentionsQuery: (query: string) => { + inlineMentionsQuery(query) + }, + + // onEditorReady: (e) => { + // readyThings.current[0] = e + // handleMaybeReady() + // }, + blockSchema: hmBlockSchema, + slashMenuItems: !showNostr + ? slashMenuItems.filter((item) => item.name != 'Nostr') + : slashMenuItems, + _tiptapOptions: { + extensions: [ + Extension.create({ + name: 'hypermedia-link', + addProseMirrorPlugins() { + return [ + createHypermediaDocLinkPlugin({ + queryClient, + }).plugin, + ] + }, + }), + ], + }, + }) + + useEffect(() => { + if (state.matches('fetching')) { + if (backendDraft.status == 'success' && backendDraft.data) { + send({type: 'GET.DRAFT.SUCCESS', draft: backendDraft.data}) + } else if (backendDraft.status == 'error') { + send({type: 'GET.DRAFT.ERROR', error: backendDraft.error}) + } + } + + return () => { + if (state.matches({ready: 'changed'})) { + updateDraft({ + editor, + draft: state.context.draft, + blocksMap: state.context.blocksMap, + title: state.context.title, + }).then(() => { + invalidate([queryKeys.GET_DRAFT_LIST]) + invalidate([queryKeys.DOCUMENT_DRAFTS, documentId]) + invalidate([queryKeys.EDITOR_DRAFT, documentId]) + }) + } + } + }, [backendDraft.status]) + + useEffect(() => { + if (inlineMentionsData) { + editor?.setInlineEmbedOptions(inlineMentionsData) + } + }, [inlineMentionsData]) + + useEffect(() => { + function handleSelectAll(event: KeyboardEvent) { + if (event.key == 'a' && event.metaKey) { + if (editor) { + event.preventDefault() + editor._tiptapEditor.commands.focus() + editor._tiptapEditor.commands.selectAll() + } + } + } + + window.addEventListener('keydown', handleSelectAll) + + return () => { + window.removeEventListener('keydown', handleSelectAll) + } + }, []) + + function handleFocusAtMousePos(event) { + let ttEditor = (editor as BlockNoteEditor)._tiptapEditor + let editorView = ttEditor.view + let editorRect = editorView.dom.getBoundingClientRect() + let centerEditor = editorRect.left + editorRect.width / 2 + + const pos = editorView.posAtCoords({ + left: editorRect.left + 1, + top: event.clientY + editorView.dom.offsetTop, + }) + + if (pos) { + let node = editorView.state.doc.nodeAt(pos.pos) + + let sel = Selection.near( + editorView.state.doc.resolve( + event.clientX < centerEditor ? pos.pos : pos.pos + node.nodeSize - 1, + ), + ) + + ttEditor.commands.focus() + ttEditor.commands.setTextSelection(sel) + } else { + if (event.clientY > editorRect.top) { + // this is needed because if the user clicks on one of the sides of the title we don't want to jump to the bottom of the document to focus the document. + // if the window is scrolled and the title is not visible this will not matter because a block will be at its place so the normal focus should work. + ttEditor.commands.focus() + ttEditor.commands.setTextSelection(ttEditor.state.doc.nodeSize) + } + } + } + + async function updateDraft({editor, blocksMap, draft, title}) { + let currentEditorBlocks = [...editor.topLevelBlocks] + let {changes, touchedBlocks} = compareBlocksWithMap( + editor, + blocksMap, + currentEditorBlocks, + '', + ) + + let deletedBlocks = extractDeletes(blocksMap, touchedBlocks) + + if (draft?.title != title) { + changes = [ + new DocumentChange({ + op: { + case: 'setTitle', + value: title, + }, + }), + ...changes, + ] + } + + let capturedChanges = [...changes, ...deletedBlocks] + + if (capturedChanges.length) { + // capturedChanges = capturedChanges.map((i) => i.toJson()) + diagnosis.append(documentId, { + key: 'will.updateDraft', + // note: 'regular updateDraft', + value: { + changes: changesToJSON(capturedChanges), + blocksMap, + editorState: currentEditorBlocks, + }, + }) + try { + let mutation = await grpcClient.drafts.updateDraft({ + documentId, + changes: [...capturedChanges], + }) + if (mutation.updatedDocument) { + client.setQueryData( + [queryKeys.EDITOR_DRAFT, documentId], + mutation.updatedDocument, + ) + } + + diagnosis.append(documentId, { + key: 'did.updateDraft', + // note: 'regular updateDraft', + value: JSON.stringify(mutation), + }) + + return mutation + } catch (error) { + return Promise.reject(JSON.stringify(error)) + } + } + + return Promise.resolve('No changes applied.') + } + + return { + state, + send, + actor, + draft: backendDraft.data, + editor, + editorStream, + draftStatusActor, + handleFocusAtMousePos, + } +} + +export type HyperDocsEditor = Exclude< + ReturnType['editor'], + null +> + +export const findBlock = findParentNode( + (node) => node.type.name === 'blockContainer', +) + +export function useDocTextContent(pub?: HMPublication) { + return useMemo(() => { + let res = '' + function extractContent(blocks: Array) { + blocks.forEach((bn) => { + if (res.length < 300) { + res += extractBlockText(bn) + } + }) + + return res + } + + function extractBlockText({block, children}: HMBlockNode) { + let content = '' + if (!block) return content + if (block.text) content += block.text + + if (children?.length) { + let nc = extractContent(children) + content += nc + } + + return content + } + + if (pub?.document?.children?.length) { + res = extractContent(pub.document.children) + } + + return res + }, [pub]) +} + +export type BlocksMap = Record + +export type BlocksMapItem = { + parent: string + left: string + block: HMBlock +} + +export function createBlocksMap( + blockNodes: Array = [], + parentId: string, +) { + let result: BlocksMap = {} + blockNodes.forEach((bn, idx) => { + if (bn.block?.id) { + let prevBlockNode = idx > 0 ? blockNodes[idx - 1] : undefined + + if (bn.block) { + result[bn.block.id] = { + parent: parentId, + left: + prevBlockNode && prevBlockNode.block ? prevBlockNode.block.id : '', + block: bn.block, + } + } + + if (bn.children?.length) { + // recursively call the block children and append to the result + result = {...result, ...createBlocksMap(bn.children, bn.block.id)} + } + } + }) + + return result +} + +export function usePushPublication() { + const gatewayUrl = useGatewayUrl() + const grpcClient = useGRPCClient() + return useMutation({ + mutationFn: async (docId: string) => { + if (!gatewayUrl.data) throw new Error('Cannot determine Gateway URL') + await grpcClient.publications.pushPublication({ + documentId: docId, + url: gatewayUrl.data, + }) + }, + }) +} + +export function compareBlocksWithMap( + editor: BlockNoteEditor, + blocksMap: BlocksMap, + blocks: Array, + parentId: string, +) { + let changes: Array = [] + let touchedBlocks: Array = [] + + // iterate over editor blocks + blocks.forEach((block, idx) => { + // add blockid to the touchedBlocks list to capture deletes later + touchedBlocks.push(block.id) + + // compare replace + let prevBlockState = blocksMap[block.id] + + const childGroup = getBlockGroup(editor, block.id) + + if (childGroup) { + // @ts-expect-error + block.props.childrenType = childGroup.type ? childGroup.type : 'group' + // @ts-expect-error + block.props.listLevel = childGroup.listLevel + // @ts-expect-error + if (childGroup.start) block.props.start = childGroup.start.toString() + } + let currentBlockState = fromHMBlock(block) + + if ( + !prevBlockState || + prevBlockState.block.attributes?.listLevel !== + currentBlockState.attributes.listLevel + ) { + const serverBlock = fromHMBlock(block) + + // add moveBlock change by default to all blocks + changes.push( + new DocumentChange({ + op: { + case: 'moveBlock', + value: { + blockId: block.id, + leftSibling: idx > 0 && blocks[idx - 1] ? blocks[idx - 1].id : '', + parent: parentId, + }, + }, + }), + new DocumentChange({ + op: { + case: 'replaceBlock', + value: serverBlock, + }, + }), + ) + } else { + let left = idx > 0 && blocks[idx - 1] ? blocks[idx - 1].id : '' + if (prevBlockState.left !== left || prevBlockState.parent !== parentId) { + changes.push( + new DocumentChange({ + op: { + case: 'moveBlock', + value: { + blockId: block.id, + leftSibling: left, + parent: parentId, + }, + }, + }), + ) + } + + if (!isBlocksEqual(prevBlockState.block, currentBlockState)) { + // this means is a new block and we need to also add a replaceBlock change + changes.push( + new DocumentChange({ + op: { + case: 'replaceBlock', + value: currentBlockState, + }, + }), + ) + } + } + + if (block.children.length) { + let nestedResults = compareBlocksWithMap( + editor, + blocksMap, + block.children, + block.id, + ) + changes = [...changes, ...nestedResults.changes] + touchedBlocks = [...touchedBlocks, ...nestedResults.touchedBlocks] + } + }) + + return { + changes, + touchedBlocks, + } +} + +export function compareDraftWithMap( + blocksMap: BlocksMap, + blockNodes: HMBlockNode[], + parentId: string, +) { + let changes: Array = [] + let touchedBlocks: Array = [] + + // iterate over editor blocks + blockNodes.forEach((bn, idx) => { + if (bn.block) { + // add blockid to the touchedBlocks list to capture deletes later + touchedBlocks.push(bn.block.id) + + // compare replace + let prevBlockState = blocksMap[bn.block.id] + + // TODO: get block group + + let currentBlockState = bn.block + + if (!prevBlockState) { + const serverBlock = currentBlockState + + // add moveBlock change by default to all blocks + changes.push( + new DocumentChange({ + op: { + case: 'moveBlock', + value: { + blockId: bn.block.id, + leftSibling: + idx > 0 && blockNodes[idx - 1] + ? blockNodes[idx - 1].block!.id + : '', + parent: parentId, + }, + }, + }), + new DocumentChange({ + op: { + case: 'replaceBlock', + value: serverBlock, + }, + }), + ) + } else { + let left = + idx > 0 && blockNodes[idx - 1] ? blockNodes[idx - 1].block!.id : '' + if ( + prevBlockState.left !== left || + prevBlockState.parent !== parentId + ) { + changes.push( + new DocumentChange({ + op: { + case: 'moveBlock', + value: { + blockId: bn.block.id, + leftSibling: left, + parent: parentId, + }, + }, + }), + ) + } + + if (!isBlocksEqual(prevBlockState.block, currentBlockState)) { + // this means is a new block and we need to also add a replaceBlock change + changes.push( + new DocumentChange({ + op: { + case: 'replaceBlock', + value: currentBlockState, + }, + }), + ) + } + } + + if (bn.children?.length) { + let nestedResults = compareDraftWithMap( + blocksMap, + bn.children, + bn.block.id, + ) + changes = [...changes, ...nestedResults.changes] + touchedBlocks = [...touchedBlocks, ...nestedResults.touchedBlocks] + } + } + }) + + return { + changes, + touchedBlocks, + } +} + +export function extractDeletes( + blocksMap: BlocksMap, + touchedBlocks: Array, +) { + let deletedIds = Object.keys(blocksMap).filter( + (id) => !touchedBlocks.includes(id), + ) + + return deletedIds.map( + (dId) => + new DocumentChange({ + op: { + case: 'deleteBlock', + value: dId, + }, + }), + ) +} + +export function isBlocksEqual(b1: HMBlock, b2: HMBlock): boolean { + let result = + // b1.id == b2.id && + b1.text == b2.text && + b1.ref == b2.ref && + _.isEqual(b1.annotations, b2.annotations) && + // TODO: how to correctly compare attributes??? + isBlockAttributesEqual(b1, b2) && + b1.type == b2.type + return result +} + +function isBlockAttributesEqual(b1: HMBlock, b2: HMBlock): boolean { + let a1 = b1.attributes + let a2 = b2.attributes + if (!a1 && !a2) return true + if (!a1 || !a2) return false + return ( + a1.childrenType == a2.childrenType && + a1.start == a2.start && + a1.level == a2.level && + a1.url == a2.url && + a1.size == a2.size && + a1.ref == a2.ref && + a1.language == a2.language && + a1.view == a2.view && + a1.width == a2.width + ) +} + +function observeBlocks( + editor: BlockNoteEditor, + blocks: Array>, + onChange: () => void, +) { + blocks.forEach((block, index) => { + if (block.type == 'imagePlaceholder' && block.props.src) { + editor.updateBlock(block, { + type: 'image', + props: { + src: block.props.src, + name: block.props.name, + }, + }) + onChange() + } + + if (block.children) { + observeBlocks(editor, block.children, onChange) + } + + // TODO: this code was making impossible to remove a paragraph above a media element when it was nested. This was in place because it was also impossible to add a selection above a media element when this media element was the last one in the draft. Now it seems to both cases be fixed when this code is removed. 🤷‍♂️ + // if ( + // index === blocks.length - 1 && + // ['image', 'video', 'file', 'embed'].includes(block.type) + // ) { + // editor.insertBlocks( + // [ + // { + // type: 'paragraph', + // }, + // ], + // block.id, + // 'after', + // ) + // if (editor.getTextCursorPosition().nextBlock) { + // editor.setTextCursorPosition(editor.getTextCursorPosition().nextBlock) + // } + // } + }) +} + +export function useAccountPublicationFullList( + accountId: string | undefined, + opts?: UseQueryOptions, +) { + const pubList = useAccountPublications(accountId) + const accounts = useAllAccounts() + const data = useMemo(() => { + function lookupAccount(accountId: string | undefined) { + if (!accountId) return undefined + return accounts.data?.accounts.find((acc) => acc.id === accountId) + } + return pubList.data?.publications.map((pub) => { + return { + publication: pub, + author: lookupAccount(pub?.document?.author), + editors: pub?.document?.editors?.map(lookupAccount) || [], + } + }) + }, [pubList.data, accounts.data]) + return {...pubList, data} +} + +export function useAccountPublications(accountId?: string | undefined) { + const grpcClient = useGRPCClient() + return useQuery({ + queryKey: [queryKeys.ACCOUNT_DOCUMENTS, accountId], + enabled: !!accountId, + queryFn: async () => { + const result = await grpcClient.publications.listAccountPublications({ + accountId, + }) + const publications: HMPublication[] = (result.publications + .map((pub) => hmPublication(pub)) + .filter(Boolean) + .sort((a, b) => { + const aTime = a?.document?.updateTime + ? new Date(a.document.updateTime) + : 0 + const bTime = b?.document?.updateTime + ? new Date(b.document.updateTime) + : 0 + if (!aTime || !bTime) return 0 + return bTime.getTime() - aTime.getTime() + }) || []) as HMPublication[] + return { + publications, + } + }, + }) +} + +export function useDraftRebase({ + shouldCheck, + draft, +}: { + shouldCheck: boolean + draft: HMDocument | null | undefined +}) { + const grpcClient = useGRPCClient() + const [rebase, setRebase] = useState(false) + const [newVersion, selectNewVersion] = useState('') + + useEffect(() => { + const INTERVAL = 10000 + var interval + if (draft && shouldCheck) { + interval = setInterval(checkForRebase, INTERVAL) + checkForRebase() + } + + async function checkForRebase() { + if (!draft?.previousVersion) { + return + } + + const latestDoc = await grpcClient.publications.getPublication({ + documentId: draft!.id, + }) + + const prevVersion = draft.previousVersion.split('.') + const latestVersion = latestDoc.version.split('.') + /** + * When I ask the backend for a publication without a version, it will respond + * with the latest version for that particular owner and also combined with my latest changes if those are not deps from the owner. + * this means that I need to check the latest version of the document with the previowVersion that my draft have + */ + if (latestVersion && !_.isEqual(latestVersion, prevVersion)) { + setRebase(true) + selectNewVersion( + latestVersion.length > 1 ? latestVersion.join('.') : latestVersion[0], + ) + } + } + + return () => { + if (interval) { + clearInterval(interval) + } + } + }, [shouldCheck]) + + return { + shouldRebase: rebase, + newVersion, + } +} export function useDocument( docId: string | undefined, diff --git a/frontend/packages/app/models/draft-machine.ts b/frontend/apps/desktop/src/models/draft-machine.ts similarity index 100% rename from frontend/packages/app/models/draft-machine.ts rename to frontend/apps/desktop/src/models/draft-machine.ts diff --git a/frontend/packages/app/models/editor-utils.ts b/frontend/apps/desktop/src/models/editor-utils.ts similarity index 100% rename from frontend/packages/app/models/editor-utils.ts rename to frontend/apps/desktop/src/models/editor-utils.ts diff --git a/frontend/packages/app/models/entities.ts b/frontend/apps/desktop/src/models/entities.ts similarity index 100% rename from frontend/packages/app/models/entities.ts rename to frontend/apps/desktop/src/models/entities.ts diff --git a/frontend/packages/app/models/experiments.ts b/frontend/apps/desktop/src/models/experiments.ts similarity index 100% rename from frontend/packages/app/models/experiments.ts rename to frontend/apps/desktop/src/models/experiments.ts diff --git a/frontend/packages/app/models/favorites.ts b/frontend/apps/desktop/src/models/favorites.ts similarity index 100% rename from frontend/packages/app/models/favorites.ts rename to frontend/apps/desktop/src/models/favorites.ts diff --git a/frontend/packages/app/models/feed.ts b/frontend/apps/desktop/src/models/feed.ts similarity index 98% rename from frontend/packages/app/models/feed.ts rename to frontend/apps/desktop/src/models/feed.ts index 1b5c5bd0fc..2f90adc519 100644 --- a/frontend/packages/app/models/feed.ts +++ b/frontend/apps/desktop/src/models/feed.ts @@ -1,7 +1,6 @@ import {PartialMessage, Timestamp} from '@bufbuild/protobuf' -import {Event, ListEventsRequest} from '@shm/shared' +import {Event, ListEventsRequest, unpackHmId} from '@shm/shared' import {useInfiniteQuery, useQuery} from '@tanstack/react-query' -import {unpackHmId} from '../../shared/src' import {useGRPCClient} from '../app-context' import {ChangeBlob, GroupSchema, useBlobsData} from './changes' import {queryKeys} from './query-keys' diff --git a/frontend/packages/app/models/gateway-settings.ts b/frontend/apps/desktop/src/models/gateway-settings.ts similarity index 100% rename from frontend/packages/app/models/gateway-settings.ts rename to frontend/apps/desktop/src/models/gateway-settings.ts diff --git a/frontend/packages/app/models/networking.ts b/frontend/apps/desktop/src/models/networking.ts similarity index 99% rename from frontend/packages/app/models/networking.ts rename to frontend/apps/desktop/src/models/networking.ts index 8f9359682b..f3d4592908 100644 --- a/frontend/packages/app/models/networking.ts +++ b/frontend/apps/desktop/src/models/networking.ts @@ -1,5 +1,5 @@ import {ConnectError} from '@connectrpc/connect' -import appError from '@shm/app/errors' +import appError from '@shm/desktop/src/errors' import {ConnectionStatus, GRPCClient, PeerInfo} from '@shm/shared' import { FetchQueryOptions, diff --git a/frontend/packages/app/models/payments.ts b/frontend/apps/desktop/src/models/payments.ts similarity index 100% rename from frontend/packages/app/models/payments.ts rename to frontend/apps/desktop/src/models/payments.ts diff --git a/frontend/packages/app/models/publication.ts b/frontend/apps/desktop/src/models/publication.ts similarity index 100% rename from frontend/packages/app/models/publication.ts rename to frontend/apps/desktop/src/models/publication.ts diff --git a/frontend/packages/app/models/query-keys.ts b/frontend/apps/desktop/src/models/query-keys.ts similarity index 100% rename from frontend/packages/app/models/query-keys.ts rename to frontend/apps/desktop/src/models/query-keys.ts diff --git a/frontend/packages/app/models/recents.ts b/frontend/apps/desktop/src/models/recents.ts similarity index 100% rename from frontend/packages/app/models/recents.ts rename to frontend/apps/desktop/src/models/recents.ts diff --git a/frontend/packages/app/models/search.ts b/frontend/apps/desktop/src/models/search.ts similarity index 100% rename from frontend/packages/app/models/search.ts rename to frontend/apps/desktop/src/models/search.ts diff --git a/frontend/packages/app/models/wallet.ts b/frontend/apps/desktop/src/models/wallet.ts similarity index 100% rename from frontend/packages/app/models/wallet.ts rename to frontend/apps/desktop/src/models/wallet.ts diff --git a/frontend/packages/app/models/web-importer.ts b/frontend/apps/desktop/src/models/web-importer.ts similarity index 100% rename from frontend/packages/app/models/web-importer.ts rename to frontend/apps/desktop/src/models/web-importer.ts diff --git a/frontend/packages/app/models/web-links.ts b/frontend/apps/desktop/src/models/web-links.ts similarity index 97% rename from frontend/packages/app/models/web-links.ts rename to frontend/apps/desktop/src/models/web-links.ts index d043626fe5..009af721f5 100644 --- a/frontend/packages/app/models/web-links.ts +++ b/frontend/apps/desktop/src/models/web-links.ts @@ -1,4 +1,4 @@ -import {AppQueryClient} from '@shm/app/query-client' +import type {AppQueryClient} from '@shm/desktop/src/query-client' import {parseFragment} from '@shm/shared' import {useQuery} from '@tanstack/react-query' import {useEffect, useRef, useState} from 'react' diff --git a/frontend/packages/app/window-utils.ts b/frontend/apps/desktop/src/models/window-utils.ts similarity index 100% rename from frontend/packages/app/window-utils.ts rename to frontend/apps/desktop/src/models/window-utils.ts diff --git a/frontend/apps/desktop/src/open-url.ts b/frontend/apps/desktop/src/open-url.ts index 5b9bade777..611203d901 100644 --- a/frontend/apps/desktop/src/open-url.ts +++ b/frontend/apps/desktop/src/open-url.ts @@ -1,6 +1,9 @@ -import {useAppContext} from '@shm/app/app-context' -import {isHttpUrl, useHmIdToAppRouteResolver} from '@shm/app/utils/navigation' -import {useNavigate} from '@shm/app/utils/useNavigate' +import {useAppContext} from '@shm/desktop/src/app-context' +import { + isHttpUrl, + useHmIdToAppRouteResolver, +} from '@shm/desktop/src/utils/navigation' +import {useNavigate} from '@shm/desktop/src/utils/useNavigate' import {toast} from '@shm/ui' import {useMemo} from 'react' diff --git a/frontend/apps/desktop/src/pages/account-content-page.tsx b/frontend/apps/desktop/src/pages/account-content-page.tsx index 4f0fcc9b8a..53bb9c8f28 100644 --- a/frontend/apps/desktop/src/pages/account-content-page.tsx +++ b/frontend/apps/desktop/src/pages/account-content-page.tsx @@ -1,8 +1,8 @@ -import { useCopyGatewayReference } from '@shm/app/components/copy-gateway-reference' -import { copyLinkMenuItem } from '@shm/app/components/list-item' -import { PublicationListItem } from '@shm/app/components/publication-list-item' -import { useAllAccounts } from '@shm/app/models/accounts' -import { useAccountPublications } from '@shm/app/models/documents' +import { useCopyGatewayReference } from '@shm/desktop/src/components/copy-gateway-reference' +import { copyLinkMenuItem } from '@shm/desktop/src/components/list-item' +import { PublicationListItem } from '@shm/desktop/src/components/publication-list-item' +import { useAllAccounts } from '@shm/desktop/src/models/accounts' +import { useAccountPublications } from '@shm/desktop/src/models/documents' import { Profile, unpackDocId } from '@shm/shared' import { List } from '@shm/ui' import { useMemo } from 'react' diff --git a/frontend/apps/desktop/src/pages/account-page.tsx b/frontend/apps/desktop/src/pages/account-page.tsx index 060820d290..badbf760fc 100644 --- a/frontend/apps/desktop/src/pages/account-page.tsx +++ b/frontend/apps/desktop/src/pages/account-page.tsx @@ -1,25 +1,25 @@ -import { AccessoryLayout } from '@shm/app/components/accessory-sidebar' -import { Avatar } from '@shm/app/components/avatar' -import { useCopyGatewayReference } from '@shm/app/components/copy-gateway-reference' -import { useDeleteDialog } from '@shm/app/components/delete-dialog' -import { FavoriteButton } from '@shm/app/components/favoriting' -import Footer, { FooterButton } from '@shm/app/components/footer' -import { OnlineIndicator } from '@shm/app/components/indicator' -import { ListItem, copyLinkMenuItem } from '@shm/app/components/list-item' -import { MainWrapperNoScroll } from '@shm/app/components/main-wrapper' -import { PublicationListItem } from '@shm/app/components/publication-list-item' -import { useAccount, useMyAccount } from '@shm/app/models/accounts' -import { useAccountWithDevices } from '@shm/app/models/contacts' -import { useEntityMentions } from '@shm/app/models/content-graph' +import { AccessoryLayout } from '@shm/desktop/src/components/accessory-sidebar' +import { Avatar } from '@shm/desktop/src/components/avatar' +import { useCopyGatewayReference } from '@shm/desktop/src/components/copy-gateway-reference' +import { useDeleteDialog } from '@shm/desktop/src/components/delete-dialog' +import { FavoriteButton } from '@shm/desktop/src/components/favoriting' +import Footer, { FooterButton } from '@shm/desktop/src/components/footer' +import { OnlineIndicator } from '@shm/desktop/src/components/indicator' +import { ListItem, copyLinkMenuItem } from '@shm/desktop/src/components/list-item' +import { MainWrapperNoScroll } from '@shm/desktop/src/components/main-wrapper' +import { PublicationListItem } from '@shm/desktop/src/components/publication-list-item' +import { useAccount, useMyAccount } from '@shm/desktop/src/models/accounts' +import { useAccountWithDevices } from '@shm/desktop/src/models/contacts' +import { useEntityMentions } from '@shm/desktop/src/models/content-graph' import { useAccountPublicationFullList, useDraftList, usePublication, -} from '@shm/app/models/documents' -import { useResourceFeedWithLatest } from '@shm/app/models/feed' -import { getAvatarUrl } from '@shm/app/utils/account-url' -import { useNavRoute } from '@shm/app/utils/navigation' -import { useNavigate } from '@shm/app/utils/useNavigate' +} from '@shm/desktop/src/models/documents' +import { useResourceFeedWithLatest } from '@shm/desktop/src/models/feed' +import { getAvatarUrl } from '@shm/desktop/src/utils/account-url' +import { useNavRoute } from '@shm/desktop/src/utils/navigation' +import { useNavigate } from '@shm/desktop/src/utils/useNavigate' import { Event, HMAccount, diff --git a/frontend/apps/desktop/src/pages/blocknote.tsx b/frontend/apps/desktop/src/pages/blocknote.tsx index 5e791df982..9fc4623dc0 100644 --- a/frontend/apps/desktop/src/pages/blocknote.tsx +++ b/frontend/apps/desktop/src/pages/blocknote.tsx @@ -4,7 +4,7 @@ import { defaultBlockSchema, HMBlockSchema, useBlockNote, -} from '@shm/app/editor' +} from '@shm/desktop/src/editor' import { YStack } from '@shm/ui' export default function BlockNoteDemo() { diff --git a/frontend/apps/desktop/src/pages/comment-draft.tsx b/frontend/apps/desktop/src/pages/comment-draft.tsx index 69499c7554..e431f5f27c 100644 --- a/frontend/apps/desktop/src/pages/comment-draft.tsx +++ b/frontend/apps/desktop/src/pages/comment-draft.tsx @@ -1,6 +1,6 @@ import { getBlockInfoFromPos, -} from '@shm/app/editor' +} from '@shm/desktop/src/editor' import { StateStream, unpackHmId } from '@shm/shared' import { Button, ChevronUp, SizableText, YStack, useStream } from '@shm/ui' @@ -8,21 +8,21 @@ import { CommentPageTitlebarWithDocId, CommentPresentation, CommentThread, -} from '@shm/app/components/comments' -import { useDeleteCommentDraftDialog } from '@shm/app/components/delete-comment-draft-dialog' -import { MainWrapperStandalone } from '@shm/app/components/main-wrapper' -import { useComment, useCommentEditor } from '@shm/app/models/comments' +} from '@shm/desktop/src/components/comments' +import { useDeleteCommentDraftDialog } from '@shm/desktop/src/components/delete-comment-draft-dialog' +import { MainWrapperStandalone } from '@shm/desktop/src/components/main-wrapper' +import { useComment, useCommentEditor } from '@shm/desktop/src/models/comments' import { chromiumSupportedImageMimeTypes, chromiumSupportedVideoMimeTypes, generateBlockId, handleDragMedia, -} from '@shm/app/utils/media-drag' +} from '@shm/desktop/src/utils/media-drag' import { useEffect, useState } from 'react' import { XStack } from 'tamagui' -import { useNavRoute } from '@shm/app/utils/navigation' -import { useNavigate } from '@shm/app/utils/useNavigate' +import { useNavRoute } from '@shm/desktop/src/utils/navigation' +import { useNavigate } from '@shm/desktop/src/utils/useNavigate' import { HMEditorContainer, HyperMediaEditorView } from 'src/components/editor' import './comment-draft.css' import { AppPublicationContentProvider } from './publication-content-provider' diff --git a/frontend/apps/desktop/src/pages/comment.tsx b/frontend/apps/desktop/src/pages/comment.tsx index d13ca0688b..8d8ab92b9c 100644 --- a/frontend/apps/desktop/src/pages/comment.tsx +++ b/frontend/apps/desktop/src/pages/comment.tsx @@ -3,12 +3,12 @@ import { CommentPageTitlebarWithDocId, CommentPresentation, CommentThread, -} from '@shm/app/components/comments' -import { MainWrapperStandalone } from '@shm/app/components/main-wrapper' -import { useComment, usePublicationCommentGroups } from '@shm/app/models/comments' -import { useNavRoute } from '@shm/app/utils/navigation' -import { useNavigate } from '@shm/app/utils/useNavigate' +} from '@shm/desktop/src/components/comments' +import { MainWrapperStandalone } from '@shm/desktop/src/components/main-wrapper' +import { useComment, usePublicationCommentGroups } from '@shm/desktop/src/models/comments' import { trpc } from '@shm/desktop/src/trpc' +import { useNavRoute } from '@shm/desktop/src/utils/navigation' +import { useNavigate } from '@shm/desktop/src/utils/useNavigate' import { HMComment, createHmId, unpackHmId } from '@shm/shared' import { Button, diff --git a/frontend/apps/desktop/src/pages/contacts-page.tsx b/frontend/apps/desktop/src/pages/contacts-page.tsx index b0069b5c6d..65751d90c8 100644 --- a/frontend/apps/desktop/src/pages/contacts-page.tsx +++ b/frontend/apps/desktop/src/pages/contacts-page.tsx @@ -1,18 +1,18 @@ -import { Avatar } from '@shm/app/components/avatar' -import { useCopyGatewayReference } from '@shm/app/components/copy-gateway-reference' -import { useDeleteDialog } from '@shm/app/components/delete-dialog' -import { FavoriteButton } from '@shm/app/components/favoriting' -import Footer from '@shm/app/components/footer' -import { OnlineIndicator } from '@shm/app/components/indicator' -import { ListItem, copyLinkMenuItem } from '@shm/app/components/list-item' -import { MainWrapper, MainWrapperNoScroll } from '@shm/app/components/main-wrapper' -import { MenuItemType } from '@shm/app/components/options-dropdown' -import { useAccountIsConnected, useAllAccounts, useMyAccount } from '@shm/app/models/accounts' -import { useFavorite } from '@shm/app/models/favorites' -import { useGatewayUrl } from '@shm/app/models/gateway-settings' -import { getAvatarUrl } from '@shm/app/utils/account-url' -import { AccountRoute } from '@shm/app/utils/routes' -import { useNavigate } from '@shm/app/utils/useNavigate' +import { Avatar } from '@shm/desktop/src/components/avatar' +import { useCopyGatewayReference } from '@shm/desktop/src/components/copy-gateway-reference' +import { useDeleteDialog } from '@shm/desktop/src/components/delete-dialog' +import { FavoriteButton } from '@shm/desktop/src/components/favoriting' +import Footer from '@shm/desktop/src/components/footer' +import { OnlineIndicator } from '@shm/desktop/src/components/indicator' +import { ListItem, copyLinkMenuItem } from '@shm/desktop/src/components/list-item' +import { MainWrapper, MainWrapperNoScroll } from '@shm/desktop/src/components/main-wrapper' +import { MenuItemType } from '@shm/desktop/src/components/options-dropdown' +import { useAccountIsConnected, useAllAccounts, useMyAccount } from '@shm/desktop/src/models/accounts' +import { useFavorite } from '@shm/desktop/src/models/favorites' +import { useGatewayUrl } from '@shm/desktop/src/models/gateway-settings' +import { getAvatarUrl } from '@shm/desktop/src/utils/account-url' +import { AccountRoute } from '@shm/desktop/src/utils/routes' +import { useNavigate } from '@shm/desktop/src/utils/useNavigate' import { HMAccount, createHmId, hmId } from '@shm/shared' import { ArrowUpRight, diff --git a/frontend/apps/desktop/src/pages/deleted-content.tsx b/frontend/apps/desktop/src/pages/deleted-content.tsx index 8e8642b896..d4fe4e123a 100644 --- a/frontend/apps/desktop/src/pages/deleted-content.tsx +++ b/frontend/apps/desktop/src/pages/deleted-content.tsx @@ -1,4 +1,4 @@ -import { useDeletedContent, useUndeleteEntity } from '@shm/app/models/entities' +import { useDeletedContent, useUndeleteEntity } from '@shm/desktop/src/models/entities' import { HMDeletedEntity, HYPERMEDIA_ENTITY_TYPES, diff --git a/frontend/apps/desktop/src/pages/document-placeholder.tsx b/frontend/apps/desktop/src/pages/document-placeholder.tsx index 491ac68de7..52bd9b06a3 100644 --- a/frontend/apps/desktop/src/pages/document-placeholder.tsx +++ b/frontend/apps/desktop/src/pages/document-placeholder.tsx @@ -1,4 +1,4 @@ -import { Placeholder } from '@shm/app/components/placeholder-box' +import { Placeholder } from '@shm/desktop/src/components/placeholder-box' import { YStack } from '@shm/ui' export function DocumentPlaceholder() { diff --git a/frontend/apps/desktop/src/pages/document.tsx b/frontend/apps/desktop/src/pages/document.tsx index 9f56dc504f..0245efb18c 100644 --- a/frontend/apps/desktop/src/pages/document.tsx +++ b/frontend/apps/desktop/src/pages/document.tsx @@ -1,21 +1,21 @@ -import { AccessoryLayout } from '@shm/app/components/accessory-sidebar' -import { BaseAccountLinkAvatar } from '@shm/app/components/account-link-avatar' -import { CitationsProvider } from '@shm/app/components/citations-context' -import { EntityCommentsAccessory } from '@shm/app/components/comments' -import { PushToGatewayDialog } from '@shm/app/components/copy-gateway-reference' -import { useAppDialog } from '@shm/app/components/dialog' -import { FavoriteButton } from '@shm/app/components/favoriting' -import Footer, { FooterButton } from '@shm/app/components/footer' -import { MainWrapper } from '@shm/app/components/main-wrapper' -import { useAccounts } from '@shm/app/models/accounts' -import { useDocHistory } from '@shm/app/models/changes' -import { useAllPublicationComments, useCreateComment } from '@shm/app/models/comments' -import { useEntityMentions } from '@shm/app/models/content-graph' -import { useGatewayHost } from '@shm/app/models/gateway-settings' -import { usePublicationVariant } from '@shm/app/models/publication' -import { useNavRoute } from '@shm/app/utils/navigation' -import { useNavigate } from '@shm/app/utils/useNavigate' import { EntityVersionsAccessory } from '@shm/desktop/src/changes-list' +import { AccessoryLayout } from '@shm/desktop/src/components/accessory-sidebar' +import { BaseAccountLinkAvatar } from '@shm/desktop/src/components/account-link-avatar' +import { CitationsProvider } from '@shm/desktop/src/components/citations-context' +import { EntityCommentsAccessory } from '@shm/desktop/src/components/comments' +import { PushToGatewayDialog } from '@shm/desktop/src/components/copy-gateway-reference' +import { useAppDialog } from '@shm/desktop/src/components/dialog' +import { FavoriteButton } from '@shm/desktop/src/components/favoriting' +import Footer, { FooterButton } from '@shm/desktop/src/components/footer' +import { MainWrapper } from '@shm/desktop/src/components/main-wrapper' +import { useAccounts } from '@shm/desktop/src/models/accounts' +import { useDocHistory } from '@shm/desktop/src/models/changes' +import { useAllPublicationComments, useCreateComment } from '@shm/desktop/src/models/comments' +import { useEntityMentions } from '@shm/desktop/src/models/content-graph' +import { useGatewayHost } from '@shm/desktop/src/models/gateway-settings' +import { usePublicationVariant } from '@shm/desktop/src/models/publication' +import { useNavRoute } from '@shm/desktop/src/utils/navigation' +import { useNavigate } from '@shm/desktop/src/utils/useNavigate' import { Document, PublicationContent, diff --git a/frontend/apps/desktop/src/pages/draft-rebase.tsx b/frontend/apps/desktop/src/pages/draft-rebase.tsx index d3f3d83063..6e9c5cc748 100644 --- a/frontend/apps/desktop/src/pages/draft-rebase.tsx +++ b/frontend/apps/desktop/src/pages/draft-rebase.tsx @@ -1,4 +1,4 @@ -import { BlockNoteEditor } from '@shm/app/editor' +import { BlockNoteEditor } from '@shm/desktop/src/editor' import { YStack } from '@shm/ui' import { useMemo, useState } from 'react' import { HyperMediaEditorView } from 'src/components/editor' diff --git a/frontend/apps/desktop/src/pages/draft.tsx b/frontend/apps/desktop/src/pages/draft.tsx index 30b3d33c27..523db5113f 100644 --- a/frontend/apps/desktop/src/pages/draft.tsx +++ b/frontend/apps/desktop/src/pages/draft.tsx @@ -1,31 +1,31 @@ -import { useGRPCClient } from '@shm/app/app-context' -import Footer from '@shm/app/components/footer' -import { MainWrapper } from '@shm/app/components/main-wrapper' +import { useGRPCClient } from '@shm/desktop/src/app-context' +import Footer from '@shm/desktop/src/components/footer' +import { MainWrapper } from '@shm/desktop/src/components/main-wrapper' +import { subscribeDraftFocus } from '@shm/desktop/src/draft-focusing' import { BlockNoteEditor, getBlockInfoFromPos, -} from '@shm/app/editor' -import { useMyAccount } from '@shm/app/models/accounts' +} from '@shm/desktop/src/editor' +import { useMyAccount } from '@shm/desktop/src/models/accounts' import { compareDraftWithMap, createBlocksMap, extractDeletes, useDraftEditor, -} from '@shm/app/models/documents' -import { DraftStatusContext, draftMachine } from '@shm/app/models/draft-machine' -import { useHasDevTools } from '@shm/app/models/experiments' -import { useGatewayUrl } from '@shm/app/models/gateway-settings' -import { subscribeDraftFocus } from '@shm/app/src/draft-focusing' +} from '@shm/desktop/src/models/documents' +import { DraftStatusContext, draftMachine } from '@shm/desktop/src/models/draft-machine' +import { useHasDevTools } from '@shm/desktop/src/models/experiments' +import { useGatewayUrl } from '@shm/desktop/src/models/gateway-settings' +import { trpc } from '@shm/desktop/src/trpc' import { chromiumSupportedImageMimeTypes, chromiumSupportedVideoMimeTypes, generateBlockId, handleDragMedia, -} from '@shm/app/utils/media-drag' -import { useNavRoute } from '@shm/app/utils/navigation' -import { useOpenDraft } from '@shm/app/utils/open-draft' -import { DraftRoute } from '@shm/app/utils/routes' -import { trpc } from '@shm/desktop/src/trpc' +} from '@shm/desktop/src/utils/media-drag' +import { useNavRoute } from '@shm/desktop/src/utils/navigation' +import { useOpenDraft } from '@shm/desktop/src/utils/open-draft' +import { DraftRoute } from '@shm/desktop/src/utils/routes' import { BlockRange, ExpandedBlockRange, diff --git a/frontend/apps/desktop/src/pages/explore.tsx b/frontend/apps/desktop/src/pages/explore.tsx index 4892a5f4b7..de95283dbd 100644 --- a/frontend/apps/desktop/src/pages/explore.tsx +++ b/frontend/apps/desktop/src/pages/explore.tsx @@ -1,6 +1,6 @@ -import Footer from '@shm/app/components/footer' -import { MainWrapperNoScroll } from '@shm/app/components/main-wrapper' -import { PublicationsList } from '@shm/app/components/publication-list' +import Footer from '@shm/desktop/src/components/footer' +import { MainWrapperNoScroll } from '@shm/desktop/src/components/main-wrapper' +import { PublicationsList } from '@shm/desktop/src/components/publication-list' export default function ExplorePage() { return ( diff --git a/frontend/apps/desktop/src/pages/favorites.tsx b/frontend/apps/desktop/src/pages/favorites.tsx index 8445bf2f9f..0a8707a31f 100644 --- a/frontend/apps/desktop/src/pages/favorites.tsx +++ b/frontend/apps/desktop/src/pages/favorites.tsx @@ -1,11 +1,11 @@ -import { useCopyGatewayReference } from '@shm/app/components/copy-gateway-reference' -import Footer from '@shm/app/components/footer' -import { copyLinkMenuItem } from '@shm/app/components/list-item' -import { MainWrapperNoScroll } from '@shm/app/components/main-wrapper' -import { PublicationListItem } from '@shm/app/components/publication-list-item' -import { useAllAccounts } from '@shm/app/models/accounts' -import { usePublication } from '@shm/app/models/documents' -import { FavoriteItem, useFavorites } from '@shm/app/models/favorites' +import { useCopyGatewayReference } from '@shm/desktop/src/components/copy-gateway-reference' +import Footer from '@shm/desktop/src/components/footer' +import { copyLinkMenuItem } from '@shm/desktop/src/components/list-item' +import { MainWrapperNoScroll } from '@shm/desktop/src/components/main-wrapper' +import { PublicationListItem } from '@shm/desktop/src/components/publication-list-item' +import { useAllAccounts } from '@shm/desktop/src/models/accounts' +import { usePublication } from '@shm/desktop/src/models/documents' +import { FavoriteItem, useFavorites } from '@shm/desktop/src/models/favorites' import { HMAccount, UnpackedHypermediaId } from '@shm/shared' import { List } from '@shm/ui' import { ContactItem } from './contacts-page' diff --git a/frontend/apps/desktop/src/pages/feed.tsx b/frontend/apps/desktop/src/pages/feed.tsx index 3ea0709dcb..00e0a1057e 100644 --- a/frontend/apps/desktop/src/pages/feed.tsx +++ b/frontend/apps/desktop/src/pages/feed.tsx @@ -1,13 +1,13 @@ import { Timestamp } from '@bufbuild/protobuf' -import Footer from '@shm/app/components/footer' -import { MainWrapperNoScroll } from '@shm/app/components/main-wrapper' -import { useAccount } from '@shm/app/models/accounts' -import { ProfileSchema, useBlobData } from '@shm/app/models/changes' -import { useComment } from '@shm/app/models/comments' -import { usePublication } from '@shm/app/models/documents' -import { useFeedWithLatest, useResourceFeedWithLatest } from '@shm/app/models/feed' -import { appRouteOfId, useNavRoute } from '@shm/app/utils/navigation' -import { useNavigate } from '@shm/app/utils/useNavigate' +import Footer from '@shm/desktop/src/components/footer' +import { MainWrapperNoScroll } from '@shm/desktop/src/components/main-wrapper' +import { useAccount } from '@shm/desktop/src/models/accounts' +import { ProfileSchema, useBlobData } from '@shm/desktop/src/models/changes' +import { useComment } from '@shm/desktop/src/models/comments' +import { usePublication } from '@shm/desktop/src/models/documents' +import { useFeedWithLatest, useResourceFeedWithLatest } from '@shm/desktop/src/models/feed' +import { appRouteOfId, useNavRoute } from '@shm/desktop/src/utils/navigation' +import { useNavigate } from '@shm/desktop/src/utils/useNavigate' import { API_FILE_URL, ActivityEvent, diff --git a/frontend/apps/desktop/src/pages/find-in-page.tsx b/frontend/apps/desktop/src/pages/find-in-page.tsx index 724c815824..4ff9fcf695 100644 --- a/frontend/apps/desktop/src/pages/find-in-page.tsx +++ b/frontend/apps/desktop/src/pages/find-in-page.tsx @@ -1,4 +1,4 @@ -import { AppIPC } from '@shm/app/app-ipc' +import { AppIPC } from '@shm/desktop/src/app-ipc' import { Button, ChevronDown, diff --git a/frontend/apps/desktop/src/pages/home.tsx b/frontend/apps/desktop/src/pages/home.tsx index 5aadd18b83..4bbc8fc07d 100644 --- a/frontend/apps/desktop/src/pages/home.tsx +++ b/frontend/apps/desktop/src/pages/home.tsx @@ -1,5 +1,5 @@ -import { useGRPCClient } from '@shm/app/app-context' -import { MainWrapper } from '@shm/app/components/main-wrapper' +import { useGRPCClient } from '@shm/desktop/src/app-context' +import { MainWrapper } from '@shm/desktop/src/components/main-wrapper' import { Button } from '@shm/ui' import { useMutation } from '@tanstack/react-query' import { useAccountKeys } from 'src/models/daemon' diff --git a/frontend/apps/desktop/src/pages/main.tsx b/frontend/apps/desktop/src/pages/main.tsx index 535c55c79f..528b16a134 100644 --- a/frontend/apps/desktop/src/pages/main.tsx +++ b/frontend/apps/desktop/src/pages/main.tsx @@ -1,12 +1,12 @@ -import { useListen } from '@shm/app/app-context' +import { useListen } from '@shm/desktop/src/app-context' -import { Launcher } from '@shm/app/components/launcher' -import { DraftStatusContext } from '@shm/app/models/draft-machine' -import { SidebarContextProvider } from '@shm/app/src/sidebar-context' -import { getRouteKey, useNavRoute } from '@shm/app/utils/navigation' -import { NavRoute } from '@shm/app/utils/routes' -import { useNavigate } from '@shm/app/utils/useNavigate' -import { getWindowType } from '@shm/app/utils/window-types' +import { Launcher } from '@shm/desktop/src/components/launcher' +import { DraftStatusContext } from '@shm/desktop/src/models/draft-machine' +import { SidebarContextProvider } from '@shm/desktop/src/sidebar-context' +import { getRouteKey, useNavRoute } from '@shm/desktop/src/utils/navigation' +import { NavRoute } from '@shm/desktop/src/utils/routes' +import { useNavigate } from '@shm/desktop/src/utils/useNavigate' +import { getWindowType } from '@shm/desktop/src/utils/window-types' import { YStack } from '@shm/ui' import { ReactElement, lazy, useMemo } from 'react' import { ErrorBoundary } from 'react-error-boundary' diff --git a/frontend/apps/desktop/src/pages/onboarding.tsx b/frontend/apps/desktop/src/pages/onboarding.tsx index 538057bda0..95c3c7ec76 100644 --- a/frontend/apps/desktop/src/pages/onboarding.tsx +++ b/frontend/apps/desktop/src/pages/onboarding.tsx @@ -1,12 +1,12 @@ -import { useAppContext } from '@shm/app/app-context' -import { SeedIcon } from '@shm/app/components/seed-icon' -import appError from '@shm/app/errors' -import { useSetProfile } from '@shm/app/models/accounts' -import { useConnectPeer } from '@shm/app/models/contacts' -import { useAccountRegistration, useMnemonics } from '@shm/app/models/daemon' -import { useWalletOptIn } from '@shm/app/models/wallet' -import { isHttpUrl } from '@shm/app/utils/navigation' +import { useAppContext } from '@shm/desktop/src/app-context' +import { SeedIcon } from '@shm/desktop/src/components/seed-icon' +import appError from '@shm/desktop/src/errors' +import { useSetProfile } from '@shm/desktop/src/models/accounts' +import { useConnectPeer } from '@shm/desktop/src/models/contacts' +import { useAccountRegistration, useMnemonics } from '@shm/desktop/src/models/daemon' +import { useWalletOptIn } from '@shm/desktop/src/models/wallet' import { trpc } from '@shm/desktop/src/trpc' +import { isHttpUrl } from '@shm/desktop/src/utils/navigation' import { Profile as ProfileType } from '@shm/shared' import { Button, diff --git a/frontend/apps/desktop/src/pages/publication-content-provider.tsx b/frontend/apps/desktop/src/pages/publication-content-provider.tsx index 48a9726377..18db4f3ad7 100644 --- a/frontend/apps/desktop/src/pages/publication-content-provider.tsx +++ b/frontend/apps/desktop/src/pages/publication-content-provider.tsx @@ -1,14 +1,14 @@ -import { useAppContext } from '@shm/app/app-context' +import { useAppContext } from '@shm/desktop/src/app-context' import { EmbedAccount, EmbedComment, EmbedInline, EmbedPublication, -} from '@shm/app/components/app-embeds' -import { useExperiments } from '@shm/app/models/experiments' -import { useNavRoute } from '@shm/app/utils/navigation' +} from '@shm/desktop/src/components/app-embeds' +import { useExperiments } from '@shm/desktop/src/models/experiments' import { useOpenUrl } from '@shm/desktop/src/open-url' import { trpc } from '@shm/desktop/src/trpc' +import { useNavRoute } from '@shm/desktop/src/utils/navigation' import { API_FILE_URL, BlockRange, diff --git a/frontend/apps/desktop/src/pages/settings.tsx b/frontend/apps/desktop/src/pages/settings.tsx index 4f75d64a7e..0880a35f84 100644 --- a/frontend/apps/desktop/src/pages/settings.tsx +++ b/frontend/apps/desktop/src/pages/settings.tsx @@ -1,11 +1,11 @@ -import { useGRPCClient, useIPC } from '@shm/app/app-context' -import { AvatarForm } from '@shm/app/components/avatar-form' -import { useEditProfileDialog } from '@shm/app/components/edit-profile-dialog' -import appError from '@shm/app/errors' -import { useMyAccount } from '@shm/app/models/accounts' -import { useAutoUpdatePreference } from '@shm/app/models/app-settings' -import { useDaemonInfo } from '@shm/app/models/daemon' -import { useExperiments, useWriteExperiments } from '@shm/app/models/experiments' +import { useGRPCClient, useIPC } from '@shm/desktop/src/app-context' +import { AvatarForm } from '@shm/desktop/src/components/avatar-form' +import { useEditProfileDialog } from '@shm/desktop/src/components/edit-profile-dialog' +import appError from '@shm/desktop/src/errors' +import { useMyAccount } from '@shm/desktop/src/models/accounts' +import { useAutoUpdatePreference } from '@shm/desktop/src/models/app-settings' +import { useDaemonInfo } from '@shm/desktop/src/models/daemon' +import { useExperiments, useWriteExperiments } from '@shm/desktop/src/models/experiments' import { useGatewayUrl, usePushOnCopy, @@ -13,17 +13,17 @@ import { useSetGatewayUrl, useSetPushOnCopy, useSetPushOnPublish, -} from '@shm/app/models/gateway-settings' -import { usePeerInfo } from '@shm/app/models/networking' +} from '@shm/desktop/src/models/gateway-settings' +import { usePeerInfo } from '@shm/desktop/src/models/networking' import { useExportWallet, useInvoicesBywallet, useWallets, -} from '@shm/app/models/payments' -import { queryKeys } from '@shm/app/models/query-keys' -import { useWalletOptIn } from '@shm/app/models/wallet' -import { getAvatarUrl } from '@shm/app/utils/account-url' +} from '@shm/desktop/src/models/payments' +import { queryKeys } from '@shm/desktop/src/models/query-keys' +import { useWalletOptIn } from '@shm/desktop/src/models/wallet' import { trpc } from '@shm/desktop/src/trpc' +import { getAvatarUrl } from '@shm/desktop/src/utils/account-url' import { LightningWallet, Profile, State, VERSION } from '@shm/shared' import { ArrowDownRight, @@ -65,6 +65,7 @@ import { Trash } from '@tamagui/lucide-icons' import { useQuery } from '@tanstack/react-query' import copyTextToClipboard from 'copy-text-to-clipboard' import { useEffect, useMemo, useState } from 'react' +import { useAccountKeys } from 'src/models/daemon' export default function Settings() { return ( @@ -343,13 +344,7 @@ export function ProfileInfo() { function AccountKeys() { const client = useGRPCClient() - const { data: keys } = useQuery({ - queryKey: [queryKeys.KEYS_LIST], - queryFn: async () => { - const q = await client.daemon.listKeys({}) - return q?.keys - }, - }) + const { data: keys } = useAccountKeys() return ( diff --git a/frontend/apps/desktop/src/preload-find-in-page.ts b/frontend/apps/desktop/src/preload-find-in-page.ts index 5e1e97db12..5823dc754c 100644 --- a/frontend/apps/desktop/src/preload-find-in-page.ts +++ b/frontend/apps/desktop/src/preload-find-in-page.ts @@ -2,7 +2,7 @@ import '@sentry/electron/preload' import {contextBridge, ipcRenderer} from 'electron' import {exposeElectronTRPC} from 'electron-trpc/main' // import directly from this deep path for shared/utils/stream! Bad things happen if you try to directly import from @shm/shared -import {AppWindowEvent} from '@shm/app/utils/window-events' +import {AppWindowEvent} from '@shm/desktop/src/utils/window-events' import {eventStream} from '@shm/shared/src/utils/stream' // import directly from this deep path for shared/utils/stream! Bad things happen if you try to directly import from @shm/shared diff --git a/frontend/apps/desktop/src/preload.ts b/frontend/apps/desktop/src/preload.ts index c503fa19b9..f6738f31a9 100644 --- a/frontend/apps/desktop/src/preload.ts +++ b/frontend/apps/desktop/src/preload.ts @@ -1,8 +1,8 @@ import '@sentry/electron/preload' +import {AppWindowEvent} from '@shm/desktop/src/utils/window-events' import {contextBridge, ipcRenderer} from 'electron' import {exposeElectronTRPC} from 'electron-trpc/main' // import directly from this deep path for shared/utils/stream! Bad things happen if you try to directly import from @shm/shared -import {AppWindowEvent} from '@shm/app/utils/window-events' import {eventStream, writeableStateStream} from '@shm/shared/src/utils/stream' import {GoDaemonState} from './daemon' diff --git a/frontend/packages/app/query-client.ts b/frontend/apps/desktop/src/query-client.ts similarity index 94% rename from frontend/packages/app/query-client.ts rename to frontend/apps/desktop/src/query-client.ts index ce2162c330..7dc4cf8328 100644 --- a/frontend/packages/app/query-client.ts +++ b/frontend/apps/desktop/src/query-client.ts @@ -1,5 +1,6 @@ import {JsonValue} from '@bufbuild/protobuf' -import {AppIPC} from '@shm/app/app-ipc' +import {AppIPC} from '@shm/desktop/src/app-ipc' +import {labelOfQueryKey} from '@shm/desktop/src/models/query-keys' import {copyTextToClipboard, toast} from '@shm/ui' import { QueryCache, @@ -7,7 +8,6 @@ import { QueryKey, onlineManager, } from '@tanstack/react-query' -import {labelOfQueryKey} from './models/query-keys' function copyDetails(randomDetails: JsonValue) { const detailString = JSON.stringify(randomDetails, null, 2) diff --git a/frontend/apps/desktop/src/root.tsx b/frontend/apps/desktop/src/root.tsx index 50f0f89185..9bae3a0f61 100644 --- a/frontend/apps/desktop/src/root.tsx +++ b/frontend/apps/desktop/src/root.tsx @@ -1,11 +1,10 @@ import type { Interceptor } from '@connectrpc/connect' import { createGrpcWebTransport } from '@connectrpc/connect-web' -import { AppContextProvider, StyleProvider } from '@shm/app/app-context' -import { AppIPC } from '@shm/app/app-ipc' -import { AppQueryClient, getQueryClient } from '@shm/app/query-client' -import { NavigationContainer } from '@shm/app/utils/navigation-container' -import { useListenAppEvent } from '@shm/app/utils/window-events' -import { WindowUtils } from '@shm/app/window-utils' +import { AppContextProvider, StyleProvider } from '@shm/desktop/src/app-context-provider' +import { AppIPC } from '@shm/desktop/src/app-ipc' +import { WindowUtils } from '@shm/desktop/src/models/window-utils' +import { NavigationContainer } from '@shm/desktop/src/utils/navigation-container' +import { useListenAppEvent } from '@shm/desktop/src/utils/window-events' import { API_HTTP_URL, createGRPCClient } from '@shm/shared' import type { StateStream } from '@shm/shared/src/utils/stream' import { Spinner, Toaster, YStack, toast, useStream } from '@shm/ui' @@ -18,11 +17,12 @@ import ReactDOM from 'react-dom/client' import { ErrorBoundary } from 'react-error-boundary' import superjson from 'superjson' import { AccountWizardDialog } from './app-account' -import type { GoDaemonState } from './app-api' import { AppErrorContent, RootAppError } from './components/app-error' +import type { GoDaemonState } from './daemon' import { createIPC } from './ipc' import Main from './pages/main' import type { AppInfoType } from './preload' +import { AppQueryClient, getQueryClient } from './query-client' import './root.css' import { client, trpc } from './trpc' diff --git a/frontend/packages/app/src/sidebar-context.tsx b/frontend/apps/desktop/src/sidebar-context.tsx similarity index 86% rename from frontend/packages/app/src/sidebar-context.tsx rename to frontend/apps/desktop/src/sidebar-context.tsx index 608e9a444e..e710d25bab 100644 --- a/frontend/packages/app/src/sidebar-context.tsx +++ b/frontend/apps/desktop/src/sidebar-context.tsx @@ -1,6 +1,6 @@ -import {StateStream, writeableStateStream} from '@shm/shared' -import {PropsWithChildren, createContext, useContext, useMemo} from 'react' -import {useNavigationDispatch, useNavigationState} from '../utils/navigation' +import { StateStream, writeableStateStream } from '@shm/shared' +import { PropsWithChildren, createContext, useContext, useMemo } from 'react' +import { useNavigationDispatch, useNavigationState } from './utils/navigation' type SidebarContextValue = { onMenuHover: () => void @@ -52,15 +52,15 @@ export function SidebarContextProvider(props: PropsWithChildren<{}>) { function onToggleMenuLock() { const wasLocked = isLocked.get() const nextIsLocked = !wasLocked - dispatch({type: 'sidebarLocked', value: nextIsLocked}) + dispatch({ type: 'sidebarLocked', value: nextIsLocked }) setIsLocked(nextIsLocked) } function onLockSidebarOpen() { - dispatch({type: 'sidebarLocked', value: true}) + dispatch({ type: 'sidebarLocked', value: true }) setIsLocked(true) } function onCloseSidebar() { - dispatch({type: 'sidebarLocked', value: false}) + dispatch({ type: 'sidebarLocked', value: false }) setIsLocked(false) setIsHoverVisible(false) } diff --git a/frontend/packages/app/src/slash-menu-items.tsx b/frontend/apps/desktop/src/slash-menu-items.tsx similarity index 88% rename from frontend/packages/app/src/slash-menu-items.tsx rename to frontend/apps/desktop/src/slash-menu-items.tsx index 0a6f7ac30c..b4abb28462 100644 --- a/frontend/packages/app/src/slash-menu-items.tsx +++ b/frontend/apps/desktop/src/slash-menu-items.tsx @@ -1,4 +1,4 @@ -import {TwitterXIcon} from '@shm/ui' +import { TwitterXIcon } from '@shm/ui' import { RiArticleFill, RiCodeBoxFill, @@ -15,7 +15,7 @@ import { HMBlockSchema, PartialBlock, insertOrUpdateBlock, -} from '../editor' +} from './editor' export const slashMenuItems = [ { @@ -26,9 +26,9 @@ export const slashMenuItems = [ execute: (editor) => { insertOrUpdateBlock(editor, { type: 'heading', - props: {level: '2'}, + props: { level: '2' }, } as PartialBlock) - const {state, view} = editor._tiptapEditor + const { state, view } = editor._tiptapEditor view.dispatch(state.tr.scrollIntoView()) }, }, @@ -41,7 +41,7 @@ export const slashMenuItems = [ insertOrUpdateBlock(editor, { type: 'paragraph', } as PartialBlock) - const {state, view} = editor._tiptapEditor + const { state, view } = editor._tiptapEditor view.dispatch(state.tr.scrollIntoView()) }, }, @@ -58,7 +58,7 @@ export const slashMenuItems = [ language: '', }, } as PartialBlock) - const {state, view} = editor._tiptapEditor + const { state, view } = editor._tiptapEditor view.dispatch(state.tr.scrollIntoView()) }, }, @@ -80,7 +80,7 @@ export const slashMenuItems = [ } as PartialBlock, true, ) - const {state, view} = editor._tiptapEditor + const { state, view } = editor._tiptapEditor view.dispatch(state.tr.scrollIntoView()) }, }, @@ -102,7 +102,7 @@ export const slashMenuItems = [ } as PartialBlock, true, ) - const {state, view} = editor._tiptapEditor + const { state, view } = editor._tiptapEditor view.dispatch(state.tr.scrollIntoView()) }, }, @@ -124,7 +124,7 @@ export const slashMenuItems = [ } as PartialBlock, true, ) - const {state, view} = editor._tiptapEditor + const { state, view } = editor._tiptapEditor view.dispatch(state.tr.scrollIntoView()) }, }, @@ -145,7 +145,7 @@ export const slashMenuItems = [ } as PartialBlock, true, ) - const {state, view} = editor._tiptapEditor + const { state, view } = editor._tiptapEditor view.dispatch(state.tr.scrollIntoView()) }, }, @@ -163,7 +163,7 @@ export const slashMenuItems = [ } as PartialBlock, true, ) - const {state, view} = editor._tiptapEditor + const { state, view } = editor._tiptapEditor view.dispatch(state.tr.scrollIntoView()) }, }, @@ -184,7 +184,7 @@ export const slashMenuItems = [ } as PartialBlock, true, ) - const {state, view} = editor._tiptapEditor + const { state, view } = editor._tiptapEditor view.dispatch(state.tr.scrollIntoView()) }, }, @@ -205,7 +205,7 @@ export const slashMenuItems = [ } as PartialBlock, true, ) - const {state, view} = editor._tiptapEditor + const { state, view } = editor._tiptapEditor view.dispatch(state.tr.scrollIntoView()) }, }, diff --git a/frontend/apps/desktop/src/types/code.tsx b/frontend/apps/desktop/src/types/code.tsx new file mode 100644 index 0000000000..a2b419afc4 --- /dev/null +++ b/frontend/apps/desktop/src/types/code.tsx @@ -0,0 +1,95 @@ +export const smth = null; + +// function Code({ +// children, +// element, +// attributes, +// elementProps, +// otherProps, +// paddingLeft, +// }: any) { +// let editor = useSlateStatic() +// let path = findPath(element) +// let lang = (element as CodeType).lang || '' + +// function setLanguage(lang: any) { +// const {...newData} = (element as CodeType).data || {} +// delete newData[HIGHLIGHTER] + +// Transforms.setNodes(editor, {lang, data: newData}, {at: path}) +// } + +// return ( +// +// +// {children} +// +// {editor.mode == EditorMode.Draft ? ( +// +// +// +// ) : null} +// +// ) +// } + +// function Blockquote({ +// children, +// attributes, +// elementProps, +// otherProps, +// paddingLeft, +// }: any) { +// return ( +// +// +// {children} +// +// +// ) +// } \ No newline at end of file diff --git a/frontend/apps/desktop/src/types/image.css b/frontend/apps/desktop/src/types/image.css new file mode 100644 index 0000000000..142c417009 --- /dev/null +++ b/frontend/apps/desktop/src/types/image.css @@ -0,0 +1,3 @@ +.isEmpty .image-caption > :first-child::before { + content: var(--placeholder); + } \ No newline at end of file diff --git a/frontend/apps/desktop/src/types/image.tsx b/frontend/apps/desktop/src/types/image.tsx new file mode 100644 index 0000000000..ba893e9ad8 --- /dev/null +++ b/frontend/apps/desktop/src/types/image.tsx @@ -0,0 +1,474 @@ +import { + Block, + BlockNoteEditor, + DefaultBlockSchema, + defaultProps +} from '@app/blocknote-core' +import { getBlockInfoFromPos } from '@app/blocknote-core/extensions/Blocks/helpers/getBlockInfoFromPos' +import { insertOrUpdateBlock } from '@app/blocknote-core/extensions/SlashMenu/defaultSlashMenuItems' +import { + createReactBlockSpec, + InlineContent, + ReactSlashMenuItem +} from '@app/blocknote-react' +import { HDBlockSchema } from '@app/client/schema' +import { + Button, + Form, + Input, + Label, + Popover, + SizableText, + Tabs, + XStack, + YStack +} from '@mintter/ui' +import { ChangeEvent, useEffect, useState } from 'react' +import { RiImage2Fill } from 'react-icons/ri' + +export const ImageBlock = createReactBlockSpec({ + type: 'image', + propSchema: { + ...defaultProps, + url: { + default: '', + }, + defaultOpen: { + values: ['false', 'true'], + default: 'true', + }, + }, + containsInlineContent: true, + // @ts-ignore + render: ({ + block, + editor, + }: { + block: Block + editor: BlockNoteEditor + }) => Render(block, editor), +}) + +type ImageType = { + id: string + props: { + url: string + } + children: [] + content: [] + type: string +} + +const boolRegex = new RegExp('true') + +const Render = ( + block: Block, + editor: BlockNoteEditor, +) => { + const [image, setImage] = useState({ + id: block.id, + props: { + url: block.props.url, + }, + children: [], + content: block.content, + type: block.type, + } as ImageType) + + const assignFile = (newImage: ImageType) => { + setImage({...image, props: {...image.props, ...newImage.props}}) + editor.updateBlock(image.id, {props: {...block.props, ...newImage.props}}) + editor.setTextCursorPosition(image.id, 'end') + } + + return ( + + {image.props.url ? ( + + ) : editor.isEditable ? ( + + ) : ( + <> + )} + + ) +} + +function ImageComponent({ + block, + editor, + assign, +}: { + block: Block + editor: BlockNoteEditor + assign: any +}) { + const [replace, setReplace] = useState(false) + const [selected, setSelected] = useState(false) + const tiptapEditor = editor._tiptapEditor + const selection = tiptapEditor.state.selection + + useEffect(() => { + const selectedNode = getBlockInfoFromPos( + tiptapEditor.state.doc, + tiptapEditor.state.selection.from, + ) + if (selectedNode && selectedNode.id) { + if ( + selectedNode.id === block.id && + selectedNode.startPos === selection.$anchor.pos + ) { + setSelected(true) + } else if (selectedNode.id !== block.id) { + setSelected(false) + } + } + }, [selection]) + + return ( +
+ ) => { + setReplace(true) + }} + onHoverOut={(e: React.MouseEvent) => { + setReplace(false) + }} + borderWidth={0} + outlineWidth={0} + outlineColor="transparent" + borderColor="transparent" + > + {replace && editor.isEditable ? ( + + ) : null} + + + (setSelected(false))} /> +
+ ) +} + +function ImageForm({ + block, + assign, +}: { + block: Block + assign: any +}) { + const [url, setUrl] = useState('') + const [tabState, setTabState] = useState('upload') + const [fileName, setFileName] = useState<{name: string; color: string}>({ + name: 'Upload File', + color: 'black', + }) + + const handleUpload = async (event: ChangeEvent) => { + if (event.target.files) { + const uploadedFile = event.target.files[0] + if (uploadedFile && uploadedFile.size <= 62914560) { + const formData = new FormData() + formData.append('file', uploadedFile) + + try { + const response = await fetch( + 'http://localhost:55001/ipfs/file-upload', + { + method: 'POST', + body: formData, + }, + ) + const data = await response.text() + assign({props: {url: data}} as ImageType) + } catch (error) { + console.error(error) + } + } else setFileName({name: 'The file size exceeds 60 MB', color: 'red'}) + } + } + + const submitImage = async (url: string) => { + if (isValidUrl(url)) { + const blob = await fetch(url).then((res) => res.blob()) + const webFile = new File( + [blob], + `mintterImage.${blob.type.split('/').pop()}`, + ) + if (webFile && webFile.size <= 62914560) { + const formData = new FormData() + formData.append('file', webFile) + + try { + const response = await fetch( + 'http://localhost:55001/ipfs/file-upload', + { + method: 'POST', + body: formData, + }, + ) + const data = await response.text() + assign({props: {url: data}} as ImageType) + } catch (error) { + console.error(error) + } + } else setFileName({name: 'The file size exceeds 60 MB', color: 'red'}) + } + } + + const isValidUrl = (urlString: string) => { + try { + return Boolean(new URL(urlString)) + } catch (e) { + console.log(e) + return false + } + } + + return ( +
+ + + + + + + + + + + Upload + + + + + Embed Link + + + + + + + + + + + + + + +
submitImage(url)} + borderWidth={0} + > + + setUrl(e.nativeEvent.text)} + /> + + + + +
+
+
+
+
+
+
+
+ ) +} + +export const insertImage = new ReactSlashMenuItem< + DefaultBlockSchema & {image: typeof ImageBlock} +>( + 'Image', + // @ts-ignore + (editor: BlockNoteEditor) => { + insertOrUpdateBlock(editor, { + type: 'image', + props: { + url: '', + }, + }) + }, + ['image', 'img', 'picture'], + 'Media', + , + 'Insert an image', +) diff --git a/frontend/apps/desktop/src/types/video.tsx b/frontend/apps/desktop/src/types/video.tsx new file mode 100644 index 0000000000..9bdabc687a --- /dev/null +++ b/frontend/apps/desktop/src/types/video.tsx @@ -0,0 +1,52 @@ +import { DefaultBlockSchema, defaultProps } from "@app/blocknote-core"; +import { createReactBlockSpec, InlineContent, ReactSlashMenuItem } from "@app/blocknote-react"; +import { RiVideoAddFill } from "react-icons/ri"; + +export const VideoBlock = createReactBlockSpec({ + type: "video", + propSchema: { + ...defaultProps, + src: { + default: "https://via.placeholder.com/1000", + }, + }, + containsInlineContent: true, + render: ({ block }) => ( +
+ + +
+ ), + }); + +export const insertVideo = new ReactSlashMenuItem< +DefaultBlockSchema & { video: typeof VideoBlock } +>( +"Video", +(editor) => { + const src: string | null = prompt("Enter video URL"); + editor.insertBlocks( + [ + { + type: "video", + props: { + src: src || "https://via.placeholder.com/1000", + }, + }, + ], + editor.getTextCursorPosition().block, + "after" + ); +}, +["video", "vid", "media"], +"Media", +, +"Insert aa video" +); \ No newline at end of file diff --git a/frontend/packages/app/use-popover-state.ts b/frontend/apps/desktop/src/use-popover-state.ts similarity index 100% rename from frontend/packages/app/use-popover-state.ts rename to frontend/apps/desktop/src/use-popover-state.ts diff --git a/frontend/packages/app/utils/account-url.ts b/frontend/apps/desktop/src/utils/account-url.ts similarity index 100% rename from frontend/packages/app/utils/account-url.ts rename to frontend/apps/desktop/src/utils/account-url.ts diff --git a/frontend/packages/app/utils/classnames.ts b/frontend/apps/desktop/src/utils/classnames.ts similarity index 100% rename from frontend/packages/app/utils/classnames.ts rename to frontend/apps/desktop/src/utils/classnames.ts diff --git a/frontend/packages/app/utils/logger.ts b/frontend/apps/desktop/src/utils/logger.ts similarity index 100% rename from frontend/packages/app/utils/logger.ts rename to frontend/apps/desktop/src/utils/logger.ts diff --git a/frontend/packages/app/utils/media-drag.ts b/frontend/apps/desktop/src/utils/media-drag.ts similarity index 100% rename from frontend/packages/app/utils/media-drag.ts rename to frontend/apps/desktop/src/utils/media-drag.ts diff --git a/frontend/packages/app/utils/mege-refs.ts b/frontend/apps/desktop/src/utils/mege-refs.ts similarity index 100% rename from frontend/packages/app/utils/mege-refs.ts rename to frontend/apps/desktop/src/utils/mege-refs.ts diff --git a/frontend/packages/app/utils/navigation-container.tsx b/frontend/apps/desktop/src/utils/navigation-container.tsx similarity index 100% rename from frontend/packages/app/utils/navigation-container.tsx rename to frontend/apps/desktop/src/utils/navigation-container.tsx diff --git a/frontend/packages/app/utils/navigation.tsx b/frontend/apps/desktop/src/utils/navigation.tsx similarity index 100% rename from frontend/packages/app/utils/navigation.tsx rename to frontend/apps/desktop/src/utils/navigation.tsx diff --git a/frontend/packages/app/utils/object-keys.ts b/frontend/apps/desktop/src/utils/object-keys.ts similarity index 100% rename from frontend/packages/app/utils/object-keys.ts rename to frontend/apps/desktop/src/utils/object-keys.ts diff --git a/frontend/packages/app/utils/open-draft.ts b/frontend/apps/desktop/src/utils/open-draft.ts similarity index 93% rename from frontend/packages/app/utils/open-draft.ts rename to frontend/apps/desktop/src/utils/open-draft.ts index 3db820967c..0637ccea92 100644 --- a/frontend/packages/app/utils/open-draft.ts +++ b/frontend/apps/desktop/src/utils/open-draft.ts @@ -1,5 +1,5 @@ -import {useQueryInvalidator} from '@shm/app/app-context' -import {queryKeys} from '@shm/app/models/query-keys' +import {useQueryInvalidator} from '@shm/desktop/src/app-context' +import {queryKeys} from '@shm/desktop/src/models/query-keys' import {DocumentChange, GRPCClient} from '@shm/shared' import {useGRPCClient} from '../app-context' import appError from '../errors' diff --git a/frontend/packages/app/utils/path.ts b/frontend/apps/desktop/src/utils/path.ts similarity index 100% rename from frontend/packages/app/utils/path.ts rename to frontend/apps/desktop/src/utils/path.ts diff --git a/frontend/packages/app/utils/route-context.ts b/frontend/apps/desktop/src/utils/route-context.ts similarity index 100% rename from frontend/packages/app/utils/route-context.ts rename to frontend/apps/desktop/src/utils/route-context.ts diff --git a/frontend/packages/app/utils/route-encoding.ts b/frontend/apps/desktop/src/utils/route-encoding.ts similarity index 100% rename from frontend/packages/app/utils/route-encoding.ts rename to frontend/apps/desktop/src/utils/route-encoding.ts diff --git a/frontend/packages/app/utils/routes.tsx b/frontend/apps/desktop/src/utils/routes.tsx similarity index 100% rename from frontend/packages/app/utils/routes.tsx rename to frontend/apps/desktop/src/utils/routes.tsx diff --git a/frontend/packages/app/utils/site-hostname.ts b/frontend/apps/desktop/src/utils/site-hostname.ts similarity index 100% rename from frontend/packages/app/utils/site-hostname.ts rename to frontend/apps/desktop/src/utils/site-hostname.ts diff --git a/frontend/packages/app/utils/useNavigate.tsx b/frontend/apps/desktop/src/utils/useNavigate.tsx similarity index 100% rename from frontend/packages/app/utils/useNavigate.tsx rename to frontend/apps/desktop/src/utils/useNavigate.tsx diff --git a/frontend/packages/app/utils/window-events.ts b/frontend/apps/desktop/src/utils/window-events.ts similarity index 100% rename from frontend/packages/app/utils/window-events.ts rename to frontend/apps/desktop/src/utils/window-events.ts diff --git a/frontend/packages/app/utils/window-types.ts b/frontend/apps/desktop/src/utils/window-types.ts similarity index 100% rename from frontend/packages/app/utils/window-types.ts rename to frontend/apps/desktop/src/utils/window-types.ts diff --git a/frontend/packages/app/.gitignore b/frontend/packages/app/.gitignore deleted file mode 100644 index e9670990e3..0000000000 --- a/frontend/packages/app/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -dist/ -.DS_Store -THUMBS_DB -node_modules/ -types/ diff --git a/frontend/packages/app/.prettierrc.js b/frontend/packages/app/.prettierrc.js deleted file mode 100644 index a4c0b01027..0000000000 --- a/frontend/packages/app/.prettierrc.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = '@shm/prettier' diff --git a/frontend/packages/app/app-context.tsx b/frontend/packages/app/app-context.tsx deleted file mode 100644 index f99849fb59..0000000000 --- a/frontend/packages/app/app-context.tsx +++ /dev/null @@ -1,168 +0,0 @@ -import { GRPCClient } from '@shm/shared' -import { TamaguiProvider, TamaguiProviderProps, View } from '@shm/ui' -import { QueryClientProvider } from '@tanstack/react-query' -import { ReactQueryDevtools } from '@tanstack/react-query-devtools' -import { ReactNode, createContext, useContext, useEffect, useMemo } from 'react' -import { AppIPC, Event, EventCallback } from './app-ipc' -import { useExperiments } from './models/experiments' -import { AppQueryClient } from './query-client' -import tamaguiConfig from './tamagui.config' -import { WindowUtils } from './window-utils' - -export type AppPlatform = typeof process.platform - -export type AppContext = { - platform: AppPlatform - grpcClient: GRPCClient - queryClient: AppQueryClient - ipc: AppIPC - externalOpen: (url: string) => Promise - windowUtils: WindowUtils - saveCidAsFile: (cid: string, name: string) => Promise -} - -const AppContext = createContext(null) - -export function AppContextProvider({ - children, - platform, - grpcClient, - queryClient, - ipc, - externalOpen, - windowUtils, - saveCidAsFile, - darkMode, -}: { - children: ReactNode - platform: AppPlatform - grpcClient: GRPCClient - queryClient: AppQueryClient - ipc: AppIPC - externalOpen: (url: string) => Promise - windowUtils: WindowUtils - saveCidAsFile: (cid: string, name: string) => Promise - darkMode: boolean -}) { - const appCtx = useMemo( - () => ({ - // platform: 'win32', // to test from macOS - platform, - grpcClient, - queryClient, - ipc, - externalOpen, - windowUtils, - saveCidAsFile, - }), - [], - ) - if (!queryClient) - throw new Error('queryClient is required for AppContextProvider') - return ( - - - {children} - - - - ) -} - -function ReactQueryTools() { - const {data: experiments} = useExperiments() - return experiments?.developerTools ? ( - - - - ) : null -} - -export function StyleProvider({ - children, - darkMode, - ...rest -}: Omit & {darkMode: boolean}) { - return ( - - {children} - - ) -} - -export function useAppContext() { - const context = useContext(AppContext) - if (!context) - throw new Error('useAppContext must be used within a AppContextProvider') - - return context -} - -export function useGRPCClient(): GRPCClient { - const context = useContext(AppContext) - if (!context) - throw new Error('useGRPCClient must be used within a AppContextProvider') - return context.grpcClient -} - -export function useIPC(): AppIPC { - const context = useContext(AppContext) - if (!context) - throw new Error('useIPC must be used within a AppContextProvider') - - return context.ipc -} - -export function useQueryInvalidator() { - const context = useContext(AppContext) - if (!context) - throw new Error( - 'useQueryInvalidator must be used within a AppContextProvider', - ) - - return context.queryClient.invalidate -} - -export function useWindowUtils(): WindowUtils { - const context = useContext(AppContext) - if (!context) - throw new Error('useWindowUtils must be used within a AppContextProvider') - - return context.windowUtils -} - -export function useListen( - cmd: string, - handler: EventCallback, - deps: React.DependencyList = [], -) { - const {listen} = useIPC() - useEffect(() => { - if (!listen) { - throw new Error('useListen called before listen is defined') - } - let isSubscribed = true - let unlisten: () => void - - listen(cmd, (event: Event) => { - if (!isSubscribed) { - return unlisten() - } - - handler(event) - }).then((_unlisten) => (unlisten = _unlisten)) - - return () => { - isSubscribed = false - } - }, deps) -} diff --git a/frontend/packages/app/client/example-docs.ts b/frontend/packages/app/client/example-docs.ts deleted file mode 100644 index b85ab04673..0000000000 --- a/frontend/packages/app/client/example-docs.ts +++ /dev/null @@ -1,202 +0,0 @@ -import { - Annotation, - Block, - BlockNode, - Document, - HMBlockAttributes, -} from '@shm/shared' - -function createAnnotation( - type: string, - start: number, - end: number, - attributes?: Record, -) { - return new Annotation({ - type, - starts: [start], - ends: [end], - attributes, - }) -} - -function createLinkAnnotation( - start: number, - end: number, - ref: string, - attributes?: Record, -) { - return new Annotation({ - type: 'link', - ref, - starts: [start], - ends: [end], - attributes, - }) -} - -function createSectionNode( - { - text, - type, - id, - annotations, - attributes, - }: { - text: string - type?: 'section' | 'paragraph' | 'heading' - id: string - annotations?: Annotation[] - attributes?: HMBlockAttributes - }, - children?: BlockNode[], -) { - return new BlockNode({ - block: new Block({ - id, - type: type || 'section', - text, - annotations, - attributes, - }), - children: children || [], - }) -} - -function createDoc(children: BlockNode[], label: string) { - return new Document({ - children, - id: label, - }) -} - -export const examples = { - twoParagraphs: createDoc( - [ - createSectionNode({text: 'hello', id: '1'}), - createSectionNode({text: 'world', id: '2'}), - ], - 'twoParagraphs', - ), - - withBoldText: createDoc( - [ - createSectionNode({ - text: 'hello world!', - id: '1', - annotations: [createAnnotation('strong', 6, 11)], - }), - ], - 'withBoldText', - ), - - withOverlappingAnnotations: createDoc( - [ - createSectionNode({ - text: 'ABCDE', - id: '1', - annotations: [ - createAnnotation('strong', 1, 3), - createAnnotation('emphasis', 2, 4), - ], - }), - ], - 'withBoldText', - ), - - withList: createDoc( - [ - createSectionNode( - { - text: 'this is a list:', - id: '1', - attributes: { - childrenType: 'ul', - }, - }, - [ - createSectionNode({text: 'item 1', id: '2'}), - createSectionNode({text: 'item 2', id: '3'}), - ], - ), - ], - 'withList', - ), - - withLink: createDoc( - [ - createSectionNode({ - text: 'a link', - id: '1', - attributes: {}, - annotations: [createLinkAnnotation(2, 6, 'https://example.com')], - }), - ], - 'withLink', - ), - - nestedList: createDoc( - [ - createSectionNode( - { - text: 'this is a list:', - id: '1', - attributes: { - childrenType: 'ul', - }, - }, - [ - createSectionNode({text: 'item 1', id: '2'}), - createSectionNode( - {text: 'item 2', id: '3', attributes: {childrenType: 'ol'}}, - [ - createSectionNode({text: 'numbered A', id: 'a'}), - createSectionNode({text: 'numbered B', id: 'b'}), - ], - ), - ], - ), - ], - 'nestedList', - ), - - nestedHeadings: createDoc( - [ - createSectionNode( - { - text: 'Heading A', - type: 'heading', - id: '1', - }, - [ - createSectionNode({text: 'text 1', id: '2'}), - createSectionNode({text: 'text 2', id: '3'}), - createSectionNode( - { - text: 'SubHeading A1', - type: 'heading', - id: '4', - }, - [ - createSectionNode({text: 'text A1A', id: 'a'}), - createSectionNode({text: 'text A1B', id: 'b'}), - ], - ), - ], - ), - createSectionNode({text: 'top-level paragraph', id: 'p0'}), - createSectionNode( - { - text: 'Heading B', - type: 'heading', - id: '1', - }, - [ - createSectionNode({text: 'text 1', id: 'b2'}), - createSectionNode({text: 'text 2', id: 'b3'}), - ], - ), - ], - 'nestedHeadings', - ), -} as const diff --git a/frontend/packages/app/editor/blocknote/react/SideMenu/components/DefaultSideMenu.tsx b/frontend/packages/app/editor/blocknote/react/SideMenu/components/DefaultSideMenu.tsx deleted file mode 100644 index 016adcdbd2..0000000000 --- a/frontend/packages/app/editor/blocknote/react/SideMenu/components/DefaultSideMenu.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import {BlockSchema} from '@shm/app/editor/blocknote/core' - -import {AddBlockButton} from './DefaultButtons/AddBlockButton' -import {DragHandle} from './DefaultButtons/DragHandle' -import {SideMenu} from './SideMenu' -import {SideMenuProps} from './SideMenuPositioner' - -export const DefaultSideMenu = ( - props: SideMenuProps, -) => ( - - - - -) diff --git a/frontend/packages/app/editor/blocknote/react/SideMenu/components/DragHandleMenu/DefaultButtons/RemoveBlockButton.tsx b/frontend/packages/app/editor/blocknote/react/SideMenu/components/DragHandleMenu/DefaultButtons/RemoveBlockButton.tsx deleted file mode 100644 index b401aac31c..0000000000 --- a/frontend/packages/app/editor/blocknote/react/SideMenu/components/DragHandleMenu/DefaultButtons/RemoveBlockButton.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import {BlockSchema} from '@shm/app/editor/blocknote/core' -import {ReactNode} from 'react' - -import {Delete, XStack} from '@shm/ui' -import {DragHandleMenuProps} from '../DragHandleMenu' -import {DragHandleMenuItem} from '../DragHandleMenuItem' - -export const RemoveBlockButton = ( - props: DragHandleMenuProps & {children: ReactNode}, -) => { - return ( - props.editor.removeBlocks([props.block])} - > - - - {props.children} - - - ) -} diff --git a/frontend/packages/app/env.d.ts b/frontend/packages/app/env.d.ts deleted file mode 100644 index 47fbc29862..0000000000 --- a/frontend/packages/app/env.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -interface ImportMetaEnv { - readonly VITE_HTTP_PORT: string - readonly VITE_GRPC_PORT: string - readonly VITE_P2P_PORT: string -} - -interface ImportMeta { - readonly env: ImportMetaEnv -} diff --git a/frontend/packages/app/index.ts b/frontend/packages/app/index.ts deleted file mode 100644 index 066a3c9229..0000000000 --- a/frontend/packages/app/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -// leave this blank -// don't re-export files from this workspace. it'll break next.js tree shaking -// https://github.com/vercel/next.js/issues/12557 -export {} diff --git a/frontend/packages/app/logger.ts b/frontend/packages/app/logger.ts deleted file mode 100644 index 0a65453559..0000000000 --- a/frontend/packages/app/logger.ts +++ /dev/null @@ -1,6 +0,0 @@ -export const log = console.log -export const error = console.error -export const warn = console.warn -export const info = console.info -export const debug = console.debug -export const trace = console.trace diff --git a/frontend/packages/app/models/daemon.ts b/frontend/packages/app/models/daemon.ts deleted file mode 100644 index c377913064..0000000000 --- a/frontend/packages/app/models/daemon.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { GRPCClient, Info } from '@shm/shared' -import { - FetchQueryOptions, - UseMutationOptions, - UseQueryOptions, - useMutation, - useQuery, -} from '@tanstack/react-query' -import { useGRPCClient } from '../app-context' -import { queryKeys } from './query-keys' - -function queryDaemonInfo( - grpcClient: GRPCClient, - opts: UseQueryOptions | FetchQueryOptions = {}, -): UseQueryOptions | FetchQueryOptions { - return { - ...opts, - queryKey: [queryKeys.GET_DAEMON_INFO], - queryFn: async () => { - try { - return await grpcClient.daemon.getInfo({}) - } catch (error) { - if (error) { - console.log('error check make sure not set up condition..', error) - } - } - return null - }, - refetchInterval: 10_000, - useErrorBoundary: false, - } -} -export function useDaemonInfo(opts: UseQueryOptions = {}) { - const grpcClient = useGRPCClient() - return useQuery(queryDaemonInfo(grpcClient, opts)) -} - -export function useMnemonics() { - const grpcClient = useGRPCClient() - return useQuery({ - queryKey: ['onboarding', 'mnemonics'], - queryFn: async () => { - const data = await grpcClient.daemon.genMnemonic({}) - return data.mnemonic - }, - refetchOnReconnect: false, - refetchOnWindowFocus: false, - }) -} - -export function useAccountRegistration( - opts?: UseMutationOptions, -) { - const grpcClient = useGRPCClient() - return useMutation({ - mutationFn: async (words: string[]) => { - await grpcClient.daemon.register({mnemonic: words}) - }, - ...opts, - }) -} diff --git a/frontend/packages/app/models/documents.ts b/frontend/packages/app/models/documents.ts deleted file mode 100644 index c53ac7b9a0..0000000000 --- a/frontend/packages/app/models/documents.ts +++ /dev/null @@ -1,1509 +0,0 @@ -import {Timestamp} from '@bufbuild/protobuf' -import {useAppContext, useQueryInvalidator} from '@shm/app/app-context' -import {createHypermediaDocLinkPlugin} from '@shm/app/editor' -import {slashMenuItems} from '@shm/app/src/slash-menu-items' -import {useOpenUrl} from '@shm/desktop/src/open-url' -import {trpc} from '@shm/desktop/src/trpc' -import { - Document, - DocumentChange, - GRPCClient, - HMAccount, - HMBlock, - HMBlockNode, - HMDocument, - HMPublication, - ListPublicationsResponse, - UnpackedHypermediaId, - fromHMBlock, - hmDocument, - hmPublication, - toHMBlock, - unpackDocId, - unpackHmId, - writeableStateStream, -} from '@shm/shared' -import {UpdateDraftResponse} from '@shm/shared/src/client/.generated/documents/v1alpha/documents_pb' -import { - FetchQueryOptions, - UseInfiniteQueryOptions, - UseMutationOptions, - UseQueryOptions, - useInfiniteQuery, - useMutation, - useQueries, - useQuery, -} from '@tanstack/react-query' -import {Extension, findParentNode} from '@tiptap/core' -import {NodeSelection} from '@tiptap/pm/state' -import {useMachine} from '@xstate/react' -import _ from 'lodash' -import {useEffect, useMemo, useRef, useState} from 'react' -import {ContextFrom, fromPromise} from 'xstate' -import {useGRPCClient} from '../app-context' -import { - BlockNoteEditor, - Block as EditorBlock, - hmBlockSchema, - useBlockNote, -} from '../editor' -import {useNavRoute} from '../utils/navigation' -import {pathNameify} from '../utils/path' -import {NavRoute} from '../utils/routes' -import {useNavigate} from '../utils/useNavigate' -import {useAccounts, useAllAccounts, useMyAccount} from './accounts' -import {DraftStatusContext, draftMachine} from './draft-machine' -import {getBlockGroup, setGroupTypes} from './editor-utils' -import {useGatewayUrl, useGatewayUrlStream} from './gateway-settings' -import {queryKeys} from './query-keys' -import {useInlineMentions} from './search' - -export function usePublicationList( - opts?: UseInfiniteQueryOptions & { - trustedOnly: boolean - }, -) { - const {trustedOnly, ...queryOpts} = opts || {} - const grpcClient = useGRPCClient() - const pubListQuery = useInfiniteQuery({ - ...queryOpts, - queryKey: [queryKeys.DOCUMENT_LIST, trustedOnly ? 'trusted' : 'global'], - refetchOnMount: true, - queryFn: async (context) => { - const result = await grpcClient.publications.listPublications({ - trustedOnly: trustedOnly, - pageSize: 50, - pageToken: context.pageParam, - }) - const publications = result.publications || [] - - return { - ...result, - publications, - } - }, - getNextPageParam: (lastPage) => { - return lastPage.nextPageToken - }, - }) - - const allPublications = - pubListQuery.data?.pages.flatMap((page) => page.publications) || [] - return { - ...pubListQuery, - data: { - ...pubListQuery.data, - publications: allPublications, - }, - } -} - -export function usePublicationFullList( - opts?: UseInfiniteQueryOptions & { - trustedOnly: boolean - }, -) { - const pubList = usePublicationList(opts) - const accounts = useAllAccounts() - const data = useMemo(() => { - function lookupAccount(accountId: string | undefined) { - if (!accountId) return undefined - return accounts.data?.accounts.find((acc) => acc.id === accountId) - } - return pubList.data?.publications.map((pub) => { - return { - publication: pub, - author: lookupAccount(pub?.document?.author), - editors: pub?.document?.editors?.map(lookupAccount) || [], - } - }) - }, [pubList.data, accounts.data]) - return {...pubList, data} -} - -export function useDraftList( - opts: UseQueryOptions = {}, -) { - const grpcClient = useGRPCClient() - const draftListQuery = useInfiniteQuery({ - queryKey: [queryKeys.GET_DRAFT_LIST], - refetchOnMount: true, - queryFn: async (context) => { - const result = await grpcClient.drafts.listDrafts({ - pageToken: context.pageParam, - pageSize: 2000000, // temp large page size because we do not paginate drafts from the frontend - }) - - const documents = - result.documents.sort((a, b) => - sortDocuments(a.updateTime, b.updateTime), - ) || [] - return { - ...result, - documents: documents.map(hmDocument), - } - }, - getNextPageParam: (lastPage) => { - return lastPage.nextPageToken || undefined - }, - ...opts, - }) - - const allDrafts = - draftListQuery.data?.pages.flatMap((page) => page.documents) || [] - - return { - ...draftListQuery, - data: { - ...draftListQuery.data, - documents: allDrafts, - }, - } -} - -export function useDeleteDraft( - opts: UseMutationOptions, -) { - const {queryClient} = useAppContext() - const grpcClient = useGRPCClient() - const invalidate = useQueryInvalidator() - return useMutation({ - ...opts, - mutationFn: async (documentId) => { - await grpcClient.drafts.deleteDraft({documentId}) - }, - onSuccess: (response, documentId, context) => { - setTimeout(() => { - invalidate([queryKeys.GET_DRAFT_LIST]) - invalidate([queryKeys.DOCUMENT_DRAFTS, documentId]) - invalidate([queryKeys.ENTITY_TIMELINE, documentId]) - invalidate([queryKeys.EDITOR_DRAFT, documentId]) - queryClient.client.removeQueries([queryKeys.EDITOR_DRAFT, documentId]) - }, 200) - opts?.onSuccess?.(response, documentId, context) - }, - }) -} - -export function usePublication( - { - id, - version, - }: { - id?: string - version?: string - }, - options?: UseQueryOptions, -) { - const grpcClient = useGRPCClient() - return useQuery({ - ...queryPublication(grpcClient, id, version), - ...(options || {}), - }) -} - -export function usePublications( - pubs: { - id?: string - version?: string | null - }[], - options?: UseQueryOptions, -) { - const grpcClient = useGRPCClient() - return useQueries({ - queries: pubs.map((pub) => - queryPublication(grpcClient, pub.id, pub.version || undefined), - ), - ...(options || {}), - }) -} - -export function queryPublication( - grpcClient: GRPCClient, - documentId?: string, - versionId?: string, -): UseQueryOptions | FetchQueryOptions { - return { - queryKey: [queryKeys.DOCUMENT, documentId, versionId], - enabled: !!documentId, - // retry: false, // to test error handling faster - // default is 5. the backend waits ~1s for discovery, so we retry for a little while in case document is on its way. - retry: 10, - // about 15 seconds total right now - queryFn: async () => { - const pub = await grpcClient.publications.getPublication({ - documentId, - version: versionId, - }) - const hmPub = hmPublication(pub) - if (!hmPub) throw new Error('Failed to produce HMPublication') - return hmPub - }, - } -} - -type ListedEmbed = { - blockId: string - ref: string - refId: UnpackedHypermediaId -} - -function extractRefs( - children: HMBlockNode[], - skipCards?: boolean, -): ListedEmbed[] { - let refs: ListedEmbed[] = [] - function extractRefsFromBlock(block: HMBlockNode) { - if (block.block?.type === 'embed' && block.block.ref) { - if (block.block.attributes?.view === 'card' && skipCards) return - const refId = unpackHmId(block.block.ref) - if (refId) - refs.push({ - blockId: block.block.id, - ref: block.block.ref, - refId, - }) - } - if (block.children) { - block.children.forEach(extractRefsFromBlock) - } - } - children.forEach(extractRefsFromBlock) - // console.log('extractRefs', children, refs) - return refs -} - -export type EmbedsContent = Record< - string, - | { - type: 'd' - data: HMPublication - query: {refId: UnpackedHypermediaId; blockId: string} - } - | { - type: 'a' - data: HMAccount - query: {refId: UnpackedHypermediaId; blockId: string} - } - | undefined -> - -export function useDocumentEmbeds( - doc: HMDocument | undefined, - enabled?: boolean, - opts?: {skipCards: boolean}, -): EmbedsContent { - const {queryPublications, queryGroups, queryAccounts} = useMemo(() => { - if (!enabled) - return {queryPublications: [], queryGroups: [], queryAccounts: []} - const queryPublications: { - blockId: string - refId: UnpackedHypermediaId - }[] = [] - const queryAccounts: {blockId: string; refId: UnpackedHypermediaId}[] = [] - const queryGroups: { - blockId: string - refId: UnpackedHypermediaId - }[] = [] - extractRefs(doc?.children || [], opts?.skipCards).forEach( - ({refId, blockId}) => { - if (refId.type === 'a') { - queryAccounts.push({blockId, refId}) - } else if (refId.type === 'd') { - queryPublications.push({blockId, refId}) - } - }, - ) - return { - queryPublications, - queryGroups, - queryAccounts, - } - }, [doc, enabled]) - const pubs = usePublications( - queryPublications.map((q) => ({id: q.refId.qid, version: q.refId.version})), - ) - const accounts = useAccounts(queryAccounts.map((q) => q.refId.eid)) - const embeds = Object.fromEntries([ - ...pubs.map((pub, idx) => [ - queryPublications[idx].blockId, - {type: 'd', query: queryPublications[idx], data: pub.data}, - ]), - ...accounts.map((account, idx) => [ - queryAccounts[idx].blockId, - {type: 'a', query: queryAccounts[idx], data: account.data}, - ]), - ]) as EmbedsContent - return embeds -} - -export function useDocumentVersions( - documentId: string | undefined, - versions: string[], -) { - const grpcClient = useGRPCClient() - return useQueries({ - queries: versions.map((version) => - queryPublication(grpcClient, documentId, version), - ), - }) -} -// TODO: Duplicate (apps/site/server/routers/_app.ts#~187) -export function sortDocuments(a?: Timestamp, b?: Timestamp) { - let dateA = a ? a.toDate() : 0 - let dateB = b ? b.toDate() : 1 - - // @ts-ignore - return dateB - dateA -} - -export function getDefaultShortname( - docTitle: string | undefined, - docId: string, -) { - const unpackedId = unpackDocId(docId) - const idShortname = unpackedId ? unpackedId.eid.slice(0, 5).toLowerCase() : '' - const kebabName = docTitle ? pathNameify(docTitle) : idShortname - const shortName = - kebabName.length > 40 ? kebabName.substring(0, 40) : kebabName - return shortName -} - -function useDraftDiagnosis() { - const appendDraft = trpc.diagnosis.appendDraftLog.useMutation() - const completeDraft = trpc.diagnosis.completeDraftLog.useMutation() - return { - append(draftId, event) { - return appendDraft.mutateAsync({draftId, event}) - }, - complete(draftId, event) { - return completeDraft.mutateAsync({draftId, event}) - }, - } -} - -function changesToJSON(changes: DocumentChange[]) { - return changes.map((change) => { - if (change.op.case === 'replaceBlock') { - return {...change.op} - } - return change.op - }) -} - -export function usePublishDraft( - opts?: UseMutationOptions< - { - pub: Document - isFirstPublish: boolean - isProfileDocument: boolean - }, - unknown, - { - draftId: string - } - >, -) { - const queryClient = useAppContext().queryClient - const markDocPublish = trpc.welcoming.markDocPublish.useMutation() - const grpcClient = useGRPCClient() - const route = useNavRoute() - const draftRoute = route.key === 'draft' ? route : undefined - const myAccount = useMyAccount() - const isProfileDocument = - draftRoute?.isProfileDocument || - myAccount.data?.profile?.rootDocument === draftRoute?.draftId - const {client, invalidate} = queryClient - const diagnosis = useDraftDiagnosis() - return useMutation({ - ...opts, - mutationFn: async ({ - draftId, - }: { - draftId: string - }): Promise<{ - pub: Document - isFirstPublish: boolean - isProfileDocument: boolean - }> => { - const pub = await grpcClient.drafts.publishDraft({documentId: draftId}) - await diagnosis.complete(draftId, { - key: 'did.publishDraft', - value: hmPublication(pub), - }) - const isFirstPublish = await markDocPublish.mutateAsync(draftId) - const publishedId = pub.document?.id - if (!publishedId) - throw new Error('Could not get ID of published document') - if (isProfileDocument) { - if (myAccount.data?.profile?.rootDocument !== publishedId) { - await grpcClient.accounts.updateProfile({ - ...myAccount.data?.profile, - rootDocument: publishedId, - }) - } - } - return {isFirstPublish, pub, isProfileDocument} - }, - onSuccess: (result, variables, context) => { - const documentId = result.pub.document?.id - opts?.onSuccess?.(result, variables, context) - invalidate([queryKeys.FEED_LATEST_EVENT]) - invalidate([queryKeys.RESOURCE_FEED_LATEST_EVENT]) - invalidate([queryKeys.DOCUMENT_LIST]) - invalidate([queryKeys.GET_DRAFT_LIST]) - invalidate([queryKeys.DOCUMENT_DRAFTS, documentId]) - invalidate([queryKeys.DOCUMENT, documentId]) - invalidate([queryKeys.ENTITY_TIMELINE, documentId]) - invalidate([queryKeys.GET_ALL_ACCOUNTS]) // accounts invalidate because profile doc may be updated - invalidate([queryKeys.GET_ACCOUNT, myAccount.data?.id]) - invalidate([queryKeys.ENTITY_CITATIONS]) - setTimeout(() => { - client.removeQueries([queryKeys.EDITOR_DRAFT, documentId]) - // otherwise it will re-query for a draft that no longer exists and an error happens - }, 250) - }, - }) -} - -export type EditorDraftState = { - id: string - children: Array - title: string - changes: DraftChangesState - webUrl: string - updatedAt: any -} - -export function useDraftTitle( - input: UseQueryOptions & {documentId?: string | undefined}, -) { - const draft = useDraft({documentId: input.documentId}) - return draft.data?.title || undefined -} - -type DraftChangesState = { - moves: MoveBlockAction[] - changed: Set - deleted: Set - webUrl?: string -} - -type MoveBlockAction = { - blockId: string - leftSibling: string - parent: string -} - -export function useDraft({ - draftId, - ...options -}: UseQueryOptions & { - draftId?: string -}) { - const grpcClient = useGRPCClient() - const diagnosis = useDraftDiagnosis() - return useQuery(queryDraft({draftId, grpcClient, diagnosis, ...options})) -} - -export function useDrafts( - ids: string[], - options?: UseQueryOptions, -) { - const grpcClient = useGRPCClient() - return useQueries({ - queries: ids.map((draftId) => queryDraft({draftId: draftId, grpcClient})), - ...(options || {}), - }) -} - -export function queryDraft({ - draftId, - grpcClient, - diagnosis, - ...options -}: { - draftId?: string - grpcClient: GRPCClient - diagnosis?: ReturnType -} & UseQueryOptions): UseQueryOptions { - return { - enabled: !!draftId, - queryKey: [queryKeys.EDITOR_DRAFT, draftId], - useErrorBoundary: false, - queryFn: async () => { - try { - let serverDraft = await grpcClient.drafts.getDraft({ - draftId, - }) - - // const doc = serverDraft - const doc = serverDraft ? hmDocument(serverDraft) : null - - diagnosis?.append(draftId!, { - key: 'getDraft', - value: doc, - }) - - return doc - } catch (error) { - diagnosis?.append(draftId!, { - key: 'getDraftError', - value: JSON.stringify(error), - }) - return null - } - }, - ...options, - } -} - -/** - * - * Draft Machine logic - * - * - initialize machine with all the context data: - * - draft: Document - * - - * - fetch draft - * - Error: show draft error (maybe retry or do extra checks before showing the error) - * - OK: - */ - -export function useDraftEditor({ - documentId, - route, - checkWebUrl, -}: { - documentId?: string - route: NavRoute - checkWebUrl: any -}) { - const grpcClient = useGRPCClient() - const openUrl = useOpenUrl() - const replace = useNavigate('replace') - const queryClient = useAppContext().queryClient - const {invalidate, client} = queryClient - const diagnosis = useDraftDiagnosis() - const gotEdited = useRef(false) - const {inlineMentionsData, inlineMentionsQuery} = useInlineMentions() - const [writeEditorStream, editorStream] = useRef( - writeableStateStream(null), - ).current - const showNostr = trpc.experiments.get.useQuery().data?.nostr - - // fetch draft - const backendDraft = useDraft({ - documentId, - onError: (error) => { - send({type: 'GET.DRAFT.ERROR', error}) - }, - }) - - const draftStatusActor = DraftStatusContext.useActorRef() - - const [state, send, actor] = useMachine( - draftMachine.provide({ - actions: { - populateEditor: ({event}) => { - if ( - event.type == 'GET.DRAFT.SUCCESS' && - event.draft.children?.length - ) { - let editorBlocks = toHMBlock(event.draft.children) - const tiptap = editor?._tiptapEditor - // editor.removeBlocks(editor.topLevelBlocks) - editor.replaceBlocks(editor.topLevelBlocks, editorBlocks) - // this is a hack to set the current blockGroups in the editor to the correct type, because from the BN API we don't have access to those nodes. - setGroupTypes(tiptap, editorBlocks) - } - }, - focusEditor: () => { - const tiptap = editor?._tiptapEditor - if (tiptap && !tiptap.isFocused) { - editor._tiptapEditor.commands.focus() - } - }, - onSaveSuccess: ({event}) => { - // because this action is called as a result of a promised actor, that's why there are errors and is not well typed - // @ts-expect-error - if (event.output) { - invalidate([queryKeys.GET_DRAFT_LIST]) - invalidate([queryKeys.DOCUMENT_DRAFTS, documentId]) - invalidate([queryKeys.EDITOR_DRAFT, documentId]) - } - }, - indicatorChange: () => - draftStatusActor.send({type: 'INDICATOR.CHANGE'}), - indicatorSaving: () => - draftStatusActor.send({type: 'INDICATOR.SAVING'}), - indicatorSaved: () => draftStatusActor.send({type: 'INDICATOR.SAVED'}), - indicatorError: () => draftStatusActor.send({type: 'INDICATOR.ERROR'}), - indicatorIdle: () => draftStatusActor.send({type: 'INDICATOR.IDLE'}), - resetDraftAndRedirectToDraftList: () => { - try { - grpcClient.drafts - .deleteDraft({documentId}) - .catch((error) => { - diagnosis?.append(documentId!, { - key: 'deleteDraft', - value: `Error deleting draft ${documentId}: ${error.message}`, - }) - }) - .then(() => { - diagnosis?.append(documentId!, { - key: 'deleteDraft', - value: `Delete draft ${documentId} success`, - }) - invalidate([queryKeys.GET_DRAFT_LIST]) - invalidate([queryKeys.DOCUMENT_DRAFTS, documentId]) - }) - } catch (error) { - diagnosis?.append(documentId!, { - key: 'deleteDraft', - value: `Error deleting draft ${documentId}: ${error.message}`, - }) - } - - replace({key: 'feed', tab: 'trusted'}) - }, - }, - actors: { - updateDraft: fromPromise< - UpdateDraftResponse | string, - ContextFrom - >(async ({input}) => { - // delay the time we save to the backend to force editor changes. - // await delay(0) - return updateDraft({ - editor, - blocksMap: input.blocksMap, - title: input.title, - draft: input.draft, - }) - }), - restoreDraft: fromPromise< - UpdateDraftResponse | string, - ContextFrom - >(async ({input}) => { - const prevDraft = input.draft ? hmDocument(input.draft) : null - if (!prevDraft) throw new Error('Expecting previous draft to restore') - if (!prevDraft.children) - throw new Error('Expecting previous draft with children to restore') - const prevBlocksMap = input.blocksMap - try { - // delete draft - await grpcClient.drafts.deleteDraft({documentId}) - // create new draft - const newDraftRaw = await grpcClient.drafts.createDraft({ - existingDocumentId: documentId, - }) - const newDraft = newDraftRaw ? hmDocument(newDraftRaw) : null - - const newBlocksMap = newDraft?.children - ? createBlocksMap(newDraft.children, '') - : {} - // prevDraft is the final result I want - - let {changes, touchedBlocks} = compareDraftWithMap( - newBlocksMap, - prevDraft?.children, - '', - ) - - let deletedBlocks = extractDeletes(newBlocksMap, touchedBlocks) - - // TODO: update title too - - let capturedChanges = [...changes, ...deletedBlocks] - - if (capturedChanges.length) { - // capturedChanges = capturedChanges.map((i) => i.toJson()) - diagnosis.append(documentId, { - key: 'will.restoreDraft', - // note: 'regular updateDraft', - value: { - changes: changesToJSON(capturedChanges), - newBlocksMap, - // prevDraft, - }, - }) - - return await grpcClient.drafts - .updateDraft({ - documentId, - changes: capturedChanges, - }) - .then((res) => { - if (res.updatedDocument) { - client.setQueryData( - [queryKeys.EDITOR_DRAFT, documentId], - res.updatedDocument, - ) - } - - diagnosis.append(documentId, { - key: 'did.restoredDraft', - // note: 'regular updateDraft', - value: JSON.stringify(res), - }) - - invalidate([queryKeys.GET_DRAFT_LIST]) - invalidate([queryKeys.DOCUMENT_DRAFTS, documentId]) - - return res - }) - } - } catch (error) { - return Promise.reject(`Error restoring: ${JSON.stringify(error)}`) - } - }), - resetDraft: fromPromise< - UpdateDraftResponse | string, - ContextFrom - >(async () => { - try { - // delete draft - await grpcClient.drafts.deleteDraft({documentId}) - // create new draft - const newDraft = await grpcClient.drafts.createDraft({ - existingDocumentId: documentId, - }) - - invalidate([queryKeys.GET_DRAFT_LIST]) - invalidate([queryKeys.DOCUMENT_DRAFTS, documentId]) - - return newDraft - } catch (error) { - throw new Error(`Error resetting: ${JSON.stringify(error)}`) - } - }), - }, - delays: { - // This is the time the machine waits after the last keystroke event before starting to save. - autosaveTimeout: 500, - }, - }), - ) - - const gwUrl = useGatewayUrlStream() - - // create editor - const editor = useBlockNote({ - onEditorContentChange(editor: BlockNoteEditor) { - if (!gotEdited.current) { - gotEdited.current = true - } - - writeEditorStream(editor.topLevelBlocks) - observeBlocks( - editor, - editor.topLevelBlocks, - () => {}, - // send({type: 'CHANGE'}), - ) - send({type: 'CHANGE'}) - }, - onTextCursorPositionChange(editor: BlockNoteEditor) { - const {view} = editor._tiptapEditor - const {selection} = view.state - if ( - selection.from !== selection.to && - !(selection instanceof NodeSelection) - ) - return - const domAtPos = view.domAtPos(selection.from) - try { - const rect: DOMRect = domAtPos.node.getBoundingClientRect() - // Check if the cursor is off screen - if ((rect && rect.top < 0) || rect.bottom > window.innerHeight) { - // Scroll the cursor into view - domAtPos.node.scrollIntoView({block: 'center'}) - } - } catch {} - return - }, - - linkExtensionOptions: { - openOnClick: false, - queryClient, - grpcClient, - gwUrl, - openUrl, - checkWebUrl: checkWebUrl.mutate, - }, - onMentionsQuery: (query: string) => { - inlineMentionsQuery(query) - }, - - // onEditorReady: (e) => { - // readyThings.current[0] = e - // handleMaybeReady() - // }, - blockSchema: hmBlockSchema, - slashMenuItems: !showNostr - ? slashMenuItems.filter((item) => item.name != 'Nostr') - : slashMenuItems, - _tiptapOptions: { - extensions: [ - Extension.create({ - name: 'hypermedia-link', - addProseMirrorPlugins() { - return [ - createHypermediaDocLinkPlugin({ - queryClient, - }).plugin, - ] - }, - }), - ], - }, - }) - - useEffect(() => { - if (state.matches('fetching')) { - if (backendDraft.status == 'success' && backendDraft.data) { - send({type: 'GET.DRAFT.SUCCESS', draft: backendDraft.data}) - } else if (backendDraft.status == 'error') { - send({type: 'GET.DRAFT.ERROR', error: backendDraft.error}) - } - } - - return () => { - if (state.matches({ready: 'changed'})) { - updateDraft({ - editor, - draft: state.context.draft, - blocksMap: state.context.blocksMap, - title: state.context.title, - }).then(() => { - invalidate([queryKeys.GET_DRAFT_LIST]) - invalidate([queryKeys.DOCUMENT_DRAFTS, documentId]) - invalidate([queryKeys.EDITOR_DRAFT, documentId]) - }) - } - } - }, [backendDraft.status]) - - useEffect(() => { - if (inlineMentionsData) { - editor?.setInlineEmbedOptions(inlineMentionsData) - } - }, [inlineMentionsData]) - - useEffect(() => { - function handleSelectAll(event: KeyboardEvent) { - if (event.key == 'a' && event.metaKey) { - if (editor) { - event.preventDefault() - editor._tiptapEditor.commands.focus() - editor._tiptapEditor.commands.selectAll() - } - } - } - - window.addEventListener('keydown', handleSelectAll) - - return () => { - window.removeEventListener('keydown', handleSelectAll) - } - }, []) - - function handleFocusAtMousePos(event) { - let ttEditor = (editor as BlockNoteEditor)._tiptapEditor - let editorView = ttEditor.view - let editorRect = editorView.dom.getBoundingClientRect() - let centerEditor = editorRect.left + editorRect.width / 2 - - const pos = editorView.posAtCoords({ - left: editorRect.left + 1, - top: event.clientY + editorView.dom.offsetTop, - }) - - if (pos) { - let node = editorView.state.doc.nodeAt(pos.pos) - - let sel = Selection.near( - editorView.state.doc.resolve( - event.clientX < centerEditor ? pos.pos : pos.pos + node.nodeSize - 1, - ), - ) - - ttEditor.commands.focus() - ttEditor.commands.setTextSelection(sel) - } else { - if (event.clientY > editorRect.top) { - // this is needed because if the user clicks on one of the sides of the title we don't want to jump to the bottom of the document to focus the document. - // if the window is scrolled and the title is not visible this will not matter because a block will be at its place so the normal focus should work. - ttEditor.commands.focus() - ttEditor.commands.setTextSelection(ttEditor.state.doc.nodeSize) - } - } - } - - async function updateDraft({editor, blocksMap, draft, title}) { - let currentEditorBlocks = [...editor.topLevelBlocks] - let {changes, touchedBlocks} = compareBlocksWithMap( - editor, - blocksMap, - currentEditorBlocks, - '', - ) - - let deletedBlocks = extractDeletes(blocksMap, touchedBlocks) - - if (draft?.title != title) { - changes = [ - new DocumentChange({ - op: { - case: 'setTitle', - value: title, - }, - }), - ...changes, - ] - } - - let capturedChanges = [...changes, ...deletedBlocks] - - if (capturedChanges.length) { - // capturedChanges = capturedChanges.map((i) => i.toJson()) - diagnosis.append(documentId, { - key: 'will.updateDraft', - // note: 'regular updateDraft', - value: { - changes: changesToJSON(capturedChanges), - blocksMap, - editorState: currentEditorBlocks, - }, - }) - try { - let mutation = await grpcClient.drafts.updateDraft({ - documentId, - changes: [...capturedChanges], - }) - if (mutation.updatedDocument) { - client.setQueryData( - [queryKeys.EDITOR_DRAFT, documentId], - mutation.updatedDocument, - ) - } - - diagnosis.append(documentId, { - key: 'did.updateDraft', - // note: 'regular updateDraft', - value: JSON.stringify(mutation), - }) - - return mutation - } catch (error) { - return Promise.reject(JSON.stringify(error)) - } - } - - return Promise.resolve('No changes applied.') - } - - return { - state, - send, - actor, - draft: backendDraft.data, - editor, - editorStream, - draftStatusActor, - handleFocusAtMousePos, - } -} - -export type HyperDocsEditor = Exclude< - ReturnType['editor'], - null -> - -export const findBlock = findParentNode( - (node) => node.type.name === 'blockContainer', -) - -export function useDocTextContent(pub?: HMPublication) { - return useMemo(() => { - let res = '' - function extractContent(blocks: Array) { - blocks.forEach((bn) => { - if (res.length < 300) { - res += extractBlockText(bn) - } - }) - - return res - } - - function extractBlockText({block, children}: HMBlockNode) { - let content = '' - if (!block) return content - if (block.text) content += block.text - - if (children?.length) { - let nc = extractContent(children) - content += nc - } - - return content - } - - if (pub?.document?.children?.length) { - res = extractContent(pub.document.children) - } - - return res - }, [pub]) -} - -export type BlocksMap = Record - -export type BlocksMapItem = { - parent: string - left: string - block: HMBlock -} - -export function createBlocksMap( - blockNodes: Array = [], - parentId: string, -) { - let result: BlocksMap = {} - blockNodes.forEach((bn, idx) => { - if (bn.block?.id) { - let prevBlockNode = idx > 0 ? blockNodes[idx - 1] : undefined - - if (bn.block) { - result[bn.block.id] = { - parent: parentId, - left: - prevBlockNode && prevBlockNode.block ? prevBlockNode.block.id : '', - block: bn.block, - } - } - - if (bn.children?.length) { - // recursively call the block children and append to the result - result = {...result, ...createBlocksMap(bn.children, bn.block.id)} - } - } - }) - - return result -} - -export function usePushPublication() { - const gatewayUrl = useGatewayUrl() - const grpcClient = useGRPCClient() - return useMutation({ - mutationFn: async (docId: string) => { - if (!gatewayUrl.data) throw new Error('Cannot determine Gateway URL') - await grpcClient.publications.pushPublication({ - documentId: docId, - url: gatewayUrl.data, - }) - }, - }) -} - -export function compareBlocksWithMap( - editor: BlockNoteEditor, - blocksMap: BlocksMap, - blocks: Array, - parentId: string, -) { - let changes: Array = [] - let touchedBlocks: Array = [] - - // iterate over editor blocks - blocks.forEach((block, idx) => { - // add blockid to the touchedBlocks list to capture deletes later - touchedBlocks.push(block.id) - - // compare replace - let prevBlockState = blocksMap[block.id] - - const childGroup = getBlockGroup(editor, block.id) - - if (childGroup) { - // @ts-expect-error - block.props.childrenType = childGroup.type ? childGroup.type : 'group' - // @ts-expect-error - block.props.listLevel = childGroup.listLevel - // @ts-expect-error - if (childGroup.start) block.props.start = childGroup.start.toString() - } - let currentBlockState = fromHMBlock(block) - - if ( - !prevBlockState || - prevBlockState.block.attributes?.listLevel !== - currentBlockState.attributes.listLevel - ) { - const serverBlock = fromHMBlock(block) - - // add moveBlock change by default to all blocks - changes.push( - new DocumentChange({ - op: { - case: 'moveBlock', - value: { - blockId: block.id, - leftSibling: idx > 0 && blocks[idx - 1] ? blocks[idx - 1].id : '', - parent: parentId, - }, - }, - }), - new DocumentChange({ - op: { - case: 'replaceBlock', - value: serverBlock, - }, - }), - ) - } else { - let left = idx > 0 && blocks[idx - 1] ? blocks[idx - 1].id : '' - if (prevBlockState.left !== left || prevBlockState.parent !== parentId) { - changes.push( - new DocumentChange({ - op: { - case: 'moveBlock', - value: { - blockId: block.id, - leftSibling: left, - parent: parentId, - }, - }, - }), - ) - } - - if (!isBlocksEqual(prevBlockState.block, currentBlockState)) { - // this means is a new block and we need to also add a replaceBlock change - changes.push( - new DocumentChange({ - op: { - case: 'replaceBlock', - value: currentBlockState, - }, - }), - ) - } - } - - if (block.children.length) { - let nestedResults = compareBlocksWithMap( - editor, - blocksMap, - block.children, - block.id, - ) - changes = [...changes, ...nestedResults.changes] - touchedBlocks = [...touchedBlocks, ...nestedResults.touchedBlocks] - } - }) - - return { - changes, - touchedBlocks, - } -} - -export function compareDraftWithMap( - blocksMap: BlocksMap, - blockNodes: HMBlockNode[], - parentId: string, -) { - let changes: Array = [] - let touchedBlocks: Array = [] - - // iterate over editor blocks - blockNodes.forEach((bn, idx) => { - if (bn.block) { - // add blockid to the touchedBlocks list to capture deletes later - touchedBlocks.push(bn.block.id) - - // compare replace - let prevBlockState = blocksMap[bn.block.id] - - // TODO: get block group - - let currentBlockState = bn.block - - if (!prevBlockState) { - const serverBlock = currentBlockState - - // add moveBlock change by default to all blocks - changes.push( - new DocumentChange({ - op: { - case: 'moveBlock', - value: { - blockId: bn.block.id, - leftSibling: - idx > 0 && blockNodes[idx - 1] - ? blockNodes[idx - 1].block!.id - : '', - parent: parentId, - }, - }, - }), - new DocumentChange({ - op: { - case: 'replaceBlock', - value: serverBlock, - }, - }), - ) - } else { - let left = - idx > 0 && blockNodes[idx - 1] ? blockNodes[idx - 1].block!.id : '' - if ( - prevBlockState.left !== left || - prevBlockState.parent !== parentId - ) { - changes.push( - new DocumentChange({ - op: { - case: 'moveBlock', - value: { - blockId: bn.block.id, - leftSibling: left, - parent: parentId, - }, - }, - }), - ) - } - - if (!isBlocksEqual(prevBlockState.block, currentBlockState)) { - // this means is a new block and we need to also add a replaceBlock change - changes.push( - new DocumentChange({ - op: { - case: 'replaceBlock', - value: currentBlockState, - }, - }), - ) - } - } - - if (bn.children?.length) { - let nestedResults = compareDraftWithMap( - blocksMap, - bn.children, - bn.block.id, - ) - changes = [...changes, ...nestedResults.changes] - touchedBlocks = [...touchedBlocks, ...nestedResults.touchedBlocks] - } - } - }) - - return { - changes, - touchedBlocks, - } -} - -export function extractDeletes( - blocksMap: BlocksMap, - touchedBlocks: Array, -) { - let deletedIds = Object.keys(blocksMap).filter( - (id) => !touchedBlocks.includes(id), - ) - - return deletedIds.map( - (dId) => - new DocumentChange({ - op: { - case: 'deleteBlock', - value: dId, - }, - }), - ) -} - -export function isBlocksEqual(b1: HMBlock, b2: HMBlock): boolean { - let result = - // b1.id == b2.id && - b1.text == b2.text && - b1.ref == b2.ref && - _.isEqual(b1.annotations, b2.annotations) && - // TODO: how to correctly compare attributes??? - isBlockAttributesEqual(b1, b2) && - b1.type == b2.type - return result -} - -function isBlockAttributesEqual(b1: HMBlock, b2: HMBlock): boolean { - let a1 = b1.attributes - let a2 = b2.attributes - if (!a1 && !a2) return true - if (!a1 || !a2) return false - return ( - a1.childrenType == a2.childrenType && - a1.start == a2.start && - a1.level == a2.level && - a1.url == a2.url && - a1.size == a2.size && - a1.ref == a2.ref && - a1.language == a2.language && - a1.view == a2.view && - a1.width == a2.width - ) -} - -function observeBlocks( - editor: BlockNoteEditor, - blocks: Array>, - onChange: () => void, -) { - blocks.forEach((block, index) => { - if (block.type == 'imagePlaceholder' && block.props.src) { - editor.updateBlock(block, { - type: 'image', - props: { - src: block.props.src, - name: block.props.name, - }, - }) - onChange() - } - - if (block.children) { - observeBlocks(editor, block.children, onChange) - } - - // TODO: this code was making impossible to remove a paragraph above a media element when it was nested. This was in place because it was also impossible to add a selection above a media element when this media element was the last one in the draft. Now it seems to both cases be fixed when this code is removed. 🤷‍♂️ - // if ( - // index === blocks.length - 1 && - // ['image', 'video', 'file', 'embed'].includes(block.type) - // ) { - // editor.insertBlocks( - // [ - // { - // type: 'paragraph', - // }, - // ], - // block.id, - // 'after', - // ) - // if (editor.getTextCursorPosition().nextBlock) { - // editor.setTextCursorPosition(editor.getTextCursorPosition().nextBlock) - // } - // } - }) -} - -export function useAccountPublicationFullList( - accountId: string | undefined, - opts?: UseQueryOptions, -) { - const pubList = useAccountPublications(accountId) - const accounts = useAllAccounts() - const data = useMemo(() => { - function lookupAccount(accountId: string | undefined) { - if (!accountId) return undefined - return accounts.data?.accounts.find((acc) => acc.id === accountId) - } - return pubList.data?.publications.map((pub) => { - return { - publication: pub, - author: lookupAccount(pub?.document?.author), - editors: pub?.document?.editors?.map(lookupAccount) || [], - } - }) - }, [pubList.data, accounts.data]) - return {...pubList, data} -} - -export function useAccountPublications(accountId?: string | undefined) { - const grpcClient = useGRPCClient() - return useQuery({ - queryKey: [queryKeys.ACCOUNT_DOCUMENTS, accountId], - enabled: !!accountId, - queryFn: async () => { - const result = await grpcClient.publications.listAccountPublications({ - accountId, - }) - const publications: HMPublication[] = (result.publications - .map((pub) => hmPublication(pub)) - .filter(Boolean) - .sort((a, b) => { - const aTime = a?.document?.updateTime - ? new Date(a.document.updateTime) - : 0 - const bTime = b?.document?.updateTime - ? new Date(b.document.updateTime) - : 0 - if (!aTime || !bTime) return 0 - return bTime.getTime() - aTime.getTime() - }) || []) as HMPublication[] - return { - publications, - } - }, - }) -} - -export function useDraftRebase({ - shouldCheck, - draft, -}: { - shouldCheck: boolean - draft: HMDocument | null | undefined -}) { - const grpcClient = useGRPCClient() - const [rebase, setRebase] = useState(false) - const [newVersion, selectNewVersion] = useState('') - - useEffect(() => { - const INTERVAL = 10000 - var interval - if (draft && shouldCheck) { - interval = setInterval(checkForRebase, INTERVAL) - checkForRebase() - } - - async function checkForRebase() { - if (!draft?.previousVersion) { - return - } - - const latestDoc = await grpcClient.publications.getPublication({ - documentId: draft!.id, - }) - - const prevVersion = draft.previousVersion.split('.') - const latestVersion = latestDoc.version.split('.') - /** - * When I ask the backend for a publication without a version, it will respond - * with the latest version for that particular owner and also combined with my latest changes if those are not deps from the owner. - * this means that I need to check the latest version of the document with the previowVersion that my draft have - */ - if (latestVersion && !_.isEqual(latestVersion, prevVersion)) { - setRebase(true) - selectNewVersion( - latestVersion.length > 1 ? latestVersion.join('.') : latestVersion[0], - ) - } - } - - return () => { - if (interval) { - clearInterval(interval) - } - } - }, [shouldCheck]) - - return { - shouldRebase: rebase, - newVersion, - } -} diff --git a/frontend/packages/app/package.json b/frontend/packages/app/package.json deleted file mode 100644 index 7e492558f1..0000000000 --- a/frontend/packages/app/package.json +++ /dev/null @@ -1,102 +0,0 @@ -{ - "name": "@shm/app", - "version": "0.1.0", - "main": "index.ts", - "private": true, - "sideEffects": [ - "*.css" - ], - "scripts": { - "format": "prettier \"**/*.{ts,tsx,md,mdx,json,js}\" --check --ignore-path ../../../.prettierignore", - "test": "echo 'APP: NO TESTS';", - "typecheck": "tsc --noEmit" - }, - "dependencies": { - "@ariakit/react": "0.3.5", - "@bufbuild/protobuf": "^1.10.0", - "@connectrpc/connect-web": "1.1.3", - "@dnd-kit/core": "^6.1.0", - "@dnd-kit/sortable": "^8.0.0", - "@emotion/cache": "11.11.0", - "@emotion/react": "11.11.1", - "@emotion/serialize": "1.1.2", - "@emotion/utils": "1.2.1", - "@hookform/resolvers": "3.3.1", - "@juggle/resize-observer": "3.4.0", - "@mantine/core": "6.0.13", - "@mantine/hooks": "6.0.13", - "@manuscripts/prosemirror-recreate-steps": "^0.1.4", - "@radix-ui/colors": "0.1.9", - "@radix-ui/react-dropdown-menu": "2.0.5", - "@sentry/tracing": "7.49.0", - "@shm/shared": "*", - "@shm/ui": "*", - "@tanstack/react-query": "4.33.0", - "@tanstack/react-query-devtools": "4.33.0", - "@tippyjs/react": "4.2.6", - "@tiptap/core": "2.0.3", - "@tiptap/extension-bold": "2.0.3", - "@tiptap/extension-code": "2.0.3", - "@tiptap/extension-collaboration": "2.0.3", - "@tiptap/extension-collaboration-cursor": "2.0.3", - "@tiptap/extension-dropcursor": "2.0.3", - "@tiptap/extension-gapcursor": "2.0.3", - "@tiptap/extension-hard-break": "2.0.3", - "@tiptap/extension-history": "2.0.3", - "@tiptap/extension-italic": "2.0.3", - "@tiptap/extension-strike": "2.0.3", - "@tiptap/extension-text": "2.0.3", - "@tiptap/extension-underline": "2.0.3", - "@tiptap/pm": "2.0.3", - "@tiptap/react": "2.0.3", - "@xstate/react": "beta", - "allotment": "1.18.1", - "fast-deep-equal": "^3.1.3", - "graphql-request": "6.0.0", - "hast-util-from-dom": "4.2.0", - "highlight.js": "11.9.0", - "katex": "^0.16.9", - "linkifyjs": "4.1.1", - "lowlight": "3.1.0", - "lz-string": "1.5.0", - "nanoid": "4.0.2", - "nostr-tools": "1.16.0", - "prosemirror-state": "1.4.3", - "react": "18.2.0", - "react-dom": "18.2.0", - "react-error-boundary": "4.0.11", - "react-hook-form": "7.46.1", - "react-icons": "4.9.0", - "react-tweet": "^3.2.0", - "rehype": "12.0.1", - "rehype-parse": "8.0.4", - "rehype-remark": "9.1.2", - "rehype-stringify": "9.0.3", - "remark-gfm": "3.0.1", - "remark-parse": "10.0.1", - "remark-rehype": "10.1.0", - "remark-stringify": "10.0.2", - "unified": "10.1.2", - "use-prefers-color-scheme": "1.1.3", - "xstate": "beta", - "y-prosemirror": "1.2.1", - "y-protocols": "1.0.5", - "yjs": "13.6.4", - "zod": "3.22.2" - }, - "devDependencies": { - "@shm/prettier": "*", - "@tamagui/vite-plugin": "1.95.0", - "@types/node": "20.6.5", - "@types/prosemirror-dev-tools": "3.0.3", - "@types/react": "18.2.21", - "@types/react-dom": "18.2.7", - "copy-text-to-clipboard": "3.1.0", - "happy-dom": "7.8.1", - "jsdom": "22.1.0", - "prettier": "3.0.2", - "prosemirror-dev-tools": "4.0.0", - "typescript": "5.5.1-rc", - "vitest": "0.34.2" - } -} diff --git a/frontend/packages/app/tamagui.config.ts b/frontend/packages/app/tamagui.config.ts deleted file mode 100644 index 53ba914792..0000000000 --- a/frontend/packages/app/tamagui.config.ts +++ /dev/null @@ -1,13 +0,0 @@ -import {config} from '@shm/ui' - -export type Conf = typeof config - -declare module 'tamagui' { - interface TamaguiCustomConfig extends Conf {} - - interface TypeOverride { - groupNames(): 'header' | 'item' - } -} - -export default config diff --git a/frontend/packages/app/tsconfig.json b/frontend/packages/app/tsconfig.json deleted file mode 100644 index 74784ebb59..0000000000 --- a/frontend/packages/app/tsconfig.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "extends": "../../../tsconfig.base", - "compilerOptions": { - "composite": true, - "esModuleInterop": true, - "jsx": "preserve", - "paths": { - "@/*": ["./src/*"], - "@shm/app/*": ["*", "frontend/packages/app/src/*"], - "@shm/shared": ["*", "frontend/packages/shared/src/index.ts"] - } - }, - "references": [] -} diff --git a/frontend/packages/shared/src/client/from-hm-block.ts b/frontend/packages/shared/src/client/from-hm-block.ts index 728a9ca3f6..c8a2a374a0 100644 --- a/frontend/packages/shared/src/client/from-hm-block.ts +++ b/frontend/packages/shared/src/client/from-hm-block.ts @@ -1,4 +1,8 @@ -import {Block as EditorBlock, Styles, hmBlockSchema} from '@shm/app/editor' +import { + Block as EditorBlock, + Styles, + hmBlockSchema, +} from '@shm/desktop/src/editor' import {Block as ServerBlock} from '@shm/shared/src/client/grpc-types' import { ColorAnnotation, diff --git a/frontend/packages/shared/src/hm-types.ts b/frontend/packages/shared/src/hm-types.ts index 109bcd491b..2fb224523a 100644 --- a/frontend/packages/shared/src/hm-types.ts +++ b/frontend/packages/shared/src/hm-types.ts @@ -1,5 +1,5 @@ import {PlainMessage} from '@bufbuild/protobuf' -import {EditorInlineContent} from '@shm/app/editor' +import {EditorInlineContent} from '@shm/desktop/src/editor' import type { Account, ChangeInfo, diff --git a/frontend/packages/shared/src/publication-content.tsx b/frontend/packages/shared/src/publication-content.tsx index 45ee8c7d09..f4b35fe34c 100644 --- a/frontend/packages/shared/src/publication-content.tsx +++ b/frontend/packages/shared/src/publication-content.tsx @@ -1,5 +1,4 @@ import { Timestamp } from '@bufbuild/protobuf' -import { CitationLink } from '@shm/app/models/content-graph' import { API_HTTP_URL, Block, @@ -104,7 +103,7 @@ export type PublicationContentContextValue = { onLinkClick: (dest: string, e: any) => void ipfsBlobPrefix: string saveCidAsFile: (cid: string, name: string) => Promise - citations?: CitationLink['mentions'] + citations?: any onCitationClick?: () => void disableEmbedClick?: boolean diff --git a/tsconfig.json b/tsconfig.json index 5345ad1b32..8cabf1ff1e 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -3,15 +3,8 @@ "strictNullChecks": true, "noUncheckedIndexedAccess": true, "paths": { - "@shm/app/*": [ - "./frontend/packages/app/src/*" - ], - "@shm/ui/*": [ - "./frontend/packages/ui/*" - ], - "@shm/shared/*": [ - "./frontend/packages/shared/*" - ] + "@shm/ui/*": ["./frontend/packages/ui/*"], + "@shm/shared/*": ["./frontend/packages/shared/*"] }, "plugins": [ { @@ -25,6 +18,6 @@ "pathToApp": "frontend/apps/desktop" } ] - }, + } // "extends": "expo/tsconfig.base" -} \ No newline at end of file +} diff --git a/yarn.lock b/yarn.lock index a6ededd832..311ce5ba62 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6547,15 +6547,23 @@ __metadata: languageName: node linkType: hard -"@shm/app@*, @shm/app@workspace:frontend/packages/app": +"@shm/desktop@workspace:frontend/apps/desktop": version: 0.0.0-use.local - resolution: "@shm/app@workspace:frontend/packages/app" + resolution: "@shm/desktop@workspace:frontend/apps/desktop" dependencies: "@ariakit/react": 0.3.5 "@bufbuild/protobuf": ^1.10.0 "@connectrpc/connect-web": 1.1.3 "@dnd-kit/core": ^6.1.0 "@dnd-kit/sortable": ^8.0.0 + "@electron-forge/cli": 6.4.1 + "@electron-forge/maker-deb": 6.4.1 + "@electron-forge/maker-dmg": 7.1.0 + "@electron-forge/maker-rpm": 7.1.0 + "@electron-forge/maker-squirrel": 6.4.1 + "@electron-forge/maker-zip": 6.4.1 + "@electron-forge/plugin-vite": 6.4.1 + "@electron-forge/shared-types": 6.4.2 "@emotion/cache": 11.11.0 "@emotion/react": 11.11.1 "@emotion/serialize": 1.1.2 @@ -6565,9 +6573,12 @@ __metadata: "@mantine/core": 6.0.13 "@mantine/hooks": 6.0.13 "@manuscripts/prosemirror-recreate-steps": ^0.1.4 + "@playwright/test": 1.40.1 "@radix-ui/colors": 0.1.9 "@radix-ui/react-dropdown-menu": 2.0.5 + "@sentry/electron": 4.7.0 "@sentry/tracing": 7.49.0 + "@sentry/vite-plugin": latest "@shm/prettier": "*" "@shm/shared": "*" "@shm/ui": "*" @@ -6590,14 +6601,28 @@ __metadata: "@tiptap/extension-underline": 2.0.3 "@tiptap/pm": 2.0.3 "@tiptap/react": 2.0.3 + "@trpc/client": 10.40.0 + "@trpc/react-query": 10.40.0 + "@trpc/server": 10.40.0 "@types/node": 20.6.5 "@types/prosemirror-dev-tools": 3.0.3 "@types/react": 18.2.21 "@types/react-dom": 18.2.7 + "@vitejs/plugin-react": 4.0.4 "@xstate/react": beta allotment: 1.18.1 + cheerio: 1.0.0-rc.12 + console-log-colors: 0.4.0 copy-text-to-clipboard: 3.1.0 + electron: 26.0.0 + electron-context-menu: 3.6.1 + electron-log: beta + electron-playwright-helpers: 1.6.0 + electron-squirrel-startup: 1.0.0 + electron-store: 8.1.0 + electron-trpc: 0.5.2 fast-deep-equal: ^3.1.3 + fs-extra: 11.1.1 graphql-request: 6.0.0 happy-dom: 7.8.1 hast-util-from-dom: 4.2.0 @@ -6605,14 +6630,18 @@ __metadata: jsdom: 22.1.0 katex: ^0.16.9 linkifyjs: 4.1.1 + loglevel: 1.8.1 lowlight: 3.1.0 lz-string: 1.5.0 + match-sorter: 6.3.1 nanoid: 4.0.2 nostr-tools: 1.16.0 prettier: 3.0.2 + prom-client: 15.1.0 prosemirror-dev-tools: 4.0.0 prosemirror-state: 1.4.3 react: 18.2.0 + react-devtools: 4.28.0 react-dom: 18.2.0 react-error-boundary: 4.0.11 react-hook-form: 7.46.1 @@ -6626,73 +6655,20 @@ __metadata: remark-parse: 10.0.1 remark-rehype: 10.1.0 remark-stringify: 10.0.2 + tamagui: 1.95.0 typescript: 5.5.1-rc unified: 10.1.2 use-prefers-color-scheme: 1.1.3 - vitest: 0.34.2 - xstate: beta - y-prosemirror: 1.2.1 - y-protocols: 1.0.5 - yjs: 13.6.4 - zod: 3.22.2 - languageName: unknown - linkType: soft - -"@shm/desktop@workspace:frontend/apps/desktop": - version: 0.0.0-use.local - resolution: "@shm/desktop@workspace:frontend/apps/desktop" - dependencies: - "@ariakit/react": 0.3.5 - "@bufbuild/protobuf": ^1.10.0 - "@connectrpc/connect-web": 1.1.3 - "@electron-forge/cli": 6.4.1 - "@electron-forge/maker-deb": 6.4.1 - "@electron-forge/maker-dmg": 7.1.0 - "@electron-forge/maker-rpm": 7.1.0 - "@electron-forge/maker-squirrel": 6.4.1 - "@electron-forge/maker-zip": 6.4.1 - "@electron-forge/plugin-vite": 6.4.1 - "@electron-forge/shared-types": 6.4.2 - "@juggle/resize-observer": 3.4.0 - "@playwright/test": 1.40.1 - "@sentry/electron": 4.7.0 - "@sentry/vite-plugin": latest - "@shm/app": "*" - "@shm/prettier": "*" - "@shm/shared": "*" - "@shm/ui": "*" - "@tamagui/vite-plugin": 1.95.0 - "@tanstack/react-query": 4.33.0 - "@tanstack/react-query-devtools": 4.33.0 - "@trpc/client": 10.40.0 - "@trpc/react-query": 10.40.0 - "@trpc/server": 10.40.0 - "@types/react": 18.2.21 - "@types/react-dom": 18.2.7 - "@vitejs/plugin-react": 4.0.4 - cheerio: 1.0.0-rc.12 - console-log-colors: 0.4.0 - electron: 26.0.0 - electron-context-menu: 3.6.1 - electron-log: beta - electron-playwright-helpers: 1.6.0 - electron-squirrel-startup: 1.0.0 - electron-store: 8.1.0 - electron-trpc: 0.5.2 - fs-extra: 11.1.1 - loglevel: 1.8.1 - match-sorter: 6.3.1 - prom-client: 15.1.0 - react: 18.2.0 - react-devtools: 4.28.0 - react-dom: 18.2.0 - react-error-boundary: 4.0.11 - tamagui: 1.95.0 vite: 4.4.9 vite-tsconfig-paths: 4.2.0 + vitest: 0.34.2 winston: 3.11.0 winston-daily-rotate-file: 4.7.1 + xstate: beta xvfb-maybe: 0.2.1 + y-prosemirror: 1.2.1 + y-protocols: 1.0.5 + yjs: 13.6.4 zod: 3.22.2 languageName: unknown linkType: soft