Compare commits

...
Sign in to create a new pull request.

1 commit

Author SHA1 Message Date
Brendan Allan
4e52817e65
fix(app): scope review pane state per session 2026-06-27 13:37:44 +08:00

View file

@ -60,6 +60,7 @@ type SessionTabs = {
type SessionView = { type SessionView = {
scroll: Record<string, SessionScroll> scroll: Record<string, SessionScroll>
reviewPanelOpened?: boolean
reviewOpen?: string[] reviewOpen?: string[]
pendingMessage?: string pendingMessage?: string
pendingMessageAt?: number pendingMessageAt?: number
@ -206,19 +207,32 @@ export const { use: useLayout, provider: LayoutProvider } = createSimpleContext(
} }
})() })()
const legacyReviewPanelOpened = (() => {
if (isRecord(review) && typeof review.panelOpened === "boolean") return review.panelOpened
if (isRecord(fileTree) && typeof fileTree.opened === "boolean") return fileTree.opened
})()
const migratedReview = (() => { const migratedReview = (() => {
if (!isRecord(review)) return review if (!isRecord(review) || !("panelOpened" in review)) return review
if (typeof review.panelOpened === "boolean") return review return Object.fromEntries(Object.entries(review).filter(([key]) => key !== "panelOpened"))
const opened = isRecord(fileTree) && typeof fileTree.opened === "boolean" ? fileTree.opened : true
return {
...review,
panelOpened: opened,
}
})() })()
const sessionTabs = migrateLegacySessionStateKeys(value.sessionTabs) const sessionTabs = migrateLegacySessionStateKeys(value.sessionTabs)
const sessionView = migrateLegacySessionStateKeys(value.sessionView) const rawSessionView = migrateLegacySessionStateKeys(value.sessionView)
const sessionView = (() => {
if (!isRecord(rawSessionView)) return rawSessionView
if (legacyReviewPanelOpened === undefined) return rawSessionView
const entries = Object.entries(rawSessionView)
const changed = entries.some(([, view]) => isRecord(view) && typeof view.reviewPanelOpened !== "boolean")
if (!changed) return rawSessionView
return Object.fromEntries(
entries.map(([key, view]) => {
if (!isRecord(view) || typeof view.reviewPanelOpened === "boolean") return [key, view]
return [key, { ...view, reviewPanelOpened: legacyReviewPanelOpened }]
}),
)
})()
const migratedSessionTabs = (() => { const migratedSessionTabs = (() => {
if (!isRecord(sessionTabs)) return sessionTabs if (!isRecord(sessionTabs)) return sessionTabs
@ -279,7 +293,6 @@ export const { use: useLayout, provider: LayoutProvider } = createSimpleContext(
}, },
review: { review: {
diffStyle: "split" as ReviewDiffStyle, diffStyle: "split" as ReviewDiffStyle,
panelOpened: true,
}, },
fileTree: { fileTree: {
opened: false, opened: false,
@ -662,7 +675,7 @@ export const { use: useLayout, provider: LayoutProvider } = createSimpleContext(
diffStyle: createMemo(() => store.review?.diffStyle ?? "split"), diffStyle: createMemo(() => store.review?.diffStyle ?? "split"),
setDiffStyle(diffStyle: ReviewDiffStyle) { setDiffStyle(diffStyle: ReviewDiffStyle) {
if (!store.review) { if (!store.review) {
setStore("review", { diffStyle, panelOpened: true }) setStore("review", { diffStyle })
return return
} }
setStore("review", "diffStyle", diffStyle) setStore("review", "diffStyle", diffStyle)
@ -777,7 +790,7 @@ export const { use: useLayout, provider: LayoutProvider } = createSimpleContext(
const key = createSessionKeyReader(sessionKey, ensureKey) const key = createSessionKeyReader(sessionKey, ensureKey)
const s = createMemo(() => store.sessionView[key()] ?? { scroll: {} }) const s = createMemo(() => store.sessionView[key()] ?? { scroll: {} })
const terminalOpened = createMemo(() => store.terminal?.opened ?? false) const terminalOpened = createMemo(() => store.terminal?.opened ?? false)
const reviewPanelOpened = createMemo(() => store.review?.panelOpened ?? true) const reviewPanelOpened = createMemo(() => s().reviewPanelOpened ?? true)
function setTerminalOpened(next: boolean) { function setTerminalOpened(next: boolean) {
const current = store.terminal const current = store.terminal
@ -792,15 +805,16 @@ export const { use: useLayout, provider: LayoutProvider } = createSimpleContext(
} }
function setReviewPanelOpened(next: boolean) { function setReviewPanelOpened(next: boolean) {
const current = store.review const session = key()
const current = store.sessionView[session]
if (!current) { if (!current) {
setStore("review", { diffStyle: "split" as ReviewDiffStyle, panelOpened: next }) setStore("sessionView", session, { scroll: {}, reviewPanelOpened: next })
return return
} }
const value = current.panelOpened ?? true const value = current.reviewPanelOpened ?? true
if (value === next) return if (value === next) return
setStore("review", "panelOpened", next) setStore("sessionView", session, "reviewPanelOpened", next)
} }
return { return {