Skip to content

Commit 836cce5

Browse files
authored
Merge pull request #237 from dedis/tagemoua-patch1
Adds translation of form
2 parents f8f4fc5 + a47107b commit 836cce5

38 files changed

+1182
-321
lines changed

web/frontend/src/components/utils/ElectionFields.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { useFillLightFormInfo } from './FillFormInfo';
77
* @returns the fields of a form and a function to change the status field
88
*/
99
const FormFields = (formData: LightFormInfo) => {
10-
const { title, id, status, pubKey, setStatus } = useFillLightFormInfo(formData);
10+
const { title, titleFr, titleDe, id, status, pubKey, setStatus } = useFillLightFormInfo(formData);
1111
return { title, id, status, pubKey, setStatus };
1212
};
1313

web/frontend/src/components/utils/FillFormInfo.tsx

+20-13
Original file line numberDiff line numberDiff line change
@@ -15,20 +15,21 @@ const useFillFormInfo = (formData: FormInfo) => {
1515
const [isResultSet, setIsResultSet] = useState<boolean>(false);
1616

1717
useEffect(() => {
18-
if (formData !== null) {
19-
setId(formData.FormID);
20-
setStatus(formData.Status);
21-
setPubKey(formData.Pubkey);
22-
setRoster(formData.Roster);
23-
setResult(formData.Result);
24-
setChunksPerBallot(formData.ChunksPerBallot);
25-
setBallotSize(formData.BallotSize);
26-
setConfigObj(formData.Configuration);
27-
setVoters(formData.Voters);
18+
if (formData === null) {
19+
return;
20+
}
21+
setId(formData.FormID);
22+
setStatus(formData.Status);
23+
setPubKey(formData.Pubkey);
24+
setRoster(formData.Roster);
25+
setResult(formData.Result);
26+
setChunksPerBallot(formData.ChunksPerBallot);
27+
setBallotSize(formData.BallotSize);
28+
setConfigObj(formData.Configuration);
29+
setVoters(formData.Voters);
2830

29-
if (formData.Result.length > 0) {
30-
setIsResultSet(true);
31-
}
31+
if (formData.Result.length > 0) {
32+
setIsResultSet(true);
3233
}
3334
}, [formData]);
3435

@@ -52,6 +53,8 @@ const useFillFormInfo = (formData: FormInfo) => {
5253
const useFillLightFormInfo = (formData: LightFormInfo) => {
5354
const [id, setId] = useState<ID>('');
5455
const [title, setTitle] = useState<string>('');
56+
const [titleFr, setTitleFr] = useState<string>('');
57+
const [titleDe, setTitleDe] = useState<string>('');
5558
const [status, setStatus] = useState<Status>(null);
5659
const [pubKey, setPubKey] = useState<string>('');
5760

@@ -61,12 +64,16 @@ const useFillLightFormInfo = (formData: LightFormInfo) => {
6164
setTitle(formData.Title);
6265
setStatus(formData.Status);
6366
setPubKey(formData.Pubkey);
67+
setTitleFr(formData.TitleFr);
68+
setTitleDe(formData.TitleDe);
6469
}
6570
}, [formData]);
6671

6772
return {
6873
id,
6974
title,
75+
titleFr,
76+
titleDe,
7077
status,
7178
setStatus,
7279
pubKey,

web/frontend/src/index.tsx

+27-22
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ import App from 'layout/App';
77
import reportWebVitals from 'reportWebVitals';
88
import ShortUniqueId from 'short-unique-id';
99

10+
import { useTranslation } from 'react-i18next';
11+
1012
import * as endpoints from 'components/utils/Endpoints';
1113

1214
const flashTimeout = 4000;
@@ -111,30 +113,33 @@ export const ProxyContext = createContext<ProxyState>(defaultProxyState);
111113

112114
// A small elements to display that the page is loading, should be something
113115
// more elegant in the future and be its own component.
114-
const Loading: FC = () => (
115-
<div className="flex h-screen">
116-
<div className="m-auto">
117-
<div className="text-center pb-2">
118-
<svg
119-
role="status"
120-
className="inline w-16 h-16 mr-2 text-gray-200 animate-spin dark:text-gray-400 fill-indigo-600"
121-
viewBox="0 0 100 101"
122-
fill="none"
123-
xmlns="http://www.w3.org/2000/svg">
124-
<path
125-
d="M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z"
126-
fill="currentColor"
127-
/>
128-
<path
129-
d="M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z"
130-
fill="currentFill"
131-
/>
132-
</svg>
116+
const Loading: FC = () => {
117+
const { t } = useTranslation();
118+
return (
119+
<div className="flex h-screen">
120+
<div className="m-auto">
121+
<div className="text-center pb-2">
122+
<svg
123+
role="status"
124+
className="inline w-16 h-16 mr-2 text-gray-200 animate-spin dark:text-gray-400 fill-indigo-600"
125+
viewBox="0 0 100 101"
126+
fill="none"
127+
xmlns="http://www.w3.org/2000/svg">
128+
<path
129+
d="M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z"
130+
fill="currentColor"
131+
/>
132+
<path
133+
d="M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z"
134+
fill="currentFill"
135+
/>
136+
</svg>
137+
</div>
138+
<p>{t('loading')}</p>
133139
</div>
134-
<p>App is loading...</p>
135140
</div>
136-
</div>
137-
);
141+
);
142+
};
138143

139144
const Failed: FC = ({ children }) => (
140145
<div className="flex items-center justify-center w-screen h-screen bg-gradient-to-r from-red-600 to-red-700">
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import React, { FC } from 'react';
2+
import { useTranslation } from 'react-i18next';
3+
type LanguageButtonsProps = {
4+
availableLanguages: string[];
5+
setLanguage: (lang: string) => void;
6+
};
7+
8+
const LanguageButtons: FC<LanguageButtonsProps> = ({ availableLanguages, setLanguage }) => {
9+
const { t } = useTranslation();
10+
return (
11+
<div className="py-6 px-5 space-y-6">
12+
<form className="flex gap-y-4 gap-x-8">
13+
{availableLanguages.map((lang, index) => (
14+
<label key={index} id={'lang' + lang}>
15+
<input
16+
className="hidden peer"
17+
type="radio"
18+
key={index}
19+
id={'lang' + lang}
20+
name="lang"></input>
21+
<div
22+
className="peer-checked:bg-gray-300 text-base font-small text-gray-900 hover:text-gray-700"
23+
onClick={() => setLanguage(lang)}>
24+
{t(lang)}
25+
</div>
26+
</label>
27+
))}
28+
</form>
29+
</div>
30+
);
31+
};
32+
33+
export default LanguageButtons;

web/frontend/src/language/de.json

+14-7
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@
4444
"enterMinN": "Eingabe der MinN",
4545
"enterMaxN": "Eingabe der MaxN",
4646
"enterRegex": "Geben Sie Ihre Regex ein",
47-
"enterTitle": "Geben Sie Ihren Titel ein",
4847
"mainProperties": "Wichtigste Eigenschaften",
4948
"additionalProperties": "Zusätzliche Eigenschaften",
5049
"removeSubject": "Betreff entfernen",
@@ -90,12 +89,15 @@
9089
"noFile": "Keine Datei gefunden",
9190
"createElecDesc": "Erstellen Sie ein neues Formular, indem Sie die untenstehenden Informationen ausfüllen oder indem Sie",
9291
"uploadJSON": "Hochladen einer JSON-Datei",
93-
"enterMainTitleLg1": "Geben Sie den Haupttitel auf Deutsch ein ",
92+
"enterMainTitleLg2": "Geben Sie den Haupttitel auf Deutsch ein ",
9493
"enterMainTitleLg": "Geben Sie den Haupttitel auf Englisch ein",
95-
"enterMainTitleLg2": "Geben Sie den Haupttitel auf Französisch",
96-
"enterSubjectTitleLg1": "Geben Sie den Titel des Themas Deutsch ein",
94+
"enterMainTitleLg1": "Geben Sie den Haupttitel auf Französisch",
95+
"enterSubjectTitleLg2": "Geben Sie den Titel des Themas Deutsch ein",
9796
"enterSubjectTitleLg": "Geben Sie den Titel des Themas Englisch ein",
98-
"enterSubjectTitleLg2": "Geben Sie den Titel des Themas Französisch ein",
97+
"enterSubjectTitleLg1": "Geben Sie den Titel des Themas Französisch ein",
98+
"enterTitleLg2": "Geben Sie den Titel Deutsch ein",
99+
"enterTitleLg": "Geben Sie den Titel Englisch ein",
100+
"enterTitleLg1": "Geben Sie den Titel Französisch ein",
99101
"errorCandidates": "Sie müssen mindestens einen Kandidaten hinzufügen!",
100102
"errorNewCandidate": "Sind Sie sicher, dass Sie nichts hinzufügen möchten?",
101103
"errorRetrievingForms": "Beim Abrufen aller Formulare von unserem Server scheint ein Fehler aufgetreten zu sein. Wenden Sie sich an den Administrator dieser Website. Fehler:",
@@ -263,7 +265,12 @@
263265
"actionTextVoter1": "Das Formular ist noch nicht geöffnet, Sie können später wiederkommen, um abzustimmen, sobald es geöffnet ist.",
264266
"actionTextVoter2": "Die Ergebnisse des Formulars liegen noch nicht vor.",
265267
"choice": "Auswahl",
266-
"logoutWarning": "Sie sind dabei, sich abzumelden. Sind Sie sicher, dass Sie fortfahren möchten?",
267-
"continue": "Fortfahren"
268+
"logoutWarning": "Sie sind dabei, sich abzumelden. Wenn Sie gerade ein Formular ausfüllen, empfehlen wir Ihnen, das Formular als JSON zu exportieren, da Sie sonst Ihre Änderungen verlieren. Sind Sie sicher, dass Sie fortfahren möchten?",
269+
"continue": "Fortfahren",
270+
"enterHintLg1": "Geben Sie einen Hinweis auf Französisch ein (optional)",
271+
"enterHintLg": "Geben Sie einen Hinweis auf Englisch ein (optional)",
272+
"enterHintLg2": "Geben Sie einen Hinweis auf Deutsch ein (optional)",
273+
"hint": "Hinweis",
274+
"invalidInput": "Bitte geben Sie eine Zahl zwischen 1 und {{max}} ein."
268275
}
269276
}

web/frontend/src/language/en.json

+12-7
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,9 @@
4040
"enterMinN": "Enter the MinN",
4141
"enterMaxN": "Enter the MaxN",
4242
"enterRegex": "Enter your regex",
43-
"enterTitle": "Enter your Title",
44-
"enterHint": "Enter your Hint (optionnal)",
43+
"enterHintLg": "Enter a Hint in English (optionnal)",
44+
"enterHintLg1": "Enter a Hint in French (optionnal)",
45+
"enterHintLg2": "Enter a Hint in German (optionnal)",
4546
"mainProperties": "Main properties",
4647
"additionalProperties": "Additional properties",
4748
"removeSubject": "Remove subject",
@@ -66,7 +67,7 @@
6667
"namePlaceHolder": "Enter the name",
6768
"addCandidate": "Add a candidate",
6869
"addUser": "Add user",
69-
"role": "Role",
70+
"role": "Role ",
7071
"roles": "Roles",
7172
"edit": "Edit",
7273
"nothingToAdd": "There is nothing to add.",
@@ -89,10 +90,13 @@
8990
"uploadJSON": "uploading a JSON file",
9091
"enterMainTitleLg": "Enter the Main Title in English",
9192
"enterMainTitleLg1": "Enter the Main Title in French",
92-
"enterMainTitleLg2": "Enter the Main Title in Deutsch",
93+
"enterMainTitleLg2": "Enter the Main Title in German",
9394
"enterSubjectTitleLg1": "Enter the Subject Title in French",
9495
"enterSubjectTitleLg": "Enter the Subject Title in English",
95-
"enterSubjectTitleLg2": "Enter the Subject Title in Deutsch",
96+
"enterSubjectTitleLg2": "Enter the Subject Title in German",
97+
"enterTitleLg": "Enter the Title in English",
98+
"enterTitleLg1": "Enter the Title in French",
99+
"enterTitleLg2": "Enter the Title in German",
96100
"errorCandidates": "You must add at least one candidate!",
97101
"errorNewCandidate": "Are you sure you don't want to add ",
98102
"errorRetrievingForms": "An error seems to have occurred while retrieving all the forms from our server. Contact the administrator of this website. Error: ",
@@ -265,8 +269,9 @@
265269
"resIndiv": "Individual",
266270
"resGroup": "Grouped",
267271
"choice": "Choice",
268-
"logoutWarning": "You are about to log out. Are you sure you want to continue?",
272+
"logoutWarning": "You are about to log out. If you are currently filling a form, we suggest you to export the form as a JSON, otherwise you will lose your modifications. Are you sure you want to continue?",
269273
"continue": "Continue",
270-
"invalidInput": "Please enter a number between 1 and {{max}}."
274+
"invalidInput": "Please enter a number between 1 and {{max}}.",
275+
"hint": "Hint"
271276
}
272277
}

