@symbiote-native/sharing 3.0.2 → 3.0.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.
Files changed (77) hide show
  1. package/README.md +80 -52
  2. package/build/angular/index.d.ts +1 -0
  3. package/build/angular/index.js +1 -3
  4. package/build/angular/inject-incoming-share.d.ts +4 -0
  5. package/build/angular/inject-incoming-share.js +5 -0
  6. package/build/core/incoming-share-hook.d.ts +4 -0
  7. package/build/core/incoming-share-hook.js +13 -0
  8. package/build/core/incoming-share-result.d.ts +3 -0
  9. package/build/core/incoming-share-result.js +11 -0
  10. package/build/core/incoming-share-store.d.ts +9 -0
  11. package/build/core/incoming-share-store.js +100 -0
  12. package/build/core/index.d.ts +5 -2
  13. package/build/core/index.js +3 -1
  14. package/build/core/native-module.d.ts +4 -1
  15. package/build/core/sharing.d.ts +4 -1
  16. package/build/core/sharing.js +20 -0
  17. package/build/core/types.d.ts +41 -0
  18. package/build/react/index.d.ts +2 -0
  19. package/build/react/index.js +2 -0
  20. package/build/react/use-incoming-share.d.ts +3 -0
  21. package/build/react/use-incoming-share.js +10 -0
  22. package/build/solid/index.d.ts +2 -0
  23. package/build/solid/index.js +2 -0
  24. package/build/solid/use-incoming-share.d.ts +4 -0
  25. package/build/solid/use-incoming-share.js +5 -0
  26. package/build/svelte/index.d.ts +2 -0
  27. package/build/svelte/index.js +2 -0
  28. package/build/svelte/use-incoming-share.svelte.d.ts +7 -0
  29. package/build/svelte/use-incoming-share.svelte.js +8 -0
  30. package/build/vue/index.d.ts +2 -0
  31. package/build/vue/index.js +2 -0
  32. package/build/vue/use-incoming-share.d.ts +4 -0
  33. package/build/vue/use-incoming-share.js +5 -0
  34. package/build-ngc/angular/index.d.ts +1 -0
  35. package/build-ngc/angular/index.js +1 -3
  36. package/build-ngc/angular/index.js.map +1 -1
  37. package/build-ngc/angular/inject-incoming-share.d.ts +4 -0
  38. package/build-ngc/angular/inject-incoming-share.js +6 -0
  39. package/build-ngc/angular/inject-incoming-share.js.map +1 -0
  40. package/build-ngc/core/incoming-share-hook.d.ts +4 -0
  41. package/build-ngc/core/incoming-share-hook.js +14 -0
  42. package/build-ngc/core/incoming-share-hook.js.map +1 -0
  43. package/build-ngc/core/incoming-share-result.d.ts +3 -0
  44. package/build-ngc/core/incoming-share-result.js +12 -0
  45. package/build-ngc/core/incoming-share-result.js.map +1 -0
  46. package/build-ngc/core/incoming-share-store.d.ts +9 -0
  47. package/build-ngc/core/incoming-share-store.js +101 -0
  48. package/build-ngc/core/incoming-share-store.js.map +1 -0
  49. package/build-ngc/core/index.d.ts +5 -2
  50. package/build-ngc/core/index.js +3 -1
  51. package/build-ngc/core/index.js.map +1 -1
  52. package/build-ngc/core/native-module.d.ts +4 -1
  53. package/build-ngc/core/native-module.js.map +1 -1
  54. package/build-ngc/core/sharing.d.ts +4 -1
  55. package/build-ngc/core/sharing.js +20 -0
  56. package/build-ngc/core/sharing.js.map +1 -1
  57. package/build-ngc/core/types.d.ts +41 -0
  58. package/package.json +23 -23
  59. package/src/angular/index.ts +1 -3
  60. package/src/angular/inject-incoming-share.ts +13 -0
  61. package/src/core/incoming-share-hook.ts +28 -0
  62. package/src/core/incoming-share-result.ts +17 -0
  63. package/src/core/incoming-share-store.ts +118 -0
  64. package/src/core/index.ts +26 -2
  65. package/src/core/native-module.ts +10 -4
  66. package/src/core/sharing.ts +33 -1
  67. package/src/core/types.ts +52 -0
  68. package/src/react/index.ts +2 -0
  69. package/src/react/use-incoming-share.ts +24 -0
  70. package/src/solid/index.ts +2 -0
  71. package/src/solid/use-incoming-share.ts +13 -0
  72. package/src/svelte/index.ts +2 -0
  73. package/src/svelte/svelte-ambient.d.ts +3 -0
  74. package/src/svelte/svelte-compile.test-helper.ts +7 -0
  75. package/src/svelte/use-incoming-share.svelte.ts +22 -0
  76. package/src/vue/index.ts +2 -0
  77. package/src/vue/use-incoming-share.ts +13 -0
