import { useCallback, useEffect, useMemo, useState } from 'react' import { useApp } from '../contexts/AppContext' import { CustomModeManager } from '../database/json/custom-mode/CustomModeManager' import { CustomMode, GroupEntry } from '../database/json/custom-mode/types' type UseCustomModes = { createCustomMode: ( name: string, roleDefinition: string, customInstructions: string, groups: GroupEntry[] ) => Promise deleteCustomMode: (id: string) => Promise updateCustomMode: ( id: string, name: string, roleDefinition: string, customInstructions: string, groups: GroupEntry[] ) => Promise FindCustomModeByName: (name: string) => Promise customModeList: CustomMode[] } export function useCustomModes(): UseCustomModes { const [customModeList, setCustomModeList] = useState([]) const app = useApp() const customModeManager = useMemo(() => new CustomModeManager(app), [app]) const fetchCustomModeList = useCallback(async () => { customModeManager.ListCustomModes().then((rows) => { setCustomModeList(rows) }) }, [customModeManager]) useEffect(() => { void fetchCustomModeList() }, [fetchCustomModeList]) const createCustomMode = useCallback( async ( name: string, roleDefinition: string, customInstructions: string, groups: GroupEntry[] ): Promise => { await customModeManager.createCustomMode({ name, roleDefinition, customInstructions, groups, }) fetchCustomModeList() }, [customModeManager, fetchCustomModeList], ) const deleteCustomMode = useCallback( async (id: string): Promise => { await customModeManager.deleteCustomMode(id) fetchCustomModeList() }, [customModeManager, fetchCustomModeList], ) const updateCustomMode = useCallback( async (id: string, name: string, roleDefinition: string, customInstructions: string, groups: GroupEntry[]): Promise => { await customModeManager.updateCustomMode(id, { name, roleDefinition, customInstructions, groups, }) fetchCustomModeList() }, [customModeManager, fetchCustomModeList], ) const FindCustomModeByName = useCallback( async (name: string): Promise => { return customModeList.find((customMode) => customMode.name === name) }, [customModeList]) return { createCustomMode, deleteCustomMode, updateCustomMode, FindCustomModeByName, customModeList, } }