@wix/himalaya-cli 0.1447.0 → 0.1448.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.
@@ -176,11 +176,13 @@ responsive master/detail. *Reach for `Card` to cluster, not to wrap every single
176
176
  (`columns: 1, columnsMedium: 2`); `Table` for tabular rows; `Carousel`/`Pager` for swipeable panels;
177
177
  `Timeline` for chronological events. Compose rows as `ListItem` / `LabeledContent` / `DisclosureGroup`
178
178
  cells inside a `Card([VStack(spacing: 0)])`.
179
- > **Don't make `LazyList` the screen root.** The native `ScreenView` already wraps a screen's content
180
- > in a scroll view, so a `LazyList` as the (modifier-wrapped) root collapses to **zero height and
181
- > renders blank**. For a feed/list *screen*, use a plain `vstack` of `Card`s — it scrolls with the
182
- > screen. Reach for `LazyList` only *nested* inside a bounded-height slot (a fixed-height panel, a
183
- > horizontal rail) where its own virtualized scroll is what you want.
179
+ > For a feed/list *screen*, prefer a root `VStack` with a direct vertical worker-bound `LazyList`
180
+ > when the screen has the simple root shape supported by the native host; Android flattens that
181
+ > shape into one lazy root so long lists do not compose every row. Other root shapes stay on the
182
+ > eager screen path, as does a root list that sets `pagination`, `stickyHeader` or
183
+ > `rowSwipeActions`. A `LazyList` nested deeper inside the screen's outer scroll is rendered
184
+ > eagerly on Android to avoid nested-scroll measurement failures, even in a fixed-height panel. A
185
+ > worker-bound horizontal `LazyList` is eager on Android too, so keep rails short.
184
186
 
185
187
  **Text** — `Text` for a single styled string (`maxLines` to truncate); `RichText` for inline mixed
186
188
  marks (bold/italic/link within one paragraph); `RichContent` for a Wix Ricos document with blocks,
@@ -203,6 +203,37 @@ routes: [
203
203
  A notification whose link matches no route opens the app without navigating. `himi validate`
204
204
  warns when a declared route names a screen the app does not declare.
205
205
 
206
+ ### Notification action buttons
207
+
208
+ Declare actionable categories in the app's source `config.ts`. The native shells render one
209
+ button per category action on iOS and Android; the notification payload selects the category.
210
+ This is structural app configuration, not a `himi notify send` flag:
211
+
212
+ ```ts
213
+ push: {
214
+ categories: [{
215
+ id: "time.action-required",
216
+ actions: [
217
+ { id: "review", title: "Review" },
218
+ { id: "snooze", title: "Snooze 1h", input: true },
219
+ ],
220
+ }],
221
+ observerAction: "tier5.myNav.onNotification",
222
+ },
223
+ ```
224
+
225
+ The app-level worker action named by `observerAction` receives every notification through the
226
+ existing observer path. Use `readNotificationEvent` from `@himalaya/push` to read its params:
227
+
228
+ - `notificationAction` is the pressed action id, or `""` for a receipt or ordinary body tap.
229
+ - `notificationText` is the inline reply for an `input: true` action, or `""` otherwise.
230
+ - Action presses have `tapped: "false"`; they are responses to an already-observed notification,
231
+ not new arrivals. They never navigate. The body tap retains the existing link navigation.
232
+
233
+ Each action has its own deduplication key, so a foreground receipt does not swallow a later button
234
+ press and pressing the same button twice is reported once. A press received before the worker is
235
+ configured is queued and replayed once the current site's configuration is ready.
236
+
206
237
  **Customer push QA builds use `himi dist --signing byo`.** After publishing an approved
207
238
  release, use a backend and reachable runner source that support the customer-signing flow.
208
239
  Use the app owner's account for both logins and explicitly select the deployed customer target:
@@ -14,6 +14,15 @@ the app's `.agents/skills/himalaya/examples/` (written by `himi init` and `himi
14
14
  card grids). `Carousel` and `Menu` take `itemsPath` the same way. Do **not** hand-roll
