Walk Create Community through the Figma screens and restore a chosen logo after reload, so a guest can leave without saving until they reach the email step.
This commit is contained in:
1 parent
ca1f58a50c
commit
2348a9e94f
61 files changed
+1110
-421
No files matched your search
@@ -23,12 +23,34 @@ const DEFAULT_FOOTER_LABEL_BY_STEP: ReadonlyMap<
|
||||
["community-size", "confirmSize"],
|
||||
]);
|
||||
|
||||
function hasNonEmptyId(ids: readonly string[] | undefined): boolean {
|
||||
return (ids ?? []).some((id) => id.length > 0);
|
||||
}
|
||||
|
||||
export function isCommunityNameStepBlocked(
|
||||
step: CreateFlowStep | null | undefined,
|
||||
title: string | undefined,
|
||||
): boolean {
|
||||
if (step !== "community-name") return false;
|
||||
return typeof title !== "string" || title.trim().length === 0;
|
||||
}
|
||||
|
||||
export function isCommunityStructureStepBlocked(
|
||||
step: CreateFlowStep | null | undefined,
|
||||
selectedOrganizationTypeIds: readonly string[] | undefined,
|
||||
selectedMaturityIds: readonly string[] | undefined,
|
||||
): boolean {
|
||||
if (step !== "community-structure") return false;
|
||||
const mainKind = (selectedOrganizationTypeIds ?? []).find((id) => id.length > 0);
|
||||
return !mainKind || !hasNonEmptyId(selectedMaturityIds);
|
||||
}
|
||||
|
||||
export function isCommunitySizeStepBlocked(
|
||||
step: CreateFlowStep | null | undefined,
|
||||
selectedCommunitySizeIds: readonly string[] | undefined,
|
||||
): boolean {
|
||||
if (step !== "community-size") return false;
|
||||
return !(selectedCommunitySizeIds ?? []).some((id) => id.length > 0);
|
||||
return !hasNonEmptyId(selectedCommunitySizeIds);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -12,10 +12,10 @@ const PROPORTION_BY_STEP_INDEX: readonly ProportionBarState[] = [
|
||||
"1-2", // community-structure
|
||||
"1-3", // community-context
|
||||
"1-4", // community-size
|
||||
"1-5", // community-upload
|
||||
"2-0", // community-save
|
||||
"2-0", // review (Figma Flow — Review `19706:12135`: same segment fill as end of Create Community)
|
||||
"2-0", // core-values (same segment as review / end of Create Community)
|
||||
"1-6", // community-upload (1-5 is reserved for setup questions)
|
||||
"1-7", // community-save
|
||||
"1-8", // review
|
||||
"2-0", // core-values (same fill as 1-8)
|
||||
"2-1", // communication-methods (Figma — Compact Card Stack)
|
||||
"2-2", // membership-methods (Figma — Compact Card Stack `20858:13947`)
|
||||
"2-3", // decision-approaches (Figma Flow — Right Rail `20523:23509`)
|
||||
|
||||
@@ -41,7 +41,7 @@ export const CREATE_FLOW_SCREEN_REGISTRY: Record<
|
||||
/** Figma: Flow — Informational (node 20094-16005). */
|
||||
informational: {
|
||||
layoutKind: "informational",
|
||||
figmaNodeId: "20094-16005",
|
||||
figmaNodeId: "25224-105191",
|
||||
messageNamespace: "create.community.informational",
|
||||
centeredBodyBelowMd: false,
|
||||
},
|
||||
@@ -59,13 +59,13 @@ export const CREATE_FLOW_SCREEN_REGISTRY: Record<
|
||||
},
|
||||
"community-context": {
|
||||
layoutKind: "text",
|
||||
figmaNodeId: "20094-41243",
|
||||
figmaNodeId: "25224-106030",
|
||||
messageNamespace: "create.community.communityContext",
|
||||
centeredBodyBelowMd: true,
|
||||
},
|
||||
"community-structure": {
|
||||
layoutKind: "select",
|
||||
figmaNodeId: "20094-18244",
|
||||
figmaNodeId: "25224-105767",
|
||||
messageNamespace: "create.community.communityStructure",
|
||||
centeredBodyBelowMd: false,
|
||||
},
|
||||
|
||||
@@ -172,13 +172,13 @@ export function getStepIndex(step: CreateFlowStep | null | undefined): number {
|
||||
return FLOW_STEP_ORDER.indexOf(step);
|
||||
}
|
||||
|
||||
/** First wizard step that offers Save & Exit (first Create Community select). */
|
||||
const SAVE_EXIT_FROM_STEP_INDEX = getStepIndex("community-structure");
|
||||
/** First wizard step that offers Save and exit (after the community is ready to keep). */
|
||||
const SAVE_EXIT_FROM_STEP_INDEX = getStepIndex("community-save");
|
||||
|
||||
/**
|
||||
* Top-nav Save & Exit (vs Exit). Guests and signed-in users share this from
|
||||
* `community-structure` onward and on `edit-rule`. On completed, guests still
|
||||
* get Save & Exit (claim/login); signed-in users get Exit (already owned).
|
||||
* Top-nav Save and exit (vs Exit). Guests and signed-in users share this from
|
||||
* `community-save` onward and on `edit-rule`. On completed, guests still
|
||||
* get Save and exit (claim/login); signed-in users get Exit (already owned).
|
||||
*
|
||||
* @param sessionUser `null` is a guest. `undefined` (session in flight) is
|
||||
* not a guest — completed stays Exit until the session resolves.
|
||||
@@ -307,14 +307,19 @@ export const CREATE_FLOW_REVIEW_RETURN_QUERY_KEY = "reviewReturn" as const;
|
||||
export const CREATE_FLOW_MANAGE_STAKEHOLDERS_QUERY = "manageStakeholders" as const;
|
||||
export const CREATE_FLOW_MANAGE_STAKEHOLDERS_VALUE = "1" as const;
|
||||
|
||||
export type CreateFlowReviewReturnTarget = "final-review" | "edit-rule";
|
||||
export type CreateFlowReviewReturnTarget =
|
||||
| "final-review"
|
||||
| "edit-rule"
|
||||
| "review";
|
||||
|
||||
export function parseReviewReturnSearchParam(
|
||||
searchParams: { get: (name: string) => string | null } | null | undefined,
|
||||
): CreateFlowReviewReturnTarget | null {
|
||||
if (!searchParams) return null;
|
||||
const raw = searchParams.get(CREATE_FLOW_REVIEW_RETURN_QUERY_KEY);
|
||||
if (raw === "final-review" || raw === "edit-rule") return raw;
|
||||
if (raw === "final-review" || raw === "edit-rule" || raw === "review") {
|
||||
return raw;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user