diff --git a/apps/web/src/components/Dashboard.tsx b/apps/web/src/components/Dashboard.tsx index 959a75b6..d7e7e7de 100644 --- a/apps/web/src/components/Dashboard.tsx +++ b/apps/web/src/components/Dashboard.tsx @@ -1,11 +1,69 @@ import Link from "next/link"; +import { useRef, useState } from "react"; +import { + TbLayoutSidebarLeftCollapse, + TbLayoutSidebarLeftExpand, + TbLayoutSidebarRightCollapse, + TbLayoutSidebarRightExpand, +} from "react-icons/tb"; -import { api } from "~/utils/api"; +import { authClient } from "@kan/auth/client"; + +import { useClickOutside } from "~/hooks/useClickOutside"; import FeedbackButton from "./FeedbackButton"; import SideNavigation from "./SideNavigation"; -export default function Dashboard(props: { children: React.ReactNode }) { - const { data, isLoading } = api.user.getUser.useQuery(); +interface DashboardProps { + children: React.ReactNode; + rightPanel?: React.ReactNode; + hasRightPanel?: boolean; +} + +export default function Dashboard({ + children, + rightPanel, + hasRightPanel = false, +}: DashboardProps) { + const { data: session, isPending: sessionLoading } = authClient.useSession(); + const [isSideNavOpen, setIsSideNavOpen] = useState(false); + const [isRightPanelOpen, setIsRightPanelOpen] = useState(false); + + const sideNavRef = useRef(null); + const rightPanelRef = useRef(null); + const sideNavButtonRef = useRef(null); + const rightPanelButtonRef = useRef(null); + + const toggleSideNav = () => { + setIsSideNavOpen(!isSideNavOpen); + if (!isSideNavOpen) { + setIsRightPanelOpen(false); + } + }; + + const toggleRightPanel = () => { + setIsRightPanelOpen(!isRightPanelOpen); + if (!isRightPanelOpen) { + setIsSideNavOpen(false); + } + }; + + useClickOutside(sideNavRef, (event) => { + if (sideNavButtonRef.current?.contains(event.target as Node)) { + return; + } + if (isSideNavOpen) { + setIsSideNavOpen(false); + } + }); + + useClickOutside(rightPanelRef, (event) => { + if (rightPanelButtonRef.current?.contains(event.target as Node)) { + return; + } + if (isRightPanelOpen) { + setIsRightPanelOpen(false); + } + }); return ( <> @@ -15,24 +73,91 @@ export default function Dashboard(props: { children: React.ReactNode }) { overflow: hidden; } `} -
-
+
+
- + + +

kan.bn

- + +
+ {hasRightPanel && ( + + )} +
+ +
+
- -
{props.children}
+
+ +
+ +
+
{children}
+ + {/* Mobile Right Panel */} + {hasRightPanel && rightPanel && ( +
+
{rightPanel}
+
+ )} + + {/* Desktop Right Panel */} + {hasRightPanel && rightPanel && ( +
{rightPanel}
+ )} +
diff --git a/apps/web/src/components/Input.tsx b/apps/web/src/components/Input.tsx index 1770a07d..abf1b24f 100644 --- a/apps/web/src/components/Input.tsx +++ b/apps/web/src/components/Input.tsx @@ -55,7 +55,7 @@ const Input = forwardRef(
{prefix && ( -
+
{prefix}
)} diff --git a/apps/web/src/components/NewWorkspaceForm.tsx b/apps/web/src/components/NewWorkspaceForm.tsx index cbee098a..720bd66d 100644 --- a/apps/web/src/components/NewWorkspaceForm.tsx +++ b/apps/web/src/components/NewWorkspaceForm.tsx @@ -19,10 +19,12 @@ export function NewWorkspaceForm() { const { showPopup } = usePopup(); const { switchWorkspace } = useWorkspace(); const { register, handleSubmit } = useForm(); + const utils = api.useUtils(); const createWorkspace = api.workspace.create.useMutation({ onSuccess: (values) => { if (values.publicId && values.name) { + utils.workspace.all.invalidate(); switchWorkspace({ publicId: values.publicId, name: values.name, diff --git a/apps/web/src/components/SideNavigation.tsx b/apps/web/src/components/SideNavigation.tsx index 76bf191e..46e4598a 100644 --- a/apps/web/src/components/SideNavigation.tsx +++ b/apps/web/src/components/SideNavigation.tsx @@ -54,7 +54,7 @@ export default function SideNavigation({ return ( <> -