|
1 | 1 | import { Account } from '@provablehq/aleo-types'; |
2 | 2 | import { WalletReadyState } from './wallet'; |
3 | 3 |
|
4 | | -export interface WalletEvents { |
5 | | - /** |
6 | | - * Emitted when the wallet is connected |
7 | | - */ |
8 | | - connect(account: Account): void; |
| 4 | +export type WalletEventMap = { |
| 5 | + connect: Account; |
| 6 | + disconnect: void; |
| 7 | + accountChange: Account; |
| 8 | + readyStateChange: WalletReadyState; |
| 9 | + error: Error; |
| 10 | +}; |
9 | 11 |
|
10 | | - /** |
11 | | - * Emitted when the wallet is disconnected |
12 | | - */ |
13 | | - disconnect(): void; |
14 | | - |
15 | | - /** |
16 | | - * Emitted when the connected account changes |
17 | | - */ |
18 | | - accountChange(newAccount: Account): void; |
19 | | - |
20 | | - /** |
21 | | - * Emitted when the wallet's ready state changes |
22 | | - */ |
23 | | - readyStateChange(readyState: WalletReadyState): void; |
24 | | - |
25 | | - /** |
26 | | - * Emitted when an error occurs |
27 | | - */ |
28 | | - error(error: Error): void; |
29 | | - |
30 | | - /** |
31 | | - * Index signature for additional events |
32 | | - */ |
33 | | - [eventName: string]: ((...args: any[]) => void) | undefined; |
34 | | -} |
| 12 | +export type WalletEventType = keyof WalletEventMap; |
| 13 | +export type WalletEventHandler<T extends WalletEventType> = (payload: WalletEventMap[T]) => void; |
35 | 14 |
|
36 | 15 | /** |
37 | 16 | * Base interface for any wallet event emitter |
38 | 17 | */ |
39 | | -export interface EventEmitter< |
40 | | - Events extends Record<string, ((...args: any[]) => unknown) | undefined> = WalletEvents, |
41 | | -> { |
| 18 | +export interface EventEmitter { |
42 | 19 | /** |
43 | 20 | * Register an event listener |
44 | 21 | */ |
45 | | - on<E extends keyof Events>(event: E, listener: Events[E]): this; |
| 22 | + on<T extends WalletEventType>(event: T, listener: WalletEventHandler<T>): this; |
46 | 23 |
|
47 | 24 | /** |
48 | 25 | * Register a one-time event listener |
49 | 26 | */ |
50 | | - once<E extends keyof Events>(event: E, listener: Events[E]): this; |
| 27 | + once<T extends WalletEventType>(event: T, listener: WalletEventHandler<T>): this; |
51 | 28 |
|
52 | 29 | /** |
53 | 30 | * Unregister an event listener |
54 | 31 | */ |
55 | | - off<E extends keyof Events>(event: E, listener: Events[E]): this; |
| 32 | + off<T extends WalletEventType>(event: T, listener: WalletEventHandler<T>): this; |
56 | 33 |
|
57 | 34 | /** |
58 | 35 | * Emit an event |
59 | 36 | */ |
60 | | - emit<E extends keyof Events>(event: E, ...args: Parameters<NonNullable<Events[E]>>): boolean; |
| 37 | + emit<T extends WalletEventType>(event: T, payload: WalletEventMap[T]): boolean; |
| 38 | +} |
| 39 | + |
| 40 | +/** |
| 41 | + * Type guard to check if an event type is valid |
| 42 | + */ |
| 43 | +export function isValidWalletEvent(event: string): event is WalletEventType { |
| 44 | + return ['connect', 'disconnect', 'accountChange', 'readyStateChange', 'error'].includes(event); |
61 | 45 | } |
0 commit comments