import { createContext, useContext, useEffect, useState } from "react"; import { BaseDirectory, readTextFile, exists, writeTextFile, mkdir } from "@tauri-apps/plugin-fs"; import { ParamKeys, DefaultParams } from "./system_prompt"; import { path } from '@tauri-apps/api'; import { openPath } from '@tauri-apps/plugin-opener'; const dataContext=createContext(); const filePath= 'param.json'; const GlobalSettingsPath='./GlobalSettings.json'; const PrivateSettingsPath='./PrivateSettings.json'; export function DataProvider({children}) { const [data, setData] = useState(null); async function read(){ try{ // check exists const globalExists=await exists(GlobalSettingsPath, { baseDir: BaseDirectory.Resource }); const privateExists=await exists(PrivateSettingsPath, { baseDir: BaseDirectory.Resource }); console.log("GlobalSettings exists:", globalExists); console.log("PrivateSettings exists:", privateExists); if(!globalExists){ // copy from public/default.json const res=await fetch('default.json'); const defaultData=await res.json(); await writeTextFile(GlobalSettingsPath, JSON.stringify(defaultData), { baseDir: BaseDirectory.Resource }); console.log("Default global settings written to", path(GlobalSettingsPath, { baseDir: BaseDirectory.Resource })); } if(!privateExists){ await writeTextFile(PrivateSettingsPath, JSON.stringify({ id:13}), { baseDir: BaseDirectory.Resource }); console.log("Empty private settings written to", path(PrivateSettingsPath, { baseDir: BaseDirectory.Resource })); } // const contents=await readTextFile(filePath, { baseDir: BaseDirectory.AppData }); const contents=await readTextFile(GlobalSettingsPath, { baseDir: BaseDirectory.Resource }); let output=await JSON.parse(contents); const private_contents=await readTextFile(PrivateSettingsPath, { baseDir: BaseDirectory.Resource }); const private_output=await JSON.parse(private_contents); output={...output, ...private_output}; // 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] = DefaultParams[key] || ""; // Use params[key] as default value }); } 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); } if(towrite.id){ try{ await writeTextFile(PrivateSettingsPath, JSON.stringify({ id: towrite.id }), { baseDir: BaseDirectory.Resource }); console.log("Private settings written successfully"); }catch(error){ console.error("Error writing private settings:", error); } } try{ const res_write=await writeTextFile(GlobalSettingsPath, JSON.stringify(towrite), { baseDir: BaseDirectory.Resource }); console.log("File written successfully", GlobalSettingsPath, towrite); }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 ( { const folder = await path.resourceDir(); // const file = await path.join(folder, GlobalSettingsPath); await openPath(folder); }, }}> {children} ); } export function useData() { const context = useContext(dataContext); if (!context) { throw new Error("useData must be used within a DataProvider"); } return context; }