diff --git a/components/Button.tsx b/components/Button.tsx index b8326d4..e8f2bf1 100644 --- a/components/Button.tsx +++ b/components/Button.tsx @@ -1,41 +1,28 @@ interface ButtonProps { text?: string, icon?: string, - onClick?: () => void, loading?: boolean, - type?: ButtonType, -} - -export enum ButtonType { - submit = 'submit', - button = 'button', -} - -Button.defaultProps = { - loading: false, - type: ButtonType.button, + onClick: () => void, } function Button(props: ButtonProps): JSX.Element { + + function handleTouchEnd(event: React.TouchEvent) { + event.preventDefault(); + event.stopPropagation(); + + props.onClick(); + } + return ( ) diff --git a/components/Form.tsx b/components/Form.tsx index 7cb9937..0261e64 100644 --- a/components/Form.tsx +++ b/components/Form.tsx @@ -13,7 +13,7 @@ import {getPayloadBodyFromFile, getPayloadBodyFromQR} from "../src/process"; import {PassData} from "../src/pass"; import {COLORS} from "../src/colors"; import Colors from './Colors'; -import Button, { ButtonType } from './Button'; +import Button from './Button'; function Form(): JSX.Element { const {t} = useTranslation(['index', 'errors', 'common']); @@ -278,7 +278,19 @@ function Form(): JSX.Element {

-
}/> diff --git a/next-i18next.config.js b/next-i18next.config.js index 79cb280..aabd38a 100644 --- a/next-i18next.config.js +++ b/next-i18next.config.js @@ -12,7 +12,8 @@ module.exports = { 'es', 'es-ES', 'no', 'no-NO', 'nb', 'nb-NO', - 'sv', 'sv-SE', 'sv-FI' + 'sv', 'sv-SE', 'sv-FI', + 'ro', 'ro-RO', 'ro-MD' ], localeExtension: 'yml', }, diff --git a/next.config.js b/next.config.js index 63a0bc9..ddf6dfb 100644 --- a/next.config.js +++ b/next.config.js @@ -2,4 +2,12 @@ const {i18n} = require('./next-i18next.config'); module.exports = { i18n, + async rewrites() { + return [ + { + source: '/pass/note', + destination: '/pass' + } + ]; + } }; \ No newline at end of file diff --git a/pages/imprint.tsx b/pages/imprint.tsx index 6592cef..8de5537 100644 --- a/pages/imprint.tsx +++ b/pages/imprint.tsx @@ -12,7 +12,11 @@ function Imprint(): JSX.Element {

{t('imprint:heading')}

-

Marvin Sextro

+

+ Marvin Sextro
+ Kopenhagener Straße 45
+ 10437 Berlin +

{t('imprint:contact')}

covidpass@marvinsextro.de diff --git a/pages/pass.tsx b/pages/pass.tsx index 1af5b0a..3f393cc 100644 --- a/pages/pass.tsx +++ b/pages/pass.tsx @@ -1,47 +1,55 @@ +import {useTranslation} from 'next-i18next'; import {serverSideTranslations} from 'next-i18next/serverSideTranslations'; import React, {useEffect, useState} from "react"; import QRCode from "react-qr-code"; +import Alert from '../components/Alert'; import Card from '../components/Card'; import Logo from "../components/Logo"; function Pass(): JSX.Element { - const [fragment, setFragment] = useState(undefined); + const { t } = useTranslation(['common', 'index']); - function closeViewer() { - setFragment(undefined); - window.location.replace('/'); - } + const [fragment, setFragment] = useState(undefined); + const [view, setView] = useState(true); useEffect(() => { const rawFragment = window.location.hash.substring(1); - const decodedFragment = Buffer.from(rawFragment, 'base64').toString(); - setFragment(decodedFragment); - document.addEventListener('visibilitychange', () => { - if (document.hidden) { - closeViewer(); + if (!rawFragment) { + setView(false); + } + + const resizeTimeout = window.setTimeout(() => { + if (rawFragment) { + window.location.replace('/pass/note'); } - }); + }, 200); - window.addEventListener('blur', closeViewer); - window.addEventListener('beforeunload', closeViewer); - window.addEventListener('pagehide', closeViewer); + window.addEventListener('resize', () => { + clearTimeout(resizeTimeout); + const decodedFragment = Buffer.from(rawFragment, 'base64').toString(); + setFragment(decodedFragment); + }); }, []); return ( -

+
{ fragment && - +
} /> } + { + !view && + + }
) @@ -50,7 +58,7 @@ function Pass(): JSX.Element { export async function getStaticProps({ locale }) { return { props: { - ...(await serverSideTranslations(locale, ['common'])), + ...(await serverSideTranslations(locale, ['index', 'common'])), }, }; } diff --git a/public/locales/de/index.yml b/public/locales/de/index.yml index f2ff103..b821e23 100644 --- a/public/locales/de/index.yml +++ b/public/locales/de/index.yml @@ -25,4 +25,5 @@ privacyPolicy: Datenschutzerklärung createdOnDevice: Auf Deinem Gerät erstellt openSourceTransparent: Open Source und transparent hostedInEU: In der EU gehostet -share: Weiterempfehlen \ No newline at end of file +share: Weiterempfehlen +viewerNote: Bitte drücke und halte den Link auf der Rückseite des Passes, um den QR Code unter iOS vergrößert anzuzeigen. \ No newline at end of file diff --git a/public/locales/en/index.yml b/public/locales/en/index.yml index f579821..9279691 100644 --- a/public/locales/en/index.yml +++ b/public/locales/en/index.yml @@ -25,4 +25,5 @@ privacyPolicy: Privacy Policy createdOnDevice: Created on your device openSourceTransparent: Open source and transparent hostedInEU: Hosted in the EU -share: Share \ No newline at end of file +share: Share +viewerNote: Please press and hold the link on the back of the pass in order to enlarge the QR code on iOS. \ No newline at end of file diff --git a/public/locales/ro-MD b/public/locales/ro-MD new file mode 120000 index 0000000..d89a6ef --- /dev/null +++ b/public/locales/ro-MD @@ -0,0 +1 @@ +ro \ No newline at end of file diff --git a/public/locales/ro-RO b/public/locales/ro-RO new file mode 120000 index 0000000..d89a6ef --- /dev/null +++ b/public/locales/ro-RO @@ -0,0 +1 @@ +ro \ No newline at end of file diff --git a/public/locales/ro/common.yml b/public/locales/ro/common.yml new file mode 100644 index 0000000..3b0cab7 --- /dev/null +++ b/public/locales/ro/common.yml @@ -0,0 +1,6 @@ +title: CovidPass +subtitle: Adaugă-ți Certificatul UE Covid in aplicația ta preferată de wallet. +privacyPolicy: Politica de Confidențialitate +donate: Donează +gitHub: GitHub +imprint: Mențiuni Legale \ No newline at end of file diff --git a/public/locales/ro/errors.yml b/public/locales/ro/errors.yml new file mode 100644 index 0000000..9e40e51 --- /dev/null +++ b/public/locales/ro/errors.yml @@ -0,0 +1,20 @@ +noFileOrQrCode: Te rog scaneaza un cod QR, sau alege un fisier +signatureFailed: Eroare in timpul semnarii certificatului pe server +decodingFailed: Imposibil de decodat continutul codului QR +invalidColor: Culoare Invalida +certificateData: Eroare in citirea datelor certificatului +nameMissing: Eroare in citirea numelui +dobMissing: Eroare in citirea datei de nastere +invalidMedicalProduct: Produs medical (Vaccin) invalid +invalidCountryCode: Codul tarii este invalid +invalidManufacturer: Fabricant invalid +invalidFileType: Tipul fisierului invalid +couldNotDecode: Eroare in decodarea codului QR din fisier +couldNotFindQrCode: Nu s-a gasit niciun cod QR valid in fisierul selectat +invalidQrCode: Cod QR invalid +certificateType: Tipul certificatului este invalid +invalidTestResult: Rezultatul testului este invalid +invalidTestType: Tipul testului este invalid +noCameraAccess: Nu s-a putut accesa camera. Schimbati permisiunile in Setari > Safari > Camera. +noCameraFound: Nu s-a putut accesa camera. +safariSupportOnly: in iOS, va rog sa folositi doar browser-ul safari. \ No newline at end of file diff --git a/public/locales/ro/imprint.yml b/public/locales/ro/imprint.yml new file mode 100644 index 0000000..41d5088 --- /dev/null +++ b/public/locales/ro/imprint.yml @@ -0,0 +1,27 @@ +heading: Informații conform articolului 5 TMG +contact: Contact +euDisputeResolution: Soluționarea Disputelor UE +euDisputeResolutionParagraph: | + Comisia Europeana dispune de o platforma pentru soluționarea disputelor online (OS) https://ec.europa.eu/consumers/odr. + Ne puteți găsi adresa de email in datele de mai sus. +consumerDisputeResolution: Rezolvarea litigiilor consumatorilor / comisia universală de arbitraj +consumerDisputeResolutionParagraph: Nu suntem dispuși sau obligați să participăm la procedurile de soluționare a litigiilor în fața unei comisii de arbitraj pentru consumatori. +liabilityForContents: Raspunderea pentru continut +liabilityForContentsParagraph: | + În calitate de furnizori de servicii, suntem responsabili pentru conținutul propriu în conformitate cu articolul 7 paragraful 1 TMG în conformitate cu legile generale. + Conform secțiunilor 8 până la 10, nu suntem obligați să monitorizăm informațiile transmise sau stocate sau să investigăm circumstanțe care indică o activitate ilegală. + Obligațiile de a elimina sau de a bloca utilizarea informațiilor conform legilor generale rămân neafectate. + Cu toate acestea, răspunderea în această privința este posibilă numai din momentul în care devine cunoscută o încălcare concretă a legii. + Dacă aflăm de existența unor asemenea încălcări, vom elimina imediat conținutul relevant. +liabilityForLinks: Raspunderea pentru linkuri +liabilityForLinksParagraph: | + Oferta noastră conține link-uri către site-uri externe ale terților, asupra cărora nu avem nicio influență. + Prin urmare, nu ne putem asuma nicio răspundere pentru aceste conținuturi externe. + Furnizorul sau operatorul respectiv al site-urilor este întotdeauna responsabil pentru conținutul site-urilor mentionate. + Paginile conectate au fost verificate pentru posibile încălcări legale la momentul punerii link-ului. + Conținuturile ilegale nu erau recunoscute în momentul punerii link-urilor. + Cu toate acestea, un control permanent al conținutului paginilor linkate nu este rezonabil fără dovezi concrete ale unei încălcări a legii. + Dacă aflăm că există încălcări, vom elimina imediat astfel de legături. +credits: Credite +creditsSource: Cu extrase din https://www.e-recht24.de/impressum-generator.html +creditsTranslation: Tradus cu https://www.DeepL.com/Translator (free version) \ No newline at end of file diff --git a/public/locales/ro/index.yml b/public/locales/ro/index.yml new file mode 100644 index 0000000..6724fa6 --- /dev/null +++ b/public/locales/ro/index.yml @@ -0,0 +1,28 @@ +iosHint: In iOS, te rog foloseste browser-ul Safari. +errorClose: Inchide +selectCertificate: Alege certificatul +selectCertificateDescription: Te rog scaneaza codul QR de pe certificatul tau sau alege un screenshot/PDF cu codul QR +stopCamera: Opreste Camera +startCamera: Porneste Camera +openFile: Selecteaza fisierul +foundQrCode: Cod QR detectat! +pickColor: Alege o culoare +pickColorDescription: Alege o culoare de fundal pentru certificatul tau. +colorWhite: alb +colorBlack: negru +colorGrey: gri +colorGreen: verde +colorIndigo: indigo +colorBlue: albastru +colorPurple: mov +colorTeal: teal +addToWallet: Adauga in Wallet +dataPrivacyDescription: | + Confidentialitatea datelor este de o importanta speciala cand vine vorba de date medicale. + Pentru a face o alegere informata, va rugam cititi +iAcceptThe: Sunt de acord cu +privacyPolicy: Politica de Confidentialitate +createdOnDevice: Creat pe dispozitivul tau +openSourceTransparent: Open source si transparent +hostedInEU: Gazduit in UE +share: Distribuie \ No newline at end of file diff --git a/public/locales/ro/privacy.yml b/public/locales/ro/privacy.yml new file mode 100644 index 0000000..1ec51c7 --- /dev/null +++ b/public/locales/ro/privacy.yml @@ -0,0 +1,57 @@ +gdprNotice: | + Politica noastră de confidențialitate se bazează pe termenii folosiți de legiuitorul european + pentru adoptarea Regulamentului general privind protecția datelor (GDPR). +generalInfo: Informații Generale +generalInfoProcess: | + Întregul proces de generare a fișierului de Wallet are loc local în browserul dvs. + Pentru pasul de semnare (certificare), doar o reprezentare hashed (codata ireversibil) a datelor dvs. este trimisă către server. +generalInfoStoring: Datele dumneavoastră nu sunt stocate dincolo de sesiunea activă a browserului, iar site-ul nu utilizează cookie-uri. +generalInfoThirdParties: Nu sunt trimise date catre părți terțe. +generalInfoHttps: Datele sunt transmise în mod securizat prin https. +generalInfoLocation: Serverele noastre sunt găzduite in Nuremberg, Germania. +generalInfoGitHub: Codul sursă al acestui site este accesibil pe +generalInfoLockScreen: În mod normal, cardurile din Apple Wallet sunt accesibile de pe lock screen. Puteți schimba acest lucru in +settings: setări +generalInfoProvider: | + Furnizorul de server prelucrează date pentru a furniza acest site. + Pentru a înțelege mai bine ce măsuri iau aceștia pentru a vă proteja datele, vă rugăm să citiți și pe partea lor +privacyPolicy: Politica de Confidențialitate +andThe: și +dataPrivacyFaq: Întrebari puse des despre confidențialitate +contact: Contact +email: Email +website: Website +process: Explicație simplificata a procesului +processFirst: În primul rând, următorii pași au loc local în browserul dvs +processSecond: În al doilea rând, următorii pași au loc pe serverul nostru +processThird: În cele din urmă, următorii pași au loc local în browserul dvs +processRecognizing: Recunoașterea și extragerea datelor codului QR din certificatul selectat +processDecoding: Decodificarea datelor dvs. personale și medicale din încărcarea codului QR +processAssembling: Asamblarea unui fișier de Wallet incomplet din datele dvs +processGenerating: Generarea unui fișier care conține hash-uri ale datelor stocate în fișierul wallet +processSending: Trimiterea doar fișierul care conține hash-urile către serverul nostru +processReceiving: Primirea și verificarea hashurilor care au fost generate local +processSigning: Semnarea fișierului care conține hashurile +processSendingBack: Trimiterea semnăturii înapoi +processCompleting: Asamblarea fișierului wallet semnat din fișierul incomplet generat local și semnătura +processSaving: Salvarea fisierului pe dispozitiv +locallyProcessedData: Date procesate local +the: +schema: Schema Certificatului Digital Covid +specification: contine o schema complete cu datele care sunt continute de codul QR al certificatului covid si care vor fi procesate in browser. +serverProvider: Furnizorul de Servere +serverProviderIs: Furnizorul nostru de servere este +logFiles: Următoarele date pot fi colectate și stocate în fișierele jurnal ale serverului +logFilesBrowser: Tipurile și versiunile de browser utilizate +logFilesOs: Sistemul de operare utilizat de sistemul de accesare +logFilesReferrer: Site-ul web de pe care un sistem de accesare ajunge pe site-ul nostru web (așa-numiții recomandanți) +logFilesTime: Data și ora accesului +logFilesIpAddress: Adresele IP pseudonimizate +rights: Drepturile tale +rightsGranted: În conformitate cu GDPR, aveți următoarele drepturi +rightsAccess: Dreptul de acces la datele dumneavoastră; Ai dreptul să știi ce date au fost colectate despre tine și cum au fost prelucrate. +rightsErasure: Dreptul de a fi uitat; Ștergerea datelor dumneavoastră personale. +rightsRectification: Dreptul de rectificare; Aveți dreptul de a corecta datele eronate. +rightsPortability: Dreptul la portabilitatea datelor; Aveți dreptul să vă transferați datele dintr-un sistem de procesare în altul. +thirdParties: Părți terțe +appleSync: Este posibil ca Apple să vă sincronizeze cardurile wallet prin iCloud \ No newline at end of file diff --git a/public/robots.txt b/public/robots.txt new file mode 100644 index 0000000..51ff80b --- /dev/null +++ b/public/robots.txt @@ -0,0 +1,3 @@ +User-agent: * +Disallow: /pass +Disallow: /pass/note \ No newline at end of file diff --git a/src/payload.ts b/src/payload.ts index 7500bbc..5eedbe7 100644 --- a/src/payload.ts +++ b/src/payload.ts @@ -142,7 +142,7 @@ export class Payload { { key: "enlarge", label: "Enlarging the QR Code", - value: `Inside the Wallet app on iOS, press and hold or open the link below. This does not work when accessing the Wallet by double-clicking the side button.\nEnlarge QR Code` + value: `Inside the Wallet app on iOS, press and hold the link below. This does not work when accessing the Wallet by double-clicking the side button.\nEnlarge QR Code` }, { key: "uvci",