@@ -55,6 +55,11 @@ interface MediaBinProps {
5555 handleDeleteFromContext : ( ) => Promise < void > ;
5656 handleSplitAudioFromContext : ( ) => Promise < void > ;
5757 handleCloseContextMenu : ( ) => void ;
58+ // Persisted UI state from parent so grouping/sorting survives tab switches
59+ arrangeModeExternal ?: "default" | "group" ;
60+ sortByExternal ?: "default" | "name_asc" | "name_desc" ;
61+ onArrangeModeChange ?: ( mode : "default" | "group" ) => void ;
62+ onSortByChange ?: ( sort : "default" | "name_asc" | "name_desc" ) => void ;
5863}
5964
6065// Memoized component for video thumbnails to prevent flickering
@@ -222,14 +227,42 @@ export default function MediaBin() {
222227 handleDeleteFromContext,
223228 handleSplitAudioFromContext,
224229 handleCloseContextMenu,
230+ arrangeModeExternal,
231+ sortByExternal,
232+ onArrangeModeChange,
233+ onSortByChange,
225234 } = useOutletContext < MediaBinProps > ( ) ;
226235
227236 // Drag & Drop state for external file imports
228237 const [ isDragOver , setIsDragOver ] = useState ( false ) ;
229238
230- // Arrange & sorting state
231- const [ arrangeMode , setArrangeMode ] = useState < "default" | "group" > ( "default" ) ;
232- const [ sortBy , setSortBy ] = useState < "default" | "name_asc" | "name_desc" > ( "default" ) ;
239+ // Arrange & sorting state (controlled by parent when provided)
240+ const [ arrangeMode , setArrangeMode ] = useState < "default" | "group" > ( arrangeModeExternal ?? "default" ) ;
241+ const [ sortBy , setSortBy ] = useState < "default" | "name_asc" | "name_desc" > ( sortByExternal ?? "default" ) ;
242+
243+ // Sync from parent if it changes
244+ useEffect ( ( ) => {
245+ if ( arrangeModeExternal && arrangeModeExternal !== arrangeMode ) setArrangeMode ( arrangeModeExternal ) ;
246+ } , [ arrangeModeExternal ] ) ;
247+ useEffect ( ( ) => {
248+ if ( sortByExternal && sortByExternal !== sortBy ) setSortBy ( sortByExternal ) ;
249+ } , [ sortByExternal ] ) ;
250+
251+ const updateArrangeMode = useCallback (
252+ ( mode : "default" | "group" ) => {
253+ setArrangeMode ( mode ) ;
254+ onArrangeModeChange ?.( mode ) ;
255+ } ,
256+ [ onArrangeModeChange ] ,
257+ ) ;
258+
259+ const updateSortBy = useCallback (
260+ ( sort : "default" | "name_asc" | "name_desc" ) => {
261+ setSortBy ( sort ) ;
262+ onSortByChange ?.( sort ) ;
263+ } ,
264+ [ onSortByChange ] ,
265+ ) ;
233266 const [ collapsed , setCollapsed ] = useState < {
234267 [ key in "videos" | "gifs" | "images" | "audio" | "text" ] : boolean ;
235268 } > ( {
@@ -458,7 +491,7 @@ export default function MediaBin() {
458491 className = { `h-5 w-5 p-0 bg-transparent hover:bg-transparent ${
459492 arrangeMode === "default" ? "text-primary" : "text-muted-foreground/70 hover:text-foreground"
460493 } `}
461- onClick = { ( ) => setArrangeMode ( "default" ) }
494+ onClick = { ( ) => updateArrangeMode ( "default" ) }
462495 title = "Default order"
463496 aria-pressed = { arrangeMode === "default" } >
464497 < List className = "h-2 w-2" />
@@ -469,7 +502,7 @@ export default function MediaBin() {
469502 className = { `h-5 w-5 p-0 bg-transparent hover:bg-transparent ${
470503 arrangeMode === "group" ? "text-primary" : "text-muted-foreground/70 hover:text-foreground"
471504 } `}
472- onClick = { ( ) => setArrangeMode ( "group" ) }
505+ onClick = { ( ) => updateArrangeMode ( "group" ) }
473506 title = "Smart Group"
474507 aria-pressed = { arrangeMode === "group" } >
475508 < Layers className = "h-2 w-2" />
@@ -493,19 +526,19 @@ export default function MediaBin() {
493526 < DropdownMenuLabel className = "text-[11px]" > Sort</ DropdownMenuLabel >
494527 < DropdownMenuSeparator />
495528 < DropdownMenuItem
496- onClick = { ( ) => setSortBy ( "default" ) }
529+ onClick = { ( ) => updateSortBy ( "default" ) }
497530 className = { `text-[12px] gap-2 ${ sortBy === "default" ? "text-primary" : "" } ` }
498531 data-variant = "ghost" >
499532 < ArrowUpDown className = { `h-3 w-3 ${ sortBy === "default" ? "text-primary" : "" } ` } /> Original order
500533 </ DropdownMenuItem >
501534 < DropdownMenuItem
502- onClick = { ( ) => setSortBy ( "name_asc" ) }
535+ onClick = { ( ) => updateSortBy ( "name_asc" ) }
503536 className = { `text-[12px] gap-2 ${ sortBy === "name_asc" ? "text-primary" : "" } ` }
504537 data-variant = "ghost" >
505538 < ChevronUp className = { `h-3 w-3 ${ sortBy === "name_asc" ? "text-primary" : "" } ` } /> Name A–Z
506539 </ DropdownMenuItem >
507540 < DropdownMenuItem
508- onClick = { ( ) => setSortBy ( "name_desc" ) }
541+ onClick = { ( ) => updateSortBy ( "name_desc" ) }
509542 className = { `text-[12px] gap-2 ${ sortBy === "name_desc" ? "text-primary" : "" } ` }
510543 data-variant = "ghost" >
511544 < ChevronDown className = { `h-3 w-3 ${ sortBy === "name_desc" ? "text-primary" : "" } ` } /> Name Z–A
0 commit comments