15
15
  a "VStack of Cards" — that renders only static items and can't bind live data.
16
16
 
17
+ For a long list screen, make the vertical `LazyList` a direct child of the root `VStack`
18
+ when the rest of the root uses only the supported simple layout. Android can then flatten
19
+ the root into one `LazyColumn` and compose only visible rows. This applies only to a plain
20
+ list: a `LazyList` that sets `pagination`, `stickyHeader` or `rowSwipeActions` keeps the
21
+ screen's own scroll on Android and composes every row. A list nested deeper inside the
22
+ screen's outer scroll also stays eager, and a fixed-height panel inside that scroll does not
23
+ change that on Android. A worker-bound horizontal list is also eager on Android: it renders
24
+ every row in a plain `Row`, so keep rails short.
25
+
17
26
  **`Grid` is not a `LazyList` with one column.** It shares `itemsPath` and the row
18
27
  template, and nothing else: the gesture props in §5 (`onPullToRefresh`, `pagination`)
19
28
  and `stickyHeader`/`rowSwipeActions` are declared on `LazyListProps` only. A key `Grid`
@@ -104,6 +104,23 @@ response. The client holds **no** auth or HTTP —
104
104
  that's `WixApiCapability` (attaches auth per call, 401→refresh→retry). Import the domain by its canonical
105
105
  package `@himalaya/wix-<domain>` (unversioned name; the REST version is in the path — RFC 0043 D2).
106
106
 
107
+ ### Read an owner-created async job
108
+
109
+ The first-party `@himalaya/wix-async-jobs` client exposes the current state of an async job through the
110
+ Wix gateway. It is an owner-scoped read and requires `INFRA.ASYNC_JOB_READ`; visitor sessions receive
111
+ 403. Poll the returned `job.status` while it is `INITIALIZED` or `PROCESSING`, and stop at `FINISHED`
112
+ or `FAILED`:
113
+
114
+ ```ts
115
+ import { getAsyncJob } from "@himalaya/wix-async-jobs";
116
+
117
+ const { job } = await getAsyncJob(jobId);
118
+ const status = job?.status;
119
+ ```
120
+
121
+ The client calls `GET /async-jobs/v1/async-jobs/{jobId}`. A missing job is an HTTP 404 with
122
+ `JOB_NOT_FOUND`; do not treat that response as authorization evidence.
123
+
107
124
  > **Catalog V1 vs V3 — use V3 by default.** For a new Stores reader use
108
125
  > **`queryStoreProducts`** (POST
109
126
  > `/stores/v3/products/query`) and **`getStoreProduct`**, from the same `@himalaya/wix-stores`
@@ -43,6 +43,7 @@ Same idea, one canonical entry — don't reach for the others:
43
43
  | I want to… | Canonical door | Layer |
44
44
  |---|---|---|
45
45
  | Read/write a Wix domain (products, bookings, members…) | `@himalaya/wix-<domain>` from a worker | L3 |
46
+ | Read the state of an owner-created async job | `@himalaya/wix-async-jobs` → `getAsyncJob(jobId)` | L3 |
46
47
  | Emit a BI beacon | `wix-platform.bi` | L2 |
47
48
  | Conduct an experiment / read a flag | `wix-platform.experiments` / `wix-platform.flags` | L2 |
48
49
  | Translate a string / read the locale | `wix-platform.i18n` | L2 |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wix/himalaya-cli",
3
- "version": "0.1447.0",
3
+ "version": "0.1448.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": "ec7806275850384530f4bb3f9e2a1ee23e66bf5223389c5dc7a3446a"
74
+ "falconPackageHash": "ceeeb017afff0753eec531692afa7a5e7ca0bf9e38054ebdf2adf95f"
75
75
  }