aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/App.js35
-rw-r--r--src/components/Settings.js13
-rw-r--r--src/components/WifiCard.js49
-rw-r--r--src/translations.js10
4 files changed, 103 insertions, 4 deletions
diff --git a/src/App.js b/src/App.js
index 8ccf361..ccfa9b6 100644
--- a/src/App.js
+++ b/src/App.js
@@ -18,6 +18,10 @@ function App() {
18 password: '', 18 password: '',
19 // Settings: Network encryption mode 19 // Settings: Network encryption mode
20 encryptionMode: 'WPA', 20 encryptionMode: 'WPA',
21 // Settings: EAP Method
22 eapMethod: 'PWD',
23 // Settings: EAP identity
24 eapIdentity: '',
21 // Settings: Hide password on the printed card 25 // Settings: Hide password on the printed card
22 hidePassword: false, 26 hidePassword: false,
23 // Settings: Mark your network as hidden SSID 27 // Settings: Mark your network as hidden SSID
@@ -28,6 +32,7 @@ function App() {
28 const [errors, setErrors] = useState({ 32 const [errors, setErrors] = useState({
29 ssidError: '', 33 ssidError: '',
30 passwordError: '', 34 passwordError: '',
35 eapIdentityError: '',
31 }); 36 });
32 37
33 const htmlDirection = (languageID) => { 38 const htmlDirection = (languageID) => {
@@ -63,6 +68,26 @@ function App() {
63 }); 68 });
64 return; 69 return;
65 } 70 }
71 if (
72 settings.password.length < 1 &&
73 settings.encryptionMode === 'WPA2-EAP'
74 ) {
75 setErrors({
76 ...errors,
77 passwordError: t('wifi.alert.password'),
78 });
79 return;
80 }
81 if (
82 settings.eapIdentity.length < 1 &&
83 settings.encryptionMode === 'WPA2-EAP'
84 ) {
85 setErrors({
86 ...errors,
87 eapIdentityError: t('wifi.alert.eapIdentity'),
88 });
89 return;
90 }
66 document.title = 'WiFi Card - ' + settings.ssid; 91 document.title = 'WiFi Card - ' + settings.ssid;
67 window.print(); 92 window.print();
68 }; 93 };
@@ -79,6 +104,13 @@ function App() {
79 setErrors({ ...errors, passwordError: '' }); 104 setErrors({ ...errors, passwordError: '' });
80 setSettings({ ...settings, encryptionMode }); 105 setSettings({ ...settings, encryptionMode });
81 }; 106 };
107 const onEapMethodChange = (eapMethod) => {
108 setSettings({ ...settings, eapMethod });
109 };
110 const onEapIdentityChange = (eapIdentity) => {
111 setErrors({ ...errors, eapIdentityError: '' });
112 setSettings({ ...settings, eapIdentity });
113 };
82 const onOrientationChange = (portrait) => { 114 const onOrientationChange = (portrait) => {
83 setSettings({ ...settings, portrait }); 115 setSettings({ ...settings, portrait });
84 }; 116 };
@@ -125,7 +157,9 @@ function App() {
125 settings={settings} 157 settings={settings}
126 ssidError={errors.ssidError} 158 ssidError={errors.ssidError}
127 passwordError={errors.passwordError} 159 passwordError={errors.passwordError}
160 eapIdentityError={errors.eapIdentityError}
128 onSSIDChange={onSSIDChange} 161 onSSIDChange={onSSIDChange}
162 onEapIdentityChange={onEapIdentityChange}
129 onPasswordChange={onPasswordChange} 163 onPasswordChange={onPasswordChange}
130 /> 164 />
131 165
@@ -135,6 +169,7 @@ function App() {
135 onFirstLoad={onFirstLoad} 169 onFirstLoad={onFirstLoad}
136 onLanguageChange={onChangeLanguage} 170 onLanguageChange={onChangeLanguage}
137 onEncryptionModeChange={onEncryptionModeChange} 171 onEncryptionModeChange={onEncryptionModeChange}
172 onEapMethodChange={onEapMethodChange}
138 onOrientationChange={onOrientationChange} 173 onOrientationChange={onOrientationChange}
139 onHidePasswordChange={onHidePasswordChange} 174 onHidePasswordChange={onHidePasswordChange}
140 onHiddenSSIDChange={onHiddenSSIDChange} 175 onHiddenSSIDChange={onHiddenSSIDChange}
diff --git a/src/components/Settings.js b/src/components/Settings.js
index f12fe35..a0dbab5 100644
--- a/src/components/Settings.js
+++ b/src/components/Settings.js
@@ -10,9 +10,10 @@ export const Settings = (props) => {
10 const encryptionModes = [ 10 const encryptionModes = [
11 { label: t('wifi.password.encryption.none'), value: '' }, 11 { label: t('wifi.password.encryption.none'), value: '' },
12 { label: 'WPA/WPA2/WPA3', value: 'WPA' }, 12 { label: 'WPA/WPA2/WPA3', value: 'WPA' },
13 { label: 'WPA2-EAP', value: 'WPA2-EAP' },
13 { label: 'WEP', value: 'WEP' }, 14 { label: 'WEP', value: 'WEP' },
14 ]; 15 ];
15 16 const eapMethods = [{ label: 'PWD', value: 'PWD' }];
16 const langSelectDefaultValue = () => { 17 const langSelectDefaultValue = () => {
17 const t = Translations.filter((t) => t.id === i18n.language); 18 const t = Translations.filter((t) => t.id === i18n.language);
18 if (t.length !== 1) { 19 if (t.length !== 1) {
@@ -68,6 +69,16 @@ export const Settings = (props) => {
68 options={encryptionModes} 69 options={encryptionModes}
69 onChange={(e) => props.onEncryptionModeChange(e.target.value)} 70 onChange={(e) => props.onEncryptionModeChange(e.target.value)}
70 /> 71 />
72 <RadioGroup
73 label={t('wifi.encryption.eapMethod')}
74 size={16}
75 value={props.settings.eapMethod}
76 options={eapMethods}
77 className={`
78 ${props.settings.encryptionMode !== 'WPA2-EAP' && 'hidden'}
79 `}
80 onChange={(e) => props.onEapMethodChange(e.target.value)}
81 />
71 </Pane> 82 </Pane>
72 ); 83 );
73}; 84};
diff --git a/src/components/WifiCard.js b/src/components/WifiCard.js
index 8edf147..35f35a7 100644
--- a/src/components/WifiCard.js
+++ b/src/components/WifiCard.js
@@ -37,9 +37,11 @@ export const WifiCard = (props) => {
37 const password = !props.settings.encryptionMode 37 const password = !props.settings.encryptionMode
38 ? '' 38 ? ''
39 : escape(props.settings.password); 39 : escape(props.settings.password);
40 setQrvalue( 40 const qrval =
41 `WIFI:T:${props.settings.encryptionMode};S:${ssid};P:${password};H:${props.settings.hiddenSSID};` 41 props.settings.encryptionMode === 'WPA2-EAP'
42 ); 42 ? `WIFI:T:${props.settings.encryptionMode};S:${ssid};P:${password};H:${props.settings.hiddenSSID};E:${props.settings.eapMethod};I:${props.settings.eapIdentity};;`
43 : `WIFI:T:${props.settings.encryptionMode};S:${ssid};P:${password};H:${props.settings.hiddenSSID};;`;
44 setQrvalue(qrval);
43 }, [props.settings]); 45 }, [props.settings]);
44 46
45 const portraitWidth = () => { 47 const portraitWidth = () => {
@@ -53,6 +55,15 @@ export const WifiCard = (props) => {
53 return hiddenPassword ? '' : t('wifi.password'); 55 return hiddenPassword ? '' : t('wifi.password');
54 }; 56 };
55 57
58 const eapIdentityFieldLabel = () => {
59 const hiddenIdentity = props.settings.encryptionMode !== 'WPA2-EAP';
60 return hiddenIdentity ? '' : t('wifi.identity');
61 };
62
63 const eapMethodFieldLabel = () => {
64 return !eapIdentityFieldLabel() ? '' : t('wifi.encryption.eapMethod');
65 };
66
56 return ( 67 return (
57 <Pane> 68 <Pane>
58 <Card 69 <Card
@@ -101,6 +112,38 @@ export const WifiCard = (props) => {
101 validationMessage={!!props.ssidError && props.ssidError} 112 validationMessage={!!props.ssidError && props.ssidError}
102 /> 113 />
103 <TextareaField 114 <TextareaField
115 id="eapmethod"
116 type="text"
117 marginBottom={5}
118 readOnly={true}
119 spellCheck={false}
120 className={`
121 ${props.settings.encryptionMode !== 'WPA2-EAP' && 'hidden'}
122 `}
123 label={eapMethodFieldLabel()}
124 value={props.settings.eapMethod}
125 />
126 <TextareaField
127 id="identity"
128 type="text"
129 marginBottom={5}
130 autoComplete="off"
131 autoCorrect="off"
132 autoCapitalize="none"
133 spellCheck={false}
134 className={`
135 ${props.settings.encryptionMode !== 'WPA2-EAP' && 'hidden'}
136 `}
137 label={eapIdentityFieldLabel()}
138 placeholder={t('wifi.identity.placeholder')}
139 value={props.settings.eapIdentity}
140 onChange={(e) => props.onEapIdentityChange(e.target.value)}
141 isInvalid={!!props.eapIdentityError}
142 validationMessage={
143 !!props.eapIdentityError && props.eapIdentityError
144 }
145 />
146 <TextareaField
104 id="password" 147 id="password"
105 type="text" 148 type="text"
106 maxLength="63" 149 maxLength="63"
diff --git a/src/translations.js b/src/translations.js
index 861716d..d9d6fa4 100644
--- a/src/translations.js
+++ b/src/translations.js
@@ -9,6 +9,8 @@ export const Translations = [
9 'desc.privacy': 9 'desc.privacy':
10 'Your WiFi information is never sent to the server. No tracking, analytics, or fingerprinting are used on this website. View the', 10 'Your WiFi information is never sent to the server. No tracking, analytics, or fingerprinting are used on this website. View the',
11 'desc.source': 'source code', 11 'desc.source': 'source code',
12 'wifi.identity': 'Identity',
13 'wifi.identity.placeholder': 'Username',
12 'wifi.login': 'WiFi Login', 14 'wifi.login': 'WiFi Login',
13 'wifi.name': 'Network name', 15 'wifi.name': 'Network name',
14 'wifi.name.hiddenSSID': 'Hidden SSID', 16 'wifi.name.hiddenSSID': 'Hidden SSID',
@@ -18,13 +20,16 @@ export const Translations = [
18 'wifi.password.hide': 'Hide password', 20 'wifi.password.hide': 'Hide password',
19 'wifi.password.encryption': 'Encryption', 21 'wifi.password.encryption': 'Encryption',
20 'wifi.password.encryption.none': 'None', 22 'wifi.password.encryption.none': 'None',
23 'wifi.encryption.eapMethod': 'EAP method',
21 'wifi.tip': 24 'wifi.tip':
22 "Point your phone's camera at the QR Code to connect automatically", 25 "Point your phone's camera at the QR Code to connect automatically",
23 'wifi.alert.name': 'Network name cannot be empty', 26 'wifi.alert.name': 'Network name cannot be empty',
27 'wifi.alert.password': 'Password cannot be empty',
24 'wifi.alert.password.length.5': 28 'wifi.alert.password.length.5':
25 'Password must be at least 5 characters, or change the encryption to "None"', 29 'Password must be at least 5 characters, or change the encryption to "None"',
26 'wifi.alert.password.length.8': 30 'wifi.alert.password.length.8':
27 'Password must be at least 8 characters, or change the encryption to "None"', 31 'Password must be at least 8 characters, or change the encryption to "None"',
32 'wifi.alert.eapIdentity': 'Identity cannot be empty',
28 'button.rotate': 'Rotate', 33 'button.rotate': 'Rotate',
29 'button.print': 'Print', 34 'button.print': 'Print',
30 select: 'Select Language', 35 select: 'Select Language',
@@ -436,6 +441,8 @@ export const Translations = [
436 'desc.privacy': 441 'desc.privacy':
437 'Deine Zugangsdaten werden niemals zum Server gesendet. Es gibt kein Tracking, Analytics, oder Fingerprinting auf dieser Website. Hier geht es zum', 442 'Deine Zugangsdaten werden niemals zum Server gesendet. Es gibt kein Tracking, Analytics, oder Fingerprinting auf dieser Website. Hier geht es zum',
438 'desc.source': 'Quellcode', 443 'desc.source': 'Quellcode',
444 'wifi.identity': 'Identität',
445 'wifi.identity.placeholder': 'Nutzername',
439 'wifi.login': 'WLAN-Zugangsdaten', 446 'wifi.login': 'WLAN-Zugangsdaten',
440 'wifi.name': 'WLAN-Netzwerkname (SSID)', 447 'wifi.name': 'WLAN-Netzwerkname (SSID)',
441 'wifi.name.placeholder': 'WLAN-Netzwerkname (SSID)', 448 'wifi.name.placeholder': 'WLAN-Netzwerkname (SSID)',
@@ -445,13 +452,16 @@ export const Translations = [
445 'wifi.name.hiddenSSID': 'Versteckte SSID', 452 'wifi.name.hiddenSSID': 'Versteckte SSID',
446 'wifi.password.encryption': 'Verschlüsselung', 453 'wifi.password.encryption': 'Verschlüsselung',
447 'wifi.password.encryption.none': 'Keine', 454 'wifi.password.encryption.none': 'Keine',
455 'wifi.encryption.eapMethod': 'EAP Methode',
448 'wifi.tip': 456 'wifi.tip':
449 'Zeige mit der Kamera deines Handys auf den QR-Code, um automatisch eine Verbindung herzustellen', 457 'Zeige mit der Kamera deines Handys auf den QR-Code, um automatisch eine Verbindung herzustellen',
450 'wifi.alert.name': 'Der Netzwerkname darf nicht leer sein', 458 'wifi.alert.name': 'Der Netzwerkname darf nicht leer sein',
459 'wifi.alert.password': 'Das Passwort darf nicht leer sein',
451 'wifi.alert.password.length.5': 460 'wifi.alert.password.length.5':
452 'Das Passwort muss mindestends 5 Zeichen lang sein, oder stelle die Verschlüsselung auf "Keine"', 461 'Das Passwort muss mindestends 5 Zeichen lang sein, oder stelle die Verschlüsselung auf "Keine"',
453 'wifi.alert.password.8': 462 'wifi.alert.password.8':
454 'Das Passwort muss mindestends 8 Zeichen lang sein, oder stelle die Verschlüsselung auf "Keine"', 463 'Das Passwort muss mindestends 8 Zeichen lang sein, oder stelle die Verschlüsselung auf "Keine"',
464 'wifi.alert.eapIdentity': 'Die Identität darf nicht leer sein',
455 'button.rotate': 'Drehen', 465 'button.rotate': 'Drehen',
456 'button.print': 'Drucken', 466 'button.print': 'Drucken',
457 select: 'Sprache auswählen', 467 select: 'Sprache auswählen',