import { useState, useEffect } from 'react';
import { Settings } from '../types';
import { DEFAULT_SETTINGS } from '../constants/settings';
import { API_ENDPOINTS } from '../constants/api';
import { TIMING } from '../constants/timing';
export function useSettings() {
const [settings, setSettings] = useState<Settings>(DEFAULT_SETTINGS);
const [isSaving, setIsSaving] = useState(false);
const [saveStatus, setSaveStatus] = useState('');
useEffect(() => {
// Load initial settings
fetch(API_ENDPOINTS.SETTINGS)
.then(res => res.json())
.then(data => {
setSettings({
CLAUDE_RECALL_MODEL: data.CLAUDE_RECALL_MODEL || DEFAULT_SETTINGS.CLAUDE_RECALL_MODEL,
CLAUDE_RECALL_CONTEXT_OBSERVATIONS: data.CLAUDE_RECALL_CONTEXT_OBSERVATIONS || DEFAULT_SETTINGS.CLAUDE_RECALL_CONTEXT_OBSERVATIONS,
CLAUDE_RECALL_WORKER_PORT: data.CLAUDE_RECALL_WORKER_PORT || DEFAULT_SETTINGS.CLAUDE_RECALL_WORKER_PORT,
CLAUDE_RECALL_WORKER_HOST: data.CLAUDE_RECALL_WORKER_HOST || DEFAULT_SETTINGS.CLAUDE_RECALL_WORKER_HOST,
// AI Provider Configuration
CLAUDE_RECALL_PROVIDER: data.CLAUDE_RECALL_PROVIDER || DEFAULT_SETTINGS.CLAUDE_RECALL_PROVIDER,
CLAUDE_RECALL_GEMINI_API_KEY: data.CLAUDE_RECALL_GEMINI_API_KEY || DEFAULT_SETTINGS.CLAUDE_RECALL_GEMINI_API_KEY,
CLAUDE_RECALL_GEMINI_MODEL: data.CLAUDE_RECALL_GEMINI_MODEL || DEFAULT_SETTINGS.CLAUDE_RECALL_GEMINI_MODEL,
CLAUDE_RECALL_GEMINI_RATE_LIMITING_ENABLED: data.CLAUDE_RECALL_GEMINI_RATE_LIMITING_ENABLED || DEFAULT_SETTINGS.CLAUDE_RECALL_GEMINI_RATE_LIMITING_ENABLED,
// OpenRouter Configuration
CLAUDE_RECALL_OPENROUTER_API_KEY: data.CLAUDE_RECALL_OPENROUTER_API_KEY || DEFAULT_SETTINGS.CLAUDE_RECALL_OPENROUTER_API_KEY,
CLAUDE_RECALL_OPENROUTER_MODEL: data.CLAUDE_RECALL_OPENROUTER_MODEL || DEFAULT_SETTINGS.CLAUDE_RECALL_OPENROUTER_MODEL,
CLAUDE_RECALL_OPENROUTER_SITE_URL: data.CLAUDE_RECALL_OPENROUTER_SITE_URL || DEFAULT_SETTINGS.CLAUDE_RECALL_OPENROUTER_SITE_URL,
CLAUDE_RECALL_OPENROUTER_APP_NAME: data.CLAUDE_RECALL_OPENROUTER_APP_NAME || DEFAULT_SETTINGS.CLAUDE_RECALL_OPENROUTER_APP_NAME,
// Token Economics Display
CLAUDE_RECALL_CONTEXT_SHOW_READ_TOKENS: data.CLAUDE_RECALL_CONTEXT_SHOW_READ_TOKENS || DEFAULT_SETTINGS.CLAUDE_RECALL_CONTEXT_SHOW_READ_TOKENS,
CLAUDE_RECALL_CONTEXT_SHOW_WORK_TOKENS: data.CLAUDE_RECALL_CONTEXT_SHOW_WORK_TOKENS || DEFAULT_SETTINGS.CLAUDE_RECALL_CONTEXT_SHOW_WORK_TOKENS,
CLAUDE_RECALL_CONTEXT_SHOW_SAVINGS_AMOUNT: data.CLAUDE_RECALL_CONTEXT_SHOW_SAVINGS_AMOUNT || DEFAULT_SETTINGS.CLAUDE_RECALL_CONTEXT_SHOW_SAVINGS_AMOUNT,
CLAUDE_RECALL_CONTEXT_SHOW_SAVINGS_PERCENT: data.CLAUDE_RECALL_CONTEXT_SHOW_SAVINGS_PERCENT || DEFAULT_SETTINGS.CLAUDE_RECALL_CONTEXT_SHOW_SAVINGS_PERCENT,
// Observation Filtering
CLAUDE_RECALL_CONTEXT_OBSERVATION_TYPES: data.CLAUDE_RECALL_CONTEXT_OBSERVATION_TYPES || DEFAULT_SETTINGS.CLAUDE_RECALL_CONTEXT_OBSERVATION_TYPES,
CLAUDE_RECALL_CONTEXT_OBSERVATION_CONCEPTS: data.CLAUDE_RECALL_CONTEXT_OBSERVATION_CONCEPTS || DEFAULT_SETTINGS.CLAUDE_RECALL_CONTEXT_OBSERVATION_CONCEPTS,
// Display Configuration
CLAUDE_RECALL_CONTEXT_FULL_COUNT: data.CLAUDE_RECALL_CONTEXT_FULL_COUNT || DEFAULT_SETTINGS.CLAUDE_RECALL_CONTEXT_FULL_COUNT,
CLAUDE_RECALL_CONTEXT_FULL_FIELD: data.CLAUDE_RECALL_CONTEXT_FULL_FIELD || DEFAULT_SETTINGS.CLAUDE_RECALL_CONTEXT_FULL_FIELD,
CLAUDE_RECALL_CONTEXT_SESSION_COUNT: data.CLAUDE_RECALL_CONTEXT_SESSION_COUNT || DEFAULT_SETTINGS.CLAUDE_RECALL_CONTEXT_SESSION_COUNT,
// Feature Toggles
CLAUDE_RECALL_CONTEXT_SHOW_LAST_SUMMARY: data.CLAUDE_RECALL_CONTEXT_SHOW_LAST_SUMMARY || DEFAULT_SETTINGS.CLAUDE_RECALL_CONTEXT_SHOW_LAST_SUMMARY,
CLAUDE_RECALL_CONTEXT_SHOW_LAST_MESSAGE: data.CLAUDE_RECALL_CONTEXT_SHOW_LAST_MESSAGE || DEFAULT_SETTINGS.CLAUDE_RECALL_CONTEXT_SHOW_LAST_MESSAGE,
});
})
.catch(error => {
console.error('Failed to load settings:', error);
});
}, []);
const saveSettings = async (newSettings: Settings) => {
setIsSaving(true);
setSaveStatus('Saving...');
const response = await fetch(API_ENDPOINTS.SETTINGS, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(newSettings)
});
const result = await response.json();
if (result.success) {
setSettings(newSettings);
setSaveStatus('✓ Saved');
setTimeout(() => setSaveStatus(''), TIMING.SAVE_STATUS_DISPLAY_DURATION_MS);
} else {
setSaveStatus(`✗ Error: ${result.error}`);
}
setIsSaving(false);
};
return { settings, saveSettings, isSaving, saveStatus };
}