Skip to content

Commit 814582f

Browse files
feat(wallet-ui-components): persist last used custom kernel in discovery (#1008)
Signed-off-by: Alex Matson <[email protected]>
1 parent cc778b7 commit 814582f

File tree

2 files changed

+76
-2
lines changed

2 files changed

+76
-2
lines changed

core/wallet-ui-components/src/components/Discovery.ts

Lines changed: 66 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,8 @@ const SUBSTITUTABLE_CSS = cssToString([
8585
*/
8686
export class Discovery extends HTMLElement {
8787
static observedAttributes = ['wallet-extension-loaded']
88+
private readonly DISCOVERY_LAST_USED_KEY =
89+
'splice_wallet_discovery_last_used'
8890

8991
static styles = SUBSTITUTABLE_CSS
9092

@@ -103,6 +105,7 @@ export class Discovery extends HTMLElement {
103105
private root: HTMLElement
104106
private selectedTabId: string = 'tab-1'
105107
private verifiedKernels?: KernelType[]
108+
private lastUsed?: KernelType | undefined
106109

107110
constructor() {
108111
super()
@@ -132,6 +135,18 @@ export class Discovery extends HTMLElement {
132135
)
133136
}
134137

138+
const cachedLastUsed = localStorage.getItem(
139+
this.DISCOVERY_LAST_USED_KEY
140+
)
141+
142+
if (cachedLastUsed) {
143+
try {
144+
this.lastUsed = JSON.parse(cachedLastUsed) as KernelType
145+
} catch {
146+
localStorage.removeItem(this.DISCOVERY_LAST_USED_KEY)
147+
}
148+
}
149+
135150
window.addEventListener('message', (event) => {
136151
if (event.data.type === 'SPLICE_WALLET_CONFIG_LOAD') {
137152
this.verifiedKernels = event.data.payload.map(
@@ -179,7 +194,10 @@ export class Discovery extends HTMLElement {
179194
return div
180195
}
181196

182-
private renderKernelOption(kernel: KernelType) {
197+
private renderKernelOption(
198+
kernel: KernelType,
199+
onClear: undefined | (() => void) = undefined
200+
) {
183201
const div = this.mkElement('div', '', {
184202
class: 'kernel d-flex justify-content-space-between align-items-center flex-wrap mb-3',
185203
})
@@ -211,6 +229,16 @@ export class Discovery extends HTMLElement {
211229

212230
div.appendChild(button)
213231

232+
if (onClear) {
233+
const clearButton = this.mkElement('button', 'X', {
234+
class: 'btn btn-sm btn-secondary',
235+
type: 'button',
236+
})
237+
238+
clearButton.addEventListener('click', onClear)
239+
div.appendChild(clearButton)
240+
}
241+
214242
return div
215243
}
216244

@@ -240,6 +268,35 @@ export class Discovery extends HTMLElement {
240268
return element
241269
}
242270

271+
private renderLastUsed() {
272+
const wrapper = this.mkElement('div', '')
273+
274+
if (!this.lastUsed) return wrapper // empty div
275+
276+
wrapper.className = 'mt-4'
277+
278+
const card = this.mkElement('div', '', { class: 'card mt-4' })
279+
const cardHeader = this.mkElement('div', '', { class: 'card-header' })
280+
281+
const header = this.mkElement('h5', 'Previously connected', {
282+
class: 'm-0',
283+
})
284+
cardHeader.appendChild(header)
285+
286+
const cardBody = this.mkElement('div', '', { class: 'card-body' })
287+
const k = this.renderKernelOption(this.lastUsed, () => {
288+
localStorage.removeItem(this.DISCOVERY_LAST_USED_KEY)
289+
this.lastUsed = undefined
290+
this.render()
291+
})
292+
cardBody.appendChild(k)
293+
294+
card.append(cardHeader, cardBody)
295+
wrapper.append(card)
296+
297+
return wrapper
298+
}
299+
243300
render() {
244301
const root = this.mkElement('div', '', { class: 'root' })
245302
const wrapper = this.mkElement('div', '', { class: 'wrapper' })
@@ -309,6 +366,11 @@ export class Discovery extends HTMLElement {
309366
button.addEventListener('click', () => {
310367
const url = input.value
311368
console.log('Connecting to Wallet Gateway...' + url)
369+
this.lastUsed = { name: url, rpcUrl: url, walletType: 'remote' }
370+
localStorage.setItem(
371+
this.DISCOVERY_LAST_USED_KEY,
372+
JSON.stringify(this.lastUsed)
373+
)
312374
this.selectKernel({ url, walletType: 'remote' })
313375
})
314376
div.append(input, button)
@@ -318,6 +380,9 @@ export class Discovery extends HTMLElement {
318380
card.append(cardHeader, cardBody)
319381

320382
wrapper.append(header, card)
383+
const lastUsed = this.renderLastUsed()
384+
wrapper.appendChild(lastUsed)
385+
321386
root.appendChild(wrapper)
322387

323388
// Replace the whole root (except styles), don't append

core/wallet-ui-components/src/windows/discovery.stories.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,16 @@ export const Default: StoryObj = {
3232

3333
export const Popup: StoryObj = {
3434
render: () =>
35-
html`<button class="btn btn-primary" @click=${discover}>
35+
html`<button
36+
class="btn btn-primary"
37+
@click=${() =>
38+
discover([
39+
{
40+
name: 'Wallet Gateway',
41+
rpcUrl: 'http://gateway:3030/api/v0/dapp',
42+
},
43+
])}
44+
>
3645
connect
3746
</button>`,
3847
}

0 commit comments

Comments
 (0)