Skip to content

Commit 49939c4

Browse files
committed
feat(app): skeleton loader for sessions
1 parent 529eb6e commit 49939c4

1 file changed

Lines changed: 21 additions & 2 deletions

File tree

packages/app/src/pages/layout.tsx

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -885,7 +885,7 @@ export default function Layout(props: ParentProps) {
885885
return (
886886
<div
887887
data-session-id={props.session.id}
888-
class="group/session relative w-full rounded-md cursor-default transition-colors pl-2 pr-3
888+
class="group/session relative w-full rounded-md cursor-default transition-colors px-3
889889
hover:bg-surface-raised-base-hover focus-within:bg-surface-raised-base-hover has-[.active]:bg-surface-base-active"
890890
>
891891
<Tooltip placement={props.mobile ? "bottom" : "right"} value={props.session.title} gutter={16} openDelay={1000}>
@@ -902,7 +902,7 @@ export default function Layout(props: ParentProps) {
902902
>
903903
<Switch>
904904
<Match when={isWorking()}>
905-
<Spinner class="size-[15px] opacity-50" />
905+
<Spinner class="size-[15px]" />
906906
</Match>
907907
<Match when={hasPermissions()}>
908908
<div class="size-1.5 rounded-full bg-surface-warning-strong" />
@@ -944,6 +944,17 @@ export default function Layout(props: ParentProps) {
944944
)
945945
}
946946

947+
const SessionSkeleton = (props: { count?: number }): JSX.Element => {
948+
const items = Array.from({ length: props.count ?? 4 }, (_, index) => index)
949+
return (
950+
<div class="flex flex-col gap-1">
951+
<For each={items}>
952+
{() => <div class="h-8 w-full rounded-md bg-surface-raised-base opacity-60 animate-pulse" />}
953+
</For>
954+
</div>
955+
)
956+
}
957+
947958
const SortableProject = (props: { project: LocalProject; mobile?: boolean }): JSX.Element => {
948959
const sortable = createSortable(props.project.worktree)
949960
const selected = createMemo(() => {
@@ -1105,6 +1116,7 @@ export default function Layout(props: ParentProps) {
11051116
return `${kind} : ${name}`
11061117
})
11071118
const open = createMemo(() => store.workspaceExpanded[props.directory] ?? true)
1119+
const loading = createMemo(() => open() && workspaceStore.status !== "complete" && sessions().length === 0)
11081120
const hasMore = createMemo(() => local() && workspaceStore.sessionTotal > workspaceStore.session.length)
11091121
const loadMore = async () => {
11101122
if (!local()) return
@@ -1166,6 +1178,9 @@ export default function Layout(props: ParentProps) {
11661178
>
11671179
New session
11681180
</Button>
1181+
<Show when={loading()}>
1182+
<SessionSkeleton />
1183+
</Show>
11691184
<For each={sessions()}>
11701185
{(session) => <SessionItem session={session} slug={slug()} mobile={props.mobile} />}
11711186
</For>
@@ -1200,6 +1215,7 @@ export default function Layout(props: ParentProps) {
12001215
.filter((session) => !session.parentID)
12011216
.toSorted(sortSessions),
12021217
)
1218+
const loading = createMemo(() => workspaceStore.status !== "complete" && sessions().length === 0)
12031219
const hasMore = createMemo(() => workspaceStore.sessionTotal > workspaceStore.session.length)
12041220
const loadMore = async () => {
12051221
setWorkspaceStore("limit", (limit) => limit + 5)
@@ -1214,6 +1230,9 @@ export default function Layout(props: ParentProps) {
12141230
class="size-full flex flex-col py-2 overflow-y-auto no-scrollbar"
12151231
>
12161232
<nav class="flex flex-col gap-1 px-2">
1233+
<Show when={loading()}>
1234+
<SessionSkeleton />
1235+
</Show>
12171236
<For each={sessions()}>
12181237
{(session) => <SessionItem session={session} slug={slug()} mobile={props.mobile} />}
12191238
</For>

0 commit comments

Comments
 (0)