Skip to content

Commit 6eeb870

Browse files
committed
frontend: use unique keys for sidebar items
With watch-only items in the sidebar are now groupped by keystore, but there is a rare issue that React gets confused and renders one account at the top of the sidebar. This change explicitly sets keys for all items in the sidebar, and wrapps keystores and the associated account in a separate container. This should theoretically fix the rare rendering bug.
1 parent 0b7edac commit 6eeb870

File tree

1 file changed

+11
-9
lines changed

1 file changed

+11
-9
lines changed

frontends/web/src/components/sidebar/sidebar.tsx

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ const GetAccountLink = ({
5353
const { pathname } = useLocation();
5454
const active = (pathname === `/account/${code}`) || (pathname.startsWith(`/account/${code}/`));
5555
return (
56-
<div key={code} className={style.sidebarItem}>
56+
<div className={style.sidebarItem}>
5757
<Link
5858
className={active ? style.sidebarActive : ''}
5959
to={`/account/${code}`}
@@ -154,9 +154,9 @@ const Sidebar = ({
154154

155155
return (
156156
<div className={[style.sidebarContainer, hidden ? style.forceHide : ''].join(' ')}>
157-
<div className={[style.sidebarOverlay, activeSidebar ? style.active : ''].join(' ')} onClick={toggleSidebar}></div>
157+
<div key="overlay" className={[style.sidebarOverlay, activeSidebar ? style.active : ''].join(' ')} onClick={toggleSidebar}></div>
158158
<nav className={[style.sidebar, activeSidebar ? style.forceShow : ''].join(' ')}>
159-
<div className={style.sidebarLogoContainer}>
159+
<div key="app-logo" className={style.sidebarLogoContainer}>
160160
<Link
161161
to={accounts.length ? '/account-summary' : '/'}
162162
onClick={handleSidebarItemClick}>
@@ -168,7 +168,7 @@ const Sidebar = ({
168168
</div>
169169

170170
{ accounts.length ? (
171-
<div className={`${style.sidebarItem} ${style.sidebarPortfolio}`}>
171+
<div key="account-summary" className={`${style.sidebarItem} ${style.sidebarPortfolio}`}>
172172
<NavLink
173173
className={({ isActive }) => isActive ? style.sidebarActive : ''}
174174
to={'/account-summary'}
@@ -183,7 +183,7 @@ const Sidebar = ({
183183
) : null }
184184

185185
{ accountsByKeystore.map(keystore => (
186-
<React.Fragment key={keystore.keystore.rootFingerprint}>
186+
<div key={`keystore-${keystore.keystore.rootFingerprint}`}>
187187
<div className={style.sidebarHeaderContainer}>
188188
<span
189189
className={style.sidebarHeader}
@@ -204,11 +204,13 @@ const Sidebar = ({
204204
title={t('device.keystoreConnected')} />
205205
</span>
206206
</div>
207-
{ keystore.accounts.map(acc => <GetAccountLink key={acc.code} {...acc} handleSidebarItemClick={handleSidebarItemClick }/>) }
208-
</React.Fragment>
207+
{ keystore.accounts.map(acc => (
208+
<GetAccountLink key={`account-${acc.code}`} {...acc} handleSidebarItemClick={handleSidebarItemClick} />
209+
))}
210+
</div>
209211
)) }
210212

211-
<div className={[style.sidebarHeaderContainer, style.end].join(' ')}></div>
213+
<div key="services" className={[style.sidebarHeaderContainer, style.end].join(' ')}></div>
212214
{ accounts.length ? (
213215
<>
214216
<div key="buy" className={style.sidebarItem}>
@@ -237,7 +239,7 @@ const Sidebar = ({
237239
</>
238240
) : null }
239241

240-
<div key="settings-new" className={style.sidebarItem}>
242+
<div key="settings" className={style.sidebarItem}>
241243
<NavLink
242244
className={({ isActive }) => isActive ? style.sidebarActive : ''}
243245
to={'/settings'}

0 commit comments

Comments
 (0)