Skip to content

Commit 2216787

Browse files
authored
feat: faster extraUserFields (#1144)
1 parent 434b4b0 commit 2216787

File tree

3 files changed

+62
-7
lines changed

3 files changed

+62
-7
lines changed

server/src/routes/rootRouter.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,9 @@ rootRouter.get('/api/settings', async (req, res, next) => {
180180
req.session.save()
181181
}
182182
}
183+
if (user.data !== undefined) {
184+
req.user.data = user.data
185+
}
183186
}
184187
} catch (e) {
185188
log.warn(TAGS.session, 'Issue finding user, User ID:', req?.user?.id, e)

src/features/profile/ExtraFields.jsx

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,22 +8,29 @@ import { useTranslation } from 'react-i18next'
88
import { useMemory } from '@store/useMemory'
99
import { Query } from '@services/queries'
1010

11-
export function ExtraUserFields() {
11+
/** @param {{ refreshing?: boolean }} props */
12+
export function ExtraUserFields({ refreshing = false } = {}) {
1213
const fields = useMemory((s) => s.extraUserFields)
1314
return fields?.length ? (
1415
<Grid2 container alignItems="center" justifyContent="center">
1516
{fields.map((field) => (
1617
<FieldValue
1718
key={typeof field === 'string' ? field : field.database}
1819
field={field}
20+
refreshing={refreshing}
1921
/>
2022
))}
2123
</Grid2>
2224
) : null
2325
}
2426

25-
/** @param {{ field: import('@rm/types').ExtraField | string}} props */
26-
export function FieldValue({ field }) {
27+
/**
28+
* @param {{
29+
* field: import('@rm/types').ExtraField | string,
30+
* refreshing?: boolean,
31+
* }} props
32+
*/
33+
export function FieldValue({ field, refreshing = false }) {
2734
const { i18n } = useTranslation()
2835
const label =
2936
typeof field === 'string' ? field : field[i18n.language] || field.name
@@ -37,24 +44,25 @@ export function FieldValue({ field }) {
3744
return (
3845
<Grid2 key={label} xs={5} textAlign="center" margin="10px 0">
3946
<TextField
40-
disabled={disabled}
47+
disabled={disabled || refreshing}
4148
variant="outlined"
4249
label={label}
4350
value={value}
4451
onChange={({ target }) => {
52+
const nextValue = target.value
4553
useMemory.setState((prev) => ({
4654
auth: {
4755
...prev.auth,
4856
data: {
4957
...prev.auth.data,
50-
[key]: target.value,
58+
[key]: nextValue,
5159
},
5260
},
5361
}))
5462
setField({
5563
variables: {
5664
key,
57-
value,
65+
value: nextValue,
5866
},
5967
})
6068
}}

src/features/profile/index.jsx

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import { Header } from '@components/dialogs/Header'
1515
import { Footer } from '@components/dialogs/Footer'
1616
import { DialogWrapper } from '@components/dialogs/DialogWrapper'
1717
import { useAnalytics } from '@hooks/useAnalytics'
18+
import { getSettings } from '@services/fetches'
1819

1920
import { UserBackups } from './Backups'
2021
import { UserPermissions } from './Permissions'
@@ -32,6 +33,49 @@ export function UserProfile() {
3233

3334
const [tab, setTab] = React.useState('profile')
3435
const [tabsHeight, setTabsHeight] = React.useState(0)
36+
const [refreshing, setRefreshing] = React.useState(false)
37+
const isOpen = useLayoutStore((s) => s.userProfile)
38+
React.useEffect(() => {
39+
if (!isOpen) return
40+
let active = true
41+
setRefreshing(true)
42+
;(async () => {
43+
try {
44+
const data = await getSettings()
45+
if (data && !('error' in data) && data.user) {
46+
const parsed = data.user?.data
47+
? typeof data.user.data === 'string'
48+
? JSON.parse(data.user.data)
49+
: data.user.data
50+
: {}
51+
if (active) {
52+
useMemory.setState((prev) => ({
53+
auth: {
54+
...prev.auth,
55+
data:
56+
parsed && typeof parsed === 'object'
57+
? parsed
58+
: /** @type {Record<string, any>} */ ({}),
59+
},
60+
}))
61+
}
62+
}
63+
} catch (error) {
64+
if (active) {
65+
// eslint-disable-next-line no-console
66+
console.error('Failed to refresh user profile data', error)
67+
}
68+
} finally {
69+
if (active) {
70+
setRefreshing(false)
71+
}
72+
}
73+
})()
74+
return () => {
75+
active = false
76+
setRefreshing(false)
77+
}
78+
}, [isOpen])
3579

3680
const handleTabChange = (_event, newValue) => {
3781
setTab(newValue)
@@ -67,7 +111,7 @@ export function UserProfile() {
67111
>
68112
<TabPanel value="profile">
69113
<LinkAccounts />
70-
<ExtraUserFields />
114+
<ExtraUserFields refreshing={refreshing} />
71115
<UserBackups />
72116
</TabPanel>
73117
<TabPanel value="badges" sx={{ height: '100%', px: 0 }}>

0 commit comments

Comments
 (0)