Skip to content

Commit f58cc98

Browse files
authored
Merge pull request #5462 from SDU-eScience/issue-5085
Fixes #5085
2 parents a2ca84b + 1307394 commit f58cc98

4 files changed

Lines changed: 25 additions & 9 deletions

File tree

frontend-web/webclient/app/Applications/ApiTokens/ApiTokensBrowse.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,10 @@ export function ApiTokenBrowse(props: {opts?: ResourceBrowserOpts<Api.ApiToken>}
100100
row.stat3.style.marginTop = row.stat3.style.marginBottom = "auto"
101101
});
102102

103+
browser.on("endRenderPage", () => {
104+
SimpleAvatarComponentCache.fetchMissingAvatars();
105+
});
106+
103107
browser.on("generateBreadcrumbs", () => [{title: browser.resourceName, absolutePath: ""}]);
104108

105109
browser.on("renderEmptyPage", reason => {

frontend-web/webclient/app/AvataaarLib/hook.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,14 @@ export class AvatarState extends UState<AvatarState> {
4040
this.updateCache([username]);
4141
return this.cache[username] ?? defaultAvatar;
4242
}
43-
43+
4444
avatarFromCache(username: string): AvatarType {
4545
return this.cache[username] ?? defaultAvatar;
4646
}
47+
48+
setAvatar(username: string, avatar: AvatarType) {
49+
this.cache[username] = avatar;
50+
}
4751
}
4852

4953
export const avatarState = new AvatarState(2); // Two, otherwise we can't fetch by invites and projectmembers in the Members.tsx file. Maybe higher needed at some point?

frontend-web/webclient/app/Files/Shares.tsx

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -70,14 +70,14 @@ function inviteLinkFromToken(token: string): string {
7070

7171

7272
export const SimpleAvatarComponentCache = new class {
73-
defaultAvatar: ReactStaticRenderer;
73+
private defaultAvatarURL: string;
7474
private svgCache: SvgCache;
7575

7676
constructor() {
7777
this.svgCache = new SvgCache();
78-
new ReactStaticRenderer(() =>
79-
<Avatar style={{height: "40px", width: "40px"}} avatarStyle="Circle" {...defaultAvatar} />
80-
).promise.then(it => this.defaultAvatar = it)
78+
this.svgCache.renderSvg("__defaultAvatar__", () => {
79+
return <Avatar style={{height: "80px", width: "80px"}} avatarStyle="Circle" {...defaultAvatar} />;
80+
}, 80, 80);
8181
}
8282

8383
private componentCache: Record<string, ReactStaticRenderer> = {};
@@ -106,9 +106,15 @@ export const SimpleAvatarComponentCache = new class {
106106
this.componentCache[username] = avatar;
107107
}
108108

109+
deleteCachedAvatar(username: string) {
110+
delete this.componentCache[username];
111+
// HACK(Jonas): A way of clearing an outdated entry in the cache.
112+
delete this.svgCache["cache"]["cache"][username];
113+
}
114+
109115
async appendTo(el: HTMLElement, username: string, tooltipText: string, wrapperStyle?: Partial<CSSStyleDeclaration>): Promise<HTMLDivElement> {
110116
this.addToBeFetch(username);
111-
const avatar = avatarState.avatarFromCache(username);
117+
const avatar = avatarState.avatar(username);
112118
const isDefaultAvatar = avatar === defaultAvatar;
113119
const avatarWrapper = createHTMLElements<HTMLDivElement>({tagType: "div", style: wrapperStyle});
114120
el.append(avatarWrapper);
@@ -120,11 +126,11 @@ export const SimpleAvatarComponentCache = new class {
120126
} else {
121127
// NOTE(Dan): Rasterize at double resolution. This has a clear impact on image quality and little
122128
// impact on performance.
123-
const avatarCompUrl = await this.svgCache.renderSvg(username, () => {
129+
const avatarCompUrl = isDefaultAvatar ? this.defaultAvatarURL : await this.svgCache.renderSvg(username, () => {
124130
return <Avatar style={{height: "80px", width: "80px"}} avatarStyle="Circle" {...avatar} />;
125131
}, 80, 80);
126132

127-
const avatarComponent = isDefaultAvatar ? this.defaultAvatar : await new ReactStaticRenderer(() => {
133+
const avatarComponent = await new ReactStaticRenderer(() => {
128134
return <div style={{
129135
width: "40px",
130136
height: "40px",

frontend-web/webclient/app/UserSettings/Avataaar.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import {AvatarType, defaultAvatar} from "@/AvataaarLib";
1515
import Avatar from "@/AvataaarLib/avatar";
1616
import {SidebarTabId} from "@/ui-components/SidebarComponents";
1717
import {sendFailureNotification} from "@/Notifications";
18+
import {SimpleAvatarComponentCache} from "@/Files/Shares";
1819

1920
function Modification(): React.ReactNode {
2021
const [avatar, setAvatar] = React.useState(defaultAvatar);
@@ -46,8 +47,9 @@ function Modification(): React.ReactNode {
4647
ml="auto"
4748
mr="auto"
4849
onClick={async () => {
50+
SimpleAvatarComponentCache.deleteCachedAvatar(Client.username!);
51+
avatarState.setAvatar(Client.username!, avatar);
4952
dispatch(await saveAvatar(avatar));
50-
avatarState.invalidateAndUpdate([Client.username!]);
5153
}}
5254
mt="5px"
5355
mb="5px"

0 commit comments

Comments
 (0)