Skip to content

Commit 7a9197b

Browse files
authored
Merge pull request #70 from covidpass-org/dev
Color selector and translation fixes
2 parents 6dd4a10 + 2c79869 commit 7a9197b

File tree

19 files changed

+161
-106
lines changed

19 files changed

+161
-106
lines changed

components/Colors.tsx

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import React, {useState} from 'react'
2+
import {RadioGroup} from '@headlessui/react'
3+
import {COLORS, rgbToHex} from "../src/colors";
4+
5+
interface ColorsProps {
6+
initialValue: COLORS,
7+
onChange(value: COLORS): void;
8+
}
9+
10+
function Colors(props: ColorsProps): JSX.Element {
11+
let [color, setColor] = useState(props.initialValue)
12+
13+
return (
14+
<RadioGroup<"div", COLORS>
15+
className="flex flex-wrap" value={color}
16+
onChange={function (value) {
17+
setColor(value);
18+
props.onChange(value);
19+
}
20+
}>
21+
{Object.values(COLORS).map((color) => {
22+
return (
23+
<RadioGroup.Option value={color} key={color} className="outline-none">
24+
{({checked}) => (
25+
<div
26+
key={color}
27+
className={`${color !== COLORS.WHITE ? 'ring-white' : 'ring-black'} ring-2 shadow-xl cursor-pointer rounded-md w-10 h-10 flex items-center justify-center m-2`}
28+
style={{backgroundColor: rgbToHex(color), WebkitAppearance: 'none'}}
29+
>
30+
{checked &&
31+
<svg className={`${color !== COLORS.WHITE ? 'text-white' : 'text-black'} h-6 w-6`} fill="none"
32+
viewBox="0 0 24 24" stroke="currentColor">
33+
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth="2.5" d="M5 13l4 4L19 7"/>
34+
</svg>
35+
}
36+
</div>
37+
)}
38+
</RadioGroup.Option>
39+
)
40+
})}
41+
</RadioGroup>
42+
)
43+
}
44+
45+
export default Colors;

components/Form.tsx

Lines changed: 18 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import {saveAs} from 'file-saver';
22
import React, {FormEvent, useEffect, useRef, useState} from "react";
3-
import {BrowserQRCodeReader} from "@zxing/browser";
3+
import {BrowserQRCodeReader, IScannerControls} from "@zxing/browser";
44
import {Result} from "@zxing/library";
55
import {useTranslation} from 'next-i18next';
66
import Link from 'next/link';
@@ -11,15 +11,20 @@ import Check from './Check';
1111
import {PayloadBody} from "../src/payload";
1212
import {getPayloadBodyFromFile, getPayloadBodyFromQR} from "../src/process";
1313
import {PassData} from "../src/pass";
14+
import {COLORS} from "../src/colors";
15+
import Colors from './Colors';
1416

