import { useEffect, useMemo, useRef, useState } from "preact/hooks"; import FNote from "../../../entities/fnote"; import Icon from "../../react/Icon"; import { ViewModeProps } from "../interface"; import { useNoteLabelBoolean, useNoteProperty } from "../../react/hooks"; import NoteLink from "../../react/NoteLink"; import "./ListOrGridView.css"; import content_renderer from "../../../services/content_renderer"; import { Pager, usePagination } from "../Pagination"; export default function ListView({ note, noteIds }: ViewModeProps) { const [ isExpanded ] = useNoteLabelBoolean(note, "expanded"); const filteredNoteIds = useMemo(() => { // Filters the note IDs for the legacy view to filter out subnotes that are already included in the note content such as images, included notes. const includedLinks = note ? note.getRelations().filter((rel) => rel.name === "imageLink" || rel.name === "includeNoteLink") : []; const includedNoteIds = new Set(includedLinks.map((rel) => rel.value)); return noteIds.filter((noteId) => !includedNoteIds.has(noteId) && noteId !== "_hidden"); }, noteIds); const { pageNotes, ...pagination } = usePagination(note, filteredNoteIds); return (
); } function NoteCard({ note, expand }: { note: FNote, expand?: boolean }) { const [ isExpanded, setExpanded ] = useState(expand); const isSearch = note.type === "search"; const notePath = isSearch ? note.noteId // for search note parent, we want to display a non-search path : `${note.noteId}/${note.noteId}`; return (
setExpanded(!isExpanded)} /> {isExpanded && <> }
) } function NoteContent({ note, trim }: { note: FNote, trim?: boolean }) { const contentRef = useRef(null); useEffect(() => { content_renderer.getRenderedContent(note, { trim }) .then(({ $renderedContent, type }) => { contentRef.current?.replaceChildren(...$renderedContent); contentRef.current?.classList.add(`type-${type}`); }) .catch(e => { console.warn(`Caught error while rendering note '${note.noteId}' of type '${note.type}'`); console.error(e); contentRef.current?.replaceChildren("rendering error"); }) }, [ note ]); return
; } function NoteChildren({ note }: { note: FNote}) { const imageLinks = note.getRelations("imageLink"); const [ childNotes, setChildNotes ] = useState(); useEffect(() => { note.getChildNotes().then(childNotes => { const filteredChildNotes = childNotes.filter((childNote) => !imageLinks.find((rel) => rel.value === childNote.noteId)); setChildNotes(filteredChildNotes); }); }, [ note ]); return childNotes?.map(childNote => ) }