@wix/himalaya-cli 0.1576.0 → 0.1578.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/sdk/clipboard/src/index.d.ts +32 -1
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/sdk/haptic/src/index.d.ts +69 -5
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/sdk/sdk-types/src/capabilities.generated.d.ts +2 -2
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/sdk/ui/src/index.d.ts +19 -2
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/ts/src/define-app.d.ts +6 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/loyalty/src/index.d.ts +64 -6
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/online-programs/src/index.d.ts +87 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/audio-record.mjs +2 -2
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/calendar.mjs +2 -2
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/calls.mjs +2 -2
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/clipboard.mjs +58 -1
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/contacts.mjs +2 -2
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/haptic.mjs +73 -4
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/location.mjs +2 -2
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/motion.mjs +2 -2
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/photos.mjs +2 -2
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/sdk-types.mjs +2 -2
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/tasks.mjs +2 -2
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/ui.mjs +5 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/wix-loyalty.mjs +15 -3
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/wix-online-programs.mjs +42 -0
- package/dist/cli.mjs +7245 -6889
- package/dist/preview-assets.generated.bin +0 -0
- package/fixtures/wix-canned.json +56 -3
- package/guides/one-app-section-mappings.md +1 -1
- package/guides/one-app-to-himi-app.md +50 -1
- package/guides/qa-builds.md +14 -6
- package/guides/sdk-reference.json +249 -17
- package/guides/web-page-sdk-reference.md +2 -2
- package/package.json +2 -2
- package/templates/beauty-salon/tier5-src/_shared/branded-lite-hosted.ts +1 -0
- package/templates/beauty-salon/tier5-src/_shared/owner-load-error.ts +8 -0
- package/templates/beauty-salon-owner/dev/index.ts +52 -27
- package/templates/beauty-salon-owner/tier5-src/_shared/owner-load-error.ts +8 -0
- package/templates/beauty-salon-owner/tier5-src/himi-owner-lite-post/index.ts +20 -8
- package/templates/branded-lite/config.ts +7 -0
- package/templates/branded-lite/dev/index.ts +833 -0
- package/templates/branded-lite/himalaya.content.json +3 -0
- package/templates/branded-lite/l10n/en.json +4 -2
- package/templates/branded-lite/tier5-src/_shared/branded-lite-hosted.ts +1 -0
- package/templates/branded-lite/tier5-src/_shared/owner-load-error.ts +8 -0
- package/templates/branded-lite/tier5-src/himi-branded-lite-member-programs/index.ts +658 -0
- package/templates/community-club/tier5-src/_shared/branded-lite-hosted.ts +1 -0
- package/templates/community-club/tier5-src/_shared/owner-load-error.ts +8 -0
- package/templates/community-club-owner/dev/index.ts +52 -27
- package/templates/community-club-owner/tier5-src/_shared/owner-load-error.ts +8 -0
- package/templates/community-club-owner/tier5-src/himi-owner-lite-post/index.ts +20 -8
- package/templates/events-meetups/tier5-src/_shared/branded-lite-hosted.ts +1 -0
- package/templates/events-meetups/tier5-src/_shared/owner-load-error.ts +8 -0
- package/templates/events-meetups-owner/dev/index.ts +52 -27
- package/templates/events-meetups-owner/tier5-src/_shared/owner-load-error.ts +8 -0
- package/templates/events-meetups-owner/tier5-src/himi-owner-lite-post/index.ts +20 -8
- package/templates/gym-fitness/tier5-src/_shared/branded-lite-hosted.ts +1 -0
- package/templates/gym-fitness/tier5-src/_shared/owner-load-error.ts +8 -0
- package/templates/gym-fitness-owner/dev/index.ts +52 -27
- package/templates/gym-fitness-owner/tier5-src/_shared/owner-load-error.ts +8 -0
- package/templates/gym-fitness-owner/tier5-src/himi-owner-lite-post/index.ts +20 -8
- package/templates/himi-chat/tier5-src/_shared/owner-load-error.ts +8 -0
- package/templates/nonprofit-cause/tier5-src/_shared/branded-lite-hosted.ts +1 -0
- package/templates/nonprofit-cause/tier5-src/_shared/owner-load-error.ts +8 -0
- package/templates/nonprofit-cause-owner/dev/index.ts +52 -27
- package/templates/nonprofit-cause-owner/tier5-src/_shared/owner-load-error.ts +8 -0
- package/templates/nonprofit-cause-owner/tier5-src/himi-owner-lite-post/index.ts +20 -8
- package/templates/owner-lite/dev/index.ts +52 -27
- package/templates/owner-lite/tier5-src/_shared/owner-load-error.ts +8 -0
- package/templates/owner-lite/tier5-src/himi-owner-lite-post/index.ts +20 -8
- package/templates/podcast-creator/tier5-src/_shared/branded-lite-hosted.ts +1 -0
- package/templates/podcast-creator/tier5-src/_shared/owner-load-error.ts +8 -0
- package/templates/podcast-creator-owner/dev/index.ts +52 -27
- package/templates/podcast-creator-owner/tier5-src/_shared/owner-load-error.ts +8 -0
- package/templates/podcast-creator-owner/tier5-src/himi-owner-lite-post/index.ts +20 -8
- package/templates/portfolio-creative/tier5-src/_shared/branded-lite-hosted.ts +1 -0
- package/templates/portfolio-creative/tier5-src/_shared/owner-load-error.ts +8 -0
- package/templates/portfolio-creative-owner/dev/index.ts +52 -27
- package/templates/portfolio-creative-owner/tier5-src/_shared/owner-load-error.ts +8 -0
- package/templates/portfolio-creative-owner/tier5-src/himi-owner-lite-post/index.ts +20 -8
- package/templates/restaurant/tier5-src/_shared/branded-lite-hosted.ts +1 -0
- package/templates/restaurant/tier5-src/_shared/owner-load-error.ts +8 -0
- package/templates/restaurant-owner/dev/index.ts +52 -27
- package/templates/restaurant-owner/tier5-src/_shared/owner-load-error.ts +8 -0
- package/templates/restaurant-owner/tier5-src/himi-owner-lite-post/index.ts +20 -8
- package/templates/retail-store/tier5-src/_shared/branded-lite-hosted.ts +1 -0
- package/templates/retail-store/tier5-src/_shared/owner-load-error.ts +8 -0
- package/templates/retail-store-owner/dev/index.ts +52 -27
- package/templates/retail-store-owner/tier5-src/_shared/owner-load-error.ts +8 -0
- package/templates/retail-store-owner/tier5-src/himi-owner-lite-post/index.ts +20 -8
- package/templates/yoga-studio/config.ts +7 -0
- package/templates/yoga-studio/dev/index.ts +833 -0
- package/templates/yoga-studio/himalaya.content.json +3 -0
- package/templates/yoga-studio/tier5-src/_shared/branded-lite-hosted.ts +1 -0
- package/templates/yoga-studio/tier5-src/_shared/owner-load-error.ts +8 -0
- package/templates/yoga-studio/tier5-src/himi-branded-lite-member-programs/index.ts +658 -0
- package/templates/yoga-studio-owner/dev/index.ts +52 -27
- package/templates/yoga-studio-owner/tier5-src/_shared/owner-load-error.ts +8 -0
- package/templates/yoga-studio-owner/tier5-src/himi-owner-lite-post/index.ts +20 -8
|
@@ -10,7 +10,7 @@ import { getPost, getDraftPost, publishDraftPost, revertDraftPost, deleteDraftPo
|
|
|
10
10
|
import { parseRicosJson } from "@himalaya/wix-rich-content";
|
|
11
11
|
import { openRichLink } from "../_shared/rich-content-link.js";
|
|
12
12
|
import { richBody } from "../_shared/rich-body.js";
|
|
13
|
-
import { ownerLoadError, isBridgeUnavailable,
|
|
13
|
+
import { ownerLoadError, isBridgeUnavailable, readWasUnreachable, isOwnerPreviewDemo, ownerDemoFallback, ownerWriteError, isNotFound } from "../_shared/owner-load-error.js";
|
|
14
14
|
import { DEMO_POSTS, DEMO_NOTE, DEMO_SAVE_NOTE } from "../_shared/owner-preview-demo.js";
|
|
15
15
|
import { stashCopy, copyParam } from "../_shared/himi-copy.js";
|
|
16
16
|
import { get as dbGet, upsert as dbUpsert, remove as dbRemove, type DbEntity } from "../_shared/owner-local-db.js";
|
|
@@ -270,14 +270,24 @@ async function refresh(prev: PostState, id: string, actionMessage = "", opts: {
|
|
|
270
270
|
try { post = (await getPost(id)).post; } catch (e) { lastError = postError = e; /* draft-only */ }
|
|
271
271
|
try { draft = (await getDraftPost(id)).draftPost; } catch (e) { lastError = e; /* published-only or missing */ }
|
|
272
272
|
if (!post && !draft) {
|
|
273
|
-
// Both arms swallowed their errors above
|
|
274
|
-
//
|
|
275
|
-
// back to the cached row or the demo post — never "post not found" for a post
|
|
276
|
-
// that was only unreachable.
|
|
273
|
+
// Both arms swallowed their errors above. Neither a failed published read
|
|
274
|
+
// nor a missing draft proves the post is gone.
|
|
277
275
|
// Either read counts: a published-only post's draft read is always a 404, so the
|
|
278
276
|
// published read's failure is the one that says whether the post was only unreachable.
|
|
279
277
|
for (const err of [postError, lastError]) {
|
|
280
|
-
|
|
278
|
+
// getPost may wrap the original read failure when its query fallback is
|
|
279
|
+
// empty. Preserve that cause's status instead of painting the wrapper's
|
|
280
|
+
// "Blog post not found" text for a gateway failure.
|
|
281
|
+
const cause = (err as { cause?: unknown } | undefined)?.cause;
|
|
282
|
+
for (const failure of [cause, err]) {
|
|
283
|
+
if (isBridgeUnavailable(failure) || readWasUnreachable(failure)) throw failure;
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
for (const err of [postError, lastError]) {
|
|
287
|
+
// Non-transient access/validation failures keep their status too: the
|
|
288
|
+
// SDK's empty-query wrapper is not the reason this read failed.
|
|
289
|
+
const failure = (err as { cause?: unknown } | undefined)?.cause ?? err;
|
|
290
|
+
if (failure !== undefined && !isNotFound(failure)) throw failure;
|
|
281
291
|
}
|
|
282
292
|
// Wix says it is gone on BOTH reads (a published-only post's draft read is a 404 on its
|
|
283
293
|
// own): its cached row must not outlive it, or an offline load repaints a deleted post.
|
|
@@ -361,7 +371,8 @@ const svc = defineService<PostState, {
|
|
|
361
371
|
} catch (e) {
|
|
362
372
|
// Offline: fall back to the last-synced local row before the demo/error paths.
|
|
363
373
|
// Wix says it is gone (e.g. a delete whose reply was lost): drop the row, never show it.
|
|
364
|
-
const cached = isNotFound(e) ? (await cacheDrop(id), null)
|
|
374
|
+
const cached = isNotFound(e) ? (await cacheDrop(id), null)
|
|
375
|
+
: readWasUnreachable(e) || isBridgeUnavailable(e) ? await cacheGet(id) : null;
|
|
365
376
|
if (cached) return cachedDetail(s, cached);
|
|
366
377
|
if (ownerDemoFallback(e)) {
|
|
367
378
|
const demo = demoDetail(s, id);
|
|
@@ -385,7 +396,8 @@ const svc = defineService<PostState, {
|
|
|
385
396
|
return loaded;
|
|
386
397
|
} catch (e) {
|
|
387
398
|
// Wix says it is gone (e.g. a delete whose reply was lost): drop the row, never show it.
|
|
388
|
-
const cached = isNotFound(e) ? (await cacheDrop(s.id), null)
|
|
399
|
+
const cached = isNotFound(e) ? (await cacheDrop(s.id), null)
|
|
400
|
+
: readWasUnreachable(e) || isBridgeUnavailable(e) ? await cacheGet(s.id) : null;
|
|
389
401
|
if (cached) return cachedDetail(s, cached);
|
|
390
402
|
if (ownerDemoFallback(e)) {
|
|
391
403
|
const demo = demoDetail(s, s.id);
|
|
@@ -119,6 +119,7 @@ export const HOSTED_SCREEN_VERTICALS: Readonly<Record<string, readonly BrandedLi
|
|
|
119
119
|
himi_portfolio: ["portfolio"],
|
|
120
120
|
himi_portfolio_project: ["portfolio"],
|
|
121
121
|
himi_programs: ["programs"],
|
|
122
|
+
himi_member_programs: ["programs"],
|
|
122
123
|
himi_reservations: ["reservations"],
|
|
123
124
|
himi_reserve: ["restaurants"],
|
|
124
125
|
himi_review: ["reviews"],
|
|
@@ -194,6 +194,14 @@ export function isTransportFailure(e: unknown): boolean {
|
|
|
194
194
|
return TRANSPORT.some((re) => re.test(msg));
|
|
195
195
|
}
|
|
196
196
|
|
|
197
|
+
/** A failed READ says nothing about the record's existence when Wix is
|
|
198
|
+
* unreachable, overloaded or failing. Unlike the legacy bridge predicate this
|
|
199
|
+
* is independent of preview mode; a live preview's gateway failure is one too. */
|
|
200
|
+
export function readWasUnreachable(e: unknown): boolean {
|
|
201
|
+
const msg = String((e as Error)?.message ?? e ?? "");
|
|
202
|
+
return isTransportFailure(e) || /HTTP (?:408|429|5\d{2})\b/.test(msg);
|
|
203
|
+
}
|
|
204
|
+
|
|
197
205
|
/** Transport failures that happen while CONNECTING — no connection, no route, no such host,
|
|
198
206
|
* connection refused — so the request provably never left the device. Every other
|
|
199
207
|
* transport failure (a timeout, a reset, a bad or truncated response, a browser's fetch
|
|
@@ -65596,16 +65596,17 @@ const SCREENS = runtimeSetting({
|
|
|
65596
65596
|
"type": "VStack",
|
|
65597
65597
|
"props": {
|
|
65598
65598
|
"spacing": 10,
|
|
65599
|
+
"alignment": "leading",
|
|
65599
65600
|
"children": [
|
|
65600
65601
|
{
|
|
65601
|
-
"id": "himi_owner_lite_inbox_thread.
|
|
65602
|
+
"id": "himi_owner_lite_inbox_thread.loading_text",
|
|
65602
65603
|
"body": {
|
|
65603
65604
|
"package": "himalaya",
|
|
65604
|
-
"type": "
|
|
65605
|
+
"type": "Text",
|
|
65605
65606
|
"props": {
|
|
65606
|
-
"
|
|
65607
|
-
"
|
|
65608
|
-
"
|
|
65607
|
+
"text": "Loading conversation…",
|
|
65608
|
+
"style": "body",
|
|
65609
|
+
"color": "textSecondary"
|
|
65609
65610
|
}
|
|
65610
65611
|
}
|
|
65611
65612
|
},
|
|
@@ -65613,51 +65614,75 @@ const SCREENS = runtimeSetting({
|
|
|
65613
65614
|
"id": "",
|
|
65614
65615
|
"body": {
|
|
65615
65616
|
"package": "himalaya",
|
|
65616
|
-
"type": "
|
|
65617
|
+
"type": "VStack",
|
|
65617
65618
|
"props": {
|
|
65619
|
+
"spacing": 10,
|
|
65618
65620
|
"children": [
|
|
65621
|
+
{
|
|
65622
|
+
"id": "himi_owner_lite_inbox_thread.sk1",
|
|
65623
|
+
"body": {
|
|
65624
|
+
"package": "himalaya",
|
|
65625
|
+
"type": "Skeleton",
|
|
65626
|
+
"props": {
|
|
65627
|
+
"width": 220,
|
|
65628
|
+
"height": 44,
|
|
65629
|
+
"cornerRadius": 16
|
|
65630
|
+
}
|
|
65631
|
+
}
|
|
65632
|
+
},
|
|
65619
65633
|
{
|
|
65620
65634
|
"id": "",
|
|
65621
65635
|
"body": {
|
|
65622
65636
|
"package": "himalaya",
|
|
65623
|
-
"type": "
|
|
65624
|
-
"props": {
|
|
65637
|
+
"type": "HStack",
|
|
65638
|
+
"props": {
|
|
65639
|
+
"children": [
|
|
65640
|
+
{
|
|
65641
|
+
"id": "",
|
|
65642
|
+
"body": {
|
|
65643
|
+
"package": "himalaya",
|
|
65644
|
+
"type": "Spacer",
|
|
65645
|
+
"props": {}
|
|
65646
|
+
}
|
|
65647
|
+
},
|
|
65648
|
+
{
|
|
65649
|
+
"id": "himi_owner_lite_inbox_thread.sk2",
|
|
65650
|
+
"body": {
|
|
65651
|
+
"package": "himalaya",
|
|
65652
|
+
"type": "Skeleton",
|
|
65653
|
+
"props": {
|
|
65654
|
+
"width": 180,
|
|
65655
|
+
"height": 44,
|
|
65656
|
+
"cornerRadius": 16
|
|
65657
|
+
}
|
|
65658
|
+
}
|
|
65659
|
+
}
|
|
65660
|
+
]
|
|
65661
|
+
}
|
|
65625
65662
|
}
|
|
65626
65663
|
},
|
|
65627
65664
|
{
|
|
65628
|
-
"id": "himi_owner_lite_inbox_thread.
|
|
65665
|
+
"id": "himi_owner_lite_inbox_thread.sk3",
|
|
65629
65666
|
"body": {
|
|
65630
65667
|
"package": "himalaya",
|
|
65631
65668
|
"type": "Skeleton",
|
|
65632
65669
|
"props": {
|
|
65633
|
-
"width":
|
|
65634
|
-
"height":
|
|
65670
|
+
"width": 240,
|
|
65671
|
+
"height": 64,
|
|
65635
65672
|
"cornerRadius": 16
|
|
65636
65673
|
}
|
|
65637
65674
|
}
|
|
65638
65675
|
}
|
|
65639
65676
|
]
|
|
65640
65677
|
}
|
|
65641
|
-
}
|
|
65642
|
-
|
|
65643
|
-
|
|
65644
|
-
|
|
65645
|
-
"body": {
|
|
65646
|
-
"package": "himalaya",
|
|
65647
|
-
"type": "Skeleton",
|
|
65648
|
-
"props": {
|
|
65649
|
-
"width": 240,
|
|
65650
|
-
"height": 64,
|
|
65651
|
-
"cornerRadius": 16
|
|
65652
|
-
}
|
|
65678
|
+
},
|
|
65679
|
+
"modifiers": {
|
|
65680
|
+
"fillMaxWidth": true,
|
|
65681
|
+
"accessibilityRole": "decorative"
|
|
65653
65682
|
}
|
|
65654
65683
|
}
|
|
65655
65684
|
]
|
|
65656
65685
|
}
|
|
65657
|
-
},
|
|
65658
|
-
"modifiers": {
|
|
65659
|
-
"fillMaxWidth": true,
|
|
65660
|
-
"accessibilityRole": "decorative"
|
|
65661
65686
|
}
|
|
65662
65687
|
}
|
|
65663
65688
|
},
|
|
@@ -194,6 +194,14 @@ export function isTransportFailure(e: unknown): boolean {
|
|
|
194
194
|
return TRANSPORT.some((re) => re.test(msg));
|
|
195
195
|
}
|
|
196
196
|
|
|
197
|
+
/** A failed READ says nothing about the record's existence when Wix is
|
|
198
|
+
* unreachable, overloaded or failing. Unlike the legacy bridge predicate this
|
|
199
|
+
* is independent of preview mode; a live preview's gateway failure is one too. */
|
|
200
|
+
export function readWasUnreachable(e: unknown): boolean {
|
|
201
|
+
const msg = String((e as Error)?.message ?? e ?? "");
|
|
202
|
+
return isTransportFailure(e) || /HTTP (?:408|429|5\d{2})\b/.test(msg);
|
|
203
|
+
}
|
|
204
|
+
|
|
197
205
|
/** Transport failures that happen while CONNECTING — no connection, no route, no such host,
|
|
198
206
|
* connection refused — so the request provably never left the device. Every other
|
|
199
207
|
* transport failure (a timeout, a reset, a bad or truncated response, a browser's fetch
|
|
@@ -10,7 +10,7 @@ import { getPost, getDraftPost, publishDraftPost, revertDraftPost, deleteDraftPo
|
|
|
10
10
|
import { parseRicosJson } from "@himalaya/wix-rich-content";
|
|
11
11
|
import { openRichLink } from "../_shared/rich-content-link.js";
|
|
12
12
|
import { richBody } from "../_shared/rich-body.js";
|
|
13
|
-
import { ownerLoadError, isBridgeUnavailable,
|
|
13
|
+
import { ownerLoadError, isBridgeUnavailable, readWasUnreachable, isOwnerPreviewDemo, ownerDemoFallback, ownerWriteError, isNotFound } from "../_shared/owner-load-error.js";
|
|
14
14
|
import { DEMO_POSTS, DEMO_NOTE, DEMO_SAVE_NOTE } from "../_shared/owner-preview-demo.js";
|
|
15
15
|
import { stashCopy, copyParam } from "../_shared/himi-copy.js";
|
|
16
16
|
import { get as dbGet, upsert as dbUpsert, remove as dbRemove, type DbEntity } from "../_shared/owner-local-db.js";
|
|
@@ -270,14 +270,24 @@ async function refresh(prev: PostState, id: string, actionMessage = "", opts: {
|
|
|
270
270
|
try { post = (await getPost(id)).post; } catch (e) { lastError = postError = e; /* draft-only */ }
|
|
271
271
|
try { draft = (await getDraftPost(id)).draftPost; } catch (e) { lastError = e; /* published-only or missing */ }
|
|
272
272
|
if (!post && !draft) {
|
|
273
|
-
// Both arms swallowed their errors above
|
|
274
|
-
//
|
|
275
|
-
// back to the cached row or the demo post — never "post not found" for a post
|
|
276
|
-
// that was only unreachable.
|
|
273
|
+
// Both arms swallowed their errors above. Neither a failed published read
|
|
274
|
+
// nor a missing draft proves the post is gone.
|
|
277
275
|
// Either read counts: a published-only post's draft read is always a 404, so the
|
|
278
276
|
// published read's failure is the one that says whether the post was only unreachable.
|
|
279
277
|
for (const err of [postError, lastError]) {
|
|
280
|
-
|
|
278
|
+
// getPost may wrap the original read failure when its query fallback is
|
|
279
|
+
// empty. Preserve that cause's status instead of painting the wrapper's
|
|
280
|
+
// "Blog post not found" text for a gateway failure.
|
|
281
|
+
const cause = (err as { cause?: unknown } | undefined)?.cause;
|
|
282
|
+
for (const failure of [cause, err]) {
|
|
283
|
+
if (isBridgeUnavailable(failure) || readWasUnreachable(failure)) throw failure;
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
for (const err of [postError, lastError]) {
|
|
287
|
+
// Non-transient access/validation failures keep their status too: the
|
|
288
|
+
// SDK's empty-query wrapper is not the reason this read failed.
|
|
289
|
+
const failure = (err as { cause?: unknown } | undefined)?.cause ?? err;
|
|
290
|
+
if (failure !== undefined && !isNotFound(failure)) throw failure;
|
|
281
291
|
}
|
|
282
292
|
// Wix says it is gone on BOTH reads (a published-only post's draft read is a 404 on its
|
|
283
293
|
// own): its cached row must not outlive it, or an offline load repaints a deleted post.
|
|
@@ -361,7 +371,8 @@ const svc = defineService<PostState, {
|
|
|
361
371
|
} catch (e) {
|
|
362
372
|
// Offline: fall back to the last-synced local row before the demo/error paths.
|
|
363
373
|
// Wix says it is gone (e.g. a delete whose reply was lost): drop the row, never show it.
|
|
364
|
-
const cached = isNotFound(e) ? (await cacheDrop(id), null)
|
|
374
|
+
const cached = isNotFound(e) ? (await cacheDrop(id), null)
|
|
375
|
+
: readWasUnreachable(e) || isBridgeUnavailable(e) ? await cacheGet(id) : null;
|
|
365
376
|
if (cached) return cachedDetail(s, cached);
|
|
366
377
|
if (ownerDemoFallback(e)) {
|
|
367
378
|
const demo = demoDetail(s, id);
|
|
@@ -385,7 +396,8 @@ const svc = defineService<PostState, {
|
|
|
385
396
|
return loaded;
|
|
386
397
|
} catch (e) {
|
|
387
398
|
// Wix says it is gone (e.g. a delete whose reply was lost): drop the row, never show it.
|
|
388
|
-
const cached = isNotFound(e) ? (await cacheDrop(s.id), null)
|
|
399
|
+
const cached = isNotFound(e) ? (await cacheDrop(s.id), null)
|
|
400
|
+
: readWasUnreachable(e) || isBridgeUnavailable(e) ? await cacheGet(s.id) : null;
|
|
389
401
|
if (cached) return cachedDetail(s, cached);
|
|
390
402
|
if (ownerDemoFallback(e)) {
|
|
391
403
|
const demo = demoDetail(s, s.id);
|
|
@@ -192,6 +192,13 @@ export default defineApp({
|
|
|
192
192
|
"parentScreenId": "himi_programs",
|
|
193
193
|
"tabId": "programs"
|
|
194
194
|
},
|
|
195
|
+
{
|
|
196
|
+
"screenId": "himi_member_programs",
|
|
197
|
+
"isPublic": true,
|
|
198
|
+
"paramKeys": [],
|
|
199
|
+
"parentScreenId": "himi_programs",
|
|
200
|
+
"tabId": "programs"
|
|
201
|
+
},
|
|
195
202
|
{
|
|
196
203
|
"screenId": "himi_plans",
|
|
197
204
|
"isPublic": true,
|