notegraf-web 0.1.1

The reference web frontend of Notegraf
Documentation
import * as React from "react";
import {useEffect, useState} from "react";
import {useSearchParams} from "react-router-dom";
import {searchNotes} from "../api";
import * as types from "../types";
import {NotesTwoPane} from "../components/NotesTwoPane";

export function SearchResults() {
    let [searchParams, _setSearchParams] = useSearchParams();
    let query = searchParams.get("query");

    const [notes, setNotes] = useState<any>(null);
    const [error, setError] = useState<any>(null);
    const [isLoaded, setIsLoaded] = useState(false);

    async function fetchSearch() {
        try {
            const notes: types.Note[] = await searchNotes(query ? query : "");
            if (notes.length === 0) {
                setError("No match!");
                setIsLoaded(true);
                return;
            }
            setError(null);
            setNotes(notes);
            setIsLoaded(true);
            if (query) {
                document.title = `${query} (search) - Notegraf`;
            } else {
                document.title = `(recent) - Notegraf`;
            }
        } catch (e) {
            setError(e);
            setIsLoaded(true);
        }
    }

    useEffect(() => {
        fetchSearch();
    }, [searchParams]);

    if (!isLoaded) {
        return (<div>Loading...</div>);
    }
    if (error) {
        console.log(error);
        return (<div>{error.toString()}</div>);
    }

    return (<NotesTwoPane
        setError={setError}
        notes={notes}
        onDelete={fetchSearch}
        showAgoKey={(n: types.Note) => new Date(n.metadata.created_at)}
        showPrevNext={true}
        showingRevision={false}
        permaLink={false}
    />);
}