Skip to content

Commit

Permalink
fix: use sync store (#48)
Browse files Browse the repository at this point in the history
  • Loading branch information
gronxb authored Jun 24, 2024
1 parent 08bf6d8 commit 2f11b42
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 14 deletions.
22 changes: 13 additions & 9 deletions packages/react-native/src/useBridge.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import type { Bridge, BridgeStore, ExtractStore } from "@webview-bridge/types";
import { useSyncExternalStore } from "use-sync-external-store/shim/index.js";
import { useSyncExternalStoreWithSelector } from "use-sync-external-store/with-selector.js";

export function useBridge<T extends Bridge>(
store: BridgeStore<T>,
Expand All @@ -11,12 +11,16 @@ export function useBridge<
V,
>(store: BridgeStore<T>, selector?: (state: U) => V): V;

export function useBridge<
T extends Bridge,
U extends ExtractStore<BridgeStore<T>>,
V,
>(store: BridgeStore<T>, selector?: (state: U) => V): V {
const getSnapshot = () =>
selector?.(store.getState() as U) ?? store.getState();
return useSyncExternalStore(store.subscribe, getSnapshot) as V;
export function useBridge<T extends Bridge, U>(
store: BridgeStore<T>,
selector?: (state: T) => U,
): U {
const $selector = selector ?? ((state: T) => state as unknown as U);

return useSyncExternalStoreWithSelector(
store.subscribe,
store.getState,
store.getState,
$selector,
);
}
22 changes: 17 additions & 5 deletions packages/react/src/useBridge.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,26 @@
import type { Bridge, BridgeStore } from "@webview-bridge/web";
import type { Bridge, BridgeStore, ExtractStore } from "@webview-bridge/web";
import { useSyncExternalStoreWithSelector } from "use-sync-external-store/with-selector.js";

export const useBridge = <T extends Bridge, U>(
export function useBridge<T extends Bridge>(
store: Omit<BridgeStore<T>, "setState">,
): ExtractStore<BridgeStore<T>>;

export function useBridge<
T extends Bridge,
U extends ExtractStore<BridgeStore<T>>,
V,
>(store: Omit<BridgeStore<T>, "setState">, selector?: (state: U) => V): V;

export function useBridge<T extends Bridge, U>(
store: Omit<BridgeStore<T>, "setState">,
selector?: (state: T) => U,
): U => {
): U {
const $selector = selector ?? ((state: T) => state as unknown as U);

return useSyncExternalStoreWithSelector(
store.subscribe,
store.getState,
store.getState,
selector ?? ((state: T) => state as unknown as U),
$selector,
);
};
}

0 comments on commit 2f11b42

Please sign in to comment.