| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- /**
- * Light membership roles — Phase 4/5 preview.
- * Deep paid tiers + chain permissioning come later.
- */
- export type MemberRole =
- | "viewer"
- | "portal_member"
- | "wallet_member"
- | "operator";
- export type MembershipProfile = {
- primary: MemberRole;
- roles: MemberRole[];
- tierLabel: string;
- blurb: string;
- };
- const ROLE_META: Record<
- MemberRole,
- { label: string; can: string[] }
- > = {
- viewer: {
- label: "Viewer",
- can: ["Open explorer", "Read docs"],
- },
- portal_member: {
- label: "Portal member",
- can: ["Dashboard", "Save session", "Request access later"],
- },
- wallet_member: {
- label: "Wallet member",
- can: ["Show linked address", "Local anvil chain switch"],
- },
- operator: {
- label: "Operator",
- can: ["Machine keys (M2M)", "Worker APIs — later"],
- },
- };
- export function roleLabel(role: MemberRole): string {
- return ROLE_META[role].label;
- }
- export function roleCapabilities(role: MemberRole): string[] {
- return ROLE_META[role].can;
- }
- /**
- * Derive light roles from how the person signed in.
- * Not security-critical yet — UI honesty only.
- */
- export function membershipFor(input: {
- isSignedIn: boolean;
- source: "briven" | "demo" | "wallet" | "konnos" | null;
- walletAddress?: string | null;
- label?: string | null;
- }): MembershipProfile {
- if (!input.isSignedIn) {
- return {
- primary: "viewer",
- roles: ["viewer"],
- tierLabel: "Guest",
- blurb: "Sign in or connect a wallet for a personal dashboard.",
- };
- }
- const roles = new Set<MemberRole>(["viewer"]);
- if (input.source === "wallet" || input.walletAddress) {
- roles.add("wallet_member");
- }
- if (input.source === "briven" || input.source === "demo") {
- roles.add("portal_member");
- }
- // Placeholder: later map Briven project roles / M2M operator claims
- if (input.label?.toLowerCase().includes("operator")) {
- roles.add("operator");
- }
- const list = Array.from(roles);
- const primary: MemberRole = list.includes("operator")
- ? "operator"
- : list.includes("wallet_member") && !list.includes("portal_member")
- ? "wallet_member"
- : list.includes("portal_member")
- ? "portal_member"
- : "viewer";
- const tierLabel =
- primary === "operator"
- ? "Operator preview"
- : primary === "wallet_member"
- ? "Wallet member"
- : "Portal member";
- const blurb =
- primary === "wallet_member"
- ? "You connected a browser wallet. Full chain membership (validators, gated APIs) lands later."
- : primary === "operator"
- ? "Operator-style access is preview-only. M2M machine clients power background jobs."
- : "You have a portal session. Paid tiers and network membership roles come later.";
- return { primary, roles: list, tierLabel, blurb };
- }
|