@swoff/cli 0.4.3 → 0.4.4
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/lib/commands/generate-guide.js +15 -15
- package/dist/lib/commands/generate-guide.js.map +1 -1
- package/dist/lib/commands/init.js +7 -1
- package/dist/lib/commands/init.js.map +1 -1
- package/dist/lib/generators/file-generators/client-injector-bundle.js +2 -1
- package/dist/lib/generators/file-generators/client-injector-bundle.js.map +1 -1
- package/dist/lib/generators/file-generators/client-injector.js +2 -1
- package/dist/lib/generators/file-generators/client-injector.js.map +1 -1
- package/dist/lib/generators/file-generators/generate-framework-adapters.js +28 -22
- package/dist/lib/generators/file-generators/generate-framework-adapters.js.map +1 -1
- package/dist/lib/generators/sw-sections/background-precache.js +8 -1
- package/dist/lib/generators/sw-sections/background-precache.js.map +1 -1
- package/dist/lib/generators/sw-sections/batch-refresh-queue.js +2 -5
- package/dist/lib/generators/sw-sections/batch-refresh-queue.js.map +1 -1
- package/dist/lib/generators/sw-sections/fetch-handler.js +14 -2
- package/dist/lib/generators/sw-sections/fetch-handler.js.map +1 -1
- package/dist/lib/shared/config-types.js +1 -0
- package/dist/lib/shared/config-types.js.map +1 -1
- package/dist/lib/utils/detect-framework.js +2 -0
- package/dist/lib/utils/detect-framework.js.map +1 -1
- package/dist/runtime/client-injector-bundle.js +2 -2
- package/dist/runtime/client-injector-bundle.js.map +1 -1
- package/dist/runtime/client-injector.js +3 -2
- package/dist/runtime/client-injector.js.map +1 -1
- package/dist/runtime/gql-wrapper.js +3 -1
- package/dist/runtime/gql-wrapper.js.map +1 -1
- package/dist/runtime/swoff-api-bundle.js +2 -1
- package/dist/runtime/swoff-api-bundle.js.map +1 -1
- package/package.json +1 -1
- package/templates/react/{useOfflineAnalytics.jsx → useSwoffAnalytics.jsx} +3 -3
- package/templates/react/{useOfflineAnalytics.tsx → useSwoffAnalytics.tsx} +3 -3
- package/templates/react/{useAuth.jsx → useSwoffAuth.jsx} +2 -2
- package/templates/react/{useAuth.tsx → useSwoffAuth.tsx} +2 -2
- package/templates/react/{useCachedFetch.jsx → useSwoffFetch.jsx} +6 -6
- package/templates/react/{useCachedFetch.tsx → useSwoffFetch.tsx} +7 -7
- package/templates/react/{useMutation.jsx → useSwoffMutation.jsx} +3 -3
- package/templates/react/{useMutation.tsx → useSwoffMutation.tsx} +3 -3
- package/templates/react/{useMutationState.jsx → useSwoffMutationState.jsx} +1 -1
- package/templates/react/{useMutationState.tsx → useSwoffMutationState.tsx} +2 -2
- package/templates/react/{useNetworkStatus.jsx → useSwoffNetwork.jsx} +2 -2
- package/templates/react/{useNetworkStatus.tsx → useSwoffNetwork.tsx} +2 -2
- package/templates/react/{usePrecacheProgress.jsx → useSwoffPrecache.jsx} +4 -7
- package/templates/react/{usePrecacheProgress.tsx → useSwoffPrecache.tsx} +4 -7
- package/templates/react/{usePrefetch.jsx → useSwoffPrefetch.jsx} +2 -2
- package/templates/react/{usePrefetch.tsx → useSwoffPrefetch.tsx} +2 -2
- package/templates/react/{usePushSubscription.jsx → useSwoffPush.jsx} +1 -1
- package/templates/react/{usePushSubscription.tsx → useSwoffPush.tsx} +1 -1
- package/templates/react/{usePwaInstall.jsx → useSwoffPwa.jsx} +1 -1
- package/templates/react/{usePwaInstall.tsx → useSwoffPwa.tsx} +1 -1
- package/templates/react/{useMutationQueue.jsx → useSwoffQueue.jsx} +2 -2
- package/templates/react/{useMutationQueue.tsx → useSwoffQueue.tsx} +2 -2
- package/templates/react/{useStorageEstimate.jsx → useSwoffStorage.jsx} +2 -2
- package/templates/react/{useStorageEstimate.tsx → useSwoffStorage.tsx} +2 -2
- package/templates/react/{useBackgroundSync.jsx → useSwoffSync.jsx} +1 -1
- package/templates/react/{useBackgroundSync.tsx → useSwoffSync.tsx} +1 -1
- package/templates/svelte/useSwoffAnalytics.js +31 -0
- package/templates/svelte/useSwoffAnalytics.ts +37 -0
- package/templates/svelte/useSwoffAuth.js +95 -0
- package/templates/svelte/useSwoffAuth.ts +96 -0
- package/templates/svelte/useSwoffFetch.js +97 -0
- package/templates/svelte/useSwoffFetch.ts +112 -0
- package/templates/svelte/useSwoffMutation.js +110 -0
- package/templates/svelte/useSwoffMutation.ts +141 -0
- package/templates/svelte/useSwoffMutationState.js +27 -0
- package/templates/svelte/useSwoffMutationState.ts +28 -0
- package/templates/svelte/useSwoffNetwork.js +75 -0
- package/templates/svelte/useSwoffNetwork.ts +75 -0
- package/templates/svelte/useSwoffPrecache.js +19 -0
- package/templates/svelte/useSwoffPrecache.ts +19 -0
- package/templates/svelte/useSwoffPrefetch.js +19 -0
- package/templates/svelte/useSwoffPrefetch.ts +20 -0
- package/templates/svelte/useSwoffPush.js +82 -0
- package/templates/svelte/useSwoffPush.ts +82 -0
- package/templates/svelte/useSwoffPwa.js +27 -0
- package/templates/svelte/useSwoffPwa.ts +27 -0
- package/templates/svelte/useSwoffQueue.js +57 -0
- package/templates/svelte/useSwoffQueue.ts +67 -0
- package/templates/svelte/useSwoffReset.js +21 -0
- package/templates/svelte/useSwoffReset.ts +32 -0
- package/templates/svelte/useSwoffStorage.js +47 -0
- package/templates/svelte/useSwoffStorage.ts +47 -0
- package/templates/svelte/useSwoffSync.js +31 -0
- package/templates/svelte/useSwoffSync.ts +31 -0
- package/templates/vue/useSwoffAnalytics.js +46 -0
- package/templates/vue/useSwoffAnalytics.ts +54 -0
- package/templates/vue/useSwoffAuth.js +106 -0
- package/templates/vue/useSwoffAuth.ts +118 -0
- package/templates/vue/useSwoffFetch.js +127 -0
- package/templates/vue/useSwoffFetch.ts +143 -0
- package/templates/vue/useSwoffMutation.js +124 -0
- package/templates/vue/useSwoffMutation.ts +155 -0
- package/templates/vue/useSwoffMutationState.js +35 -0
- package/templates/vue/useSwoffMutationState.ts +36 -0
- package/templates/vue/useSwoffNetwork.js +86 -0
- package/templates/vue/useSwoffNetwork.ts +89 -0
- package/templates/vue/useSwoffPrecache.js +19 -0
- package/templates/vue/useSwoffPrecache.ts +19 -0
- package/templates/vue/useSwoffPrefetch.js +33 -0
- package/templates/vue/useSwoffPrefetch.ts +41 -0
- package/templates/vue/useSwoffPush.js +81 -0
- package/templates/vue/useSwoffPush.ts +81 -0
- package/templates/vue/useSwoffPwa.js +27 -0
- package/templates/vue/useSwoffPwa.ts +27 -0
- package/templates/vue/useSwoffQueue.js +70 -0
- package/templates/vue/useSwoffQueue.ts +82 -0
- package/templates/vue/useSwoffReset.js +32 -0
- package/templates/vue/useSwoffReset.ts +39 -0
- package/templates/vue/useSwoffStorage.js +56 -0
- package/templates/vue/useSwoffStorage.ts +57 -0
- package/templates/vue/useSwoffSync.js +30 -0
- package/templates/vue/useSwoffSync.ts +30 -0
|
@@ -1449,6 +1449,7 @@ function generateGqlSection(flags) {
|
|
|
1449
1449
|
var variables = options.variables;
|
|
1450
1450
|
var tags = options.tags || tagsFromOpName(opName);
|
|
1451
1451
|
var endpoint = GQL_ENDPOINTS[endpointIndex] || GQL_ENDPOINTS[0];
|
|
1452
|
+
var invalidateTags = isRead ? undefined : (options.invalidate ? options.invalidate : (opName ? tagsFromOpName(opName) : undefined));
|
|
1452
1453
|
|
|
1453
1454
|
return bodyHash({ query: query, variables: variables }).then(function (hash) {
|
|
1454
1455
|
return fetchWithCache(endpoint, {
|
|
@@ -1462,7 +1463,7 @@ function generateGqlSection(flags) {
|
|
|
1462
1463
|
type: isRead ? "read" : "mutation",
|
|
1463
1464
|
auth: options.auth,
|
|
1464
1465
|
queueOffline: options.queueOffline,
|
|
1465
|
-
invalidate:
|
|
1466
|
+
invalidate: invalidateTags,
|
|
1466
1467
|
});
|
|
1467
1468
|
}).then(function (result) {
|
|
1468
1469
|
var response = result.response;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"swoff-api-bundle.js","sourceRoot":"","sources":["../../src/runtime/swoff-api-bundle.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"swoff-api-bundle.js","sourceRoot":"","sources":["../../src/runtime/swoff-api-bundle.ts"],"names":[],"mappings":"AA6BA,MAAM,UAAU,0BAA0B,CACxC,GAAmB,EACnB,KAA0B;IAE1B,MAAM,aAAa,GAAG,KAAK,CAAC,wBAAwB,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC,MAAM,GAAG,CAAC;QAC5G,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,wBAAwB,CAAC;QAChD,CAAC,CAAC,MAAM,CAAC;IAEX,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;IACvE,MAAM,mBAAmB,GAAG,KAAK,CAAC,8BAA8B,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC,MAAM,GAAG,CAAC;QAC9H,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,8BAA8B,CAAC;QACtD,CAAC,CAAC,MAAM,CAAC;IAEX,MAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACrE,MAAM,YAAY,GAAG,KAAK,CAAC,oBAAoB,CAAC,CAAC,CAAC,uBAAuB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACtF,MAAM,OAAO,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAClE,MAAM,OAAO,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAClE,MAAM,QAAQ,GAAG,KAAK,CAAC,wBAAwB,CAAC,CAAC,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7E,MAAM,cAAc,GAAG,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC,yBAAyB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAEvF,OAAO;;;;;oBAKW,aAAa;wBACT,YAAY;0BACV,mBAAmB;0BACnB,KAAK,CAAC,oBAAoB;;;;;;;;;;;;;;;;;;;;uBAoB7B,eAAe,CAAC,KAAK,CAAC,uBAAuB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsKnE,QAAQ,GAAG,YAAY,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,GAAG,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+CvE,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE;;EAEtD,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,+CAA+C,CAAC,CAAC,CAAC,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2QvG,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,wLAAwL,CAAC,CAAC,CAAC,EAAE;EACjN,KAAK,CAAC,oBAAoB,CAAC,CAAC,CAAC,4RAA4R,CAAC,CAAC,CAAC,EAAE;EAC9T,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,sEAAsE,CAAC,CAAC,CAAC,EAAE;EAC9F,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,qFAAqF,CAAC,CAAC,CAAC,EAAE;EAC7G,KAAK,CAAC,wBAAwB,CAAC,CAAC,CAAC,yOAAyO,CAAC,CAAC,CAAC,EAAE;EAC/Q,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC,mHAAmH,CAAC,CAAC,CAAC,EAAE;;;;;;;CAOnJ,CAAC;AACF,CAAC;AAED,SAAS,mBAAmB;IAC1B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmFR,CAAC;AACF,CAAC;AAED,SAAS,yBAAyB,CAAC,KAA0B;IAC3D,MAAM,WAAW,GAAG,KAAK,CAAC,cAAc,KAAK,KAAK;QAChD,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAkDE;QACJ,CAAC,CAAC;;;;;;;;;;;;;;;;;;QAkBE,CAAC;IAEP,OAAO;;+BAEsB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,kBAAkB,CAAC;yCAC9B,KAAK,CAAC,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAgCnE,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6ChB,CAAC;AACF,CAAC;AAED,SAAS,eAAe,CAAC,QAAkC;IACzD,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5D,MAAM,QAAQ,GAAG,mBAAmB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QACzD,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CACV,uBAAuB,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,eAAe,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,gBAAgB,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CACjK,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;AAC7C,CAAC;AAQD,SAAS,mBAAmB,CAAC,UAAkB,EAAE,YAAsB;IACrE,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACvC,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IAC/C,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,MAAM,UAAU,GAAa,EAAE,CAAC;IAEhC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAEtB,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAClB,UAAU,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YACjC,SAAS;QACX,CAAC;QAED,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzB,CAAC;QAED,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACjB,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC3B,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAChC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAC/B,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC7B,CAAC;aAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAChC,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;gBACjB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;gBACvD,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAC,CAAC;gBAChG,UAAU,CAAC,IAAI,CAAC,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC;YACxD,CAAC;iBAAM,CAAC;gBACN,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC;aAAM,CAAC;YACN,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IAED,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEzC,MAAM,eAAe,GAAG,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IACnD,MAAM,KAAK,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC;IAE3E,MAAM,oBAAoB,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/C,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;QAChC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QACzC,IAAI,OAAO,EAAE,CAAC;YACZ,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;gBACxB,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;IACH,CAAC;IACD,KAAK,MAAM,EAAE,IAAI,oBAAoB,EAAE,CAAC;QACtC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC;AAChE,CAAC;AAED,SAAS,mBAAmB,CAAC,KAA0B;IACrD,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,KAAK,QAAQ,CAAC;IAC7C,OAAO;;;;;;;;YAQG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmGxC,QAAQ,CAAC,CAAC,CAAC;;;;CAIZ,CAAC,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkCH;;;;;;;;;;;;;;;CAeA,CAAC;AACF,CAAC;AAED,SAAS,sBAAsB,CAAC,KAA0B;IACxD,OAAO;;;;;;;;CAQR,CAAC;AACF,CAAC;AAED,SAAS,uBAAuB,CAAC,KAA0B;IACzD,OAAO;;;;2BAIkB,KAAK,CAAC,sBAAsB;+BACxB,KAAK,CAAC,yBAAyB;4BAClC,KAAK,CAAC,uBAAuB;iCACxB,KAAK,CAAC,2BAA2B;qCAC7B,KAAK,CAAC,8BAA8B;gCACzC,KAAK,CAAC,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wBAqLxC,KAAK,CAAC,WAAW;QACnC,CAAC,CAAC,kDAAkD;QACpD,CAAC,CAAC,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwI9B,CAAC;AACF,CAAC;AAED,SAAS,kBAAkB,CAAC,KAA0B;IACpD,MAAM,WAAW,GAAG,KAAK,CAAC,wBAAwB;QAChD,CAAC,CAAC,6BAA6B;QAC/B,CAAC,CAAC,EAAE,CAAC;IAEP,OAAO;;;;;;EAMP,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgCZ,CAAC;AACF,CAAC;AAED,SAAS,kBAAkB,CAAC,KAA0B;IACpD,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IACzD,OAAO;;wBAEe,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2FpC,CAAC;AACF,CAAC"}
|
package/package.json
CHANGED
|
@@ -4,7 +4,7 @@ import { useState, useEffect, useCallback } from "react";
|
|
|
4
4
|
* Tracks offline navigation fallback events dispatched by the Service Worker.
|
|
5
5
|
*
|
|
6
6
|
* Usage:
|
|
7
|
-
* const { lastEvent, events } =
|
|
7
|
+
* const { lastEvent, events } = useSwoffAnalytics();
|
|
8
8
|
*
|
|
9
9
|
* // Render an offline indicator when a fallback was served:
|
|
10
10
|
* if (lastEvent) {
|
|
@@ -12,9 +12,9 @@ import { useState, useEffect, useCallback } from "react";
|
|
|
12
12
|
* }
|
|
13
13
|
*
|
|
14
14
|
* // Or pass a callback:
|
|
15
|
-
*
|
|
15
|
+
* useSwoffAnalytics((event) => console.log("Fallback:", event));
|
|
16
16
|
*/
|
|
17
|
-
export function
|
|
17
|
+
export function useSwoffAnalytics(callback) {
|
|
18
18
|
const [events, setEvents] = useState([]);
|
|
19
19
|
const [lastEvent, setLastEvent] = useState(null);
|
|
20
20
|
|
|
@@ -10,7 +10,7 @@ export interface OfflineFallbackEvent {
|
|
|
10
10
|
* Tracks offline navigation fallback events dispatched by the Service Worker.
|
|
11
11
|
*
|
|
12
12
|
* Usage:
|
|
13
|
-
* const { lastEvent, events } =
|
|
13
|
+
* const { lastEvent, events } = useSwoffAnalytics();
|
|
14
14
|
*
|
|
15
15
|
* // Render an offline indicator when a fallback was served:
|
|
16
16
|
* if (lastEvent) {
|
|
@@ -18,11 +18,11 @@ export interface OfflineFallbackEvent {
|
|
|
18
18
|
* }
|
|
19
19
|
*
|
|
20
20
|
* // Or pass a callback:
|
|
21
|
-
*
|
|
21
|
+
* useSwoffAnalytics((event) => console.log("Fallback:", event));
|
|
22
22
|
*
|
|
23
23
|
* @returns {{ lastEvent: OfflineFallbackEvent | null, events: OfflineFallbackEvent[], clear: () => void }}
|
|
24
24
|
*/
|
|
25
|
-
export function
|
|
25
|
+
export function useSwoffAnalytics(callback?: (event: OfflineFallbackEvent) => void) {
|
|
26
26
|
const [events, setEvents] = useState<OfflineFallbackEvent[]>([]);
|
|
27
27
|
const [lastEvent, setLastEvent] = useState<OfflineFallbackEvent | null>(null);
|
|
28
28
|
|
|
@@ -6,7 +6,7 @@ import { setAuth, clearAuth, ensureValidAuth } from "../auth/store.js";
|
|
|
6
6
|
* Reactive auth state with actions: setAuth, clearAuth, ensureValid.
|
|
7
7
|
*
|
|
8
8
|
* Usage:
|
|
9
|
-
* const { authenticated, auth, online, isLoading, error, setAuth, clearAuth, ensureValid } =
|
|
9
|
+
* const { authenticated, auth, online, isLoading, error, setAuth, clearAuth, ensureValid } = useSwoffAuth();
|
|
10
10
|
*
|
|
11
11
|
* // Login — call setAuth with the response from your login endpoint:
|
|
12
12
|
* const res = await fetch("/api/login", { method: "POST", body });
|
|
@@ -22,7 +22,7 @@ import { setAuth, clearAuth, ensureValidAuth } from "../auth/store.js";
|
|
|
22
22
|
* // Silent session restore:
|
|
23
23
|
* const authData = await ensureValid();
|
|
24
24
|
*/
|
|
25
|
-
export function
|
|
25
|
+
export function useSwoffAuth() {
|
|
26
26
|
const [state, setState] = useState(() => ({
|
|
27
27
|
authenticated: false,
|
|
28
28
|
auth: null,
|
|
@@ -10,7 +10,7 @@ import type { AuthData } from "../auth/adapter.ts";
|
|
|
10
10
|
* setAuth(), or the SW's AUTH_CLEARED broadcast).
|
|
11
11
|
*
|
|
12
12
|
* Usage:
|
|
13
|
-
* const { authenticated, auth, online, isLoading, error, setAuth, clearAuth, ensureValid } =
|
|
13
|
+
* const { authenticated, auth, online, isLoading, error, setAuth, clearAuth, ensureValid } = useSwoffAuth();
|
|
14
14
|
*
|
|
15
15
|
* // Login:
|
|
16
16
|
* const res = await fetch("/api/login", { method: "POST", body });
|
|
@@ -28,7 +28,7 @@ import type { AuthData } from "../auth/adapter.ts";
|
|
|
28
28
|
*
|
|
29
29
|
* @returns {{ authenticated, auth, online, isLoading, error, setAuth, clearAuth, ensureValid }}
|
|
30
30
|
*/
|
|
31
|
-
export function
|
|
31
|
+
export function useSwoffAuth() {
|
|
32
32
|
const [state, setState] = useState(() => ({
|
|
33
33
|
authenticated: false,
|
|
34
34
|
auth: null as AuthData | null,
|
|
@@ -6,27 +6,27 @@ import { generateTags } from "../cache/tags.js";
|
|
|
6
6
|
* Fetch and cache data with automatic invalidation, revalidation, and offline support.
|
|
7
7
|
*
|
|
8
8
|
* Usage:
|
|
9
|
-
* const { data, error, loading, refetch } =
|
|
9
|
+
* const { data, error, loading, refetch } = useSwoffFetch("/api/todos");
|
|
10
10
|
*
|
|
11
11
|
* // Select/transform data
|
|
12
|
-
* const { data: names } =
|
|
12
|
+
* const { data: names } = useSwoffFetch("/api/users", {
|
|
13
13
|
* select: (users) => users.map(u => u.name),
|
|
14
14
|
* });
|
|
15
15
|
*
|
|
16
16
|
* // Keep previous data while fetching next page
|
|
17
|
-
* const { data } =
|
|
17
|
+
* const { data } = useSwoffFetch(`/api/items?page=${page}`, {
|
|
18
18
|
* keepPreviousData: true,
|
|
19
19
|
* });
|
|
20
20
|
*
|
|
21
21
|
* // Retry on failure
|
|
22
|
-
* const { data } =
|
|
22
|
+
* const { data } = useSwoffFetch("/api/todos", { retry: 3 });
|
|
23
23
|
*
|
|
24
24
|
* // Placeholder data while loading
|
|
25
|
-
* const { data } =
|
|
25
|
+
* const { data } = useSwoffFetch("/api/todos", {
|
|
26
26
|
* placeholderData: { items: [] },
|
|
27
27
|
* });
|
|
28
28
|
*/
|
|
29
|
-
export function
|
|
29
|
+
export function useSwoffFetch(url, options = {}) {
|
|
30
30
|
const {
|
|
31
31
|
select,
|
|
32
32
|
retry: retryOpt,
|
|
@@ -7,35 +7,35 @@ import type { FetchWithCacheOptions } from "../fetch/core.ts";
|
|
|
7
7
|
* Fetch and cache data with automatic invalidation, revalidation, and offline support.
|
|
8
8
|
*
|
|
9
9
|
* Usage:
|
|
10
|
-
* const { data, error, loading, refetch } =
|
|
10
|
+
* const { data, error, loading, refetch } = useSwoffFetch<MyType>("/api/todos");
|
|
11
11
|
*
|
|
12
12
|
* // Select/transform data — skips re-render if selected value hasn't changed
|
|
13
|
-
* const { data: names } =
|
|
13
|
+
* const { data: names } = useSwoffFetch("/api/users", {
|
|
14
14
|
* select: (users) => users.map(u => u.name),
|
|
15
15
|
* });
|
|
16
16
|
*
|
|
17
17
|
* // Keep previous data while fetching the next page
|
|
18
|
-
* const { data } =
|
|
18
|
+
* const { data } = useSwoffFetch(`/api/items?page=${page}`, {
|
|
19
19
|
* keepPreviousData: true,
|
|
20
20
|
* });
|
|
21
21
|
*
|
|
22
22
|
* // Retry on failure (default 0 retries)
|
|
23
|
-
* const { data } =
|
|
23
|
+
* const { data } = useSwoffFetch("/api/todos", { retry: 3 });
|
|
24
24
|
*
|
|
25
25
|
* // Placeholder data while loading for the first time
|
|
26
|
-
* const { data } =
|
|
26
|
+
* const { data } = useSwoffFetch("/api/todos", {
|
|
27
27
|
* placeholderData: { items: [] },
|
|
28
28
|
* });
|
|
29
29
|
*
|
|
30
30
|
* // Callbacks on success/error
|
|
31
|
-
* const { data, refetch } =
|
|
31
|
+
* const { data, refetch } = useSwoffFetch("/api/todos", {
|
|
32
32
|
* onSuccess: (data) => console.log("Loaded", data),
|
|
33
33
|
* });
|
|
34
34
|
*
|
|
35
35
|
* @param url - URL to fetch. Pass null to skip fetching.
|
|
36
36
|
* @param options - Fetch options plus: select, keepPreviousData, retry, placeholderData, onSuccess, onError
|
|
37
37
|
*/
|
|
38
|
-
export function
|
|
38
|
+
export function useSwoffFetch<T = unknown, R = T>(
|
|
39
39
|
url: string | null,
|
|
40
40
|
options: FetchWithCacheOptions & {
|
|
41
41
|
enabled?: boolean;
|
|
@@ -11,7 +11,7 @@ import {
|
|
|
11
11
|
* optimistic updates, and dual-level callbacks.
|
|
12
12
|
*
|
|
13
13
|
* Usage:
|
|
14
|
-
* const { mutate, isLoading, error, data } =
|
|
14
|
+
* const { mutate, isLoading, error, data } = useSwoffMutation("/api/todos", {
|
|
15
15
|
* method: "POST",
|
|
16
16
|
* onSuccess: (data) => navigate(`/item/${data.id}`),
|
|
17
17
|
* });
|
|
@@ -23,7 +23,7 @@ import {
|
|
|
23
23
|
* });
|
|
24
24
|
*
|
|
25
25
|
* // Optimistic update with rollback:
|
|
26
|
-
* const { mutate } =
|
|
26
|
+
* const { mutate } = useSwoffMutation("/api/todos", {
|
|
27
27
|
* method: "POST",
|
|
28
28
|
* onMutate: () => { /* set optimistic state *\\/ },
|
|
29
29
|
* onError: () => { /* rollback *\\/ },
|
|
@@ -35,7 +35,7 @@ import {
|
|
|
35
35
|
* if (result.status === "queued") navigate("/items");
|
|
36
36
|
* if (result.status === "error") setError(result.error.message);
|
|
37
37
|
*/
|
|
38
|
-
export function
|
|
38
|
+
export function useSwoffMutation(url, options = {}) {
|
|
39
39
|
const [lastResult, setLastResult] = useState(null);
|
|
40
40
|
const [isLoading, setIsLoading] = useState(false);
|
|
41
41
|
const [mutationId, setMutationId] = useState(null);
|
|
@@ -36,7 +36,7 @@ export type MutateResult<T> =
|
|
|
36
36
|
* optimistic updates, and dual-level callbacks.
|
|
37
37
|
*
|
|
38
38
|
* Usage:
|
|
39
|
-
* const { mutate, isLoading, error, data } =
|
|
39
|
+
* const { mutate, isLoading, error, data } = useSwoffMutation<CreateTodoResponse>(
|
|
40
40
|
* "/api/todos",
|
|
41
41
|
* { method: "POST", onSuccess: (data) => navigate(`/item/${data.id}`) },
|
|
42
42
|
* );
|
|
@@ -48,7 +48,7 @@ export type MutateResult<T> =
|
|
|
48
48
|
* });
|
|
49
49
|
*
|
|
50
50
|
* // Optimistic update with rollback:
|
|
51
|
-
* const { mutate } =
|
|
51
|
+
* const { mutate } = useSwoffMutation("/api/todos", {
|
|
52
52
|
* method: "POST",
|
|
53
53
|
* onMutate: () => { /* set optimistic state *\\/ },
|
|
54
54
|
* onError: () => { /* rollback *\\/ },
|
|
@@ -60,7 +60,7 @@ export type MutateResult<T> =
|
|
|
60
60
|
* if (result.status === "queued") navigate("/items");
|
|
61
61
|
* if (result.status === "error") setError(result.error.message);
|
|
62
62
|
*/
|
|
63
|
-
export function
|
|
63
|
+
export function useSwoffMutation<TData = unknown>(
|
|
64
64
|
url: string,
|
|
65
65
|
options: UseMutationOptions<TData> = {},
|
|
66
66
|
) {
|
|
@@ -5,7 +5,7 @@ function subscribeToMutations(cb) {
|
|
|
5
5
|
return onMutationStateChange(() => cb());
|
|
6
6
|
}
|
|
7
7
|
|
|
8
|
-
export function
|
|
8
|
+
export function useSwoffMutationState(id) {
|
|
9
9
|
return useSyncExternalStore(subscribeToMutations, () =>
|
|
10
10
|
id ? (getMutationState(id) ?? null) : null,
|
|
11
11
|
);
|
|
@@ -11,10 +11,10 @@ function subscribeToMutations(cb: () => void) {
|
|
|
11
11
|
* Useful for showing per-mutation loading spinners, error states, etc.
|
|
12
12
|
*
|
|
13
13
|
* Usage:
|
|
14
|
-
* const mutation =
|
|
14
|
+
* const mutation = useSwoffMutationState(mutationId);
|
|
15
15
|
* if (mutation?.status === "error") { ... }
|
|
16
16
|
*/
|
|
17
|
-
export function
|
|
17
|
+
export function useSwoffMutationState(id: string | null): MutationState | null {
|
|
18
18
|
return useSyncExternalStore(subscribeToMutations, () =>
|
|
19
19
|
id ? (getMutationState(id) ?? null) : null,
|
|
20
20
|
);
|
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
* Reactive network information: online status, connection type, and bandwidth.
|
|
10
10
|
*
|
|
11
11
|
* Usage:
|
|
12
|
-
* const { online, wasOffline, lastChangedAt, effectiveType, downlink } =
|
|
12
|
+
* const { online, wasOffline, lastChangedAt, effectiveType, downlink } = useSwoffNetwork();
|
|
13
13
|
*
|
|
14
14
|
* // Show offline indicator:
|
|
15
15
|
* if (!online) return <OfflineBanner />;
|
|
@@ -17,7 +17,7 @@ import {
|
|
|
17
17
|
* // Warn on slow connection:
|
|
18
18
|
* if (online && effectiveType === "2g") return <SlowConnectionWarning />;
|
|
19
19
|
*/
|
|
20
|
-
export function
|
|
20
|
+
export function useSwoffNetwork() {
|
|
21
21
|
const wasOfflineRef = useRef(false);
|
|
22
22
|
const [isRetrying, setIsRetrying] = useState(false);
|
|
23
23
|
|
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
* Reactive network information: online status, connection type, and bandwidth.
|
|
10
10
|
*
|
|
11
11
|
* Usage:
|
|
12
|
-
* const { online, wasOffline, lastChangedAt, effectiveType, downlink } =
|
|
12
|
+
* const { online, wasOffline, lastChangedAt, effectiveType, downlink } = useSwoffNetwork();
|
|
13
13
|
*
|
|
14
14
|
* // Show offline indicator:
|
|
15
15
|
* if (!online) return <OfflineBanner />;
|
|
@@ -19,7 +19,7 @@ import {
|
|
|
19
19
|
*
|
|
20
20
|
* @returns {{ online: boolean, wasOffline: boolean, lastChangedAt: number | null, effectiveType: string | null, downlink: number | null, isRetrying: boolean, retry: () => Promise<void> }}
|
|
21
21
|
*/
|
|
22
|
-
export function
|
|
22
|
+
export function useSwoffNetwork() {
|
|
23
23
|
const wasOfflineRef = useRef(false);
|
|
24
24
|
const [isRetrying, setIsRetrying] = useState(false);
|
|
25
25
|
|
|
@@ -1,14 +1,11 @@
|
|
|
1
1
|
import { useState, useEffect } from "react";
|
|
2
2
|
|
|
3
|
-
export function
|
|
4
|
-
const [
|
|
5
|
-
status: "idle",
|
|
6
|
-
progress: 0,
|
|
7
|
-
}));
|
|
3
|
+
export function useSwoffPrecache() {
|
|
4
|
+
const [progress, setProgress] = useState(0);
|
|
8
5
|
|
|
9
6
|
useEffect(() => {
|
|
10
7
|
const onProgress = (e) =>
|
|
11
|
-
|
|
8
|
+
setProgress(e.detail.percent);
|
|
12
9
|
|
|
13
10
|
window.addEventListener("sw-progress", onProgress);
|
|
14
11
|
return () => {
|
|
@@ -16,5 +13,5 @@ export function usePrecacheProgress() {
|
|
|
16
13
|
};
|
|
17
14
|
}, []);
|
|
18
15
|
|
|
19
|
-
return
|
|
16
|
+
return { progress };
|
|
20
17
|
}
|
|
@@ -1,14 +1,11 @@
|
|
|
1
1
|
import { useState, useEffect } from "react";
|
|
2
2
|
|
|
3
|
-
export function
|
|
4
|
-
const [
|
|
5
|
-
status: "idle" as "idle" | "installing",
|
|
6
|
-
progress: 0,
|
|
7
|
-
}));
|
|
3
|
+
export function useSwoffPrecache() {
|
|
4
|
+
const [progress, setProgress] = useState(0);
|
|
8
5
|
|
|
9
6
|
useEffect(() => {
|
|
10
7
|
const onProgress = (e: WindowEventMap["sw-progress"]) =>
|
|
11
|
-
|
|
8
|
+
setProgress(e.detail.percent);
|
|
12
9
|
|
|
13
10
|
window.addEventListener("sw-progress", onProgress);
|
|
14
11
|
return () => {
|
|
@@ -16,5 +13,5 @@ export function usePrecacheProgress() {
|
|
|
16
13
|
};
|
|
17
14
|
}, []);
|
|
18
15
|
|
|
19
|
-
return
|
|
16
|
+
return { progress };
|
|
20
17
|
}
|
|
@@ -5,7 +5,7 @@ import { prefetchCache } from "../fetch/core.js";
|
|
|
5
5
|
* Hook that returns a stable prefetch callback, observable prefetch list, and clear function.
|
|
6
6
|
*
|
|
7
7
|
* Usage:
|
|
8
|
-
* const { prefetch, prefetchList, clear } =
|
|
8
|
+
* const { prefetch, prefetchList, clear } = useSwoffPrefetch();
|
|
9
9
|
*
|
|
10
10
|
* // Prefetch when user hovers a link:
|
|
11
11
|
* <Link onMouseEnter={() => prefetch("/api/todos")} to="/todos" />
|
|
@@ -16,7 +16,7 @@ import { prefetchCache } from "../fetch/core.js";
|
|
|
16
16
|
* // Clear prefetched data:
|
|
17
17
|
* <button onClick={clear}>Clear prefetch</button>
|
|
18
18
|
*/
|
|
19
|
-
export function
|
|
19
|
+
export function useSwoffPrefetch() {
|
|
20
20
|
const [prefetchList, setPrefetchList] = useState([]);
|
|
21
21
|
|
|
22
22
|
const prefetch = useCallback((url, options) => {
|
|
@@ -6,7 +6,7 @@ import type { FetchWithCacheOptions } from "../fetch/core.ts";
|
|
|
6
6
|
* Hook that returns a stable prefetch callback, observable prefetch list, and clear function.
|
|
7
7
|
*
|
|
8
8
|
* Usage:
|
|
9
|
-
* const { prefetch, prefetchList, clear } =
|
|
9
|
+
* const { prefetch, prefetchList, clear } = useSwoffPrefetch();
|
|
10
10
|
*
|
|
11
11
|
* // Prefetch when user hovers a link:
|
|
12
12
|
* <Link onMouseEnter={() => prefetch("/api/todos")} to="/todos" />
|
|
@@ -19,7 +19,7 @@ import type { FetchWithCacheOptions } from "../fetch/core.ts";
|
|
|
19
19
|
*
|
|
20
20
|
* @returns {{ prefetch: (url: string, options?: FetchWithCacheOptions) => void, prefetchList: string[], clear: () => void }}
|
|
21
21
|
*/
|
|
22
|
-
export function
|
|
22
|
+
export function useSwoffPrefetch(): {
|
|
23
23
|
prefetch: (url: string, options?: FetchWithCacheOptions) => void;
|
|
24
24
|
prefetchList: string[];
|
|
25
25
|
clear: () => void;
|
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
getPushSubscription,
|
|
7
7
|
} from "../realtime/notifications.ts";
|
|
8
8
|
|
|
9
|
-
export function
|
|
9
|
+
export function useSwoffPush() {
|
|
10
10
|
const [state, setState] = useState(() => ({
|
|
11
11
|
subscribed: false,
|
|
12
12
|
subscription: null as PushSubscription | null,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { useState, useEffect, useCallback } from "react";
|
|
2
2
|
import { isInstallable, promptInstall } from "../pwa/prompt.js";
|
|
3
3
|
|
|
4
|
-
export function
|
|
4
|
+
export function useSwoffPwa() {
|
|
5
5
|
const [canInstall, setCanInstall] = useState(false);
|
|
6
6
|
|
|
7
7
|
useEffect(() => {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { useState, useEffect, useCallback } from "react";
|
|
2
2
|
import { isInstallable, promptInstall } from "../pwa/prompt.ts";
|
|
3
3
|
|
|
4
|
-
export function
|
|
4
|
+
export function useSwoffPwa() {
|
|
5
5
|
const [canInstall, setCanInstall] = useState(false);
|
|
6
6
|
|
|
7
7
|
useEffect(() => {
|
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
* Reactive mutation queue state: pending count, items, last sync info, and processing flag.
|
|
10
10
|
*
|
|
11
11
|
* Usage:
|
|
12
|
-
* const { pending, items, lastSync, isProcessing, retryAll } =
|
|
12
|
+
* const { pending, items, lastSync, isProcessing, retryAll } = useSwoffQueue();
|
|
13
13
|
*
|
|
14
14
|
* // Show pending badge:
|
|
15
15
|
* {pending > 0 && <Badge>{pending}</Badge>}
|
|
@@ -19,7 +19,7 @@ import {
|
|
|
19
19
|
* {isProcessing ? "Syncing..." : "Retry All"}
|
|
20
20
|
* </button>
|
|
21
21
|
*/
|
|
22
|
-
export function
|
|
22
|
+
export function useSwoffQueue() {
|
|
23
23
|
const [state, setState] = useState({
|
|
24
24
|
pending: 0,
|
|
25
25
|
items: [],
|
|
@@ -17,7 +17,7 @@ export interface MutationQueueState {
|
|
|
17
17
|
* Reactive mutation queue state: pending count, items, last sync info, and processing flag.
|
|
18
18
|
*
|
|
19
19
|
* Usage:
|
|
20
|
-
* const { pending, items, lastSync, isProcessing, retryAll } =
|
|
20
|
+
* const { pending, items, lastSync, isProcessing, retryAll } = useSwoffQueue();
|
|
21
21
|
*
|
|
22
22
|
* // Show pending badge:
|
|
23
23
|
* {pending > 0 && <Badge>{pending}</Badge>}
|
|
@@ -29,7 +29,7 @@ export interface MutationQueueState {
|
|
|
29
29
|
*
|
|
30
30
|
* @returns {{ pending, items, lastSync, isProcessing, retryAll }}
|
|
31
31
|
*/
|
|
32
|
-
export function
|
|
32
|
+
export function useSwoffQueue(): MutationQueueState & {
|
|
33
33
|
retryAll: () => Promise<void>;
|
|
34
34
|
} {
|
|
35
35
|
const [state, setState] = useState<MutationQueueState>({
|
|
@@ -5,13 +5,13 @@ import { getStorageEstimate, formatBytes } from "../storage";
|
|
|
5
5
|
* Reactive storage estimate. Shows available quota and usage.
|
|
6
6
|
*
|
|
7
7
|
* Usage:
|
|
8
|
-
* const { usage, quota, percentUsed, formattedUsage, formattedQuota, loading } =
|
|
8
|
+
* const { usage, quota, percentUsed, formattedUsage, formattedQuota, loading } = useSwoffStorage();
|
|
9
9
|
*
|
|
10
10
|
* if (!loading && percentUsed > 80) return <StorageWarning />;
|
|
11
11
|
*
|
|
12
12
|
* @param autoRefresh - Re-check on visibility change (default true)
|
|
13
13
|
*/
|
|
14
|
-
export function
|
|
14
|
+
export function useSwoffStorage(autoRefresh = true) {
|
|
15
15
|
const [state, setState] = useState({
|
|
16
16
|
usage: 0,
|
|
17
17
|
quota: 0,
|
|
@@ -15,14 +15,14 @@ interface StorageEstimateState {
|
|
|
15
15
|
* Reactive storage estimate. Shows available quota and usage.
|
|
16
16
|
*
|
|
17
17
|
* Usage:
|
|
18
|
-
* const { usage, quota, percentUsed, formattedUsage, formattedQuota, loading } =
|
|
18
|
+
* const { usage, quota, percentUsed, formattedUsage, formattedQuota, loading } = useSwoffStorage();
|
|
19
19
|
*
|
|
20
20
|
* if (!loading && percentUsed > 80) return <StorageWarning />;
|
|
21
21
|
*
|
|
22
22
|
* @param autoRefresh - Re-check on visibility change (default true)
|
|
23
23
|
* @returns {{ usage: number, quota: number, percentUsed: number, formattedUsage: string, formattedQuota: string, loading: boolean, error: string | null }}
|
|
24
24
|
*/
|
|
25
|
-
export function
|
|
25
|
+
export function useSwoffStorage(autoRefresh = true): StorageEstimateState {
|
|
26
26
|
const [state, setState] = useState<StorageEstimateState>({
|
|
27
27
|
usage: 0,
|
|
28
28
|
quota: 0,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { useState, useEffect, useCallback } from "react";
|
|
2
2
|
import { retrySync } from "../mutation/sync.js";
|
|
3
3
|
|
|
4
|
-
export function
|
|
4
|
+
export function useSwoffSync() {
|
|
5
5
|
const [state, setState] = useState(() => ({
|
|
6
6
|
supported:
|
|
7
7
|
typeof window !== "undefined" && typeof navigator !== "undefined"
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { useState, useEffect, useCallback } from "react";
|
|
2
2
|
import { retrySync } from "../mutation/sync.ts";
|
|
3
3
|
|
|
4
|
-
export function
|
|
4
|
+
export function useSwoffSync() {
|
|
5
5
|
const [state, setState] = useState(() => ({
|
|
6
6
|
supported:
|
|
7
7
|
typeof window !== "undefined" && typeof navigator !== "undefined"
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { writable } from "svelte/store";
|
|
2
|
+
import { onMount } from "svelte";
|
|
3
|
+
|
|
4
|
+
export function useSwoffAnalytics(callback) {
|
|
5
|
+
const events = writable([]);
|
|
6
|
+
const lastEvent = writable(null);
|
|
7
|
+
|
|
8
|
+
function handler(e) {
|
|
9
|
+
if (e.data?.type === "OFFLINE_FALLBACK_ACTIVATED" && e.data?.detail) {
|
|
10
|
+
const detail = e.data.detail;
|
|
11
|
+
events.update((prev) => [...prev, detail]);
|
|
12
|
+
lastEvent.set(detail);
|
|
13
|
+
callback?.(detail);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
onMount(() => {
|
|
18
|
+
if (typeof navigator === "undefined" || !navigator.serviceWorker) return;
|
|
19
|
+
navigator.serviceWorker.addEventListener("message", handler);
|
|
20
|
+
return () => {
|
|
21
|
+
navigator.serviceWorker.removeEventListener("message", handler);
|
|
22
|
+
};
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
function clear() {
|
|
26
|
+
events.set([]);
|
|
27
|
+
lastEvent.set(null);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
return { lastEvent, events, clear };
|
|
31
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { writable } from "svelte/store";
|
|
2
|
+
import { onMount } from "svelte";
|
|
3
|
+
|
|
4
|
+
export interface OfflineFallbackEvent {
|
|
5
|
+
route: string;
|
|
6
|
+
fallbackLevel: "route-fallback" | "offline-page" | "spa-shell" | "inline-503";
|
|
7
|
+
timestamp: number;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export function useSwoffAnalytics(callback?: (event: OfflineFallbackEvent) => void) {
|
|
11
|
+
const events = writable<OfflineFallbackEvent[]>([]);
|
|
12
|
+
const lastEvent = writable<OfflineFallbackEvent | null>(null);
|
|
13
|
+
|
|
14
|
+
function handler(e: MessageEvent) {
|
|
15
|
+
if (e.data?.type === "OFFLINE_FALLBACK_ACTIVATED" && e.data?.detail) {
|
|
16
|
+
const detail = e.data.detail as OfflineFallbackEvent;
|
|
17
|
+
events.update((prev) => [...prev, detail]);
|
|
18
|
+
lastEvent.set(detail);
|
|
19
|
+
callback?.(detail);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
onMount(() => {
|
|
24
|
+
if (typeof navigator === "undefined" || !navigator.serviceWorker) return;
|
|
25
|
+
navigator.serviceWorker.addEventListener("message", handler);
|
|
26
|
+
return () => {
|
|
27
|
+
navigator.serviceWorker.removeEventListener("message", handler);
|
|
28
|
+
};
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
function clear() {
|
|
32
|
+
events.set([]);
|
|
33
|
+
lastEvent.set(null);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
return { lastEvent, events, clear };
|
|
37
|
+
}
|