fix notification and add billing page and contract

This commit is contained in:
root
2026-05-13 00:09:39 -04:00
committed by Administrator
parent 1a39aa8433
commit 89621a163b
52 changed files with 5631 additions and 1110 deletions
@@ -2,6 +2,7 @@
import { useEffect, useState } from 'react'
import { PUBLIC_SITE_LANGUAGE_COOKIE, type PublicSiteLanguage } from '@/lib/i18n'
import { SHARED_LANGUAGE_COOKIE, SHARED_LANGUAGE_KEY, writeScopedPreference } from '@/lib/preferences'
const labels: Record<PublicSiteLanguage, string> = {
en: 'Language',
@@ -23,11 +24,12 @@ export default function PublicLanguageSwitcher({
useEffect(() => {
document.documentElement.lang = language
document.documentElement.dir = language === 'ar' ? 'rtl' : 'ltr'
window.localStorage.setItem('public-site-language', language)
writeScopedPreference(SHARED_LANGUAGE_KEY, language, ['public-site-language'])
}, [language])
function handleChange(nextLanguage: PublicSiteLanguage) {
setLanguage(nextLanguage)
document.cookie = `${SHARED_LANGUAGE_COOKIE}=${nextLanguage}; path=/; max-age=31536000; samesite=lax`
document.cookie = `${PUBLIC_SITE_LANGUAGE_COOKIE}=${nextLanguage}; path=/; max-age=31536000; samesite=lax`
window.location.reload()
}
@@ -2,13 +2,14 @@
import { useEffect, useState } from 'react'
import type { PublicSiteLanguage } from '@/lib/i18n'
import { SHARED_THEME_KEY, readScopedPreference, writeScopedPreference } from '@/lib/preferences'
type Theme = 'light' | 'dark'
type Theme = 'light' | 'medium' | 'dark'
const labels: Record<PublicSiteLanguage, { theme: string; light: string; dark: string }> = {
en: { theme: 'Theme', light: 'Light', dark: 'Dark' },
fr: { theme: 'Mode', light: 'Clair', dark: 'Sombre' },
ar: { theme: 'الوضع', light: 'فاتح', dark: 'داكن' },
const labels: Record<PublicSiteLanguage, { theme: string; light: string; medium: string; dark: string }> = {
en: { theme: 'Theme', light: 'Light', medium: 'Medium', dark: 'Dark' },
fr: { theme: 'Mode', light: 'Clair', medium: 'Moyen', dark: 'Sombre' },
ar: { theme: 'الوضع', light: 'فاتح', medium: 'متوسط', dark: 'داكن' },
}
export default function PublicThemeSwitcher({
@@ -19,8 +20,8 @@ export default function PublicThemeSwitcher({
const [theme, setTheme] = useState<Theme>('light')
useEffect(() => {
const storedTheme = window.localStorage.getItem('public-site-theme')
if (storedTheme === 'light' || storedTheme === 'dark') {
const storedTheme = readScopedPreference(SHARED_THEME_KEY, ['public-site-theme'])
if (storedTheme === 'light' || storedTheme === 'medium' || storedTheme === 'dark') {
setTheme(storedTheme)
return
}
@@ -32,10 +33,10 @@ export default function PublicThemeSwitcher({
useEffect(() => {
document.documentElement.classList.remove('light', 'dark')
document.documentElement.classList.add(theme)
document.documentElement.style.colorScheme = theme
document.documentElement.classList.add(theme === 'light' ? 'light' : 'dark')
document.documentElement.style.colorScheme = theme === 'light' ? 'light' : 'dark'
document.body.dataset.theme = theme
window.localStorage.setItem('public-site-theme', theme)
writeScopedPreference(SHARED_THEME_KEY, theme, ['public-site-theme'])
}, [theme])
const copy = labels[currentLanguage]
@@ -45,7 +46,7 @@ export default function PublicThemeSwitcher({
<span className="px-2 text-[11px] font-semibold uppercase tracking-[0.16em] text-slate-500 dark:text-slate-400">
{copy.theme}
</span>
{(['light', 'dark'] as Theme[]).map((value) => {
{(['light', 'medium', 'dark'] as Theme[]).map((value) => {
const active = value === theme
return (
<button
@@ -58,7 +59,7 @@ export default function PublicThemeSwitcher({
: 'text-slate-600 hover:bg-slate-100 dark:text-slate-300 dark:hover:bg-slate-800'
}`}
>
{value === 'light' ? copy.light : copy.dark}
{value === 'light' ? copy.light : value === 'medium' ? copy.medium : copy.dark}
</button>
)
})}