Skip to content

Commit 80cd308

Browse files
Guess passkey name from user agent in livewire starter kits (#170)
* Guess passkey name from user agent * Improve passkey name guessing from user agent --------- Co-authored-by: Wendell Adriel <wendelladriel.ti@gmail.com>
1 parent 6c9ec18 commit 80cd308

4 files changed

Lines changed: 65 additions & 19 deletions

File tree

kits/Inertia/Fortify/React/resources/js/components/passkey-register.tsx

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,21 @@ export default function PasskeyRegistration({ onSuccess }: Props) {
1313
const [name, setName] = useState(() => {
1414
const ua = navigator.userAgent;
1515

16-
const browser = ['Chrome', 'Firefox', 'Safari', 'Edge', 'Opera'].find(
17-
(browser) => new RegExp(browser).test(ua),
18-
);
16+
const browser = [
17+
{ pattern: /Edg|Edge/, name: 'Edge' },
18+
{ pattern: /OPR|Opera|OPiOS/, name: 'Opera' },
19+
{ pattern: /Firefox|FxiOS/, name: 'Firefox' },
20+
{ pattern: /Chrome|CriOS/, name: 'Chrome' },
21+
{ pattern: /Safari/, name: 'Safari' },
22+
].find(({ pattern }) => pattern.test(ua))?.name;
1923

20-
const os = ['iPhone', 'iPad', 'Android', 'Mac', 'Windows'].find((os) =>
21-
new RegExp(os).test(ua),
22-
);
24+
const os = [
25+
{ pattern: /iPhone/, name: 'iPhone' },
26+
{ pattern: /iPad|Macintosh(?=.*Mobile)/, name: 'iPad' },
27+
{ pattern: /Android/, name: 'Android' },
28+
{ pattern: /Mac/, name: 'Mac' },
29+
{ pattern: /Windows/, name: 'Windows' },
30+
].find(({ pattern }) => pattern.test(ua))?.name;
2331

2432
return [browser, os].filter(Boolean).join(' on ') || '';
2533
});

kits/Inertia/Fortify/Svelte/resources/js/components/PasskeyRegister.svelte

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,21 @@
1414
const getDefaultPasskeyName = () => {
1515
const ua = navigator.userAgent;
1616
17-
const browser = ['Chrome', 'Firefox', 'Safari', 'Edge', 'Opera'].find(
18-
(browser) => new RegExp(browser).test(ua),
19-
);
17+
const browser = [
18+
{ pattern: /Edg|Edge/, name: 'Edge' },
19+
{ pattern: /OPR|Opera|OPiOS/, name: 'Opera' },
20+
{ pattern: /Firefox|FxiOS/, name: 'Firefox' },
21+
{ pattern: /Chrome|CriOS/, name: 'Chrome' },
22+
{ pattern: /Safari/, name: 'Safari' },
23+
].find(({ pattern }) => pattern.test(ua))?.name;
2024
21-
const os = ['iPhone', 'iPad', 'Android', 'Mac', 'Windows'].find((os) =>
22-
new RegExp(os).test(ua),
23-
);
25+
const os = [
26+
{ pattern: /iPhone/, name: 'iPhone' },
27+
{ pattern: /iPad|Macintosh(?=.*Mobile)/, name: 'iPad' },
28+
{ pattern: /Android/, name: 'Android' },
29+
{ pattern: /Mac/, name: 'Mac' },
30+
{ pattern: /Windows/, name: 'Windows' },
31+
].find(({ pattern }) => pattern.test(ua))?.name;
2432
2533
return [browser, os].filter(Boolean).join(' on ') || '';
2634
};

kits/Inertia/Fortify/Vue/resources/js/components/PasskeyRegister.vue

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,21 @@ const emit = defineEmits<{
1313
const getDefaultPasskeyName = () => {
1414
const ua = navigator.userAgent;
1515
16-
const browser = ['Chrome', 'Firefox', 'Safari', 'Edge', 'Opera'].find(
17-
(browser) => new RegExp(browser).test(ua),
18-
);
19-
20-
const os = ['iPhone', 'iPad', 'Android', 'Mac', 'Windows'].find((os) =>
21-
new RegExp(os).test(ua),
22-
);
16+
const browser = [
17+
{ pattern: /Edg|Edge/, name: 'Edge' },
18+
{ pattern: /OPR|Opera|OPiOS/, name: 'Opera' },
19+
{ pattern: /Firefox|FxiOS/, name: 'Firefox' },
20+
{ pattern: /Chrome|CriOS/, name: 'Chrome' },
21+
{ pattern: /Safari/, name: 'Safari' },
22+
].find(({ pattern }) => pattern.test(ua))?.name;
23+
24+
const os = [
25+
{ pattern: /iPhone/, name: 'iPhone' },
26+
{ pattern: /iPad|Macintosh(?=.*Mobile)/, name: 'iPad' },
27+
{ pattern: /Android/, name: 'Android' },
28+
{ pattern: /Mac/, name: 'Mac' },
29+
{ pattern: /Windows/, name: 'Windows' },
30+
].find(({ pattern }) => pattern.test(ua))?.name;
2331
2432
return [browser, os].filter(Boolean).join(' on ') || '';
2533
};

kits/Livewire/Fortify/resources/views/components/passkey-registration.blade.php

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,29 @@
1212
updateSupport() {
1313
this.supported = Boolean(window.Passkeys?.isSupported());
1414
},
15+
getDefaultPasskeyName() {
16+
const ua = navigator.userAgent;
17+
18+
const browser = [
19+
{ pattern: /Edg|Edge/, name: 'Edge' },
20+
{ pattern: /OPR|Opera|OPiOS/, name: 'Opera' },
21+
{ pattern: /Firefox|FxiOS/, name: 'Firefox' },
22+
{ pattern: /Chrome|CriOS/, name: 'Chrome' },
23+
{ pattern: /Safari/, name: 'Safari' },
24+
].find(({ pattern }) => pattern.test(ua))?.name;
25+
26+
const os = [
27+
{ pattern: /iPhone/, name: 'iPhone' },
28+
{ pattern: /iPad|Macintosh(?=.*Mobile)/, name: 'iPad' },
29+
{ pattern: /Android/, name: 'Android' },
30+
{ pattern: /Mac/, name: 'Mac' },
31+
{ pattern: /Windows/, name: 'Windows' },
32+
].find(({ pattern }) => pattern.test(ua))?.name;
33+
34+
return [browser, os].filter(Boolean).join(' on ') || '';
35+
},
1536
init() {
37+
this.name = this.getDefaultPasskeyName();
1638
this.updateSupport();
1739
1840
window.addEventListener('passkeys:ready', () => this.updateSupport(), { once: true });

0 commit comments

Comments
 (0)