logancyang_obsidian-copilot/src/settings/contexts/SettingsContext.tsx
Logan Yang 7e499073af
Refactor Settings, add formatting (#518)
* Refactor settings components

* Save setting without reload, and formatting

* Add prettier config and enforce style

* Make default indexing strategy ON_MODE_SWITCH

* Add prettier pre-commit hook
2024-08-20 21:53:09 -07:00

60 lines
1.8 KiB
TypeScript

import { DEFAULT_SETTINGS } from "@/constants";
import CopilotPlugin from "@/main";
import { CopilotSettings } from "@/settings/SettingsPage";
import React, { createContext, useCallback, useContext, useState } from "react";
interface SettingsContextType {
settings: CopilotSettings;
updateSettings: (newSettings: Partial<CopilotSettings>) => void;
saveSettings: () => Promise<void>;
resetSettings: () => Promise<void>;
reloadPlugin: () => Promise<void>;
}
const SettingsContext = createContext<SettingsContextType | undefined>(undefined);
export const SettingsProvider: React.FC<{
plugin: CopilotPlugin;
reloadPlugin: () => Promise<void>;
children: React.ReactNode;
}> = ({ plugin, reloadPlugin, children }) => {
const [settings, setSettings] = useState<CopilotSettings>(plugin.settings);
const updateSettings = useCallback(
async (newSettings: Partial<CopilotSettings>) => {
const updatedSettings = { ...settings, ...newSettings };
setSettings(updatedSettings);
plugin.settings = updatedSettings;
await plugin.saveSettings();
},
[plugin, settings]
);
const saveSettings = useCallback(async () => {
await plugin.saveSettings();
await reloadPlugin();
}, [plugin, reloadPlugin]);
const resetSettings = useCallback(async () => {
plugin.settings = DEFAULT_SETTINGS;
setSettings(DEFAULT_SETTINGS);
await plugin.saveSettings();
await reloadPlugin();
}, [plugin]);
return (
<SettingsContext.Provider
value={{ settings, updateSettings, saveSettings, resetSettings, reloadPlugin }}
>
{children}
</SettingsContext.Provider>
);
};
export const useSettingsContext = () => {
const context = useContext(SettingsContext);
if (context === undefined) {
throw new Error("useSettingsContext must be used within a SettingsProvider");
}
return context;
};