From a86991e3d77056d5762217bc553e5fdda4b52d53 Mon Sep 17 00:00:00 2001
From: Philipinho <16838612+Philipinho@users.noreply.github.com>
Date: Thu, 19 Oct 2023 15:52:32 +0100
Subject: [PATCH] Update dependencies * add 'use client' to more components *
install more tiptap extensions
---
frontend/package.json | 67 +++++++++++--------
.../(dashboard)/(page)/p/[pageId]/page.tsx | 2 -
frontend/src/app/layout.tsx | 2 +
frontend/src/app/page.tsx | 1 +
frontend/src/components/navbar/navbar.tsx | 8 ++-
.../src/components/navbar/user-button.tsx | 2 +
frontend/src/features/editor/Editor.tsx | 16 ++---
.../editor/{css => styles}/editor.css | 0
.../page/tree/hooks/use-persistence.ts | 2 +
frontend/src/features/page/tree/page-tree.tsx | 33 ++++++++-
10 files changed, 89 insertions(+), 44 deletions(-)
rename frontend/src/features/editor/{css => styles}/editor.css (100%)
diff --git a/frontend/package.json b/frontend/package.json
index 7e0a5a94..c997fb5c 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -10,47 +10,56 @@
"lint": "next lint"
},
"dependencies": {
- "@hocuspocus/provider": "^2.5.0",
- "@mantine/core": "^7.0.2",
- "@mantine/form": "^7.0.2",
- "@mantine/hooks": "^7.0.2",
- "@mantine/spotlight": "^7.0.2",
- "@tabler/icons-react": "^2.32.0",
- "@tanstack/react-query": "^4.33.0",
- "@tanstack/react-table": "^8.9.3",
- "@tiptap/extension-collaboration": "^2.1.8",
- "@tiptap/extension-collaboration-cursor": "^2.1.8",
- "@tiptap/extension-document": "^2.1.8",
- "@tiptap/extension-heading": "^2.1.8",
- "@tiptap/extension-placeholder": "^2.1.8",
- "@tiptap/pm": "^2.1.8",
- "@tiptap/react": "^2.1.8",
- "@tiptap/starter-kit": "^2.1.8",
- "axios": "^1.4.0",
+ "@hocuspocus/provider": "^2.7.0",
+ "@mantine/core": "^7.1.3",
+ "@mantine/form": "^7.1.3",
+ "@mantine/hooks": "^7.1.3",
+ "@mantine/spotlight": "^7.1.3",
+ "@mantine/tiptap": "^7.1.3",
+ "@tabler/icons-react": "^2.39.0",
+ "@tanstack/react-query": "^4.36.1",
+ "@tanstack/react-table": "^8.10.7",
+ "@tiptap/extension-collaboration": "^2.1.12",
+ "@tiptap/extension-collaboration-cursor": "^2.1.12",
+ "@tiptap/extension-document": "^2.1.12",
+ "@tiptap/extension-heading": "^2.1.12",
+ "@tiptap/extension-highlight": "^2.1.12",
+ "@tiptap/extension-link": "^2.1.12",
+ "@tiptap/extension-placeholder": "^2.1.12",
+ "@tiptap/extension-subscript": "^2.1.12",
+ "@tiptap/extension-superscript": "^2.1.12",
+ "@tiptap/extension-text-align": "^2.1.12",
+ "@tiptap/extension-underline": "^2.1.12",
+ "@tiptap/pm": "^2.1.12",
+ "@tiptap/react": "^2.1.12",
+ "@tiptap/starter-kit": "^2.1.12",
+ "axios": "^1.5.1",
"clsx": "^2.0.0",
- "jotai": "^2.3.1",
+ "jotai": "^2.4.3",
"jotai-optics": "^0.3.1",
"js-cookie": "^3.0.5",
- "next": "13.5.3",
+ "next": "13.5.5",
"react": "18.2.0",
"react-arborist": "^3.2.0",
"react-dom": "18.2.0",
"react-hot-toast": "^2.4.1",
+ "socket.io-client": "^4.7.2",
"typescript": "5.2.2",
"uuid": "^9.0.1",
- "yjs": "^13.6.7",
- "zod": "^3.22.2"
+ "y-indexeddb": "^9.0.11",
+ "yjs": "^13.6.8",
+ "zod": "^3.22.4"
},
"devDependencies": {
- "@types/js-cookie": "^3.0.3",
- "@types/node": "20.4.8",
- "@types/react": "18.2.18",
- "@types/react-dom": "18.2.7",
- "eslint": "8.46.0",
- "eslint-config-next": "13.4.13",
+ "@types/js-cookie": "^3.0.4",
+ "@types/node": "20.8.6",
+ "@types/react": "18.2.28",
+ "@types/react-dom": "18.2.13",
+ "eslint": "8.51.0",
+ "eslint-config-next": "13.5.5",
"optics-ts": "^2.4.1",
- "postcss": "^8.4.30",
- "postcss-preset-mantine": "^1.7.0",
+ "postcss": "^8.4.31",
+ "postcss-preset-mantine": "^1.9.0",
"postcss-simple-vars": "^7.0.1"
}
}
diff --git a/frontend/src/app/(dashboard)/(page)/p/[pageId]/page.tsx b/frontend/src/app/(dashboard)/(page)/p/[pageId]/page.tsx
index 9db64e54..7fc7b9a3 100644
--- a/frontend/src/app/(dashboard)/(page)/p/[pageId]/page.tsx
+++ b/frontend/src/app/(dashboard)/(page)/p/[pageId]/page.tsx
@@ -11,8 +11,6 @@ export default function Page() {
const { pageId } = useParams();
return (
-
-
);
}
diff --git a/frontend/src/app/layout.tsx b/frontend/src/app/layout.tsx
index c9741bbc..4b9861ee 100644
--- a/frontend/src/app/layout.tsx
+++ b/frontend/src/app/layout.tsx
@@ -1,5 +1,7 @@
import '@mantine/core/styles.css';
import '@mantine/spotlight/styles.css';
+import '@mantine/tiptap/styles.css';
+
import type { Metadata } from 'next';
import { TanstackProvider } from '@/components/providers/tanstack-provider';
import CustomToaster from '@/components/ui/custom-toaster';
diff --git a/frontend/src/app/page.tsx b/frontend/src/app/page.tsx
index d10c2eca..be72b1a5 100644
--- a/frontend/src/app/page.tsx
+++ b/frontend/src/app/page.tsx
@@ -1,3 +1,4 @@
+'use client'
import { Welcome } from '@/components/welcome/welcome';
export default function Home() {
diff --git a/frontend/src/components/navbar/navbar.tsx b/frontend/src/components/navbar/navbar.tsx
index 417735d2..fed43b17 100644
--- a/frontend/src/components/navbar/navbar.tsx
+++ b/frontend/src/components/navbar/navbar.tsx
@@ -1,3 +1,5 @@
+'use client'
+
import {
UnstyledButton,
Text,
@@ -21,8 +23,12 @@ import { useAtom } from 'jotai';
import { settingsModalAtom } from '@/features/settings/modal/atoms/settings-modal-atom';
import SettingsModal from '@/features/settings/modal/settings-modal';
import { SearchSpotlight } from '@/features/search/search-spotlight';
-import PageTree from '@/features/page/tree/page-tree';
import { treeApiAtom } from '@/features/page/tree/atoms/tree-api-atom';
+import dynamic from 'next/dynamic';
+
+const PageTree = dynamic(() => import("@/features/page/tree/page-tree"), {
+ ssr: false,
+});
interface PrimaryMenuItem {
icon: React.ElementType;
diff --git a/frontend/src/components/navbar/user-button.tsx b/frontend/src/components/navbar/user-button.tsx
index 1785148b..0a13d1da 100644
--- a/frontend/src/components/navbar/user-button.tsx
+++ b/frontend/src/components/navbar/user-button.tsx
@@ -1,3 +1,5 @@
+'use client';
+
import { UnstyledButton, Group, Avatar, Text, rem } from '@mantine/core';
import { IconChevronRight } from '@tabler/icons-react';
import classes from './user-button.module.css';
diff --git a/frontend/src/features/editor/Editor.tsx b/frontend/src/features/editor/Editor.tsx
index b9b5d7b9..d3b28be7 100644
--- a/frontend/src/features/editor/Editor.tsx
+++ b/frontend/src/features/editor/Editor.tsx
@@ -12,7 +12,7 @@ import { useAtom } from 'jotai/index';
import { currentUserAtom } from '@/features/user/atoms/current-user-atom';
import { authTokensAtom } from '@/features/auth/atoms/auth-tokens-atom';
import useCollaborationUrl from '@/features/editor/hooks/use-collaboration-url';
-import '@/features/editor/css/editor.css';
+import '@/features/editor/styles/editor.css';
interface EditorProps{
pageId: string,
@@ -25,7 +25,6 @@ const getRandomColor = () => getRandomElement(colors)
export default function Editor({ pageId }: EditorProps ) {
const [token] = useAtom(authTokensAtom);
const collaborationURL = useCollaborationUrl();
-
const [provider, setProvider] = useState();
const [doc, setDoc] = useState()
@@ -37,7 +36,7 @@ export default function Editor({ pageId }: EditorProps ) {
url: collaborationURL,
name: pageId,
document: ydoc,
- token: token.accessToken,
+ token: token?.accessToken,
});
setDoc(ydoc);
@@ -48,12 +47,15 @@ export default function Editor({ pageId }: EditorProps ) {
provider.destroy();
};
}
- }, [collaborationURL, pageId, token]);
+ }, [pageId, token]);
+ console.log(token)
if(!doc || !provider){
return null;
}
+ console.log(doc)
+
return (
);
@@ -84,12 +86,6 @@ function TiptapEditor({ ydoc, provider }: TiptapEditorProps) {
const editor = useEditor({
extensions: extensions,
- editorProps: {
- attributes: {
- class:
- "min-h-[500px] flex-1 p-4",
- },
- },
});
useEffect(() => {
diff --git a/frontend/src/features/editor/css/editor.css b/frontend/src/features/editor/styles/editor.css
similarity index 100%
rename from frontend/src/features/editor/css/editor.css
rename to frontend/src/features/editor/styles/editor.css
diff --git a/frontend/src/features/page/tree/hooks/use-persistence.ts b/frontend/src/features/page/tree/hooks/use-persistence.ts
index 56fdd5c4..5c4c77c2 100644
--- a/frontend/src/features/page/tree/hooks/use-persistence.ts
+++ b/frontend/src/features/page/tree/hooks/use-persistence.ts
@@ -1,3 +1,5 @@
+'use client'
+
import { useMemo } from 'react';
import {
CreateHandler,
diff --git a/frontend/src/features/page/tree/page-tree.tsx b/frontend/src/features/page/tree/page-tree.tsx
index 22bd010e..f6e9a37a 100644
--- a/frontend/src/features/page/tree/page-tree.tsx
+++ b/frontend/src/features/page/tree/page-tree.tsx
@@ -1,3 +1,5 @@
+'use client';
+
import { NodeApi, NodeRendererProps, Tree, TreeApi } from 'react-arborist';
import {
IconArrowsLeftRight,
@@ -26,11 +28,13 @@ import { usePersistence } from '@/features/page/tree/hooks/use-persistence';
import { IPage } from '@/features/page/types/page.types';
import { getPages } from '@/features/page/services/page-service';
import useWorkspacePageOrder from '@/features/page/tree/hooks/use-workspace-page-order';
+import { usePathname, useRouter } from 'next/navigation';
export default function PageTree() {
const { data, setData, controllers } = usePersistence>();
- const [, setTree] = useAtom>(treeApiAtom);
+ const [tree, setTree] = useAtom>(treeApiAtom);
const { data: pageOrderData } = useWorkspacePageOrder();
+ const pathname = usePathname();
const fetchAndSetTreeData = async () => {
if (pageOrderData?.childrenIds) {
@@ -48,6 +52,13 @@ export default function PageTree() {
fetchAndSetTreeData();
}, [pageOrderData?.childrenIds]);
+ useEffect(() => {
+ const pageId = pathname?.split('/')[2];
+ setTimeout(() => {
+ tree?.select(pageId);
+ }, 100);
+ }, [tree, pathname]);
+
return (
@@ -75,12 +86,25 @@ export default function PageTree() {
}
function Node({ node, style, dragHandle }: NodeRendererProps) {
+ const router = useRouter();
+
+ const handleClick = () => {
+ router.push(`/p/${node.id}`);
+ }
+
+ if (node.willReceiveDrop && node.isClosed){
+ setTimeout(() => {
+ if (node.state.willReceiveDrop) node.open();
+ }, 650);
+ }
+
return (
<>
@@ -188,7 +212,12 @@ function NodeMenu({ node }: { node: NodeApi
}) {
function PageArrow({ node }: { node: NodeApi }) {
return (
- node.toggle()}>
+ {
+ e.preventDefault();
+ e.stopPropagation();
+ node.toggle();
+ }}>
+
{node.isInternal ? (
node.children && node.children.length > 0 ? (
node.isOpen ? (