@@ -0,0 +1,6 @@
1
+ import { computed } from '@angular/core';
2
+ import { createEventValueHook } from '@symbiote-native/angular';
3
+ import { createIncomingShareHook } from '../core/incoming-share-hook';
4
+ /** Angular twin of `expo-sharing`'s `useIncomingShare`, call it in an injection context */
5
+ export const injectIncomingShare = createIncomingShareHook(createEventValueHook, box => box(), computed);
6
+ //# sourceMappingURL=inject-incoming-share.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inject-incoming-share.js","sourceRoot":"","sources":["../../src/angular/inject-incoming-share.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAe,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAMtE,2FAA2F;AAC3F,MAAM,CAAC,MAAM,mBAAmB,GAAG,uBAAuB,CAGxD,oBAAoB,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { INCOMING_SHARE_CHANGE } from './incoming-share-store';
2
+ import type { IIncomingShareStore } from './incoming-share-store';
3
+ import type { IIncomingShareSnapshot, IUseIncomingShareResult } from './types';
4
+ export declare function createIncomingShareHook<TSnapshotBox, TResultBox>(createEventValueHook: (event: typeof INCOMING_SHARE_CHANGE, getValue: (store: IIncomingShareStore) => IIncomingShareSnapshot) => (getSource: () => IIncomingShareStore) => TSnapshotBox, readBox: (box: TSnapshotBox) => IIncomingShareSnapshot, derive: (compute: () => IUseIncomingShareResult) => TResultBox): () => TResultBox;
@@ -0,0 +1,14 @@
1
+ import { createIncomingShareStore, INCOMING_SHARE_CHANGE, } from './incoming-share-store';
2
+ import { withShareActions } from './incoming-share-result';
3
+ // Getter-shaped `useIncomingShare` for the adapters whose event-value hook takes a source getter
4
+ // (Vue, Solid, Svelte, Angular). `readBox` unwraps that adapter's reactive box and `derive` wraps
5
+ // the result in its own computed, React keeps its own wiring since it passes the source directly
6
+ export function createIncomingShareHook(createEventValueHook, readBox, derive) {
7
+ const useShareSnapshot = createEventValueHook(INCOMING_SHARE_CHANGE, store => store.getSnapshot());
8
+ return function useIncomingShare() {
9
+ const store = createIncomingShareStore();
10
+ const snapshotBox = useShareSnapshot(() => store);
11
+ return derive(() => withShareActions(readBox(snapshotBox), store));
12
+ };
13
+ }
14
+ //# sourceMappingURL=incoming-share-hook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"incoming-share-hook.js","sourceRoot":"","sources":["../../src/core/incoming-share-hook.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,EACxB,qBAAqB,GACtB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAI3D,iGAAiG;AACjG,kGAAkG;AAClG,iGAAiG;AACjG,MAAM,UAAU,uBAAuB,CACrC,oBAG2D,EAC3D,OAAsD,EACtD,MAA8D;IAE9D,MAAM,gBAAgB,GAAG,oBAAoB,CAAC,qBAAqB,EAAE,KAAK,CAAC,EAAE,CAC3E,KAAK,CAAC,WAAW,EAAE,CACpB,CAAC;IACF,OAAO,SAAS,gBAAgB;QAC9B,MAAM,KAAK,GAAG,wBAAwB,EAAE,CAAC;QACzC,MAAM,WAAW,GAAG,gBAAgB,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;QAClD,OAAO,MAAM,CAAC,GAAG,EAAE,CAAC,gBAAgB,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;IACrE,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { IIncomingShareStore } from './incoming-share-store';
2
+ import type { IIncomingShareSnapshot, IUseIncomingShareResult } from './types';
3
+ export declare function withShareActions(snapshot: IIncomingShareSnapshot, store: IIncomingShareStore): IUseIncomingShareResult;
@@ -0,0 +1,12 @@
1
+ // Every adapter's `useIncomingShare` reports its own reactive snapshot, the two actions come
2
+ // from the store so they are written once
3
+ export function withShareActions(snapshot, store) {
4
+ return {
5
+ ...snapshot,
6
+ clearSharedPayloads: store.clear,
7
+ refreshSharePayloads: () => {
8
+ void store.refresh();
9
+ },
10
+ };
11
+ }
12
+ //# sourceMappingURL=incoming-share-result.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"incoming-share-result.js","sourceRoot":"","sources":["../../src/core/incoming-share-result.ts"],"names":[],"mappings":"AAGA,6FAA6F;AAC7F,0CAA0C;AAC1C,MAAM,UAAU,gBAAgB,CAC9B,QAAgC,EAChC,KAA0B;IAE1B,OAAO;QACL,GAAG,QAAQ;QACX,mBAAmB,EAAE,KAAK,CAAC,KAAK;QAChC,oBAAoB,EAAE,GAAG,EAAE;YACzB,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC;QACvB,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { IEventValueSource } from '@symbiote-native/engine';
2
+ import type { IIncomingShareSnapshot } from './types';
3
+ export declare const INCOMING_SHARE_CHANGE = "change";
4
+ export type IIncomingShareStore = IEventValueSource<IIncomingShareSnapshot, typeof INCOMING_SHARE_CHANGE> & {
5
+ getSnapshot: () => IIncomingShareSnapshot;
6
+ refresh: () => Promise<void>;
7
+ clear: () => void;
8
+ };
9
+ export declare function createIncomingShareStore(): IIncomingShareStore;
@@ -0,0 +1,101 @@
1
+ import { AppState } from '@symbiote-native/engine';
2
+ import { clearSharedPayloads, getResolvedSharedPayloadsAsync, getSharedPayloads, } from './sharing';
3
+ export const INCOMING_SHARE_CHANGE = 'change';
4
+ // Multiset comparison, so the same payloads in another order do not trigger a re-resolve
5
+ function sharePayloadsAreEqual(a, b) {
6
+ if (a.length !== b.length)
7
+ return false;
8
+ const counts = new Map();
9
+ const keyOf = (item) => `${item.value}|${item.mimeType}|${item.shareType}`;
10
+ for (const item of a)
11
+ counts.set(keyOf(item), (counts.get(keyOf(item)) ?? 0) + 1);
12
+ for (const item of b) {
13
+ const count = counts.get(keyOf(item));
14
+ if (!count)
15
+ return false;
16
+ counts.set(keyOf(item), count - 1);
17
+ }
18
+ return true;
19
+ }
20
+ function toError(cause, fallbackMessage) {
21
+ return cause instanceof Error ? cause : new Error(fallbackMessage);
22
+ }
23
+ export function createIncomingShareStore() {
24
+ let snapshot = {
25
+ sharedPayloads: getSharedPayloads(),
26
+ resolvedSharedPayloads: [],
27
+ isResolving: false,
28
+ error: null,
29
+ };
30
+ // Starts empty, not at the first snapshot, so a first refresh with data always resolves it
31
+ let lastRefreshed = [];
32
+ const listeners = new Set();
33
+ let appStateSubscription = null;
34
+ function update(patch) {
35
+ snapshot = { ...snapshot, ...patch };
36
+ for (const listener of listeners)
37
+ listener(snapshot);
38
+ }
39
+ async function resolvePayloads() {
40
+ update({ isResolving: true });
41
+ try {
42
+ update({
43
+ resolvedSharedPayloads: await getResolvedSharedPayloadsAsync(),
44
+ });
45
+ }
46
+ catch (cause) {
47
+ update({
48
+ error: toError(cause, 'Unknown error during shared payload resolution'),
49
+ });
50
+ }
51
+ finally {
52
+ update({ isResolving: false });
53
+ }
54
+ }
55
+ async function refresh() {
56
+ try {
57
+ const next = getSharedPayloads();
58
+ // Skip the resolve when nothing changed, it can cost a network round trip
59
+ if (sharePayloadsAreEqual(next, lastRefreshed))
60
+ return;
61
+ lastRefreshed = next;
62
+ update({ sharedPayloads: next, resolvedSharedPayloads: [], error: null });
63
+ if (next.length > 0)
64
+ await resolvePayloads();
65
+ }
66
+ catch (cause) {
67
+ update({ error: toError(cause, 'Failed to resolve data') });
68
+ }
69
+ }
70
+ function start() {
71
+ void refresh();
72
+ appStateSubscription = AppState.addEventListener('change', status => {
73
+ if (status === 'active')
74
+ void refresh();
75
+ });
76
+ }
77
+ function stop() {
78
+ appStateSubscription?.remove();
79
+ appStateSubscription = null;
80
+ }
81
+ return {
82
+ getSnapshot: () => snapshot,
83
+ refresh,
84
+ clear: clearSharedPayloads,
85
+ addListener(_event, listener) {
86
+ const wasIdle = listeners.size === 0;
87
+ listeners.add(listener);
88
+ // After `add`, so the first refresh's synchronous update reaches this listener
89
+ if (wasIdle)
90
+ start();
91
+ return {
92
+ remove: () => {
93
+ listeners.delete(listener);
94
+ if (listeners.size === 0)
95
+ stop();
96
+ },
97
+ };
98
+ },
99
+ };
100
+ }
101
+ //# sourceMappingURL=incoming-share-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"incoming-share-store.js","sourceRoot":"","sources":["../../src/core/incoming-share-store.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,5 @@
1
- export { isAvailableAsync, shareAsync } from './sharing';
2
- export type { ISharingAnchor, ISharingOptions } from './types';
1
+ export { clearSharedPayloads, getResolvedSharedPayloadsAsync, getSharedPayloads, isAvailableAsync, shareAsync, } from './sharing';
2
+ export { createIncomingShareStore, INCOMING_SHARE_CHANGE, } from './incoming-share-store';
3
+ export type { IIncomingShareStore } from './incoming-share-store';
4
+ export { withShareActions } from './incoming-share-result';
5
+ export type { IBaseResolvedSharePayload, IContentType, IIncomingShareSnapshot, IResolvedSharePayload, IShareType, ISharePayload, ISharingAnchor, ISharingOptions, ITextBasedResolvedSharePayload, IUriBasedResolvedSharePayload, IUseIncomingShareResult, } from './types';
@@ -1,2 +1,4 @@
1
- export { isAvailableAsync, shareAsync } from './sharing';
1
+ export { clearSharedPayloads, getResolvedSharedPayloadsAsync, getSharedPayloads, isAvailableAsync, shareAsync, } from './sharing';
2
+ export { createIncomingShareStore, INCOMING_SHARE_CHANGE, } from './incoming-share-store';
3
+ export { withShareActions } from './incoming-share-result';
2
4
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,8BAA8B,EAC9B,iBAAiB,EACjB,gBAAgB,EAChB,UAAU,GACX,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,wBAAwB,EACxB,qBAAqB,GACtB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC"}
@@ -1,6 +1,9 @@
1
- import type { ISharingOptions } from './types';
1
+ import type { IResolvedSharePayload, ISharePayload, ISharingOptions } from './types';
2
2
  export type INativeSharingModule = {
3
3
  isAvailableAsync?(): Promise<boolean>;
4
4
  shareAsync?(url: string, options: ISharingOptions): Promise<void>;
5
+ getSharedPayloads?(): ISharePayload[];
6
+ getResolvedSharedPayloadsAsync?(): Promise<IResolvedSharePayload[]>;
7
+ clearSharedPayloads?(): void;
5
8
  };
