Skip to content

Commit 1553904

Browse files
committed
feat(core): factory bind accept function for default value
1 parent 961eade commit 1553904

File tree

3 files changed

+33
-3
lines changed

3 files changed

+33
-3
lines changed

packages/core/src/bind/connectFactoryObservable.test.tsx

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -541,6 +541,33 @@ describe("connectFactoryObservable", () => {
541541
unmount()
542542
})
543543

544+
it("the defaultValue can be a function that receives the keys", () => {
545+
const subj$ = new Subject<number>()
546+
const [useNumber, number$] = bind(
547+
(_: number) => subj$,
548+
(key) => key,
549+
)
550+
551+
const { result, unmount } = renderHook(() => useNumber(10))
552+
553+
expect(result.current).toBe(10)
554+
let res = 0
555+
number$(10)
556+
.subscribe((x) => {
557+
res = x
558+
})
559+
.unsubscribe()
560+
expect(res).toBe(10)
561+
562+
actHook(() => {
563+
subj$.next(5)
564+
})
565+
566+
expect(result.current).toBe(5)
567+
568+
unmount()
569+
})
570+
544571
it("if the observable hasn't emitted and a defaultValue is provided, it does not start suspense", () => {
545572
const number$ = new Subject<number>()
546573
const [useNumber] = bind(

packages/core/src/bind/connectFactoryObservable.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,15 @@ import { SUSPENSE } from "../SUSPENSE"
2525
*/
2626
export default function connectFactoryObservable<A extends [], O>(
2727
getObservable: (...args: A) => Observable<O>,
28-
defaultValue: O,
28+
defaultValue: O | ((...args: A) => O),
2929
): [
3030
(...args: A) => Exclude<O, typeof SUSPENSE>,
3131
(...args: A) => Observable<O>,
3232
] {
3333
const cache = new NestedMap<A, BehaviorObservable<O>>()
34+
const getDefaultValue = (typeof defaultValue === "function"
35+
? defaultValue
36+
: () => defaultValue) as (...args: A) => O
3437

3538
const getSharedObservables$ = (input: A): BehaviorObservable<O> => {
3639
for (let i = input.length - 1; input[i] === undefined && i > -1; i--) {
@@ -45,7 +48,7 @@ export default function connectFactoryObservable<A extends [], O>(
4548

4649
const sharedObservable$ = shareLatest(
4750
getObservable(...input),
48-
defaultValue,
51+
getDefaultValue(...input),
4952
false,
5053
() => {
5154
cache.delete(keys)

packages/core/src/bind/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ export function bind<T>(
4343
*/
4444
export function bind<A extends unknown[], O>(
4545
getObservable: (...args: A) => Observable<O>,
46-
defaultValue?: O,
46+
defaultValue?: O | ((...args: A) => O),
4747
): [(...args: A) => Exclude<O, typeof SUSPENSE>, (...args: A) => Observable<O>]
4848

4949
export function bind(observable: any, defaultValue: any) {

0 commit comments

Comments
 (0)