|
1 | 1 | import { createAssistant, deleteAssistant } from '@/services/assistants' |
2 | 2 | import { Assistant as CoreAssistant } from '@janhq/core' |
3 | 3 | import { create } from 'zustand' |
| 4 | +import { localStorageKey } from '@/constants/localStorage' |
4 | 5 |
|
5 | 6 | interface AssistantState { |
6 | 7 | assistants: Assistant[] |
7 | 8 | currentAssistant: Assistant |
8 | 9 | addAssistant: (assistant: Assistant) => void |
9 | 10 | updateAssistant: (assistant: Assistant) => void |
10 | 11 | deleteAssistant: (id: string) => void |
11 | | - setCurrentAssistant: (assistant: Assistant) => void |
| 12 | + setCurrentAssistant: (assistant: Assistant, saveToStorage?: boolean) => void |
12 | 13 | setAssistants: (assistants: Assistant[]) => void |
| 14 | + getLastUsedAssistant: () => string | null |
| 15 | + setLastUsedAssistant: (assistantId: string) => void |
| 16 | + initializeWithLastUsed: () => void |
| 17 | +} |
| 18 | + |
| 19 | +// Helper functions for localStorage |
| 20 | +const getLastUsedAssistantId = (): string | null => { |
| 21 | + try { |
| 22 | + return localStorage.getItem(localStorageKey.lastUsedAssistant) |
| 23 | + } catch (error) { |
| 24 | + console.debug('Failed to get last used assistant from localStorage:', error) |
| 25 | + return null |
| 26 | + } |
| 27 | +} |
| 28 | + |
| 29 | +const setLastUsedAssistantId = (assistantId: string) => { |
| 30 | + try { |
| 31 | + localStorage.setItem(localStorageKey.lastUsedAssistant, assistantId) |
| 32 | + } catch (error) { |
| 33 | + console.debug('Failed to set last used assistant in localStorage:', error) |
| 34 | + } |
13 | 35 | } |
14 | 36 |
|
15 | 37 | export const defaultAssistant: Assistant = { |
@@ -51,17 +73,52 @@ export const useAssistant = create<AssistantState>()((set, get) => ({ |
51 | 73 | }) |
52 | 74 | }, |
53 | 75 | deleteAssistant: (id) => { |
| 76 | + const state = get() |
54 | 77 | deleteAssistant( |
55 | | - get().assistants.find((e) => e.id === id) as unknown as CoreAssistant |
| 78 | + state.assistants.find((e) => e.id === id) as unknown as CoreAssistant |
56 | 79 | ).catch((error) => { |
57 | 80 | console.error('Failed to delete assistant:', error) |
58 | 81 | }) |
59 | | - set({ assistants: get().assistants.filter((a) => a.id !== id) }) |
| 82 | + |
| 83 | + // Check if we're deleting the current assistant |
| 84 | + const wasCurrentAssistant = state.currentAssistant.id === id |
| 85 | + |
| 86 | + set({ assistants: state.assistants.filter((a) => a.id !== id) }) |
| 87 | + |
| 88 | + // If the deleted assistant was current, fallback to default and update localStorage |
| 89 | + if (wasCurrentAssistant) { |
| 90 | + set({ currentAssistant: defaultAssistant }) |
| 91 | + setLastUsedAssistantId(defaultAssistant.id) |
| 92 | + } |
60 | 93 | }, |
61 | | - setCurrentAssistant: (assistant) => { |
| 94 | + setCurrentAssistant: (assistant, saveToStorage = true) => { |
62 | 95 | set({ currentAssistant: assistant }) |
| 96 | + if (saveToStorage) { |
| 97 | + setLastUsedAssistantId(assistant.id) |
| 98 | + } |
63 | 99 | }, |
64 | 100 | setAssistants: (assistants) => { |
65 | 101 | set({ assistants }) |
66 | 102 | }, |
| 103 | + getLastUsedAssistant: () => { |
| 104 | + return getLastUsedAssistantId() |
| 105 | + }, |
| 106 | + setLastUsedAssistant: (assistantId) => { |
| 107 | + setLastUsedAssistantId(assistantId) |
| 108 | + }, |
| 109 | + initializeWithLastUsed: () => { |
| 110 | + const lastUsedId = getLastUsedAssistantId() |
| 111 | + if (lastUsedId) { |
| 112 | + const lastUsedAssistant = get().assistants.find( |
| 113 | + (a) => a.id === lastUsedId |
| 114 | + ) |
| 115 | + if (lastUsedAssistant) { |
| 116 | + set({ currentAssistant: lastUsedAssistant }) |
| 117 | + } else { |
| 118 | + // Fallback to default if last used assistant was deleted |
| 119 | + set({ currentAssistant: defaultAssistant }) |
| 120 | + setLastUsedAssistantId(defaultAssistant.id) |
| 121 | + } |
| 122 | + } |
| 123 | + }, |
67 | 124 | })) |
0 commit comments