From 091cf25de8d95f0eae460f92b9f9adebc3b0e634 Mon Sep 17 00:00:00 2001
From: David Hill <1879069+iamdavidhill@users.noreply.github.com>
Date: Fri, 6 Mar 2026 21:39:31 +0000
Subject: fix(app): better review/filetree empty states (#16221)
Co-authored-by: Adam <2363879+adamdotdevin@users.noreply.github.com>
---
.../app/src/pages/session/session-side-panel.tsx | 68 ++++++++++------------
1 file changed, 31 insertions(+), 37 deletions(-)
(limited to 'packages/app/src/pages/session')
diff --git a/packages/app/src/pages/session/session-side-panel.tsx b/packages/app/src/pages/session/session-side-panel.tsx
index ad802d15d..66d4382c0 100644
--- a/packages/app/src/pages/session/session-side-panel.tsx
+++ b/packages/app/src/pages/session/session-side-panel.tsx
@@ -87,6 +87,21 @@ export function SessionSidePanel(props: {
return out
})
+ const empty = (msg: string) => (
+
+ )
+
+ const nofiles = createMemo(() => {
+ const state = file.tree.state("")
+ if (!state?.loaded) return false
+ return file.tree.children("").length === 0
+ })
+
const normalizeTab = (tab: string) => {
if (!tab.startsWith("file://")) return tab
return file.tab(tab)
@@ -145,17 +160,8 @@ export function SessionSidePanel(props: {
const [store, setStore] = createStore({
activeDraggable: undefined as string | undefined,
- fileTreeScrolled: false,
})
- let changesEl: HTMLDivElement | undefined
- let allEl: HTMLDivElement | undefined
-
- const syncFileTreeScrolled = (el?: HTMLDivElement) => {
- const next = (el?.scrollTop ?? 0) > 0
- setStore("fileTreeScrolled", (current) => (current === next ? current : next))
- }
-
const handleDragStart = (event: unknown) => {
const id = getDraggableId(event)
if (!id) return
@@ -176,11 +182,6 @@ export function SessionSidePanel(props: {
setStore("activeDraggable", undefined)
}
- createEffect(() => {
- if (!layout.fileTree.opened()) return
- syncFileTreeScrolled(fileTreeTab() === "changes" ? changesEl : allEl)
- })
-
createEffect(() => {
if (!file.ready()) return
@@ -354,7 +355,7 @@ export function SessionSidePanel(props: {
class="h-full"
data-scope="filetree"
>
-
+
{reviewCount()}{" "}
{language.t(reviewCount() === 1 ? "session.review.change.one" : "session.review.change.other")}
@@ -363,12 +364,7 @@ export function SessionSidePanel(props: {
{language.t("session.files.all")}
- (changesEl = el)}
- onScroll={(e: UIEvent & { currentTarget: HTMLDivElement }) => syncFileTreeScrolled(e.currentTarget)}
- class="bg-background-stronger px-3 py-0"
- >
+
+ {empty(language.t("session.review.noChanges"))}
+
+
+
+
+ {empty(language.t("session.files.empty"))}
-
- {language.t("session.review.noChanges")}
-
+ openTab(file.tab(node.path))}
+ />
- (allEl = el)}
- onScroll={(e: UIEvent & { currentTarget: HTMLDivElement }) => syncFileTreeScrolled(e.currentTarget)}
- class="bg-background-stronger px-3 py-0"
- >
- openTab(file.tab(node.path))}
- />
-