diff --git a/packages/appkit/src/client/appkit-base-client.ts b/packages/appkit/src/client/appkit-base-client.ts index 908080848e..4add62daf1 100644 --- a/packages/appkit/src/client/appkit-base-client.ts +++ b/packages/appkit/src/client/appkit-base-client.ts @@ -2452,6 +2452,7 @@ export abstract class AppKitBaseClient { callback: (newState: UseAppKitAccountReturn) => void, namespace?: ChainNamespace ) { + const unsubArr: (() => void)[] = [] const updateVal = () => { const account = this.getAccount(namespace) @@ -2463,11 +2464,18 @@ export abstract class AppKitBaseClient { } if (namespace) { - ChainController.subscribeChainProp('accountState', updateVal, namespace) + const unsub = ChainController.subscribeChainProp('accountState', updateVal, namespace) + unsubArr.push(unsub) } else { - ChainController.subscribe(updateVal) + const unsub = ChainController.subscribe(updateVal) + unsubArr.push(unsub) + } + const unsub = ConnectorController.subscribe(updateVal) + unsubArr.push(unsub) + + return () => { + unsubArr.forEach(fn => fn()) } - ConnectorController.subscribe(updateVal) } public subscribeNetwork( @@ -2500,13 +2508,13 @@ export abstract class AppKitBaseClient { } public subscribeShouldUpdateToAddress(callback: (newState?: string) => void) { - ChainController.subscribeChainProp('accountState', accountState => + return ChainController.subscribeChainProp('accountState', accountState => callback(accountState?.shouldUpdateToAddress) ) } public subscribeCaipNetworkChange(callback: (newState?: CaipNetwork) => void) { - ChainController.subscribeKey('activeCaipNetwork', callback) + return ChainController.subscribeKey('activeCaipNetwork', callback) } public getState() { diff --git a/packages/appkit/tests/client/appkit-core.test.ts b/packages/appkit/tests/client/appkit-core.test.ts index 1b3561ae49..26fc714477 100644 --- a/packages/appkit/tests/client/appkit-core.test.ts +++ b/packages/appkit/tests/client/appkit-core.test.ts @@ -115,4 +115,35 @@ describe('AppKitCore', () => { expect(blockchainApiSpy).not.toHaveBeenCalled() }) }) + + describe('Subscribe methods return unsubscribe functions', () => { + beforeEach(() => { + appKit = new AppKit(mockOptions) + }) + + it('should return unsubscribe functions', () => { + expect(typeof appKit.subscribeProviders(() => {})).toBe('function') + expect(typeof appKit.subscribeTheme(() => {})).toBe('function') + expect(typeof appKit.subscribeConnections(() => {})).toBe('function') + expect(typeof appKit.subscribeAccount(() => {})).toBe('function') + expect(typeof appKit.subscribeNetwork(() => {})).toBe('function') + expect(typeof appKit.subscribeWalletInfo(() => {})).toBe('function') + expect(typeof appKit.subscribeShouldUpdateToAddress(() => {})).toBe('function') + expect(typeof appKit.subscribeCaipNetworkChange(() => {})).toBe('function') + expect(typeof appKit.subscribeState(() => {})).toBe('function') + expect(typeof appKit.subscribeRemoteFeatures(() => {})).toBe('function') + expect(typeof appKit.subscribeEvents(() => {})).toBe('function') + }) + + it('should call all unsubscribe functions in subscribeAccount', () => { + const mockUnsub = vi.fn() + vi.spyOn(ChainController, 'subscribe').mockReturnValue(mockUnsub) + vi.spyOn(ConnectorController, 'subscribe').mockReturnValue(mockUnsub) + + const unsubscribe = appKit.subscribeAccount(() => {}) + unsubscribe() + + expect(mockUnsub).toHaveBeenCalledTimes(2) + }) + }) })