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.
 
 
 
 

139 lines
5.0 KiB

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 (
<dataContext.Provider value={{
data,
read,
write,
openFile: async () => {
const folder = await path.resourceDir();
// const file = await path.join(folder, GlobalSettingsPath);
await openPath(folder);
},
}}>
{children}
</dataContext.Provider>
);
}
export function useData() {
const context = useContext(dataContext);
if (!context) {
throw new Error("useData must be used within a DataProvider");
}
return context;
}