@wix/himalaya-cli 0.1030.0 → 0.1032.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/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/dev-server/src/app-config.d.ts +7 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/dev-server/src/wix-gateway.d.ts +32 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/dev-server/src/wix-gateway.rules.d.ts +2 -1
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/ts/src/define-app.d.ts +7 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/genie-chat/src/index.d.ts +64 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/wix-genie-chat.mjs +41 -1
- package/dist/cli.mjs +386 -132
- package/dist/preview-assets.generated.bin +0 -0
- package/guides/mobile-ux.md +3 -2
- package/guides/qa-builds.md +22 -13
- package/guides/sdk-reference.json +50 -2
- package/package.json +2 -2
- package/templates/beauty-salon/tier5-src/_shared/owner-load-error.ts +7 -1
- package/templates/beauty-salon-owner/config.ts +1 -1
- package/templates/beauty-salon-owner/dev/index.ts +247 -9
- package/templates/beauty-salon-owner/tier5-src/_shared/aria-attachments.ts +179 -0
- package/templates/beauty-salon-owner/tier5-src/_shared/aria-chat.ts +405 -20
- package/templates/beauty-salon-owner/tier5-src/_shared/owner-bookings.ts +20 -0
- package/templates/beauty-salon-owner/tier5-src/_shared/owner-load-error.ts +7 -1
- package/templates/beauty-salon-owner/tier5-src/himi-owner-lite-aria/index.ts +40 -1
- package/templates/beauty-salon-owner/tier5-src/himi-owner-lite-home/index.ts +2 -12
- package/templates/beauty-salon-owner/tier5-src/himi-owner-lite-manage/index.ts +10 -4
- package/templates/branded-lite/tier5-src/_shared/owner-load-error.ts +7 -1
- package/templates/community-club/tier5-src/_shared/owner-load-error.ts +7 -1
- package/templates/community-club-owner/config.ts +1 -1
- package/templates/community-club-owner/dev/index.ts +247 -9
- package/templates/community-club-owner/tier5-src/_shared/aria-attachments.ts +179 -0
- package/templates/community-club-owner/tier5-src/_shared/aria-chat.ts +405 -20
- package/templates/community-club-owner/tier5-src/_shared/owner-bookings.ts +20 -0
- package/templates/community-club-owner/tier5-src/_shared/owner-load-error.ts +7 -1
- package/templates/community-club-owner/tier5-src/himi-owner-lite-aria/index.ts +40 -1
- package/templates/community-club-owner/tier5-src/himi-owner-lite-home/index.ts +2 -12
- package/templates/community-club-owner/tier5-src/himi-owner-lite-manage/index.ts +10 -4
- package/templates/events-meetups/tier5-src/_shared/owner-load-error.ts +7 -1
- package/templates/events-meetups-owner/config.ts +1 -1
- package/templates/events-meetups-owner/dev/index.ts +247 -9
- package/templates/events-meetups-owner/tier5-src/_shared/aria-attachments.ts +179 -0
- package/templates/events-meetups-owner/tier5-src/_shared/aria-chat.ts +405 -20
- package/templates/events-meetups-owner/tier5-src/_shared/owner-bookings.ts +20 -0
- package/templates/events-meetups-owner/tier5-src/_shared/owner-load-error.ts +7 -1
- package/templates/events-meetups-owner/tier5-src/himi-owner-lite-aria/index.ts +40 -1
- package/templates/events-meetups-owner/tier5-src/himi-owner-lite-home/index.ts +2 -12
- package/templates/events-meetups-owner/tier5-src/himi-owner-lite-manage/index.ts +10 -4
- package/templates/gym-fitness/tier5-src/_shared/owner-load-error.ts +7 -1
- package/templates/gym-fitness-owner/config.ts +1 -1
- package/templates/gym-fitness-owner/dev/index.ts +247 -9
- package/templates/gym-fitness-owner/tier5-src/_shared/aria-attachments.ts +179 -0
- package/templates/gym-fitness-owner/tier5-src/_shared/aria-chat.ts +405 -20
- package/templates/gym-fitness-owner/tier5-src/_shared/owner-bookings.ts +20 -0
- package/templates/gym-fitness-owner/tier5-src/_shared/owner-load-error.ts +7 -1
- package/templates/gym-fitness-owner/tier5-src/himi-owner-lite-aria/index.ts +40 -1
- package/templates/gym-fitness-owner/tier5-src/himi-owner-lite-home/index.ts +2 -12
- package/templates/gym-fitness-owner/tier5-src/himi-owner-lite-manage/index.ts +10 -4
- package/templates/himi-chat/tier5-src/_shared/owner-load-error.ts +7 -1
- package/templates/nonprofit-cause/tier5-src/_shared/owner-load-error.ts +7 -1
- package/templates/nonprofit-cause-owner/config.ts +1 -1
- package/templates/nonprofit-cause-owner/dev/index.ts +247 -9
- package/templates/nonprofit-cause-owner/tier5-src/_shared/aria-attachments.ts +179 -0
- package/templates/nonprofit-cause-owner/tier5-src/_shared/aria-chat.ts +405 -20
- package/templates/nonprofit-cause-owner/tier5-src/_shared/owner-bookings.ts +20 -0
- package/templates/nonprofit-cause-owner/tier5-src/_shared/owner-load-error.ts +7 -1
- package/templates/nonprofit-cause-owner/tier5-src/himi-owner-lite-aria/index.ts +40 -1
- package/templates/nonprofit-cause-owner/tier5-src/himi-owner-lite-home/index.ts +2 -12
- package/templates/nonprofit-cause-owner/tier5-src/himi-owner-lite-manage/index.ts +10 -4
- package/templates/owner-lite/config.ts +1 -1
- package/templates/owner-lite/dev/index.ts +247 -9
- package/templates/owner-lite/tier5-src/_shared/aria-attachments.ts +179 -0
- package/templates/owner-lite/tier5-src/_shared/aria-chat.ts +405 -20
- package/templates/owner-lite/tier5-src/_shared/owner-bookings.ts +20 -0
- package/templates/owner-lite/tier5-src/_shared/owner-load-error.ts +7 -1
- package/templates/owner-lite/tier5-src/himi-owner-lite-aria/index.ts +40 -1
- package/templates/owner-lite/tier5-src/himi-owner-lite-home/index.ts +2 -12
- package/templates/owner-lite/tier5-src/himi-owner-lite-manage/index.ts +10 -4
- package/templates/podcast-creator/tier5-src/_shared/owner-load-error.ts +7 -1
- package/templates/podcast-creator-owner/config.ts +1 -1
- package/templates/podcast-creator-owner/dev/index.ts +247 -9
- package/templates/podcast-creator-owner/tier5-src/_shared/aria-attachments.ts +179 -0
- package/templates/podcast-creator-owner/tier5-src/_shared/aria-chat.ts +405 -20
- package/templates/podcast-creator-owner/tier5-src/_shared/owner-bookings.ts +20 -0
- package/templates/podcast-creator-owner/tier5-src/_shared/owner-load-error.ts +7 -1
- package/templates/podcast-creator-owner/tier5-src/himi-owner-lite-aria/index.ts +40 -1
- package/templates/podcast-creator-owner/tier5-src/himi-owner-lite-home/index.ts +2 -12
- package/templates/podcast-creator-owner/tier5-src/himi-owner-lite-manage/index.ts +10 -4
- package/templates/portfolio-creative/tier5-src/_shared/owner-load-error.ts +7 -1
- package/templates/portfolio-creative-owner/config.ts +1 -1
- package/templates/portfolio-creative-owner/dev/index.ts +247 -9
- package/templates/portfolio-creative-owner/tier5-src/_shared/aria-attachments.ts +179 -0
- package/templates/portfolio-creative-owner/tier5-src/_shared/aria-chat.ts +405 -20
- package/templates/portfolio-creative-owner/tier5-src/_shared/owner-bookings.ts +20 -0
- package/templates/portfolio-creative-owner/tier5-src/_shared/owner-load-error.ts +7 -1
- package/templates/portfolio-creative-owner/tier5-src/himi-owner-lite-aria/index.ts +40 -1
- package/templates/portfolio-creative-owner/tier5-src/himi-owner-lite-home/index.ts +2 -12
- package/templates/portfolio-creative-owner/tier5-src/himi-owner-lite-manage/index.ts +10 -4
- package/templates/restaurant/tier5-src/_shared/owner-load-error.ts +7 -1
- package/templates/restaurant-owner/config.ts +1 -1
- package/templates/restaurant-owner/dev/index.ts +247 -9
- package/templates/restaurant-owner/tier5-src/_shared/aria-attachments.ts +179 -0
- package/templates/restaurant-owner/tier5-src/_shared/aria-chat.ts +405 -20
- package/templates/restaurant-owner/tier5-src/_shared/owner-bookings.ts +20 -0
- package/templates/restaurant-owner/tier5-src/_shared/owner-load-error.ts +7 -1
- package/templates/restaurant-owner/tier5-src/himi-owner-lite-aria/index.ts +40 -1
- package/templates/restaurant-owner/tier5-src/himi-owner-lite-home/index.ts +2 -12
- package/templates/restaurant-owner/tier5-src/himi-owner-lite-manage/index.ts +10 -4
- package/templates/retail-store/tier5-src/_shared/owner-load-error.ts +7 -1
- package/templates/retail-store-owner/config.ts +1 -1
- package/templates/retail-store-owner/dev/index.ts +247 -9
- package/templates/retail-store-owner/tier5-src/_shared/aria-attachments.ts +179 -0
- package/templates/retail-store-owner/tier5-src/_shared/aria-chat.ts +405 -20
- package/templates/retail-store-owner/tier5-src/_shared/owner-bookings.ts +20 -0
- package/templates/retail-store-owner/tier5-src/_shared/owner-load-error.ts +7 -1
- package/templates/retail-store-owner/tier5-src/himi-owner-lite-aria/index.ts +40 -1
- package/templates/retail-store-owner/tier5-src/himi-owner-lite-home/index.ts +2 -12
- package/templates/retail-store-owner/tier5-src/himi-owner-lite-manage/index.ts +10 -4
- package/templates/surface-showcase/dev/index.ts +1 -1
- package/templates/yoga-studio/tier5-src/_shared/owner-load-error.ts +7 -1
- package/templates/yoga-studio-owner/config.ts +1 -1
- package/templates/yoga-studio-owner/dev/index.ts +247 -9
- package/templates/yoga-studio-owner/tier5-src/_shared/aria-attachments.ts +179 -0
- package/templates/yoga-studio-owner/tier5-src/_shared/aria-chat.ts +405 -20
- package/templates/yoga-studio-owner/tier5-src/_shared/owner-bookings.ts +20 -0
- package/templates/yoga-studio-owner/tier5-src/_shared/owner-load-error.ts +7 -1
- package/templates/yoga-studio-owner/tier5-src/himi-owner-lite-aria/index.ts +40 -1
- package/templates/yoga-studio-owner/tier5-src/himi-owner-lite-home/index.ts +2 -12
- package/templates/yoga-studio-owner/tier5-src/himi-owner-lite-manage/index.ts +10 -4
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { WixBooking } from "@himalaya/wix-bookings";
|
|
2
|
+
|
|
3
|
+
/** The booking statuses an owner still has to show up for. ONE list for every surface that
|
|
4
|
+
* says "upcoming appointments" — Home's KPI and Manage's Appointments summary used to ask
|
|
5
|
+
* the server two different questions (`$in` these vs `$nin` CANCELED/DECLINED) and Manage
|
|
6
|
+
* then trusted whatever came back, so the two screens could disagree on the same business
|
|
7
|
+
* (Home 9, Manage 11 on the same hermetic fixtures). */
|
|
8
|
+
export const UPCOMING_BOOKING_STATUSES = ["CONFIRMED", "PENDING", "PENDING_APPROVAL", "WAITING_LIST", "CREATED"];
|
|
9
|
+
|
|
10
|
+
/** Count the loaded bookings that are still upcoming. Applied to the response even though
|
|
11
|
+
* the query already filters: a server (or a fixture) that returns a cancelled or past row
|
|
12
|
+
* must not turn it into an appointment the owner is told to expect. */
|
|
13
|
+
export function upcomingBookingCount(bookings: WixBooking[], now: number): number {
|
|
14
|
+
return bookings.filter((booking) => {
|
|
15
|
+
if (!UPCOMING_BOOKING_STATUSES.includes((booking.status ?? "").toUpperCase())) return false;
|
|
16
|
+
const start = booking.startDate || booking.bookedEntity?.slot?.startDate;
|
|
17
|
+
const ms = start ? new Date(start).getTime() : NaN;
|
|
18
|
+
return Number.isFinite(ms) && ms >= now;
|
|
19
|
+
}).length;
|
|
20
|
+
}
|
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
import { copyParam } from "./himi-copy.js";
|
|
2
2
|
|
|
3
|
-
/** Host-owned preview input. Absent on native and older hosts.
|
|
3
|
+
/** Host-owned preview input. Absent on native and older hosts.
|
|
4
|
+
*
|
|
5
|
+
* `"sample"` — the built-in demo records; `"live"` — the viewer's own business over the
|
|
6
|
+
* owner rung; `"fixtures"` — a DEV web host over a sealed hermetic gateway, where
|
|
7
|
+
* the dev fixtures are the sample data. `"fixtures"` is neither live nor demo, so a
|
|
8
|
+
* worker READS through the bridge as it does on a device; it is still a preview host
|
|
9
|
+
* (`isOwnerPreviewHost`), so failure copy may name the web preview. */
|
|
4
10
|
function ownerPreviewMode(): unknown {
|
|
5
11
|
return (globalThis as unknown as { himalaya?: { input?: Record<string, unknown> } }).himalaya?.input?.__himiOwnerPreview;
|
|
6
12
|
}
|
|
@@ -27,6 +27,8 @@
|
|
|
27
27
|
import { defineService } from "@himalaya/state";
|
|
28
28
|
import { open } from "@himalaya/open-url";
|
|
29
29
|
import { writeText } from "@himalaya/clipboard";
|
|
30
|
+
import { capturePhoto } from "@himalaya/camera";
|
|
31
|
+
import { put } from "@himalaya/presigned-upload";
|
|
30
32
|
import { alert } from "@himalaya/ui";
|
|
31
33
|
import {
|
|
32
34
|
activeSiteId,
|
|
@@ -36,7 +38,7 @@ import {
|
|
|
36
38
|
type AriaPromptChip,
|
|
37
39
|
} from "../_shared/aria-chat.js";
|
|
38
40
|
import { WIDGET_SUBTREE_SLOT } from "../_shared/aria-generic-widget.js";
|
|
39
|
-
import { copyParam, stashCopy } from "../_shared/himi-copy.js";
|
|
41
|
+
import { copyParam, copyTemplate, stashCopy } from "../_shared/himi-copy.js";
|
|
40
42
|
import { OWNER_MODULES, ownerModuleIds, ownerModuleScreen } from "../_shared/owner-modules.js";
|
|
41
43
|
|
|
42
44
|
const SERVICE = "himiOwnerLiteAria";
|
|
@@ -199,6 +201,14 @@ const core = createAriaChat({
|
|
|
199
201
|
// English. Says no "sign in": the owner already is, and the missing piece is
|
|
200
202
|
// the app's binding, so there is no action for them to take.
|
|
201
203
|
unavailable: () => copyParam("ownerAria.unavailable", "Aria can't reach your Wix account from here."),
|
|
204
|
+
attachUploading: () => copyParam("ownerAria.attach.uploading", "Uploading…"),
|
|
205
|
+
attachFailed: () => copyParam("ownerAria.attach.failed", "Couldn't upload"),
|
|
206
|
+
attachTooMany: (max) => copyTemplate("ownerAria.attach.tooMany", "You can attach up to {max} photos.", { max }),
|
|
207
|
+
attachUnsupported: () => copyParam("ownerAria.attach.unsupported", "That file type can't be attached."),
|
|
208
|
+
attachTooLarge: (mb) => copyTemplate("ownerAria.attach.tooLarge", "That photo is too large to attach (up to {mb} MB).", { mb }),
|
|
209
|
+
attachWaitUploading: () => copyParam("ownerAria.attach.waitUploading", "Wait for your photo to finish uploading."),
|
|
210
|
+
attachWaitFailed: () => copyParam("ownerAria.attach.waitFailed", "Retry or remove the photo that didn't upload."),
|
|
211
|
+
attachNeedsText: () => copyParam("ownerAria.attach.needsText", "Add a message to send with your photo."),
|
|
202
212
|
toolFailed: () => copyParam("ownerAria.toolFailed", "Aria couldn't finish that. Try again."),
|
|
203
213
|
},
|
|
204
214
|
clientTools: { confirm: confirmWithOwner, userAgent },
|
|
@@ -221,6 +231,25 @@ const core = createAriaChat({
|
|
|
221
231
|
return screenId ? { screenId } : null;
|
|
222
232
|
},
|
|
223
233
|
poll: { action: `${SERVICE}.tick`, fastMs: FAST_MS, idleMs: IDLE_MS },
|
|
234
|
+
// Photo attachments. The two device capabilities live HERE rather than
|
|
235
|
+
// in the shared core so that only a screen which declares them imports them:
|
|
236
|
+
// `camera` for the picker (it returns the image already re-encoded as JPEG and
|
|
237
|
+
// scaled to 2048 px on its longest side, which is also what keeps a phone
|
|
238
|
+
// photo inside the inline upload bound) and `presigned_upload` for the bytes,
|
|
239
|
+
// which go to a self-authorizing url with no Wix credential attached.
|
|
240
|
+
attachments: {
|
|
241
|
+
pick: async (source) => {
|
|
242
|
+
const asset = await capturePhoto({ source, maxEdgePixels: 2048 });
|
|
243
|
+
return asset ? { dataUri: asset.uri, mimeType: asset.mime } : null;
|
|
244
|
+
},
|
|
245
|
+
put: async (url, base64, contentType) => {
|
|
246
|
+
const r = await put(url, { base64 }, { contentType, method: "PUT" });
|
|
247
|
+
return { ok: r.ok, status: r.status };
|
|
248
|
+
},
|
|
249
|
+
// A NEW action on the service, not a return value: the upload outlives the
|
|
250
|
+
// `attach` that started it. `svc` is read at call time, long after it exists.
|
|
251
|
+
settled: (outcome) => { void svc.attachmentSettled(outcome); },
|
|
252
|
+
},
|
|
224
253
|
});
|
|
225
254
|
|
|
226
255
|
const svc = defineService<AriaChatState, {
|
|
@@ -252,6 +281,10 @@ const svc = defineService<AriaChatState, {
|
|
|
252
281
|
widgetPick: (s: AriaChatState, arg?: AriaActionArg) => AriaChatState;
|
|
253
282
|
widgetQuery: (s: AriaChatState, arg?: AriaActionArg) => AriaChatState;
|
|
254
283
|
widgetAnswer: (s: AriaChatState, arg?: AriaActionArg) => AriaChatState;
|
|
284
|
+
attach: (s: AriaChatState, arg?: AriaActionArg) => Promise<AriaChatState>;
|
|
285
|
+
attachmentSettled: (s: AriaChatState, arg?: AriaActionArg) => AriaChatState;
|
|
286
|
+
removeAttachment: (s: AriaChatState, arg?: AriaActionArg) => AriaChatState;
|
|
287
|
+
retryAttachment: (s: AriaChatState, arg?: AriaActionArg) => AriaChatState;
|
|
255
288
|
}>(SERVICE, {
|
|
256
289
|
state: core.initialState,
|
|
257
290
|
actions: {
|
|
@@ -288,6 +321,12 @@ const svc = defineService<AriaChatState, {
|
|
|
288
321
|
widgetPick: core.widgetPick,
|
|
289
322
|
widgetQuery: core.widgetQuery,
|
|
290
323
|
widgetAnswer: core.widgetAnswer,
|
|
324
|
+
// The composer's photos. `attachmentSettled` is dispatched by the upload
|
|
325
|
+
// itself (see `attachments.settled` above), never by the descriptor.
|
|
326
|
+
attach: core.attach,
|
|
327
|
+
attachmentSettled: core.attachmentSettled,
|
|
328
|
+
removeAttachment: core.removeAttachment,
|
|
329
|
+
retryAttachment: core.retryAttachment,
|
|
291
330
|
},
|
|
292
331
|
});
|
|
293
332
|
|
|
@@ -8,7 +8,8 @@ import { queryPosts } from "@himalaya/wix-blog";
|
|
|
8
8
|
import { queryEvents, startDateOf, type WixEvent } from "../_shared/himi-events.js";
|
|
9
9
|
import { countSites } from "@himalaya/wix-site-list";
|
|
10
10
|
import { searchOrders, type WixOrder } from "@himalaya/wix-ecom";
|
|
11
|
-
import { queryBookings
|
|
11
|
+
import { queryBookings } from "@himalaya/wix-bookings";
|
|
12
|
+
import { UPCOMING_BOOKING_STATUSES, upcomingBookingCount } from "../_shared/owner-bookings.js";
|
|
12
13
|
import { queryMembers } from "@himalaya/wix-members";
|
|
13
14
|
import { queryReviews } from "@himalaya/wix-reviews";
|
|
14
15
|
import { queryReservations } from "@himalaya/wix-table-reservations";
|
|
@@ -88,7 +89,6 @@ const PAGE = 100;
|
|
|
88
89
|
const TODAY_PAGE = 50;
|
|
89
90
|
const EVENT_SCAN_MAX_PAGES = 5;
|
|
90
91
|
const EVENT_SCAN_MAX_RECORDS = 500;
|
|
91
|
-
const UPCOMING_BOOKING_STATUSES = ["CONFIRMED", "PENDING", "PENDING_APPROVAL", "WAITING_LIST", "CREATED"];
|
|
92
92
|
const UPCOMING_RESERVATION_STATUSES = ["HELD", "RESERVED", "REQUESTED"];
|
|
93
93
|
const UPCOMING_EVENT_STATUSES = ["UPCOMING", "SCHEDULED"];
|
|
94
94
|
const ATTENTION_MEMBER_STATUSES = ["PENDING"];
|
|
@@ -314,16 +314,6 @@ async function measuredRevenue7d(
|
|
|
314
314
|
}
|
|
315
315
|
}
|
|
316
316
|
|
|
317
|
-
function upcomingBookingCount(bookings: WixBooking[], now: number): number {
|
|
318
|
-
const valid = ["CONFIRMED", "PENDING", "PENDING_APPROVAL", "WAITING_LIST", "CREATED"];
|
|
319
|
-
return bookings.filter((booking) => {
|
|
320
|
-
if (!valid.includes((booking.status ?? "").toUpperCase())) return false;
|
|
321
|
-
const start = booking.startDate || booking.bookedEntity?.slot?.startDate;
|
|
322
|
-
const ms = start ? new Date(start).getTime() : NaN;
|
|
323
|
-
return Number.isFinite(ms) && ms >= now;
|
|
324
|
-
}).length;
|
|
325
|
-
}
|
|
326
|
-
|
|
327
317
|
function enabledSourcesFrom(value: unknown): HomeSourceId[] | undefined {
|
|
328
318
|
if (!value || typeof value !== "object" || Array.isArray(value)) return undefined;
|
|
329
319
|
const holder = value as Record<string, unknown>;
|
|
@@ -7,7 +7,8 @@ import { defineService, navigate } from '@himalaya/state';
|
|
|
7
7
|
import { open } from '@himalaya/open-url';
|
|
8
8
|
import { queryStoreProducts } from '../_shared/himi-store.js';
|
|
9
9
|
import { searchOrders } from '@himalaya/wix-ecom';
|
|
10
|
-
import { queryBookings, queryServices } from '@himalaya/wix-bookings';
|
|
10
|
+
import { queryBookings, queryServices, type WixBooking } from '@himalaya/wix-bookings';
|
|
11
|
+
import { UPCOMING_BOOKING_STATUSES, upcomingBookingCount } from '../_shared/owner-bookings.js';
|
|
11
12
|
import { queryEvents, startDateOf } from '../_shared/himi-events.js';
|
|
12
13
|
import { queryPosts, queryDraftPosts } from '@himalaya/wix-blog';
|
|
13
14
|
import { queryQuestionEntries } from '@himalaya/wix-faq';
|
|
@@ -90,9 +91,14 @@ async function metricFor(metricKey: string): Promise<Metric> {
|
|
|
90
91
|
return partialCount(response, 'services');
|
|
91
92
|
}
|
|
92
93
|
case 'appointments': {
|
|
93
|
-
|
|
94
|
-
const
|
|
95
|
-
const
|
|
94
|
+
// Same question, same count as Home's "Upcoming appointments" (_shared/owner-bookings).
|
|
95
|
+
const nowMs = Date.now();
|
|
96
|
+
const response = await queryBookings({ query: { filter: { startDate: { $gte: new Date(nowMs).toISOString() }, status: { $in: UPCOMING_BOOKING_STATUSES } }, paging: { limit: PAGE, offset: 0 } } });
|
|
97
|
+
const page = partialCount(response, 'bookings');
|
|
98
|
+
const loaded = rows(response, 'bookings');
|
|
99
|
+
// Counted from the loaded page, so it is partial ("+") whenever the server holds more
|
|
100
|
+
// than that page — by its total, its cursor, or a full page — exactly as Home marks it.
|
|
101
|
+
const metric = { count: upcomingBookingCount(loaded as WixBooking[], nowMs), hasMore: page.hasMore || page.count > loaded.length || loaded.length >= PAGE };
|
|
96
102
|
return { ...metric, statusText: metric.count
|
|
97
103
|
? copyTemplate('ownerManage.appointmentsUpcoming', '{count} upcoming', { count: metric.count })
|
|
98
104
|
: copyParam('ownerManage.appointmentsClear', 'No upcoming appointments') };
|
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
import { copyParam } from "./himi-copy.js";
|
|
2
2
|
|
|
3
|
-
/** Host-owned preview input. Absent on native and older hosts.
|
|
3
|
+
/** Host-owned preview input. Absent on native and older hosts.
|
|
4
|
+
*
|
|
5
|
+
* `"sample"` — the built-in demo records; `"live"` — the viewer's own business over the
|
|
6
|
+
* owner rung; `"fixtures"` — a DEV web host over a sealed hermetic gateway, where
|
|
7
|
+
* the dev fixtures are the sample data. `"fixtures"` is neither live nor demo, so a
|
|
8
|
+
* worker READS through the bridge as it does on a device; it is still a preview host
|
|
9
|
+
* (`isOwnerPreviewHost`), so failure copy may name the web preview. */
|
|
4
10
|
function ownerPreviewMode(): unknown {
|
|
5
11
|
return (globalThis as unknown as { himalaya?: { input?: Record<string, unknown> } }).himalaya?.input?.__himiOwnerPreview;
|
|
6
12
|
}
|
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
import { copyParam } from "./himi-copy.js";
|
|
2
2
|
|
|
3
|
-
/** Host-owned preview input. Absent on native and older hosts.
|
|
3
|
+
/** Host-owned preview input. Absent on native and older hosts.
|
|
4
|
+
*
|
|
5
|
+
* `"sample"` — the built-in demo records; `"live"` — the viewer's own business over the
|
|
6
|
+
* owner rung; `"fixtures"` — a DEV web host over a sealed hermetic gateway, where
|
|
7
|
+
* the dev fixtures are the sample data. `"fixtures"` is neither live nor demo, so a
|
|
8
|
+
* worker READS through the bridge as it does on a device; it is still a preview host
|
|
9
|
+
* (`isOwnerPreviewHost`), so failure copy may name the web preview. */
|
|
4
10
|
function ownerPreviewMode(): unknown {
|
|
5
11
|
return (globalThis as unknown as { himalaya?: { input?: Record<string, unknown> } }).himalaya?.input?.__himiOwnerPreview;
|
|
6
12
|
}
|
|
@@ -37,7 +37,7 @@ export default defineApp({
|
|
|
37
37
|
actions: "http://localhost:8190/v1/actions",
|
|
38
38
|
sync: "http://localhost:8190/v1/sync",
|
|
39
39
|
},
|
|
40
|
-
capabilities: ["live_activity","push","share","secure_storage","open_url","local_database","clipboard","ui"],
|
|
40
|
+
capabilities: ["live_activity","push","share","secure_storage","open_url","local_database","clipboard","ui","camera","presigned_upload"],
|
|
41
41
|
designTokensPath: "./tokens.json",
|
|
42
42
|
navigation: {
|
|
43
43
|
"navKind": "responsive",
|
|
@@ -50090,7 +50090,7 @@ const SCREENS = runtimeSetting({
|
|
|
50090
50090
|
"itemsPath": "$service:himiOwnerLiteManage.recents",
|
|
50091
50091
|
"items": [
|
|
50092
50092
|
{
|
|
50093
|
-
"id": "",
|
|
50093
|
+
"id": "himi_owner_lite.manage.recent.$item.id",
|
|
50094
50094
|
"body": {
|
|
50095
50095
|
"package": "himalaya",
|
|
50096
50096
|
"type": "VStack",
|
|
@@ -50235,7 +50235,7 @@ const SCREENS = runtimeSetting({
|
|
|
50235
50235
|
"spacing": 14,
|
|
50236
50236
|
"children": [
|
|
50237
50237
|
{
|
|
50238
|
-
"id": "",
|
|
50238
|
+
"id": "himi_owner_lite.manage.recent.create.$item.id",
|
|
50239
50239
|
"body": {
|
|
50240
50240
|
"package": "himalaya",
|
|
50241
50241
|
"type": "Text",
|
|
@@ -50260,7 +50260,7 @@ const SCREENS = runtimeSetting({
|
|
|
50260
50260
|
}
|
|
50261
50261
|
},
|
|
50262
50262
|
{
|
|
50263
|
-
"id": "",
|
|
50263
|
+
"id": "himi_owner_lite.manage.recent.handoff.$item.id",
|
|
50264
50264
|
"body": {
|
|
50265
50265
|
"package": "himalaya",
|
|
50266
50266
|
"type": "Text",
|
|
@@ -50396,7 +50396,7 @@ const SCREENS = runtimeSetting({
|
|
|
50396
50396
|
"itemsPath": "$item.areas",
|
|
50397
50397
|
"items": [
|
|
50398
50398
|
{
|
|
50399
|
-
"id": "",
|
|
50399
|
+
"id": "himi_owner_lite.manage.area.$item.id",
|
|
50400
50400
|
"body": {
|
|
50401
50401
|
"package": "himalaya",
|
|
50402
50402
|
"type": "VStack",
|
|
@@ -50541,7 +50541,7 @@ const SCREENS = runtimeSetting({
|
|
|
50541
50541
|
"spacing": 14,
|
|
50542
50542
|
"children": [
|
|
50543
50543
|
{
|
|
50544
|
-
"id": "",
|
|
50544
|
+
"id": "himi_owner_lite.manage.area.create.$item.id",
|
|
50545
50545
|
"body": {
|
|
50546
50546
|
"package": "himalaya",
|
|
50547
50547
|
"type": "Text",
|
|
@@ -50566,7 +50566,7 @@ const SCREENS = runtimeSetting({
|
|
|
50566
50566
|
}
|
|
50567
50567
|
},
|
|
50568
50568
|
{
|
|
50569
|
-
"id": "",
|
|
50569
|
+
"id": "himi_owner_lite.manage.area.handoff.$item.id",
|
|
50570
50570
|
"body": {
|
|
50571
50571
|
"package": "himalaya",
|
|
50572
50572
|
"type": "Text",
|
|
@@ -51346,7 +51346,7 @@ const SCREENS = runtimeSetting({
|
|
|
51346
51346
|
"props": {
|
|
51347
51347
|
"items": [
|
|
51348
51348
|
{
|
|
51349
|
-
"id": "",
|
|
51349
|
+
"id": "ol_drawer_nav.$item.id",
|
|
51350
51350
|
"body": {
|
|
51351
51351
|
"package": "himalaya",
|
|
51352
51352
|
"type": "ListItem",
|
|
@@ -51398,7 +51398,7 @@ const SCREENS = runtimeSetting({
|
|
|
51398
51398
|
"props": {
|
|
51399
51399
|
"items": [
|
|
51400
51400
|
{
|
|
51401
|
-
"id": "",
|
|
51401
|
+
"id": "ol_drawer_attention.$item.id",
|
|
51402
51402
|
"body": {
|
|
51403
51403
|
"package": "himalaya",
|
|
51404
51404
|
"type": "ListItem",
|
|
@@ -54959,6 +54959,45 @@ const SCREENS = runtimeSetting({
|
|
|
54959
54959
|
}
|
|
54960
54960
|
}
|
|
54961
54961
|
},
|
|
54962
|
+
{
|
|
54963
|
+
"id": "himi_owner_lite_aria.msg_attach_$item.id",
|
|
54964
|
+
"body": {
|
|
54965
|
+
"package": "himalaya",
|
|
54966
|
+
"type": "HStack",
|
|
54967
|
+
"props": {
|
|
54968
|
+
"spacing": 0,
|
|
54969
|
+
"children": [
|
|
54970
|
+
{
|
|
54971
|
+
"id": "",
|
|
54972
|
+
"body": {
|
|
54973
|
+
"package": "himalaya",
|
|
54974
|
+
"type": "Spacer",
|
|
54975
|
+
"props": {}
|
|
54976
|
+
},
|
|
54977
|
+
"modifiers": {
|
|
54978
|
+
"hiddenPath": "$item.notUser"
|
|
54979
|
+
}
|
|
54980
|
+
},
|
|
54981
|
+
{
|
|
54982
|
+
"id": "",
|
|
54983
|
+
"body": {
|
|
54984
|
+
"package": "himalaya",
|
|
54985
|
+
"type": "Text",
|
|
54986
|
+
"props": {
|
|
54987
|
+
"text": "$item.attachText",
|
|
54988
|
+
"style": "footnote",
|
|
54989
|
+
"color": "textSecondary",
|
|
54990
|
+
"maxLines": 3
|
|
54991
|
+
}
|
|
54992
|
+
}
|
|
54993
|
+
}
|
|
54994
|
+
]
|
|
54995
|
+
}
|
|
54996
|
+
},
|
|
54997
|
+
"modifiers": {
|
|
54998
|
+
"hiddenPath": "$item.attachHidden"
|
|
54999
|
+
}
|
|
55000
|
+
},
|
|
54962
55001
|
{
|
|
54963
55002
|
"id": "himi_owner_lite_aria.msg_$item.id.link1",
|
|
54964
55003
|
"body": {
|
|
@@ -58539,6 +58578,203 @@ const SCREENS = runtimeSetting({
|
|
|
58539
58578
|
}
|
|
58540
58579
|
}
|
|
58541
58580
|
},
|
|
58581
|
+
{
|
|
58582
|
+
"id": "himi_owner_lite_aria.attachments.bound",
|
|
58583
|
+
"body": {
|
|
58584
|
+
"package": "himalaya",
|
|
58585
|
+
"type": "LazyList",
|
|
58586
|
+
"props": {
|
|
58587
|
+
"itemsPath": "$service:himiOwnerLiteAria.attachments",
|
|
58588
|
+
"horizontal": true,
|
|
58589
|
+
"spacing": 8,
|
|
58590
|
+
"items": [
|
|
58591
|
+
{
|
|
58592
|
+
"id": "himi_owner_lite_aria.attachment_$item.id",
|
|
58593
|
+
"body": {
|
|
58594
|
+
"package": "himalaya",
|
|
58595
|
+
"type": "VStack",
|
|
58596
|
+
"props": {
|
|
58597
|
+
"spacing": 4,
|
|
58598
|
+
"children": [
|
|
58599
|
+
{
|
|
58600
|
+
"id": "himi_owner_lite_aria.attachment_thumb_$item.id",
|
|
58601
|
+
"body": {
|
|
58602
|
+
"package": "himalaya",
|
|
58603
|
+
"type": "Image",
|
|
58604
|
+
"props": {
|
|
58605
|
+
"url": "$item.thumbUrl",
|
|
58606
|
+
"width": 72,
|
|
58607
|
+
"height": 72,
|
|
58608
|
+
"contentMode": "fill",
|
|
58609
|
+
"shape": "rounded",
|
|
58610
|
+
"contentDescription": "$item.name"
|
|
58611
|
+
}
|
|
58612
|
+
},
|
|
58613
|
+
"modifiers": {
|
|
58614
|
+
"hiddenPath": "$item.thumbHidden"
|
|
58615
|
+
}
|
|
58616
|
+
},
|
|
58617
|
+
{
|
|
58618
|
+
"id": "",
|
|
58619
|
+
"body": {
|
|
58620
|
+
"package": "himalaya",
|
|
58621
|
+
"type": "Text",
|
|
58622
|
+
"props": {
|
|
58623
|
+
"text": "$item.statusText",
|
|
58624
|
+
"style": "caption",
|
|
58625
|
+
"color": "textSecondary",
|
|
58626
|
+
"maxLines": 2
|
|
58627
|
+
}
|
|
58628
|
+
},
|
|
58629
|
+
"modifiers": {
|
|
58630
|
+
"hiddenPath": "$item.statusHidden"
|
|
58631
|
+
}
|
|
58632
|
+
},
|
|
58633
|
+
{
|
|
58634
|
+
"id": "",
|
|
58635
|
+
"body": {
|
|
58636
|
+
"package": "himalaya",
|
|
58637
|
+
"type": "HStack",
|
|
58638
|
+
"props": {
|
|
58639
|
+
"spacing": 8,
|
|
58640
|
+
"children": [
|
|
58641
|
+
{
|
|
58642
|
+
"id": "himi_owner_lite_aria.attachment_retry_$item.id",
|
|
58643
|
+
"body": {
|
|
58644
|
+
"package": "himalaya",
|
|
58645
|
+
"type": "Text",
|
|
58646
|
+
"props": {
|
|
58647
|
+
"text": "Retry",
|
|
58648
|
+
"style": "caption",
|
|
58649
|
+
"color": "accentPrimary",
|
|
58650
|
+
"maxLines": 1
|
|
58651
|
+
}
|
|
58652
|
+
},
|
|
58653
|
+
"modifiers": {
|
|
58654
|
+
"onTap": {
|
|
58655
|
+
"actionId": "tier5.himiOwnerLiteAria.retryAttachment",
|
|
58656
|
+
"params": {
|
|
58657
|
+
"id": "$item.id"
|
|
58658
|
+
}
|
|
58659
|
+
},
|
|
58660
|
+
"hiddenPath": "$item.retryHidden"
|
|
58661
|
+
}
|
|
58662
|
+
},
|
|
58663
|
+
{
|
|
58664
|
+
"id": "himi_owner_lite_aria.attachment_remove_$item.id",
|
|
58665
|
+
"body": {
|
|
58666
|
+
"package": "himalaya",
|
|
58667
|
+
"type": "Icon",
|
|
58668
|
+
"props": {
|
|
58669
|
+
"name": "close",
|
|
58670
|
+
"size": 14,
|
|
58671
|
+
"tint": "textSecondary"
|
|
58672
|
+
}
|
|
58673
|
+
},
|
|
58674
|
+
"modifiers": {
|
|
58675
|
+
"onTap": {
|
|
58676
|
+
"actionId": "tier5.himiOwnerLiteAria.removeAttachment",
|
|
58677
|
+
"params": {
|
|
58678
|
+
"id": "$item.id"
|
|
58679
|
+
}
|
|
58680
|
+
},
|
|
58681
|
+
"accessibilityLabel": "Remove photo"
|
|
58682
|
+
}
|
|
58683
|
+
}
|
|
58684
|
+
]
|
|
58685
|
+
}
|
|
58686
|
+
}
|
|
58687
|
+
}
|
|
58688
|
+
]
|
|
58689
|
+
}
|
|
58690
|
+
},
|
|
58691
|
+
"modifiers": {
|
|
58692
|
+
"width": 72
|
|
58693
|
+
}
|
|
58694
|
+
}
|
|
58695
|
+
]
|
|
58696
|
+
}
|
|
58697
|
+
},
|
|
58698
|
+
"modifiers": {
|
|
58699
|
+
"hiddenPath": "$service:himiOwnerLiteAria.attachmentsHidden",
|
|
58700
|
+
"padding": {
|
|
58701
|
+
"leading": 0,
|
|
58702
|
+
"trailing": 0,
|
|
58703
|
+
"top": 8,
|
|
58704
|
+
"bottom": 0
|
|
58705
|
+
}
|
|
58706
|
+
}
|
|
58707
|
+
},
|
|
58708
|
+
{
|
|
58709
|
+
"id": "",
|
|
58710
|
+
"body": {
|
|
58711
|
+
"package": "himalaya",
|
|
58712
|
+
"type": "HStack",
|
|
58713
|
+
"props": {
|
|
58714
|
+
"spacing": 16,
|
|
58715
|
+
"children": [
|
|
58716
|
+
{
|
|
58717
|
+
"id": "himi_owner_lite_aria.attach.library",
|
|
58718
|
+
"body": {
|
|
58719
|
+
"package": "himalaya",
|
|
58720
|
+
"type": "Icon",
|
|
58721
|
+
"props": {
|
|
58722
|
+
"name": "image",
|
|
58723
|
+
"size": 22,
|
|
58724
|
+
"tint": "accentPrimary"
|
|
58725
|
+
}
|
|
58726
|
+
},
|
|
58727
|
+
"modifiers": {
|
|
58728
|
+
"onTap": {
|
|
58729
|
+
"actionId": "tier5.himiOwnerLiteAria.attach",
|
|
58730
|
+
"params": {
|
|
58731
|
+
"source": "library"
|
|
58732
|
+
}
|
|
58733
|
+
},
|
|
58734
|
+
"accessibilityLabel": "Add a photo"
|
|
58735
|
+
}
|
|
58736
|
+
},
|
|
58737
|
+
{
|
|
58738
|
+
"id": "himi_owner_lite_aria.attach.camera",
|
|
58739
|
+
"body": {
|
|
58740
|
+
"package": "himalaya",
|
|
58741
|
+
"type": "Icon",
|
|
58742
|
+
"props": {
|
|
58743
|
+
"name": "camera",
|
|
58744
|
+
"size": 22,
|
|
58745
|
+
"tint": "accentPrimary"
|
|
58746
|
+
}
|
|
58747
|
+
},
|
|
58748
|
+
"modifiers": {
|
|
58749
|
+
"onTap": {
|
|
58750
|
+
"actionId": "tier5.himiOwnerLiteAria.attach",
|
|
58751
|
+
"params": {
|
|
58752
|
+
"source": "camera"
|
|
58753
|
+
}
|
|
58754
|
+
},
|
|
58755
|
+
"accessibilityLabel": "Take a photo"
|
|
58756
|
+
}
|
|
58757
|
+
},
|
|
58758
|
+
{
|
|
58759
|
+
"id": "",
|
|
58760
|
+
"body": {
|
|
58761
|
+
"package": "himalaya",
|
|
58762
|
+
"type": "Spacer",
|
|
58763
|
+
"props": {}
|
|
58764
|
+
}
|
|
58765
|
+
}
|
|
58766
|
+
]
|
|
58767
|
+
}
|
|
58768
|
+
},
|
|
58769
|
+
"modifiers": {
|
|
58770
|
+
"padding": {
|
|
58771
|
+
"leading": 0,
|
|
58772
|
+
"trailing": 0,
|
|
58773
|
+
"top": 8,
|
|
58774
|
+
"bottom": 0
|
|
58775
|
+
}
|
|
58776
|
+
}
|
|
58777
|
+
},
|
|
58542
58778
|
{
|
|
58543
58779
|
"id": "form_aria",
|
|
58544
58780
|
"body": {
|
|
@@ -58624,7 +58860,9 @@ const SCREENS = runtimeSetting({
|
|
|
58624
58860
|
"wix_api",
|
|
58625
58861
|
"open_url",
|
|
58626
58862
|
"clipboard",
|
|
58627
|
-
"ui"
|
|
58863
|
+
"ui",
|
|
58864
|
+
"camera",
|
|
58865
|
+
"presigned_upload"
|
|
58628
58866
|
],
|
|
58629
58867
|
"minBinaryVersion": "0.1.0",
|
|
58630
58868
|
"bundleVersion": "0.0.1"
|