@wix/himalaya-cli 0.1559.0 → 0.1561.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/builder.d.ts +3 -1
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/ts/src/schema.d.ts +2 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/events/src/index.d.ts +60 -7
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/wix-events.mjs +11 -5
- package/dist/cli.mjs +191 -60
- package/dist/preview-assets.generated.bin +0 -0
- package/guides/component-reference.json +3 -2
- package/guides/component-reference.md +3 -1
- package/guides/one-app-to-himi-app.md +30 -5
- package/guides/sdk-reference.json +7 -7
- package/package.json +2 -2
- package/templates/beauty-salon/tier5-src/_shared/engine-intl.ts +18 -0
- package/templates/beauty-salon/tier5-src/_shared/himi-events.ts +7 -0
- package/templates/beauty-salon-owner/tier5-src/_shared/engine-intl.ts +18 -0
- package/templates/beauty-salon-owner/tier5-src/_shared/himi-events.ts +7 -0
- package/templates/branded-lite/dev/index.ts +2390 -851
- package/templates/branded-lite/himalaya.content.json +1 -1
- package/templates/branded-lite/tier5-src/_shared/engine-intl.ts +18 -0
- package/templates/branded-lite/tier5-src/_shared/himi-events.ts +7 -0
- package/templates/branded-lite/tier5-src/himi-events-detail/index.ts +803 -361
- package/templates/community-club/dev/index.ts +2387 -848
- package/templates/community-club/himalaya.content.json +1 -1
- package/templates/community-club/tier5-src/_shared/engine-intl.ts +18 -0
- package/templates/community-club/tier5-src/_shared/himi-events.ts +7 -0
- package/templates/community-club/tier5-src/himi-events-detail/index.ts +803 -361
- package/templates/community-club-owner/tier5-src/_shared/engine-intl.ts +18 -0
- package/templates/community-club-owner/tier5-src/_shared/himi-events.ts +7 -0
- package/templates/events-meetups/dev/index.ts +2387 -848
- package/templates/events-meetups/himalaya.content.json +1 -1
- package/templates/events-meetups/tier5-src/_shared/engine-intl.ts +18 -0
- package/templates/events-meetups/tier5-src/_shared/himi-events.ts +7 -0
- package/templates/events-meetups/tier5-src/himi-events-detail/index.ts +803 -361
- package/templates/events-meetups-owner/tier5-src/_shared/engine-intl.ts +18 -0
- package/templates/events-meetups-owner/tier5-src/_shared/himi-events.ts +7 -0
- package/templates/gym-fitness/dev/index.ts +2392 -853
- package/templates/gym-fitness/himalaya.content.json +1 -1
- package/templates/gym-fitness/tier5-src/_shared/engine-intl.ts +18 -0
- package/templates/gym-fitness/tier5-src/_shared/himi-events.ts +7 -0
- package/templates/gym-fitness/tier5-src/himi-events-detail/index.ts +803 -361
- package/templates/gym-fitness-owner/tier5-src/_shared/engine-intl.ts +18 -0
- package/templates/gym-fitness-owner/tier5-src/_shared/himi-events.ts +7 -0
- package/templates/nonprofit-cause/dev/index.ts +2387 -848
- package/templates/nonprofit-cause/himalaya.content.json +1 -1
- package/templates/nonprofit-cause/tier5-src/_shared/engine-intl.ts +18 -0
- package/templates/nonprofit-cause/tier5-src/_shared/himi-events.ts +7 -0
- package/templates/nonprofit-cause/tier5-src/himi-events-detail/index.ts +803 -361
- package/templates/nonprofit-cause-owner/tier5-src/_shared/engine-intl.ts +18 -0
- package/templates/nonprofit-cause-owner/tier5-src/_shared/himi-events.ts +7 -0
- package/templates/owner-lite/tier5-src/_shared/engine-intl.ts +18 -0
- package/templates/owner-lite/tier5-src/_shared/himi-events.ts +7 -0
- package/templates/podcast-creator/dev/index.ts +2388 -849
- package/templates/podcast-creator/himalaya.content.json +1 -1
- package/templates/podcast-creator/tier5-src/_shared/engine-intl.ts +18 -0
- package/templates/podcast-creator/tier5-src/_shared/himi-events.ts +7 -0
- package/templates/podcast-creator/tier5-src/himi-events-detail/index.ts +803 -361
- package/templates/podcast-creator-owner/tier5-src/_shared/engine-intl.ts +18 -0
- package/templates/podcast-creator-owner/tier5-src/_shared/himi-events.ts +7 -0
- package/templates/portfolio-creative/dev/index.ts +2375 -836
- package/templates/portfolio-creative/himalaya.content.json +1 -1
- package/templates/portfolio-creative/tier5-src/_shared/engine-intl.ts +18 -0
- package/templates/portfolio-creative/tier5-src/_shared/himi-events.ts +7 -0
- package/templates/portfolio-creative/tier5-src/himi-events-detail/index.ts +803 -361
- package/templates/portfolio-creative-owner/tier5-src/_shared/engine-intl.ts +18 -0
- package/templates/portfolio-creative-owner/tier5-src/_shared/himi-events.ts +7 -0
- package/templates/restaurant/dev/index.ts +2388 -849
- package/templates/restaurant/himalaya.content.json +1 -1
- package/templates/restaurant/tier5-src/_shared/engine-intl.ts +18 -0
- package/templates/restaurant/tier5-src/_shared/himi-events.ts +7 -0
- package/templates/restaurant/tier5-src/himi-events-detail/index.ts +803 -361
- package/templates/restaurant-owner/tier5-src/_shared/engine-intl.ts +18 -0
- package/templates/restaurant-owner/tier5-src/_shared/himi-events.ts +7 -0
- package/templates/retail-store/tier5-src/_shared/engine-intl.ts +18 -0
- package/templates/retail-store/tier5-src/_shared/himi-events.ts +7 -0
- package/templates/retail-store-owner/tier5-src/_shared/engine-intl.ts +18 -0
- package/templates/retail-store-owner/tier5-src/_shared/himi-events.ts +7 -0
- package/templates/yoga-studio/dev/index.ts +2403 -864
- package/templates/yoga-studio/himalaya.content.json +1 -1
- package/templates/yoga-studio/tier5-src/_shared/engine-intl.ts +18 -0
- package/templates/yoga-studio/tier5-src/_shared/himi-events.ts +7 -0
- package/templates/yoga-studio/tier5-src/himi-events-detail/index.ts +803 -361
- package/templates/yoga-studio-owner/tier5-src/_shared/engine-intl.ts +18 -0
- package/templates/yoga-studio-owner/tier5-src/_shared/himi-events.ts +7 -0
|
Binary file
|
|
@@ -238,7 +238,8 @@
|
|
|
238
238
|
"category": "Core",
|
|
239
239
|
"propsType": "StepperProps",
|
|
240
240
|
"bindings": [
|
|
241
|
-
"valuePath"
|
|
241
|
+
"valuePath",
|
|
242
|
+
"maxPath"
|
|
242
243
|
],
|
|
243
244
|
"dispatches": [
|
|
244
245
|
{
|
|
@@ -259,7 +260,7 @@
|
|
|
259
260
|
]
|
|
260
261
|
}
|
|
261
262
|
],
|
|
262
|
-
"propsSource": "export interface StepperProps {\n value: number;\n /** `$service:`/`$item.` binding → a live integer (overrides `value`). */\n valuePath?: string;\n min?: number;\n max?: number;\n onChange?: Action;\n /** \"plain\" draws exposed minus/value/plus controls; absent uses the default capsule. */\n presentation?: \"plain\";\n}"
|
|
263
|
+
"propsSource": "export interface StepperProps {\n value: number;\n /** `$service:`/`$item.` binding → a live integer (overrides `value`). */\n valuePath?: string;\n min?: number;\n max?: number;\n /** `$service:`/`$item.` binding → integer maximum, overrides `max`. */\n maxPath?: string;\n onChange?: Action;\n /** \"plain\" draws exposed minus/value/plus controls; absent uses the default capsule. */\n presentation?: \"plain\";\n}"
|
|
263
264
|
},
|
|
264
265
|
{
|
|
265
266
|
"name": "Avatar",
|
|
@@ -44,7 +44,7 @@ See also **[Modifiers](#modifiers)** (the `modifiers` block) and **[Actions](#ac
|
|
|
44
44
|
| `Button` | Core | `disabledPath`, `title` |
|
|
45
45
|
| `TextField` | Core | `valuePath`, `focusPath`, `errorPath` |
|
|
46
46
|
| `Toggle` | Core | `valuePath` |
|
|
47
|
-
| `Stepper` | Core | `valuePath` |
|
|
47
|
+
| `Stepper` | Core | `valuePath`, `maxPath` |
|
|
48
48
|
| `Avatar` | Core | `imageUrl`, `initials` |
|
|
49
49
|
| `Badge` | Core | `tokenPath`, `text` |
|
|
50
50
|
| `Tag` | Core | `tokenPath`, `text` |
|
|
@@ -684,6 +684,8 @@ export interface StepperProps {
|
|
|
684
684
|
valuePath?: string;
|
|
685
685
|
min?: number;
|
|
686
686
|
max?: number;
|
|
687
|
+
/** `$service:`/`$item.` binding → integer maximum, overrides `max`. */
|
|
688
|
+
maxPath?: string;
|
|
687
689
|
onChange?: Action;
|
|
688
690
|
/** "plain" draws exposed minus/value/plus controls; absent uses the default capsule. */
|
|
689
691
|
presentation?: "plain";
|
|
@@ -163,20 +163,45 @@ Apply these interpretation rules:
|
|
|
163
163
|
a feature to account for; they do not alone prove visibility or access for every
|
|
164
164
|
visitor or member. Resolve those rules separately. This check is specific to this
|
|
165
165
|
migration workflow; it does not change the behavior of `himi validate`.
|
|
166
|
-
-
|
|
166
|
+
- Apply the collected app theme before the first build: run
|
|
167
|
+
`himi one-app validate-design --evidence-dir .himi/one-app --content . --fix`,
|
|
168
|
+
resolve any remaining mismatches/unresolved values, then rebuild. The source is
|
|
169
|
+
`settings.theme`, not the website or the starter template. Before publishing,
|
|
170
|
+
run the migration-only design check:
|
|
167
171
|
`himi one-app validate-design --evidence-dir .himi/one-app --content .`.
|
|
168
172
|
It resolves the effective source theme with the reader the source app instance
|
|
169
|
-
actually uses, then compares the resolved primary, background and content colors
|
|
170
|
-
|
|
173
|
+
actually uses, then compares the resolved primary, background and content colors,
|
|
174
|
+
each button's `borderRadius` and `outlineWidth`, and resolved heading/body font families
|
|
175
|
+
against the app's `tokens.json`.
|
|
171
176
|
Hex case and shorthand are normalized; an absent button token is compared with the
|
|
172
177
|
value the renderer draws (an outline only on `secondary`; a radius of `radius.pill`,
|
|
173
178
|
else 24), not called a difference. A variant without its own radius must draw the
|
|
174
179
|
source radius at every Button size. A descriptor's per-button `cornerRadius` overrides
|
|
175
|
-
the tokens and is not checked
|
|
180
|
+
the tokens and is not checked; descriptor/control-specific fill and label overrides
|
|
181
|
+
also need a rendered check. `--fix` writes the mismatching source values into
|
|
176
182
|
`tokens.json` and pins the dark and high-contrast schemes to what they drew before,
|
|
177
183
|
because a missing scheme falls back to the light value. Rebuild after `--fix`.
|
|
184
|
+
For Branded apps, known source typography IDs (for example `lato`) become family
|
|
185
|
+
names (`Lato`); tokens whose names contain title/heading/headline/display/hero use the heading family; other
|
|
186
|
+
typography tokens use the body family. Numeric metrics stay unchanged. Unknown IDs,
|
|
187
|
+
families outside the Himi font catalog, and missing target typography roles remain unresolved; resolve them before recording
|
|
188
|
+
a pass, even when the coverage ledger cites an adaptation. A deliberate difference
|
|
189
|
+
between resolved font roles can still be adapted. Build/font validation still has
|
|
190
|
+
to prove the font bytes are available. Unresolved fonts and contrast also fail
|
|
191
|
+
the plain check used by push, not only `--record`.
|
|
192
|
+
Branded accent text must reach 4.5:1: `textOnAccent` against the fill, and `accentText` against the target page and declared neutral
|
|
193
|
+
surfaces. `--fix` chooses readable ink and derives a same-hue text shade while
|
|
194
|
+
retaining the exact source accent fill. For example, `#D6BD07` needs dark labels;
|
|
195
|
+
`#7A6C00` is a readable accent text shade on white. Translucent target colors cannot earn
|
|
196
|
+
an opaque contrast claim; an explicitly adapted source color still needs independently
|
|
197
|
+
readable opaque target roles. Author `surfacePrimary` explicitly when absent: native
|
|
198
|
+
hosts do not share the web's white page fallback. Conflicting page/card backdrops with no derived shade
|
|
199
|
+
that clears every surface stay unresolved; use separate local text roles. A missing
|
|
200
|
+
or translucent target accent palette must be authored explicitly before `--fix`,
|
|
201
|
+
because its non-light appearance cannot be preserved safely. Source `system` font
|
|
202
|
+
IDs use the portable `$system` sentinel. Contrast failures cannot be waived by a ledger adaptation.
|
|
178
203
|
The report names every theme pointer the check did not compare, including typography
|
|
179
|
-
|
|
204
|
+
kit IDs and any button `uppercase`, which Himi tokens cannot carry; resolve those
|
|
180
205
|
explicitly rather than treating a pass as full design parity. A deliberate difference
|
|
181
206
|
is waived only by a `design` coverage row with status `adapted` that cites the user's
|
|
182
207
|
instruction and explains the change. This check compares values, not rendered screens.
|
|
@@ -18428,7 +18428,7 @@
|
|
|
18428
18428
|
"name": "WixEventFieldset",
|
|
18429
18429
|
"kind": "type",
|
|
18430
18430
|
"jsdoc": "/** Events v3 response fieldsets (`RequestedFields`). A bare read returns the base fieldset;\n * each value adds fields: `DETAILS` → `shortDescription`, `mainImage`, `calendarUrls`;\n * `TEXTS` → the Ricos `description`; `REGISTRATION` → `registration`; `URLS` → `eventPageUrl`;\n * `FORM` → `form`, the published registration controls and inputs. */",
|
|
18431
|
-
"decl": "export type WixEventFieldset = \"DETAILS\" | \"TEXTS\" | \"REGISTRATION\" | \"URLS\" | \"FORM\";"
|
|
18431
|
+
"decl": "export type WixEventFieldset = \"DETAILS\" | \"TEXTS\" | \"REGISTRATION\" | \"URLS\" | \"FORM\" | \"AGENDA\";"
|
|
18432
18432
|
},
|
|
18433
18433
|
{
|
|
18434
18434
|
"name": "WixEventRichContent",
|
|
@@ -18439,7 +18439,7 @@
|
|
|
18439
18439
|
{
|
|
18440
18440
|
"name": "getEvent",
|
|
18441
18441
|
"kind": "function",
|
|
18442
|
-
"jsdoc": "/** Get one event — GET /events/v3/events/{eventId}. Response wraps as `{ event }`.\n *
|
|
18442
|
+
"jsdoc": "/** Get one event — GET /events/v3/events/{eventId}. Response wraps as `{ event }`.\n * This GET returns the Events v3 BASE fieldset, which is slimmer than `queryEvents`;\n * fields such as `registration` and `calendarUrls` are absent from a bare `getEvent`.\n * Use `opts.fields` to request fieldsets such as `DETAILS`, `TEXTS`, `REGISTRATION`,\n * `URLS`, `FORM`, and `AGENDA` when a one-event read needs them. */",
|
|
18443
18443
|
"decl": "export async function getEvent(eventId: string, opts: { fields?: WixEventFieldset[] } = {}, readOptions?: WixCallOptions): Promise<WixGetEventResponse>;",
|
|
18444
18444
|
"http": "GET /events/v3/events/{…}{…}"
|
|
18445
18445
|
},
|
|
@@ -18535,7 +18535,7 @@
|
|
|
18535
18535
|
"name": "WixAvailableTicket",
|
|
18536
18536
|
"kind": "interface",
|
|
18537
18537
|
"jsdoc": "",
|
|
18538
|
-
"decl": "export interface WixAvailableTicket {\n id?: string;\n eventId?: string;\n name?: string;\n description?: string;\n price?: WixTicketPrice;\n free?: boolean;\n limitPerCheckout?: number;\n orderIndex?: number;\n saleStatus?: string;\n state?: string[];\n pricing?: { pricingType?: string; fixedPrice?: WixTicketPrice };\n dashboard?: { hidden?: boolean };\n}"
|
|
18538
|
+
"decl": "export interface WixAvailableTicket {\n id?: string;\n eventId?: string;\n name?: string;\n description?: string;\n price?: WixTicketPrice;\n free?: boolean;\n limitPerCheckout?: number;\n orderIndex?: number;\n saleStatus?: string;\n salesDetails?: { unsoldCount?: number; soldCount?: number; reservedCount?: number; soldOut?: boolean };\n salePeriod?: { startDate?: string; endDate?: string };\n state?: string[];\n pricing?: { pricingType?: string; fixedPrice?: WixTicketPrice };\n pricingOptions?: Array<{ id?: string; optionId?: string; name?: string; price?: { amount?: string; value?: string; currency?: string } }>;\n pricingMethod?: { type?: string; pricingType?: string; free?: boolean; fixedPrice?: { value?: string; currency?: string }; guestPrice?: { value?: string; currency?: string }; pricingOptions?: { optionDetails?: Array<{ id?: string; optionId?: string; name?: string; price?: { amount?: string; value?: string; currency?: string } }> } };\n policy?: string;\n policyText?: string;\n wixFeeConfig?: { type?: string };\n dashboard?: { hidden?: boolean };\n}"
|
|
18539
18539
|
},
|
|
18540
18540
|
{
|
|
18541
18541
|
"name": "WixQueryAvailableTicketsResponse",
|
|
@@ -18555,7 +18555,7 @@
|
|
|
18555
18555
|
"name": "WixTicketQuantity",
|
|
18556
18556
|
"kind": "interface",
|
|
18557
18557
|
"jsdoc": "/** One tier's ask in a reservation — `{ticketDefinitionId, quantity}`. */",
|
|
18558
|
-
"decl": "export interface WixTicketQuantity {\n ticketDefinitionId: string;\n quantity: number;\n}"
|
|
18558
|
+
"decl": "export interface WixTicketQuantity {\n ticketDefinitionId: string;\n quantity: number;\n priceOverride?: string;\n ticketDetails?: Array<{ pricingOptionId?: string }>;\n}"
|
|
18559
18559
|
},
|
|
18560
18560
|
{
|
|
18561
18561
|
"name": "WixReservationInvoice",
|
|
@@ -18590,9 +18590,9 @@
|
|
|
18590
18590
|
{
|
|
18591
18591
|
"name": "queryAvailableTickets",
|
|
18592
18592
|
"kind": "function",
|
|
18593
|
-
"jsdoc": "/** Buyer-visible ticket tiers for an event —
|
|
18594
|
-
"decl": "export function queryAvailableTickets(eventId: string, limit = 100): Promise<WixQueryAvailableTicketsResponse>;",
|
|
18595
|
-
"http": "POST /events/
|
|
18593
|
+
"jsdoc": "/** Buyer-visible ticket tiers for an event — visitor-readable Events ticket definitions v3. */",
|
|
18594
|
+
"decl": "export async function queryAvailableTickets(eventId: string, limit = 100): Promise<WixQueryAvailableTicketsResponse>;",
|
|
18595
|
+
"http": "POST /events-ticket-definitions/v3/ticket-definitions/available/query"
|
|
18596
18596
|
},
|
|
18597
18597
|
{
|
|
18598
18598
|
"name": "createTicketReservation",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wix/himalaya-cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.1561.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": [
|
|
@@ -71,5 +71,5 @@
|
|
|
71
71
|
"artifactId": "himalaya-cli"
|
|
72
72
|
}
|
|
73
73
|
},
|
|
74
|
-
"falconPackageHash": "
|
|
74
|
+
"falconPackageHash": "218dfa6fb52b7f6f3cd393536b9c163e3928bdf54eeb2c0020520fa5"
|
|
75
75
|
}
|
|
@@ -486,3 +486,21 @@ export function zoneOffsetAt(at: number, timeZone: string): number {
|
|
|
486
486
|
}
|
|
487
487
|
return NaN;
|
|
488
488
|
}
|
|
489
|
+
|
|
490
|
+
/** Long zone label plus its short offset, e.g. "Israel Standard Time (GMT+2)". An engine
|
|
491
|
+
* without ECMA-402 has no zone database, so callers omit the supplementary label there. */
|
|
492
|
+
export function formatTimeZoneLabel(date: Date, timeZone: string, locale = "en"): string {
|
|
493
|
+
if (hasIntl()) {
|
|
494
|
+
if (!timeZone) return "";
|
|
495
|
+
try {
|
|
496
|
+
const parts = new Intl.DateTimeFormat(locale, { timeZone, timeZoneName: "long" }).formatToParts(date);
|
|
497
|
+
const name = parts.find((part) => part.type === "timeZoneName")?.value || timeZone;
|
|
498
|
+
const offset = new Intl.DateTimeFormat(locale, { timeZone, timeZoneName: "shortOffset" })
|
|
499
|
+
.formatToParts(date).find((part) => part.type === "timeZoneName")?.value;
|
|
500
|
+
return offset ? `${name} (${offset.replace(/:00$/, "")})` : name;
|
|
501
|
+
} catch {
|
|
502
|
+
return timeZone;
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
return "";
|
|
506
|
+
}
|
|
@@ -56,3 +56,10 @@ export function rememberRsvp(eventId: string): void {
|
|
|
56
56
|
const next = [eventId, ...ids.filter((id) => id !== eventId)].slice(0, 50);
|
|
57
57
|
try { storage()?.setItem(RSVP_KEY, JSON.stringify(next)); } catch { /* best-effort */ }
|
|
58
58
|
}
|
|
59
|
+
|
|
60
|
+
/** Remove a locally confirmed RSVP after Wix confirms its cancellation. */
|
|
61
|
+
export function forgetRsvp(eventId: string): void {
|
|
62
|
+
if (!eventId) return;
|
|
63
|
+
const next = confirmedRsvpIds().filter((id) => id !== eventId);
|
|
64
|
+
try { storage()?.setItem(RSVP_KEY, JSON.stringify(next)); } catch { /* best-effort */ }
|
|
65
|
+
}
|
|
@@ -486,3 +486,21 @@ export function zoneOffsetAt(at: number, timeZone: string): number {
|
|
|
486
486
|
}
|
|
487
487
|
return NaN;
|
|
488
488
|
}
|
|
489
|
+
|
|
490
|
+
/** Long zone label plus its short offset, e.g. "Israel Standard Time (GMT+2)". An engine
|
|
491
|
+
* without ECMA-402 has no zone database, so callers omit the supplementary label there. */
|
|
492
|
+
export function formatTimeZoneLabel(date: Date, timeZone: string, locale = "en"): string {
|
|
493
|
+
if (hasIntl()) {
|
|
494
|
+
if (!timeZone) return "";
|
|
495
|
+
try {
|
|
496
|
+
const parts = new Intl.DateTimeFormat(locale, { timeZone, timeZoneName: "long" }).formatToParts(date);
|
|
497
|
+
const name = parts.find((part) => part.type === "timeZoneName")?.value || timeZone;
|
|
498
|
+
const offset = new Intl.DateTimeFormat(locale, { timeZone, timeZoneName: "shortOffset" })
|
|
499
|
+
.formatToParts(date).find((part) => part.type === "timeZoneName")?.value;
|
|
500
|
+
return offset ? `${name} (${offset.replace(/:00$/, "")})` : name;
|
|
501
|
+
} catch {
|
|
502
|
+
return timeZone;
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
return "";
|
|
506
|
+
}
|
|
@@ -56,3 +56,10 @@ export function rememberRsvp(eventId: string): void {
|
|
|
56
56
|
const next = [eventId, ...ids.filter((id) => id !== eventId)].slice(0, 50);
|
|
57
57
|
try { storage()?.setItem(RSVP_KEY, JSON.stringify(next)); } catch { /* best-effort */ }
|
|
58
58
|
}
|
|
59
|
+
|
|
60
|
+
/** Remove a locally confirmed RSVP after Wix confirms its cancellation. */
|
|
61
|
+
export function forgetRsvp(eventId: string): void {
|
|
62
|
+
if (!eventId) return;
|
|
63
|
+
const next = confirmedRsvpIds().filter((id) => id !== eventId);
|
|
64
|
+
try { storage()?.setItem(RSVP_KEY, JSON.stringify(next)); } catch { /* best-effort */ }
|
|
65
|
+
}
|