2024-09-08 22:35:32 +01:00
|
|
|
"use client";
|
|
|
|
|
2024-10-04 18:25:37 +01:00
|
|
|
import { createContext, ReactNode, useEffect, useState } from "react";
|
2024-09-30 13:21:31 +01:00
|
|
|
import Database, { db } from "../../common/database/database";
|
2024-09-08 22:35:32 +01:00
|
|
|
import FullscreenLoader from "./fullscreen-loader";
|
2024-09-30 22:16:55 +01:00
|
|
|
import { useToast } from "@/hooks/use-toast";
|
2024-09-08 22:35:32 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* The context for the database. This is used to access the database from within the app.
|
|
|
|
*/
|
|
|
|
export const DatabaseContext = createContext<Database | undefined>(undefined);
|
|
|
|
|
2024-10-04 18:25:37 +01:00
|
|
|
type DatabaseLoaderProps = {
|
|
|
|
/**
|
|
|
|
* The children to render.
|
|
|
|
*/
|
|
|
|
children: ReactNode;
|
2024-09-08 22:35:32 +01:00
|
|
|
};
|
|
|
|
|
2024-10-04 18:25:37 +01:00
|
|
|
export default function DatabaseLoader({ children }: DatabaseLoaderProps) {
|
2024-09-30 22:16:55 +01:00
|
|
|
const { toast } = useToast();
|
2024-09-08 22:35:32 +01:00
|
|
|
const [database, setDatabase] = useState<Database | undefined>(undefined);
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
const before = performance.now();
|
|
|
|
setDatabase(db);
|
2024-09-30 22:16:55 +01:00
|
|
|
|
2024-10-04 18:25:37 +01:00
|
|
|
db.on("ready", () => {
|
|
|
|
const loadTime = (performance.now() - before).toFixed(0);
|
|
|
|
console.log(`Loaded database in ${loadTime}ms`);
|
2024-09-30 22:16:55 +01:00
|
|
|
toast({
|
|
|
|
title: "Database loaded",
|
2024-10-04 18:25:37 +01:00
|
|
|
description: `The database was loaded in ${loadTime}ms.`,
|
2024-09-30 22:16:55 +01:00
|
|
|
});
|
|
|
|
});
|
2024-09-30 22:20:48 +01:00
|
|
|
}, [toast]);
|
2024-09-08 22:35:32 +01:00
|
|
|
|
|
|
|
return (
|
|
|
|
<DatabaseContext.Provider value={database}>
|
2024-09-30 22:16:55 +01:00
|
|
|
{database == undefined ? <FullscreenLoader reason="Loading database..." /> : children}
|
2024-09-08 22:35:32 +01:00
|
|
|
</DatabaseContext.Provider>
|
|
|
|
);
|
|
|
|
}
|