1- import { proxy , snapshot , useSnapshot } from 'valtio'
2-
1+ import { proxy , subscribe , snapshot , useSnapshot } from 'valtio'
2+ import type { Message as MessageType } from 'ai/react'
33import { SupportedAssistantEntities } from 'components/ui/AIAssistantPanel/AIAssistant.types'
44import { LOCAL_STORAGE_KEYS } from 'lib/constants'
55import { LOCAL_STORAGE_KEYS as COMMON_LOCAL_STORAGE_KEYS } from 'common'
6- import type { Message as MessageType } from 'ai/react'
7-
8- const EMPTY_DASHBOARD_HISTORY : {
9- sql ?: string
10- editor ?: string
11- } = {
12- sql : undefined ,
13- editor : undefined ,
14- }
156
167export type CommonDatabaseEntity = {
178 id : number
@@ -27,7 +18,7 @@ export type SuggestionsType = {
2718
2819type AiAssistantPanelType = {
2920 open : boolean
30- messages ? : MessageType [ ] | undefined
21+ messages : MessageType [ ]
3122 initialInput : string
3223 sqlSnippets ?: string [ ]
3324 suggestions ?: SuggestionsType
@@ -39,9 +30,14 @@ type AiAssistantPanelType = {
3930 tables : { schema : string ; name : string } [ ]
4031}
4132
33+ type DashboardHistoryType = {
34+ sql ?: string
35+ editor ?: string
36+ }
37+
4238const INITIAL_AI_ASSISTANT : AiAssistantPanelType = {
4339 open : false ,
44- messages : undefined ,
40+ messages : [ ] ,
4541 sqlSnippets : undefined ,
4642 initialInput : '' ,
4743 suggestions : undefined ,
@@ -51,9 +47,76 @@ const INITIAL_AI_ASSISTANT: AiAssistantPanelType = {
5147 tables : [ ] ,
5248}
5349
50+ const EMPTY_DASHBOARD_HISTORY : DashboardHistoryType = {
51+ sql : undefined ,
52+ editor : undefined ,
53+ }
54+
55+ const getInitialState = ( ) => {
56+ if ( typeof window === 'undefined' ) {
57+ return {
58+ aiAssistantPanel : INITIAL_AI_ASSISTANT ,
59+ dashboardHistory : EMPTY_DASHBOARD_HISTORY ,
60+ activeDocsSection : [ 'introduction' ] ,
61+ docsLanguage : 'js' ,
62+ showProjectApiDocs : false ,
63+ isOptedInTelemetry : false ,
64+ showEnableBranchingModal : false ,
65+ showFeaturePreviewModal : false ,
66+ selectedFeaturePreview : '' ,
67+ showAiSettingsModal : false ,
68+ showGenerateSqlModal : false ,
69+ navigationPanelOpen : false ,
70+ navigationPanelJustClosed : false ,
71+ }
72+ }
73+
74+ const stored = localStorage . getItem ( LOCAL_STORAGE_KEYS . AI_ASSISTANT_STATE )
75+
76+ const urlParams = new URLSearchParams ( window . location . search )
77+ const aiAssistantPanelOpenParam = urlParams . get ( 'aiAssistantPanelOpen' )
78+
79+ let parsedAiAssistant = INITIAL_AI_ASSISTANT
80+
81+ try {
82+ if ( stored ) {
83+ parsedAiAssistant = JSON . parse ( stored , ( key , value ) => {
84+ if ( key === 'createdAt' && value ) {
85+ return new Date ( value )
86+ }
87+ return value
88+ } )
89+ }
90+ } catch {
91+ // Ignore parsing errors
92+ }
93+
94+ return {
95+ aiAssistantPanel : {
96+ ...parsedAiAssistant ,
97+ open :
98+ aiAssistantPanelOpenParam !== null
99+ ? aiAssistantPanelOpenParam === 'true'
100+ : parsedAiAssistant . open ,
101+ } ,
102+ dashboardHistory : EMPTY_DASHBOARD_HISTORY ,
103+ activeDocsSection : [ 'introduction' ] ,
104+ docsLanguage : 'js' ,
105+ showProjectApiDocs : false ,
106+ isOptedInTelemetry : false ,
107+ showEnableBranchingModal : false ,
108+ showFeaturePreviewModal : false ,
109+ selectedFeaturePreview : '' ,
110+ showAiSettingsModal : false ,
111+ showGenerateSqlModal : false ,
112+ navigationPanelOpen : false ,
113+ navigationPanelJustClosed : false ,
114+ }
115+ }
116+
54117export const appState = proxy ( {
55- // [Joshen] Last visited "entity" for any page that we wanna track
56- dashboardHistory : EMPTY_DASHBOARD_HISTORY ,
118+ ... getInitialState ( ) ,
119+
57120 setDashboardHistory : ( ref : string , key : 'sql' | 'editor' , id : string ) => {
58121 if ( appState . dashboardHistory [ key ] !== id ) {
59122 appState . dashboardHistory [ key ] = id
@@ -84,22 +147,27 @@ export const appState = proxy({
84147 localStorage . setItem ( COMMON_LOCAL_STORAGE_KEYS . TELEMETRY_CONSENT , value . toString ( ) )
85148 }
86149 } ,
150+
87151 showEnableBranchingModal : false ,
88152 setShowEnableBranchingModal : ( value : boolean ) => {
89153 appState . showEnableBranchingModal = value
90154 } ,
155+
91156 showFeaturePreviewModal : false ,
92157 setShowFeaturePreviewModal : ( value : boolean ) => {
93158 appState . showFeaturePreviewModal = value
94159 } ,
160+
95161 selectedFeaturePreview : '' ,
96162 setSelectedFeaturePreview : ( value : string ) => {
97163 appState . selectedFeaturePreview = value
98164 } ,
165+
99166 showAiSettingsModal : false ,
100167 setShowAiSettingsModal : ( value : boolean ) => {
101168 appState . showAiSettingsModal = value
102169 } ,
170+
103171 showGenerateSqlModal : false ,
104172 setShowGenerateSqlModal : ( value : boolean ) => {
105173 appState . showGenerateSqlModal = value
@@ -109,18 +177,14 @@ export const appState = proxy({
109177 navigationPanelJustClosed : false ,
110178 setNavigationPanelOpen : ( value : boolean , trackJustClosed : boolean = false ) => {
111179 if ( value === false ) {
112- // If closing navigation panel by clicking on icon/button, nav bar should not open again until mouse leaves nav bar
113180 if ( trackJustClosed ) {
114181 appState . navigationPanelOpen = false
115182 appState . navigationPanelJustClosed = true
116183 } else {
117- // If closing navigation panel by leaving nav bar, nav bar can open again when mouse re-enter
118184 appState . navigationPanelOpen = false
119185 appState . navigationPanelJustClosed = false
120186 }
121187 } else {
122- // If opening nav panel, check if it was just closed by a nav icon/button click
123- // If yes, do not open nav panel, otherwise open as per normal
124188 if ( appState . navigationPanelJustClosed === false ) {
125189 appState . navigationPanelOpen = true
126190 }
@@ -137,7 +201,6 @@ export const appState = proxy({
137201 }
138202 } ,
139203
140- aiAssistantPanel : INITIAL_AI_ASSISTANT as AiAssistantPanelType ,
141204 setAiAssistantPanel : ( value : Partial < AiAssistantPanelType > ) => {
142205 const hasEntityChanged = value . entity ?. id !== appState . aiAssistantPanel . entity ?. id
143206
@@ -149,6 +212,16 @@ export const appState = proxy({
149212 } ,
150213} )
151214
215+ // Set up localStorage subscription
216+ if ( typeof window !== 'undefined' ) {
217+ subscribe ( appState , ( ) => {
218+ localStorage . setItem (
219+ LOCAL_STORAGE_KEYS . AI_ASSISTANT_STATE ,
220+ JSON . stringify ( appState . aiAssistantPanel )
221+ )
222+ } )
223+ }
224+
152225export const getAppStateSnapshot = ( ) => snapshot ( appState )
153226
154227export const useAppStateSnapshot = ( options ?: Parameters < typeof useSnapshot > [ 1 ] ) =>
0 commit comments