1517
function Form(): JSX.Element {
16-
const { t } = useTranslation(['index', 'errors', 'common']);
18+
const {t} = useTranslation(['index', 'errors', 'common']);
1719

1820
// Whether camera is open or not
1921
const [isCameraOpen, setIsCameraOpen] = useState<boolean>(false);
2022

23+
// Currently selected color
24+
const [selectedColor, setSelectedColor] = useState<COLORS>(COLORS.WHITE);
25+
2126
// Global camera controls
22-
const [globalControls, setGlobalControls] = useState(undefined);
27+
const [globalControls, setGlobalControls] = useState<IScannerControls>(undefined);
2328

2429
// Currently selected QR Code / File. Only one of them is set.
2530
const [qrCode, setQrCode] = useState<Result>(undefined);
@@ -82,7 +87,7 @@ function Form(): JSX.Element {
8287
setErrorMessage('noCameraAccess');
8388
return;
8489
}
85-
90+
8691
// Check if camera device is present
8792
if (deviceList.length == 0) {
8893
setErrorMessage("noCameraFound");
@@ -123,7 +128,7 @@ function Form(): JSX.Element {
123128
event.preventDefault();
124129
setLoading(true);
125130

126-
if(navigator.userAgent.match('CriOS')) {
131+
if (navigator.userAgent.match('CriOS')) {
127132
setErrorMessage('safariSupportOnly');
128133
setLoading(false);
129134
return;
@@ -135,7 +140,7 @@ function Form(): JSX.Element {
135140
return;
136141
}
137142

138-
const color = (document.getElementById('color') as HTMLSelectElement).value;
143+
const color = selectedColor;
139144
let payloadBody: PayloadBody;
140145

141146
try {
@@ -208,24 +213,7 @@ function Form(): JSX.Element {
208213
<div className="space-y-5">
209214
<p>{t('index:pickColorDescription')}</p>
210215
<div className="relative inline-block w-full">
211-
<select name="color" id="color"
212-
className="bg-gray-200 dark:bg-gray-900 focus:outline-none w-full h-10 pl-3 pr-6 text-base rounded-md appearance-none cursor-pointer">
213-
<option value="white">{t('index:colorWhite')}</option>
214-
<option value="black">{t('index:colorBlack')}</option>
215-
<option value="grey">{t('index:colorGrey')}</option>
216-
<option value="green">{t('index:colorGreen')}</option>
217-
<option value="indigo">{t('index:colorIndigo')}</option>
218-
<option value="blue">{t('index:colorBlue')}</option>
219-
<option value="purple">{t('index:colorPurple')}</option>
220-
<option value="teal">{t('index:colorTeal')}</option>
221-
</select>
222-
<div className="absolute inset-y-0 right-0 flex items-center px-2 pointer-events-none">
223-
<svg className="w-5 h-5 fill-current" viewBox="0 0 20 20">
224-
<path
225-
d="M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z"
226-
clipRule="evenodd" fillRule="evenodd"/>
227-
</svg>
228-
</div>
216+
<Colors onChange={setSelectedColor} initialValue={selectedColor}/>
229217
</div>
230218
</div>
231219
}/>
@@ -241,13 +229,13 @@ function Form(): JSX.Element {
241229
</p>
242230
<div>
243231
<ul className="list-none">
244-
<Check text={t('createdOnDevice')}></Check>
245-
<Check text={t('openSourceTransparent')}></Check>
246-
<Check text={t('hostedInEU')}></Check>
232+
<Check text={t('createdOnDevice')}/>
233+
<Check text={t('openSourceTransparent')}/>
234+
<Check text={t('hostedInEU')}/>
247235
</ul>
248236
</div>
249237
<label htmlFor="privacy" className="flex flex-row space-x-4 items-center">
250-
<input type="checkbox" id="privacy" value="privacy" required className="h-4 w-4"/>
238+
<input type="checkbox" id="privacy" value="privacy" required className="h-5 w-5 outline-none"/>
251239
<p>
252240
{t('index:iAcceptThe')}&nbsp;
253241
<Link href="/privacy">
@@ -259,11 +247,11 @@ function Form(): JSX.Element {
259247
</label>
260248
<div className="flex flex-row items-center justify-start">
261249
<button id="download" type="submit"
262-
className="focus:outline-none bg-green-600 py-2 px-3 text-white font-semibold rounded-md disabled:bg-gray-400">
250+
className="focus:outline-none bg-green-600 py-2 px-3 mt-2 text-white font-semibold rounded-md disabled:bg-gray-400">
263251
{t('index:addToWallet')}
264252
</button>
265253
<div id="spin" className={loading ? undefined : "hidden"}>
266-
<svg className="animate-spin h-5 w-5 ml-3" viewBox="0 0 24 24">
254+
<svg className="animate-spin h-5 w-5 ml-4" viewBox="0 0 24 24">
267255
<circle className="opacity-0" cx="12" cy="12" r="10" stroke="currentColor"
268256
strokeWidth="4"/>
269257
<path className="opacity-75" fill="currentColor"

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
"start": "next start"
1010
},
1111
"dependencies": {
12+
"@headlessui/react": "^1.3.0",
1213
"@zxing/browser": "^0.0.9",
1314
"@zxing/library": "^0.18.6",
1415
"base45": "^3.0.0",

public/locales/el/common.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
title: CovidPass
2-
subtitle: Προσθέστε το Ευρωπαϊκό ψηφιακό πιστοποιητικό COVID-19 στην αγαπημένη σας Wallet εφαρμογή.
2+
subtitle: Προσθέστε το Ευρωπαϊκό ψηφιακό πιστοποιητικό COVID-19 στην αγαπημένη σας εφαρμογή Wallet.
33
privacyPolicy: Πολιτική Απορρήτου
44
donate: Χορηγία
55
gitHub: GitHub

public/locales/el/errors.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,4 @@ invalidTestResult: Μη έγκυρο αποτέλεσμα εξέτασης
1717
invalidTestType: Μη έγκυρος τύπος εξέτασης
1818
noCameraAccess: Δεν ήταν δυνατή η πρόσβαση στην κάμερα. Ελέγξτε τα δικαιώματα στις Ρυθμίσεις > Safari > Κάμερα.
1919
noCameraFound: Δεν μπόρεσε να βρει τη φωτογραφική μηχανή.
20-
safariSupportOnly: Στο iOS, χρησιμοποιήστε το πρόγραμμα περιήγησης Safari.
20+
safariSupportOnly: Στο iOS, χρησιμοποιήστε το πρόγραμμα περιήγησης Safari.

public/locales/el/imprint.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,19 @@
11
heading: Πληροφορίες σχετικά με την § 5 του Γερμανικού Telemediengesetz (TMG)
22
contact: Επικοινωνία
3-
euDisputeResolution: Επίλυση Διαφορών στην ΕΕ
3+
euDisputeResolution: Επίλυση διαφορών στην ΕΕ
44
euDisputeResolutionParagraph: |
55
Η Ευρωπαϊκή Επιτροπή παρέχει μια πλατφόρμα για διαδικτυακή επίλυση διαφορών (OS): https://ec.europa.eu/consumers/odr
66
Μπορείτε να βρείτε την διεύθυνση e-mail μας στον παραπάνω σύνδεσμο.
77
consumerDisputeResolution: Επίλυση διαφορών καταναλωτών / Γενική επιτροπή διαιτησίας
88
consumerDisputeResolutionParagraph: Δεν είμαστε πρόθυμοι ή υποχρεωμένοι να συμμετάσχουμε σε διαδικασίες επίλυσης διαφορών ενώπιον κάποιας επιτροπής διαιτησίας για τον καταναλωτή.
9-
liabilityForContents: Ευθύνη για το Περιεχόμενο
9+
liabilityForContents: Ευθύνη για το περιεχόμενο
1010
liabilityForContentsParagraph: |
1111
Ως πάροχος μιας υπηρεσίας, είμαστε υπεύθυνοι για το δικό μας περιεχόμενο σε αυτές τις σελίδες, βάσει της § 7 παράγραφο 1 του TMG και σύμφωνα με τους γενικούς νόμους.
1212
Σύμφωνα με τις §§ 8 έως 10 του TMG, δεν είμαστε υποχρεωμένοι να παρακολουθούμε μεταδιδόμενες ή αποθηκευμένες πληροφορίες ή να διερευνούμε περιπτώσεις που υποδηλώνουν παράνομη δραστηριότητα.
1313
Οι υποχρεώσεις για κατάργηση ή αποκλεισμό της χρήσης πληροφοριών, σύμφωνα με τους γενικούς νόμους, παραμένουν ανεπηρέαστες.
1414
Ωστόσο, η ευθύνη στο θέμα αυτό είναι δυνατή μόνο από τη στιγμή κατά την οποία γίνεται γνωστή κάποια παγειωμένη παράβαση του νόμου.
1515
Αν αντιληφθούμε τέτοιες παραβάσεις, θα καταργήσουμε αμέσως το σχετικό περιεχόμενο.
16-
liabilityForLinks: Ευθύνη για Συνδέσμους
16+
liabilityForLinks: Ευθύνη για τους συνδέσμους
1717
liabilityForLinksParagraph: |
1818
Η υπηρεσία που παρέχουμε περιέχει συνδέσμους προς εξωτερικούς ιστότοπους τρίτων, στα περιεχόμενα των οποίων δεν έχουμε καμία επιρροή.
1919
Επομένως, δεν μπορούμε να αναλάβουμε καμία ευθύνη για αυτά τα περιεχόμενα τρίτων.

public/locales/el/index.yml

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,16 @@ colorWhite: λευκό
1414
colorBlack: μαύρο
1515
colorGrey: γκρι
1616
colorGreen: πράσινο
17-
colorIndigo: σκούρο μωβ
18-
colorBlue: μπλε
19-
colorPurple: ανοικτό μωβ
17+
colorIndigo: μπλε
18+
colorBlue: γαλάζιο
19+
colorPurple: μωβ
2020
colorTeal: τιρκουάζ
2121
addToWallet: Προσθήκη στο Wallet
2222
dataPrivacyDescription: |
2323
Το απόρρητο των δεδομένων αποκτά ιδιαίτερη σημασία κατά την επεξεργασία εκείνων που σχετίζονται με την υγεία.
2424
Για να μπορέσετε να λάβετε μια τεκμηριωμένη απόφαση, παρακαλώ διαβάστε πρώτα την
2525
iAcceptThe: Αποδέχομαι την
2626
privacyPolicy: Πολιτική Απορρήτου
27-
createdOnDevice: Δημιουργήθηκε στη συσκευή σας
28-
OpenSourceTransparent: Ανοιχτού κώδικα και διαφανής
29-
hostedInEU: φιλοξενείται στην ΕΕ
27+
createdOnDevice: Δημιουργείται στη συσκευή σας
28+
openSourceTransparent: Ανοιχτού κώδικα και διαφανής
29+
hostedInEU: Φιλοξενείται στην ΕΕ

public/locales/el/privacy.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ dataPrivacyFaq: συχνές ερωτήσεις (FAQ) για το απόρρητ
2121
contact: Επικοινωνία
2222
email: E-mail
2323
website: Ιστότοπος
24-
process: Απλοποιημένη εξήγηση της διαδικασίας
24+
process: Απλοποιημένη επεξήγηση της διαδικασίας
2525
processFirst: Αρχικά, τα ακόλουθα βήματα λαμβάνουν χώρα τοπικά στο πρόγραμμα περιήγησής σας
2626
processSecond: Δεύτερον, τα ακόλουθα βήματα λαμβάνουν χώρα στον διακομιστή μας
2727
processThird: Τέλος, τα ακόλουθα βήματα λαμβάνουν χώρα τοπικά στο πρόγραμμα περιήγησής σας
@@ -54,4 +54,4 @@ rightsErasure: Δικαίωμα διαγραφής - έχετε το δικαί
5454
rightsRectification: Δικαίωμα διόρθωσης - έχετε το δικαίωμα να διορθώσετε ανακριβή δεδομένα.
5555
rightsPortability: Δικαίωμα φορητότητας δεδομένων - έχετε το δικαίωμα να μεταφέρετε τα δεδομένα σας από ένα σύστημα επεξεργασίας σε άλλο.
5656
thirdParties: Συνδεδεμένοι πάροχοι τρίτων
57-
appleSync: Η Apple δύναται να συγχρονίσει το πάσο σας μέσω του iCloud
57+
appleSync: Η Apple ενδέχεται να συγχρονίσει το πάσο σας μέσω του iCloud

public/locales/it/common.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
title: CovidPass
2-
subtitle: Aggiungi i tuoi certificati digitali europei COVID alle tue app Wallet preferite.
3-
privacyPolicy: Politica sulla Riservatezza
2+
subtitle: Aggiungi i tuoi Certificati COVID Digitali UE alle tue wallet app preferite.
3+
privacyPolicy: Privacy Policy
44
donate: Donazione
55
gitHub: GitHub
6-
imprint: Menzioni legali
6+
imprint: Menzioni legali

public/locales/it/errors.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,20 @@
11
noFileOrQrCode: Perfavore scannerizza un Codice QR, o seleziona un file
22
signatureFailed: Errore durante la firma del pass sul server
3-
decodingFailed: Impossibile decodificare il payload del Codice QR
3+
decodingFailed: Impossibile decodificare il contenuto del codice QR
44
invalidColor: Colore non valido
55
certificateData: Impossibile leggere i dati del certificato
66
nameMissing: Impossibile leggere il nome
77
dobMissing: Impossibile leggere la data di nascita
88
invalidMedicalProduct: Prodotto medico non valido
9-
invalidCountryCode: Codice paese non valido
9+
invalidCountryCode: Codice del paese non valido
1010
invalidManufacturer: Produttore non valido
1111
invalidFileType: Tipo di file non valido
1212
couldNotDecode: Impossibile decodificare il Codice QR dal file
13-
couldNotFindQrCode: Impossibile trovare il Codice QR nel Codice QR fornito dal file
13+
couldNotFindQrCode: Impossibile trovare il Codice QR nel file
1414
invalidQrCode: Codice QR non valido
1515
certificateType: Nessun tipo di certificato valido trovato
1616
invalidTestResult: Risultato del test non valido
1717
invalidTestType: Tipo di test non valido
1818
noCameraAccess: Impossibile accedere alla fotocamera. Controlla le autorizzazioni in Impostazioni > Safari > Fotocamera.
1919
noCameraFound: Impossibile trovare la fotocamera.
20-
safariSupportOnly: Su iOS, usa il browser Safari.
20+
safariSupportOnly: Su iOS, usa il browser Safari.

0 commit comments

Comments
 (0)