diff --git a/apps/mobile/app/components/list-items/headers/section-header.tsx b/apps/mobile/app/components/list-items/headers/section-header.tsx index 17ccb9049..25a2b71c7 100644 --- a/apps/mobile/app/components/list-items/headers/section-header.tsx +++ b/apps/mobile/app/components/list-items/headers/section-header.tsx @@ -64,7 +64,8 @@ export const SectionHeader = React.memo< . */ -import { Note } from "@notesnook/core"; +import { Note, Notebook } from "@notesnook/core"; import { strings } from "@notesnook/intl"; import { useThemeColors } from "@notesnook/theme"; -import React, { - RefObject, - useCallback, - useEffect, - useRef, - useState -} from "react"; -import { - ActivityIndicator, - Keyboard, - TouchableOpacity, - View -} from "react-native"; -import { ActionSheetRef } from "react-native-actions-sheet"; -import { FlashList } from "react-native-actions-sheet/dist/src/views/FlashList"; +import React, { RefObject, useCallback, useEffect, useRef } from "react"; +import { ActivityIndicator, View } from "react-native"; +import { ActionSheetRef, FlatList } from "react-native-actions-sheet"; import { db } from "../../../common/database"; import { presentSheet } from "../../../services/event-manager"; import Navigation from "../../../services/navigation"; +import { + createNotebookTreeStores, + TreeItem +} from "../../../stores/create-notebook-tree-stores"; import { ItemSelection } from "../../../stores/item-selection-store"; import { useNotebooks } from "../../../stores/use-notebook-store"; import { useRelationStore } from "../../../stores/use-relation-store"; import { useSelectionStore } from "../../../stores/use-selection-store"; -import { useSettingStore } from "../../../stores/use-setting-store"; import { updateNotebook } from "../../../utils/notebooks"; import { AppFontSize } from "../../../utils/size"; +import { DefaultAppStyles } from "../../../utils/styles"; import { Dialog } from "../../dialog"; import DialogHeader from "../../dialog/dialog-header"; import SheetProvider from "../../sheet-provider"; +import { NotebookItem } from "../../side-menu/notebook-item"; import { Button } from "../../ui/button"; import { IconButton } from "../../ui/icon-button"; import Input from "../../ui/input"; import Paragraph from "../../ui/typography/paragraph"; import { AddNotebookSheet } from "../add-notebook"; -import { NotebookItem } from "./notebook-item"; -import { useNotebookItemSelectionStore } from "./store"; + +const { + useNotebookExpandedStore, + useNotebookSelectionStore, + useNotebookTreeStore +} = createNotebookTreeStores(true, true, "link-notebooks-expanded-store"); async function updateInitialSelectionState(items: string[]) { const relations = await db.relations @@ -86,7 +83,7 @@ async function updateInitialSelectionState(items: string[]) { initialSelectionState[id] = "intermediate"; } } - useNotebookItemSelectionStore.setState({ + useNotebookSelectionStore.setState({ initialState: initialSelectionState, selection: { ...initialSelectionState }, multiSelect: relations.length > 1 @@ -101,31 +98,58 @@ const MoveNoteSheet = ({ actionSheetRef: RefObject; }) => { const { colors } = useThemeColors(); - const [rootNotebooks, loading] = useNotebooks(); + const [notebooks, loading] = useNotebooks(); + const tree = useNotebookTreeStore((state) => state.tree); const searchQuery = useRef(""); const searchTimer = useRef(); - const [notebooks, setNotebooks] = useState(rootNotebooks); + const [filteredNotebooks, setFilteredNotebooks] = React.useState(notebooks); + const loadRootNotebooks = React.useCallback(async () => { + if (!filteredNotebooks) return; + const _notebooks: Notebook[] = []; + for (let i = 0; i < filteredNotebooks.placeholders.length; i++) { + _notebooks[i] = (await filteredNotebooks?.item(i))?.item as Notebook; + } + const items = await useNotebookTreeStore + .getState() + .addNotebooks("root", _notebooks, 0); + useNotebookTreeStore.getState().setTree(items); + }, [filteredNotebooks]); + + const updateNotebooks = React.useCallback(() => { + if (searchQuery.current) { + db.lookup + .notebooks(searchQuery.current) + .sorted() + .then((filtered) => { + setFilteredNotebooks(filtered); + }); + } else { + setFilteredNotebooks(notebooks); + } + }, [notebooks]); + + useEffect(() => { + updateNotebooks(); + }, [updateNotebooks]); + + useEffect(() => { + (async () => { + if (!loading) { + loadRootNotebooks(); + } + })(); + }, [loadRootNotebooks, loading]); - const dimensions = useSettingStore((state) => state.dimensions); const selectedItemsList = useSelectionStore( (state) => state.selectedItemsList ); - - const multiSelect = useNotebookItemSelectionStore( - (state) => state.multiSelect - ); - - useEffect(() => { - if (!loading) { - setNotebooks(rootNotebooks); - } - }, [loading, rootNotebooks]); + const multiSelect = useNotebookSelectionStore((state) => state.multiSelect); useEffect(() => { const items = note ? [note.id] : selectedItemsList; updateInitialSelectionState(items); return () => { - useNotebookItemSelectionStore.setState({ + useNotebookSelectionStore.setState({ initialState: {}, selection: {}, multiSelect: false, @@ -137,7 +161,7 @@ const MoveNoteSheet = ({ const onSave = async () => { const noteIds = note ? [note.id] : selectedItemsList; - const changedNotebooks = useNotebookItemSelectionStore.getState().selection; + const changedNotebooks = useNotebookSelectionStore.getState().selection; for (const id in changedNotebooks) { const item = await db.notebooks.notebook(id); @@ -161,43 +185,39 @@ const MoveNoteSheet = ({ }; const hasSelected = () => { - const selection = useNotebookItemSelectionStore.getState().selection; + const selection = useNotebookSelectionStore.getState().selection; return Object.keys(selection).some((key) => selection[key] === "selected"); }; const renderNotebook = useCallback( - ({ index }: { item: boolean; index: number }) => ( - + ({ item, index }: { item: TreeItem; index: number }) => ( + ), - [notebooks] + [] ); return ( <> - - { - Keyboard.dismiss(); - }} - /> + {hasSelected() ? ( @@ -232,112 +252,199 @@ const MoveNoteSheet = ({