diff --git a/frontend/src/config/modules.config.ts b/frontend/src/config/modules.config.ts new file mode 100644 index 00000000..45d7440d --- /dev/null +++ b/frontend/src/config/modules.config.ts @@ -0,0 +1,110 @@ +/** + * Module Configuration + * Defines all available modules and their properties + */ + +export interface ModuleConfig { + name: string; + route: string; + icon?: string; + description?: string; + enabled: boolean; // Will be checked from API +} + +export const MODULES: Record = { + planner: { + name: 'Planner', + route: '/planner', + icon: '📊', + description: 'Keyword research and clustering', + enabled: true, // Default, will be checked from API + }, + writer: { + name: 'Writer', + route: '/writer', + icon: '✍️', + description: 'Content generation and management', + enabled: true, + }, + thinker: { + name: 'Thinker', + route: '/thinker', + icon: '🧠', + description: 'AI prompts and strategies', + enabled: true, + }, + automation: { + name: 'Automation', + route: '/automation', + icon: '⚙️', + description: 'Automated workflows and tasks', + enabled: true, + }, + site_builder: { + name: 'Site Builder', + route: '/site-builder', + icon: '🏗️', + description: 'Build and manage sites', + enabled: true, + }, + linker: { + name: 'Linker', + route: '/linker', + icon: '🔗', + description: 'Internal linking optimization', + enabled: true, + }, + optimizer: { + name: 'Optimizer', + route: '/optimizer', + icon: '⚡', + description: 'Content optimization', + enabled: true, + }, + publisher: { + name: 'Publisher', + route: '/publisher', + icon: '📤', + description: 'Content publishing', + enabled: true, + }, +}; + +/** + * Get module config by name + */ +export function getModuleConfig(moduleName: string): ModuleConfig | undefined { + return MODULES[moduleName]; +} + +/** + * Get all enabled modules + */ +export function getEnabledModules(moduleEnableSettings?: Record): ModuleConfig[] { + return Object.entries(MODULES) + .filter(([key, module]) => { + // If moduleEnableSettings provided, use it; otherwise default to enabled + if (moduleEnableSettings) { + const enabledKey = `${key}_enabled` as keyof typeof moduleEnableSettings; + return moduleEnableSettings[enabledKey] !== false; // Default to true if not set + } + return module.enabled; + }) + .map(([, module]) => module); +} + +/** + * Check if a module is enabled + */ +export function isModuleEnabled(moduleName: string, moduleEnableSettings?: Record): boolean { + const module = MODULES[moduleName]; + if (!module) return false; + + if (moduleEnableSettings) { + const enabledKey = `${moduleName}_enabled` as keyof typeof moduleEnableSettings; + return moduleEnableSettings[enabledKey] !== false; // Default to true if not set + } + + return module.enabled; +} + diff --git a/frontend/src/services/api.ts b/frontend/src/services/api.ts index dbb1a98b..566bf003 100644 --- a/frontend/src/services/api.ts +++ b/frontend/src/services/api.ts @@ -1474,6 +1474,20 @@ export async function deleteAccountSetting(key: string): Promise { } // Module Settings +export interface ModuleEnableSettings { + id: number; + planner_enabled: boolean; + writer_enabled: boolean; + thinker_enabled: boolean; + automation_enabled: boolean; + site_builder_enabled: boolean; + linker_enabled: boolean; + optimizer_enabled: boolean; + publisher_enabled: boolean; + created_at: string; + updated_at: string; +} + export interface ModuleSetting { id: number; module_name: string; @@ -1498,6 +1512,19 @@ export async function createModuleSetting(data: { module_name: string; key: stri }); } +export async function fetchModuleEnableSettings(): Promise { + const response = await fetchAPI('/v1/system/settings/modules/enable/'); + return response; +} + +export async function updateModuleEnableSettings(data: Partial): Promise { + const response = await fetchAPI('/v1/system/settings/modules/enable/', { + method: 'PUT', + body: JSON.stringify(data), + }); + return response; +} + export async function updateModuleSetting(moduleName: string, key: string, data: Partial<{ config: Record; is_active: boolean }>): Promise { return fetchAPI(`/v1/system/settings/modules/${key}/?module_name=${moduleName}`, { method: 'PUT', diff --git a/frontend/src/store/settingsStore.ts b/frontend/src/store/settingsStore.ts index 76f66ef6..453d9f74 100644 --- a/frontend/src/store/settingsStore.ts +++ b/frontend/src/store/settingsStore.ts @@ -13,13 +13,17 @@ import { fetchModuleSettings, createModuleSetting, updateModuleSetting, + fetchModuleEnableSettings, + updateModuleEnableSettings, AccountSetting, ModuleSetting, + ModuleEnableSettings, } from '../services/api'; interface SettingsState { accountSettings: Record; moduleSettings: Record>; + moduleEnableSettings: ModuleEnableSettings | null; loading: boolean; error: string | null; @@ -29,6 +33,9 @@ interface SettingsState { updateAccountSetting: (key: string, value: any) => Promise; loadModuleSettings: (moduleName: string) => Promise; updateModuleSetting: (moduleName: string, key: string, value: any) => Promise; + loadModuleEnableSettings: () => Promise; + updateModuleEnableSettings: (data: Partial) => Promise; + isModuleEnabled: (moduleName: string) => boolean; reset: () => void; } @@ -37,6 +44,7 @@ export const useSettingsStore = create()( (set, get) => ({ accountSettings: {}, moduleSettings: {}, + moduleEnableSettings: null, loading: false, error: null, @@ -135,10 +143,40 @@ export const useSettingsStore = create()( } }, + loadModuleEnableSettings: async () => { + set({ loading: true, error: null }); + try { + const settings = await fetchModuleEnableSettings(); + set({ moduleEnableSettings: settings, loading: false }); + } catch (error: any) { + set({ error: error.message, loading: false }); + } + }, + + updateModuleEnableSettings: async (data: Partial) => { + set({ loading: true, error: null }); + try { + const settings = await updateModuleEnableSettings(data); + set({ moduleEnableSettings: settings, loading: false }); + } catch (error: any) { + set({ error: error.message, loading: false }); + throw error; + } + }, + + isModuleEnabled: (moduleName: string): boolean => { + const settings = get().moduleEnableSettings; + if (!settings) return true; // Default to enabled if not loaded + + const enabledKey = `${moduleName}_enabled` as keyof ModuleEnableSettings; + return settings[enabledKey] !== false; // Default to true if not set + }, + reset: () => { set({ accountSettings: {}, moduleSettings: {}, + moduleEnableSettings: null, loading: false, error: null, }); @@ -149,6 +187,7 @@ export const useSettingsStore = create()( partialize: (state) => ({ accountSettings: state.accountSettings, moduleSettings: state.moduleSettings, + moduleEnableSettings: state.moduleEnableSettings, }), } )