2026-04-16 01:36:44 +02:00
|
|
|
import { memo, useCallback, useEffect } from 'react'
|
2026-04-08 14:01:19 +02:00
|
|
|
import { NoteListLayout } from './note-list/NoteListLayout'
|
|
|
|
|
import { useNoteListModel, type NoteListProps } from './note-list/useNoteListModel'
|
2026-04-16 01:36:44 +02:00
|
|
|
import type { NoteListMultiSelectionCommands } from './note-list/multiSelectionCommands'
|
|
|
|
|
import { useMultiSelectKeyboard } from './note-list/useMultiSelectKeyboard'
|
2026-02-17 18:45:34 +01:00
|
|
|
|
2026-04-16 00:38:43 +02:00
|
|
|
type NoteListInnerProps = NoteListProps & {
|
|
|
|
|
onBulkOrganize?: (paths: string[]) => void
|
2026-04-16 01:36:44 +02:00
|
|
|
multiSelectionCommandRef?: React.MutableRefObject<NoteListMultiSelectionCommands | null>
|
2026-04-16 00:38:43 +02:00
|
|
|
}
|
|
|
|
|
|
2026-04-16 01:36:44 +02:00
|
|
|
function NoteListInner({ onBulkOrganize, multiSelectionCommandRef, ...props }: NoteListInnerProps) {
|
2026-04-08 14:01:19 +02:00
|
|
|
const model = useNoteListModel(props)
|
2026-04-16 01:36:44 +02:00
|
|
|
|
2026-04-16 00:38:43 +02:00
|
|
|
const handleBulkOrganize = useCallback(() => {
|
|
|
|
|
const paths = [...model.multiSelect.selectedPaths]
|
|
|
|
|
model.multiSelect.clear()
|
|
|
|
|
onBulkOrganize?.(paths)
|
|
|
|
|
}, [model.multiSelect, onBulkOrganize])
|
|
|
|
|
|
2026-04-16 01:36:44 +02:00
|
|
|
useMultiSelectKeyboard({
|
|
|
|
|
multiSelect: model.multiSelect,
|
|
|
|
|
isEntityView: model.isEntityView,
|
|
|
|
|
onBulkOrganize: onBulkOrganize ? handleBulkOrganize : undefined,
|
|
|
|
|
onBulkDelete: props.onBulkDeletePermanently ? model.handleBulkDeletePermanently : undefined,
|
|
|
|
|
enableActionShortcuts: !multiSelectionCommandRef,
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
if (!multiSelectionCommandRef) return
|
|
|
|
|
|
|
|
|
|
multiSelectionCommandRef.current = {
|
|
|
|
|
selectedPaths: [...model.multiSelect.selectedPaths],
|
|
|
|
|
deleteSelected: props.onBulkDeletePermanently ? model.handleBulkDeletePermanently : undefined,
|
|
|
|
|
organizeSelected: onBulkOrganize ? handleBulkOrganize : undefined,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return () => {
|
|
|
|
|
multiSelectionCommandRef.current = null
|
|
|
|
|
}
|
|
|
|
|
}, [
|
|
|
|
|
handleBulkOrganize,
|
|
|
|
|
model.handleBulkDeletePermanently,
|
|
|
|
|
model.multiSelect.selectedPaths,
|
|
|
|
|
multiSelectionCommandRef,
|
|
|
|
|
onBulkOrganize,
|
|
|
|
|
props.onBulkDeletePermanently,
|
|
|
|
|
])
|
|
|
|
|
|
2026-04-16 00:38:43 +02:00
|
|
|
return <NoteListLayout {...model} handleBulkOrganize={onBulkOrganize ? handleBulkOrganize : undefined} />
|
2026-02-14 18:22:42 +01:00
|
|
|
}
|
2026-02-17 17:14:36 +01:00
|
|
|
|
|
|
|
|
export const NoteList = memo(NoteListInner)
|