Skip to content

Commit 494ddef

Browse files
Merge pull request #48889 from nextcloud/backport/48887/stable29
2 parents 271d5de + 9113cf3 commit 494ddef

File tree

5 files changed

+58
-13
lines changed

5 files changed

+58
-13
lines changed
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
/*!
2+
* SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
3+
* SPDX-License-Identifier: AGPL-3.0-or-later
4+
*/
5+
import { afterEach, describe, it, expect } from '@jest/globals'
6+
import { generateAvatarSvg } from './AccountIcon'
7+
describe('AccountIcon', () => {
8+
9+
afterEach(() => {
10+
delete document.body.dataset.themes
11+
})
12+
13+
it('should generate regular account avatar svg', () => {
14+
const svg = generateAvatarSvg('admin')
15+
expect(svg).toContain('/avatar/admin/32')
16+
expect(svg).not.toContain('dark')
17+
expect(svg).toContain('?guestFallback=true')
18+
})
19+
20+
it('should generate guest account avatar svg', () => {
21+
const svg = generateAvatarSvg('admin', true)
22+
expect(svg).toContain('/avatar/guest/admin/32')
23+
expect(svg).not.toContain('dark')
24+
expect(svg).not.toContain('?guestFallback=true')
25+
})
26+
27+
it('should generate dark mode account avatar svg', () => {
28+
document.body.dataset.themes = 'dark'
29+
const svg = generateAvatarSvg('admin')
30+
expect(svg).toContain('/avatar/admin/32/dark')
31+
expect(svg).toContain('?guestFallback=true')
32+
})
33+
34+
it('should generate dark mode guest account avatar svg', () => {
35+
document.body.dataset.themes = 'dark'
36+
const svg = generateAvatarSvg('admin', true)
37+
expect(svg).toContain('/avatar/guest/admin/32/dark')
38+
expect(svg).not.toContain('?guestFallback=true')
39+
})
40+
})

apps/files_sharing/src/utils/AccountIcon.ts

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,22 @@
44
*/
55
import { generateUrl } from '@nextcloud/router'
66

7-
const isDarkMode = window?.matchMedia?.('(prefers-color-scheme: dark)')?.matches === true
8-
|| document.querySelector('[data-themes*=dark]') !== null
7+
const isDarkMode = () => {
8+
return window?.matchMedia?.('(prefers-color-scheme: dark)')?.matches === true
9+
|| document.querySelector('[data-themes*=dark]') !== null
10+
}
11+
12+
export const generateAvatarSvg = (userId: string, isGuest = false) => {
13+
// normal avatar url: /avatar/{userId}/32?guestFallback=true
14+
// dark avatar url: /avatar/{userId}/32/dark?guestFallback=true
15+
// guest avatar url: /avatar/guest/{userId}/32
16+
// guest dark avatar url: /avatar/guest/{userId}/32/dark
17+
const basePath = isGuest ? `/avatar/guest/${userId}` : `/avatar/${userId}`
18+
const darkModePath = isDarkMode() ? '/dark' : ''
19+
const guestFallback = isGuest ? '' : '?guestFallback=true'
920

10-
export const generateAvatarSvg = (userId: string, isExternalUser = false) => {
11-
const url = isDarkMode ? '/avatar/{userId}/32/dark' : '/avatar/{userId}/32'
12-
const avatarUrl = generateUrl(isExternalUser ? url + '?guestFallback=true' : url, { userId })
21+
const url = `${basePath}/32${darkModePath}${guestFallback}`
22+
const avatarUrl = generateUrl(url, { userId })
1323
return `<svg width="32" height="32" viewBox="0 0 32 32"
1424
xmlns="http://www.w3.org/2000/svg" class="sharing-status__avatar">
1525
<image href="${avatarUrl}" height="32" width="32" />

0 commit comments

Comments
 (0)