mirror of
https://github.com/lone-cloud/gerbil
synced 2026-06-03 19:54:44 -07:00
123 lines
3.1 KiB
TypeScript
123 lines
3.1 KiB
TypeScript
import { readJsonFile, writeJsonFile } from '@/utils/node/fs';
|
|
import { safeExecute } from '@/utils/node/logging';
|
|
import { getConfigDir } from '@/utils/node/path';
|
|
import { homedir } from 'os';
|
|
import { join } from 'path';
|
|
import { platform } from 'process';
|
|
import { nativeTheme } from 'electron';
|
|
import { PRODUCT_NAME } from '@/constants';
|
|
import type {
|
|
FrontendPreference,
|
|
DismissedUpdate,
|
|
ImageGenerationFrontendPreference,
|
|
} from '@/types';
|
|
import type { MantineColorScheme } from '@mantine/core';
|
|
import type { SavedNotepadState } from '@/types/electron';
|
|
|
|
export interface WindowBounds {
|
|
x?: number;
|
|
y?: number;
|
|
width?: number;
|
|
height?: number;
|
|
isMaximized: boolean;
|
|
}
|
|
|
|
interface AppConfig {
|
|
installDir?: string;
|
|
currentKoboldBinary?: string;
|
|
selectedConfig?: string;
|
|
frontendPreference?: FrontendPreference;
|
|
imageGenerationFrontendPreference?: ImageGenerationFrontendPreference;
|
|
colorScheme?: MantineColorScheme;
|
|
windowBounds?: WindowBounds;
|
|
hasSeenWelcome?: boolean;
|
|
skipEjectConfirmation?: boolean;
|
|
dismissedUpdates?: DismissedUpdate[];
|
|
zoomLevel?: number;
|
|
notepad?: SavedNotepadState;
|
|
enableSystemTray?: boolean;
|
|
}
|
|
|
|
let config: AppConfig = {};
|
|
let configPath: string;
|
|
|
|
async function loadConfig() {
|
|
const config = await safeExecute(
|
|
() => readJsonFile<AppConfig>(configPath),
|
|
'Error loading config'
|
|
);
|
|
return config || {};
|
|
}
|
|
|
|
async function saveConfig() {
|
|
const success = await safeExecute(
|
|
() => writeJsonFile(configPath, config),
|
|
'Error saving config'
|
|
);
|
|
return success !== null;
|
|
}
|
|
|
|
export async function initialize() {
|
|
configPath = getConfigDir();
|
|
config = await loadConfig();
|
|
}
|
|
|
|
export const get = <K extends keyof AppConfig>(key: K) => config[key];
|
|
|
|
export async function set<K extends keyof AppConfig>(
|
|
key: K,
|
|
value: AppConfig[K]
|
|
) {
|
|
config[key] = value;
|
|
await saveConfig();
|
|
}
|
|
|
|
function getDefaultInstallDir() {
|
|
const home = homedir();
|
|
|
|
switch (platform) {
|
|
case 'win32':
|
|
return join(home, PRODUCT_NAME);
|
|
case 'darwin':
|
|
return join(home, 'Applications', PRODUCT_NAME);
|
|
default:
|
|
return join(home, '.local', 'share', PRODUCT_NAME);
|
|
}
|
|
}
|
|
|
|
export const getInstallDir = () => config.installDir || getDefaultInstallDir();
|
|
|
|
export async function setInstallDir(dir: string) {
|
|
config.installDir = dir;
|
|
await saveConfig();
|
|
}
|
|
|
|
export function getCurrentKoboldBinary() {
|
|
const path = config.currentKoboldBinary;
|
|
return path ? path.trim() : path;
|
|
}
|
|
|
|
export async function setCurrentKoboldBinary(binaryPath: string) {
|
|
config.currentKoboldBinary = binaryPath;
|
|
await saveConfig();
|
|
}
|
|
|
|
export const getSelectedConfig = () => config.selectedConfig;
|
|
|
|
export const getColorScheme = () => config.colorScheme || 'auto';
|
|
|
|
export function getBackgroundColor() {
|
|
const colorScheme = getColorScheme();
|
|
|
|
if (colorScheme === 'light') {
|
|
return '#ffffff';
|
|
} else if (colorScheme === 'dark') {
|
|
return '#1a1b1e';
|
|
} else {
|
|
return nativeTheme.shouldUseDarkColors ? '#1a1b1e' : '#ffffff';
|
|
}
|
|
}
|
|
|
|
export const getWindowBounds = () => config.windowBounds;
|
|
|
|
export const getEnableSystemTray = () => config.enableSystemTray ?? false;
|