-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathlegal-header.tsx
More file actions
138 lines (125 loc) · 3.72 KB
/
Copy pathlegal-header.tsx
File metadata and controls
138 lines (125 loc) · 3.72 KB
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
'use client'
import Link from 'next/link'
import { useRouter, usePathname, useSearchParams } from 'next/navigation'
import { useEffect, useRef, useState } from 'react'
import { Home } from 'lucide-react'
import { Breadcrumbs } from '@/components/layout/breadcrumbs'
import { Button } from '@/components/ui/button'
import { LegalLanguage } from './legal-language'
interface HeaderProps {
language: LegalLanguage
onLanguageChange: (language: LegalLanguage) => void
}
export function LegalHeader({ language, onLanguageChange }: HeaderProps) {
const [isHidden, setIsHidden] = useState(false)
const lastScroll = useRef(0)
const router = useRouter()
const pathname = usePathname()
const searchParams = useSearchParams()
useEffect(function handleScrollDirection() {
function handleScroll() {
const current = window.scrollY
const isMobile = window.innerWidth < 768
if (!isMobile) {
setIsHidden(false)
lastScroll.current = current
return
}
if (current > lastScroll.current && current > 32) {
setIsHidden(true)
} else {
setIsHidden(false)
}
lastScroll.current = current
}
window.addEventListener('scroll', handleScroll, { passive: true })
return function cleanup() {
window.removeEventListener('scroll', handleScroll)
}
}, [])
return (
<div
className={`sticky top-0 z-30 border-b border-border/60 bg-background/90 backdrop-blur transition-transform duration-200 ${isHidden
? '-translate-y-full md:translate-y-0'
: 'translate-y-0'
}`}
>
<div className="flex items-center justify-between gap-4 px-4 py-3 md:px-5">
<div className="flex flex-wrap items-center gap-3">
{/* Navigation between legal pages */}
<Breadcrumbs />
</div>
<div className="flex items-center gap-2">
{/* Navigation between legal pages */}
{pathname === '/terms' && (
<Button asChild variant="ghost" size="sm" className="h-7 text-xs">
<Link
href={`/privacy${searchParams.toString() ? `?${searchParams.toString()}` : ''}`}
>
Privacy
</Link>
</Button>
)}
{pathname === '/privacy' && (
<Button asChild variant="ghost" size="sm" className="h-7 text-xs">
<Link
href={`/terms${searchParams.toString() ? `?${searchParams.toString()}` : ''}`}
>
Terms
</Link>
</Button>
)}
<div className="w-px h-4 bg-border/50 mx-1" />
<LanguageToggle
label="EN"
isActive={language === 'en'}
onClick={handleEnglish}
/>
<LanguageToggle
label="NL"
isActive={language === 'nl'}
onClick={handleDutch}
/>
</div>
</div>
</div>
)
function handleEnglish() {
const params = new URLSearchParams(searchParams.toString())
if (language === 'nl') {
params.set('lang', 'en')
} else {
params.delete('lang')
}
const newUrl = `${window.location.pathname}?${params.toString()}`
router.replace(newUrl, { scroll: false })
onLanguageChange('en')
}
function handleDutch() {
const params = new URLSearchParams(searchParams.toString())
params.set('lang', 'nl')
const newUrl = `${window.location.pathname}?${params.toString()}`
router.replace(newUrl, { scroll: false })
onLanguageChange('nl')
}
}
interface ToggleProps {
label: string
isActive: boolean
onClick: () => void
}
function LanguageToggle({ label, isActive, onClick }: ToggleProps) {
return (
<button
type="button"
onClick={onClick}
aria-pressed={isActive}
className={`rounded-full border px-3 py-1 text-xs font-semibold uppercase tracking-wide transition-colors ${isActive
? 'border-primary/70 bg-primary text-primary-foreground shadow-sm'
: 'border-border/70 bg-background hover:border-primary/50 hover:text-foreground'
}`}
>
{label}
</button>
)
}