mirror of
https://github.com/Yidadaa/ChatGPT-Next-Web.git
synced 2025-08-08 17:44:57 +08:00
move code to utils/file
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
"use client";
|
||||
import { useState, useMemo, useEffect } from "react";
|
||||
import { initDB } from "react-indexed-db-hook";
|
||||
import { StoreKey } from "@/app/constant";
|
||||
import { useIndexedDB } from "react-indexed-db-hook";
|
||||
@@ -23,9 +23,44 @@ export const FileDbConfig = {
|
||||
};
|
||||
|
||||
export function FileDbInit() {
|
||||
initDB(FileDbConfig);
|
||||
if (typeof window !== "undefined") {
|
||||
initDB(FileDbConfig);
|
||||
}
|
||||
}
|
||||
|
||||
export function useFileDB() {
|
||||
return useIndexedDB(StoreKey.File);
|
||||
}
|
||||
|
||||
export function saveFileData(db, fileId, data) {
|
||||
// save file content and return url start with `indexeddb://`
|
||||
db.add({ id: fileId, data });
|
||||
return `indexeddb://${StoreKey.File}@${fileId}`;
|
||||
}
|
||||
|
||||
export async function getFileData(db, fileId, contentType = "image/png") {
|
||||
const { data } = await db.getByID(fileId);
|
||||
return `data:${contentType};base64,${data}`;
|
||||
}
|
||||
|
||||
export function IndexDBImage({ src, alt, onClick, db, className }) {
|
||||
const [data, setData] = useState(src);
|
||||
const imgId = useMemo(
|
||||
() => src.replace("indexeddb://", "").split("@").pop(),
|
||||
[src],
|
||||
);
|
||||
useEffect(() => {
|
||||
getFileData(db, imgId)
|
||||
.then((data) => setData(data))
|
||||
.catch((e) => setData(src));
|
||||
}, [src, imgId]);
|
||||
|
||||
return (
|
||||
<img
|
||||
className={className}
|
||||
src={data}
|
||||
alt={alt}
|
||||
onClick={(e) => onClick(data, e)}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
Reference in New Issue
Block a user