Skip to content

Commit 0411813

Browse files
committed
refactoring & renaming
1 parent 86b4e05 commit 0411813

File tree

14 files changed

+116
-107
lines changed

14 files changed

+116
-107
lines changed

packages/typink/src/hooks/__tests__/test-utils.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { act } from '@testing-library/react';
22
import { Props } from '../../types.js';
3-
import { ListenersProvider } from '../../providers/index.js';
3+
import { TypinkEventsProvider } from '../../providers/index.js';
44

55
export const waitForNextUpdate = async (then?: () => Promise<void>) => {
66
await act(async () => {
@@ -13,4 +13,4 @@ export const sleep = (ms: number = 0) => {
1313
return new Promise((resolve) => setTimeout(resolve, ms));
1414
};
1515

16-
export const listenerWrapper = ({ children }: Props) => <ListenersProvider>{children}</ListenersProvider>;
16+
export const typinkEventsWrapper = ({ children }: Props) => <TypinkEventsProvider>{children}</TypinkEventsProvider>;

packages/typink/src/hooks/__tests__/usePSP22Balance.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { useRawContract } from '../useRawContract.js';
55
import { useContractQuery } from '../useContractQuery.js';
66
import { useWatchContractEvent } from '../useWatchContractEvent.js';
77
import { renderHook, waitFor } from '@testing-library/react';
8-
import { waitForNextUpdate } from './test-utils';
8+
import { waitForNextUpdate } from './test-utils.js';
99

1010
vi.mock('../useTypink');
1111
vi.mock('../useWatchContractEvent');

packages/typink/src/hooks/__tests__/useWatchContractEvent.test.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ import { useTypink } from '../useTypink.js';
44
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
55
import { Contract } from 'dedot/contracts';
66
import { Psp22ContractApi } from '../psp22/contracts/psp22';
7-
import { useListeners, useClient } from '../../providers/index.js';
8-
import { listenerWrapper, waitForNextUpdate } from './test-utils.js';
7+
import { useTypinkEvents, useClient } from '../../providers/index.js';
8+
import { typinkEventsWrapper, waitForNextUpdate } from './test-utils.js';
99
import type { ContractEvent } from 'dedot/contracts';
1010

1111
vi.mock('../useTypink', () => ({
@@ -90,7 +90,7 @@ describe('useWatchContractEvent', () => {
9090
});
9191
});
9292

93-
const { result } = renderHook(() => useListeners(), { wrapper: listenerWrapper });
93+
const { result } = renderHook(() => useTypinkEvents(), { wrapper: typinkEventsWrapper });
9494

9595
await waitFor(() => {
9696
expect(result.current).toBeDefined();
Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,25 @@
11
import { useState } from 'react';
2-
import { InternalEvent } from 'src/utils/events';
2+
import { TypinkEvent } from '../../providers/index.js';
33

4-
export const useListenerCounter = (counterEvent: InternalEvent) => {
4+
export const useListenerCounter = (event: TypinkEvent) => {
55
const [counter, setCounter] = useState(0);
66

7-
const increaseIfMatch = (event: InternalEvent) => {
8-
if (event !== counterEvent) return;
7+
const tryIncrease = (eventToCheck: TypinkEvent) => {
8+
if (event !== eventToCheck) return;
99

1010
setCounter((counter) => counter + 1);
1111
};
1212

13-
const decreaseIfMatch = (event: InternalEvent) => {
14-
if (event !== counterEvent) return;
13+
const tryDecrease = (eventToCheck: TypinkEvent) => {
14+
if (event !== eventToCheck) return;
1515

1616
setCounter((counter) => counter - 1);
1717
};
1818

19-
return { counter, increaseIfMatch, decreaseIfMatch, hasListener: counter > 0 };
19+
return {
20+
tryIncrease,
21+
tryDecrease,
22+
counter,
23+
hasAny: counter > 0,
24+
};
2025
};

packages/typink/src/hooks/useWatchContractEvent.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import { OmitNever } from '../types.js';
22
import { Contract, GenericContractApi } from 'dedot/contracts';
3-
import { useWatchInternalEvent } from './useWatchInternalEvent.js';
4-
import { InternalEvent } from '../utils/events.js';
3+
import { useWatchTypinkEvent } from './useWatchTypinkEvent.js';
54
import { useCallback } from 'react';
65
import { useDeepDeps } from './internal/useDeepDeps.js';
6+
import { TypinkEvent } from '../providers/index.js';
77

88
export type UseContractEvent<A extends GenericContractApi = GenericContractApi> = OmitNever<{
99
[K in keyof A['events']]: K extends string ? (K extends `${infer Literal}` ? Literal : never) : never;
@@ -30,8 +30,8 @@ export function useWatchContractEvent<
3030
onNewEvent: (events: ReturnType<T['events'][M]['filter']>) => void,
3131
enabled: boolean = true,
3232
): void {
33-
useWatchInternalEvent(
34-
InternalEvent.SYSTEM_EVENTS,
33+
useWatchTypinkEvent(
34+
TypinkEvent.SYSTEM_EVENTS,
3535
useCallback(
3636
(events) => {
3737
if (!contract || !enabled) return;

packages/typink/src/hooks/useWatchInternalEvent.ts renamed to packages/typink/src/hooks/useWatchTypinkEvent.ts

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,21 @@
11
import { useEffect } from 'react';
22
import { useDeepDeps } from './internal/index.js';
33
import { useTypink } from './useTypink.js';
4-
import { InternalCallback, InternalEvent } from '../utils/events.js';
4+
import { TypinkEvent, TypinkEventsRegistration } from '../providers/index.js';
55

66
/**
7-
* A React hook that watches for internal system events.
7+
* A React hook that watches for internal typink events.
88
*
99
* This hook sets up a subscription to system events and filters for the specified event.
1010
* When new events are detected, it calls the provided callback function.
1111
*
12-
* @param parameters - The hook parameters.
13-
* @param parameters.event - The name of the event to watch for.
14-
* @param parameters.callback - Callback function to be called when new events are detected.
15-
* @param parameters.enabled - Optional boolean to enable or disable the event watching. Defaults to true.
12+
* @param event - The name of the event to watch for.
13+
* @param callback - Callback function to be called when new events are detected.
14+
* @param enabled - Optional boolean to enable or disable the event watching. Defaults to true.
1615
*/
17-
export function useWatchInternalEvent<T extends InternalEvent>(
16+
export function useWatchTypinkEvent<T extends TypinkEvent>(
1817
event: T,
19-
callback: InternalCallback[T],
18+
callback: TypinkEventsRegistration[T],
2019
enabled: boolean = true,
2120
) {
2221
const { subscribeToEvent, client } = useTypink();

packages/typink/src/providers/ListenersProvider.tsx

Lines changed: 0 additions & 59 deletions
This file was deleted.
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
import { createContext, useContext, useEffect } from 'react';
2+
import { Props } from '../types.js';
3+
import { useClient } from './ClientProvider.js';
4+
import { useListenerCounter } from '../hooks/internal/useListenerCounter.js';
5+
import { FrameSystemEventRecord } from 'dedot/chaintypes';
6+
import { EventEmitter } from 'dedot/utils';
7+
import { noop } from '../utils/index.js';
8+
9+
export type TypinkEventsRegistration = {
10+
[TypinkEvent.SYSTEM_EVENTS]: (events: FrameSystemEventRecord[]) => void;
11+
};
12+
13+
export type Unsub = () => void;
14+
15+
export enum TypinkEvent {
16+
SYSTEM_EVENTS = 'SYSTEM_EVENTS',
17+
}
18+
19+
const eventEmitter = new EventEmitter<TypinkEvent>();
20+
21+
export interface TypinkEventsContextProps {
22+
subscribeToEvent<T extends TypinkEvent>(event: T, callback: TypinkEventsRegistration[T]): Unsub;
23+
}
24+
25+
export const TypinkEventsContext = createContext<TypinkEventsContextProps>({} as any);
26+
27+
export const useTypinkEvents = () => {
28+
return useContext(TypinkEventsContext);
29+
};
30+
31+
/**
32+
* TypinkEventsProvider is a React component that manages event listeners for system events.
33+
* It provides a context for subscribing to and managing event listeners.
34+
*
35+
* @param props - The component props.
36+
* @param props.children - The child components to be wrapped by the provider.
37+
*/
38+
export function TypinkEventsProvider({ children }: Props) {
39+
const { client } = useClient();
40+
const { hasAny, tryIncrease, tryDecrease } = useListenerCounter(TypinkEvent.SYSTEM_EVENTS);
41+
42+
useEffect(() => {
43+
if (!client || !hasAny) return;
44+
45+
let unsub: Unsub | undefined;
46+
let unmounted = false;
47+
48+
(async () => {
49+
unsub = await client.query.system.events((events) => {
50+
if (unmounted) {
51+
unsub && unsub();
52+
return;
53+
}
54+
55+
eventEmitter.emit(TypinkEvent.SYSTEM_EVENTS, events);
56+
});
57+
})();
58+
59+
return () => {
60+
unsub && unsub();
61+
unmounted = true;
62+
};
63+
}, [client, hasAny]);
64+
65+
const subscribeToEvent = (event: TypinkEvent, callback: (events: any[]) => void): Unsub => {
66+
if (!client) return noop;
67+
68+
const unsub = eventEmitter.on(event, callback);
69+
tryIncrease(event);
70+
71+
return () => {
72+
unsub();
73+
tryDecrease(event);
74+
};
75+
};
76+
77+
return <TypinkEventsContext.Provider value={{ subscribeToEvent }}>{children}</TypinkEventsContext.Provider>;
78+
}

packages/typink/src/providers/TypinkProvider.tsx

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,13 @@ import {
88
WalletSetupProvider,
99
WalletSetupProviderProps,
1010
} from './WalletSetupProvider.js';
11-
import { ListenersContextProps, ListenersProvider, useListeners } from './ListenersProvider.js';
11+
import { TypinkEventsContextProps, TypinkEventsProvider, useTypinkEvents } from './TypinkEventsProvider.js';
1212

1313
export interface TypinkContextProps
1414
extends ClientContextProps,
1515
WalletSetupContextProps,
1616
WalletContextProps,
17-
ListenersContextProps {
17+
TypinkEventsContextProps {
1818
deployments: ContractDeployment[];
1919
defaultCaller: SubstrateAddress; // TODO validate substrate address
2020
}
@@ -30,12 +30,12 @@ function TypinkProviderInner({ children, deployments, defaultCaller }: TypinkPro
3030
const clientContext = useClient();
3131
const walletSetupContext = useWalletSetup();
3232
const walletContext = useWallet();
33-
const listenersContext = useListeners();
33+
const typinkEventsContext = useTypinkEvents();
3434

3535
return (
3636
<TypinkContext.Provider
3737
value={{
38-
...listenersContext,
38+
...typinkEventsContext,
3939
...clientContext,
4040
...walletSetupContext,
4141
...walletContext,
@@ -85,11 +85,11 @@ export function TypinkProvider({
8585
defaultNetworkId={defaultNetworkId}
8686
cacheMetadata={cacheMetadata}
8787
supportedNetworks={supportedNetworks}>
88-
<ListenersProvider>
88+
<TypinkEventsProvider>
8989
<TypinkProviderInner deployments={deployments} defaultCaller={defaultCaller}>
9090
{children}
9191
</TypinkProviderInner>
92-
</ListenersProvider>
92+
</TypinkEventsProvider>
9393
</ClientProvider>
9494
</WalletSetupProvider>
9595
);

packages/typink/src/providers/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@ export * from './WalletProvider.js';
22
export * from './WalletSetupProvider.js';
33
export * from './ClientProvider.js';
44
export * from './TypinkProvider.js';
5-
export * from './ListenersProvider.js';
5+
export * from './TypinkEventsProvider.js';

0 commit comments

Comments
 (0)