mirror of
https://github.com/stackblitz-labs/bolt.diy
synced 2025-01-23 11:17:02 +00:00
4c81e154a0
Some checks are pending
Update Stable Branch / prepare-release (push) Waiting to run
* initial setup * updated template list * added optional switch to control this feature * removed some logs
230 lines
7.3 KiB
TypeScript
230 lines
7.3 KiB
TypeScript
import { useStore } from '@nanostores/react';
|
|
import {
|
|
isDebugMode,
|
|
isEventLogsEnabled,
|
|
isLocalModelsEnabled,
|
|
LOCAL_PROVIDERS,
|
|
promptStore,
|
|
providersStore,
|
|
latestBranchStore,
|
|
autoSelectStarterTemplate,
|
|
enableContextOptimizationStore,
|
|
} from '~/lib/stores/settings';
|
|
import { useCallback, useEffect, useState } from 'react';
|
|
import Cookies from 'js-cookie';
|
|
import type { IProviderSetting, ProviderInfo } from '~/types/model';
|
|
import { logStore } from '~/lib/stores/logs'; // assuming logStore is imported from this location
|
|
|
|
interface CommitData {
|
|
commit: string;
|
|
version?: string;
|
|
}
|
|
|
|
const versionData: CommitData = {
|
|
commit: __COMMIT_HASH,
|
|
version: __APP_VERSION,
|
|
};
|
|
|
|
export function useSettings() {
|
|
const providers = useStore(providersStore);
|
|
const debug = useStore(isDebugMode);
|
|
const eventLogs = useStore(isEventLogsEnabled);
|
|
const promptId = useStore(promptStore);
|
|
const isLocalModel = useStore(isLocalModelsEnabled);
|
|
const isLatestBranch = useStore(latestBranchStore);
|
|
const autoSelectTemplate = useStore(autoSelectStarterTemplate);
|
|
const [activeProviders, setActiveProviders] = useState<ProviderInfo[]>([]);
|
|
const contextOptimizationEnabled = useStore(enableContextOptimizationStore);
|
|
|
|
// Function to check if we're on stable version
|
|
const checkIsStableVersion = async () => {
|
|
try {
|
|
const response = await fetch(
|
|
`https://api.github.com/repos/stackblitz-labs/bolt.diy/git/refs/tags/v${versionData.version}`,
|
|
);
|
|
const data: { object: { sha: string } } = await response.json();
|
|
|
|
return versionData.commit.slice(0, 7) === data.object.sha.slice(0, 7);
|
|
} catch (error) {
|
|
console.warn('Error checking stable version:', error);
|
|
return false;
|
|
}
|
|
};
|
|
|
|
// reading values from cookies on mount
|
|
useEffect(() => {
|
|
const savedProviders = Cookies.get('providers');
|
|
|
|
if (savedProviders) {
|
|
try {
|
|
const parsedProviders: Record<string, IProviderSetting> = JSON.parse(savedProviders);
|
|
Object.keys(providers).forEach((provider) => {
|
|
const currentProviderSettings = parsedProviders[provider];
|
|
|
|
if (currentProviderSettings) {
|
|
providersStore.setKey(provider, {
|
|
...providers[provider],
|
|
settings: {
|
|
...currentProviderSettings,
|
|
enabled: currentProviderSettings.enabled ?? true,
|
|
},
|
|
});
|
|
}
|
|
});
|
|
} catch (error) {
|
|
console.error('Failed to parse providers from cookies:', error);
|
|
}
|
|
}
|
|
|
|
// load debug mode from cookies
|
|
const savedDebugMode = Cookies.get('isDebugEnabled');
|
|
|
|
if (savedDebugMode) {
|
|
isDebugMode.set(savedDebugMode === 'true');
|
|
}
|
|
|
|
// load event logs from cookies
|
|
const savedEventLogs = Cookies.get('isEventLogsEnabled');
|
|
|
|
if (savedEventLogs) {
|
|
isEventLogsEnabled.set(savedEventLogs === 'true');
|
|
}
|
|
|
|
// load local models from cookies
|
|
const savedLocalModels = Cookies.get('isLocalModelsEnabled');
|
|
|
|
if (savedLocalModels) {
|
|
isLocalModelsEnabled.set(savedLocalModels === 'true');
|
|
}
|
|
|
|
const promptId = Cookies.get('promptId');
|
|
|
|
if (promptId) {
|
|
promptStore.set(promptId);
|
|
}
|
|
|
|
// load latest branch setting from cookies or determine based on version
|
|
const savedLatestBranch = Cookies.get('isLatestBranch');
|
|
let checkCommit = Cookies.get('commitHash');
|
|
|
|
if (checkCommit === undefined) {
|
|
checkCommit = versionData.commit;
|
|
}
|
|
|
|
if (savedLatestBranch === undefined || checkCommit !== versionData.commit) {
|
|
// If setting hasn't been set by user, check version
|
|
checkIsStableVersion().then((isStable) => {
|
|
const shouldUseLatest = !isStable;
|
|
latestBranchStore.set(shouldUseLatest);
|
|
Cookies.set('isLatestBranch', String(shouldUseLatest));
|
|
Cookies.set('commitHash', String(versionData.commit));
|
|
});
|
|
} else {
|
|
latestBranchStore.set(savedLatestBranch === 'true');
|
|
}
|
|
|
|
const autoSelectTemplate = Cookies.get('autoSelectTemplate');
|
|
|
|
if (autoSelectTemplate) {
|
|
autoSelectStarterTemplate.set(autoSelectTemplate === 'true');
|
|
}
|
|
|
|
const savedContextOptimizationEnabled = Cookies.get('contextOptimizationEnabled');
|
|
|
|
if (savedContextOptimizationEnabled) {
|
|
enableContextOptimizationStore.set(savedContextOptimizationEnabled === 'true');
|
|
}
|
|
}, []);
|
|
|
|
// writing values to cookies on change
|
|
useEffect(() => {
|
|
const providers = providersStore.get();
|
|
const providerSetting: Record<string, IProviderSetting> = {};
|
|
Object.keys(providers).forEach((provider) => {
|
|
providerSetting[provider] = providers[provider].settings;
|
|
});
|
|
Cookies.set('providers', JSON.stringify(providerSetting));
|
|
}, [providers]);
|
|
|
|
useEffect(() => {
|
|
let active = Object.entries(providers)
|
|
.filter(([_key, provider]) => provider.settings.enabled)
|
|
.map(([_k, p]) => p);
|
|
|
|
if (!isLocalModel) {
|
|
active = active.filter((p) => !LOCAL_PROVIDERS.includes(p.name));
|
|
}
|
|
|
|
setActiveProviders(active);
|
|
}, [providers, isLocalModel]);
|
|
|
|
// helper function to update settings
|
|
const updateProviderSettings = useCallback(
|
|
(provider: string, config: IProviderSetting) => {
|
|
const settings = providers[provider].settings;
|
|
providersStore.setKey(provider, { ...providers[provider], settings: { ...settings, ...config } });
|
|
},
|
|
[providers],
|
|
);
|
|
|
|
const enableDebugMode = useCallback((enabled: boolean) => {
|
|
isDebugMode.set(enabled);
|
|
logStore.logSystem(`Debug mode ${enabled ? 'enabled' : 'disabled'}`);
|
|
Cookies.set('isDebugEnabled', String(enabled));
|
|
}, []);
|
|
|
|
const enableEventLogs = useCallback((enabled: boolean) => {
|
|
isEventLogsEnabled.set(enabled);
|
|
logStore.logSystem(`Event logs ${enabled ? 'enabled' : 'disabled'}`);
|
|
Cookies.set('isEventLogsEnabled', String(enabled));
|
|
}, []);
|
|
|
|
const enableLocalModels = useCallback((enabled: boolean) => {
|
|
isLocalModelsEnabled.set(enabled);
|
|
logStore.logSystem(`Local models ${enabled ? 'enabled' : 'disabled'}`);
|
|
Cookies.set('isLocalModelsEnabled', String(enabled));
|
|
}, []);
|
|
|
|
const setPromptId = useCallback((promptId: string) => {
|
|
promptStore.set(promptId);
|
|
Cookies.set('promptId', promptId);
|
|
}, []);
|
|
const enableLatestBranch = useCallback((enabled: boolean) => {
|
|
latestBranchStore.set(enabled);
|
|
logStore.logSystem(`Main branch updates ${enabled ? 'enabled' : 'disabled'}`);
|
|
Cookies.set('isLatestBranch', String(enabled));
|
|
}, []);
|
|
|
|
const setAutoSelectTemplate = useCallback((enabled: boolean) => {
|
|
autoSelectStarterTemplate.set(enabled);
|
|
logStore.logSystem(`Auto select template ${enabled ? 'enabled' : 'disabled'}`);
|
|
Cookies.set('autoSelectTemplate', String(enabled));
|
|
}, []);
|
|
|
|
const enableContextOptimization = useCallback((enabled: boolean) => {
|
|
enableContextOptimizationStore.set(enabled);
|
|
logStore.logSystem(`Context optimization ${enabled ? 'enabled' : 'disabled'}`);
|
|
Cookies.set('contextOptimizationEnabled', String(enabled));
|
|
}, []);
|
|
|
|
return {
|
|
providers,
|
|
activeProviders,
|
|
updateProviderSettings,
|
|
debug,
|
|
enableDebugMode,
|
|
eventLogs,
|
|
enableEventLogs,
|
|
isLocalModel,
|
|
enableLocalModels,
|
|
promptId,
|
|
setPromptId,
|
|
isLatestBranch,
|
|
enableLatestBranch,
|
|
autoSelectTemplate,
|
|
setAutoSelectTemplate,
|
|
contextOptimizationEnabled,
|
|
enableContextOptimization,
|
|
};
|
|
}
|