Files
tolaria/src/components/NoteList.tsx

54 lines
1.9 KiB
TypeScript
Raw Normal View History

import { memo, useCallback, useEffect } from 'react'
import { NoteListLayout } from './note-list/NoteListLayout'
import { useNoteListModel, type NoteListProps } from './note-list/useNoteListModel'
import type { NoteListMultiSelectionCommands } from './note-list/multiSelectionCommands'
import { useMultiSelectKeyboard } from './note-list/useMultiSelectKeyboard'
2026-04-16 00:38:43 +02:00
type NoteListInnerProps = NoteListProps & {
onBulkOrganize?: (paths: string[]) => void
multiSelectionCommandRef?: React.MutableRefObject<NoteListMultiSelectionCommands | null>
2026-04-16 00:38:43 +02:00
}
function NoteListInner({ onBulkOrganize, multiSelectionCommandRef, ...props }: NoteListInnerProps) {
const model = useNoteListModel(props)
2026-04-16 00:38:43 +02:00
const handleBulkOrganize = useCallback(() => {
const paths = [...model.multiSelect.selectedPaths]
model.multiSelect.clear()
onBulkOrganize?.(paths)
}, [model.multiSelect, onBulkOrganize])
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} />
}
export const NoteList = memo(NoteListInner)