1- import type { ProjectId } from "@okcode/contracts" ;
1+ import type { ProjectId , ThreadId } from "@okcode/contracts" ;
22import { create } from "zustand" ;
33
44import type { BrowserPresetId } from "./lib/browserPresets" ;
@@ -13,7 +13,7 @@ export interface CustomViewport {
1313}
1414
1515interface PersistedPreviewUiState {
16- openByProjectId : Record < string , boolean > ;
16+ openByThreadId : Record < string , boolean > ;
1717 dockByProjectId : Record < string , PreviewDock > ;
1818 sizeByProjectId : Record < string , number > ;
1919 presetByProjectId : Record < string , BrowserPresetId > ;
@@ -26,8 +26,8 @@ interface PersistedPreviewUiState {
2626}
2727
2828interface PreviewStateStore extends PersistedPreviewUiState {
29- setProjectOpen : ( projectId : ProjectId , open : boolean ) => void ;
30- toggleProjectOpen : ( projectId : ProjectId ) => void ;
29+ setThreadOpen : ( threadId : ThreadId , open : boolean ) => void ;
30+ toggleThreadOpen : ( threadId : ThreadId ) => void ;
3131 setProjectDock : ( projectId : ProjectId , dock : PreviewDock ) => void ;
3232 toggleProjectLayout : ( projectId : ProjectId ) => void ;
3333 setProjectSize : ( projectId : ProjectId , size : number ) => void ;
@@ -42,7 +42,8 @@ interface PreviewStateStore extends PersistedPreviewUiState {
4242 toggleFullscreen : ( projectId : ProjectId ) => void ;
4343}
4444
45- const PREVIEW_STATE_STORAGE_KEY = "okcode:desktop-preview:v5" ;
45+ const PREVIEW_STATE_STORAGE_KEY = "okcode:desktop-preview:v6" ;
46+ const PREVIEW_STATE_STORAGE_KEY_V5 = "okcode:desktop-preview:v5" ;
4647const PREVIEW_STATE_STORAGE_KEY_V4 = "okcode:desktop-preview:v4" ;
4748
4849const VALID_PRESETS = new Set < string > ( [
@@ -88,7 +89,7 @@ function clampCustomViewport(viewport: CustomViewport): CustomViewport {
8889
8990function createEmptyPersistedPreviewUiState ( ) : PersistedPreviewUiState {
9091 return {
91- openByProjectId : { } ,
92+ openByThreadId : { } ,
9293 dockByProjectId : { } ,
9394 sizeByProjectId : { } ,
9495 presetByProjectId : { } ,
@@ -113,8 +114,11 @@ function readPersistedPreviewUiState(): PersistedPreviewUiState {
113114 }
114115
115116 try {
116- // Try v5 first, fall back to v4 for migration
117+ // Try v6 first, then older keys for migration.
117118 let raw = window . localStorage . getItem ( PREVIEW_STATE_STORAGE_KEY ) ;
119+ if ( ! raw ) {
120+ raw = window . localStorage . getItem ( PREVIEW_STATE_STORAGE_KEY_V5 ) ;
121+ }
118122 if ( ! raw ) {
119123 raw = window . localStorage . getItem ( PREVIEW_STATE_STORAGE_KEY_V4 ) ;
120124 }
@@ -124,10 +128,10 @@ function readPersistedPreviewUiState(): PersistedPreviewUiState {
124128
125129 const parsed = JSON . parse ( raw ) as Partial < PersistedPreviewUiState > ;
126130 return {
127- openByProjectId :
128- parsed . openByProjectId && typeof parsed . openByProjectId === "object"
131+ openByThreadId :
132+ parsed . openByThreadId && typeof parsed . openByThreadId === "object"
129133 ? Object . fromEntries (
130- Object . entries ( parsed . openByProjectId ) . filter (
134+ Object . entries ( parsed . openByThreadId ) . filter (
131135 ( entry ) : entry is [ string , boolean ] =>
132136 typeof entry [ 0 ] === "string" && typeof entry [ 1 ] === "boolean" ,
133137 ) ,
@@ -224,7 +228,7 @@ function persistPreviewUiState(state: PersistedPreviewUiState): void {
224228 window . localStorage . setItem (
225229 PREVIEW_STATE_STORAGE_KEY ,
226230 JSON . stringify ( {
227- openByProjectId : state . openByProjectId ,
231+ openByThreadId : state . openByThreadId ,
228232 dockByProjectId : state . dockByProjectId ,
229233 sizeByProjectId : state . sizeByProjectId ,
230234 presetByProjectId : state . presetByProjectId ,
@@ -242,7 +246,7 @@ function persistPreviewUiState(state: PersistedPreviewUiState): void {
242246
243247function snapshotState ( state : PreviewStateStore ) : PersistedPreviewUiState {
244248 return {
245- openByProjectId : state . openByProjectId ,
249+ openByThreadId : state . openByThreadId ,
246250 dockByProjectId : state . dockByProjectId ,
247251 sizeByProjectId : state . sizeByProjectId ,
248252 presetByProjectId : state . presetByProjectId ,
@@ -259,16 +263,16 @@ const initialState = readPersistedPreviewUiState();
259263export const usePreviewStateStore = create < PreviewStateStore > ( ( set , get ) => ( {
260264 ...initialState ,
261265
262- setProjectOpen : ( projectId , open ) => {
266+ setThreadOpen : ( threadId , open ) => {
263267 set ( ( state ) => {
264- const nextOpenByProjectId = { ...state . openByProjectId , [ projectId ] : open } ;
265- persistPreviewUiState ( { ...snapshotState ( state ) , openByProjectId : nextOpenByProjectId } ) ;
266- return { openByProjectId : nextOpenByProjectId } ;
268+ const nextOpenByThreadId = { ...state . openByThreadId , [ threadId ] : open } ;
269+ persistPreviewUiState ( { ...snapshotState ( state ) , openByThreadId : nextOpenByThreadId } ) ;
270+ return { openByThreadId : nextOpenByThreadId } ;
267271 } ) ;
268272 } ,
269273
270- toggleProjectOpen : ( projectId ) => {
271- get ( ) . setProjectOpen ( projectId , ! ( get ( ) . openByProjectId [ projectId ] ?? false ) ) ;
274+ toggleThreadOpen : ( threadId ) => {
275+ get ( ) . setThreadOpen ( threadId , ! ( get ( ) . openByThreadId [ threadId ] ?? false ) ) ;
272276 } ,
273277
274278 setProjectDock : ( projectId , _dock ) => {
0 commit comments