forked from QuantumNous/new-api
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathuse-table-compact-mode.ts
More file actions
81 lines (70 loc) · 2.36 KB
/
Copy pathuse-table-compact-mode.ts
File metadata and controls
81 lines (70 loc) · 2.36 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
/*
Copyright (C) 2023-2026 QuantumNous
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
For commercial licensing, please contact support@quantumnous.com
*/
import { useState, useEffect, useCallback } from 'react'
const STORAGE_KEY = 'table_compact_modes'
function getCompactMode(tableKey: string): boolean {
try {
const raw = localStorage.getItem(STORAGE_KEY)
if (!raw) return false
const modes = JSON.parse(raw) as Record<string, boolean>
return Boolean(modes[tableKey])
} catch {
return false
}
}
function setCompactMode(value: boolean, tableKey: string) {
try {
const raw = localStorage.getItem(STORAGE_KEY)
const modes = raw ? (JSON.parse(raw) as Record<string, boolean>) : {}
modes[tableKey] = value
localStorage.setItem(STORAGE_KEY, JSON.stringify(modes))
} catch {
/* ignore */
}
}
/**
* Manages per-table compact mode toggle persisted in localStorage.
* Stays in sync across tabs via the storage event.
*/
export function useTableCompactMode(
tableKey = 'global'
): [boolean, (value: boolean) => void] {
const [compact, setCompactState] = useState(() => getCompactMode(tableKey))
const setCompact = useCallback(
(value: boolean) => {
setCompactState(value)
setCompactMode(value, tableKey)
},
[tableKey]
)
useEffect(() => {
const handleStorage = (e: StorageEvent) => {
if (e.key === STORAGE_KEY) {
try {
const modes = JSON.parse(e.newValue || '{}') as Record<
string,
boolean
>
setCompactState(Boolean(modes[tableKey]))
} catch {
/* ignore */
}
}
}
window.addEventListener('storage', handleStorage)
return () => window.removeEventListener('storage', handleStorage)
}, [tableKey])
return [compact, setCompact]
}