• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

inclusion-numerique / la-base / 457a6750-dab7-4c7b-8b2c-6d14dbb07e52

08 Apr 2026 03:38PM UTC coverage: 8.282% (-0.01%) from 8.293%
457a6750-dab7-4c7b-8b2c-6d14dbb07e52

push

circleci

web-flow
Merge pull request #407 from inclusion-numerique/feat/add-admins-base-notifications

feat: add admins base notifications

280 of 6392 branches covered (4.38%)

Branch coverage included in aggregate %.

0 of 14 new or added lines in 4 files covered. (0.0%)

2 existing lines in 1 file now uncovered.

1132 of 10657 relevant lines covered (10.62%)

0.59 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
/apps/web/src/features/notifications/utils/getNotificationText.tsx
1
import type { NotificationWithRelations } from '@app/web/features/notifications/types/notifications'
2
import { formatName } from '@app/web/server/rpc/user/formatName'
3
import Link from 'next/link'
4

5
const NOTIFICATION_TEXTS = {
×
6
  ResourceFeedback: (notification: NotificationWithRelations) => (
7
    <>
×
8
      <Link
9
        className="fr-link fr-text--sm fr-text-decoration--none fr-link--underline-on-hover"
10
        href={`/profils/${notification.initiator?.slug}`}
11
      >
12
        {formatName(notification.initiator?.name || '')}
×
13
      </Link>
14
      &nbsp;a ajouté un avis sur votre ressource&nbsp;
15
      <Link
16
        className="fr-link fr-text--sm fr-text-decoration--none fr-link--underline-on-hover"
17
        href={`/ressources/${notification.resource?.slug}`}
18
      >
19
        {notification.resource?.title}
20
      </Link>
21
    </>
22
  ),
23
  ReportedResource: (notification: NotificationWithRelations) => (
24
    <>
×
25
      Suite à un signalement, votre ressource&nbsp;
26
      <span className="fr-text--bold">{notification.resource?.title}</span>
27
      &nbsp;a été supprimée
28
    </>
29
  ),
30
  ResourceModification: (notification: NotificationWithRelations) => (
31
    <>
×
32
      <Link
33
        className="fr-link fr-text--sm fr-text-decoration--none fr-link--underline-on-hover"
34
        href={`/profils/${notification.initiator?.slug}`}
35
      >
36
        {formatName(notification.initiator?.name || '')}
×
37
      </Link>
38
      &nbsp;a publié une modification sur{' '}
39
      {notification.base ? 'la ressource' : 'votre ressource'}&nbsp;
×
40
      <Link
41
        className="fr-link fr-text--sm fr-text-decoration--none fr-link--underline-on-hover"
42
        href={`/ressources/${notification.resource?.slug}`}
43
      >
44
        {notification.resource?.title}
45
      </Link>
46
    </>
47
  ),
48
  ResourceDeletion: (notification: NotificationWithRelations) => (
49
    <>
×
50
      <Link
51
        className="fr-link fr-text--sm fr-text-decoration--none fr-link--underline-on-hover"
52
        href={`/profils/${notification.initiator?.slug}`}
53
      >
54
        {formatName(notification.initiator?.name || '')}
×
55
      </Link>
56
      &nbsp;a supprimé votre ressource&nbsp;
57
      <span className="fr-text--bold">{notification.resource?.title}</span>
58
    </>
59
  ),
60
  ResourcePublication: (notification: NotificationWithRelations) => (
61
    <>
×
62
      <Link
63
        className="fr-link fr-text--sm fr-text-decoration--none fr-link--underline-on-hover"
64
        href={`/profils/${notification.initiator?.slug}`}
65
      >
66
        {formatName(notification.initiator?.name || '')}
×
67
      </Link>
68
      &nbsp;a publié la ressource&nbsp;
69
      <Link
70
        className="fr-link fr-text--sm fr-text-decoration--none fr-link--underline-on-hover"
71
        href={`/ressources/${notification.resource?.slug}`}
72
      >
73
        {notification.resource?.title}
74
      </Link>
75
      {notification.base && (
×
76
        <>
77
          &nbsp;dans la base&nbsp;
78
          <Link
79
            className="fr-link fr-text--sm fr-text-decoration--none fr-link--underline-on-hover"
80
            href={`/bases/${notification.base?.slug}`}
81
          >
82
            {notification.base?.title}
83
          </Link>
84
        </>
85
      )}
86
    </>
87
  ),
88
  ResourceComment: (notification: NotificationWithRelations) => (
89
    <>
×
90
      <Link
91
        className="fr-link fr-text--sm fr-text-decoration--none fr-link--underline-on-hover"
92
        href={`/profils/${notification.initiator?.slug}`}
93
      >
94
        {formatName(notification.initiator?.name || '')}
×
95
      </Link>
96
      &nbsp;a répondu à votre commentaire sur la ressource&nbsp;
97
      <Link
98
        className="fr-link fr-text--sm fr-text-decoration--none fr-link--underline-on-hover"
99
        href={`/ressources/${notification.resource?.slug}`}
100
      >
101
        {notification.resource?.title}
102
      </Link>
103
    </>
104
  ),
105
  AcceptedBaseInvitation: (notification: NotificationWithRelations) => (
106
    <>
×
107
      <Link
108
        className="fr-link fr-text--sm fr-text-decoration--none fr-link--underline-on-hover"
109
        href={`/profils/${notification.initiator?.slug}`}
110
      >
111
        {formatName(notification.initiator?.name || '')}
×
112
      </Link>
113
      &nbsp;a accepté votre invitation à rejoindre la base&nbsp;
114
      <Link
115
        className="fr-link fr-text--sm fr-text-decoration--none fr-link--underline-on-hover"
116
        href={`/bases/${notification.base?.slug}`}
117
      >
118
        {notification.base?.title}
119
      </Link>
120
    </>
121
  ),
122
  DeclinedBaseInvitation: (notification: NotificationWithRelations) => (
123
    <>
×
124
      <Link
125
        className="fr-link fr-text--sm fr-text-decoration--none fr-link--underline-on-hover"
126
        href={`/profils/${notification.initiator?.slug}`}
127
      >
128
        {formatName(notification.initiator?.name || '')}
×
129
      </Link>
130
      &nbsp;a refusé votre invitation à rejoindre la base&nbsp;
131
      <Link
132
        className="fr-link fr-text--sm fr-text-decoration--none fr-link--underline-on-hover"
133
        href={`/bases/${notification.base?.slug}`}
134
      >
135
        {notification.base?.title}
136
      </Link>
137
    </>
138
  ),
139
  BaseRoleChange: (notification: NotificationWithRelations) => {
140
    const newRole = notification.isBaseNewRoleAdmin
×
141
      ? 'administrateur'
142
      : 'contributeur'
143
    return (
×
144
      <>
145
        <Link
146
          className="fr-link fr-text--sm fr-text-decoration--none fr-link--underline-on-hover"
147
          href={`/profils/${notification.initiator?.slug}`}
148
        >
149
          {formatName(notification.initiator?.name || '')}
×
150
        </Link>
151
        &nbsp;a changé votre rôle en {newRole} dans la base&nbsp;
152
        <Link
153
          className="fr-link fr-text--sm fr-text-decoration--none fr-link--underline-on-hover"
154
          href={`/bases/${notification.base?.slug}`}
155
        >
156
          {notification.base?.title}
157
        </Link>
158
      </>
159
    )
160
  },
161
  BaseMemberDeletion: (notification: NotificationWithRelations) => (
162
    <>
×
163
      <Link
164
        className="fr-link fr-text--sm fr-text-decoration--none fr-link--underline-on-hover"
165
        href={`/profils/${notification.initiator?.slug}`}
166
      >
167
        {formatName(notification.initiator?.name || '')}
×
168
      </Link>
169
      &nbsp;vous a retiré de la base&nbsp;
170
      <Link
171
        className="fr-link fr-text--sm fr-text-decoration--none fr-link--underline-on-hover"
172
        href={`/bases/${notification.base?.slug}`}
173
      >
174
        {notification.base?.title}
175
      </Link>
176
    </>
177
  ),
178
  BaseDeletion: (notification: NotificationWithRelations) => (
179
    <>
×
180
      <Link
181
        className="fr-link fr-text--sm fr-text-decoration--none fr-link--underline-on-hover"
182
        href={`/profils/${notification.initiator?.slug}`}
183
      >
184
        {formatName(notification.initiator?.name || '')}
×
185
      </Link>
186
      &nbsp;a supprimé la base&nbsp;
187
      <span className="fr-text--bold">{notification.base?.title}</span>
188
    </>
189
  ),
190
  AskJoinBase: (notification: NotificationWithRelations) => (
191
    <>
×
192
      <Link
193
        className="fr-link fr-text--sm fr-text-decoration--none fr-link--underline-on-hover"
194
        href={`/profils/${notification.initiator?.slug}`}
195
      >
196
        {formatName(notification.initiator?.name || '')}
×
197
      </Link>
198
      &nbsp;a demandé à rejoindre votre base&nbsp;
199
      <Link
200
        className="fr-link fr-text--sm fr-text-decoration--none fr-link--underline-on-hover"
201
        href={`/bases/${notification.base?.slug}`}
202
      >
203
        {notification.base?.title}
204
      </Link>
205
    </>
206
  ),
207
  AcceptedAskJoinBase: (notification: NotificationWithRelations) => (
208
    <>
×
209
      <Link
210
        className="fr-link fr-text--sm fr-text-decoration--none fr-link--underline-on-hover"
211
        href={`/profils/${notification.initiator?.slug}`}
212
      >
213
        {formatName(notification.initiator?.name || '')}
×
214
      </Link>
215
      &nbsp;a accepté votre demande de rejoindre la base&nbsp;
216
      <Link
217
        className="fr-link fr-text--sm fr-text-decoration--none fr-link--underline-on-hover"
218
        href={`/bases/${notification.base?.slug}`}
219
      >
220
        {notification.base?.title}
221
      </Link>
222
    </>
223
  ),
224
  DeclinedAskJoinBase: (notification: NotificationWithRelations) => (
225
    <>
×
226
      <Link
227
        className="fr-link fr-text--sm fr-text-decoration--none fr-link--underline-on-hover"
228
        href={`/profils/${notification.initiator?.slug}`}
229
      >
230
        {formatName(notification.initiator?.name || '')}
×
231
      </Link>
232
      &nbsp;a refusé votre demande de rejoindre la base&nbsp;
233
      <Link
234
        className="fr-link fr-text--sm fr-text-decoration--none fr-link--underline-on-hover"
235
        href={`/bases/${notification.base?.slug}`}
236
      >
237
        {notification.base?.title}
238
      </Link>
239
    </>
240
  ),
241
  MemberAcceptedAskJoinBase: (notification: NotificationWithRelations) => (
NEW
242
    <>
×
243
      La demande de&nbsp;
244
      <Link
245
        className="fr-link fr-text--sm fr-text-decoration--none fr-link--underline-on-hover"
246
        href={`/profils/${notification.initiator?.slug}`}
247
      >
248
        {formatName(notification.initiator?.name || '')}
×
249
      </Link>
250
      &nbsp;à rejoindre votre base&nbsp;
251
      <Link
252
        className="fr-link fr-text--sm fr-text-decoration--none fr-link--underline-on-hover"
253
        href={`/bases/${notification.base?.slug}`}
254
      >
255
        {notification.base?.title}
256
      </Link>
257
      &nbsp;a été acceptée
258
    </>
259
  ),
260
  MemberDeclinedAskJoinBase: (notification: NotificationWithRelations) => (
NEW
261
    <>
×
262
      La demande de&nbsp;
263
      <Link
264
        className="fr-link fr-text--sm fr-text-decoration--none fr-link--underline-on-hover"
265
        href={`/profils/${notification.initiator?.slug}`}
266
      >
267
        {formatName(notification.initiator?.name || '')}
×
268
      </Link>
269
      &nbsp;à rejoindre votre base&nbsp;
270
      <Link
271
        className="fr-link fr-text--sm fr-text-decoration--none fr-link--underline-on-hover"
272
        href={`/bases/${notification.base?.slug}`}
273
      >
274
        {notification.base?.title}
275
      </Link>
276
      &nbsp;a été refusée
277
    </>
278
  ),
279
  ResourceReporting: (notification: NotificationWithRelations) => (
280
    <>
×
281
      <Link
282
        className="fr-link fr-text--sm fr-text-decoration--none fr-link--underline-on-hover"
283
        href={`/profils/${notification.initiator?.slug}`}
284
      >
285
        {formatName(notification.initiator?.name || '')}
×
286
      </Link>
287
      &nbsp;a signalé la ressource&nbsp;
288
      <Link
289
        className="fr-link fr-text--sm fr-text-decoration--none fr-link--underline-on-hover"
290
        href={`/ressources/${notification.resource?.slug}`}
291
      >
292
        {notification.resource?.title}
293
      </Link>
294
    </>
295
  ),
296
  ReportResolved: (notification: NotificationWithRelations) => (
297
    <>
×
298
      <Link
299
        className="fr-link fr-text--sm fr-text-decoration--none fr-link--underline-on-hover"
300
        href={`/profils/${notification.initiator?.slug}`}
301
      >
302
        {formatName(notification.initiator?.name || '')}
×
303
      </Link>
304
      &nbsp;a traité le signalement de la ressource&nbsp;
305
      <span className="fr-text--bold">{notification.resource?.title}</span>
306
    </>
307
  ),
308
} as const
309

310
export const getNotificationText = (
×
311
  notification: NotificationWithRelations,
312
) => {
313
  const textGenerator = NOTIFICATION_TEXTS[notification.type]
×
314

315
  if (!textGenerator) {
×
316
    return null
×
317
  }
318

319
  return textGenerator(notification)
×
320
}
321

322
export type { NotificationWithRelations }
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc