finished the menu and started implementing file IO

This commit is contained in:
Chris Kruining 2024-10-02 16:31:23 +02:00
parent 99509c9ba1
commit f860ba70f1
10 changed files with 408 additions and 92 deletions

View file

@ -1,12 +1,67 @@
import { createContext, useContext } from "solid-js";
import Dexie, { EntityTable } from "dexie";
import { Component, createContext, useContext } from "solid-js";
import { isServer } from "solid-js/web";
const FilesContext = createContext();
type Handle = FileSystemFileHandle|FileSystemDirectoryHandle;
export const FilesProvider = (props) => {
return <FilesContext.Provider value={undefined}>{props.children}</FilesContext.Provider>;
interface File {
name: string;
handle: Handle;
}
export const useFiles = () => useContext(FilesContext);
type Store = Dexie & {
files: EntityTable<File, 'name'>;
};
interface FilesContextType {
set(name: string, handle: Handle): Promise<void>;
get(name: string): Promise<Handle|undefined>;
list(): Promise<Handle[]>;
}
const FilesContext = createContext<FilesContextType>();
const clientContext = (): FilesContextType => {
const db = new Dexie('Files') as Store;
db.version(1).stores({
files: 'name, handle'
});
return {
async set(name: string, handle: Handle) {
await db.files.put({ name, handle });
},
async get(name: string) {
return (await db.files.get(name))?.handle;
},
async list() {
const files = await db.files.toArray();
return files.map(f => f.handle)
},
}
};
const serverContext = (): FilesContextType => ({
set(){
return Promise.resolve();
},
get(name: string){
return Promise.resolve(undefined);
},
list(){
return Promise.resolve<Handle[]>([]);
},
});
export const FilesProvider = (props) => {
const ctx = isServer ? serverContext() : clientContext();
return <FilesContext.Provider value={ctx}>{props.children}</FilesContext.Provider>;
}
export const useFiles = () => useContext(FilesContext)!;
export const open = () => {