Files
2026-05-09 23:12:11 -06:00

83 lines
2.5 KiB
TypeScript

/**
* Central `/create/...` path builders (Linear CR-92 §2).
* Prefer these over string literals so layout, redirects, hooks, and tests stay aligned.
*/
import type { CreateFlowStep } from "../types";
import {
CREATE_FLOW_MANAGE_STAKEHOLDERS_QUERY,
CREATE_FLOW_REVIEW_RETURN_QUERY_KEY,
} from "./flowSteps";
export const CREATE_ROUTES = {
root: "/",
createRoot: "/create",
/** First step resolves via redirect from `/create`. */
createFirstStep: "/create",
review: "/create/review",
finalReview: "/create/final-review",
completed: "/create/completed",
editRule: "/create/edit-rule",
} as const;
/**
* Post-login return and session-gate paths on wizard steps.
* (Also used when `pathname` is unknown but `syncDraft` must be appended.)
*/
export const CREATE_FLOW_SYNC_DRAFT_QUERY = "syncDraft" as const;
export const CREATE_FLOW_SYNC_DRAFT_VALUE = "1" as const;
export function createFlowStepPathWithSyncDraft(step: CreateFlowStep): string {
return createFlowStepPath(step, {
[CREATE_FLOW_SYNC_DRAFT_QUERY]: CREATE_FLOW_SYNC_DRAFT_VALUE,
});
}
export type CreateFlowPathQuery = Record<
string,
string | number | boolean | undefined
>;
/**
* Path for a wizard step: `/create/{screenId}` with optional query string.
*/
export function createFlowStepPath(
step: CreateFlowStep,
query?: CreateFlowPathQuery,
): string {
const base = `/create/${step}`;
if (query == null || Object.keys(query).length === 0) return base;
const sp = new URLSearchParams();
for (const [k, v] of Object.entries(query)) {
if (v === undefined) continue;
sp.set(k, String(v));
}
const q = sp.toString();
return q.length > 0 ? `${base}?${q}` : base;
}
export function createCompletedPath(query?: CreateFlowPathQuery): string {
return createFlowStepPath("completed", query);
}
/**
* Navigate back from a facet step to final-review / edit-rule, dropping
* `reviewReturn` and `manageStakeholders` from the current query while preserving other params.
*/
export function createFlowStepPathAfterStrippingReviewReturn(
step: CreateFlowStep,
searchParams: URLSearchParams | null | undefined,
): string {
const params = new URLSearchParams(searchParams?.toString() ?? "");
params.delete(CREATE_FLOW_REVIEW_RETURN_QUERY_KEY);
params.delete(CREATE_FLOW_MANAGE_STAKEHOLDERS_QUERY);
const query: CreateFlowPathQuery = {};
params.forEach((value, key) => {
query[key] = value;
});
return createFlowStepPath(
step,
Object.keys(query).length > 0 ? query : undefined,
);
}