Skip to content

Commit 1767ade

Browse files
authored
feat(fs): persist per-directory sorting preferences. (#270)
1 parent 5cd82fe commit 1767ade

File tree

1 file changed

+68
-8
lines changed

1 file changed

+68
-8
lines changed

src/pages/home/folder/List.tsx

Lines changed: 68 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { HStack, VStack, Text } from "@hope-ui/solid"
2-
import { batch, createEffect, createSignal, For, Show } from "solid-js"
3-
import { useT } from "~/hooks"
2+
import { batch, createEffect, createSignal, For, Show, onMount } from "solid-js"
3+
import { useT, useRouter } from "~/hooks"
44
import {
55
allChecked,
66
checkboxOpen,
@@ -17,15 +17,56 @@ import { Col, cols, ListItem } from "./ListItem"
1717
import { ItemCheckbox, useSelectWithMouse } from "./helper"
1818
import { bus } from "~/utils"
1919

20+
export interface SortState {
21+
orderBy: string
22+
reverse: boolean
23+
}
24+
25+
const SORT_KEY_PREFIX = "dir_sort_"
26+
27+
export function saveSortState(dir: string, state: SortState) {
28+
try {
29+
localStorage.setItem(`${SORT_KEY_PREFIX}${dir}`, JSON.stringify(state))
30+
} catch (err) {
31+
console.warn("failed to save sort config:", err)
32+
}
33+
}
34+
35+
export function loadSortState(dir: string): SortState | null {
36+
try {
37+
const item = localStorage.getItem(`${SORT_KEY_PREFIX}${dir}`)
38+
if (!item) return null
39+
return JSON.parse(item) as SortState
40+
} catch (err) {
41+
console.warn("failed to read sort config:", err)
42+
return null
43+
}
44+
}
45+
2046
export const ListTitle = (props: {
2147
sortCallback: (orderBy: OrderBy, reverse?: boolean) => void
2248
disableCheckbox?: boolean
49+
initialOrder?: OrderBy
50+
initialReverse?: boolean
2351
}) => {
2452
const t = useT()
25-
const [orderBy, setOrderBy] = createSignal<OrderBy>()
26-
const [reverse, setReverse] = createSignal(false)
53+
const { pathname } = useRouter()
54+
55+
const [orderBy, setOrderBy] = createSignal<OrderBy | undefined>(
56+
props.initialOrder,
57+
)
58+
const [reverse, setReverse] = createSignal(props.initialReverse ?? false)
59+
60+
createEffect(() => {
61+
if (props.initialOrder !== undefined) {
62+
setOrderBy(props.initialOrder)
63+
setReverse(props.initialReverse ?? false)
64+
}
65+
})
66+
2767
createEffect(() => {
2868
if (orderBy()) {
69+
saveSortState(pathname(), { orderBy: orderBy()!, reverse: reverse() })
2970
props.sortCallback(orderBy()!, reverse())
3071
}
3172
})
@@ -82,6 +123,23 @@ export const ListTitle = (props: {
82123
}
83124

84125
const ListLayout = () => {
126+
const { pathname } = useRouter()
127+
128+
const [initialOrder, setInitialOrder] = createSignal<OrderBy>()
129+
const [initialReverse, setInitialReverse] = createSignal(false)
130+
131+
const { registerSelectContainer, captureContentMenu } = useSelectWithMouse()
132+
registerSelectContainer()
133+
134+
onMount(() => {
135+
const saved = loadSortState(pathname())
136+
if (saved) {
137+
setInitialOrder(saved.orderBy as OrderBy)
138+
setInitialReverse(saved.reverse)
139+
sortObjs(saved.orderBy as OrderBy, saved.reverse)
140+
}
141+
})
142+
85143
const onDragOver = (e: DragEvent) => {
86144
const items = Array.from(e.dataTransfer?.items ?? [])
87145
for (let i = 0; i < items.length; i++) {
@@ -93,9 +151,7 @@ const ListLayout = () => {
93151
}
94152
}
95153
}
96-
const { isMouseSupported, registerSelectContainer, captureContentMenu } =
97-
useSelectWithMouse()
98-
registerSelectContainer()
154+
99155
return (
100156
<VStack
101157
onDragOver={onDragOver}
@@ -104,7 +160,11 @@ const ListLayout = () => {
104160
w="$full"
105161
spacing="$1"
106162
>
107-
<ListTitle sortCallback={sortObjs} />
163+
<ListTitle
164+
sortCallback={sortObjs}
165+
initialOrder={initialOrder()}
166+
initialReverse={initialReverse()}
167+
/>
108168
<For each={objStore.objs}>
109169
{(obj, i) => {
110170
return <ListItem obj={obj} index={i()} />

0 commit comments

Comments
 (0)