Improve startup provider snapshots and dev harness
This commit is contained in:
@@ -1,5 +1,41 @@
|
||||
import type { WorkspaceDescriptor } from "@/stores/session-store";
|
||||
|
||||
export type WorkspaceHeaderCheckoutState =
|
||||
| { kind: "pending" }
|
||||
| { kind: "error" }
|
||||
| { kind: "ready"; checkout: { isGit: boolean; currentBranch: string | null } };
|
||||
|
||||
type WorkspaceHeaderRenderState =
|
||||
| { kind: "skeleton" }
|
||||
| {
|
||||
kind: "ready";
|
||||
title: string;
|
||||
subtitle: string;
|
||||
shouldShowSubtitle: boolean;
|
||||
isGitCheckout: boolean;
|
||||
currentBranchName: string | null;
|
||||
};
|
||||
|
||||
function trimNonEmpty(value: string | null | undefined): string | null {
|
||||
if (typeof value !== "string") {
|
||||
return null;
|
||||
}
|
||||
const trimmed = value.trim();
|
||||
return trimmed.length > 0 ? trimmed : null;
|
||||
}
|
||||
|
||||
function areHeaderLabelsEquivalent(
|
||||
a: string | null | undefined,
|
||||
b: string | null | undefined,
|
||||
): boolean {
|
||||
const normalizedA = trimNonEmpty(a)?.toLocaleLowerCase();
|
||||
const normalizedB = trimNonEmpty(b)?.toLocaleLowerCase();
|
||||
if (!normalizedA || !normalizedB) {
|
||||
return false;
|
||||
}
|
||||
return normalizedA === normalizedB;
|
||||
}
|
||||
|
||||
export function resolveWorkspaceHeader(input: { workspace: WorkspaceDescriptor }): {
|
||||
title: string;
|
||||
subtitle: string;
|
||||
@@ -10,6 +46,35 @@ export function resolveWorkspaceHeader(input: { workspace: WorkspaceDescriptor }
|
||||
};
|
||||
}
|
||||
|
||||
export function resolveWorkspaceHeaderRenderState(input: {
|
||||
workspace: WorkspaceDescriptor | null;
|
||||
checkoutState: WorkspaceHeaderCheckoutState;
|
||||
}): WorkspaceHeaderRenderState {
|
||||
if (!input.workspace) {
|
||||
return { kind: "skeleton" };
|
||||
}
|
||||
|
||||
if (input.checkoutState.kind === "pending" && input.workspace.projectKind === "git") {
|
||||
return { kind: "skeleton" };
|
||||
}
|
||||
|
||||
const header = resolveWorkspaceHeader({ workspace: input.workspace });
|
||||
const checkout = input.checkoutState.kind === "ready" ? input.checkoutState.checkout : null;
|
||||
const currentBranchName =
|
||||
checkout?.isGit && checkout.currentBranch !== "HEAD"
|
||||
? trimNonEmpty(checkout.currentBranch)
|
||||
: null;
|
||||
|
||||
return {
|
||||
kind: "ready",
|
||||
title: header.title,
|
||||
subtitle: header.subtitle,
|
||||
shouldShowSubtitle: !areHeaderLabelsEquivalent(header.title, header.subtitle),
|
||||
isGitCheckout: checkout?.isGit ?? false,
|
||||
currentBranchName,
|
||||
};
|
||||
}
|
||||
|
||||
export function shouldRenderMissingWorkspaceDescriptor(input: {
|
||||
workspace: WorkspaceDescriptor | null;
|
||||
hasHydratedWorkspaces: boolean;
|
||||
|
||||
Reference in New Issue
Block a user