web/frontend/src/language/fr.json

+27-20
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,14 @@
2727
"showing": "Montrer",
2828
"saveQuestion": "Enregistrer",
2929
"addRank": "Ajouter un rang",
30-
"editrank": "Modifier un rang",
31-
"removerank": "Enlever un rang",
32-
"addSelect": "Ajouter la sélection",
30+
"editrank": "Modifier le rang",
31+
"removerank": "Supprimer le rang",
32+
"addSelect": "Ajouter une sélection",
3333
"editselect": "Modifier la sélection",
3434
"removeselect": "Supprimer la sélection",
3535
"addText": "Ajouter un texte",
36-
"edittext": "Modifier un texte",
37-
"removetext": "Supprimer un texte",
36+
"edittext": "Modifier le texte",
37+
"removetext": "Supprimer le texte",
3838
"subject": "Sujet",
3939
"choices": "Choix",
4040
"answers": "Réponses",
@@ -44,16 +44,15 @@
4444
"enterMinN": "Entrer le MinN",
4545
"enterMaxN": "Entrer le MaxN",
4646
"enterRegex": "Entrer votre regex",
47-
"enterTitle": "Entrer votre Titre",
4847
"mainProperties": "Principales propriétés",
4948
"additionalProperties": "Propriétés additionnels",
50-
"removeSubject": "Suprimer un sujet",
49+
"removeSubject": "Suprimer le sujet",
5150
"addSubject": "Ajouter un sujet",
5251
"addQuestionrank": "Rang",
53-
"addQuestionselect": "Sélectionner",
52+
"addQuestionselect": "Selection",
5453
"addQuestiontext": "Texte",
5554
"importFile": "Importer le fichier JSON ",
56-
"enterSciper": "Merci de donner le sciper de l'utilisateur",
55+
"enterSciper": "Merci de rentrer le sciper de l'utilisateur",
5756
"adminDetails": "Ajouter ou supprimer les rôles des utilisateurs du tableau de l'admin",
5857
"navBarCreateForm": "Créer un sondage",
5958
"homeTitle": "Bienvenue dans notre platforme de e-voting!",
@@ -73,7 +72,7 @@
7372
"roles": "Rôles",
7473
"edit": "Editer",
7574
"nothingToAdd": "Il y a rien à ajouter.",
76-
"duplicateCandidate": "Ce candidat a déjà été ajouter.",
75+
"duplicateCandidate": "Ce candidat a déjà été ajouté.",
7776
"add": "Ajouter",
7877
"exportJSON": "Exporter en JSON",
7978
"delete": "Supprimer",
@@ -96,6 +95,9 @@
9695
"enterSubjectTitleLg1": "Entrer le Titre du sujet en Français",
9796
"enterSubjectTitleLg": "Entrer le Titre du sujet en Anglais",
9897
"enterSubjectTitleLg2": "Entrer le Titre du sujet en Allemand",
98+
"enterTitleLg1": "Entrer le Titre en Français",
99+
"enterTitleLg": "Entrer le Titre en Anglais",
100+
"enterTitleLg2": "Entrer le Titre en Allemand",
99101
"errorCandidates": "Vous devez ajouter au moins un candidat!",
100102
"errorNewCandidate": "Vous êtes de sûr de ne pas vouloir ajouter ",
101103
"errorRetrievingForms": "Une erreur semble s'être produite lors de la récupération des sondages sur notre serveur. Contactez l'administrateur de ce site. Erreur: ",
@@ -133,7 +135,7 @@
133135
"statusInitial": "Créé",
134136
"statusInitializedNodes": "Noeuds initialisés",
135137
"initializeNode": "Initialiser les noeuds",
136-
"initialized": "Initializé",
138+
"initialized": "Initialisé",
137139
"initializing": "Initialisation...",
138140
"settingUp": "Mise en place...",
139141
"statusSetup": "Configuration",
@@ -147,10 +149,10 @@
147149
"opening": "Ouverture...",
148150
"statusClose": "Fermé",
149151
"closing": "Fermeture...",
150-
"shuffling": "Mélangé...",
151-
"statusShuffle": "Les ballots ont été mélangé",
152+
"shuffling": "Mélange...",
153+
"statusShuffle": "Les votes ont été mélangé",
152154
"decrypting": "Décryptage...",
153-
"statusDecrypted": "Les ballots ont été décrypté",
155+
"statusDecrypted": "Les votes ont été décrypté",
154156
"statusPubSharesSubmitted": "PubShares ont été soumis",
155157
"combine": "Combiner",
156158
"combining": "Combiné...",
@@ -175,7 +177,7 @@
175177
"successRemoveUser": "Utilisateur supprimé avec succès!",
176178
"errorRemoveUser": "Erreur lors de la suppression de l'utilisateur",
177179
"errorFetchingUsers": "Erreur lors de la récupération des utilisateurs",
178-
"voteFailure": "Votre ballot n'a pas été pris en compte. C'est possible que le sondage a été fermé ou annulé. Essayez de rafraichir la page.",
180+
"voteFailure": "Votre vote n'a pas été pris en compte. C'est possible que le sondage a été fermé ou annulé. Essayez de rafraichir la page.",
179181
"ballotFailure": "Une erreur est survenu lors de l'envoi de votre ballot. Merci de contacter l'administrateur de ce site. ",
180182
"incompleteBallot": "Certaines réponses ne sont pas complète.",
181183
"selectMin": "Selectionnez {{minSelect}} {{singularPlural}}. ",
@@ -192,16 +194,16 @@
192194
"pluralAnswers": "réponses",
193195
"rankRange": "La réponse doit être entre 1 et {{max}}. ",
194196
"castVote": "Voter",
195-
"voteExplanation": "Vous pouvez voter autant de fois que vous le souhaitez tant que le sondage est ouverte. Seul votre dernier vote sera pris en compte.",
197+
"voteExplanation": "Vous pouvez voter autant de fois que vous le souhaitez tant que le sondage est ouvert. Seul votre dernier vote sera pris en compte.",
196198
"noVote": "Il y a actuellement rien à voter.",
197199
"voteAllowed": "Vous êtes autorisés à voter sur les sondages ci-dessous. Cliquez sur le titre d'un sondage pour afficher son bulletin de vote et voter.",
198200
"displayResults": "Les résultats de(s) sondage(s) listé(s) ci-dessous sont disponibles. Clique sur le titre d'un sondage pour y avoir accès.",
199201
"noResultsAvailable": "Il y a actuellement aucuns résultats disponibles.",
200202
"resultExplanation1": "Les résultats des questions sélectives et textuelles sont donnés en pourcentage du nombre de voix pour un candidat divisé par le nombre de bulletins de vote. ",
201203
"resultExplanation2": "Les résultats de la question de classement correspondent au pourcentage de la note d'un candidat. Chaque électeur donne des points aux candidats en les classant de 1 à N (le plus bas est le mieux). ",
202204
"resultExplanation3": "Le score correspond à la somme des points obtenus par un candidat et est divisé par le nombre total de points attribués sur l'ensemble des bulletins, puis soustrait à un",
203-
"shuffle": "Mélangez",
204-
"decrypt": "Décryptez",
205+
"shuffle": "Mélange",
206+
"decrypt": "Décryptage",
205207
"seeResult": "Voir les résultats",
206208
"totalNumberOfVotes": "Nombre total de votes : {{votes}}",
207209
"notEnoughBallot": "L'opération a échoué parce que moins 2 votes ont été enregistré.",
@@ -263,7 +265,12 @@
263265
"actionTextVoter1": "Le sondage n'est pas encore ouvert, vous pouvez revenir plus tard pour voter lorsque ce sera ouvert.",
264266
"actionTextVoter2": "Les résultats du sondage ne sont pas encore disponible.",
265267
"choice": "Choix",
266-
"logoutWarning": "Vous êtes sur le point de vous déconnecter. Êtes vous sûr de vouloir continuer ?",
267-
"continue": "Continuer"
268+
"logoutWarning": "Vous êtes sur le point de vous déconnecter. Si vous êtes en train de remplir un sondage, nous vous suggérons d'exporter le sondage en JSON, sinon vous perdrez vos modifications. Êtes vous sûr de vouloir continuer ?",
269+
"continue": "Continuer",
270+
"hint": "Indication",
271+
"enterHintLg": "Entrer une indication en Anglais (optionnel)",
272+
"enterHintLg1": "Entrer une indication en Français (optionnel)",
273+
"enterHintLg2": "Entrer une indication en Allemand (optionnel)",
274+
"invalidInput": "Entrer s'il vous plaît un nombre entre 1 et {{max}}"
268275
}
269276
}

web/frontend/src/layout/App.tsx

-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@ const App = () => {
4040
let location = useLocation();
4141

4242
const authCtx = useContext(AuthContext);
43-
4443
if (!authCtx.isLogged) {
4544
return <Navigate to={ROUTE_LOGIN} state={{ from: location }} replace />;
4645
} else {

0 commit comments

Comments
 (0)