@wix/himalaya-cli 0.1151.0 → 0.1153.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/stdlib/wix-sdk/bookings-v2/src/extensions.d.ts +33 -2
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/wix-data/src/index.d.ts +14 -2
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/wix-bookings.mjs +71 -5
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/wix-data.mjs +3 -2
- package/dist/cli.mjs +141 -29
- package/dist/preview-assets.generated.bin +0 -0
- package/guides/cms-collections.md +4 -1
- package/guides/getting-started.md +3 -1
- package/guides/himi-skill.md +3 -1
- package/guides/owner-lite-site-binding.md +26 -0
- package/guides/push-cli-onboarding.md +42 -1
- package/guides/sdk-reference.json +23 -11
- package/guides/templates.md +1 -0
- package/guides/wix-api-usage.md +5 -1
- package/package.json +2 -2
- package/templates/beauty-salon/dev/index.ts +6 -3
- package/templates/community-club/dev/index.ts +6 -3
- package/templates/community-club-owner/dev/index.ts +44 -1
- package/templates/community-club-owner/tier5-src/himi-owner-lite-event/index.ts +52 -8
- package/templates/events-meetups/dev/index.ts +6 -3
- package/templates/events-meetups-owner/dev/index.ts +44 -1
- package/templates/events-meetups-owner/tier5-src/himi-owner-lite-event/index.ts +52 -8
- package/templates/gym-fitness/dev/index.ts +6 -3
- package/templates/gym-fitness-owner/dev/index.ts +44 -1
- package/templates/gym-fitness-owner/tier5-src/himi-owner-lite-event/index.ts +52 -8
- package/templates/nonprofit-cause/dev/index.ts +6 -3
- package/templates/nonprofit-cause-owner/dev/index.ts +44 -1
- package/templates/nonprofit-cause-owner/tier5-src/himi-owner-lite-event/index.ts +52 -8
- package/templates/owner-lite/dev/index.ts +44 -1
- package/templates/owner-lite/tier5-src/himi-owner-lite-event/index.ts +52 -8
- package/templates/podcast-creator/dev/index.ts +6 -3
- package/templates/podcast-creator-owner/dev/index.ts +44 -1
- package/templates/podcast-creator-owner/tier5-src/himi-owner-lite-event/index.ts +52 -8
- package/templates/portfolio-creative/dev/index.ts +6 -3
- package/templates/restaurant/dev/index.ts +6 -3
- package/templates/restaurant-owner/dev/index.ts +44 -1
- package/templates/restaurant-owner/tier5-src/himi-owner-lite-event/index.ts +52 -8
- package/templates/retail-store/dev/index.ts +7 -3
- package/templates/yoga-studio/dev/index.ts +6 -3
- package/templates/yoga-studio-owner/dev/index.ts +44 -1
- package/templates/yoga-studio-owner/tier5-src/himi-owner-lite-event/index.ts +52 -8
|
@@ -83,7 +83,48 @@ After setup, continue normal app development, validation, publish/preview/promot
|
|
|
83
83
|
native distribution. Native push configuration, member authentication, device-token
|
|
84
84
|
registration and a delivery/tap test are still required; for the test, see
|
|
85
85
|
[Send a test notification](#send-a-test-notification). Setup does not enable native
|
|
86
|
-
capabilities, choose a Ping family, send notifications or verify phone delivery
|
|
86
|
+
capabilities, choose a Ping family, send notifications or verify phone delivery; the app's
|
|
87
|
+
`config.ts` does the first two (see [Native push configuration](#native-push-configuration)).
|
|
88
|
+
|
|
89
|
+
## Native push configuration
|
|
90
|
+
|
|
91
|
+
The app's own `config.ts` turns push on; `himi notify setup` never edits it.
|
|
92
|
+
|
|
93
|
+
```ts
|
|
94
|
+
auth: WixConsumerAuthProvider({
|
|
95
|
+
siteId: "<metaSiteId>", // the site himi notify setup configured
|
|
96
|
+
clientId: "<headless-client-id>",
|
|
97
|
+
siteUrl: "https://<your-site>",
|
|
98
|
+
redirectUri: "<scheme>://oauth/callback",
|
|
99
|
+
bootAsVisitor: true,
|
|
100
|
+
}),
|
|
101
|
+
capabilities: ["push" /* , … */],
|
|
102
|
+
push: {
|
|
103
|
+
registrar: "wix-ping",
|
|
104
|
+
pingAppName: "WixBrandedWebApp",
|
|
105
|
+
requestPermissionOnLaunch: true,
|
|
106
|
+
payloadAdapter: "wix-ping",
|
|
107
|
+
routes: [
|
|
108
|
+
{ match: "my-account/:site/stores/orders/:orderId",
|
|
109
|
+
link: "<scheme>://screen/<order-screen>?id={orderId}" },
|
|
110
|
+
],
|
|
111
|
+
},
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
- `pingAppName` is the Ping app family the device registers under. Use `WixBrandedWebApp`:
|
|
115
|
+
Ping allows it for site members and uses the credentials `himi notify setup` stored for
|
|
116
|
+
the site. A build signed for the APNs development environment appends `.sandbox` itself;
|
|
117
|
+
do not add it.
|
|
118
|
+
- The device registers only after a member signs in; a visitor's device receives nothing.
|
|
119
|
+
Keep `siteId` in `auth` on the site `himi notify setup` configured. A changed `siteId` or
|
|
120
|
+
`clientId` ships with `himi push` like the rest of the config, and the app picks it up on
|
|
121
|
+
its next launch; until then iOS stops registering rather than register the old site.
|
|
122
|
+
- `routes` turn the Wix links inside notifications into the app's screens, one route per
|
|
123
|
+
link shape. A notification whose link matches no route opens the app without navigating.
|
|
124
|
+
`himi validate` warns when a route names a screen the app does not declare.
|
|
125
|
+
- The `push` block ships with `himi push`; changing it needs no new binary. The binary still
|
|
126
|
+
has to carry the push entitlement: the `branded-lite` shell requests it, and the signing
|
|
127
|
+
profile must grant `aps-environment` (see the QA build notes below).
|
|
87
128
|
|
|
88
129
|
**Customer push QA builds use `himi dist --signing byo`.** After publishing an approved
|
|
89
130
|
release, use a backend and reachable runner source that support the customer-signing flow.
|
|
@@ -7337,7 +7337,7 @@
|
|
|
7337
7337
|
"kind": "function",
|
|
7338
7338
|
"jsdoc": "",
|
|
7339
7339
|
"decl": "export function deleteService(\n serviceId: string,\n opts?: WixCallOptions,\n): Promise<WixDeleteServiceResponse>;",
|
|
7340
|
-
"http": "DELETE /bookings/
|
|
7340
|
+
"http": "DELETE /bookings/v2/services/{…}"
|
|
7341
7341
|
},
|
|
7342
7342
|
{
|
|
7343
7343
|
"name": "WixServiceMoney",
|
|
@@ -7355,7 +7355,7 @@
|
|
|
7355
7355
|
"name": "WixService",
|
|
7356
7356
|
"kind": "interface",
|
|
7357
7357
|
"jsdoc": "",
|
|
7358
|
-
"decl": "export interface WixService {\n id: string;\n name?: string;\n description?: string;\n /** Session length in minutes. */\n duration?: number;\n /** Raw Bookings v2 response shape. */\n payment?: WixServicePayment;\n schedule?: { availabilityConstraints?: { sessionDurations?: number[] } };\n /** @deprecated Compatibility projection populated by `decodeService`. */\n price?: number;\n /** @deprecated Legacy v1 compatibility field. */\n category?: string;\n}"
|
|
7358
|
+
"decl": "export interface WixService {\n id: string;\n /** Optimistic-concurrency token — required by every v2 write (updateService reads it if omitted). */\n revision?: string;\n name?: string;\n description?: string;\n /** Session length in minutes. */\n duration?: number;\n /** Raw Bookings v2 response shape. */\n payment?: WixServicePayment;\n schedule?: { availabilityConstraints?: { sessionDurations?: number[] } };\n /** @deprecated Compatibility projection populated by `decodeService`. */\n price?: number;\n /** @deprecated Legacy v1 compatibility field. */\n category?: string;\n}"
|
|
7359
7359
|
},
|
|
7360
7360
|
{
|
|
7361
7361
|
"name": "decodeService",
|
|
@@ -7441,8 +7441,8 @@
|
|
|
7441
7441
|
{
|
|
7442
7442
|
"name": "WixServiceWrite",
|
|
7443
7443
|
"kind": "interface",
|
|
7444
|
-
"jsdoc": "/** Writable service fields for create/update. `
|
|
7445
|
-
"decl": "export interface WixServiceWrite {\n name?: string;\n description?: string;\n /** Session length in minutes; required, > 0 on create. */\n duration?: number;\n price?: number;\n category?: string;\n}"
|
|
7444
|
+
"jsdoc": "/** Writable service fields for create/update, in the ERGONOMIC shape a form has. The helpers\n * below encode it onto the Bookings v2 entity — they never send these flat fields as-is,\n * because v2 silently ignores a flat `price`/`duration` (HTTP 200, revision bumps, nothing\n * written: #3605, verified live 2026-10-01).\n * - `price` → `payment.fixed.price.{value,currency}` (value is a decimal STRING), merged\n * with the service's existing `payment` so `payment.options` (mandatory: online and/or\n * in-person) and the currency carry over.\n * - `duration` (minutes) → `schedule.availabilityConstraints.{durations,sessionDurations}`. */",
|
|
7445
|
+
"decl": "export interface WixServiceWrite {\n name?: string;\n description?: string;\n /** Session length in minutes; required, > 0 on create. */\n duration?: number;\n /** Fixed price as a number (e.g. 120). Encoded onto `payment.fixed.price`. */\n price?: number;\n /** ISO currency for `price`. Defaults to the service's current currency on update; required on create with a price. */\n currency?: string;\n /** Resource ids of the staff who deliver it (`queryStaff()` → `id`). An APPOINTMENT service needs ≥1;\n * createService defaults to the site's `defaultStaff` resource when omitted. NOT staff-member ids. */\n staffMemberIds?: string[];\n /** v2 service type; createService defaults to \"APPOINTMENT\". */\n type?: \"APPOINTMENT\" | \"CLASS\" | \"COURSE\";\n onlineBooking?: { enabled?: boolean };\n /** Raw v2 payment object — wins over `price`/`currency` when both are given. */\n payment?: Record<string, unknown>;\n /** @deprecated v1 only — v2 services carry `category.id`; ignored by create/update. */\n category?: string;\n}"
|
|
7446
7446
|
},
|
|
7447
7447
|
{
|
|
7448
7448
|
"name": "WixCreateServiceRequest",
|
|
@@ -7474,18 +7474,24 @@
|
|
|
7474
7474
|
"jsdoc": "",
|
|
7475
7475
|
"decl": "export interface WixDeleteServiceResponse {\n // Empty object on success.\n}"
|
|
7476
7476
|
},
|
|
7477
|
+
{
|
|
7478
|
+
"name": "encodeServiceWrite",
|
|
7479
|
+
"kind": "function",
|
|
7480
|
+
"jsdoc": "/** Encode an ergonomic write onto the v2 service entity. `existing` (the current service, for\n * an update) supplies the currency and `payment.options` a price change must carry. Exported\n * for tests; throws instead of sending a payload Bookings would accept and then ignore. */",
|
|
7481
|
+
"decl": "export function encodeServiceWrite(write: WixServiceWrite, existing?: WixService): Record<string, unknown>;"
|
|
7482
|
+
},
|
|
7477
7483
|
{
|
|
7478
7484
|
"name": "createService",
|
|
7479
7485
|
"kind": "function",
|
|
7480
|
-
"jsdoc": "/** Create a service — POST /bookings/
|
|
7481
|
-
"decl": "export function createService(service: WixServiceWrite): Promise<WixCreateServiceResponse>;",
|
|
7482
|
-
"http": "POST /bookings/
|
|
7486
|
+
"jsdoc": "/** Create a service — POST /bookings/v2/services (the v1 route 400s for a v2 site: #3605).\n * `name` + `duration` are required. Defaults: type APPOINTMENT, online booking on, and the\n * site's `defaultStaff` resource when `staffMemberIds` is omitted (an APPOINTMENT service\n * 400s MISSING_APPOINTMENT_RESOURCES without one), and — for a `price` without `currency` —\n * the currency the site's existing services use. */",
|
|
7487
|
+
"decl": "export async function createService(service: WixServiceWrite): Promise<WixCreateServiceResponse>;",
|
|
7488
|
+
"http": "POST /bookings/v2/services"
|
|
7483
7489
|
},
|
|
7484
7490
|
{
|
|
7485
7491
|
"name": "updateService",
|
|
7486
7492
|
"kind": "function",
|
|
7487
7493
|
"jsdoc": "",
|
|
7488
|
-
"decl": "export function updateService(serviceId: string, service: WixServiceWrite & { revision?: string }): Promise<WixUpdateServiceResponse>;",
|
|
7494
|
+
"decl": "export async function updateService(serviceId: string, service: WixServiceWrite & { revision?: string }): Promise<WixUpdateServiceResponse>;",
|
|
7489
7495
|
"http": "PATCH /bookings/v2/services/{…}"
|
|
7490
7496
|
},
|
|
7491
7497
|
{
|
|
@@ -11347,11 +11353,17 @@
|
|
|
11347
11353
|
"jsdoc": "",
|
|
11348
11354
|
"decl": "export interface WixDataPaging {\n limit?: number;\n offset?: number;\n}"
|
|
11349
11355
|
},
|
|
11356
|
+
{
|
|
11357
|
+
"name": "WixDataSort",
|
|
11358
|
+
"kind": "interface",
|
|
11359
|
+
"jsdoc": "/** One sort key — `{ fieldName: \"postedDate\", order: \"DESC\" }`. Keys apply in array order. */",
|
|
11360
|
+
"decl": "export interface WixDataSort {\n fieldName: string;\n order?: \"ASC\" | \"DESC\";\n}"
|
|
11361
|
+
},
|
|
11350
11362
|
{
|
|
11351
11363
|
"name": "WixQueryDataItemsRequest",
|
|
11352
11364
|
"kind": "interface",
|
|
11353
11365
|
"jsdoc": "",
|
|
11354
|
-
"decl": "export interface WixQueryDataItemsRequest {\n dataCollectionId: string;\n query?: {\n filter?: Record<string, unknown>;\n paging?: WixDataPaging;\n sort?:
|
|
11366
|
+
"decl": "export interface WixQueryDataItemsRequest {\n dataCollectionId: string;\n query?: {\n filter?: Record<string, unknown>;\n paging?: WixDataPaging;\n sort?: WixDataSort[];\n };\n /** When true, `pagingMetadata.total` is filled (offset paging only). Default omitted. */\n returnTotalCount?: boolean;\n}"
|
|
11355
11367
|
},
|
|
11356
11368
|
{
|
|
11357
11369
|
"name": "WixQueryDataItemsResponse",
|
|
@@ -11374,8 +11386,8 @@
|
|
|
11374
11386
|
{
|
|
11375
11387
|
"name": "queryDataItems",
|
|
11376
11388
|
"kind": "function",
|
|
11377
|
-
"jsdoc": "/** Query items in a collection — POST /wix-data/v2/items/query.\n *\n * `filter` is the Wix Data v2 filter object, which the type cannot express (it is\n * `Record<string, unknown>` by construction). A field name maps to a value for\n * equality, or to an operator object:\n *\n * ```ts\n * await queryDataItems(\"Listings\", 20, { city: \"Tel Aviv\" });\n * await queryDataItems(\"Listings\", 20, { price: { $lte: 2_500_000 } });\n * await queryDataItems(\"Listings\", 20, { _id: { $in: [a, b] } });\n * ```\n *\n * `offset` pages: ask for `limit` rows starting at `offset`. Pair it with\n * `returnTotalCount: true`, which fills `pagingMetadata.total` so a caller knows\n * when to stop — it is omitted by default because counting is extra work, and it\n * reports total for OFFSET paging only, which is the mode this function uses.\n *\n * ```ts\n * const first = await queryDataItems(\"Listings\", 50, undefined, true);\n * const total = first.pagingMetadata?.total ?? 0;\n * const rest = await queryDataItems(\"Listings\", 50, undefined, false, 50);\n * ```\n *\n * To read ONE row, use `getDataItem` rather than a page plus a client-side\n * `.find()` — that pattern breaks silently once the collection outgrows `limit`. */",
|
|
11378
|
-
"decl": "export function queryDataItems(\n dataCollectionId: string,\n limit = 50,\n filter?: Record<string, unknown>,\n returnTotalCount = false,\n offset = 0,\n): Promise<WixQueryDataItemsResponse>;",
|
|
11389
|
+
"jsdoc": "/** Query items in a collection — POST /wix-data/v2/items/query.\n *\n * `filter` is the Wix Data v2 filter object, which the type cannot express (it is\n * `Record<string, unknown>` by construction). A field name maps to a value for\n * equality, or to an operator object:\n *\n * ```ts\n * await queryDataItems(\"Listings\", 20, { city: \"Tel Aviv\" });\n * await queryDataItems(\"Listings\", 20, { price: { $lte: 2_500_000 } });\n * await queryDataItems(\"Listings\", 20, { _id: { $in: [a, b] } });\n * ```\n *\n * `offset` pages: ask for `limit` rows starting at `offset`. Pair it with\n * `returnTotalCount: true`, which fills `pagingMetadata.total` so a caller knows\n * when to stop — it is omitted by default because counting is extra work, and it\n * reports total for OFFSET paging only, which is the mode this function uses.\n *\n * ```ts\n * const first = await queryDataItems(\"Listings\", 50, undefined, true);\n * const total = first.pagingMetadata?.total ?? 0;\n * const rest = await queryDataItems(\"Listings\", 50, undefined, false, 50);\n * ```\n *\n * `sort` orders server-side, so \"newest first\" is one call instead of fetching every row\n * and sorting on the client (which also breaks once the collection outgrows `limit`):\n *\n * ```ts\n * await queryDataItems(\"Jobs\", 1, undefined, false, 0, [{ fieldName: \"postedDate\", order: \"DESC\" }]);\n * ```\n *\n * To read ONE row, use `getDataItem` rather than a page plus a client-side\n * `.find()` — that pattern breaks silently once the collection outgrows `limit`. */",
|
|
11390
|
+
"decl": "export function queryDataItems(\n dataCollectionId: string,\n limit = 50,\n filter?: Record<string, unknown>,\n returnTotalCount = false,\n offset = 0,\n sort?: WixDataSort[],\n): Promise<WixQueryDataItemsResponse>;",
|
|
11379
11391
|
"http": "POST /wix-data/v2/items/query"
|
|
11380
11392
|
},
|
|
11381
11393
|
{
|
package/guides/templates.md
CHANGED
|
@@ -115,6 +115,7 @@ himi template inspect # recompute the inventory after edi
|
|
|
115
115
|
himi template screens # list dev/index.ts screens without reading the file
|
|
116
116
|
himi template screens --show himi_saved > saved.txt # ONE screen's entry
|
|
117
117
|
himi template screens --write himi_saved --from saved.txt # put it back — re-parsed, refused if it breaks the file
|
|
118
|
+
himi template screens --add himi_sellers --from sellers.txt --parent himi_branded_home # a NEW screen, registered as linkable
|
|
118
119
|
himi template sweep --set "Sample content=>Our latest" --dry-run # copy inside string literals only
|
|
119
120
|
himi template trim --from-spec --links drop --dry-run # keep SPEC.md's Screen catalogue ids — read fromSpec.droppedPrimary first
|
|
120
121
|
```
|
package/guides/wix-api-usage.md
CHANGED
|
@@ -180,9 +180,13 @@ surface. Lead with it: it builds the request, calls the bridge, and decodes the
|
|
|
180
180
|
```ts
|
|
181
181
|
import { queryDataItems, insertDataItem, updateDataItem, removeDataItem } from "@himalaya/wix-data";
|
|
182
182
|
|
|
183
|
-
// queryDataItems(collectionId, limit = 50, filter
|
|
183
|
+
// queryDataItems(collectionId, limit = 50, filter?, returnTotalCount = false, offset = 0, sort?)
|
|
184
|
+
// → { dataItems?, items?, pagingMetadata? }
|
|
184
185
|
const res = await queryDataItems("MyCollection", 50);
|
|
185
186
|
const rows = (res.dataItems ?? res.items ?? []).map((it) => it.data); // parsed objects, not bytes
|
|
187
|
+
|
|
188
|
+
// Order server-side — "newest first" is one call, not every row fetched and sorted on the client:
|
|
189
|
+
const newest = await queryDataItems("Jobs", 1, undefined, false, 0, [{ fieldName: "postedDate", order: "DESC" }]);
|
|
186
190
|
```
|
|
187
191
|
|
|
188
192
|
The full items CRUD is typed: `insertDataItem(collectionId, data)` (POST `/wix-data/v2/items`),
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wix/himalaya-cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.1153.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "himi — the Himalaya authoring CLI. Build a Tier-5 content package on your own machine, push it to the production serve as a draft, preview it on web + Himi Player, and read worker logs back — the remote dev loop. Wraps @himalaya/serve-cli for transport.",
|
|
6
6
|
"keywords": [
|
|
@@ -67,5 +67,5 @@
|
|
|
67
67
|
"artifactId": "himalaya-cli"
|
|
68
68
|
}
|
|
69
69
|
},
|
|
70
|
-
"falconPackageHash": "
|
|
70
|
+
"falconPackageHash": "18d6e0952993df1eccb6d9a826c4ec2fa5cf335d69a8cdf02e4891f2"
|
|
71
71
|
}
|
|
@@ -2336,7 +2336,7 @@ const SCREENS = runtimeSetting({
|
|
|
2336
2336
|
"verticals": "[\"store\",\"bookings\",\"plans\",\"blog\"]",
|
|
2337
2337
|
"homeModules": "[{\"id\":\"member_progress\",\"label\":\"This week's schedule\",\"dataSource\":\"member.bookings.schedule\",\"emptyWhen\":[\"hideMemberProgress\"]},{\"id\":\"up_next\",\"label\":\"Up next\",\"dataSource\":\"member.bookings\",\"emptyWhen\":[\"hideNextBooking\",\"hidePersonalError\"]},{\"id\":\"saved\",\"label\":\"Saved on this device\",\"dataSource\":\"device.saved_items\",\"emptyWhen\":[\"noSavedContent\"]},{\"id\":\"section_0\",\"label\":\"Discover 1\",\"dataSource\":\"salonLuxe.section0\",\"emptyWhen\":[\"hideHeroImage\"]},{\"id\":\"section_1\",\"label\":\"__HIMI_APP_NAME__\",\"dataSource\":\"salonLuxe.section1\"}]",
|
|
2338
2338
|
"ownerDefaultLayout": "salonLuxe",
|
|
2339
|
-
"copy": "{\"home.bookVisitCta\":\"Book a visit\",\"home.featuredTitle\":\"Salon picks\",\"home.stylistsCaption\":\"Meet your stylists\",\"home.treatmentsSubtitle\":\"Book your favorite in a couple of taps.\",\"home.treatmentsTitle\":\"Signature treatments\"}"
|
|
2339
|
+
"copy": "{\"home.bookVisitCta\":\"Book a visit\",\"home.featuredTitle\":\"Salon picks\",\"home.profileBody\":\"Sign in for orders, bookings, memberships and saved posts.\",\"home.stylistsCaption\":\"Meet your stylists\",\"home.treatmentsSubtitle\":\"Book your favorite in a couple of taps.\",\"home.treatmentsTitle\":\"Signature treatments\"}"
|
|
2340
2340
|
}
|
|
2341
2341
|
}
|
|
2342
2342
|
}
|
|
@@ -2387,7 +2387,7 @@ const SCREENS = runtimeSetting({
|
|
|
2387
2387
|
"package": "himalaya",
|
|
2388
2388
|
"type": "Text",
|
|
2389
2389
|
"props": {
|
|
2390
|
-
"text": "Orders, bookings,
|
|
2390
|
+
"text": "Orders, bookings, memberships and saved content in one place.",
|
|
2391
2391
|
"style": "body",
|
|
2392
2392
|
"color": "textSecondary"
|
|
2393
2393
|
}
|
|
@@ -3876,7 +3876,10 @@ const SCREENS = runtimeSetting({
|
|
|
3876
3876
|
"bottom": 28
|
|
3877
3877
|
},
|
|
3878
3878
|
"onAppear": {
|
|
3879
|
-
"actionId": "tier5.himiStoreAccount.refresh"
|
|
3879
|
+
"actionId": "tier5.himiStoreAccount.refresh",
|
|
3880
|
+
"params": {
|
|
3881
|
+
"copy": "{\"account.subtitle\":\"Orders, bookings, memberships and saved content in one place.\",\"storeAccount.authBody\":\"Sign in to continue — cart, bookings and memberships stay with you.\",\"storeAccount.authBodyRegister\":\"Create a member account to continue — cart, bookings and memberships stay with you.\"}"
|
|
3882
|
+
}
|
|
3880
3883
|
}
|
|
3881
3884
|
}
|
|
3882
3885
|
},
|
|
@@ -1958,7 +1958,7 @@ const SCREENS = runtimeSetting({
|
|
|
1958
1958
|
"verticals": "[\"feed\",\"events\",\"blog\",\"groups\",\"cms\"]",
|
|
1959
1959
|
"homeModules": "[{\"id\":\"saved\",\"label\":\"Saved on this device\",\"dataSource\":\"device.saved_items\",\"emptyWhen\":[\"noSavedContent\"]},{\"id\":\"section_0\",\"label\":\"Discover 1\",\"dataSource\":\"communityPulse.section0\",\"emptyWhen\":[\"noMemberAvatars\"]},{\"id\":\"section_1\",\"label\":\"Announcement\",\"dataSource\":\"communityPulse.section1\",\"emptyWhen\":[\"noAnnouncement\",\"noUpcomingEvents\"]},{\"id\":\"section_2\",\"label\":\"Groups\",\"dataSource\":\"communityPulse.section2\",\"emptyWhen\":[\"noGroupCards\"]},{\"id\":\"section_3\",\"label\":\"Latest activity\",\"dataSource\":\"communityPulse.section3\"}]",
|
|
1960
1960
|
"ownerDefaultLayout": "communityPulse",
|
|
1961
|
-
"copy": "{\"home.activityTitle\":\"Latest activity\",\"home.announcementCaption\":\"Announcement\",\"home.eventsTitle\":\"Upcoming events\",\"home.groupsSubtitle\":\"Find your people.\",\"home.groupsTitle\":\"Groups\",\"home.membersCaption\":\"Our members\",\"home.onboardingBody\":\"Join groups, RSVP to events, and keep up with the community feed — all in one place.\"}"
|
|
1961
|
+
"copy": "{\"home.activityTitle\":\"Latest activity\",\"home.announcementCaption\":\"Announcement\",\"home.eventsTitle\":\"Upcoming events\",\"home.groupsSubtitle\":\"Find your people.\",\"home.groupsTitle\":\"Groups\",\"home.membersCaption\":\"Our members\",\"home.onboardingBody\":\"Join groups, RSVP to events, and keep up with the community feed — all in one place.\",\"home.profileBody\":\"Sign in for RSVPs, groups and saved posts.\"}"
|
|
1962
1962
|
}
|
|
1963
1963
|
}
|
|
1964
1964
|
}
|
|
@@ -2009,7 +2009,7 @@ const SCREENS = runtimeSetting({
|
|
|
2009
2009
|
"package": "himalaya",
|
|
2010
2010
|
"type": "Text",
|
|
2011
2011
|
"props": {
|
|
2012
|
-
"text": "
|
|
2012
|
+
"text": "RSVPs, groups and saved content in one place.",
|
|
2013
2013
|
"style": "body",
|
|
2014
2014
|
"color": "textSecondary"
|
|
2015
2015
|
}
|
|
@@ -3145,7 +3145,10 @@ const SCREENS = runtimeSetting({
|
|
|
3145
3145
|
"bottom": 28
|
|
3146
3146
|
},
|
|
3147
3147
|
"onAppear": {
|
|
3148
|
-
"actionId": "tier5.himiStoreAccount.refresh"
|
|
3148
|
+
"actionId": "tier5.himiStoreAccount.refresh",
|
|
3149
|
+
"params": {
|
|
3150
|
+
"copy": "{\"account.subtitle\":\"RSVPs, groups and saved content in one place.\",\"storeAccount.authBody\":\"Sign in to continue — RSVPs and groups stay with you.\",\"storeAccount.authBodyRegister\":\"Create a member account to continue — RSVPs and groups stay with you.\"}"
|
|
3151
|
+
}
|
|
3149
3152
|
}
|
|
3150
3153
|
}
|
|
3151
3154
|
},
|
|
@@ -76662,6 +76662,48 @@ const TEMPLATED: { pattern: string; display: string; liveSeed?: LiveSeed; static
|
|
|
76662
76662
|
}
|
|
76663
76663
|
}
|
|
76664
76664
|
},
|
|
76665
|
+
{
|
|
76666
|
+
"id": "event_body",
|
|
76667
|
+
"body": {
|
|
76668
|
+
"package": "himalaya",
|
|
76669
|
+
"type": "RichContent",
|
|
76670
|
+
"props": {
|
|
76671
|
+
"documentJsonPath": "$service:himiOwnerLiteEvent.bodyJson",
|
|
76672
|
+
"onLink": {
|
|
76673
|
+
"actionId": "tier5.himiOwnerLiteEvent.openLink"
|
|
76674
|
+
},
|
|
76675
|
+
"fallback": {
|
|
76676
|
+
"id": "",
|
|
76677
|
+
"body": {
|
|
76678
|
+
"package": "himalaya",
|
|
76679
|
+
"type": "Text",
|
|
76680
|
+
"props": {
|
|
76681
|
+
"text": "$service:himiOwnerLiteEvent.bodyText",
|
|
76682
|
+
"style": "body",
|
|
76683
|
+
"color": "textPrimary",
|
|
76684
|
+
"collapseWhenEmpty": true
|
|
76685
|
+
}
|
|
76686
|
+
}
|
|
76687
|
+
}
|
|
76688
|
+
}
|
|
76689
|
+
}
|
|
76690
|
+
},
|
|
76691
|
+
{
|
|
76692
|
+
"id": "event_body_text",
|
|
76693
|
+
"body": {
|
|
76694
|
+
"package": "himalaya",
|
|
76695
|
+
"type": "Text",
|
|
76696
|
+
"props": {
|
|
76697
|
+
"text": "$service:himiOwnerLiteEvent.bodyText",
|
|
76698
|
+
"style": "body",
|
|
76699
|
+
"color": "textPrimary",
|
|
76700
|
+
"collapseWhenEmpty": true
|
|
76701
|
+
}
|
|
76702
|
+
},
|
|
76703
|
+
"modifiers": {
|
|
76704
|
+
"hiddenPath": "$service:himiOwnerLiteEvent.hasBodyJson"
|
|
76705
|
+
}
|
|
76706
|
+
},
|
|
76665
76707
|
{
|
|
76666
76708
|
"id": "event_info_card",
|
|
76667
76709
|
"body": {
|
|
@@ -77000,7 +77042,8 @@ const TEMPLATED: { pattern: string; display: string; liveSeed?: LiveSeed; static
|
|
|
77000
77042
|
"contentType": "application/javascript+ts-bundle",
|
|
77001
77043
|
"declaredCapabilities": [
|
|
77002
77044
|
"wix_api",
|
|
77003
|
-
"local_database"
|
|
77045
|
+
"local_database",
|
|
77046
|
+
"open_url"
|
|
77004
77047
|
],
|
|
77005
77048
|
"minBinaryVersion": "0.1.0",
|
|
77006
77049
|
"bundleVersion": "0.0.1"
|
|
@@ -11,7 +11,9 @@ import { normalizeEvent, eventDescription } from "../_shared/himi-events.js";
|
|
|
11
11
|
import { ownerLoadError, isBridgeUnavailable, isOwnerPreviewDemo, shouldQueueOwnerWrite } from "../_shared/owner-load-error.js";
|
|
12
12
|
import { DEMO_EVENTS, DEMO_NOTE, DEMO_SAVE_NOTE } from "../_shared/owner-preview-demo.js";
|
|
13
13
|
import { stashCopy, copyParam } from "../_shared/himi-copy.js";
|
|
14
|
-
import {
|
|
14
|
+
import { openRichLink } from "../_shared/rich-content-link.js";
|
|
15
|
+
import { richBody } from "../_shared/rich-body.js";
|
|
16
|
+
import { get as dbGet, upsert as dbUpsert, remove as dbRemove, enqueue as dbEnqueue, type DbEntity } from "../_shared/owner-local-db.js";
|
|
15
17
|
|
|
16
18
|
// Offline-first (data-offline): the event DETAIL falls back to the last-synced
|
|
17
19
|
// local `owner_events` row (put by the event form's write-behind) on a failed
|
|
@@ -20,6 +22,7 @@ import { get as dbGet, remove as dbRemove, enqueue as dbEnqueue, type DbEntity }
|
|
|
20
22
|
// ENQUEUED for replay on reconnect. Every local-db call is wrapped so a build
|
|
21
23
|
// without the `local_database` grant behaves exactly as before (online-only).
|
|
22
24
|
const ENTITY = "owner_events";
|
|
25
|
+
async function cachePut(row: DbEntity): Promise<void> { try { await dbUpsert(ENTITY, row); } catch { /* capability not granted */ } }
|
|
23
26
|
async function cacheDrop(id: string): Promise<void> { try { await dbRemove(ENTITY, id); } catch { /* capability not granted */ } }
|
|
24
27
|
async function cacheGet(id: string): Promise<DbEntity | null> { try { return await dbGet(ENTITY, id); } catch { return null; } }
|
|
25
28
|
async function queueWrite(actionId: string, params: Record<string, string>): Promise<void> { try { await dbEnqueue(actionId, params); } catch { /* capability not granted */ } }
|
|
@@ -33,6 +36,13 @@ interface EventState {
|
|
|
33
36
|
title: string;
|
|
34
37
|
subtitle: string;
|
|
35
38
|
summary: string;
|
|
39
|
+
// Body ([rico] #3499) — RichContent binds bodyJson; the plain text shows when there is no document.
|
|
40
|
+
/** The v3 Ricos `description` (read with `fields=TEXTS`) as ONE document string; "" when there is none. */
|
|
41
|
+
bodyJson: string;
|
|
42
|
+
/** bodyJson !== "" — gates the plain text, because RichContent draws nothing for "". */
|
|
43
|
+
hasBodyJson: boolean;
|
|
44
|
+
/** The description's plain text (the document's own text, else the legacy description). */
|
|
45
|
+
bodyText: string;
|
|
36
46
|
initial: string;
|
|
37
47
|
image: string;
|
|
38
48
|
dateLine: string;
|
|
@@ -55,6 +65,17 @@ interface EventState {
|
|
|
55
65
|
}
|
|
56
66
|
|
|
57
67
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
68
|
+
/** [rico] #3499 — keep the description's plain text with the event's cached row, so the offline detail shows it.
|
|
69
|
+
* Merged into the row the events list (or the form) wrote rather than replacing it; with no row yet, the
|
|
70
|
+
* loaded detail's own fields become one. */
|
|
71
|
+
async function cacheBodyText(s: EventState): Promise<void> {
|
|
72
|
+
if (s.status !== "ready" || !s.id) return;
|
|
73
|
+
const prev = await cacheGet(s.id);
|
|
74
|
+
await cachePut(prev ? { ...prev, bodyText: s.bodyText } : {
|
|
75
|
+
id: s.id, title: s.title, subtitle: s.subtitle, image: s.image, dateLine: s.dateLine, location: s.location,
|
|
76
|
+
statusLabel: s.statusLabel, registration: s.registration, bodyText: s.bodyText,
|
|
77
|
+
});
|
|
78
|
+
}
|
|
58
79
|
function idFrom(arg: unknown, fallback = ""): string {
|
|
59
80
|
return typeof arg === "string" ? arg : String((arg as any)?.id ?? fallback);
|
|
60
81
|
}
|
|
@@ -97,6 +118,9 @@ function shape(s: Partial<EventState>): EventState {
|
|
|
97
118
|
title: s.title ?? "",
|
|
98
119
|
subtitle: s.subtitle ?? "",
|
|
99
120
|
summary: s.summary ?? "",
|
|
121
|
+
bodyJson: s.bodyJson ?? "",
|
|
122
|
+
hasBodyJson: !!s.bodyJson,
|
|
123
|
+
bodyText: s.bodyText ?? "",
|
|
100
124
|
initial: s.initial ?? "?",
|
|
101
125
|
image,
|
|
102
126
|
dateLine: s.dateLine ?? "—",
|
|
@@ -128,7 +152,9 @@ function demoDetail(s: EventState, id: string): EventState | null {
|
|
|
128
152
|
status: "ready",
|
|
129
153
|
title: d.title,
|
|
130
154
|
subtitle: [d.dateLine, d.location].filter(Boolean).join(" · "),
|
|
131
|
-
summary:
|
|
155
|
+
summary: "",
|
|
156
|
+
bodyJson: "",
|
|
157
|
+
bodyText: d.description,
|
|
132
158
|
initial: (d.title[0] || "?").toUpperCase(),
|
|
133
159
|
image: "",
|
|
134
160
|
dateLine: d.dateLine,
|
|
@@ -151,7 +177,9 @@ function cachedDetail(s: EventState, row: DbEntity): EventState {
|
|
|
151
177
|
status: "ready",
|
|
152
178
|
title,
|
|
153
179
|
subtitle: String(row.subtitle ?? [dateLine, location].filter((x) => x && x !== "—").join(" · ")),
|
|
154
|
-
summary:
|
|
180
|
+
summary: "",
|
|
181
|
+
bodyJson: "",
|
|
182
|
+
bodyText: String(row.bodyText ?? row.summary ?? row.description ?? ""),
|
|
155
183
|
initial: String(row.initial ?? (title[0] || "?")).slice(0, 1).toUpperCase(),
|
|
156
184
|
image: String(row.image ?? ""),
|
|
157
185
|
dateLine: dateLine || "—",
|
|
@@ -164,21 +192,27 @@ function cachedDetail(s: EventState, row: DbEntity): EventState {
|
|
|
164
192
|
}
|
|
165
193
|
|
|
166
194
|
async function refresh(prev: EventState, id: string): Promise<EventState> {
|
|
167
|
-
|
|
195
|
+
// A bare read returns the base fieldset: DETAILS adds `shortDescription` (the teaser and the legacy body),
|
|
196
|
+
// TEXTS the Ricos `description`.
|
|
197
|
+
const res = await getEvent(id, { fields: ["DETAILS", "TEXTS"] });
|
|
168
198
|
const ev = (res.event ?? res) as WixEvent;
|
|
169
199
|
if (!ev || !(ev as any).id) {
|
|
170
200
|
return shape({ ...prev, id, status: "error", title: "", error: copyParam("ownerEvent.errorNotFound", "event not found") });
|
|
171
201
|
}
|
|
172
202
|
const row = normalizeEvent(ev); // reuses date/location/status normalization
|
|
173
203
|
const image = /^https?:\/\//.test(row.image) ? row.image : "";
|
|
174
|
-
const
|
|
204
|
+
const { bodyJson, bodyText } = richBody((ev as unknown as { description?: unknown }).description, (eventDescription(ev) || "").trim());
|
|
205
|
+
// The teaser stays above the body only when it says something the body does not.
|
|
206
|
+
const teaser = String((ev as any).shortDescription ?? "").trim();
|
|
175
207
|
return shape({
|
|
176
208
|
...prev,
|
|
177
209
|
id,
|
|
178
210
|
status: "ready",
|
|
179
211
|
title: row.title,
|
|
180
212
|
subtitle: [row.dateLine, row.location].filter((x) => x && x !== "—").join(" · "),
|
|
181
|
-
summary:
|
|
213
|
+
summary: teaser && teaser !== bodyText.trim() ? teaser : "",
|
|
214
|
+
bodyJson,
|
|
215
|
+
bodyText,
|
|
182
216
|
initial: (row.title[0] || "?").toUpperCase(),
|
|
183
217
|
image,
|
|
184
218
|
dateLine: row.dateLine || "—",
|
|
@@ -194,6 +228,7 @@ const svc = defineService<EventState, {
|
|
|
194
228
|
load: (s: EventState, arg?: unknown) => Promise<EventState>;
|
|
195
229
|
retry: (s: EventState) => Promise<EventState>;
|
|
196
230
|
delete: (s: EventState) => Promise<EventState>;
|
|
231
|
+
openLink: (s: EventState, arg?: unknown) => Promise<EventState>;
|
|
197
232
|
}>("himiOwnerLiteEvent", {
|
|
198
233
|
state: shape({ status: "loading" }),
|
|
199
234
|
actions: {
|
|
@@ -208,7 +243,9 @@ const svc = defineService<EventState, {
|
|
|
208
243
|
return shape({ ...s, status: "error", error: "Sample item not found." });
|
|
209
244
|
}
|
|
210
245
|
try {
|
|
211
|
-
|
|
246
|
+
const loaded = await refresh(shape({ ...s, id, status: "loading" }), id);
|
|
247
|
+
await cacheBodyText(loaded);
|
|
248
|
+
return loaded;
|
|
212
249
|
} catch (e) {
|
|
213
250
|
// Offline: fall back to the last-synced local row before the demo/error paths.
|
|
214
251
|
const cached = await cacheGet(id);
|
|
@@ -229,7 +266,9 @@ const svc = defineService<EventState, {
|
|
|
229
266
|
return shape({ ...s, status: "error", error: "Sample item not found." });
|
|
230
267
|
}
|
|
231
268
|
try {
|
|
232
|
-
|
|
269
|
+
const loaded = await refresh(shape({ ...s, status: "loading" }), s.id);
|
|
270
|
+
await cacheBodyText(loaded);
|
|
271
|
+
return loaded;
|
|
233
272
|
} catch (e) {
|
|
234
273
|
const cached = await cacheGet(s.id);
|
|
235
274
|
if (cached) return cachedDetail(s, cached);
|
|
@@ -256,6 +295,11 @@ const svc = defineService<EventState, {
|
|
|
256
295
|
return shape({ ...s, actionMessage: ownerLoadError(e) });
|
|
257
296
|
}
|
|
258
297
|
},
|
|
298
|
+
// [rico] #3499 — a link tapped in the RichContent description.
|
|
299
|
+
openLink: async (s, arg) => shape({
|
|
300
|
+
...s,
|
|
301
|
+
actionMessage: (await openRichLink(arg)) ? "" : copyParam("ownerEvent.linkOpenFailed", "This link could not be opened."),
|
|
302
|
+
}),
|
|
259
303
|
},
|
|
260
304
|
});
|
|
261
305
|
|
|
@@ -2142,7 +2142,7 @@ const SCREENS = runtimeSetting({
|
|
|
2142
2142
|
"verticals": "[\"feed\",\"events\",\"blog\",\"groups\"]",
|
|
2143
2143
|
"homeModules": "[{\"id\":\"saved\",\"label\":\"Saved on this device\",\"dataSource\":\"device.saved_items\",\"emptyWhen\":[\"noSavedContent\"]},{\"id\":\"section_0\",\"label\":\"Next up\",\"dataSource\":\"eventsFirst.section0\",\"emptyWhen\":[\"noNextEvent\"]},{\"id\":\"section_1\",\"label\":\"This season\",\"dataSource\":\"eventsFirst.section1\",\"emptyWhen\":[\"noUpcomingEvents\"]},{\"id\":\"section_2\",\"label\":\"Discover 3\",\"dataSource\":\"eventsFirst.section2\"},{\"id\":\"section_3\",\"label\":\"Latest from the community\",\"dataSource\":\"eventsFirst.section3\"}]",
|
|
2144
2144
|
"ownerDefaultLayout": "eventsFirst",
|
|
2145
|
-
"copy": "{\"home.activityTitle\":\"Latest from the community\",\"home.agendaTitle\":\"This season\",\"home.allEventsCta\":\"All events\",\"home.eventsTitle\":\"Upcoming events\",\"home.groupsSubtitle\":\"Find your crew.\",\"home.groupsTitle\":\"Groups\",\"home.membersCaption\":\"Who's coming\",\"home.nextUpCaption\":\"Next up\",\"home.onboardingBody\":\"See what's next, RSVP in a couple of taps, and keep up with the community between events — all in one place.\",\"home.recapsCaption\":\"Event recaps\",\"home.rsvpCta\":\"View event & RSVP\"}"
|
|
2145
|
+
"copy": "{\"home.activityTitle\":\"Latest from the community\",\"home.agendaTitle\":\"This season\",\"home.allEventsCta\":\"All events\",\"home.eventsTitle\":\"Upcoming events\",\"home.groupsSubtitle\":\"Find your crew.\",\"home.groupsTitle\":\"Groups\",\"home.membersCaption\":\"Who's coming\",\"home.nextUpCaption\":\"Next up\",\"home.onboardingBody\":\"See what's next, RSVP in a couple of taps, and keep up with the community between events — all in one place.\",\"home.profileBody\":\"Sign in for RSVPs, groups and saved posts.\",\"home.recapsCaption\":\"Event recaps\",\"home.rsvpCta\":\"View event & RSVP\"}"
|
|
2146
2146
|
}
|
|
2147
2147
|
}
|
|
2148
2148
|
}
|
|
@@ -2193,7 +2193,7 @@ const SCREENS = runtimeSetting({
|
|
|
2193
2193
|
"package": "himalaya",
|
|
2194
2194
|
"type": "Text",
|
|
2195
2195
|
"props": {
|
|
2196
|
-
"text": "
|
|
2196
|
+
"text": "RSVPs, groups and saved content in one place.",
|
|
2197
2197
|
"style": "body",
|
|
2198
2198
|
"color": "textSecondary"
|
|
2199
2199
|
}
|
|
@@ -3329,7 +3329,10 @@ const SCREENS = runtimeSetting({
|
|
|
3329
3329
|
"bottom": 28
|
|
3330
3330
|
},
|
|
3331
3331
|
"onAppear": {
|
|
3332
|
-
"actionId": "tier5.himiStoreAccount.refresh"
|
|
3332
|
+
"actionId": "tier5.himiStoreAccount.refresh",
|
|
3333
|
+
"params": {
|
|
3334
|
+
"copy": "{\"account.subtitle\":\"RSVPs, groups and saved content in one place.\",\"storeAccount.authBody\":\"Sign in to continue — RSVPs and groups stay with you.\",\"storeAccount.authBodyRegister\":\"Create a member account to continue — RSVPs and groups stay with you.\"}"
|
|
3335
|
+
}
|
|
3333
3336
|
}
|
|
3334
3337
|
}
|
|
3335
3338
|
},
|
|
@@ -68631,6 +68631,48 @@ const TEMPLATED: { pattern: string; display: string; liveSeed?: LiveSeed; static
|
|
|
68631
68631
|
}
|
|
68632
68632
|
}
|
|
68633
68633
|
},
|
|
68634
|
+
{
|
|
68635
|
+
"id": "event_body",
|
|
68636
|
+
"body": {
|
|
68637
|
+
"package": "himalaya",
|
|
68638
|
+
"type": "RichContent",
|
|
68639
|
+
"props": {
|
|
68640
|
+
"documentJsonPath": "$service:himiOwnerLiteEvent.bodyJson",
|
|
68641
|
+
"onLink": {
|
|
68642
|
+
"actionId": "tier5.himiOwnerLiteEvent.openLink"
|
|
68643
|
+
},
|
|
68644
|
+
"fallback": {
|
|
68645
|
+
"id": "",
|
|
68646
|
+
"body": {
|
|
68647
|
+
"package": "himalaya",
|
|
68648
|
+
"type": "Text",
|
|
68649
|
+
"props": {
|
|
68650
|
+
"text": "$service:himiOwnerLiteEvent.bodyText",
|
|
68651
|
+
"style": "body",
|
|
68652
|
+
"color": "textPrimary",
|
|
68653
|
+
"collapseWhenEmpty": true
|
|
68654
|
+
}
|
|
68655
|
+
}
|
|
68656
|
+
}
|
|
68657
|
+
}
|
|
68658
|
+
}
|
|
68659
|
+
},
|
|
68660
|
+
{
|
|
68661
|
+
"id": "event_body_text",
|
|
68662
|
+
"body": {
|
|
68663
|
+
"package": "himalaya",
|
|
68664
|
+
"type": "Text",
|
|
68665
|
+
"props": {
|
|
68666
|
+
"text": "$service:himiOwnerLiteEvent.bodyText",
|
|
68667
|
+
"style": "body",
|
|
68668
|
+
"color": "textPrimary",
|
|
68669
|
+
"collapseWhenEmpty": true
|
|
68670
|
+
}
|
|
68671
|
+
},
|
|
68672
|
+
"modifiers": {
|
|
68673
|
+
"hiddenPath": "$service:himiOwnerLiteEvent.hasBodyJson"
|
|
68674
|
+
}
|
|
68675
|
+
},
|
|
68634
68676
|
{
|
|
68635
68677
|
"id": "event_info_card",
|
|
68636
68678
|
"body": {
|
|
@@ -68969,7 +69011,8 @@ const TEMPLATED: { pattern: string; display: string; liveSeed?: LiveSeed; static
|
|
|
68969
69011
|
"contentType": "application/javascript+ts-bundle",
|
|
68970
69012
|
"declaredCapabilities": [
|
|
68971
69013
|
"wix_api",
|
|
68972
|
-
"local_database"
|
|
69014
|
+
"local_database",
|
|
69015
|
+
"open_url"
|
|
68973
69016
|
],
|
|
68974
69017
|
"minBinaryVersion": "0.1.0",
|
|
68975
69018
|
"bundleVersion": "0.0.1"
|