@the-portland-company/shell 0.3.4 → 0.3.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.3.5 — 2026-05-14
4
+
5
+ ### Fixed
6
+
7
+ - `ShellModeValue.getModeConfig` is now optional. If omitted, shell auto-resolves the active mode config via `modes.find(m => m.id === currentMode)`. Defangs the common `this`-binding mistake where consumers wrote `getModeConfig() { return this.modes[0] }` and shell internals destructured the function (losing `this`) and crashed the chrome.
8
+ - All internal call sites (`<ModePill>`, `<UserMenu>`, `<NavItem>`) now use a defensive `resolveModeConfig(mode)` helper that try/catches the consumer-supplied function and falls back to derivation. A broken `getModeConfig` no longer blanks the page.
9
+
3
10
  ## 0.3.4 — 2026-05-14
4
11
 
5
12
  ### Fixed
package/dist/index.cjs CHANGED
@@ -1275,6 +1275,20 @@ function getUserDisplayName(user) {
1275
1275
  if (!user) return "User";
1276
1276
  return user.profile?.full_name || user.profile?.name || user.user_metadata?.full_name || user.user_metadata?.name || (typeof user.email === "string" ? user.email.split("@")[0] : "") || user.email || "User";
1277
1277
  }
1278
+
1279
+ // src/lib/resolveModeConfig.ts
1280
+ function resolveModeConfig(mode) {
1281
+ if (!mode) return null;
1282
+ const modes = mode.modes ?? [];
1283
+ if (typeof mode.getModeConfig === "function") {
1284
+ try {
1285
+ const result = mode.getModeConfig();
1286
+ if (result) return result;
1287
+ } catch {
1288
+ }
1289
+ }
1290
+ return modes.find((m) => m.id === mode.currentMode) ?? modes[0] ?? null;
1291
+ }
1278
1292
  function avatarUrlFromUser(user) {
1279
1293
  if (!user) return void 0;
1280
1294
  const meta = user.raw.user_metadata;
@@ -1299,7 +1313,7 @@ function UserMenu() {
1299
1313
  if (status !== "authenticated" || !user) return null;
1300
1314
  const displayName = getUserDisplayName(user.raw);
1301
1315
  const avatarUrl = userAvatarUrl ?? avatarUrlFromUser(user);
1302
- const modeConfig = mode?.getModeConfig() ?? null;
1316
+ const modeConfig = resolveModeConfig(mode);
1303
1317
  const currentOrg = org?.currentOrg ?? null;
1304
1318
  const linkedAccounts = linked?.linkedAccounts ?? [];
1305
1319
  const activeRoleConfig = role?.activeRoleConfig ?? null;
@@ -1587,7 +1601,7 @@ function NavItem({
1587
1601
  const navigate = reactRouterDom.useNavigate();
1588
1602
  const mode = useShellMode();
1589
1603
  const currentMode = mode?.currentMode ?? null;
1590
- const modeConfig = mode?.getModeConfig() ?? null;
1604
+ const modeConfig = resolveModeConfig(mode);
1591
1605
  const navPref = useShellNavigationPreference();
1592
1606
  const showSubMenu = navPref?.showSubMenu ?? true;
1593
1607
  const navHoverGradient = currentMode === MODE_CAMPAIGN ? "linear-gradient(90deg, #F2C94C 0%, #E63946 100%)" : currentMode === MODE_PETITION ? "linear-gradient(90deg, #F2C94C 0%, #007BFF 100%)" : "linear-gradient(90deg, #007BFF 0%, #E63946 100%)";
@@ -2134,8 +2148,8 @@ var OrgPill_default = OrgPill;
2134
2148
  function ModePill() {
2135
2149
  const mode = useShellMode();
2136
2150
  if (!mode) return null;
2137
- const { currentMode, modes, switchMode, getModeConfig } = mode;
2138
- const modeConfig = getModeConfig();
2151
+ const { currentMode, modes, switchMode } = mode;
2152
+ const modeConfig = resolveModeConfig(mode);
2139
2153
  if (!modeConfig) return null;
2140
2154
  const hasMultipleModes = modes.length > 1;
2141
2155
  const isDisabled = !hasMultipleModes;