Skip to content

Commit e7e9b5f

Browse files
committed
feat: dApp verified modal
1 parent 1af06ff commit e7e9b5f

File tree

8 files changed

+106
-17
lines changed

8 files changed

+106
-17
lines changed

packages/connect-button/src/components/connect-button.stories.ts

+19
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,12 @@ const argTypes = {
3535
isMobile: {
3636
control: 'boolean',
3737
},
38+
enableMobile: {
39+
control: 'boolean',
40+
},
41+
showLinking: {
42+
control: 'boolean',
43+
},
3844
}
3945

4046
const defaultArgs = {
@@ -82,6 +88,8 @@ const Button = (args: any, { globals }: any) => {
8288
loggedInTimestamp=${args.loggedInTimestamp}
8389
?connected=${args.connected}
8490
?isMobile=${args.isMobile}
91+
?enableMobile=${args.enableMobile}
92+
?showLinking=${args.showLinking}
8593
?isWalletLinked=${args.isWalletLinked}
8694
?isExtensionAvailable=${args.isExtensionAvailable}
8795
?showPopoverMenu=${args.showPopoverMenu}
@@ -222,10 +230,21 @@ export const mobileView = Template.bind({})
222230
mobileView.args = {
223231
...defaultArgs,
224232
width: 120,
233+
modal: true,
225234
isMobile: true,
226235
}
227236
mobileView.argTypes = argTypes
228237

238+
export const linking = Template.bind({})
239+
linking.args = {
240+
...defaultArgs,
241+
width: 120,
242+
showLinking: true,
243+
isMobile: true,
244+
enableMobile: true,
245+
}
246+
linking.argTypes = argTypes
247+
229248
export const sharing = Template.bind({})
230249
sharing.args = {
231250
...defaultArgs,

packages/connect-button/src/components/connect-button.ts

+36-3
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,11 @@ export class ConnectButton extends LitElement {
9595
@property({ type: Boolean, state: true })
9696
compact = false
9797

98+
@property({
99+
type: Boolean,
100+
})
101+
showLinking: boolean = false
102+
98103
get hasSharedData(): boolean {
99104
return !!(this.accounts.length || this.personaData.length)
100105
}
@@ -248,13 +253,30 @@ export class ConnectButton extends LitElement {
248253
></radix-requests-page>`
249254
}
250255

256+
private get isModal() {
257+
return this.isMobile || this.showLinking
258+
}
259+
260+
private get showComingSoonTemplate() {
261+
return this.isMobile && !this.enableMobile
262+
}
263+
264+
private get showLinkingTemplate() {
265+
return this.isMobile && this.showLinking
266+
}
267+
268+
private get showPopoverCloseButton() {
269+
return this.isMobile && !this.showLinking
270+
}
271+
251272
private popoverTemplate() {
252273
if (this.pristine) return ''
253274

254275
return html` <radix-popover
255276
?connected=${this.connected}
256277
?compact=${this.compact}
257-
?isMobile=${this.isMobile}
278+
?modal=${this.isModal}
279+
?showCloseButton=${this.showPopoverCloseButton}
258280
@onClosePopover=${() => {
259281
this.closePopover()
260282
}}
@@ -264,9 +286,11 @@ export class ConnectButton extends LitElement {
264286
popoverPosition: !this.isMobile,
265287
})}
266288
>
267-
${this.isMobile && !this.enableMobile
289+
${this.showComingSoonTemplate
268290
? this.renderComingSoonTemplate()
269-
: this.renderPopoverContentTemplate()}
291+
: this.showLinkingTemplate
292+
? this.renderLinkingTemplate()
293+
: this.renderPopoverContentTemplate()}
270294
</radix-popover>`
271295
}
272296

@@ -296,6 +320,15 @@ export class ConnectButton extends LitElement {
296320
</div>`
297321
}
298322

323+
private renderLinkingTemplate() {
324+
return html` <div class="mobile-wrapper">
325+
<div class="header">dApp Verified</div>
326+
<div class="content">
327+
You can close this tab and return to where you left off.
328+
</div>
329+
</div>`
330+
}
331+
299332
render() {
300333
return html`
301334
${this.connectButtonTemplate()}

packages/connect-button/src/components/popover/popover.ts

+8-2
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,13 @@ export class RadixPopover extends LitElement {
2121
type: Boolean,
2222
reflect: true,
2323
})
24-
isMobile = false
24+
modal = false
25+
26+
@property({
27+
type: Boolean,
28+
reflect: true,
29+
})
30+
showCloseButton = false
2531

2632
closePopover() {
2733
this.dispatchEvent(
@@ -52,7 +58,7 @@ export class RadixPopover extends LitElement {
5258
}
5359
</style>
5460
<div id="radix-popover-content">
55-
${this.isMobile ? this.closeButton() : ''}
61+
${this.showCloseButton ? this.closeButton() : ''}
5662
<slot></slot>
5763
</div>
5864
`

packages/dapp-toolkit/src/_types.ts

+1
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,7 @@ export type WalletDataState = {
183183
}
184184

185185
export type TransportProvider = {
186+
id: string
186187
isLinked$?: Observable<boolean>
187188
isAvailable$?: Observable<boolean>
188189
showQrCode?: () => void

packages/dapp-toolkit/src/connect-button/connect-button-client.ts

+12
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import { ConnectButtonSubjects } from './subjects'
2222
import { type Logger } from '../helpers'
2323
import { ConnectButtonProvider, ExplorerConfig } from '../_types'
2424
import {
25+
RadixConnectRelayClient,
2526
transformWalletDataToConnectButton,
2627
WalletRequestClient,
2728
} from '../wallet-request'
@@ -95,6 +96,17 @@ export const ConnectButtonClient = (input: {
9596

9697
connectButtonElement.enableMobile = enableMobile
9798

99+
if (transport?.id === 'radix-connect-relay') {
100+
const radixConnectRelayClient = transport as RadixConnectRelayClient
101+
radixConnectRelayClient.addSessionChangeListener((session) => {
102+
setTimeout(() => {
103+
connectButtonElement.showPopoverMenu = true
104+
connectButtonElement.showLinking = true
105+
connectButtonElement.pristine = false
106+
}, 1000)
107+
})
108+
}
109+
98110
const onConnect$ = fromEvent(connectButtonElement, 'onConnect').pipe(
99111
tap(() => {
100112
onConnect((value) => subjects.onConnect.next(value))

packages/dapp-toolkit/src/wallet-request/transport/connector-extension/connector-extension-client.ts

+1
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,7 @@ export const ConnectorExtensionClient = (input: {
255255
)
256256

257257
return {
258+
id: 'connector-extension' as const,
258259
isSupported: () => !isMobile(),
259260
send: sendWalletInteraction,
260261
isAvailable$: extensionStatus$.pipe(

packages/dapp-toolkit/src/wallet-request/transport/radix-connect-relay/radix-connect-relay-client.ts

+22-6
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1-
import { ResultAsync, err, errAsync, ok, okAsync } from 'neverthrow'
2-
import { Subscription, filter, switchMap, tap } from 'rxjs'
1+
import { ResultAsync, err, ok } from 'neverthrow'
2+
import { Subscription, filter, switchMap } from 'rxjs'
33
import { EncryptionClient } from '../../encryption'
44
import {
55
ActiveSession,
66
PendingSession,
7+
Session,
78
SessionClient,
89
} from '../../session/session'
910
import type {
@@ -21,6 +22,8 @@ import { Curve25519 } from '../../crypto'
2122
import { RadixConnectRelayApi } from './api'
2223
import { RequestItem } from 'radix-connect-common'
2324

25+
type SessionChangeEvent = (session: Session) => void
26+
2427
export type RadixConnectRelayClient = ReturnType<typeof RadixConnectRelayClient>
2528
export const RadixConnectRelayClient = (input: {
2629
baseUrl: string
@@ -41,6 +44,16 @@ export const RadixConnectRelayClient = (input: {
4144

4245
const encryptionClient = providers?.encryptionClient ?? EncryptionClient()
4346

47+
const sessionChangeListeners: SessionChangeEvent[] = []
48+
49+
const addSessionChangeListener = (listener: SessionChangeEvent) => {
50+
sessionChangeListeners.push(listener)
51+
}
52+
53+
const emitChangesToListeners = (session: Session) => {
54+
sessionChangeListeners.forEach((listener) => listener(session))
55+
}
56+
4457
const deepLinkClient =
4558
providers?.deepLinkClient ??
4659
DeepLinkClient({
@@ -173,17 +186,18 @@ export const RadixConnectRelayClient = (input: {
173186
.convertToActiveSession(sessionId, walletPublicKey)
174187
.mapErr(() => SdkError('FailedToUpdateSession', '')),
175188
)
176-
.andThen((activeSession) =>
177-
requestItemClient
189+
.andThen((activeSession) => {
190+
emitChangesToListeners(activeSession)
191+
return requestItemClient
178192
.getPendingItems()
179193
.mapErr(() => SdkError('FailedToReadPendingItems', ''))
180194
.map((items) => {
181195
const [item] = items.filter((item) => !item.sentToWallet)
182196
return item
183197
})
184198

185-
.map((item) => ({ activeSession, pendingItem: item })),
186-
)
199+
.map((item) => ({ activeSession, pendingItem: item }))
200+
})
187201
.andThen(
188202
({
189203
activeSession,
@@ -327,8 +341,10 @@ export const RadixConnectRelayClient = (input: {
327341
deepLinkClient.handleWalletCallback()
328342

329343
return {
344+
id: 'radix-connect-relay' as const,
330345
isSupported: () => isMobile(),
331346
send: sendToWallet,
347+
addSessionChangeListener,
332348
disconnect: () => {},
333349
destroy: () => {
334350
subscriptions.unsubscribe()

packages/dapp-toolkit/src/wallet-request/wallet-request-sdk.ts

+7-6
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { ResultAsync, errAsync, okAsync } from 'neverthrow'
1+
import { Result, ResultAsync, err, ok } from 'neverthrow'
22
import { TransportProvider } from '../_types'
33
import { Logger, validateWalletResponse } from '../helpers'
44
import {
@@ -65,14 +65,14 @@ export const WalletRequestSdk = (input: WalletRequestSdkInput) => {
6565

6666
const getTransportClient = (
6767
interactionId: string,
68-
): ResultAsync<TransportProvider, SdkError> => {
68+
): Result<TransportProvider, SdkError> => {
6969
const transportClient = availableTransports.find((transportClient) =>
7070
transportClient.isSupported(),
7171
)
7272

7373
return transportClient
74-
? okAsync(transportClient)
75-
: errAsync({
74+
? ok(transportClient)
75+
: err({
7676
error: 'SupportedTransportNotFound',
7777
interactionId,
7878
message: 'No supported transport found',
@@ -91,7 +91,7 @@ export const WalletRequestSdk = (input: WalletRequestSdkInput) => {
9191
interactionId,
9292
metadata,
9393
}).andThen((walletInteraction) =>
94-
getTransportClient(walletInteraction.interactionId).andThen(
94+
getTransportClient(walletInteraction.interactionId).asyncAndThen(
9595
(transportClient) =>
9696
transportClient
9797
.send(walletInteraction, callbackFns)
@@ -111,7 +111,7 @@ export const WalletRequestSdk = (input: WalletRequestSdkInput) => {
111111
items,
112112
metadata,
113113
}).andThen((walletInteraction) =>
114-
getTransportClient(interactionId).andThen((transportClient) =>
114+
getTransportClient(interactionId).asyncAndThen((transportClient) =>
115115
transportClient
116116
.send(walletInteraction, callbackFns)
117117
.andThen(validateWalletResponse),
@@ -122,5 +122,6 @@ export const WalletRequestSdk = (input: WalletRequestSdkInput) => {
122122
request,
123123
sendTransaction,
124124
createWalletInteraction,
125+
getTransport: getTransportClient,
125126
}
126127
}

0 commit comments

Comments
 (0)