Skip to content

Commit 8b48409

Browse files
committed
feat: useListAccounts
1 parent 7dac3ae commit 8b48409

File tree

3 files changed

+82
-31
lines changed

3 files changed

+82
-31
lines changed
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
import { IntentResponseAccountList, SequenceWaaS } from '@0xsequence/waas'
2+
import { useQuery } from '@tanstack/react-query'
3+
import { useConnections } from 'wagmi'
4+
5+
interface UseListAccountsResult {
6+
/** The accounts data if available */
7+
data?: IntentResponseAccountList
8+
/** Whether the query is currently loading */
9+
isLoading: boolean
10+
/** Any error that occurred during the query */
11+
error: Error | null
12+
/** Function to manually refetch the accounts */
13+
refetch: () => Promise<void>
14+
}
15+
16+
/**
17+
* Hook to list all accounts associated with the current WaaS session.
18+
* Uses React Query for proper async state management.
19+
*
20+
* @returns {UseListAccountsResult} Object containing the accounts data, loading state, error state, and refetch function
21+
*
22+
* @example
23+
* ```tsx
24+
* function AccountsList() {
25+
* const { data, isLoading, error, refetch } = useListAccounts()
26+
*
27+
* if (isLoading) return <div>Loading accounts...</div>
28+
* if (error) return <div>Error: {error.message}</div>
29+
*
30+
* return (
31+
* <div>
32+
* <button onClick={() => refetch()}>Refresh Accounts</button>
33+
* {data?.accounts.map(account => (
34+
* <div key={account.id}>{account.address}</div>
35+
* ))}
36+
* </div>
37+
* )
38+
* }
39+
* ```
40+
*/
41+
export const useListAccounts = (): UseListAccountsResult => {
42+
const connections = useConnections()
43+
44+
const {
45+
data,
46+
isLoading,
47+
error,
48+
refetch: reactQueryRefetch
49+
} = useQuery({
50+
queryKey: ['waas', 'listAccounts'],
51+
queryFn: async () => {
52+
console.log('FETCHING ACCOUNTS')
53+
const waasConnection = connections.find(c => c.connector.id.includes('waas'))
54+
if (!waasConnection) {
55+
throw new Error('No WaaS connector found')
56+
}
57+
58+
const sequenceWaas = (waasConnection.connector as any).sequenceWaas as SequenceWaaS
59+
if (!sequenceWaas) {
60+
throw new Error('WaaS instance not properly initialized')
61+
}
62+
63+
return await sequenceWaas.listAccounts()
64+
},
65+
// Only run the query if we have connections
66+
enabled: connections.length > 0,
67+
// Cache the results for 1 minute
68+
staleTime: 60 * 1000
69+
})
70+
71+
const refetch = async () => {
72+
await reactQueryRefetch()
73+
}
74+
75+
return {
76+
data,
77+
isLoading,
78+
error: error as Error | null,
79+
refetch
80+
}
81+
}

packages/connect/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ export { useProjectAccessKey } from './hooks/useProjectAccessKey'
9393
export { useStorage, useStorageItem } from './hooks/useStorage'
9494
export { useChain } from './hooks/useChain'
9595
export { useWallets } from './hooks/useWallets'
96+
export { useListAccounts } from './hooks/useListAccounts'
9697
export type { ConnectedWallet } from './hooks/useWallets'
9798
export type { LinkedWallet } from '@0xsequence/api'
9899

packages/connect/src/styles.ts

Lines changed: 0 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -302,9 +302,6 @@ export const styles = String.raw`
302302
.my-4 {
303303
margin-block: calc(var(--spacing) * 4);
304304
}
305-
.mt-0 {
306-
margin-top: calc(var(--spacing) * 0);
307-
}
308305
.mt-0\.5 {
309306
margin-top: calc(var(--spacing) * 0.5);
310307
}
@@ -386,9 +383,6 @@ export const styles = String.raw`
386383
.inline-flex {
387384
display: inline-flex;
388385
}
389-
.table {
390-
display: table;
391-
}
392386
.aspect-square {
393387
aspect-ratio: 1 / 1;
394388
}
@@ -482,9 +476,6 @@ export const styles = String.raw`
482476
.min-h-full {
483477
min-height: 100%;
484478
}
485-
.w-1 {
486-
width: calc(var(--spacing) * 1);
487-
}
488479
.w-1\/2 {
489480
width: calc(1/2 * 100%);
490481
}
@@ -560,9 +551,6 @@ export const styles = String.raw`
560551
.w-screen {
561552
width: 100vw;
562553
}
563-
.max-w-1 {
564-
max-width: calc(var(--spacing) * 1);
565-
}
566554
.max-w-1\/2 {
567555
max-width: calc(1/2 * 100%);
568556
}
@@ -587,21 +575,12 @@ export const styles = String.raw`
587575
.min-w-full {
588576
min-width: 100%;
589577
}
590-
.flex-shrink {
591-
flex-shrink: 1;
592-
}
593578
.shrink-0 {
594579
flex-shrink: 0;
595580
}
596-
.flex-grow {
597-
flex-grow: 1;
598-
}
599581
.grow {
600582
flex-grow: 1;
601583
}
602-
.border-collapse {
603-
border-collapse: collapse;
604-
}
605584
.origin-top {
606585
transform-origin: top;
607586
}
@@ -943,9 +922,6 @@ export const styles = String.raw`
943922
.pt-0 {
944923
padding-top: calc(var(--spacing) * 0);
945924
}
946-
.pt-1 {
947-
padding-top: calc(var(--spacing) * 1);
948-
}
949925
.pt-1\.5 {
950926
padding-top: calc(var(--spacing) * 1.5);
951927
}
@@ -1215,9 +1191,6 @@ export const styles = String.raw`
12151191
.ring-border-normal {
12161192
--tw-ring-color: var(--seq-color-border-normal);
12171193
}
1218-
.ring-white {
1219-
--tw-ring-color: var(--color-white);
1220-
}
12211194
.ring-white\/10 {
12221195
--tw-ring-color: color-mix(in oklab, var(--color-white) 10%, transparent);
12231196
}
@@ -1253,10 +1226,6 @@ export const styles = String.raw`
12531226
-webkit-backdrop-filter: var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);
12541227
backdrop-filter: var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);
12551228
}
1256-
.backdrop-filter {
1257-
-webkit-backdrop-filter: var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);
1258-
backdrop-filter: var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);
1259-
}
12601229
.transition {
12611230
transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to, opacity, box-shadow, transform, translate, scale, rotate, filter, -webkit-backdrop-filter, backdrop-filter;
12621231
transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));

0 commit comments

Comments
 (0)