Skip to content

Commit c57b638

Browse files
committed
notification, display default icon if given icon is unknown (#487)
1 parent 6301369 commit c57b638

File tree

4 files changed

+97
-17
lines changed

4 files changed

+97
-17
lines changed
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<script lang="ts">
2+
import dsfrIconList from '@gouvfr/dsfr/.config/icon.json'
3+
import { onMount } from 'svelte'
4+
5+
interface Props {
6+
defaultIcon: string
7+
icon?: string
8+
}
9+
let { defaultIcon, icon = '' }: Props = $props()
10+
let checkedIcon: string = $state('')
11+
12+
onMount(async () => {
13+
checkedIcon = dsfrIconList.filter((i) => i.name === icon.replace('fr-icon-', ''))
14+
.length
15+
? icon
16+
: defaultIcon
17+
})
18+
</script>
19+
20+
<span class="notification__icon {checkedIcon}" aria-hidden="true"></span>
21+
22+
<style>
23+
.notification__icon {
24+
line-height: 2rem;
25+
color: var(--blue-france-sun-113-625);
26+
&::before {
27+
--icon-size: 1.25rem;
28+
}
29+
}
30+
</style>
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
import { describe, expect, test } from 'vitest'
2+
import '@testing-library/jest-dom/vitest'
3+
import { render } from '@testing-library/svelte'
4+
import NotificationIcon from '$lib/NotificationIcon.svelte'
5+
6+
describe('/NotificationIcon.svelte', () => {
7+
test('icon is absent, should display default icon', async () => {
8+
// When
9+
const { container } = render(NotificationIcon, {
10+
defaultIcon: 'default-icon',
11+
})
12+
13+
// Then
14+
const icon = container.querySelector('.notification__icon')
15+
expect(icon).toHaveClass('default-icon')
16+
})
17+
test('icon is undefined, should display default icon', async () => {
18+
// When
19+
const { container } = render(NotificationIcon, {
20+
icon: undefined,
21+
defaultIcon: 'default-icon',
22+
})
23+
24+
// Then
25+
const icon = container.querySelector('.notification__icon')
26+
expect(icon).toHaveClass('default-icon')
27+
})
28+
test('icon is empty, should display default icon', async () => {
29+
// When
30+
const { container } = render(NotificationIcon, {
31+
icon: '',
32+
defaultIcon: 'default-icon',
33+
})
34+
35+
// Then
36+
const icon = container.querySelector('.notification__icon')
37+
expect(icon).toHaveClass('default-icon')
38+
})
39+
test('icon is unknown, should display default icon', async () => {
40+
// When
41+
const { container } = render(NotificationIcon, {
42+
icon: 'unknown',
43+
defaultIcon: 'default-icon',
44+
})
45+
46+
// Then
47+
const icon = container.querySelector('.notification__icon')
48+
expect(icon).toHaveClass('default-icon')
49+
})
50+
test('icon is known, should display icon', async () => {
51+
// When
52+
const { container } = render(NotificationIcon, {
53+
icon: 'fr-icon-mail-star-line',
54+
defaultIcon: 'default-icon',
55+
})
56+
57+
// Then
58+
const icon = container.querySelector('.notification__icon')
59+
expect(icon).toHaveClass('fr-icon-mail-star-line')
60+
expect(icon).not.toHaveClass('default-icon')
61+
})
62+
})

public/mobile-app/src/routes/notifications/+page.svelte

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
<script lang="ts">
22
import { onMount } from 'svelte'
33
import { goto } from '$app/navigation'
4+
import NotificationIcon from '$lib/NotificationIcon.svelte'
45
import type { AppNotification } from '$lib/notifications'
56
import {
67
notificationEventsSocket,
@@ -87,10 +88,10 @@
8788
aria-hidden="true"
8889
><i>•</i></span
8990
>
90-
<span
91-
class="notification__icon {notification.content_icon ? notification.content_icon: 'fr-icon-information-line'}"
92-
aria-hidden="true"
93-
></span>
91+
<NotificationIcon
92+
icon={notification.content_icon}
93+
defaultIcon="fr-icon-information-line"
94+
/>
9495
</div>
9596
<div class="fr-tile__body">
9697
<div class="fr-tile__content">
@@ -160,13 +161,6 @@
160161
display: none;
161162
}
162163
}
163-
.notification__icon {
164-
line-height: 2rem;
165-
color: var(--blue-france-sun-113-625);
166-
&::before {
167-
--icon-size: 1.25rem;
168-
}
169-
}
170164
}
171165
.fr-tile__content {
172166
padding-bottom: 0;

public/mobile-app/src/routes/notifications/page.svelte.test.ts

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -105,16 +105,10 @@ describe('/+page.svelte', () => {
105105
'notification-f62c66b2-7bd5-4696-8383-2d40c08a1'
106106
)
107107
expect(notification1).not.toHaveClass('read')
108-
const icon1 = notification1.querySelector('.notification__icon')
109-
expect(icon1).not.toHaveClass('some-icon')
110-
expect(icon1).toHaveClass('fr-icon-information-line')
111108
const notification2 = screen.getByTestId(
112109
'notification-2689c3b3-e95c-4d73-b37d-55f430688af9'
113110
)
114111
expect(notification2).toHaveClass('read')
115-
const icon2 = notification2.querySelector('.notification__icon')
116-
expect(icon2).toHaveClass('some-icon')
117-
expect(icon2).not.toHaveClass('fr-icon-information-line')
118112
})
119113
})
120114

0 commit comments

Comments
 (0)