@proappstore/sdk 1.16.95 → 1.16.97
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/README.md +6 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/offline/downloads.d.ts +44 -0
- package/dist/offline/downloads.d.ts.map +1 -0
- package/dist/offline/downloads.js +235 -0
- package/dist/offline/downloads.js.map +1 -0
- package/dist/offline/jobs.d.ts +78 -0
- package/dist/offline/jobs.d.ts.map +1 -0
- package/dist/offline/jobs.js +231 -0
- package/dist/offline/jobs.js.map +1 -0
- package/dist/offline/locks.d.ts +6 -0
- package/dist/offline/locks.d.ts.map +1 -0
- package/dist/offline/locks.js +47 -0
- package/dist/offline/locks.js.map +1 -0
- package/dist/offline/store.d.ts +94 -0
- package/dist/offline/store.d.ts.map +1 -0
- package/dist/offline/store.js +271 -0
- package/dist/offline/store.js.map +1 -0
- package/dist/offline.d.ts +8 -0
- package/dist/offline.d.ts.map +1 -0
- package/dist/offline.js +5 -0
- package/dist/offline.js.map +1 -0
- package/dist/sdk-version.js +1 -1
- package/dist/shell-resilience.d.ts +3 -1
- package/dist/shell-resilience.d.ts.map +1 -1
- package/dist/shell-resilience.js +2 -2
- package/dist/shell-resilience.js.map +1 -1
- package/dist/shell.d.ts +11 -2
- package/dist/shell.d.ts.map +1 -1
- package/dist/shell.js +49 -30
- package/dist/shell.js.map +1 -1
- package/package.json +6 -1
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
import { offlineLock } from './locks.js';
|
|
2
|
+
export class OfflineError extends Error {
|
|
3
|
+
code;
|
|
4
|
+
constructor(code, message, options) {
|
|
5
|
+
super(message, options);
|
|
6
|
+
this.code = code;
|
|
7
|
+
this.name = 'OfflineError';
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
const TABLES = ['records', 'blobs', 'downloads', 'jobs', 'outbox'];
|
|
11
|
+
export const OFFLINE_SCHEMA_VERSION = 2;
|
|
12
|
+
export function offlineFailure(error) {
|
|
13
|
+
if (error instanceof OfflineError)
|
|
14
|
+
return error;
|
|
15
|
+
return new OfflineError(error instanceof DOMException && error.name === 'QuotaExceededError' ? 'quota' : 'storage', 'Local storage operation failed.', { cause: error });
|
|
16
|
+
}
|
|
17
|
+
function key(value) {
|
|
18
|
+
if (!value || value.length > 512)
|
|
19
|
+
throw new OfflineError('invalid', 'A non-empty key of at most 512 characters is required.');
|
|
20
|
+
return value;
|
|
21
|
+
}
|
|
22
|
+
/** Every handle stays bound to one app/owner. close() locks it; clear() deletes it. */
|
|
23
|
+
export class OfflineStore {
|
|
24
|
+
scope;
|
|
25
|
+
appId;
|
|
26
|
+
databaseName;
|
|
27
|
+
factory;
|
|
28
|
+
canAccess;
|
|
29
|
+
closed = false;
|
|
30
|
+
active = new Set();
|
|
31
|
+
constructor(options) {
|
|
32
|
+
this.appId = key(options.appId);
|
|
33
|
+
this.scope = Object.freeze({ ...options.scope });
|
|
34
|
+
if (this.scope.kind !== 'device' && this.scope.kind !== 'account')
|
|
35
|
+
throw new OfflineError('invalid', 'Unknown local-content scope.');
|
|
36
|
+
if (this.scope.kind === 'account') {
|
|
37
|
+
key(this.scope.ownerId);
|
|
38
|
+
if (typeof options.canAccess !== 'function')
|
|
39
|
+
throw new OfflineError('invalid', 'Account-local content requires an explicit canAccess decision.');
|
|
40
|
+
}
|
|
41
|
+
this.canAccess = options.canAccess;
|
|
42
|
+
this.databaseName = `pas-offline:${JSON.stringify([this.appId, this.scope.kind, this.scope.kind === 'account' ? this.scope.ownerId : null])}`;
|
|
43
|
+
const factory = options.indexedDB ?? globalThis.indexedDB;
|
|
44
|
+
if (!factory)
|
|
45
|
+
throw new OfflineError('unavailable', 'IndexedDB is unavailable on this device.');
|
|
46
|
+
this.factory = factory;
|
|
47
|
+
this.assertAccess();
|
|
48
|
+
}
|
|
49
|
+
assertAccess() {
|
|
50
|
+
if (this.closed)
|
|
51
|
+
throw new OfflineError('closed', 'This local-content handle has been closed.');
|
|
52
|
+
if (this.canAccess && !this.canAccess()) {
|
|
53
|
+
this.close();
|
|
54
|
+
throw new OfflineError('access-denied', 'Local content is locked for this account.');
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
close() {
|
|
58
|
+
this.closed = true;
|
|
59
|
+
for (const tx of this.active) {
|
|
60
|
+
try {
|
|
61
|
+
tx.abort();
|
|
62
|
+
}
|
|
63
|
+
catch { /* Already committed. */ }
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
open() {
|
|
67
|
+
this.assertAccess();
|
|
68
|
+
return new Promise((resolve, reject) => {
|
|
69
|
+
let refused = false;
|
|
70
|
+
let request;
|
|
71
|
+
try {
|
|
72
|
+
request = this.factory.open(this.databaseName, OFFLINE_SCHEMA_VERSION);
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
reject(offlineFailure(error));
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
request.onupgradeneeded = () => {
|
|
79
|
+
// Version 1 held records/blobs; version 2 adds resumable work. Existing data survives.
|
|
80
|
+
for (const table of TABLES)
|
|
81
|
+
if (!request.result.objectStoreNames.contains(table))
|
|
82
|
+
request.result.createObjectStore(table);
|
|
83
|
+
};
|
|
84
|
+
request.onblocked = () => {
|
|
85
|
+
refused = true;
|
|
86
|
+
reject(new OfflineError('blocked', 'Another tab is blocking the local database upgrade. Close it and retry.'));
|
|
87
|
+
};
|
|
88
|
+
request.onerror = () => reject(offlineFailure(request.error));
|
|
89
|
+
request.onsuccess = () => {
|
|
90
|
+
const db = request.result;
|
|
91
|
+
db.onversionchange = () => db.close();
|
|
92
|
+
if (refused) {
|
|
93
|
+
db.close();
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
try {
|
|
97
|
+
this.assertAccess();
|
|
98
|
+
resolve(db);
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
db.close();
|
|
102
|
+
reject(error);
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
/** @internal Shared transaction primitive for the opt-in offline modules. */
|
|
108
|
+
async transaction(tables, mode, work) {
|
|
109
|
+
const db = await this.open();
|
|
110
|
+
try {
|
|
111
|
+
this.assertAccess();
|
|
112
|
+
return await new Promise((resolve, reject) => {
|
|
113
|
+
const tx = db.transaction(tables, mode);
|
|
114
|
+
this.active.add(tx);
|
|
115
|
+
let value;
|
|
116
|
+
let thrown;
|
|
117
|
+
tx.oncomplete = () => {
|
|
118
|
+
this.active.delete(tx);
|
|
119
|
+
try {
|
|
120
|
+
this.assertAccess();
|
|
121
|
+
resolve(value);
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
reject(error);
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
tx.onabort = () => { this.active.delete(tx); reject(offlineFailure(thrown ?? tx.error)); };
|
|
128
|
+
tx.onerror = () => { };
|
|
129
|
+
try {
|
|
130
|
+
work(tx, (next) => { value = next; });
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
thrown = error;
|
|
134
|
+
tx.abort();
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
catch (error) {
|
|
139
|
+
throw offlineFailure(error);
|
|
140
|
+
}
|
|
141
|
+
finally {
|
|
142
|
+
db.close();
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
/** @internal */
|
|
146
|
+
read(table, id) {
|
|
147
|
+
return this.transaction([table], 'readonly', (tx, done) => {
|
|
148
|
+
const request = tx.objectStore(table).get(id);
|
|
149
|
+
request.onsuccess = () => done(request.result ?? null);
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
/** @internal */
|
|
153
|
+
write(table, id, value) {
|
|
154
|
+
return this.transaction([table], 'readwrite', (tx, done) => { tx.objectStore(table).put(value, id); done(undefined); });
|
|
155
|
+
}
|
|
156
|
+
/** @internal Bounded cursor listing; metadata stores contain no audio bytes. */
|
|
157
|
+
page(table, options = {}) {
|
|
158
|
+
const limit = options.limit ?? 50;
|
|
159
|
+
const after = options.after;
|
|
160
|
+
if (!Number.isInteger(limit) || limit < 1 || limit > 200)
|
|
161
|
+
throw new OfflineError('invalid', 'Page limit must be between 1 and 200.');
|
|
162
|
+
return this.transaction([table], 'readonly', (tx, done) => {
|
|
163
|
+
const rows = [];
|
|
164
|
+
const request = tx.objectStore(table).openCursor();
|
|
165
|
+
request.onsuccess = () => {
|
|
166
|
+
const cursor = request.result;
|
|
167
|
+
if (!cursor || rows.length >= limit) {
|
|
168
|
+
done(rows);
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
if (after === undefined || String(cursor.key) > after)
|
|
172
|
+
rows.push(cursor.value);
|
|
173
|
+
if (rows.length === limit)
|
|
174
|
+
done(rows);
|
|
175
|
+
else
|
|
176
|
+
cursor.continue();
|
|
177
|
+
};
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
async put(entry) {
|
|
181
|
+
const { id, blob } = entry;
|
|
182
|
+
key(id);
|
|
183
|
+
// IndexedDB opens asynchronously. Snapshot metadata before yielding so callers
|
|
184
|
+
// can keep editing their draft without changing this submitted save (#530).
|
|
185
|
+
let value;
|
|
186
|
+
try {
|
|
187
|
+
value = structuredClone(entry.value);
|
|
188
|
+
}
|
|
189
|
+
catch (error) {
|
|
190
|
+
throw offlineFailure(error);
|
|
191
|
+
}
|
|
192
|
+
const record = { id, value, updatedAt: Date.now(), blobBytes: blob?.size ?? 0, blobType: blob?.type ?? null };
|
|
193
|
+
return this.transaction(['records', 'blobs'], 'readwrite', (tx, done) => {
|
|
194
|
+
tx.objectStore('records').put(record, id);
|
|
195
|
+
if (blob)
|
|
196
|
+
tx.objectStore('blobs').put(blob, `record:${id}`);
|
|
197
|
+
else
|
|
198
|
+
tx.objectStore('blobs').delete(`record:${id}`);
|
|
199
|
+
done(record);
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
get(id) { return this.read('records', key(id)); }
|
|
203
|
+
getBlob(id) { return this.read('blobs', `record:${key(id)}`); }
|
|
204
|
+
list(options = {}) { return this.page('records', options); }
|
|
205
|
+
delete(id) {
|
|
206
|
+
key(id);
|
|
207
|
+
return this.transaction(['records', 'blobs'], 'readwrite', (tx, done) => {
|
|
208
|
+
tx.objectStore('records').delete(id);
|
|
209
|
+
tx.objectStore('blobs').delete(`record:${id}`);
|
|
210
|
+
done(undefined);
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
/** @internal Shared lease excludes purge until durable work finishes. */
|
|
214
|
+
runWork(work, signal) {
|
|
215
|
+
return offlineLock(`${this.databaseName}:work`, work, true, { mode: 'shared', ...(signal ? { signal } : {}) });
|
|
216
|
+
}
|
|
217
|
+
/** Rejects busy while SDK jobs/downloads/sync are active. Cancel and await runners before retrying. */
|
|
218
|
+
clear() {
|
|
219
|
+
return offlineLock(`${this.databaseName}:work`, () => this.transaction(TABLES, 'readwrite', (tx, done) => { for (const table of TABLES)
|
|
220
|
+
tx.objectStore(table).clear(); done(undefined); }), true, { ifAvailable: true });
|
|
221
|
+
}
|
|
222
|
+
/** Portable JSON export of one user-selected record, including an optional base64 blob. */
|
|
223
|
+
async exportRecord(id) {
|
|
224
|
+
const snapshot = await this.transaction(['records', 'blobs'], 'readonly', (tx, done) => {
|
|
225
|
+
const record = tx.objectStore('records').get(key(id));
|
|
226
|
+
const blob = tx.objectStore('blobs').get(`record:${id}`);
|
|
227
|
+
blob.onsuccess = () => done({ record: record.result ?? null, blob: blob.result ?? null });
|
|
228
|
+
});
|
|
229
|
+
if (!snapshot.record)
|
|
230
|
+
throw new OfflineError('invalid', 'The local record does not exist.');
|
|
231
|
+
let base64 = null;
|
|
232
|
+
if (snapshot.blob) {
|
|
233
|
+
const bytes = new Uint8Array(await snapshot.blob.arrayBuffer());
|
|
234
|
+
const parts = [];
|
|
235
|
+
for (let start = 0; start < bytes.length; start += 0x8000)
|
|
236
|
+
parts.push(String.fromCharCode(...bytes.subarray(start, start + 0x8000)));
|
|
237
|
+
base64 = btoa(parts.join(''));
|
|
238
|
+
}
|
|
239
|
+
this.assertAccess();
|
|
240
|
+
return new Blob([JSON.stringify({ format: 'pas-local-record', version: 1, appId: this.appId, scope: this.scope, record: snapshot.record, base64 })], { type: 'application/json' });
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
export function createOfflineStore(options) { return new OfflineStore(options); }
|
|
244
|
+
/** Call on explicit logout/account changes; closing never deletes unsynced work. */
|
|
245
|
+
export function bindOfflineAccount(store, auth) {
|
|
246
|
+
const scope = store.scope;
|
|
247
|
+
if (scope.kind !== 'account')
|
|
248
|
+
throw new OfflineError('invalid', 'Only account-local stores bind to account changes.');
|
|
249
|
+
// Broadcast only a revocation bit within this app/owner namespace; never credentials.
|
|
250
|
+
const channel = typeof BroadcastChannel === 'undefined' ? null : new BroadcastChannel(`${store.databaseName}:access`);
|
|
251
|
+
if (channel)
|
|
252
|
+
channel.onmessage = (event) => { if (event.data === 'lock')
|
|
253
|
+
store.close(); };
|
|
254
|
+
const unsubscribe = auth.onChange((user) => {
|
|
255
|
+
if (!user || user.id !== scope.ownerId) {
|
|
256
|
+
store.close();
|
|
257
|
+
channel?.postMessage('lock');
|
|
258
|
+
}
|
|
259
|
+
});
|
|
260
|
+
return () => { unsubscribe(); channel?.close(); };
|
|
261
|
+
}
|
|
262
|
+
/** Persistence is a request, never a promise that the browser cannot remove data. */
|
|
263
|
+
export async function localStorageStatus(requestPersistence = false) {
|
|
264
|
+
const storage = typeof navigator === 'undefined' ? undefined : navigator.storage;
|
|
265
|
+
if (!storage)
|
|
266
|
+
return { supported: false, persisted: false, usage: null, quota: null };
|
|
267
|
+
const estimate = await storage.estimate();
|
|
268
|
+
const persisted = (await storage.persisted()) || (requestPersistence ? await storage.persist() : false);
|
|
269
|
+
return { supported: true, persisted, usage: estimate.usage ?? null, quota: estimate.quota ?? null };
|
|
270
|
+
}
|
|
271
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/offline/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/** Optional local-content APIs. Import from @proappstore/sdk/offline. */
|
|
2
|
+
export { createOfflineStore, OfflineStore, OfflineError, bindOfflineAccount, localStorageStatus, OFFLINE_SCHEMA_VERSION } from './offline/store.js';
|
|
3
|
+
export type { OfflineStoreOptions, OfflineScope, OfflineErrorCode, LocalRecord, LocalWrite, LocalPage } from './offline/store.js';
|
|
4
|
+
export { createDownloadManager, DownloadManager } from './offline/downloads.js';
|
|
5
|
+
export type { DownloadManifest, DownloadOptions, DownloadManagerOptions, DownloadStatus, DownloadProgress } from './offline/downloads.js';
|
|
6
|
+
export { createLocalJobs, LocalJobs, createSyncQueue, SyncQueue } from './offline/jobs.js';
|
|
7
|
+
export type { LocalJob, LocalJobStatus, LocalJobContext, LocalJobHandler, SyncOperation, SyncHandler } from './offline/jobs.js';
|
|
8
|
+
//# sourceMappingURL=offline.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"offline.d.ts","sourceRoot":"","sources":["../src/offline.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,YAAY,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AACpJ,YAAY,EAAE,mBAAmB,EAAE,YAAY,EAAE,gBAAgB,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAClI,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAChF,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,sBAAsB,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1I,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC3F,YAAY,EAAE,QAAQ,EAAE,cAAc,EAAE,eAAe,EAAE,eAAe,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC"}
|
package/dist/offline.js
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** Optional local-content APIs. Import from @proappstore/sdk/offline. */
|
|
2
|
+
export { createOfflineStore, OfflineStore, OfflineError, bindOfflineAccount, localStorageStatus, OFFLINE_SCHEMA_VERSION } from './offline/store.js';
|
|
3
|
+
export { createDownloadManager, DownloadManager } from './offline/downloads.js';
|
|
4
|
+
export { createLocalJobs, LocalJobs, createSyncQueue, SyncQueue } from './offline/jobs.js';
|
|
5
|
+
//# sourceMappingURL=offline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"offline.js","sourceRoot":"","sources":["../src/offline.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,YAAY,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAEpJ,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEhF,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC"}
|
package/dist/sdk-version.js
CHANGED
|
@@ -3,5 +3,5 @@
|
|
|
3
3
|
* placeholder: `scripts/stamp-version.mjs` writes the package.json version into
|
|
4
4
|
* dist on build and again on prepack, after publish.yml has bumped it.
|
|
5
5
|
*/
|
|
6
|
-
export const SDK_VERSION = '1.16.
|
|
6
|
+
export const SDK_VERSION = '1.16.97';
|
|
7
7
|
//# sourceMappingURL=sdk-version.js.map
|
|
@@ -67,7 +67,9 @@ export declare function useOnline(): boolean;
|
|
|
67
67
|
* live region is always present, so the change is announced. Dismissible;
|
|
68
68
|
* clears itself on reconnect, and a later drop shows it again.
|
|
69
69
|
*/
|
|
70
|
-
export declare function OfflineBanner(
|
|
70
|
+
export declare function OfflineBanner({ local }?: {
|
|
71
|
+
local?: boolean;
|
|
72
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
71
73
|
/** The first focusable element: hidden until focused, moves focus to the shell's `<main id="main">`. */
|
|
72
74
|
export declare function SkipLink({ mainRef }: {
|
|
73
75
|
mainRef: RefObject<HTMLElement | null>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shell-resilience.d.ts","sourceRoot":"","sources":["../src/shell-resilience.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EAQT,KAAK,SAAS,EACd,KAAK,SAAS,EACd,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AACf,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAK9C,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,KAAK,CAAC;IACb,mDAAmD;IACnD,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAED,UAAU,aAAa;IACrB,GAAG,EAAE,WAAW,CAAC;IACjB,WAAW,EAAE,CAAC,CAAC,GAAG,EAAE,iBAAiB,KAAK,SAAS,CAAC,GAAG,SAAS,CAAC;IACjE,uFAAuF;IACvF,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED,UAAU,aAAa;IACrB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;GAKG;AACH,qBAAa,kBAAmB,SAAQ,SAAS,CAAC,aAAa,EAAE,aAAa,CAAC;IACpE,KAAK,EAAE,aAAa,CAAkD;IAE/E,MAAM,CAAC,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC;IAIvE,MAAM,CAAC,wBAAwB,CAAC,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,GAAG,IAAI;IAIjG,iBAAiB,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,GAAG,IAAI;IAKjE,KAAK,QAAO,IAAI,CAAmC;IAE1C,MAAM,IAAI,SAAS;CAc7B;AAID,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;AAE7D,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAC5B,yFAAyF;IACzF,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,QAAQ;IACvB,sCAAsC;IACtC,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,KAAK,MAAM,CAAC;IAC1D,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;CAC/B;AAcD;;;;;;;;GAQG;AACH,wBAAgB,QAAQ,IAAI,QAAQ,CAInC;AAkBD;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,2CAqBlE;AAID,+EAA+E;AAC/E,wBAAgB,SAAS,IAAI,OAAO,CAcnC;AAED;;;;GAIG;AACH,wBAAgB,aAAa,
|
|
1
|
+
{"version":3,"file":"shell-resilience.d.ts","sourceRoot":"","sources":["../src/shell-resilience.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EAQT,KAAK,SAAS,EACd,KAAK,SAAS,EACd,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AACf,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAK9C,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,KAAK,CAAC;IACb,mDAAmD;IACnD,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAED,UAAU,aAAa;IACrB,GAAG,EAAE,WAAW,CAAC;IACjB,WAAW,EAAE,CAAC,CAAC,GAAG,EAAE,iBAAiB,KAAK,SAAS,CAAC,GAAG,SAAS,CAAC;IACjE,uFAAuF;IACvF,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED,UAAU,aAAa;IACrB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;GAKG;AACH,qBAAa,kBAAmB,SAAQ,SAAS,CAAC,aAAa,EAAE,aAAa,CAAC;IACpE,KAAK,EAAE,aAAa,CAAkD;IAE/E,MAAM,CAAC,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC;IAIvE,MAAM,CAAC,wBAAwB,CAAC,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,GAAG,IAAI;IAIjG,iBAAiB,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,GAAG,IAAI;IAKjE,KAAK,QAAO,IAAI,CAAmC;IAE1C,MAAM,IAAI,SAAS;CAc7B;AAID,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;AAE7D,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAC5B,yFAAyF;IACzF,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,QAAQ;IACvB,sCAAsC;IACtC,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,KAAK,MAAM,CAAC;IAC1D,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;CAC/B;AAcD;;;;;;;;GAQG;AACH,wBAAgB,QAAQ,IAAI,QAAQ,CAInC;AAkBD;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,2CAqBlE;AAID,+EAA+E;AAC/E,wBAAgB,SAAS,IAAI,OAAO,CAcnC;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,EAAE,KAAa,EAAE,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO,2CAkBxE;AAID,wGAAwG;AACxG,wBAAgB,QAAQ,CAAC,EAAE,OAAO,EAAE,EAAE;IAAE,OAAO,EAAE,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAA;CAAE,2CAe/E;AAID;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,IAAI,CA0CxH"}
|
package/dist/shell-resilience.js
CHANGED
|
@@ -97,14 +97,14 @@ export function useOnline() {
|
|
|
97
97
|
* live region is always present, so the change is announced. Dismissible;
|
|
98
98
|
* clears itself on reconnect, and a later drop shows it again.
|
|
99
99
|
*/
|
|
100
|
-
export function OfflineBanner() {
|
|
100
|
+
export function OfflineBanner({ local = false } = {}) {
|
|
101
101
|
const online = useOnline();
|
|
102
102
|
const [dismissed, setDismissed] = useState(false);
|
|
103
103
|
useEffect(() => {
|
|
104
104
|
if (online)
|
|
105
105
|
setDismissed(false);
|
|
106
106
|
}, [online]);
|
|
107
|
-
return (_jsx("div", { role: "status", "aria-live": "polite", children: !online && !dismissed && (_jsxs("div", { className: "pas-offline flex items-center justify-between gap-3 text-sm", children: [_jsx("span", { children: "You're offline. Changes can't be saved until the connection is back." }), _jsx("button", { type: "button", className: "pas-dismiss min-h-11 min-w-11", "aria-label": "Dismiss offline notice", onClick: () => setDismissed(true), children: "\u00D7" })] })) }));
|
|
107
|
+
return (_jsx("div", { role: "status", "aria-live": "polite", children: !online && !dismissed && (_jsxs("div", { className: "pas-offline flex items-center justify-between gap-3 text-sm", children: [_jsx("span", { children: local ? "You're offline. Local content is available; cloud services need a connection." : "You're offline. Changes can't be saved until the connection is back." }), _jsx("button", { type: "button", className: "pas-dismiss min-h-11 min-w-11", "aria-label": "Dismiss offline notice", onClick: () => setDismissed(true), children: "\u00D7" })] })) }));
|
|
108
108
|
}
|
|
109
109
|
// ── Skip link ───────────────────────────────────────────────────
|
|
110
110
|
/** The first focusable element: hidden until focused, moves focus to the shell's `<main id="main">`. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shell-resilience.js","sourceRoot":"","sources":["../src/shell-resilience.tsx"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"shell-resilience.js","sourceRoot":"","sources":["../src/shell-resilience.tsx"],"names":[],"mappings":"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"}
|
package/dist/shell.d.ts
CHANGED
|
@@ -30,6 +30,10 @@ export interface AppShellRenderContext {
|
|
|
30
30
|
* A custom `renderTopbar` should place it. */
|
|
31
31
|
nav: ReactNode;
|
|
32
32
|
}
|
|
33
|
+
/** Local chrome may render while auth is pending or signed out. No synthetic user. */
|
|
34
|
+
export type LocalAppShellRenderContext = Omit<AppShellRenderContext, 'user'> & {
|
|
35
|
+
user: User | null;
|
|
36
|
+
};
|
|
33
37
|
/** @deprecated Use AppShellRenderContext. Retained for the next major version. */
|
|
34
38
|
export type ProShellRenderContext = AppShellRenderContext;
|
|
35
39
|
export interface AppShellNavContext {
|
|
@@ -44,8 +48,10 @@ export type ProShellNavContext = AppShellNavContext;
|
|
|
44
48
|
export interface AppShellProps {
|
|
45
49
|
/** The ProAppStore SDK instance from initPro(). */
|
|
46
50
|
app: ProAppStore;
|
|
47
|
-
/**
|
|
51
|
+
/** App content. Authenticated by default; local mode renders independently of cloud auth. */
|
|
48
52
|
children: ReactNode;
|
|
53
|
+
/** Opt-in device/local content. Does not authorize cloud calls or change private-app hosting. */
|
|
54
|
+
access?: 'authenticated' | 'local';
|
|
49
55
|
/** App name shown in the topbar. */
|
|
50
56
|
appName?: string;
|
|
51
57
|
/**
|
|
@@ -101,6 +107,9 @@ export interface AppShellProps {
|
|
|
101
107
|
renderTopbar?: (ctx: AppShellRenderContext) => ReactNode;
|
|
102
108
|
/** Replace the default footer. Return null to omit it. */
|
|
103
109
|
renderFooter?: (ctx: AppShellRenderContext) => ReactNode;
|
|
110
|
+
/** Local-mode custom chrome. Existing authenticated callbacks are never given a null user. */
|
|
111
|
+
renderLocalTopbar?: (ctx: LocalAppShellRenderContext) => ReactNode;
|
|
112
|
+
renderLocalFooter?: (ctx: LocalAppShellRenderContext) => ReactNode;
|
|
104
113
|
/**
|
|
105
114
|
* Replace the fallback shown when a screen throws while rendering (#236).
|
|
106
115
|
* The error is already recorded via `app.logs`; call `reset` to retry.
|
|
@@ -141,7 +150,7 @@ export type ProShellProps = AppShellProps;
|
|
|
141
150
|
* }
|
|
142
151
|
* ```
|
|
143
152
|
*/
|
|
144
|
-
export declare function AppShell({ app, children, appName, branding, providers, nav, renderNav, onNavigate, allowFree, showThemeToggle, menuItems, hideTopbar, hideFooter, renderTopbar, renderFooter, renderError, renderLoading, }: AppShellProps): import("react/jsx-runtime").JSX.Element;
|
|
153
|
+
export declare function AppShell({ app, children, access, appName, branding, providers, nav, renderNav, onNavigate, allowFree, showThemeToggle, menuItems, hideTopbar, hideFooter, renderTopbar, renderFooter, renderLocalTopbar, renderLocalFooter, renderError, renderLoading, }: AppShellProps): import("react/jsx-runtime").JSX.Element;
|
|
145
154
|
/** @deprecated Use AppShell. This is the same component, so switching names preserves React state. */
|
|
146
155
|
export declare const ProShell: typeof AppShell;
|
|
147
156
|
//# sourceMappingURL=shell.d.ts.map
|
package/dist/shell.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../src/shell.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA8E,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AACnH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9C,OAAO,EAAsC,KAAK,OAAO,EAAE,MAAM,aAAa,CAAC;AAE/E,OAAO,EAML,KAAK,iBAAiB,EACvB,MAAM,uBAAuB,CAAC;AAE/B,YAAY,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC3C,YAAY,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE/D,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,MAAM,WAAW,qBAAqB;IACpC,2CAA2C;IAC3C,GAAG,EAAE,WAAW,CAAC;IACjB,2CAA2C;IAC3C,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,kFAAkF;IAClF,IAAI,EAAE,IAAI,CAAC;IACX,sEAAsE;IACtE,YAAY,EAAE,YAAY,GAAG,IAAI,CAAC;IAClC,mDAAmD;IACnD,cAAc,EAAE,SAAS,CAAC;IAC1B,6EAA6E;IAC7E,WAAW,EAAE,SAAS,CAAC;IACvB,kFAAkF;IAClF,QAAQ,EAAE,SAAS,CAAC;IACpB;mDAC+C;IAC/C,GAAG,EAAE,SAAS,CAAC;CAChB;AAED,kFAAkF;AAClF,MAAM,MAAM,qBAAqB,GAAG,qBAAqB,CAAC;AAE1D,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,0FAA0F;IAC1F,WAAW,EAAE,MAAM,CAAC;IACpB,2EAA2E;IAC3E,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACpC;AAED,+EAA+E;AAC/E,MAAM,MAAM,kBAAkB,GAAG,kBAAkB,CAAC;AAEpD,MAAM,WAAW,aAAa;IAC5B,mDAAmD;IACnD,GAAG,EAAE,WAAW,CAAC;IACjB,
|
|
1
|
+
{"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../src/shell.tsx"],"names":[],"mappings":"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"}
|
package/dist/shell.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { Suspense, useEffect, useInsertionEffect, useLayoutEffect, useRef, useState } from 'react';
|
|
3
|
-
import { ProfileMenu, ProBadge, GateScreen, TextSizeToggle, Spinner } from './ui.js';
|
|
3
|
+
import { ProfileMenu, ProBadge, GateScreen, TextSizeToggle, Spinner, SignInButtons } from './ui.js';
|
|
4
4
|
import { ProProvider } from './provider.js';
|
|
5
5
|
import { activeHref, NavBar, useCurrentPath } from './navbar.js';
|
|
6
6
|
import { SHELL_CSS } from './shell-css.js';
|
|
@@ -35,10 +35,20 @@ import { OfflineBanner, ShellErrorBoundary, SkipLink, ToastProvider, useRouteCha
|
|
|
35
35
|
* }
|
|
36
36
|
* ```
|
|
37
37
|
*/
|
|
38
|
-
export function AppShell({ app, children, appName, branding = 'platform', providers, nav, renderNav, onNavigate, allowFree = true, showThemeToggle = true, menuItems, hideTopbar = false, hideFooter = false, renderTopbar, renderFooter, renderError, renderLoading, }) {
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
const [
|
|
38
|
+
export function AppShell({ app, children, access = 'authenticated', appName, branding = 'platform', providers, nav, renderNav, onNavigate, allowFree = true, showThemeToggle = true, menuItems, hideTopbar = false, hideFooter = false, renderTopbar, renderFooter, renderLocalTopbar, renderLocalFooter, renderError, renderLoading, }) {
|
|
39
|
+
// #531: render auth and subscription state only for their SDK/owner identity.
|
|
40
|
+
// Passive-effect cancellation alone loses a same-tick account-change race.
|
|
41
|
+
const [auth, setAuth] = useState(() => ({ app, user: app.auth.user, status: app.auth.status, epoch: 0 }));
|
|
42
|
+
const activeAuth = auth.app === app ? auth : { app, user: app.auth.user, status: app.auth.status, epoch: -1 };
|
|
43
|
+
const { user, status: authStatus, epoch: authEpoch } = activeAuth;
|
|
44
|
+
const authOwner = useRef({ app, id: user?.id, status: authStatus, epoch: authEpoch });
|
|
45
|
+
const [subscriptionResult, setSubscriptionResult] = useState(null);
|
|
46
|
+
const hasSubscriptionResult = subscriptionResult?.app === app && subscriptionResult.ownerId === user?.id && subscriptionResult.epoch === authEpoch;
|
|
47
|
+
const subscription = hasSubscriptionResult ? subscriptionResult.value : null;
|
|
48
|
+
const gate = authStatus === 'pending' ? 'loading'
|
|
49
|
+
: authStatus !== 'signed-in' || !user ? 'signed-out'
|
|
50
|
+
: !hasSubscriptionResult ? 'loading'
|
|
51
|
+
: allowFree || subscription?.status === 'active' ? 'ready' : 'no-subscription';
|
|
42
52
|
const [currentPath, setCurrentPath] = useCurrentPath();
|
|
43
53
|
const mainRef = useRef(null);
|
|
44
54
|
const beforeNavigate = useRouteChangeEffects(currentPath, mainRef, onNavigate !== undefined);
|
|
@@ -66,40 +76,42 @@ export function AppShell({ app, children, appName, branding = 'platform', provid
|
|
|
66
76
|
// shows it.
|
|
67
77
|
useEffect(() => {
|
|
68
78
|
const unsubscribe = app.auth.onStatus((status, u) => {
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
79
|
+
const previous = authOwner.current;
|
|
80
|
+
const changed = previous.app !== app || previous.id !== u?.id || previous.status !== status;
|
|
81
|
+
const epoch = previous.epoch + Number(changed);
|
|
82
|
+
if (changed)
|
|
83
|
+
setSubscriptionResult(null);
|
|
84
|
+
authOwner.current = { app, id: u?.id, status, epoch };
|
|
85
|
+
setAuth({ app, user: u, status, epoch });
|
|
72
86
|
});
|
|
73
87
|
void app.auth.init();
|
|
74
88
|
return unsubscribe;
|
|
75
89
|
}, [app]);
|
|
76
|
-
// Check subscription after auth.
|
|
90
|
+
// Check subscription after auth. Identity guards run before React's cleanup,
|
|
91
|
+
// so a previous owner's response cannot reopen the current owner's gate.
|
|
77
92
|
useEffect(() => {
|
|
78
|
-
if (!user)
|
|
93
|
+
if (!user || authStatus !== 'signed-in' || authOwner.current.epoch !== authEpoch)
|
|
79
94
|
return;
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
setGate(allowFree ? 'ready' : 'no-subscription');
|
|
91
|
-
});
|
|
92
|
-
}, [user, app, allowFree]);
|
|
95
|
+
let current = true;
|
|
96
|
+
const accept = (value) => {
|
|
97
|
+
const owner = authOwner.current;
|
|
98
|
+
if (!current || owner.app !== app || owner.id !== user.id || owner.status !== 'signed-in' || owner.epoch !== authEpoch)
|
|
99
|
+
return;
|
|
100
|
+
setSubscriptionResult({ app, ownerId: user.id, epoch: authEpoch, value });
|
|
101
|
+
};
|
|
102
|
+
app.subscription.status().then(accept).catch(() => accept(null));
|
|
103
|
+
return () => { current = false; };
|
|
104
|
+
}, [user, authStatus, authEpoch, app]);
|
|
93
105
|
// --- Gates ---
|
|
94
|
-
if (gate === 'loading' && renderLoading)
|
|
106
|
+
if (access !== 'local' && gate === 'loading' && renderLoading)
|
|
95
107
|
return _jsx(_Fragment, { children: renderLoading() });
|
|
96
|
-
if (gate !== 'ready') {
|
|
108
|
+
if (access !== 'local' && gate !== 'ready') {
|
|
97
109
|
return _jsx(GateScreen, { gate: gate, app: app, appName: appName, branding: branding, ...(providers ? { providers } : {}) });
|
|
98
110
|
}
|
|
99
|
-
if (!user) {
|
|
111
|
+
if (access !== 'local' && !user) {
|
|
100
112
|
return _jsx(GateScreen, { gate: "signed-out", app: app, appName: appName, branding: branding, ...(providers ? { providers } : {}) });
|
|
101
113
|
}
|
|
102
|
-
const profileMenu = (_jsx(ProfileMenu, { app: app, showThemeToggle: showThemeToggle, showSubscriptionBadge: branding === 'platform', children: menuItems?.map((item, i) => (_jsx("button", { type: "button", onClick: item.onClick, className: "pas-menu-item block w-full cursor-pointer border-0 bg-transparent px-4 py-2 text-left text-[0.85rem] text-[var(--ink)]", children: item.label }, i))) }));
|
|
114
|
+
const profileMenu = user ? (_jsx(ProfileMenu, { app: app, showThemeToggle: showThemeToggle, showSubscriptionBadge: branding === 'platform', children: menuItems?.map((item, i) => (_jsx("button", { type: "button", onClick: item.onClick, className: "pas-menu-item block w-full cursor-pointer border-0 bg-transparent px-4 py-2 text-left text-[0.85rem] text-[var(--ink)]", children: item.label }, i))) })) : _jsx(SignInButtons, { app: app, ...(providers ? { providers } : {}) });
|
|
103
115
|
// Client-side navigation goes through the shell, so it knows the route changed
|
|
104
116
|
// (scroll, focus, titles). Without onNavigate, items are plain links.
|
|
105
117
|
const navigate = onNavigate
|
|
@@ -128,11 +140,18 @@ export function AppShell({ app, children, appName, branding = 'platform', provid
|
|
|
128
140
|
proBadge: branding === 'platform' && subscription?.status === 'active' ? _jsx(ProBadge, {}) : null,
|
|
129
141
|
nav: navNode,
|
|
130
142
|
};
|
|
131
|
-
const
|
|
132
|
-
const
|
|
143
|
+
const authenticatedContext = user ? { ...shellContext, user } : null;
|
|
144
|
+
const customTopbar = access === 'local' && renderLocalTopbar
|
|
145
|
+
? () => renderLocalTopbar(shellContext)
|
|
146
|
+
: renderTopbar && authenticatedContext ? () => renderTopbar(authenticatedContext) : null;
|
|
147
|
+
const topbar = customTopbar ? customTopbar() : hideTopbar ? null : (_jsxs("header", { className: "pas-topbar sticky top-0 z-50 flex items-center justify-between border-b border-[var(--line)] bg-[var(--panel)] px-4 py-2", children: [_jsxs("div", { className: "pas-topbar__brand flex items-center gap-3", children: [branding === 'platform' && _jsx("a", { href: "https://proappstore.online", className: "pas-topbar__logo text-base font-extrabold text-[var(--accent)] no-underline", children: "Pro" }), appName && _jsx("span", { className: "pas-topbar__app text-[0.85rem] font-semibold text-[var(--muted)]", children: appName }), shellContext.proBadge] }), shellContext.nav, _jsxs("div", { className: "pas-topbar__account flex items-center gap-2", children: [shellContext.textSizeToggle, shellContext.profileMenu] })] }));
|
|
148
|
+
const customFooter = access === 'local' && renderLocalFooter
|
|
149
|
+
? () => renderLocalFooter(shellContext)
|
|
150
|
+
: renderFooter && authenticatedContext ? () => renderFooter(authenticatedContext) : null;
|
|
151
|
+
const footer = customFooter ? customFooter() : hideFooter || branding === 'app' ? null : (_jsxs("footer", { className: "pas-footer border-t border-[var(--line)] p-4 text-center text-xs text-[var(--muted)]", children: ["Part of", ' ', _jsx("a", { href: "https://proappstore.online", className: "pas-footer__link font-semibold text-[var(--accent)] no-underline", children: "ProAppStore" })] }));
|
|
133
152
|
const loading = renderLoading ? renderLoading() : (_jsx("div", { className: "pas-shell-loading flex flex-1 items-center justify-center px-4 py-12", children: _jsx(Spinner, { size: 28 }) }));
|
|
134
153
|
// --- Ready: render app with topbar ---
|
|
135
|
-
return (_jsx(ProProvider, { app: app, children: _jsx(ToastProvider, { children: _jsxs("div", { className: "pas-shell flex min-h-dvh flex-col", children: [_jsx(SkipLink, { mainRef: mainRef }), topbar, _jsx(OfflineBanner, {}), _jsx("main", { id: "main", ref: mainRef, tabIndex: -1, className: "pas-main flex flex-1 flex-col", children: _jsx(ShellErrorBoundary, { app: app, renderError: renderError, resetKey: currentPath, children: _jsx(Suspense, { fallback: loading, children: children }) }) }), footer] }) }) }));
|
|
154
|
+
return (_jsx(ProProvider, { app: app, children: _jsx(ToastProvider, { children: _jsxs("div", { className: "pas-shell flex min-h-dvh flex-col", children: [_jsx(SkipLink, { mainRef: mainRef }), topbar, _jsx(OfflineBanner, { local: access === 'local' }), _jsx("main", { id: "main", ref: mainRef, tabIndex: -1, className: "pas-main flex flex-1 flex-col", children: _jsx(ShellErrorBoundary, { app: app, renderError: renderError, resetKey: currentPath, children: _jsx(Suspense, { fallback: loading, children: children }) }) }), footer] }) }, access === 'local' ? JSON.stringify([app.appId, user?.id ?? null]) : undefined) }));
|
|
136
155
|
}
|
|
137
156
|
/** @deprecated Use AppShell. This is the same component, so switching names preserves React state. */
|
|
138
157
|
export const ProShell = AppShell;
|