You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

106 lines
3.2 KiB

5 months ago
import { createContext, useContext, useEffect, useState } from "react";
5 months ago
import { BaseDirectory, readTextFile, exists, writeTextFile, mkdir } from "@tauri-apps/plugin-fs";
5 months ago
import { ParamKeys } from "./system_prompt";
5 months ago
import { path } from '@tauri-apps/api';
5 months ago
import { openPath } from '@tauri-apps/plugin-opener';
5 months ago
const dataContext=createContext();
const filePath= 'param.json';
export function DataProvider({children}) {
const [data, setData] = useState(null);
async function read(){
try{
5 months ago
const folder=await path.appDataDir();
if (!(await exists(folder))) {
console.log('Creating folder:', folder);
await mkdir(folder);
}
const contents=await readTextFile(filePath, { baseDir: BaseDirectory.AppData });
5 months ago
let output=await JSON.parse(contents);
// check if all keys in ParamKeys are present in output
const missingKeys = ParamKeys.filter(key => !output.hasOwnProperty(key));
if(missingKeys.length > 0){
console.warn("Missing keys in output:", missingKeys);
// Fill missing keys with default values
missingKeys.forEach(key => {
output[key] = params[key] || ""; // Use params[key] as default value
});
}
5 months ago
console.log("File read successfully:", output);
return output;
}catch(error){
console.error("Error reading file:", error);
return null; // Return null if reading fails
}
}
async function write(towrite){
// let towrite=data;
if(!towrite){
const res=await fetch('default.json');
towrite=await res.json();
setData(towrite);
}
try{
const folder = await path.appDataDir();
const res_write=await writeTextFile(`${folder}\\${filePath}`, JSON.stringify(towrite))
console.log("File written successfully", `${folder}\\${filePath}`);
5 months ago
}catch(error){
console.error("Error writing file:", error);
}
}
useEffect(()=>{
read().then(data_ => {
if(data_){
setData(data_);
} else {
write(); // Write default data if read fails
}
}).catch(error => {
console.error("Error in useEffect:", error);
});
},[])
return (
<dataContext.Provider value={{
data,
read,
5 months ago
write,
openFile: async () => {
const folder = await path.appDataDir();
const file = await path.join(folder, filePath);
await openPath(file);
},
5 months ago
}}>
{children}
</dataContext.Provider>
);
}
export function useData() {
const context = useContext(dataContext);
if (!context) {
throw new Error("useData must be used within a DataProvider");
}
return context;
}