openreader/src/hooks/html/useHTMLDocuments.ts

52 lines
1.3 KiB
TypeScript

'use client';
import { useCallback } from 'react';
import { useLiveQuery } from 'dexie-react-hooks';
import { db } from '@/lib/client/dexie';
import type { HTMLDocument } from '@/types/documents';
import { sha256HexFromString } from '@/lib/client/sha256';
export function useHTMLDocuments() {
const documents = useLiveQuery(
() => db['html-documents'].toArray(),
[],
undefined,
);
const isLoading = documents === undefined;
const addDocument = useCallback(async (file: File): Promise<string> => {
const buffer = await file.arrayBuffer();
const bytes = new Uint8Array(buffer);
const content = new TextDecoder().decode(bytes);
const id = await sha256HexFromString(content);
const newDoc: HTMLDocument = {
id,
type: 'html',
name: file.name,
size: file.size,
lastModified: file.lastModified,
data: content,
};
await db['html-documents'].put(newDoc);
return id;
}, []);
const removeDocument = useCallback(async (id: string): Promise<void> => {
await db['html-documents'].delete(id);
}, []);
const clearDocuments = useCallback(async (): Promise<void> => {
await db['html-documents'].clear();
}, []);
return {
documents: documents ?? [],
isLoading,
addDocument,
removeDocument,
clearDocuments,
};
}