6
9
  export declare const expoSharing: INativeSharingModule;
@@ -1 +1 @@
1
- {"version":3,"file":"native-module.js","sourceRoot":"","sources":["../../src/core/native-module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAGxD,MAAM,wBAAwB,GAAG,aAAa,CAAC;AAkB/C,MAAM,CAAC,MAAM,WAAW,GAAG,mBAAmB,CAC5C,wBAAwB,CACzB,CAAC"}
1
+ {"version":3,"file":"native-module.js","sourceRoot":"","sources":["../../src/core/native-module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAOxD,MAAM,wBAAwB,GAAG,aAAa,CAAC;AAoB/C,MAAM,CAAC,MAAM,WAAW,GAAG,mBAAmB,CAC5C,wBAAwB,CACzB,CAAC"}
@@ -1,4 +1,4 @@
1
- import type { ISharingOptions } from './types';
1
+ import type { IResolvedSharePayload, ISharePayload, ISharingOptions } from './types';
2
2
  /**
3
3
  * Whether the share sheet can be opened on this device. Resolves `true` on Android and iOS.
4
4
  *
@@ -16,3 +16,6 @@ export declare function isAvailableAsync(): Promise<boolean>;
16
16
  * platform reports which app received the file, so a resolved promise is not a delivery receipt.
17
17
  */
18
18
  export declare function shareAsync(url: string, options?: ISharingOptions): Promise<void>;
19
+ export declare function getSharedPayloads(): ISharePayload[];
20
+ export declare function getResolvedSharedPayloadsAsync(): Promise<IResolvedSharePayload[]>;
21
+ export declare function clearSharedPayloads(): void;
@@ -29,6 +29,26 @@ export async function shareAsync(url, options = {}) {
29
29
  }
30
30
  await expoSharing.shareAsync(url, options);
31
31
  }
32
+ // Empty until the host app carries the share target (iOS Share Extension, Android intent filters)
33
+ export function getSharedPayloads() {
34
+ if (!expoSharing.getSharedPayloads) {
35
+ throw new UnavailabilityError(NATIVE_MODULE_NAME, 'getSharedPayloads');
36
+ }
37
+ return expoSharing.getSharedPayloads();
38
+ }
39
+ // Adds display details per payload, resolving a shared URL may need the network
40
+ export async function getResolvedSharedPayloadsAsync() {
41
+ if (!expoSharing.getResolvedSharedPayloadsAsync) {
42
+ throw new UnavailabilityError(NATIVE_MODULE_NAME, 'getResolvedSharedPayloadsAsync');
43
+ }
44
+ return expoSharing.getResolvedSharedPayloadsAsync();
45
+ }
46
+ export function clearSharedPayloads() {
47
+ if (!expoSharing.clearSharedPayloads) {
48
+ throw new UnavailabilityError(NATIVE_MODULE_NAME, 'clearSharedPayloads');
49
+ }
50
+ expoSharing.clearSharedPayloads();
51
+ }
32
52
  // Not in upstream, which hands anything straight to the native module. An empty or non-string
33
53
  // url surfaces there as an argument-conversion failure on iOS and a generic "Failed to share the
34
54
  // file" on Android — both far enough from the call site to be worth failing early with the
@@ -1 +1 @@
1
- {"version":3,"file":"sharing.js","sourceRoot":"","sources":["../../src/core/sharing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAExD,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAG9C,MAAM,kBAAkB,GAAG,cAAc,CAAC;AAE1C;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,IAAI,WAAW,CAAC,gBAAgB,EAAE,CAAC;QACjC,OAAO,WAAW,CAAC,gBAAgB,EAAE,CAAC;IACxC,CAAC;IACD,OAAO,CAAC,CAAC,WAAW,CAAC,UAAU,CAAC;AAClC,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,GAAW,EACX,UAA2B,EAAE;IAE7B,kBAAkB,CAAC,GAAG,CAAC,CAAC;IACxB,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,CAAC;QAC5B,MAAM,IAAI,mBAAmB,CAAC,kBAAkB,EAAE,YAAY,CAAC,CAAC;IAClE,CAAC;IACD,MAAM,WAAW,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;AAC7C,CAAC;AAED,8FAA8F;AAC9F,iGAAiG;AACjG,2FAA2F;AAC3F,+BAA+B;AAC/B,SAAS,kBAAkB,CAAC,GAAW;IACrC,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChD,MAAM,IAAI,KAAK,CACb,2EAA2E,CAC5E,CAAC;IACJ,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"sharing.js","sourceRoot":"","sources":["../../src/core/sharing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAExD,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAO9C,MAAM,kBAAkB,GAAG,cAAc,CAAC;AAE1C;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,IAAI,WAAW,CAAC,gBAAgB,EAAE,CAAC;QACjC,OAAO,WAAW,CAAC,gBAAgB,EAAE,CAAC;IACxC,CAAC;IACD,OAAO,CAAC,CAAC,WAAW,CAAC,UAAU,CAAC;AAClC,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,GAAW,EACX,UAA2B,EAAE;IAE7B,kBAAkB,CAAC,GAAG,CAAC,CAAC;IACxB,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,CAAC;QAC5B,MAAM,IAAI,mBAAmB,CAAC,kBAAkB,EAAE,YAAY,CAAC,CAAC;IAClE,CAAC;IACD,MAAM,WAAW,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;AAC7C,CAAC;AAED,kGAAkG;AAClG,MAAM,UAAU,iBAAiB;IAC/B,IAAI,CAAC,WAAW,CAAC,iBAAiB,EAAE,CAAC;QACnC,MAAM,IAAI,mBAAmB,CAAC,kBAAkB,EAAE,mBAAmB,CAAC,CAAC;IACzE,CAAC;IACD,OAAO,WAAW,CAAC,iBAAiB,EAAE,CAAC;AACzC,CAAC;AAED,gFAAgF;AAChF,MAAM,CAAC,KAAK,UAAU,8BAA8B;IAGlD,IAAI,CAAC,WAAW,CAAC,8BAA8B,EAAE,CAAC;QAChD,MAAM,IAAI,mBAAmB,CAC3B,kBAAkB,EAClB,gCAAgC,CACjC,CAAC;IACJ,CAAC;IACD,OAAO,WAAW,CAAC,8BAA8B,EAAE,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,IAAI,CAAC,WAAW,CAAC,mBAAmB,EAAE,CAAC;QACrC,MAAM,IAAI,mBAAmB,CAAC,kBAAkB,EAAE,qBAAqB,CAAC,CAAC;IAC3E,CAAC;IACD,WAAW,CAAC,mBAAmB,EAAE,CAAC;AACpC,CAAC;AAED,8FAA8F;AAC9F,iGAAiG;AACjG,2FAA2F;AAC3F,+BAA+B;AAC/B,SAAS,kBAAkB,CAAC,GAAW;IACrC,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChD,MAAM,IAAI,KAAK,CACb,2EAA2E,CAC5E,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -36,3 +36,44 @@ export type ISharingOptions = {
36
36
  */
37
37
  anchor?: ISharingAnchor;
38
38
  };
39
+ export type IShareType = 'text' | 'url' | 'audio' | 'image' | 'video' | 'file';
40
+ export type IContentType = 'text' | 'audio' | 'image' | 'video' | 'file' | 'website';
41
+ /** Raw data shared with the app (android, ios) */
42
+ export type ISharePayload = {
43
+ /** Message body for `text`, the URL for `url`, otherwise typically the file URI */
44
+ value: string;
45
+ shareType: IShareType;
46
+ /** MIME type of `value` */
47
+ mimeType?: string;
48
+ };
49
+ export type IBaseResolvedSharePayload = ISharePayload & {
50
+ /** Where the content can be read from (the redirect target for a URL), null for text */
51
+ contentUri: string | null;
52
+ contentType: IContentType | null;
53
+ contentMimeType: string | null;
54
+ /** The `suggestedFilename` HTTP header if present, otherwise the last path component */
55
+ originalName: string | null;
56
+ contentSize: number | null;
57
+ };
58
+ export type IUriBasedResolvedSharePayload = IBaseResolvedSharePayload & {
59
+ contentType: 'audio' | 'file' | 'video' | 'image' | 'website';
60
+ contentUri: string;
61
+ };
62
+ export type ITextBasedResolvedSharePayload = IBaseResolvedSharePayload & {
63
+ contentType?: 'text';
64
+ };
65
+ /** A payload plus the details needed to display it, resolving a URL may need the network */
66
+ export type IResolvedSharePayload = IUriBasedResolvedSharePayload | ITextBasedResolvedSharePayload;
67
+ export type IIncomingShareSnapshot = {
68
+ /** Unresolved payloads, available synchronously from the first read */
69
+ sharedPayloads: ISharePayload[];
70
+ /** Empty while resolving or when resolving failed */
71
+ resolvedSharedPayloads: IResolvedSharePayload[];
72
+ isResolving: boolean;
73
+ /** The error hit while resolving, null on success */
74
+ error: Error | null;
75
+ };
76
+ export type IUseIncomingShareResult = IIncomingShareSnapshot & {
77
+ clearSharedPayloads: () => void;
78
+ refreshSharePayloads: () => void;
79
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@symbiote-native/sharing",
3
- "version": "3.0.2",
3
+ "version": "3.0.4",
4
4
  "description": "expo-sharing wrapped for SymbioteNative — one framework-agnostic core, built once and reachable from the React, Vue, Svelte, Solid, and Angular adapters. Opens the platform share sheet for a local file.",
5
5
  "license": "MIT",
6
6
  "keywords": [
@@ -35,20 +35,20 @@
35
35
  "default": "./build/core/index.js"
36
36
  },
37
37
  "./vue": {
38
- "types": "./build/core/index.d.ts",
39
- "default": "./build/core/index.js"
38
+ "types": "./build/vue/index.d.ts",
39
+ "default": "./build/vue/index.js"
40
40
  },
41
41
  "./react": {
42
- "types": "./build/core/index.d.ts",
43
- "default": "./build/core/index.js"
42
+ "types": "./build/react/index.d.ts",
43
+ "default": "./build/react/index.js"
44
44
  },
45
45
  "./svelte": {
46
- "types": "./build/core/index.d.ts",
47
- "default": "./build/core/index.js"
46
+ "types": "./build/svelte/index.d.ts",
47
+ "default": "./build/svelte/index.js"
48
48
  },
49
49
  "./solid": {
50
- "types": "./build/core/index.d.ts",
51
- "default": "./build/core/index.js"
50
+ "types": "./build/solid/index.d.ts",
51
+ "default": "./build/solid/index.js"
52
52
  },
53
53
  "./angular": {
54
54
  "types": "./build-ngc/angular/index.d.ts",
@@ -70,7 +70,7 @@
70
70
  },
71
71
  "dependencies": {
72
72
  "expo-sharing": "57.0.8",
73
- "expo-modules-core": "57.0.5"
73
+ "expo-modules-core": "57.0.20"
74
74
  },
75
75
  "peerDependencies": {
76
76
  "@angular/core": ">=20",
@@ -80,12 +80,12 @@
80
80
  "solid-js": ">=1.9.0",
81
81
  "svelte": ">=5.56.0",
82
82
  "vue": ">=3.5.0",
83
- "@symbiote-native/angular": "^3.1.2",
84
- "@symbiote-native/engine": "^1.3.1",
85
- "@symbiote-native/react": "^3.0.4",
86
- "@symbiote-native/solid": "^3.0.4",
87
- "@symbiote-native/svelte": "^3.0.4",
88
- "@symbiote-native/vue": "^3.0.4"
83
+ "@symbiote-native/angular": "^3.3.0",
84
+ "@symbiote-native/engine": "^1.6.0",
85
+ "@symbiote-native/react": "^3.3.0",
86
+ "@symbiote-native/solid": "^3.2.0",
87
+ "@symbiote-native/svelte": "^3.2.0",
88
+ "@symbiote-native/vue": "^3.3.0"
89
89
  },
90
90
  "peerDependenciesMeta": {
91
91
  "@symbiote-native/angular": {
@@ -133,13 +133,13 @@
133
133
  "solid-js": "^1.9.14",
134
134
  "svelte": "^5.56.0",
135
135
  "typescript": "~6.0.0",
136
- "@symbiote-native/angular": "3.1.2",
137
- "@symbiote-native/engine": "1.3.1",
138
- "@symbiote-native/react": "3.0.4",
139
- "@symbiote-native/solid": "3.0.4",
140
- "@symbiote-native/svelte": "3.0.4",
141
- "@symbiote-native/test-utils": "0.4.4",
142
- "@symbiote-native/vue": "3.0.4"
136
+ "@symbiote-native/angular": "3.3.0",
137
+ "@symbiote-native/engine": "1.6.0",
138
+ "@symbiote-native/react": "3.3.0",
139
+ "@symbiote-native/solid": "3.2.0",
140
+ "@symbiote-native/svelte": "3.2.0",
141
+ "@symbiote-native/test-utils": "0.4.7",
142
+ "@symbiote-native/vue": "3.3.0"
143
143
  },
144
144
  "scripts": {
145
145
  "typecheck": "tsc --build",
@@ -1,4 +1,2 @@
1
- // @symbiote-native/sharing/angular: the Angular entry over the framework-agnostic core. Same
2
- // reasoning as the React/Vue entries — no per-instance state or event stream to wrap in a
3
- // service, so this is a plain re-export.
4
1
  export * from '../core';
2
+ export { injectIncomingShare } from './inject-incoming-share';
@@ -0,0 +1,13 @@
1
+ import { computed, type Signal } from '@angular/core';
2
+ import { createEventValueHook } from '@symbiote-native/angular';
3
+ import { createIncomingShareHook } from '../core/incoming-share-hook';
4
+ import type {
5
+ IIncomingShareSnapshot,
6
+ IUseIncomingShareResult,
7
+ } from '../core/types';
8
+
9
+ /** Angular twin of `expo-sharing`'s `useIncomingShare`, call it in an injection context */
10
+ export const injectIncomingShare = createIncomingShareHook<
11
+ Signal<IIncomingShareSnapshot>,
12
+ Signal<IUseIncomingShareResult>
13
+ >(createEventValueHook, box => box(), computed);
@@ -0,0 +1,28 @@
1
+ import {
2
+ createIncomingShareStore,
3
+ INCOMING_SHARE_CHANGE,
4
+ } from './incoming-share-store';
5
+ import { withShareActions } from './incoming-share-result';
6
+ import type { IIncomingShareStore } from './incoming-share-store';
7
+ import type { IIncomingShareSnapshot, IUseIncomingShareResult } from './types';
8
+
9
+ // Getter-shaped `useIncomingShare` for the adapters whose event-value hook takes a source getter
10
+ // (Vue, Solid, Svelte, Angular). `readBox` unwraps that adapter's reactive box and `derive` wraps
11
+ // the result in its own computed, React keeps its own wiring since it passes the source directly
12
+ export function createIncomingShareHook<TSnapshotBox, TResultBox>(
13
+ createEventValueHook: (
14
+ event: typeof INCOMING_SHARE_CHANGE,
15
+ getValue: (store: IIncomingShareStore) => IIncomingShareSnapshot,
16
+ ) => (getSource: () => IIncomingShareStore) => TSnapshotBox,
17
+ readBox: (box: TSnapshotBox) => IIncomingShareSnapshot,
18
+ derive: (compute: () => IUseIncomingShareResult) => TResultBox,
19
+ ): () => TResultBox {
20
+ const useShareSnapshot = createEventValueHook(INCOMING_SHARE_CHANGE, store =>
21
+ store.getSnapshot(),
22
+ );
23
+ return function useIncomingShare(): TResultBox {
24
+ const store = createIncomingShareStore();
25
+ const snapshotBox = useShareSnapshot(() => store);
26
+ return derive(() => withShareActions(readBox(snapshotBox), store));
27
+ };
28
+ }
@@ -0,0 +1,17 @@
1
+ import type { IIncomingShareStore } from './incoming-share-store';
2
+ import type { IIncomingShareSnapshot, IUseIncomingShareResult } from './types';
3
+
4
+ // Every adapter's `useIncomingShare` reports its own reactive snapshot, the two actions come
5
+ // from the store so they are written once
6
+ export function withShareActions(
7
+ snapshot: IIncomingShareSnapshot,
8
+ store: IIncomingShareStore,
9
+ ): IUseIncomingShareResult {
10
+ return {
11
+ ...snapshot,
12
+ clearSharedPayloads: store.clear,
13
+ refreshSharePayloads: () => {
14
+ void store.refresh();
15
+ },
16
+ };
17
+ }
@@ -0,0 +1,118 @@
1
+ import { AppState } from '@symbiote-native/engine';
2
+ import type { IEventValueSource } from '@symbiote-native/engine';
3
+ import {
4
+ clearSharedPayloads,
5
+ getResolvedSharedPayloadsAsync,
6
+ getSharedPayloads,
7
+ } from './sharing';
8
+ import type { IIncomingShareSnapshot, ISharePayload } from './types';
9
+
10
+ export const INCOMING_SHARE_CHANGE = 'change';
11
+
12
+ export type IIncomingShareStore = IEventValueSource<
13
+ IIncomingShareSnapshot,
14
+ typeof INCOMING_SHARE_CHANGE
15
+ > & {
16
+ getSnapshot: () => IIncomingShareSnapshot;
17
+ refresh: () => Promise<void>;
18
+ clear: () => void;
19
+ };
20
+
21
+ // Multiset comparison, so the same payloads in another order do not trigger a re-resolve
22
+ function sharePayloadsAreEqual(
23
+ a: ISharePayload[],
24
+ b: ISharePayload[],
25
+ ): boolean {
26
+ if (a.length !== b.length) return false;
27
+ const counts = new Map<string, number>();
28
+ const keyOf = (item: ISharePayload): string =>
29
+ `${item.value}|${item.mimeType}|${item.shareType}`;
30
+ for (const item of a)
31
+ counts.set(keyOf(item), (counts.get(keyOf(item)) ?? 0) + 1);
32
+ for (const item of b) {
33
+ const count = counts.get(keyOf(item));
34
+ if (!count) return false;
35
+ counts.set(keyOf(item), count - 1);
36
+ }
37
+ return true;
38
+ }
39
+
40
+ function toError(cause: unknown, fallbackMessage: string): Error {
41
+ return cause instanceof Error ? cause : new Error(fallbackMessage);
42
+ }
43
+
44
+ export function createIncomingShareStore(): IIncomingShareStore {
45
+ let snapshot: IIncomingShareSnapshot = {
46
+ sharedPayloads: getSharedPayloads(),
47
+ resolvedSharedPayloads: [],
48
+ isResolving: false,
49
+ error: null,
50
+ };
51
+ // Starts empty, not at the first snapshot, so a first refresh with data always resolves it
52
+ let lastRefreshed: ISharePayload[] = [];
53
+ const listeners = new Set<(next: IIncomingShareSnapshot) => void>();
54
+ let appStateSubscription: { remove: () => void } | null = null;
55
+
56
+ function update(patch: Partial<IIncomingShareSnapshot>): void {
57
+ snapshot = { ...snapshot, ...patch };
58
+ for (const listener of listeners) listener(snapshot);
59
+ }
60
+
61
+ async function resolvePayloads(): Promise<void> {
62
+ update({ isResolving: true });
63
+ try {
64
+ update({
65
+ resolvedSharedPayloads: await getResolvedSharedPayloadsAsync(),
66
+ });
67
+ } catch (cause) {
68
+ update({
69
+ error: toError(cause, 'Unknown error during shared payload resolution'),
70
+ });
71
+ } finally {
72
+ update({ isResolving: false });
73
+ }
74
+ }
75
+
76
+ async function refresh(): Promise<void> {
77
+ try {
78
+ const next = getSharedPayloads();
79
+ // Skip the resolve when nothing changed, it can cost a network round trip
80
+ if (sharePayloadsAreEqual(next, lastRefreshed)) return;
81
+ lastRefreshed = next;
82
+ update({ sharedPayloads: next, resolvedSharedPayloads: [], error: null });
83
+ if (next.length > 0) await resolvePayloads();
84
+ } catch (cause) {
85
+ update({ error: toError(cause, 'Failed to resolve data') });
86
+ }
87
+ }
88
+
89
+ function start(): void {
90
+ void refresh();
91
+ appStateSubscription = AppState.addEventListener('change', status => {
92
+ if (status === 'active') void refresh();
93
+ });
94
+ }
95
+
96
+ function stop(): void {
97
+ appStateSubscription?.remove();
98
+ appStateSubscription = null;
99
+ }
100
+
101
+ return {
102
+ getSnapshot: () => snapshot,
103
+ refresh,
104
+ clear: clearSharedPayloads,
105
+ addListener(_event, listener) {
106
+ const wasIdle = listeners.size === 0;
107
+ listeners.add(listener);
108
+ // After `add`, so the first refresh's synchronous update reaches this listener
109
+ if (wasIdle) start();
110
+ return {
111
+ remove: () => {
112
+ listeners.delete(listener);
113
+ if (listeners.size === 0) stop();
114
+ },
115
+ };
116
+ },
117
+ };
118
+ }
package/src/core/index.ts CHANGED
@@ -1,2 +1,26 @@
1
- export { isAvailableAsync, shareAsync } from './sharing';
2
- export type { ISharingAnchor, ISharingOptions } from './types';
1
+ export {
2
+ clearSharedPayloads,
3
+ getResolvedSharedPayloadsAsync,
4
+ getSharedPayloads,
5
+ isAvailableAsync,
6
+ shareAsync,
7
+ } from './sharing';
8
+ export {
9
+ createIncomingShareStore,
10
+ INCOMING_SHARE_CHANGE,
11
+ } from './incoming-share-store';
12
+ export type { IIncomingShareStore } from './incoming-share-store';
13
+ export { withShareActions } from './incoming-share-result';
14
+ export type {
15
+ IBaseResolvedSharePayload,
16
+ IContentType,
17
+ IIncomingShareSnapshot,
18
+ IResolvedSharePayload,
19
+ IShareType,
20
+ ISharePayload,
21
+ ISharingAnchor,
22
+ ISharingOptions,
23
+ ITextBasedResolvedSharePayload,
24
+ IUriBasedResolvedSharePayload,
25
+ IUseIncomingShareResult,
26
+ } from './types';
@@ -1,5 +1,9 @@
1
1
  import { requireNativeModule } from 'expo-modules-core';
2
- import type { ISharingOptions } from './types';
2
+ import type {
3
+ IResolvedSharePayload,
4
+ ISharePayload,
5
+ ISharingOptions,
6
+ } from './types';
3
7
 
4
8
  const EXPO_SHARING_MODULE_NAME = 'ExpoSharing';
5
9
 
@@ -11,12 +15,14 @@ const EXPO_SHARING_MODULE_NAME = 'ExpoSharing';
11
15
  // the web module (which this package does not ship) defines it. Presence of the module itself is
12
16
  // therefore what availability is read from — see isAvailableAsync in ./sharing.
13
17
  //
14
- // The incoming-share methods (getSharedPayloads, getResolvedSharedPayloadsAsync,
15
- // clearSharedPayloads) are deliberately absent from this type: reaching them needs an iOS Share
16
- // Extension target this package does not ship. See the README.
18
+ // The incoming-share methods exist on the native module, but return data only once the host app
19
+ // carries the share target (iOS Share Extension, Android intent filters), see the README
17
20
  export type INativeSharingModule = {
18
21
  isAvailableAsync?(): Promise<boolean>;
19
22
  shareAsync?(url: string, options: ISharingOptions): Promise<void>;
23
+ getSharedPayloads?(): ISharePayload[];
24
+ getResolvedSharedPayloadsAsync?(): Promise<IResolvedSharePayload[]>;
25
+ clearSharedPayloads?(): void;
20
26
  };
21
27
 
22
28
  export const expoSharing = requireNativeModule<INativeSharingModule>(