feat(conversation): #COCO-4642 add clean messages modal#971
feat(conversation): #COCO-4642 add clean messages modal#971Romu-C wants to merge 7 commits intodevelop-b2schoolfrom
Conversation
There was a problem hiding this comment.
Pull request overview
This PR replaces the existing onboarding modal in the Conversation app with a new "clean messages" modal that informs users about upcoming automatic deletion of old messages (messages older than 2 years not filed in any folder). The modal is designed to display annually after June 1st.
Changes:
- Replaced
MessageOnboardingModalcomponent (4-screen feature walkthrough) with a newMessageOnboardingCleanModalcomponent (single-screen cleanup announcement with date-based display logic) - Deleted four SVG assets used by the old onboarding modal and added a reference to a new
illu-onboarding-clean.svgasset - Added new i18n keys (
onboarding.modal.clean.titleandonboarding.modal.clean.text) in the French locale file
Reviewed changes
Copilot reviewed 4 out of 9 changed files in this pull request and generated 5 comments.
Show a summary per file
| File | Description |
|---|---|
conversation/frontend/src/routes/root/index.tsx |
Updated import and usage from MessageOnboardingModal to MessageOnboardingCleanModal |
conversation/frontend/src/routes/root/components/MessageOnboardingCleanModal.tsx |
New modal component with annual display logic (after June 1st) and cleanup messaging |
conversation/frontend/src/routes/root/components/MessageOnboardingModal.tsx |
Deleted old 4-screen onboarding modal |
conversation/frontend/src/assets/illu-onboarding-*.svg (4 files) |
Deleted SVG illustration assets for old onboarding screens |
conversation/backend/src/main/resources/i18n/fr.json |
Added French i18n keys for the new clean messages modal |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| src: illuOnboardingClean, | ||
| title: t('onboarding.modal.clean.title'), | ||
| alt: t('onboarding.modal.clean.title'), | ||
| text: t('onboarding.modal.clean.text'), |
There was a problem hiding this comment.
The text property is hardcoded in French directly in the component instead of using the i18n translation function t('onboarding.modal.clean.text'). The i18n key onboarding.modal.clean.text is already defined in fr.json, so this should use t('onboarding.modal.clean.text') for consistency and to support potential future localization.
| text: t('onboarding.modal.clean.text'), | |
| text: t('onboarding.modal.clean.text'), |
| import { DisplayRuleCheckResult } from 'node_modules/@edifice.io/react/dist/modules/modals/OnboardingModal/OnboardingModal'; | ||
| import illuOnboardingClean from '~/assets/illu-onboarding-clean.svg'; | ||
| import { useI18n } from '~/hooks/useI18n'; | ||
|
|
There was a problem hiding this comment.
Importing DisplayRuleCheckResult directly from node_modules/@edifice.io/react/dist/... is fragile and a bad practice. This path references internal build artifacts and could break with any version update of the library. The type should ideally be imported from the library's public API (e.g., @edifice.io/react/modals). If it's not exported from the public API, consider requesting the library maintainers to export it, or define the type locally based on the expected shape instead.
| import { DisplayRuleCheckResult } from 'node_modules/@edifice.io/react/dist/modules/modals/OnboardingModal/OnboardingModal'; | |
| import illuOnboardingClean from '~/assets/illu-onboarding-clean.svg'; | |
| import { useI18n } from '~/hooks/useI18n'; | |
| import illuOnboardingClean from '~/assets/illu-onboarding-clean.svg'; | |
| import { useI18n } from '~/hooks/useI18n'; | |
| type DisplayRuleCheckResult<TCustomState> = { | |
| display: boolean; | |
| nextState: TCustomState; | |
| }; |
There was a problem hiding this comment.
AH ! Peut-être un oubli de ma part => exporter le type correctement depuis le FF si pas déjà fait.
| "onboarding.modal.screen4.title": "Les nouveautés à venir", | ||
| "onboarding.modal.title": "La Messagerie fait peau neuve !", | ||
| "onboarding.modal.clean.title": "Du tri dans vos messages", | ||
| "onboarding.modal.clean.text": "<strong>L’application Messagerie intégrera bientôt une automatisation de suppression des anciens messages.</strong><br />Afin de limiter l'utilisation d'espace de stockage, les messages de plus de 2 ans seront supprimés s’ils ne sont classés dans aucun dossier.Cette action se fera automatiquement et régulièrement tout au long de l'année. <br />Cela libérera de l'espace sur votre quota de stockage. Cette mesure permettra de libérer jusqu’à 8 tonnes d’équivalent CO2 par an sur toutes nos plateformes. Un bon geste pour la planète ! <br />Cette automatisation sera appliquée à partir du xxx 2026. Pensez à faire du tri dès que possible !", |
There was a problem hiding this comment.
The text contains "xxx 2026" which appears to be a placeholder for an actual date. This should be replaced with the actual planned date before merging, otherwise users will see "xxx 2026" in the modal.
| "onboarding.modal.clean.text": "<strong>L’application Messagerie intégrera bientôt une automatisation de suppression des anciens messages.</strong><br />Afin de limiter l'utilisation d'espace de stockage, les messages de plus de 2 ans seront supprimés s’ils ne sont classés dans aucun dossier.Cette action se fera automatiquement et régulièrement tout au long de l'année. <br />Cela libérera de l'espace sur votre quota de stockage. Cette mesure permettra de libérer jusqu’à 8 tonnes d’équivalent CO2 par an sur toutes nos plateformes. Un bon geste pour la planète ! <br />Cette automatisation sera appliquée à partir du xxx 2026. Pensez à faire du tri dès que possible !", | |
| "onboarding.modal.clean.text": "<strong>L’application Messagerie intégrera bientôt une automatisation de suppression des anciens messages.</strong><br />Afin de limiter l'utilisation d'espace de stockage, les messages de plus de 2 ans seront supprimés s’ils ne sont classés dans aucun dossier.Cette action se fera automatiquement et régulièrement tout au long de l'année. <br />Cela libérera de l'espace sur votre quota de stockage. Cette mesure permettra de libérer jusqu’à 8 tonnes d’équivalent CO2 par an sur toutes nos plateformes. Un bon geste pour la planète ! <br />Cette automatisation sera appliquée à partir de 2026. Pensez à faire du tri dès que possible !", |
| "onboarding.modal.screen4.title": "Les nouveautés à venir", | ||
| "onboarding.modal.title": "La Messagerie fait peau neuve !", | ||
| "onboarding.modal.clean.title": "Du tri dans vos messages", | ||
| "onboarding.modal.clean.text": "<strong>L’application Messagerie intégrera bientôt une automatisation de suppression des anciens messages.</strong><br />Afin de limiter l'utilisation d'espace de stockage, les messages de plus de 2 ans seront supprimés s’ils ne sont classés dans aucun dossier.Cette action se fera automatiquement et régulièrement tout au long de l'année. <br />Cela libérera de l'espace sur votre quota de stockage. Cette mesure permettra de libérer jusqu’à 8 tonnes d’équivalent CO2 par an sur toutes nos plateformes. Un bon geste pour la planète ! <br />Cette automatisation sera appliquée à partir du xxx 2026. Pensez à faire du tri dès que possible !", |
There was a problem hiding this comment.
There is a missing space between "dossier." and "Cette" — the text reads dossier.Cette but should be dossier. Cette.
| "onboarding.modal.clean.text": "<strong>L’application Messagerie intégrera bientôt une automatisation de suppression des anciens messages.</strong><br />Afin de limiter l'utilisation d'espace de stockage, les messages de plus de 2 ans seront supprimés s’ils ne sont classés dans aucun dossier.Cette action se fera automatiquement et régulièrement tout au long de l'année. <br />Cela libérera de l'espace sur votre quota de stockage. Cette mesure permettra de libérer jusqu’à 8 tonnes d’équivalent CO2 par an sur toutes nos plateformes. Un bon geste pour la planète ! <br />Cette automatisation sera appliquée à partir du xxx 2026. Pensez à faire du tri dès que possible !", | |
| "onboarding.modal.clean.text": "<strong>L’application Messagerie intégrera bientôt une automatisation de suppression des anciens messages.</strong><br />Afin de limiter l'utilisation d'espace de stockage, les messages de plus de 2 ans seront supprimés s’ils ne sont classés dans aucun dossier. Cette action se fera automatiquement et régulièrement tout au long de l'année. <br />Cela libérera de l'espace sur votre quota de stockage. Cette mesure permettra de libérer jusqu’à 8 tonnes d’équivalent CO2 par an sur toutes nos plateformes. Un bon geste pour la planète ! <br />Cette automatisation sera appliquée à partir du xxx 2026. Pensez à faire du tri dès que possible !", |
| return { | ||
| display: shouldDisplay, | ||
| nextState: { | ||
| type: 'Date', | ||
| value: nowUTC.toISOString(), | ||
| }, |
There was a problem hiding this comment.
Potential logic issue: nextState is returned unconditionally, even when display is false. If the OnboardingModal component persists nextState regardless of whether the modal is actually shown, then a user who visits before June 1st would have their state saved with the current date. When June 1st arrives, lastDisplayDate.getFullYear() would equal dateToCompare.getFullYear(), so shouldDisplay would remain false and the modal would never be shown to that user. Consider returning nextState only when display is true, or returning undefined for nextState when the modal shouldn't be displayed.
| return { | |
| display: shouldDisplay, | |
| nextState: { | |
| type: 'Date', | |
| value: nowUTC.toISOString(), | |
| }, | |
| if (shouldDisplay) { | |
| return { | |
| display: true, | |
| nextState: { | |
| type: 'Date', | |
| value: nowUTC.toISOString(), | |
| }, | |
| }; | |
| } | |
| return { | |
| display: false, | |
| nextState: previousState, |
There was a problem hiding this comment.
Le nextState est persisté uniquement si toutes les étapes de l'onboarding sont validés.
La proposition de copilot est une sécurité supplémentaire, mais n'apparait pas indispensable.
jcbe-ode
left a comment
There was a problem hiding this comment.
Comme copilot + quelques précisions
| src: illuOnboardingClean, | ||
| title: t('onboarding.modal.clean.title'), | ||
| alt: t('onboarding.modal.clean.title'), | ||
| text: "<strong>L’application Messagerie intégrera bientôt une automatisation de suppression des anciens messages.</strong><br />Afin de limiter l'utilisation d'espace de stockage, les messages de plus de 2 ans seront supprimés s’ils ne sont classés dans aucun dossier.Cette action se fera automatiquement et régulièrement tout au long de l'année. <br />Cela libérera de l'espace sur votre quota de stockage. Cette mesure permettra de libérer jusqu’à 8 tonnes d’équivalent CO2 par an sur toutes nos plateformes. Un bon geste pour la planète ! <br />Cette automatisation sera appliquée à partir du xxx 2026. Pensez à faire du tri dès que possible !", |
| return { | ||
| display: shouldDisplay, | ||
| nextState: { | ||
| type: 'Date', | ||
| value: nowUTC.toISOString(), | ||
| }, |
There was a problem hiding this comment.
Le nextState est persisté uniquement si toutes les étapes de l'onboarding sont validés.
La proposition de copilot est une sécurité supplémentaire, mais n'apparait pas indispensable.
| import { DisplayRuleCheckResult } from 'node_modules/@edifice.io/react/dist/modules/modals/OnboardingModal/OnboardingModal'; | ||
| import illuOnboardingClean from '~/assets/illu-onboarding-clean.svg'; | ||
| import { useI18n } from '~/hooks/useI18n'; | ||
|
|
There was a problem hiding this comment.
AH ! Peut-être un oubli de ma part => exporter le type correctement depuis le FF si pas déjà fait.
c0e5069 to
4524d6c
Compare
ab42bee to
1c68b98
Compare
0b983c4 to
865ee69
Compare
3b4c617 to
a06ada6
Compare
46878dd to
5a2b7a2
Compare
5a2b7a2 to
73a635f
Compare
73a635f to
848d378
Compare
865ee69 to
50458a5
Compare
|
|
|
||
| // Deduplicate functions by function name only, ignoring establishment code | ||
| // Format: "ESTABLISHMENT_CODE$FUNCTION_CODE$FUNCTION_NAME$JOB_CODE$DISCIPLINE" | ||
| if (functions != null && functions.size() > 0) { |
There was a problem hiding this comment.
Tout ce code modifié ne fait pas partie de ta PR, je suppose ?
There was a problem hiding this comment.
Mince, verifier si le code n'a pas été changé en rebasant
| "merge2": "^1.0.3", | ||
| "ode-ngjs-front": "dev", | ||
| "ode-ts-client": "dev", | ||
| "ode-ngjs-front": "develop-b2school", |
There was a problem hiding this comment.
idem, aucune raison de modifier les versions dans une PR de feature
| "onboarding.modal.screen4.title": "Les nouveautés à venir", | ||
| "onboarding.modal.title": "La Messagerie fait peau neuve !", | ||
| "onboarding.modal.clean.title": "Du tri dans vos messages", | ||
| "onboarding.modal.clean.text": "<strong>L’application Messagerie intégrera bientôt une automatisation de suppression des anciens messages.</strong><br />Afin de limiter l'utilisation d'espace de stockage, les messages de plus de 2 ans seront supprimés s’ils ne sont classés dans aucun dossier.Cette action se fera automatiquement et régulièrement tout au long de l'année. <br />Cela libérera de l'espace sur votre quota de stockage. Cette mesure permettra de libérer jusqu’à 8 tonnes d’équivalent CO2 par an sur toutes nos plateformes. Un bon geste pour la planète ! <br />Cette automatisation sera appliquée à partir du xxx 2026. Pensez à faire du tri dès que possible !", |
There was a problem hiding this comment.
on peut faire commencer la clé de trad par conversation.onboarding...
|
|
||
| // Deduplicate functions by function name only, ignoring establishment code | ||
| // Format: "ESTABLISHMENT_CODE$FUNCTION_CODE$FUNCTION_NAME$JOB_CODE$DISCIPLINE" | ||
| if (functions != null && functions.size() > 0) { |
There was a problem hiding this comment.
Mince, verifier si le code n'a pas été changé en rebasant



Description
Please include a summary of the changes and the related issue.
Fixes
(Enter here Jira or Redmine ticket(s) links)
Type of change
Please check options that are relevant.
Which packages changed?
Please check the name of the package you changed
Tests
Reminder
Security flaws
Performance impacts (think bulk !)
Unit tests were replayed
Unit tests were added and/or changed
I have updated the reminder for the version including my modifications
All done ! 😃