11import { 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"
44import {
55 allChecked ,
66 checkboxOpen ,
@@ -17,15 +17,56 @@ import { Col, cols, ListItem } from "./ListItem"
1717import { ItemCheckbox , useSelectWithMouse } from "./helper"
1818import { 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+
2046export 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
84125const 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