Skip to content

Commit c4e3017

Browse files
committed
fix(ui): fix jankiness from re-rendering everything in contacts
1 parent b1b8169 commit c4e3017

File tree

2 files changed

+80
-65
lines changed

2 files changed

+80
-65
lines changed

src/components/contacts-list.js

Lines changed: 74 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -57,30 +57,29 @@ const initialState = {
5757
</button>
5858
</header>
5959
`,
60+
list: async state => {
61+
if (state.contacts?.length === 0) {
62+
return html`<span class="flex flex-fill center">No Contacts found</span>`
63+
}
64+
65+
return (
66+
await Promise.all(
67+
state.contacts
68+
.filter(
69+
state.showUnpaired
70+
? filterUnpairedContacts
71+
: filterPairedContacts
72+
)
73+
.sort(sortContactsByAlias)
74+
.map(async c => await state.item(c)),
75+
)
76+
).join('')
77+
},
6078
content: async state => html`
6179
${state.header(state)}
6280
6381
<div>
64-
${
65-
state.contacts?.length > 0
66-
? (
67-
await Promise.all(
68-
state.contacts
69-
.filter(
70-
state.showUnpaired
71-
? filterUnpairedContacts
72-
: filterPairedContacts
73-
)
74-
.sort(sortContactsByAlias)
75-
.map(async c => await state.item(c)),
76-
)
77-
).join('')
78-
: ''
79-
}
80-
${
81-
state.contacts.length === 0 ?
82-
html`<span class="flex flex-fill center">No Contacts found</span>` : ''
83-
}
82+
${await state.list(state)}
8483
</div>
8584
8685
${await state.footer(state)}
@@ -158,47 +157,36 @@ const initialState = {
158157
</a>
159158
`
160159
},
160+
datalist: async (state, direction = 'outgoing') => {
161+
if (state.contacts?.length === 0) {
162+
return ''
163+
}
164+
165+
return (
166+
await Promise.all(
167+
state.contacts
168+
.filter(
169+
c => c.alias &&
170+
Object.keys(c[direction] || {}).length > 0
171+
).map(contact => {
172+
return html`<option value="@${
173+
contact.alias
174+
}">${
175+
contact.info?.name || contact.alias
176+
}</option>`
177+
})
178+
)
179+
).join('')
180+
},
161181
footer: async state => html`
162182
<datalist id="contactSendAliases">
163183
${
164-
state.contacts.length > 0
165-
? (
166-
await Promise.all(
167-
state.contacts
168-
.filter(
169-
c => c.alias &&
170-
Object.keys(c.outgoing || {}).length > 0
171-
).map(contact => {
172-
return html`<option value="@${
173-
contact.alias
174-
}">${
175-
contact.info?.name || contact.alias
176-
}</option>`
177-
})
178-
)
179-
).join('')
180-
: ''
184+
await state.datalist(state, 'outgoing')
181185
}
182186
</datalist>
183187
<datalist id="contactReceiveAliases">
184188
${
185-
state.contacts.length > 0
186-
? (
187-
await Promise.all(
188-
state.contacts
189-
.filter(
190-
c => c.alias &&
191-
Object.keys(c.incoming || {}).length > 0
192-
).map(contact => {
193-
return html`<option value="@${
194-
contact.alias
195-
}">${
196-
contact.info?.name || contact.alias
197-
}</option>`
198-
})
199-
)
200-
).join('')
201-
: ''
189+
await state.datalist(state, 'incoming')
202190
}
203191
</datalist>
204192
`,
@@ -247,6 +235,22 @@ export async function setupContactsList(
247235

248236
state.elements.section = section
249237

238+
const list = section.querySelector('& > div')
239+
const sendDataList = section.querySelector('#contactSendAliases')
240+
const receiveDataList = section.querySelector('#contactReceiveAliases')
241+
const hdrPaired = section.querySelector('#paired_contacts')
242+
const hdrUnpaired = section.querySelector('#unpaired_contacts')
243+
const hdrPairedIndicator = hdrPaired.querySelector('.indicator')
244+
const hdrUnpairedIndicator = hdrUnpaired.querySelector('.indicator')
245+
246+
state.elements.list = list
247+
state.elements.sendDataList = sendDataList
248+
state.elements.receiveDataList = receiveDataList
249+
state.elements.hdrPaired = hdrPaired
250+
state.elements.hdrUnpaired = hdrUnpaired
251+
state.elements.hdrPairedIndicator = hdrPairedIndicator
252+
state.elements.hdrUnpairedIndicator = hdrUnpairedIndicator
253+
250254
function addListener(
251255
node,
252256
event,
@@ -288,7 +292,22 @@ export async function setupContactsList(
288292
await restate(state, renderState)
289293

290294
state.elements.section.id = state.slugs.section
291-
state.elements.section.innerHTML = await state.content(state)
295+
// state.elements.section.innerHTML = await state.content(state)
296+
297+
state.elements.list.innerHTML = await state.list(state)
298+
state.elements.sendDataList.innerHTML = await state.datalist(state, 'outgoing')
299+
state.elements.receiveDataList.innerHTML = await state.datalist(state, 'incoming')
300+
301+
if (state.showUnpaired) {
302+
state.elements.hdrPaired.classList.remove('active')
303+
state.elements.hdrUnpaired.classList.add('active')
304+
} else {
305+
state.elements.hdrPaired.classList.add('active')
306+
state.elements.hdrUnpaired.classList.remove('active')
307+
}
308+
309+
state.elements.hdrPairedIndicator.innerText = state.contacts.filter(filterPairedContacts).length
310+
state.elements.hdrUnpairedIndicator.innerText = state.contacts.filter(filterUnpairedContacts).length
292311

293312
state.removeAllListeners()
294313
state.addListeners()

src/main.js

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -222,11 +222,6 @@ let contactsList = await setupContactsList(
222222
event.preventDefault()
223223
event.stopPropagation()
224224

225-
// console.log(
226-
// 'paired_contacts',
227-
// event
228-
// )
229-
230225
await contactsList.render({
231226
userInfo,
232227
contacts: appState.contacts,
@@ -240,11 +235,6 @@ let contactsList = await setupContactsList(
240235
event.preventDefault()
241236
event.stopPropagation()
242237

243-
// console.log(
244-
// 'unpaired_contacts',
245-
// event
246-
// )
247-
248238
await contactsList.render({
249239
userInfo,
250240
contacts: appState.contacts,
@@ -442,6 +432,8 @@ function getTarget(event, selector) {
442432
id,
443433
// @ts-ignore
444434
parentElement,
435+
// @ts-ignore
436+
parentNode,
445437
} = event?.target
446438

447439
let target
@@ -454,6 +446,10 @@ function getTarget(event, selector) {
454446
target = parentElement
455447
}
456448

449+
if (parentNode?.id === selector) {
450+
target = parentNode
451+
}
452+
457453
return target
458454
}
459455

0 commit comments

Comments
 (0)