diff --git a/frontend/src/components/AppContext.tsx b/frontend/src/components/AppContext.tsx new file mode 100644 index 0000000..ecf712b --- /dev/null +++ b/frontend/src/components/AppContext.tsx @@ -0,0 +1,19 @@ +import {createContext, ReactNode, useContext} from "react"; + +export default function AppContext({ + children, +}: { + children: ReactNode; +}) { + return ( + ()}> + {children} + + ); +} + +const context = createContext>(new Map()); + +export function useAppContext() { + return useContext(context) +} \ No newline at end of file diff --git a/frontend/src/components/resources_view.tsx b/frontend/src/components/resources_view.tsx index 0ac6f5a..0ca007a 100644 --- a/frontend/src/components/resources_view.tsx +++ b/frontend/src/components/resources_view.tsx @@ -4,12 +4,38 @@ import showToast from "./toast.ts"; import ResourceCard from "./resource_card.tsx"; import {Masonry, useInfiniteLoader} from "masonic"; import Loading from "./loading.tsx"; +import {useAppContext} from "./AppContext.tsx"; -export default function ResourcesView({loader}: {loader: (page: number) => Promise>}) { +export default function ResourcesView({loader, storageKey}: {loader: (page: number) => Promise>, storageKey?: string}) { const [data, setData] = useState([]) const pageRef = useRef(1) const totalPagesRef = useRef(1) const isLoadingRef = useRef(false) + + const appContext = useAppContext() + + useEffect(() => { + if (storageKey) { + const data = appContext.get(storageKey + "/data") + const page = appContext.get(storageKey + "/page") + const totalPages = appContext.get(storageKey + "/totalPages") + console.log("loading data", data, page, totalPages) + if (data) { + setData(data) + pageRef.current = page + totalPagesRef.current = totalPages + } + } + }, [appContext, storageKey]); + + useEffect(() => { + if (storageKey && data.length > 0) { + console.log("storing data", data) + appContext.set(storageKey + "/data", data) + appContext.set(storageKey + "/page", pageRef.current) + appContext.set(storageKey + "/totalPages", totalPagesRef.current) + } + }, [appContext, data, storageKey]); const loadPage = useCallback(async () => { if (pageRef.current > totalPagesRef.current) return diff --git a/frontend/src/main.tsx b/frontend/src/main.tsx index 50bd860..281ba1c 100644 --- a/frontend/src/main.tsx +++ b/frontend/src/main.tsx @@ -6,6 +6,7 @@ import i18n from "i18next"; import {initReactI18next} from "react-i18next"; import LanguageDetector from "i18next-browser-languagedetector"; import {i18nData} from "./i18n.ts"; +import AppContext from "./components/AppContext.tsx"; i18n .use(initReactI18next) @@ -20,7 +21,9 @@ i18n }).then(() => { createRoot(document.getElementById('root')!).render( - + + + , ) }) diff --git a/frontend/src/pages/home_page.tsx b/frontend/src/pages/home_page.tsx index cfc0cf1..373f7de 100644 --- a/frontend/src/pages/home_page.tsx +++ b/frontend/src/pages/home_page.tsx @@ -32,6 +32,6 @@ export default function HomePage() { } - network.getResources(page)}> + network.getResources(page)}> } \ No newline at end of file diff --git a/frontend/src/pages/resource_details_page.tsx b/frontend/src/pages/resource_details_page.tsx index 37f2b45..57e3ad0 100644 --- a/frontend/src/pages/resource_details_page.tsx +++ b/frontend/src/pages/resource_details_page.tsx @@ -232,7 +232,7 @@ function Article({ resource }: { resource: ResourceDetails }) { if (!resource.related) { return; } - for (let child of articleRef.current.children) { + for (const child of articleRef.current.children) { if (child.tagName === "P" && child.children.length === 1 && child.children[0].tagName === "A") { const href = (child.children[0] as HTMLAnchorElement).href as string if (href.startsWith(window.location.origin) || href.startsWith("/")) { @@ -279,7 +279,7 @@ function Article({ resource }: { resource: ResourceDetails }) { } } } - }, [resource]) + }, [navigate, resource]) return
{resource.article}