@wix/himalaya-cli 0.1209.0 → 0.1210.0
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/dist/cli.mjs +22 -18
- package/dist/preview-assets.generated.bin +0 -0
- package/package.json +2 -2
- package/templates/beauty-salon-owner/dev/index.ts +18 -13
- package/templates/beauty-salon-owner/tier5-src/_shared/himi-text.ts +24 -0
- package/templates/beauty-salon-owner/tier5-src/_shared/owner-account.ts +4 -0
- package/templates/beauty-salon-owner/tier5-src/_shared/owner-selected-site.ts +103 -0
- package/templates/beauty-salon-owner/tier5-src/_shared/owner-site-pick.ts +74 -0
- package/templates/beauty-salon-owner/tier5-src/himi-owner-lite-account/index.ts +12 -2
- package/templates/beauty-salon-owner/tier5-src/himi-owner-lite-drawer/index.ts +21 -2
- package/templates/beauty-salon-owner/tier5-src/himi-owner-lite-home/index.ts +24 -1
- package/templates/beauty-salon-owner/tier5-src/himi-owner-lite-manage/index.ts +22 -4
- package/templates/beauty-salon-owner/tier5-src/himi-owner-lite-overview/index.ts +8 -0
- package/templates/beauty-salon-owner/tier5-src/himi-owner-lite-sites/index.ts +14 -31
- package/templates/community-club-owner/dev/index.ts +18 -13
- package/templates/community-club-owner/tier5-src/_shared/himi-text.ts +24 -0
- package/templates/community-club-owner/tier5-src/_shared/owner-account.ts +4 -0
- package/templates/community-club-owner/tier5-src/_shared/owner-selected-site.ts +103 -0
- package/templates/community-club-owner/tier5-src/_shared/owner-site-pick.ts +74 -0
- package/templates/community-club-owner/tier5-src/himi-owner-lite-account/index.ts +12 -2
- package/templates/community-club-owner/tier5-src/himi-owner-lite-drawer/index.ts +21 -2
- package/templates/community-club-owner/tier5-src/himi-owner-lite-home/index.ts +24 -1
- package/templates/community-club-owner/tier5-src/himi-owner-lite-manage/index.ts +22 -4
- package/templates/community-club-owner/tier5-src/himi-owner-lite-overview/index.ts +8 -0
- package/templates/community-club-owner/tier5-src/himi-owner-lite-sites/index.ts +14 -31
- package/templates/events-meetups-owner/dev/index.ts +18 -13
- package/templates/events-meetups-owner/tier5-src/_shared/himi-text.ts +24 -0
- package/templates/events-meetups-owner/tier5-src/_shared/owner-account.ts +4 -0
- package/templates/events-meetups-owner/tier5-src/_shared/owner-selected-site.ts +103 -0
- package/templates/events-meetups-owner/tier5-src/_shared/owner-site-pick.ts +74 -0
- package/templates/events-meetups-owner/tier5-src/himi-owner-lite-account/index.ts +12 -2
- package/templates/events-meetups-owner/tier5-src/himi-owner-lite-drawer/index.ts +21 -2
- package/templates/events-meetups-owner/tier5-src/himi-owner-lite-home/index.ts +24 -1
- package/templates/events-meetups-owner/tier5-src/himi-owner-lite-manage/index.ts +22 -4
- package/templates/events-meetups-owner/tier5-src/himi-owner-lite-overview/index.ts +8 -0
- package/templates/events-meetups-owner/tier5-src/himi-owner-lite-sites/index.ts +14 -31
- package/templates/gym-fitness-owner/dev/index.ts +18 -13
- package/templates/gym-fitness-owner/tier5-src/_shared/himi-text.ts +24 -0
- package/templates/gym-fitness-owner/tier5-src/_shared/owner-account.ts +4 -0
- package/templates/gym-fitness-owner/tier5-src/_shared/owner-selected-site.ts +103 -0
- package/templates/gym-fitness-owner/tier5-src/_shared/owner-site-pick.ts +74 -0
- package/templates/gym-fitness-owner/tier5-src/himi-owner-lite-account/index.ts +12 -2
- package/templates/gym-fitness-owner/tier5-src/himi-owner-lite-drawer/index.ts +21 -2
- package/templates/gym-fitness-owner/tier5-src/himi-owner-lite-home/index.ts +24 -1
- package/templates/gym-fitness-owner/tier5-src/himi-owner-lite-manage/index.ts +22 -4
- package/templates/gym-fitness-owner/tier5-src/himi-owner-lite-overview/index.ts +8 -0
- package/templates/gym-fitness-owner/tier5-src/himi-owner-lite-sites/index.ts +14 -31
- package/templates/nonprofit-cause-owner/dev/index.ts +18 -13
- package/templates/nonprofit-cause-owner/tier5-src/_shared/himi-text.ts +24 -0
- package/templates/nonprofit-cause-owner/tier5-src/_shared/owner-account.ts +4 -0
- package/templates/nonprofit-cause-owner/tier5-src/_shared/owner-selected-site.ts +103 -0
- package/templates/nonprofit-cause-owner/tier5-src/_shared/owner-site-pick.ts +74 -0
- package/templates/nonprofit-cause-owner/tier5-src/himi-owner-lite-account/index.ts +12 -2
- package/templates/nonprofit-cause-owner/tier5-src/himi-owner-lite-drawer/index.ts +21 -2
- package/templates/nonprofit-cause-owner/tier5-src/himi-owner-lite-home/index.ts +24 -1
- package/templates/nonprofit-cause-owner/tier5-src/himi-owner-lite-manage/index.ts +22 -4
- package/templates/nonprofit-cause-owner/tier5-src/himi-owner-lite-overview/index.ts +8 -0
- package/templates/nonprofit-cause-owner/tier5-src/himi-owner-lite-sites/index.ts +14 -31
- package/templates/owner-lite/dev/index.ts +19 -14
- package/templates/owner-lite/tier5-src/_shared/himi-text.ts +24 -0
- package/templates/owner-lite/tier5-src/_shared/owner-account.ts +4 -0
- package/templates/owner-lite/tier5-src/_shared/owner-selected-site.ts +103 -0
- package/templates/owner-lite/tier5-src/_shared/owner-site-pick.ts +74 -0
- package/templates/owner-lite/tier5-src/himi-owner-lite-account/index.ts +12 -2
- package/templates/owner-lite/tier5-src/himi-owner-lite-drawer/index.ts +21 -2
- package/templates/owner-lite/tier5-src/himi-owner-lite-home/index.ts +24 -1
- package/templates/owner-lite/tier5-src/himi-owner-lite-manage/index.ts +22 -4
- package/templates/owner-lite/tier5-src/himi-owner-lite-overview/index.ts +8 -0
- package/templates/owner-lite/tier5-src/himi-owner-lite-sites/index.ts +14 -31
- package/templates/podcast-creator-owner/dev/index.ts +18 -13
- package/templates/podcast-creator-owner/tier5-src/_shared/himi-text.ts +24 -0
- package/templates/podcast-creator-owner/tier5-src/_shared/owner-account.ts +4 -0
- package/templates/podcast-creator-owner/tier5-src/_shared/owner-selected-site.ts +103 -0
- package/templates/podcast-creator-owner/tier5-src/_shared/owner-site-pick.ts +74 -0
- package/templates/podcast-creator-owner/tier5-src/himi-owner-lite-account/index.ts +12 -2
- package/templates/podcast-creator-owner/tier5-src/himi-owner-lite-drawer/index.ts +21 -2
- package/templates/podcast-creator-owner/tier5-src/himi-owner-lite-home/index.ts +24 -1
- package/templates/podcast-creator-owner/tier5-src/himi-owner-lite-manage/index.ts +22 -4
- package/templates/podcast-creator-owner/tier5-src/himi-owner-lite-overview/index.ts +8 -0
- package/templates/podcast-creator-owner/tier5-src/himi-owner-lite-sites/index.ts +14 -31
- package/templates/portfolio-creative-owner/dev/index.ts +18 -13
- package/templates/portfolio-creative-owner/tier5-src/_shared/himi-text.ts +24 -0
- package/templates/portfolio-creative-owner/tier5-src/_shared/owner-account.ts +4 -0
- package/templates/portfolio-creative-owner/tier5-src/_shared/owner-selected-site.ts +103 -0
- package/templates/portfolio-creative-owner/tier5-src/_shared/owner-site-pick.ts +74 -0
- package/templates/portfolio-creative-owner/tier5-src/himi-owner-lite-account/index.ts +12 -2
- package/templates/portfolio-creative-owner/tier5-src/himi-owner-lite-drawer/index.ts +21 -2
- package/templates/portfolio-creative-owner/tier5-src/himi-owner-lite-home/index.ts +24 -1
- package/templates/portfolio-creative-owner/tier5-src/himi-owner-lite-manage/index.ts +22 -4
- package/templates/portfolio-creative-owner/tier5-src/himi-owner-lite-overview/index.ts +8 -0
- package/templates/portfolio-creative-owner/tier5-src/himi-owner-lite-sites/index.ts +14 -31
- package/templates/restaurant-owner/dev/index.ts +18 -13
- package/templates/restaurant-owner/tier5-src/_shared/himi-text.ts +24 -0
- package/templates/restaurant-owner/tier5-src/_shared/owner-account.ts +4 -0
- package/templates/restaurant-owner/tier5-src/_shared/owner-selected-site.ts +103 -0
- package/templates/restaurant-owner/tier5-src/_shared/owner-site-pick.ts +74 -0
- package/templates/restaurant-owner/tier5-src/himi-owner-lite-account/index.ts +12 -2
- package/templates/restaurant-owner/tier5-src/himi-owner-lite-drawer/index.ts +21 -2
- package/templates/restaurant-owner/tier5-src/himi-owner-lite-home/index.ts +24 -1
- package/templates/restaurant-owner/tier5-src/himi-owner-lite-manage/index.ts +22 -4
- package/templates/restaurant-owner/tier5-src/himi-owner-lite-overview/index.ts +8 -0
- package/templates/restaurant-owner/tier5-src/himi-owner-lite-sites/index.ts +14 -31
- package/templates/retail-store-owner/dev/index.ts +18 -13
- package/templates/retail-store-owner/tier5-src/_shared/himi-text.ts +24 -0
- package/templates/retail-store-owner/tier5-src/_shared/owner-account.ts +4 -0
- package/templates/retail-store-owner/tier5-src/_shared/owner-selected-site.ts +103 -0
- package/templates/retail-store-owner/tier5-src/_shared/owner-site-pick.ts +74 -0
- package/templates/retail-store-owner/tier5-src/himi-owner-lite-account/index.ts +12 -2
- package/templates/retail-store-owner/tier5-src/himi-owner-lite-drawer/index.ts +21 -2
- package/templates/retail-store-owner/tier5-src/himi-owner-lite-home/index.ts +24 -1
- package/templates/retail-store-owner/tier5-src/himi-owner-lite-manage/index.ts +22 -4
- package/templates/retail-store-owner/tier5-src/himi-owner-lite-overview/index.ts +8 -0
- package/templates/retail-store-owner/tier5-src/himi-owner-lite-sites/index.ts +14 -31
- package/templates/yoga-studio-owner/dev/index.ts +18 -13
- package/templates/yoga-studio-owner/tier5-src/_shared/himi-text.ts +24 -0
- package/templates/yoga-studio-owner/tier5-src/_shared/owner-account.ts +4 -0
- package/templates/yoga-studio-owner/tier5-src/_shared/owner-selected-site.ts +103 -0
- package/templates/yoga-studio-owner/tier5-src/_shared/owner-site-pick.ts +74 -0
- package/templates/yoga-studio-owner/tier5-src/himi-owner-lite-account/index.ts +12 -2
- package/templates/yoga-studio-owner/tier5-src/himi-owner-lite-drawer/index.ts +21 -2
- package/templates/yoga-studio-owner/tier5-src/himi-owner-lite-home/index.ts +24 -1
- package/templates/yoga-studio-owner/tier5-src/himi-owner-lite-manage/index.ts +22 -4
- package/templates/yoga-studio-owner/tier5-src/himi-owner-lite-overview/index.ts +8 -0
- package/templates/yoga-studio-owner/tier5-src/himi-owner-lite-sites/index.ts +14 -31
|
@@ -20,13 +20,23 @@
|
|
|
20
20
|
import { defineService } from "@himalaya/state";
|
|
21
21
|
import { serializeForAgent } from "@himalaya/agent";
|
|
22
22
|
import { activeScreenFromInput, attentionRow, navRow, withDerived, type DrawerState } from "./logic.js";
|
|
23
|
+
import { fallbackNameFrom, selectedSiteName } from "../_shared/owner-selected-site.js";
|
|
23
24
|
|
|
24
25
|
/** The shell passes the screen it is showing as worker input, so the drawer can mark
|
|
25
26
|
* that destination selected the way the declarative drawer does. */
|
|
26
27
|
const hostActiveScreen = () => activeScreenFromInput((globalThis as { himalaya?: { input?: unknown } }).himalaya?.input);
|
|
27
28
|
|
|
29
|
+
/** Cold-start name from the descriptor's onAppear params (provisioning identity). */
|
|
30
|
+
let fallbackBusinessName = "";
|
|
31
|
+
|
|
32
|
+
/** "Which site am I on": the business picked on Sites, else the fallback. */
|
|
33
|
+
const currentSiteName = () => selectedSiteName(fallbackBusinessName);
|
|
34
|
+
|
|
28
35
|
const drawer = defineService<DrawerState, {
|
|
29
|
-
/**
|
|
36
|
+
/** The panel opened (root onAppear): re-read the live site and the active screen.
|
|
37
|
+
* `arg.businessName` is the cold-start fallback for the site name. */
|
|
38
|
+
refresh: (s: DrawerState, arg?: unknown) => DrawerState;
|
|
39
|
+
/** Re-read the active screen from host input. An explicit
|
|
30
40
|
* `{ screenId }` wins, for a host that pushes the change instead. */
|
|
31
41
|
syncActive: (s: DrawerState, args?: { screenId?: string }) => DrawerState;
|
|
32
42
|
/** First tap on "Mark all handled": ask before hiding anything. */
|
|
@@ -37,7 +47,7 @@ const drawer = defineService<DrawerState, {
|
|
|
37
47
|
clearAttention: (s: DrawerState) => DrawerState;
|
|
38
48
|
}>("drawer", {
|
|
39
49
|
state: withDerived({
|
|
40
|
-
siteName:
|
|
50
|
+
siteName: currentSiteName(),
|
|
41
51
|
nav: [
|
|
42
52
|
navRow("drawer_home", "Home", "home", "himi_owner_lite_home"),
|
|
43
53
|
// Between Home and Manage deliberately: analytics answers "how is the
|
|
@@ -55,6 +65,15 @@ const drawer = defineService<DrawerState, {
|
|
|
55
65
|
activeScreenId: hostActiveScreen(),
|
|
56
66
|
}),
|
|
57
67
|
actions: {
|
|
68
|
+
refresh: (s, arg) => {
|
|
69
|
+
fallbackBusinessName = fallbackNameFrom(arg, fallbackBusinessName);
|
|
70
|
+
const screenId = (arg as { screenId?: unknown } | undefined)?.screenId;
|
|
71
|
+
return snap(withDerived({
|
|
72
|
+
...s,
|
|
73
|
+
siteName: currentSiteName(),
|
|
74
|
+
activeScreenId: typeof screenId === "string" ? screenId : hostActiveScreen(),
|
|
75
|
+
}));
|
|
76
|
+
},
|
|
58
77
|
syncActive: (s, args) => snap(withDerived({
|
|
59
78
|
...s,
|
|
60
79
|
activeScreenId: typeof args?.screenId === "string" ? args.screenId : hostActiveScreen(),
|
|
@@ -21,6 +21,8 @@ import { getSiteAnalytics, getSiteTimeZone, localDateRange, localDateOf, localMi
|
|
|
21
21
|
import { ownerDisplayError, isBridgeUnavailable, isOwnerPreviewDemo } from "../_shared/owner-load-error.js";
|
|
22
22
|
import { DEMO_DASHBOARD, DEMO_NOTE, DEMO_TODAY } from "../_shared/owner-preview-demo.js";
|
|
23
23
|
import { stashCopy, copyParam, copyTemplate } from "../_shared/himi-copy.js";
|
|
24
|
+
import { fallbackNameFrom, selectedSiteName } from "../_shared/owner-selected-site.js";
|
|
25
|
+
import { settleBusinessSwitch } from "../_shared/owner-site-pick.js";
|
|
24
26
|
import { formatCurrency } from "../_shared/engine-intl.js";
|
|
25
27
|
import {
|
|
26
28
|
attentionRecords,
|
|
@@ -51,6 +53,9 @@ interface SourceState {
|
|
|
51
53
|
}
|
|
52
54
|
|
|
53
55
|
interface HomeState {
|
|
56
|
+
/** The business the header names: the one picked on Sites, else the descriptor's
|
|
57
|
+
* build-time fallback. */
|
|
58
|
+
businessName: string;
|
|
54
59
|
attention: TodayRecord[];
|
|
55
60
|
schedule: TodayRecord[];
|
|
56
61
|
allSchedule: TodayRecord[];
|
|
@@ -101,11 +106,18 @@ const SOURCE_LABELS: Record<HomeSourceId, string> = {
|
|
|
101
106
|
reviews: "Reviews", reservations: "Reservations",
|
|
102
107
|
};
|
|
103
108
|
|
|
109
|
+
/** Cold-start name from the descriptor's onAppear params (provisioning identity). */
|
|
110
|
+
let fallbackBusinessName = "";
|
|
111
|
+
/** Resolved once per load, not per shape: a storage read is a host round-trip, and the
|
|
112
|
+
* picked business only changes between loads (the picker is another screen). */
|
|
113
|
+
let currentBusinessName = selectedSiteName("");
|
|
114
|
+
|
|
104
115
|
function shape(s: Partial<HomeState>): HomeState {
|
|
105
116
|
const status = s.status ?? "ready";
|
|
106
117
|
const isLoading = status === "loading";
|
|
107
118
|
return {
|
|
108
119
|
status,
|
|
120
|
+
businessName: currentBusinessName,
|
|
109
121
|
attention: s.attention ?? [],
|
|
110
122
|
schedule: s.schedule ?? [],
|
|
111
123
|
allSchedule: s.allSchedule ?? s.schedule ?? [],
|
|
@@ -834,8 +846,19 @@ const svc = defineService<HomeState, {
|
|
|
834
846
|
})) }),
|
|
835
847
|
actions: {
|
|
836
848
|
load: async (s, arg) => {
|
|
849
|
+
// FIRST, before anything reads the catalog: a business pick `replace`s onto
|
|
850
|
+
// Home, and the shell scopes the bridge to the picked business before it
|
|
851
|
+
// navigates, so this load is the first code that runs on the new site. A Stores
|
|
852
|
+
// catalog version persisted from the OLD site during that gap is dropped here.
|
|
853
|
+
settleBusinessSwitch();
|
|
837
854
|
stashCopy(arg);
|
|
838
|
-
|
|
855
|
+
fallbackBusinessName = fallbackNameFrom(arg, fallbackBusinessName);
|
|
856
|
+
// Re-read here: Home's root is not remounted when the owner switches business,
|
|
857
|
+
// and the picker records the selection from a different worker.
|
|
858
|
+
currentBusinessName = selectedSiteName(fallbackBusinessName);
|
|
859
|
+
// An argless re-load (the host refreshing a warm root after the owner switches
|
|
860
|
+
// business) keeps the sources the descriptor enabled rather than widening to all.
|
|
861
|
+
const sources = enabledSourcesFrom(arg) ?? activeSources;
|
|
839
862
|
return loadDashboard(shape({ ...s, status: "loading" }), sources);
|
|
840
863
|
},
|
|
841
864
|
retry: async (s) => loadDashboard(shape({ ...s, status: "loading" }), activeSources),
|
|
@@ -16,9 +16,13 @@ import { queryOwnerModule } from '../_shared/owner-module-data.js';
|
|
|
16
16
|
import { OWNER_MODULES, ownerModuleId } from '../_shared/owner-modules.js';
|
|
17
17
|
import { localPreferences } from '../_shared/local-preferences.js';
|
|
18
18
|
import { stashCopy, copyParam, copyTemplate } from '../_shared/himi-copy.js';
|
|
19
|
+
import { fallbackNameFrom, selectedSiteName } from '../_shared/owner-selected-site.js';
|
|
19
20
|
import { DASHBOARD_PATHS, deriveManage, parseAreas, recentAreas, rememberArea, withMetrics, type ManageArea, type Metric } from './logic.js';
|
|
20
21
|
|
|
21
22
|
interface State {
|
|
23
|
+
/** The business the header names: the one picked on Sites, else the descriptor's
|
|
24
|
+
* build-time fallback. */
|
|
25
|
+
businessName: string;
|
|
22
26
|
/** `loading` until the descriptor has delivered the areas, then
|
|
23
27
|
* `ready`. The descriptor keys a FragmentSlot on it whose DEFAULT case is the
|
|
24
28
|
* skeleton, so an unresolved path (worker not booted yet) is loading too —
|
|
@@ -178,6 +182,11 @@ async function metricFor(metricKey: string): Promise<Metric> {
|
|
|
178
182
|
}
|
|
179
183
|
}
|
|
180
184
|
|
|
185
|
+
/** Cold-start name from the descriptor's onAppear params (provisioning identity). */
|
|
186
|
+
let fallbackBusinessName = '';
|
|
187
|
+
/** Resolved per load/refresh, not per derive (a storage read is a host round-trip). */
|
|
188
|
+
let currentBusinessName = selectedSiteName('');
|
|
189
|
+
|
|
181
190
|
function derive(state: State, areas = state.areas): State {
|
|
182
191
|
const next = deriveManage(
|
|
183
192
|
areas,
|
|
@@ -191,7 +200,7 @@ function derive(state: State, areas = state.areas): State {
|
|
|
191
200
|
// areas arrive — or when this app provisions none at all — there is nothing a
|
|
192
201
|
// filter could have excluded, so "Clear filters" would be a lie.
|
|
193
202
|
const noEmpty = next.noEmpty || state.status !== 'ready' || areas.length === 0;
|
|
194
|
-
return { ...state, ...next, noEmpty, recents, hasRecents: recents.length > 0, noRecents: recents.length === 0 };
|
|
203
|
+
return { ...state, ...next, noEmpty, recents, hasRecents: recents.length > 0, noRecents: recents.length === 0, businessName: currentBusinessName };
|
|
195
204
|
}
|
|
196
205
|
|
|
197
206
|
// Loads are not serialized: on a warm reappearance the host's bare refresh and
|
|
@@ -261,6 +270,7 @@ const svc = defineService<State, {
|
|
|
261
270
|
handoff: (s: State, arg?: unknown) => Promise<State>;
|
|
262
271
|
}>('himiOwnerLiteManage', {
|
|
263
272
|
state: {
|
|
273
|
+
businessName: currentBusinessName,
|
|
264
274
|
status: 'loading',
|
|
265
275
|
areas: [], results: [], sections: [], recents: [], query: '', group: 'all',
|
|
266
276
|
// 'All' is always a valid filter, so the chip row paints from the first frame
|
|
@@ -271,6 +281,10 @@ const svc = defineService<State, {
|
|
|
271
281
|
actions: {
|
|
272
282
|
load: async (state, arg) => {
|
|
273
283
|
stashCopy(arg);
|
|
284
|
+
fallbackBusinessName = fallbackNameFrom(arg, fallbackBusinessName);
|
|
285
|
+
// Re-read on every load: this worker stays warm across tab switches, and the
|
|
286
|
+
// picker records the selection from another worker.
|
|
287
|
+
currentBusinessName = selectedSiteName(fallbackBusinessName);
|
|
274
288
|
// A `load` with no areas comes from the host, not the descriptor: the
|
|
275
289
|
// warm-worker refresh lifecycle calls it bare. Before the areas are known
|
|
276
290
|
// it must not settle (that derived "0 business areas" and painted the
|
|
@@ -278,7 +292,7 @@ const svc = defineService<State, {
|
|
|
278
292
|
if (!('areas' in read(arg))) {
|
|
279
293
|
return state.status === 'ready'
|
|
280
294
|
? loadMetrics(derive({ ...state, isLoading: true, notLoading: false, summaryNote: '', handoffError: '' }))
|
|
281
|
-
: state;
|
|
295
|
+
: { ...state, businessName: currentBusinessName };
|
|
282
296
|
}
|
|
283
297
|
const parsed = (() => { try { return JSON.parse(str(arg, 'areas') || '[]'); } catch { return []; } })();
|
|
284
298
|
const areas = parseAreas(parsed);
|
|
@@ -286,8 +300,12 @@ const svc = defineService<State, {
|
|
|
286
300
|
},
|
|
287
301
|
// Refresh re-reads summaries for KNOWN areas. Before the descriptor has
|
|
288
302
|
// delivered them there is nothing to refresh, and settling here would open
|
|
289
|
-
// the skeleton gate over an empty hub.
|
|
290
|
-
|
|
303
|
+
// the skeleton gate over an empty hub. The business name is a local read, so
|
|
304
|
+
// it is re-read either way.
|
|
305
|
+
refresh: async state => {
|
|
306
|
+
currentBusinessName = selectedSiteName(fallbackBusinessName);
|
|
307
|
+
return state.status !== 'ready' ? { ...state, businessName: currentBusinessName } : loadMetrics(derive({ ...state, isLoading: true, notLoading: false, summaryNote: '', handoffError: '' }));
|
|
308
|
+
},
|
|
291
309
|
search: (state, arg) => derive({ ...state, query: str(arg, 'value').slice(0, 256) }),
|
|
292
310
|
filter: (state, arg) => {
|
|
293
311
|
const ids = read(arg).selectedIds;
|
|
@@ -30,6 +30,7 @@ import { searchOrders } from "@himalaya/wix-ecom";
|
|
|
30
30
|
import { ownerLoadError, isBridgeUnavailable, isOwnerPreviewDemo } from "../_shared/owner-load-error.js";
|
|
31
31
|
import { DEMO_SITES, DEMO_NOTE } from "../_shared/owner-preview-demo.js";
|
|
32
32
|
import { stashCopy, copyParam } from "../_shared/himi-copy.js";
|
|
33
|
+
import { pickSite, pickedSite } from "../_shared/owner-site-pick.js";
|
|
33
34
|
|
|
34
35
|
/** Mirrors the Home dashboard's "needs attention" definition, so a number here means the
|
|
35
36
|
* same thing it means after the owner drills into that business. */
|
|
@@ -205,6 +206,7 @@ async function loadRollup(): Promise<OverviewState> {
|
|
|
205
206
|
const svc = defineService<OverviewState, {
|
|
206
207
|
load: (s: OverviewState, arg?: unknown) => Promise<OverviewState>;
|
|
207
208
|
retry: (s: OverviewState) => Promise<OverviewState>;
|
|
209
|
+
pick: (s: OverviewState, arg?: unknown) => OverviewState;
|
|
208
210
|
}>("himiOwnerLiteOverview", {
|
|
209
211
|
state: shape({ status: "loading" }),
|
|
210
212
|
actions: {
|
|
@@ -213,6 +215,12 @@ const svc = defineService<OverviewState, {
|
|
|
213
215
|
return loadRollup();
|
|
214
216
|
},
|
|
215
217
|
retry: async () => loadRollup(),
|
|
218
|
+
// Drilling into one business is the ONLY thing that moves the active business —
|
|
219
|
+
// the same switch the Sites list makes (scope, name it, reset to Home).
|
|
220
|
+
pick: (s, arg) => {
|
|
221
|
+
const { msid, name } = pickedSite(arg);
|
|
222
|
+
return pickSite(s, msid, name || s.rows.find((r) => r.id === msid)?.name || "");
|
|
223
|
+
},
|
|
216
224
|
},
|
|
217
225
|
});
|
|
218
226
|
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
// Tier-5 bundle: __HIMI_APP_NAME__ — Sites List (multi-site chooser).
|
|
2
2
|
// ACCOUNT-level: `site-list/v2/sites/query` authorizes on the owner wixSession2
|
|
3
3
|
// cookie alone (no per-site signed-instance), so this loads before any business
|
|
4
|
-
// is picked. Each row's `id` IS the site's metaSiteId — the
|
|
5
|
-
//
|
|
6
|
-
//
|
|
4
|
+
// is picked. Each row's `id` IS the site's metaSiteId — `pick` records the row's
|
|
5
|
+
// name for the chrome and hands the shell a `business`-carrying `replace` onto Home;
|
|
6
|
+
// the shell's Router scopes the Wix bridge to it (SiteInstanceStore mints that site's
|
|
7
|
+
// User signed-instance for the management verticals).
|
|
7
8
|
|
|
8
9
|
import { defineService } from "@himalaya/state";
|
|
9
10
|
import { querySites, type WixSite } from "@himalaya/wix-site-list";
|
|
10
|
-
import { site } from "@himalaya/wix-platform";
|
|
11
11
|
import { ownerLoadError, isBridgeUnavailable, isOwnerPreviewDemo } from "../_shared/owner-load-error.js";
|
|
12
12
|
import { DEMO_SITES, DEMO_NOTE } from "../_shared/owner-preview-demo.js";
|
|
13
13
|
import { stashCopy, copyParam } from "../_shared/himi-copy.js";
|
|
14
14
|
import { getAll, upsert, type DbEntity } from "../_shared/owner-local-db.js";
|
|
15
|
-
import {
|
|
15
|
+
import { pickSite, pickedSite } from "../_shared/owner-site-pick.js";
|
|
16
16
|
|
|
17
17
|
// Offline-first (data-offline): the owner's last-synced businesses are the
|
|
18
18
|
// READ-THROUGH cache for the `sites` entity — paint them instantly (works
|
|
@@ -139,17 +139,16 @@ async function loadList(s: SitesState): Promise<SitesState> {
|
|
|
139
139
|
}
|
|
140
140
|
}
|
|
141
141
|
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
: String((arg as { business?: string; id?: string })?.business ?? (arg as { id?: string })?.id ?? "");
|
|
142
|
+
/** The picked row's display name: the row passes it, else it is looked up in the list. */
|
|
143
|
+
function nameFor(s: SitesState, msid: string, passed: string): string {
|
|
144
|
+
return passed || s.allSites.find((r) => r.id === msid)?.name || "";
|
|
146
145
|
}
|
|
147
146
|
|
|
148
147
|
const svc = defineService<SitesState, {
|
|
149
148
|
load: (s: SitesState, arg?: unknown) => Promise<SitesState>;
|
|
150
149
|
retry: (s: SitesState) => Promise<SitesState>;
|
|
151
150
|
search: (s: SitesState, arg?: unknown) => Promise<SitesState>;
|
|
152
|
-
pick: (s: SitesState, arg?: unknown) =>
|
|
151
|
+
pick: (s: SitesState, arg?: unknown) => SitesState;
|
|
153
152
|
}>("himiOwnerLiteSites", {
|
|
154
153
|
state: shape({ status: "loading" }),
|
|
155
154
|
actions: {
|
|
@@ -158,27 +157,11 @@ const svc = defineService<SitesState, {
|
|
|
158
157
|
return loadList(shape({ ...s, status: "loading" }));
|
|
159
158
|
},
|
|
160
159
|
retry: async (s) => loadList(shape({ ...s, status: "loading" })),
|
|
161
|
-
//
|
|
162
|
-
//
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
const msid = msidFrom(arg);
|
|
167
|
-
if (msid) {
|
|
168
|
-
// Scoping the bridge to another business points it at another SITE, which may
|
|
169
|
-
// run the other Stores catalog. The resolved version is persisted app-wide and
|
|
170
|
-
// routes WRITES, which have no 428 retry — so it has to be dropped here, not
|
|
171
|
-
// just on the consumer-side site picker.
|
|
172
|
-
//
|
|
173
|
-
// Cleared on BOTH sides of the await: before, in case native remounts us
|
|
174
|
-
// before it settles; after, because a read interleaving it would re-resolve
|
|
175
|
-
// against the bridge that has not been re-scoped yet and re-persist the value
|
|
176
|
-
// we just dropped.
|
|
177
|
-
forgetCatalogVersion();
|
|
178
|
-
await site.setActiveSite(msid);
|
|
179
|
-
forgetCatalogVersion();
|
|
180
|
-
}
|
|
181
|
-
return s;
|
|
160
|
+
// Picking a business (every Sites row dispatches this): record its name for the
|
|
161
|
+
// chrome, then reset to the Home root; the shell scopes the bridge.
|
|
162
|
+
pick: (s, arg) => {
|
|
163
|
+
const { msid, name } = pickedSite(arg);
|
|
164
|
+
return pickSite(s, msid, nameFor(s, msid, name));
|
|
182
165
|
},
|
|
183
166
|
search: async (s, arg) => {
|
|
184
167
|
const q = typeof arg === "string" ? arg : String((arg as { value?: string; query?: string })?.value ?? (arg as { query?: string })?.query ?? "");
|