import { PanelSide, ResizeFinishCallback, } from '@/directives/views/panelResizer'; import { KeyboardKey, KeyboardModifier } from '@/services/ioService'; import { WebApplication } from '@/ui_models/application'; import { AppState } from '@/ui_models/app_state'; import { PANEL_NAME_NOTES } from '@/views/constants'; import { PrefKey } from '@standardnotes/snjs'; import { observer } from 'mobx-react-lite'; import { FunctionComponent } from 'preact'; import { useEffect, useRef } from 'preact/hooks'; import { NoAccountWarning } from './NoAccountWarning'; import { NotesList } from './NotesList'; import { NotesListOptionsMenu } from './NotesListOptionsMenu'; import { PanelResizer } from './PanelResizer'; import { SearchOptions } from './SearchOptions'; import { toDirective } from './utils'; type Props = { application: WebApplication; appState: AppState; }; const NotesView: FunctionComponent = observer( ({ application, appState }) => { const notesViewPanelRef = useRef(null); const { completedFullSync, createNewNote, displayOptions, noteFilterText, optionsSubtitle, panelTitle, renderedNotes, selectedNotes, setNoteFilterText, showDisplayOptionsMenu, toggleDisplayOptionsMenu, searchBarElement, selectNextNote, selectPreviousNote, onFilterEnter, handleFilterTextChanged, onSearchInputBlur, clearFilterText, paginate, } = appState.notesView; useEffect(() => { handleFilterTextChanged(); }, [noteFilterText, handleFilterTextChanged]); useEffect(() => { /** * In the browser we're not allowed to override cmd/ctrl + n, so we have to * use Control modifier as well. These rules don't apply to desktop, but * probably better to be consistent. */ const newNoteKeyObserver = application.io.addKeyObserver({ key: 'n', modifiers: [KeyboardModifier.Meta, KeyboardModifier.Ctrl], onKeyDown: (event) => { event.preventDefault(); createNewNote(); }, }); const nextNoteKeyObserver = application.io.addKeyObserver({ key: KeyboardKey.Down, elements: [ document.body, ...(searchBarElement ? [searchBarElement] : []), ], onKeyDown: () => { if (searchBarElement === document.activeElement) { searchBarElement?.blur(); } selectNextNote(); }, }); const previousNoteKeyObserver = application.io.addKeyObserver({ key: KeyboardKey.Up, element: document.body, onKeyDown: () => { selectPreviousNote(); }, }); const searchKeyObserver = application.io.addKeyObserver({ key: 'f', modifiers: [KeyboardModifier.Meta, KeyboardModifier.Shift], onKeyDown: () => { if (searchBarElement) { searchBarElement.focus(); } }, }); return () => { newNoteKeyObserver(); nextNoteKeyObserver(); previousNoteKeyObserver(); searchKeyObserver(); }; }, [ application.io, createNewNote, searchBarElement, selectNextNote, selectPreviousNote, ]); const onNoteFilterTextChange = (e: Event) => { setNoteFilterText((e.target as HTMLInputElement).value); }; const onNoteFilterKeyUp = (e: KeyboardEvent) => { if (e.key === KeyboardKey.Enter) { onFilterEnter(); } }; const panelResizeFinishCallback: ResizeFinishCallback = ( _w, _l, _mw, isCollapsed ) => { appState.noteTags.reloadTagsContainerMaxWidth(); appState.panelDidResize(PANEL_NAME_NOTES, isCollapsed); }; const panelWidthEventCallback = () => { appState.noteTags.reloadTagsContainerMaxWidth(); }; return (
{panelTitle}
onSearchInputBlur()} /> {noteFilterText ? ( ) : null}
toggleDisplayOptionsMenu(!showDisplayOptionsMenu) } >
Options
{optionsSubtitle}
{showDisplayOptionsMenu && ( toggleDisplayOptionsMenu(false) } /> )}
{completedFullSync && !renderedNotes.length ? (

No notes.

) : null} {!completedFullSync && !renderedNotes.length ? (

Loading notes...

) : null} {renderedNotes.length ? ( ) : null}
{notesViewPanelRef.current && ( )}
); } ); export const NotesViewDirective = toDirective(NotesView);