@lotics/app-sdk 0.87.5 → 0.87.6

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/src/hooks.js CHANGED
@@ -71,6 +71,14 @@ function swrConfig(revalidateOnFocus) {
71
71
  revalidateOnFocus,
72
72
  revalidateOnReconnect: revalidateOnFocus,
73
73
  shouldRetryOnError: false,
74
+ // A query's KEY carries its params, filter and sort, so anything derived
75
+ // from the rows on screen re-keys the moment they change. Without this SWR
76
+ // answers a new key with `undefined`, `rows` falls to `[]`, and every list
77
+ // renders empty for a frame — unmounting each row's images, which remount
78
+ // blank. That is the behaviour the `loading` contract above already
79
+ // promises against, and what the product app sets globally for the same
80
+ // reason.
81
+ keepPreviousData: true,
74
82
  };
75
83
  }
76
84
  /**
@@ -289,9 +297,7 @@ export function usePaginatedQuery(alias, params, opts) {
289
297
  offset: page * pageSize,
290
298
  sort,
291
299
  filter,
292
- }),
293
- // Keep the previous page's rows on screen while the next page loads.
294
- { keepPreviousData: true, ...swrConfig(revalidateOnFocus) });
300
+ }), swrConfig(revalidateOnFocus));
295
301
  // Not counted when the caller supplies the total, when the hook is disabled,
296
302
  // or under a fixture — see `useCountRead` for why the key drops page and sort.
297
303
  const countSwr = useCountRead(alias, params, filter, !mockRows && enabled && !callerOwnsTotal, revalidateOnFocus);
package/dist/src/row.d.ts CHANGED
@@ -86,7 +86,9 @@ export interface AppFile {
86
86
  /**
87
87
  * files field → the attached files with their presigned `url` (empty if none).
88
88
  * Skips entries the server didn't presign (no `url`) so a consumer never renders
89
- * an unservable file. Map to `@lotics/ui` `DisplayFile` for FileThumbnail/Gallery.
89
+ * an unservable file. Pass one to `toDisplayFile` from `@lotics/ui/file_thumbnail`
90
+ * for FileThumbnail/Gallery — the kit owns that conversion, so don't re-declare
91
+ * it per app.
90
92
  */
91
93
  export declare function readFiles(v: unknown): AppFile[];
92
94
  /**
package/dist/src/row.js CHANGED
@@ -113,7 +113,9 @@ export function readLinks(v) {
113
113
  /**
114
114
  * files field → the attached files with their presigned `url` (empty if none).
115
115
  * Skips entries the server didn't presign (no `url`) so a consumer never renders
116
- * an unservable file. Map to `@lotics/ui` `DisplayFile` for FileThumbnail/Gallery.
116
+ * an unservable file. Pass one to `toDisplayFile` from `@lotics/ui/file_thumbnail`
117
+ * for FileThumbnail/Gallery — the kit owns that conversion, so don't re-declare
118
+ * it per app.
117
119
  */
118
120
  export function readFiles(v) {
119
121
  if (!Array.isArray(v))
@@ -136,8 +136,11 @@ server validates system conditions by `type` and never reads `field_key` on them
136
136
  are no rows yet. It stays `false` during background revalidation of a key that already has rows,
137
137
  so consumers never blank loaded data to a spinner on refetch. A key *change* (new params, sort,
138
138
  filter, or page) is a fresh load: `loading` goes `true` again unless that key is already cached —
139
- `usePaginatedQuery` keeps the previous page's rows on screen during it, which is why skeletons
140
- gate on `loading && rows.length === 0`, never `loading` alone. **`isValidating`** is `true`
139
+ but the previous key's rows STAY on screen while it resolves, for every query, so `rows` never
140
+ empties mid-flight. That is why skeletons gate on `loading && rows.length === 0`, never `loading`
141
+ alone: a filter derived from what is on screen re-keys on every keystroke, and gating on
142
+ `loading` swaps the list for a spinner each time — which unmounts everything the rows contained,
143
+ images included. **`isValidating`** is `true`
141
144
  whenever any request is in flight — use it for a subtle refresh indicator.
142
145
  - **`error`** is a `string | null`. A failed query surfaces immediately — there is **no automatic
143
146
  retry** (no retry loop that masks the error). The last successful rows for the same key stay
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lotics/app-sdk",
3
- "version": "0.87.5",
3
+ "version": "0.87.6",
4
4
  "description": "Runtime SDK for Lotics custom-code apps \u2014 typed hooks, postMessage bridge, mount entry point",
5
5
  "type": "module",
6
6
  "exports": {