Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Maj page personas #1215

Merged
merged 58 commits into from
Jul 19, 2023
Merged
Show file tree
Hide file tree
Changes from 50 commits
Commits
Show all changes
58 commits
Select commit Hold shift + click to select a range
ca66427
fix: margin for icons in persona cards
Clemog Jul 12, 2023
6d391db
fix: label is an optionnal props of emoji function
Clemog Jul 12, 2023
2bff20e
fix: props of PersonaGrid
Clemog Jul 12, 2023
67b9235
ajout titres choix de visualisation + css
Clemog Jul 12, 2023
909e435
add: type persona + fix types
Clemog Jul 12, 2023
224cac6
add: type FinShareButton
Clemog Jul 12, 2023
5251598
delete persona warning logic if situation
Clemog Jul 12, 2023
a650862
fix: naming + type
Clemog Jul 13, 2023
e820487
fix: type component PersonaGrid
Clemog Jul 13, 2023
51703e6
feat: détails des réponses profil dans la page personas
Clemog Jul 13, 2023
3d8690a
fix: css simulation list
Clemog Jul 13, 2023
77f8d27
feat: généralise le type Persona
Clemog Jul 13, 2023
5969e0a
feat: ajout description dans la page personas
Clemog Jul 13, 2023
292d113
extract getFormattedActionValue function
Clemog Jul 13, 2023
18fdb22
feat: V0 raw action list
Clemog Jul 13, 2023
ae9caff
feat: liste actions par catégorie + type
Clemog Jul 13, 2023
7a34a1d
feat: info supplémentaire sur le nombre d'actions à impact
Clemog Jul 17, 2023
5beaab5
fix: ordre liste
Clemog Jul 17, 2023
a24b103
[WIP] feat: ajout de la liste des questions personas exhaustive
Clemog Jul 17, 2023
9e91077
feat: ajout de la liste des questions personas exhaustive
Clemog Jul 18, 2023
31612b1
feat: ajout composant RulesCompletion
Clemog Jul 18, 2023
d6ac9f5
feat: rules dans les props de RawActionsList
Clemog Jul 18, 2023
e656949
feat: ajout explications personas
Clemog Jul 18, 2023
b1a9a54
fix: affichage mobile
Clemog Jul 18, 2023
3ee428e
feat: ajout intro
Clemog Jul 18, 2023
8123254
fix: css grille personas
Clemog Jul 18, 2023
9dbfd31
fix: traduction
Clemog Jul 18, 2023
fc44334
fix: passing props
Clemog Jul 18, 2023
dbfe4cb
fix: wrong imports
Clemog Jul 18, 2023
ccd7e48
feat: suppression du block "Comment créer un persona"
Clemog Jul 18, 2023
3e6bbdb
feat: ajout des règles manquantes répondues par défaut
Clemog Jul 18, 2023
5d76f26
feat: ajout du nombre de règles répondues
Clemog Jul 18, 2023
bdac32e
feat: l'attribut `data` devient `situation`
Clemog Jul 18, 2023
dc80cc6
fix: typos
Clemog Jul 18, 2023
7a8f224
feat: l'empreinte affichée est bien l'empreinte de réduction maximale
Clemog Jul 19, 2023
7ea81f9
feat: la visualisation par défaut devient description
Clemog Jul 19, 2023
778b6b2
fix: state simulation id
Clemog Jul 19, 2023
7f550e8
Merge branch 'master' into maj-page-personas
Clemog Jul 19, 2023
583aadd
Merge branch 'master' into maj-page-personas
Clemog Jul 19, 2023
45bb582
refactor: use personasUtils for commons functions and types
EmileRolley Jul 19, 2023
b5b5af5
refactor: improve Profile.tsx typing
EmileRolley Jul 19, 2023
1b594e7
refactor(types): add a type definition for BranchData
EmileRolley Jul 19, 2023
2f42b44
refactor: refactoring pass of Personas.tsx
EmileRolley Jul 19, 2023
fae6d93
refactor: refactoring pass on QuestionList.tsx
EmileRolley Jul 19, 2023
67f5a2d
refactor: nitpicks in RawActionsList.tsx
EmileRolley Jul 19, 2023
659e70f
fix: types errors in RulesCompletion.tsx
EmileRolley Jul 19, 2023
6713b8d
fix: check for undefined in Summary.tsx
EmileRolley Jul 19, 2023
c96541a
fix: update imports
EmileRolley Jul 19, 2023
24bf5c7
fix: add type getFormattedActionValue
Clemog Jul 19, 2023
1e51bae
fix: types
Clemog Jul 19, 2023
ef54157
fix: add dependencies in useState of Persona avoiding infinite call
EmileRolley Jul 19, 2023
464bd05
fix: persona contains only `situation`
Clemog Jul 19, 2023
08e78d3
fix: persona contains only `situation`
Clemog Jul 19, 2023
b369b3a
Merge branch 'maj-page-personas' of https://github.com/incubateur-ade…
Clemog Jul 19, 2023
a1d6799
fix: plus de redirection vers l'écran "Agir" depuis la page personas
Clemog Jul 19, 2023
2977bc5
fix: les règles inactifs ne sont plus prises en compte
Clemog Jul 19, 2023
780a59a
Revert "fix: les règles inactifs ne sont plus prises en compte"
Clemog Jul 19, 2023
518276f
Merge branch 'master' into maj-page-personas
Clemog Jul 19, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 1 addition & 1 deletion nosgestesclimat
2 changes: 1 addition & 1 deletion source/components/SessionBar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -212,7 +212,7 @@ export default function SessionBar({}) {
border-radius: 0.3rem;
`}
>
{persona}
{persona.nom}
</span>
)}
</Button>
Expand Down
2 changes: 1 addition & 1 deletion source/components/emoji.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ export const Emoji = ({ children, ...props }) => {
return children
}

export default (text: string, label: string) => {
export default (text: string, label?: string) => {
return <Twemoji text={text} label={label} />
}

Expand Down
1 change: 1 addition & 0 deletions source/components/publicodesUtils.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ export type NGCRule = Rule & {
mosaique?: MosaiqueNode
type?: 'notification'
sévérité?: 'avertissement' | 'information' | 'invalide'
action?: { dépasse: DottedName[] }
// NOTE(@EmileRolley): used in Action.tsx but I don't if it is really needed..
plus?: boolean
}
Expand Down
11 changes: 10 additions & 1 deletion source/components/useBranchData.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,22 @@
import { AppState } from '@/reducers/rootReducer'
import { useEffect } from 'react'
import { useDispatch, useSelector } from 'react-redux'

export type BranchData = {
deployURL: string
pullRequestNumber?: string
loaded: boolean
}

export default () => {
const dispatch = useDispatch()
const urlParams = new URLSearchParams(window.location.search)

const searchPR = urlParams.get('PR')

const pullRequestNumber = useSelector((state) => state.pullRequestNumber)
const pullRequestNumber = useSelector(
(state: AppState) => state.pullRequestNumber
)

const setPullRequestNumber = (number) =>
dispatch({ type: 'SET_PULL_REQUEST_NUMBER', number })
Expand Down
41 changes: 39 additions & 2 deletions source/locales/ui/ui-en-us.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -456,8 +456,8 @@ entries:
publicodes.Landing.question.lock: Connaissez-vous votre empreinte sur le climat ?
publicodes.LandingExplanations.question: Do you know your climate footprint?
publicodes.LandingExplanations.question.lock: Connaissez-vous votre empreinte sur le climat ?
publicodes.Personas.description: Personas will allow us to take the side of a diversity of users when they see our "take action" screen.
publicodes.Personas.description.lock: Les personas nous permettront de prendre le parti d'une diversité d'utilisateurs quand ils voient notamment notre écran "passer à l'action".
publicodes.Personas.description: 'We''ve defined them to represent the diversity of simulator use cases. <2>Any resemblance to an existing or former person is purely coincidental!</2> In no way can we say that they are representative of the distribution of the French population: the aim is not to stick to population statistics, but to find among our ten personas at least one that represents each major and differentiating use for the simulator. So, for each of them, we varied..:<5><0>Their gender: even if it has no influence on the footprint, it would be surprising to have only "female" personas</0> <2>Age and personal/professional situation: at least one student, one retired person, one homemaker, one working person</2> <4>Household size: from 1 person to a large family</4> <6>Where they live: urban, rural and suburban, in the north, south, plains, mountains and on an island</6> <8>Where they live: from apartments to houses, from new to old buildings</8><9>Means of transport: from walking to driving, from ferries to planes</9> <11>Diet: at least one vegan, one vegetarian, one fish-eater and one red meat lover</11> <13>Their buying habits: from second-hand to brand-new, from the compulsive shopper to the person who buys next to nothing</13> <15>The way they go on vacation: transport, accommodation, you name it, we''ve got it</15> <17>Their hobbies: culture, sport, well-being..</17></5>'
publicodes.Personas.description.lock: 'Nous les avons définis pour qu’ils représentent la diversité des cas d’usage du simulateur. <2>Toute ressemblance avec une personne existant ou ayant existé serait purement fortuite !</2> En aucune mesure, on ne peut dire qu’ils sont représentatifs de la distribution de la population française : il ne s’agit pas de coller aux statistiques de la population, mais de retrouver parmi nos dix personas au moins un qui représente chaque usage majeur et différenciant pour le simulateur. Ainsi, nous avons fait varier pour chacun d’entre eux :<5><0>Leur genre : même s’il n’influe pas sur l’empreinte, il serait étonnant de n’avoir que des personas “femmes”</0> <2>Leur âge et situation personnelle / professionnelle : au moins un étudiant, un retraité, un adulte au foyer, un actif</2> <4>La taille de leur foyer : de 1 personne à famille nombreuse</4> <6>Leur lieu de vie : de l’urbain, du rural et du péri-urbain, dans le nord, dans le sud, les plaines, la montagne et sur une île</6> <8>Leur logement : de l’appartement à la maison, du neuf à l’ancien</8><9>Leurs modes de transport : de la marche à la voiture en passant par le ferry et l’avion</9> <11>Leur régime alimentaire : au moins un végétalien, un végétarien, une personne ne mangeant que du poisson, et un amateur de viande rouge</11> <13>Leur tendance à l’achat : du tout occasion au tout neuf, de l’acheteur compulsif à celui ou celle qui n’achète presque rien</13> <15>Leur façon de partir en vacances : mode de transport, hébergement, on trouve de tout</15> <17>Leurs loisirs : de la culture, du sport, du bien-être…</17></5>'
publicodes.Personas.lienGenerateur: For the first names, you can use <2>this generator</2>
publicodes.Personas.lienGenerateur.lock: Pour les prénoms, on peut utiliser <2>ce générateur</2>
publicodes.Personas.tuto: that it happens. You can either copy and paste data from another persona and modify it, or create one from scratch from the simulation. Once the simulation is satisfactory, click on "Modify my answers" then type Ctrl-C, open the browser console (F12), make sure you are in the "Console" tab, go to the very bottom of the console (it is a bit busy...), then copy the JSON displayed, paste it into <2>this tool</2> to generate a YAML, then insert it into personas.yaml.
Expand Down Expand Up @@ -869,6 +869,43 @@ entries:
Votre bilan climat personnel: Your personal climate report
Personas: Personas
Les questions du modèle Nos Gestes Climat: Nos Gestes Climat model questions
'Les actions associées:': 'Associated actions:'
actions: actions
'Description:': 'Description:'
'proposées au total pour un empreinte de réduction cumulée de ': 'for a cumulative reduction footprint of '
' présentent un impact de plus de 1 tonne de CO2e,': ' have an impact of more than 1 tonne of CO2e,'
plus de 100 kgCO2e: more than 100 kgCO2e
Qui sont-ils ?: Who are they?
C'est le persona par défaut.: It's the default persona.
règle est absente du persona: rule is absent from the persona
✅ Aucune règle du persona n'est absente du modèle.: ✅ No persona rules are missing from the model.
Liste des questions du modèle: List of template questions
publicodes.Personas.listeQuestions: 'The list of template questions is available on the <2>/questions</2> page. The exhaustive list of all the rules for defining a persona is :'
publicodes.Personas.listeQuestions.lock: 'La liste des questions du modèle est accessible sur la page <2>/questions</2>. La liste exhaustive de toutes les règles pour définir un persona est :'
Copier le YAML: Copy YAML
'Complétude des règles du personas:': 'Completeness of personas rules:'
règles sont absentes du persona: rules are absent from the persona
règles ont été définies dans le persona mais sont absentes du modèle: rules have been defined in the persona but are absent from the model
règle a été définie dans le persona mais est absente du modèle: rule has been defined in the persona but is absent from the model
✅ Aucune règle du modèle est absente du persona.: ✅ No model rule is missing from the persona.
Comment les mettons-nous à jour ?: How do we update them?
Quelle est la liste des questions du modèle ?: What is the list of questions in the template?
'Les personas nous servent à tester le simulateur sous toutes ses coutures, et à vérifier qu’il s’adapte bien à toutes les situations de vie des citoyens métropolitains. De par leur présence, ils nous forcent à penser à tous les cas d’usage, pour nous projeter dans différentes réalités, et inclure ces réalités dans nos refontes du parcours de test et des actions proposées à la fin de ce dernier. ': 'The personas help us to test the simulator from every angle, and to check that it can be adapted to all the life situations of metropolitan citizens. By their very presence, they force us to think of all possible use cases, to project ourselves into different realities, and to include these realities in our redesigns of the test path and the actions proposed at the end of it. '
publicodes.Personas.maj: To ensure that they continue to represent the diversity of the carbon footprint simulator's use cases, we edit them each time the simulator is added or modified, in accordance with the following rules:<1><0>Each possible answer is assigned to at least one persona</0> <2>At least one persona gives no answer to the question (and is therefore assigned the default value given in the simulator).</2></1>
publicodes.Personas.maj.lock: Pour qu’ils ou elles continuent de représenter la diversité des cas d’usage du simulateur d’empreinte carbone, nous les éditons à chaque ajout ou modification de ce dernier, en respectant les règles suivantes :<1><0>Chaque réponse possible est attribuée à au moins un persona</0> <2>Au moins un persona ne répond rien à la question (il lui est donc attribué la valeur par défaut donnée dans le simulateur).</2></1>
questions: questions
'a répondu à ': 'responded to '
règle nécessitant une réponse a été répondue par défaut.: rule requiring a response has been answered by default.
règles sont absentes du persona.: rules are absent from the persona.
C'est le persona par défaut. Toutes les règles ont été répondues par défaut: This is the default persona. All rules have been answered by default
C'est le persona par défaut. Toutes les règles ont été répondues par défaut.: This is the default persona. All rules have been answered by default.
règles nécessitant une réponse ont été répondues par défaut.: rules requiring a response were answered by default.
✅ Aucune règle nécessitant un réponse n'a été répondue par défaut.: ✅ No rules requiring a response have been answered by default.
règle a été définie dans le persona mais est absente du modèle.: rule has been defined in the persona but is absent from the model.
règles ont été définies dans le persona mais sont absentes du modèle.: rules have been defined in the persona but are absent from the model.
règle est absente du persona.: rule is absent from the persona.
Cette page vous permet de naviguer dans les parcours Nos Gestes Climat comme si vous étiez l'un des profils types que nous avons listés.: This page lets you navigate through the Nos Gestes Climat paths as if you were one of the profiles we've listed.
'proposées au total pour un potentiel de réduction de ': 'proposed for a total reduction potential of '
meta.publicodes.Budget.title: Budget
meta.publicodes.Budget.title.lock: Budget
meta.publicodes.Budget.description: Nos Gestes Climat is a state-owned start-up supported by ADEME. Browse this page to find out more about how the team works and its annual budget.
Expand Down
37 changes: 36 additions & 1 deletion source/locales/ui/ui-fr.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -380,7 +380,7 @@ entries:
publicodes.Contribution.translationWikiInvite: 'Suivez notre guide complet pour contribuer directement à la traduction du site : <2>rendez-vous sur notre wiki</2>.'
publicodes.Landing.question: Connaissez-vous votre empreinte sur le climat ?
publicodes.LandingExplanations.question: Connaissez-vous votre empreinte sur le climat ?
publicodes.Personas.description: Les personas nous permettront de prendre le parti d'une diversité d'utilisateurs quand ils voient notamment notre écran "passer à l'action".
publicodes.Personas.description: 'Nous les avons définis pour qu’ils représentent la diversité des cas d’usage du simulateur. <2>Toute ressemblance avec une personne existant ou ayant existé serait purement fortuite !</2> En aucune mesure, on ne peut dire qu’ils sont représentatifs de la distribution de la population française : il ne s’agit pas de coller aux statistiques de la population, mais de retrouver parmi nos dix personas au moins un qui représente chaque usage majeur et différenciant pour le simulateur. Ainsi, nous avons fait varier pour chacun d’entre eux :<5><0>Leur genre : même s’il n’influe pas sur l’empreinte, il serait étonnant de n’avoir que des personas “femmes”</0> <2>Leur âge et situation personnelle / professionnelle : au moins un étudiant, un retraité, un adulte au foyer, un actif</2> <4>La taille de leur foyer : de 1 personne à famille nombreuse</4> <6>Leur lieu de vie : de l’urbain, du rural et du péri-urbain, dans le nord, dans le sud, les plaines, la montagne et sur une île</6> <8>Leur logement : de l’appartement à la maison, du neuf à l’ancien</8><9>Leurs modes de transport : de la marche à la voiture en passant par le ferry et l’avion</9> <11>Leur régime alimentaire : au moins un végétalien, un végétarien, une personne ne mangeant que du poisson, et un amateur de viande rouge</11> <13>Leur tendance à l’achat : du tout occasion au tout neuf, de l’acheteur compulsif à celui ou celle qui n’achète presque rien</13> <15>Leur façon de partir en vacances : mode de transport, hébergement, on trouve de tout</15> <17>Leurs loisirs : de la culture, du sport, du bien-être…</17></5>'
publicodes.Personas.lienGenerateur: Pour les prénoms, on peut utiliser <2>ce générateur</2>
publicodes.Personas.tuto: que ça se passe. On peut soit copier coller les données d'un autre persona et les modifier, soit en créer un de zéro depuis la simulation. Une fois la simulation satisfaisante, cliquer sur "Modifier mes réponses" puis taper Ctrl-C, ouvrir la console du navigateur (F12), vérifiez bien que vous êtes dans l'onglet "Console", allez tout en bas de la console (elle est un peu chargée...), puis copier le JSON affiché, le coller dans <2>cet outil</2> pour générer un YAML, puis l'insérer dans personas.yaml.
publicodes.Personas.warningMsg: Sélectionner un persona releguera votre simulation en cours dans votre historique de simulations, accessible en bas de votre <2>page profil</2>.
Expand Down Expand Up @@ -671,3 +671,38 @@ entries:
Les questions du modèle Nos Gestes Climat: Les questions du modèle Nos Gestes Climat
Personas: Personas
Votre bilan climat personnel: Votre bilan climat personnel
' présentent un impact de plus de 1 tonne de CO2e,': ' présentent un impact de plus de 1 tonne de CO2e,'
actions: actions
'Description:': 'Description:'
'Les actions associées:': 'Les actions associées:'
plus de 100 kgCO2e: plus de 100 kgCO2e
'proposées au total pour un empreinte de réduction cumulée de ': 'proposées au total pour un empreinte de réduction cumulée de '
✅ Aucune règle du modèle est absente du persona.: ✅ Aucune règle du modèle est absente du persona.
✅ Aucune règle du persona n'est absente du modèle.: ✅ Aucune règle du persona n'est absente du modèle.
C'est le persona par défaut.: C'est le persona par défaut.
'Complétude des règles du personas:': 'Complétude des règles du personas:'
Copier le YAML: Copier le YAML
Liste des questions du modèle: Liste des questions du modèle
publicodes.Personas.listeQuestions: 'La liste des questions du modèle est accessible sur la page <2>/questions</2>. La liste exhaustive de toutes les règles pour définir un persona est :'
Qui sont-ils ?: Qui sont-ils ?
règle a été définie dans le persona mais est absente du modèle: règle a été définie dans le persona mais est absente du modèle
règle est absente du persona: règle est absente du persona
règles ont été définies dans le persona mais sont absentes du modèle: règles ont été définies dans le persona mais sont absentes du modèle
règles sont absentes du persona: règles sont absentes du persona
Comment les mettons-nous à jour ?: Comment les mettons-nous à jour ?
'Les personas nous servent à tester le simulateur sous toutes ses coutures, et à vérifier qu’il s’adapte bien à toutes les situations de vie des citoyens métropolitains. De par leur présence, ils nous forcent à penser à tous les cas d’usage, pour nous projeter dans différentes réalités, et inclure ces réalités dans nos refontes du parcours de test et des actions proposées à la fin de ce dernier. ': 'Les personas nous servent à tester le simulateur sous toutes ses coutures, et à vérifier qu’il s’adapte bien à toutes les situations de vie des citoyens métropolitains. De par leur présence, ils nous forcent à penser à tous les cas d’usage, pour nous projeter dans différentes réalités, et inclure ces réalités dans nos refontes du parcours de test et des actions proposées à la fin de ce dernier. '
publicodes.Personas.maj: Pour qu’ils ou elles continuent de représenter la diversité des cas d’usage du simulateur d’empreinte carbone, nous les éditons à chaque ajout ou modification de ce dernier, en respectant les règles suivantes :<1><0>Chaque réponse possible est attribuée à au moins un persona</0> <2>Au moins un persona ne répond rien à la question (il lui est donc attribué la valeur par défaut donnée dans le simulateur).</2></1>
Quelle est la liste des questions du modèle ?: Quelle est la liste des questions du modèle ?
✅ Aucune règle nécessitant un réponse n'a été répondue par défaut.: ✅ Aucune règle nécessitant un réponse n'a été répondue par défaut.
C'est le persona par défaut. Toutes les règles ont été répondues par défaut.: C'est le persona par défaut. Toutes les règles ont été répondues par défaut.
règle a été définie dans le persona mais est absente du modèle.: règle a été définie dans le persona mais est absente du modèle.
règle est absente du persona.: règle est absente du persona.
règle nécessitant une réponse a été répondue par défaut.: règle nécessitant une réponse a été répondue par défaut.
règles nécessitant une réponse ont été répondues par défaut.: règles nécessitant une réponse ont été répondues par défaut.
règles ont été définies dans le persona mais sont absentes du modèle.: règles ont été définies dans le persona mais sont absentes du modèle.
règles sont absentes du persona.: règles sont absentes du persona.
'a répondu à ': 'a répondu à '
questions: questions
C'est le persona par défaut. Toutes les règles ont été répondues par défaut: C'est le persona par défaut. Toutes les règles ont été répondues par défaut
Cette page vous permet de naviguer dans les parcours Nos Gestes Climat comme si vous étiez l'un des profils types que nous avons listés.: Cette page vous permet de naviguer dans les parcours Nos Gestes Climat comme si vous étiez l'un des profils types que nous avons listés.
'proposées au total pour un potentiel de réduction de ': 'proposées au total pour un potentiel de réduction de '
2 changes: 1 addition & 1 deletion source/reducers/rootReducer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ function simulation(
foldedSteps: action.foldedSteps ?? state?.foldedSteps ?? [],
unfoldedStep: null,
persona: action.persona,
id: action.persona ?? state?.id ?? generateSimulationId(), // Unique identifier of the simulation, used for the 'currentSimulationId' pointer.
id: action.persona?.nom ?? state?.id ?? generateSimulationId(), // Unique identifier of the simulation, used for the 'currentSimulationId' pointer.
date: !action.persona && state?.date ? state?.date : new Date(),
eventsSent: state?.eventsSent ?? {},
}
Expand Down
2 changes: 1 addition & 1 deletion source/selectors/simulationSelectors.ts
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@ export const useSimulationData = () => {
}
export const isPersonaSelector = createSelector(
[currentSimulationSelector],
(simulation) => simulation?.persona != null
(simulation) => simulation?.persona != undefined
)

export const hasSubscribedToNewsletterSelector = (state: AppState) => {
Expand Down