Skip to content

Commit cc2055c

Browse files
fix: update createSharedSubscription to accept options and improve data handling
1 parent 2b17dfc commit cc2055c

File tree

2 files changed

+23
-9
lines changed

2 files changed

+23
-9
lines changed

demo/app.tsx

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ const Comp1 = () => {
5252

5353

5454

55-
const s = createSharedSubscription<string>((set, onError, onCompletion) => {
55+
const s = createSharedSubscription((set, onError, onCompletion) => {
5656

5757
return FakeSharedEmitter.subscribe("x", (data: string) => {
5858
if (data === "do-error") {
@@ -63,22 +63,24 @@ const s = createSharedSubscription<string>((set, onError, onCompletion) => {
6363
console.log("data loaded...", data);
6464
}, onError, onCompletion)
6565

66+
}, {
67+
initialValue: ""
6668
})
6769

6870
const use = () => {
6971
return useSharedSubscription(s);
7072
}
7173

7274
const Comp2 = () => {
73-
const {state, trigger, unsubscribe} = use();
75+
const {state: {data, ...state}, trigger, unsubscribe} = use();
7476

7577

7678
return (
7779
<div>
7880
<h1 className="text-red-600">Comp2 - {state.isLoading && "loading"}</h1>
7981
<button onClick={() => trigger()}>subscribe</button>
8082
<button onClick={() => unsubscribe()}>unsubscribe</button>
81-
results: {state.data}
83+
results: {data}
8284
<br/>
8385
</div>
8486
)

src/hooks/use-shared-subscription.ts

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ export namespace SubscriberEvents {
1414
export type Subscriber<T> = (set: SubscriberEvents.Set<T>, onError: SubscriberEvents.OnError, onCompletion: SubscriberEvents.OnCompletion) => PotentialPromise<Unsubscribe | void | undefined>;
1515

1616
export type SharedSubscriptionValue<T> = {
17-
data?: T;
17+
data: T;
1818
isLoading: boolean;
1919
error?: unknown;
2020
subscribed?: boolean
@@ -24,11 +24,12 @@ interface SharedSubscription<T> extends SharedSubscriptionValue<T> {
2424
unsubscribe?: Unsubscribe | void;
2525
}
2626

27-
const sharedSubscriptionsManager = new SharedValuesManager<SharedSubscription<any>>(() => defaultValue);
27+
const sharedSubscriptionsManager = new SharedValuesManager<SharedSubscription<any>>();
2828
export const sharedSubscriptionsApi = new SharedValuesApi<SharedSubscription<any>>(sharedSubscriptionsManager);
2929

3030
interface SharedSubscriptionCreated<T> extends SharedCreated {
31-
subscriber: Subscriber<T>
31+
subscriber: Subscriber<T>;
32+
triggerImmediately?: boolean;
3233
}
3334

3435
const defaultValue: SharedSubscription<any> = {
@@ -39,8 +40,11 @@ const defaultValue: SharedSubscription<any> = {
3940
unsubscribe: undefined,
4041
};
4142

42-
export const createSharedSubscription = <T>(subscriber: Subscriber<T>, scopeName?: Prefix): SharedSubscriptionCreated<T> => {
43-
return sharedSubscriptionsManager.createStatic<SharedSubscriptionCreated<T>>({subscriber}, defaultValue, scopeName);
43+
export const createSharedSubscription = <T>(subscriber: Subscriber<T>, options?: {
44+
initialValue?: T,
45+
triggerImmediately?: boolean,
46+
}, scopeName?: Prefix): SharedSubscriptionCreated<T> => {
47+
return sharedSubscriptionsManager.createStatic<SharedSubscriptionCreated<T>>({subscriber}, {...defaultValue, data: options?.initialValue as T}, scopeName);
4448
}
4549

4650
export type SharedSubscriptionStateReturn<T> = {
@@ -69,12 +73,14 @@ export function useSharedSubscription<T, S extends string = string>(
6973
let keyStr: string;
7074
let subscriberVal!: Subscriber<T>;
7175
let scope: Prefix | undefined = scopeName;
76+
let triggerImmediately = false;
7277

7378
if (typeof key !== "string") {
74-
const {key: key2, subscriber: sub, prefix: prefix2} = key;
79+
const {key: key2, subscriber: sub, prefix: prefix2, triggerImmediately: _triggerImmediately} = key;
7580
keyStr = key2;
7681
subscriberVal = sub;
7782
scope = prefix2;
83+
triggerImmediately = _triggerImmediately??false;
7884
} else {
7985
keyStr = ensureNonEmptyString(key);
8086
subscriberVal = subscriber as Subscriber<T>;
@@ -147,6 +153,12 @@ export function useSharedSubscription<T, S extends string = string>(
147153

148154
sharedSubscriptionsManager.useEffect(keyStr, prefix);
149155

156+
useEffect(() => {
157+
if (triggerImmediately) {
158+
void trigger(false);
159+
}
160+
}, []);
161+
150162
return {
151163
state,
152164
trigger: () => {

0 commit comments

Comments
 (0)