aboutsummaryrefslogtreecommitdiff
path: root/apps/web/app/(navigation)/layout.tsx
blob: 68a67a93c79b6971152fcc98abaf5081237fe1aa (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
"use client"

import { GraphDialog } from "@/components/graph-dialog"
import { Header } from "@/components/header"
import { AddMemoryView } from "@/components/views/add-memory"
import { usePathname, useRouter } from "next/navigation"
import { useFeatureFlagEnabled } from "posthog-js/react"
import { useEffect, useState } from "react"

export default function NavigationLayout({
	children,
}: {
	children: React.ReactNode
}) {
	const [showAddMemoryView, setShowAddMemoryView] = useState(false)
	const pathname = usePathname()
	const router = useRouter()
	const flagEnabled = useFeatureFlagEnabled("nova-alpha-access")

	useEffect(() => {
		if (flagEnabled && !pathname.includes("/new")) {
			router.replace("/new")
		}
	}, [flagEnabled, router, pathname])

	useEffect(() => {
		const handleKeydown = (event: KeyboardEvent) => {
			const target = event.target as HTMLElement
			const isInputField =
				target.tagName === "INPUT" ||
				target.tagName === "TEXTAREA" ||
				target.isContentEditable ||
				target.closest('[contenteditable="true"]')

			if (isInputField) return

			// add memory shortcut
			if (
				event.key === "c" &&
				!event.ctrlKey &&
				!event.metaKey &&
				!event.altKey &&
				!event.shiftKey
			) {
				event.preventDefault()
				setShowAddMemoryView(true)
			}
		}

		document.addEventListener("keydown", handleKeydown)

		return () => {
			document.removeEventListener("keydown", handleKeydown)
		}
	}, [])
	return (
		<div className="relative h-screen flex flex-col">
			<div className="sticky top-0 z-50 bg-background/80 backdrop-blur-md border-b border-white/10">
				<Header onAddMemory={() => setShowAddMemoryView(true)} />
			</div>
			<div className="flex-1">{children}</div>
			{showAddMemoryView && (
				<AddMemoryView
					initialTab="note"
					onClose={() => setShowAddMemoryView(false)}
				/>
			)}

			<GraphDialog />
		</div>
	)
}