@oxyhq/core 12.1.1 → 12.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/.tsbuildinfo +1 -1
- package/dist/cjs/i18n/locales/ar-SA.json +4 -1
- package/dist/cjs/i18n/locales/ca-ES.json +4 -1
- package/dist/cjs/i18n/locales/de-DE.json +4 -1
- package/dist/cjs/i18n/locales/en-US.json +4 -1
- package/dist/cjs/i18n/locales/es-ES.json +4 -1
- package/dist/cjs/i18n/locales/fr-FR.json +4 -1
- package/dist/cjs/i18n/locales/it-IT.json +4 -1
- package/dist/cjs/i18n/locales/ja-JP.json +4 -1
- package/dist/cjs/i18n/locales/ko-KR.json +4 -1
- package/dist/cjs/i18n/locales/locales/ar-SA.json +4 -1
- package/dist/cjs/i18n/locales/locales/ca-ES.json +4 -1
- package/dist/cjs/i18n/locales/locales/de-DE.json +4 -1
- package/dist/cjs/i18n/locales/locales/en-US.json +4 -1
- package/dist/cjs/i18n/locales/locales/es-ES.json +4 -1
- package/dist/cjs/i18n/locales/locales/fr-FR.json +4 -1
- package/dist/cjs/i18n/locales/locales/it-IT.json +4 -1
- package/dist/cjs/i18n/locales/locales/ja-JP.json +4 -1
- package/dist/cjs/i18n/locales/locales/ko-KR.json +4 -1
- package/dist/cjs/i18n/locales/locales/pt-PT.json +4 -1
- package/dist/cjs/i18n/locales/locales/zh-CN.json +4 -1
- package/dist/cjs/i18n/locales/pt-PT.json +4 -1
- package/dist/cjs/i18n/locales/zh-CN.json +4 -1
- package/dist/cjs/session/accountDialogController.js +112 -2
- package/dist/esm/.tsbuildinfo +1 -1
- package/dist/esm/i18n/locales/ar-SA.json +4 -1
- package/dist/esm/i18n/locales/ca-ES.json +4 -1
- package/dist/esm/i18n/locales/de-DE.json +4 -1
- package/dist/esm/i18n/locales/en-US.json +4 -1
- package/dist/esm/i18n/locales/es-ES.json +4 -1
- package/dist/esm/i18n/locales/fr-FR.json +4 -1
- package/dist/esm/i18n/locales/it-IT.json +4 -1
- package/dist/esm/i18n/locales/ja-JP.json +4 -1
- package/dist/esm/i18n/locales/ko-KR.json +4 -1
- package/dist/esm/i18n/locales/locales/ar-SA.json +4 -1
- package/dist/esm/i18n/locales/locales/ca-ES.json +4 -1
- package/dist/esm/i18n/locales/locales/de-DE.json +4 -1
- package/dist/esm/i18n/locales/locales/en-US.json +4 -1
- package/dist/esm/i18n/locales/locales/es-ES.json +4 -1
- package/dist/esm/i18n/locales/locales/fr-FR.json +4 -1
- package/dist/esm/i18n/locales/locales/it-IT.json +4 -1
- package/dist/esm/i18n/locales/locales/ja-JP.json +4 -1
- package/dist/esm/i18n/locales/locales/ko-KR.json +4 -1
- package/dist/esm/i18n/locales/locales/pt-PT.json +4 -1
- package/dist/esm/i18n/locales/locales/zh-CN.json +4 -1
- package/dist/esm/i18n/locales/pt-PT.json +4 -1
- package/dist/esm/i18n/locales/zh-CN.json +4 -1
- package/dist/esm/session/accountDialogController.js +112 -2
- package/dist/types/.tsbuildinfo +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/session/accountDialogController.d.ts +81 -1
- package/package.json +4 -4
- package/src/i18n/locales/ar-SA.json +4 -1
- package/src/i18n/locales/ca-ES.json +4 -1
- package/src/i18n/locales/de-DE.json +4 -1
- package/src/i18n/locales/en-US.json +4 -1
- package/src/i18n/locales/es-ES.json +4 -1
- package/src/i18n/locales/fr-FR.json +4 -1
- package/src/i18n/locales/it-IT.json +4 -1
- package/src/i18n/locales/ja-JP.json +4 -1
- package/src/i18n/locales/ko-KR.json +4 -1
- package/src/i18n/locales/pt-PT.json +4 -1
- package/src/i18n/locales/zh-CN.json +4 -1
- package/src/index.ts +1 -0
- package/src/session/__tests__/accountDialogController.test.ts +133 -1
- package/src/session/accountDialogController.ts +145 -2
|
@@ -50,6 +50,8 @@
|
|
|
50
50
|
}
|
|
51
51
|
},
|
|
52
52
|
"signup": {
|
|
53
|
+
"title": "أنشئ حسابك",
|
|
54
|
+
"subtitle": "هوية واحدة لكل النظام البيئي.",
|
|
53
55
|
"commonsHeadline": "أنشئ هويتك في Commons",
|
|
54
56
|
"commonsExplainer": "Commons هي هوية Oxy الخاصة بك بحفظ ذاتي كامل — تطبيق واحد يعمل في كل مكان.",
|
|
55
57
|
"createInCommons": "أنشئ هويتك في Commons",
|
|
@@ -61,7 +63,8 @@
|
|
|
61
63
|
"usernameAvailable": "متاح",
|
|
62
64
|
"usernameTaken": "اسم المستخدم هذا مستخدم بالفعل",
|
|
63
65
|
"backToSignInLink": "لديك حساب بالفعل؟ سجّل الدخول",
|
|
64
|
-
"
|
|
66
|
+
"hubExplainer": "أنشئ هوية Oxy الخاصة بك في نافذة آمنة، ثم عد إلى هنا مباشرة.",
|
|
67
|
+
"continueInWindow": "المتابعة في نافذة جديدة",
|
|
65
68
|
"welcome": {
|
|
66
69
|
"title": "مرحبًا بك في Oxy!",
|
|
67
70
|
"subtitle": "أنشئ حسابك في خطوات قليلة",
|
|
@@ -50,6 +50,8 @@
|
|
|
50
50
|
}
|
|
51
51
|
},
|
|
52
52
|
"signup": {
|
|
53
|
+
"title": "Crea el teu compte",
|
|
54
|
+
"subtitle": "Una identitat per a tot l'ecosistema.",
|
|
53
55
|
"commonsHeadline": "Crea la teva identitat a Commons",
|
|
54
56
|
"commonsExplainer": "Commons és la teva identitat d'Oxy amb autocustòdia completa: una app que funciona a tot arreu.",
|
|
55
57
|
"createInCommons": "Crea la teva identitat a Commons",
|
|
@@ -61,7 +63,8 @@
|
|
|
61
63
|
"usernameAvailable": "Disponible",
|
|
62
64
|
"usernameTaken": "Aquest nom d'usuari ja està en ús",
|
|
63
65
|
"backToSignInLink": "Ja tens compte? Inicia sessió",
|
|
64
|
-
"
|
|
66
|
+
"hubExplainer": "Crea la teva Oxy ID en una finestra segura i torna de seguida.",
|
|
67
|
+
"continueInWindow": "Continua en una finestra nova",
|
|
65
68
|
"welcome": {
|
|
66
69
|
"title": "Benvingut a Oxy!",
|
|
67
70
|
"subtitle": "Crea el teu compte en pocs passos",
|
|
@@ -50,6 +50,8 @@
|
|
|
50
50
|
}
|
|
51
51
|
},
|
|
52
52
|
"signup": {
|
|
53
|
+
"title": "Erstellen Sie Ihr Konto",
|
|
54
|
+
"subtitle": "Eine Identität für das gesamte Ökosystem.",
|
|
53
55
|
"commonsHeadline": "Erstellen Sie Ihre Identität in Commons",
|
|
54
56
|
"commonsExplainer": "Commons ist Ihre vollständig selbstverwaltete Oxy-Identität – eine App, überall einsetzbar.",
|
|
55
57
|
"createInCommons": "Erstellen Sie Ihre Identität in Commons",
|
|
@@ -61,7 +63,8 @@
|
|
|
61
63
|
"usernameAvailable": "Verfügbar",
|
|
62
64
|
"usernameTaken": "Dieser Benutzername ist bereits vergeben",
|
|
63
65
|
"backToSignInLink": "Sie haben bereits ein Konto? Anmelden",
|
|
64
|
-
"
|
|
66
|
+
"hubExplainer": "Erstellen Sie Ihre Oxy-ID in einem sicheren Fenster und kehren Sie dann direkt zurück.",
|
|
67
|
+
"continueInWindow": "In einem neuen Fenster fortfahren",
|
|
65
68
|
"welcome": {
|
|
66
69
|
"title": "Willkommen bei Oxy!",
|
|
67
70
|
"subtitle": "Erstellen Sie Ihr Konto in nur wenigen Schritten",
|
|
@@ -57,6 +57,8 @@
|
|
|
57
57
|
}
|
|
58
58
|
},
|
|
59
59
|
"signup": {
|
|
60
|
+
"title": "Create your account",
|
|
61
|
+
"subtitle": "One identity for the whole ecosystem.",
|
|
60
62
|
"commonsHeadline": "Create your identity in Commons",
|
|
61
63
|
"commonsExplainer": "Commons is your full self-custody Oxy identity — one app, works everywhere.",
|
|
62
64
|
"createInCommons": "Create your identity in Commons",
|
|
@@ -68,7 +70,8 @@
|
|
|
68
70
|
"usernameAvailable": "Available",
|
|
69
71
|
"usernameTaken": "This username is taken",
|
|
70
72
|
"backToSignInLink": "Already have an account? Sign in",
|
|
71
|
-
"
|
|
73
|
+
"hubExplainer": "Create your Oxy ID in a secure window, then come right back.",
|
|
74
|
+
"continueInWindow": "Continue in a new window",
|
|
72
75
|
"welcome": {
|
|
73
76
|
"title": "Welcome to Oxy!",
|
|
74
77
|
"subtitle": "Let's create your account in just a few steps",
|
|
@@ -57,6 +57,8 @@
|
|
|
57
57
|
}
|
|
58
58
|
},
|
|
59
59
|
"signup": {
|
|
60
|
+
"title": "Crea tu cuenta",
|
|
61
|
+
"subtitle": "Una identidad para todo el ecosistema.",
|
|
60
62
|
"commonsHeadline": "Crea tu identidad en Commons",
|
|
61
63
|
"commonsExplainer": "Commons es tu identidad de Oxy con autocustodia completa: una app que funciona en todas partes.",
|
|
62
64
|
"createInCommons": "Crea tu identidad en Commons",
|
|
@@ -68,7 +70,8 @@
|
|
|
68
70
|
"usernameAvailable": "Disponible",
|
|
69
71
|
"usernameTaken": "Este usuario ya está en uso",
|
|
70
72
|
"backToSignInLink": "¿Ya tienes cuenta? Inicia sesión",
|
|
71
|
-
"
|
|
73
|
+
"hubExplainer": "Crea tu Oxy ID en una ventana segura y vuelve enseguida.",
|
|
74
|
+
"continueInWindow": "Continuar en una ventana nueva",
|
|
72
75
|
"welcome": {
|
|
73
76
|
"title": "¡Te damos la bienvenida a Oxy!",
|
|
74
77
|
"subtitle": "Crea tu cuenta en pocos pasos",
|
|
@@ -50,6 +50,8 @@
|
|
|
50
50
|
}
|
|
51
51
|
},
|
|
52
52
|
"signup": {
|
|
53
|
+
"title": "Créez votre compte",
|
|
54
|
+
"subtitle": "Une seule identité pour tout l'écosystème.",
|
|
53
55
|
"commonsHeadline": "Créez votre identité dans Commons",
|
|
54
56
|
"commonsExplainer": "Commons est votre identité Oxy en autoconservation complète : une seule app, partout.",
|
|
55
57
|
"createInCommons": "Créez votre identité dans Commons",
|
|
@@ -61,7 +63,8 @@
|
|
|
61
63
|
"usernameAvailable": "Disponible",
|
|
62
64
|
"usernameTaken": "Ce nom d'utilisateur est déjà pris",
|
|
63
65
|
"backToSignInLink": "Vous avez déjà un compte ? Connectez-vous",
|
|
64
|
-
"
|
|
66
|
+
"hubExplainer": "Créez votre Oxy ID dans une fenêtre sécurisée, puis revenez directement.",
|
|
67
|
+
"continueInWindow": "Continuer dans une nouvelle fenêtre",
|
|
65
68
|
"welcome": {
|
|
66
69
|
"title": "Bienvenue sur Oxy !",
|
|
67
70
|
"subtitle": "Créez votre compte en quelques étapes",
|
|
@@ -50,6 +50,8 @@
|
|
|
50
50
|
}
|
|
51
51
|
},
|
|
52
52
|
"signup": {
|
|
53
|
+
"title": "Crea il tuo account",
|
|
54
|
+
"subtitle": "Un'unica identità per tutto l'ecosistema.",
|
|
53
55
|
"commonsHeadline": "Crea la tua identità in Commons",
|
|
54
56
|
"commonsExplainer": "Commons è la tua identità Oxy in piena autocustodia: un'unica app, ovunque.",
|
|
55
57
|
"createInCommons": "Crea la tua identità in Commons",
|
|
@@ -61,7 +63,8 @@
|
|
|
61
63
|
"usernameAvailable": "Disponibile",
|
|
62
64
|
"usernameTaken": "Questo nome utente è già in uso",
|
|
63
65
|
"backToSignInLink": "Hai già un account? Accedi",
|
|
64
|
-
"
|
|
66
|
+
"hubExplainer": "Crea il tuo Oxy ID in una finestra sicura, poi torna subito qui.",
|
|
67
|
+
"continueInWindow": "Continua in una nuova finestra",
|
|
65
68
|
"welcome": {
|
|
66
69
|
"title": "Benvenuto su Oxy!",
|
|
67
70
|
"subtitle": "Crea il tuo account in pochi passaggi",
|
|
@@ -50,6 +50,8 @@
|
|
|
50
50
|
}
|
|
51
51
|
},
|
|
52
52
|
"signup": {
|
|
53
|
+
"title": "アカウントを作成",
|
|
54
|
+
"subtitle": "エコシステム全体で使える1つのアイデンティティ。",
|
|
53
55
|
"commonsHeadline": "Commonsであなたのアイデンティティを作成",
|
|
54
56
|
"commonsExplainer": "Commonsは完全に自己管理できるあなたのOxy IDです。1つのアプリでどこでも使えます。",
|
|
55
57
|
"createInCommons": "Commonsであなたのアイデンティティを作成",
|
|
@@ -61,7 +63,8 @@
|
|
|
61
63
|
"usernameAvailable": "利用可能",
|
|
62
64
|
"usernameTaken": "このユーザー名は既に使用されています",
|
|
63
65
|
"backToSignInLink": "すでにアカウントをお持ちですか?サインイン",
|
|
64
|
-
"
|
|
66
|
+
"hubExplainer": "安全なウィンドウでOxy IDを作成し、すぐに戻ってきてください。",
|
|
67
|
+
"continueInWindow": "新しいウィンドウで続ける",
|
|
65
68
|
"welcome": {
|
|
66
69
|
"title": "Oxyへようこそ!",
|
|
67
70
|
"subtitle": "数ステップでアカウントを作成",
|
|
@@ -50,6 +50,8 @@
|
|
|
50
50
|
}
|
|
51
51
|
},
|
|
52
52
|
"signup": {
|
|
53
|
+
"title": "계정 만들기",
|
|
54
|
+
"subtitle": "생태계 전체를 위한 하나의 아이덴티티.",
|
|
53
55
|
"commonsHeadline": "Commons에서 나의 아이덴티티 만들기",
|
|
54
56
|
"commonsExplainer": "Commons는 완전한 자기 보관 방식의 Oxy 아이덴티티입니다. 하나의 앱으로 어디서나 사용하세요.",
|
|
55
57
|
"createInCommons": "Commons에서 나의 아이덴티티 만들기",
|
|
@@ -61,7 +63,8 @@
|
|
|
61
63
|
"usernameAvailable": "사용 가능",
|
|
62
64
|
"usernameTaken": "이미 사용 중인 사용자 이름입니다",
|
|
63
65
|
"backToSignInLink": "이미 계정이 있으신가요? 로그인",
|
|
64
|
-
"
|
|
66
|
+
"hubExplainer": "안전한 창에서 Oxy ID를 만든 후 바로 돌아오세요.",
|
|
67
|
+
"continueInWindow": "새 창에서 계속하기",
|
|
65
68
|
"welcome": {
|
|
66
69
|
"title": "Oxy에 오신 것을 환영합니다!",
|
|
67
70
|
"subtitle": "몇 단계만으로 계정을 만드세요",
|
|
@@ -50,6 +50,8 @@
|
|
|
50
50
|
}
|
|
51
51
|
},
|
|
52
52
|
"signup": {
|
|
53
|
+
"title": "أنشئ حسابك",
|
|
54
|
+
"subtitle": "هوية واحدة لكل النظام البيئي.",
|
|
53
55
|
"commonsHeadline": "أنشئ هويتك في Commons",
|
|
54
56
|
"commonsExplainer": "Commons هي هوية Oxy الخاصة بك بحفظ ذاتي كامل — تطبيق واحد يعمل في كل مكان.",
|
|
55
57
|
"createInCommons": "أنشئ هويتك في Commons",
|
|
@@ -61,7 +63,8 @@
|
|
|
61
63
|
"usernameAvailable": "متاح",
|
|
62
64
|
"usernameTaken": "اسم المستخدم هذا مستخدم بالفعل",
|
|
63
65
|
"backToSignInLink": "لديك حساب بالفعل؟ سجّل الدخول",
|
|
64
|
-
"
|
|
66
|
+
"hubExplainer": "أنشئ هوية Oxy الخاصة بك في نافذة آمنة، ثم عد إلى هنا مباشرة.",
|
|
67
|
+
"continueInWindow": "المتابعة في نافذة جديدة",
|
|
65
68
|
"welcome": {
|
|
66
69
|
"title": "مرحبًا بك في Oxy!",
|
|
67
70
|
"subtitle": "أنشئ حسابك في خطوات قليلة",
|
|
@@ -50,6 +50,8 @@
|
|
|
50
50
|
}
|
|
51
51
|
},
|
|
52
52
|
"signup": {
|
|
53
|
+
"title": "Crea el teu compte",
|
|
54
|
+
"subtitle": "Una identitat per a tot l'ecosistema.",
|
|
53
55
|
"commonsHeadline": "Crea la teva identitat a Commons",
|
|
54
56
|
"commonsExplainer": "Commons és la teva identitat d'Oxy amb autocustòdia completa: una app que funciona a tot arreu.",
|
|
55
57
|
"createInCommons": "Crea la teva identitat a Commons",
|
|
@@ -61,7 +63,8 @@
|
|
|
61
63
|
"usernameAvailable": "Disponible",
|
|
62
64
|
"usernameTaken": "Aquest nom d'usuari ja està en ús",
|
|
63
65
|
"backToSignInLink": "Ja tens compte? Inicia sessió",
|
|
64
|
-
"
|
|
66
|
+
"hubExplainer": "Crea la teva Oxy ID en una finestra segura i torna de seguida.",
|
|
67
|
+
"continueInWindow": "Continua en una finestra nova",
|
|
65
68
|
"welcome": {
|
|
66
69
|
"title": "Benvingut a Oxy!",
|
|
67
70
|
"subtitle": "Crea el teu compte en pocs passos",
|
|
@@ -50,6 +50,8 @@
|
|
|
50
50
|
}
|
|
51
51
|
},
|
|
52
52
|
"signup": {
|
|
53
|
+
"title": "Erstellen Sie Ihr Konto",
|
|
54
|
+
"subtitle": "Eine Identität für das gesamte Ökosystem.",
|
|
53
55
|
"commonsHeadline": "Erstellen Sie Ihre Identität in Commons",
|
|
54
56
|
"commonsExplainer": "Commons ist Ihre vollständig selbstverwaltete Oxy-Identität – eine App, überall einsetzbar.",
|
|
55
57
|
"createInCommons": "Erstellen Sie Ihre Identität in Commons",
|
|
@@ -61,7 +63,8 @@
|
|
|
61
63
|
"usernameAvailable": "Verfügbar",
|
|
62
64
|
"usernameTaken": "Dieser Benutzername ist bereits vergeben",
|
|
63
65
|
"backToSignInLink": "Sie haben bereits ein Konto? Anmelden",
|
|
64
|
-
"
|
|
66
|
+
"hubExplainer": "Erstellen Sie Ihre Oxy-ID in einem sicheren Fenster und kehren Sie dann direkt zurück.",
|
|
67
|
+
"continueInWindow": "In einem neuen Fenster fortfahren",
|
|
65
68
|
"welcome": {
|
|
66
69
|
"title": "Willkommen bei Oxy!",
|
|
67
70
|
"subtitle": "Erstellen Sie Ihr Konto in nur wenigen Schritten",
|
|
@@ -57,6 +57,8 @@
|
|
|
57
57
|
}
|
|
58
58
|
},
|
|
59
59
|
"signup": {
|
|
60
|
+
"title": "Create your account",
|
|
61
|
+
"subtitle": "One identity for the whole ecosystem.",
|
|
60
62
|
"commonsHeadline": "Create your identity in Commons",
|
|
61
63
|
"commonsExplainer": "Commons is your full self-custody Oxy identity — one app, works everywhere.",
|
|
62
64
|
"createInCommons": "Create your identity in Commons",
|
|
@@ -68,7 +70,8 @@
|
|
|
68
70
|
"usernameAvailable": "Available",
|
|
69
71
|
"usernameTaken": "This username is taken",
|
|
70
72
|
"backToSignInLink": "Already have an account? Sign in",
|
|
71
|
-
"
|
|
73
|
+
"hubExplainer": "Create your Oxy ID in a secure window, then come right back.",
|
|
74
|
+
"continueInWindow": "Continue in a new window",
|
|
72
75
|
"welcome": {
|
|
73
76
|
"title": "Welcome to Oxy!",
|
|
74
77
|
"subtitle": "Let's create your account in just a few steps",
|
|
@@ -57,6 +57,8 @@
|
|
|
57
57
|
}
|
|
58
58
|
},
|
|
59
59
|
"signup": {
|
|
60
|
+
"title": "Crea tu cuenta",
|
|
61
|
+
"subtitle": "Una identidad para todo el ecosistema.",
|
|
60
62
|
"commonsHeadline": "Crea tu identidad en Commons",
|
|
61
63
|
"commonsExplainer": "Commons es tu identidad de Oxy con autocustodia completa: una app que funciona en todas partes.",
|
|
62
64
|
"createInCommons": "Crea tu identidad en Commons",
|
|
@@ -68,7 +70,8 @@
|
|
|
68
70
|
"usernameAvailable": "Disponible",
|
|
69
71
|
"usernameTaken": "Este usuario ya está en uso",
|
|
70
72
|
"backToSignInLink": "¿Ya tienes cuenta? Inicia sesión",
|
|
71
|
-
"
|
|
73
|
+
"hubExplainer": "Crea tu Oxy ID en una ventana segura y vuelve enseguida.",
|
|
74
|
+
"continueInWindow": "Continuar en una ventana nueva",
|
|
72
75
|
"welcome": {
|
|
73
76
|
"title": "¡Te damos la bienvenida a Oxy!",
|
|
74
77
|
"subtitle": "Crea tu cuenta en pocos pasos",
|
|
@@ -50,6 +50,8 @@
|
|
|
50
50
|
}
|
|
51
51
|
},
|
|
52
52
|
"signup": {
|
|
53
|
+
"title": "Créez votre compte",
|
|
54
|
+
"subtitle": "Une seule identité pour tout l'écosystème.",
|
|
53
55
|
"commonsHeadline": "Créez votre identité dans Commons",
|
|
54
56
|
"commonsExplainer": "Commons est votre identité Oxy en autoconservation complète : une seule app, partout.",
|
|
55
57
|
"createInCommons": "Créez votre identité dans Commons",
|
|
@@ -61,7 +63,8 @@
|
|
|
61
63
|
"usernameAvailable": "Disponible",
|
|
62
64
|
"usernameTaken": "Ce nom d'utilisateur est déjà pris",
|
|
63
65
|
"backToSignInLink": "Vous avez déjà un compte ? Connectez-vous",
|
|
64
|
-
"
|
|
66
|
+
"hubExplainer": "Créez votre Oxy ID dans une fenêtre sécurisée, puis revenez directement.",
|
|
67
|
+
"continueInWindow": "Continuer dans une nouvelle fenêtre",
|
|
65
68
|
"welcome": {
|
|
66
69
|
"title": "Bienvenue sur Oxy !",
|
|
67
70
|
"subtitle": "Créez votre compte en quelques étapes",
|
|
@@ -50,6 +50,8 @@
|
|
|
50
50
|
}
|
|
51
51
|
},
|
|
52
52
|
"signup": {
|
|
53
|
+
"title": "Crea il tuo account",
|
|
54
|
+
"subtitle": "Un'unica identità per tutto l'ecosistema.",
|
|
53
55
|
"commonsHeadline": "Crea la tua identità in Commons",
|
|
54
56
|
"commonsExplainer": "Commons è la tua identità Oxy in piena autocustodia: un'unica app, ovunque.",
|
|
55
57
|
"createInCommons": "Crea la tua identità in Commons",
|
|
@@ -61,7 +63,8 @@
|
|
|
61
63
|
"usernameAvailable": "Disponibile",
|
|
62
64
|
"usernameTaken": "Questo nome utente è già in uso",
|
|
63
65
|
"backToSignInLink": "Hai già un account? Accedi",
|
|
64
|
-
"
|
|
66
|
+
"hubExplainer": "Crea il tuo Oxy ID in una finestra sicura, poi torna subito qui.",
|
|
67
|
+
"continueInWindow": "Continua in una nuova finestra",
|
|
65
68
|
"welcome": {
|
|
66
69
|
"title": "Benvenuto su Oxy!",
|
|
67
70
|
"subtitle": "Crea il tuo account in pochi passaggi",
|
|
@@ -50,6 +50,8 @@
|
|
|
50
50
|
}
|
|
51
51
|
},
|
|
52
52
|
"signup": {
|
|
53
|
+
"title": "アカウントを作成",
|
|
54
|
+
"subtitle": "エコシステム全体で使える1つのアイデンティティ。",
|
|
53
55
|
"commonsHeadline": "Commonsであなたのアイデンティティを作成",
|
|
54
56
|
"commonsExplainer": "Commonsは完全に自己管理できるあなたのOxy IDです。1つのアプリでどこでも使えます。",
|
|
55
57
|
"createInCommons": "Commonsであなたのアイデンティティを作成",
|
|
@@ -61,7 +63,8 @@
|
|
|
61
63
|
"usernameAvailable": "利用可能",
|
|
62
64
|
"usernameTaken": "このユーザー名は既に使用されています",
|
|
63
65
|
"backToSignInLink": "すでにアカウントをお持ちですか?サインイン",
|
|
64
|
-
"
|
|
66
|
+
"hubExplainer": "安全なウィンドウでOxy IDを作成し、すぐに戻ってきてください。",
|
|
67
|
+
"continueInWindow": "新しいウィンドウで続ける",
|
|
65
68
|
"welcome": {
|
|
66
69
|
"title": "Oxyへようこそ!",
|
|
67
70
|
"subtitle": "数ステップでアカウントを作成",
|
|
@@ -50,6 +50,8 @@
|
|
|
50
50
|
}
|
|
51
51
|
},
|
|
52
52
|
"signup": {
|
|
53
|
+
"title": "계정 만들기",
|
|
54
|
+
"subtitle": "생태계 전체를 위한 하나의 아이덴티티.",
|
|
53
55
|
"commonsHeadline": "Commons에서 나의 아이덴티티 만들기",
|
|
54
56
|
"commonsExplainer": "Commons는 완전한 자기 보관 방식의 Oxy 아이덴티티입니다. 하나의 앱으로 어디서나 사용하세요.",
|
|
55
57
|
"createInCommons": "Commons에서 나의 아이덴티티 만들기",
|
|
@@ -61,7 +63,8 @@
|
|
|
61
63
|
"usernameAvailable": "사용 가능",
|
|
62
64
|
"usernameTaken": "이미 사용 중인 사용자 이름입니다",
|
|
63
65
|
"backToSignInLink": "이미 계정이 있으신가요? 로그인",
|
|
64
|
-
"
|
|
66
|
+
"hubExplainer": "안전한 창에서 Oxy ID를 만든 후 바로 돌아오세요.",
|
|
67
|
+
"continueInWindow": "새 창에서 계속하기",
|
|
65
68
|
"welcome": {
|
|
66
69
|
"title": "Oxy에 오신 것을 환영합니다!",
|
|
67
70
|
"subtitle": "몇 단계만으로 계정을 만드세요",
|
|
@@ -50,6 +50,8 @@
|
|
|
50
50
|
}
|
|
51
51
|
},
|
|
52
52
|
"signup": {
|
|
53
|
+
"title": "Crie a sua conta",
|
|
54
|
+
"subtitle": "Uma identidade para todo o ecossistema.",
|
|
53
55
|
"commonsHeadline": "Crie a sua identidade no Commons",
|
|
54
56
|
"commonsExplainer": "O Commons é a sua identidade Oxy com autocustódia total: uma app que funciona em todo o lado.",
|
|
55
57
|
"createInCommons": "Crie a sua identidade no Commons",
|
|
@@ -61,7 +63,8 @@
|
|
|
61
63
|
"usernameAvailable": "Disponível",
|
|
62
64
|
"usernameTaken": "Este nome de utilizador já está em uso",
|
|
63
65
|
"backToSignInLink": "Já tem uma conta? Inicie sessão",
|
|
64
|
-
"
|
|
66
|
+
"hubExplainer": "Crie a sua Oxy ID numa janela segura e volte de seguida.",
|
|
67
|
+
"continueInWindow": "Continuar numa nova janela",
|
|
65
68
|
"welcome": {
|
|
66
69
|
"title": "Bem-vindo ao Oxy!",
|
|
67
70
|
"subtitle": "Crie a sua conta em poucos passos",
|
|
@@ -50,6 +50,8 @@
|
|
|
50
50
|
}
|
|
51
51
|
},
|
|
52
52
|
"signup": {
|
|
53
|
+
"title": "创建您的账户",
|
|
54
|
+
"subtitle": "一个身份,畅行整个生态系统。",
|
|
53
55
|
"commonsHeadline": "在 Commons 中创建您的身份",
|
|
54
56
|
"commonsExplainer": "Commons 是您完全自主保管的 Oxy 身份——一个应用,随处可用。",
|
|
55
57
|
"createInCommons": "在 Commons 中创建您的身份",
|
|
@@ -61,7 +63,8 @@
|
|
|
61
63
|
"usernameAvailable": "可用",
|
|
62
64
|
"usernameTaken": "该用户名已被占用",
|
|
63
65
|
"backToSignInLink": "已有账户?登录",
|
|
64
|
-
"
|
|
66
|
+
"hubExplainer": "在安全窗口中创建您的 Oxy ID,然后立即返回。",
|
|
67
|
+
"continueInWindow": "在新窗口中继续",
|
|
65
68
|
"welcome": {
|
|
66
69
|
"title": "欢迎使用Oxy!",
|
|
67
70
|
"subtitle": "只需几步即可创建您的账户",
|
|
@@ -50,6 +50,8 @@
|
|
|
50
50
|
}
|
|
51
51
|
},
|
|
52
52
|
"signup": {
|
|
53
|
+
"title": "Crie a sua conta",
|
|
54
|
+
"subtitle": "Uma identidade para todo o ecossistema.",
|
|
53
55
|
"commonsHeadline": "Crie a sua identidade no Commons",
|
|
54
56
|
"commonsExplainer": "O Commons é a sua identidade Oxy com autocustódia total: uma app que funciona em todo o lado.",
|
|
55
57
|
"createInCommons": "Crie a sua identidade no Commons",
|
|
@@ -61,7 +63,8 @@
|
|
|
61
63
|
"usernameAvailable": "Disponível",
|
|
62
64
|
"usernameTaken": "Este nome de utilizador já está em uso",
|
|
63
65
|
"backToSignInLink": "Já tem uma conta? Inicie sessão",
|
|
64
|
-
"
|
|
66
|
+
"hubExplainer": "Crie a sua Oxy ID numa janela segura e volte de seguida.",
|
|
67
|
+
"continueInWindow": "Continuar numa nova janela",
|
|
65
68
|
"welcome": {
|
|
66
69
|
"title": "Bem-vindo ao Oxy!",
|
|
67
70
|
"subtitle": "Crie a sua conta em poucos passos",
|
|
@@ -50,6 +50,8 @@
|
|
|
50
50
|
}
|
|
51
51
|
},
|
|
52
52
|
"signup": {
|
|
53
|
+
"title": "创建您的账户",
|
|
54
|
+
"subtitle": "一个身份,畅行整个生态系统。",
|
|
53
55
|
"commonsHeadline": "在 Commons 中创建您的身份",
|
|
54
56
|
"commonsExplainer": "Commons 是您完全自主保管的 Oxy 身份——一个应用,随处可用。",
|
|
55
57
|
"createInCommons": "在 Commons 中创建您的身份",
|
|
@@ -61,7 +63,8 @@
|
|
|
61
63
|
"usernameAvailable": "可用",
|
|
62
64
|
"usernameTaken": "该用户名已被占用",
|
|
63
65
|
"backToSignInLink": "已有账户?登录",
|
|
64
|
-
"
|
|
66
|
+
"hubExplainer": "在安全窗口中创建您的 Oxy ID,然后立即返回。",
|
|
67
|
+
"continueInWindow": "在新窗口中继续",
|
|
65
68
|
"welcome": {
|
|
66
69
|
"title": "欢迎使用Oxy!",
|
|
67
70
|
"subtitle": "只需几步即可创建您的账户",
|
|
@@ -24,6 +24,12 @@
|
|
|
24
24
|
* - `commonsAvailability` — whether Commons is installed on this device
|
|
25
25
|
* (native only, via the injected `canOpenApp` probe), so the QR view can
|
|
26
26
|
* offer a "Get Commons" fallback instead of a same-device dead end.
|
|
27
|
+
* - `startPasskeyHubSignIn` — on a non-Oxy web origin (where a WebAuthn
|
|
28
|
+
* ceremony can't run locally, the RP-ID is bound to oxy.so), open a popup
|
|
29
|
+
* at the auth.oxy.so passkey hub instead, scoped to the SAME device-flow
|
|
30
|
+
* session `showQr` creates, and complete it via the SAME poll/socket/claim
|
|
31
|
+
* engine. Falls back to `showQr`'s plain QR rendering if the popup is
|
|
32
|
+
* blocked.
|
|
27
33
|
*
|
|
28
34
|
* Sign-in is passkey (WebAuthn) or the Commons QR / shared-keychain handoff —
|
|
29
35
|
* password, social login, and 2FA were removed ecosystem-wide. Account
|
|
@@ -32,6 +38,7 @@
|
|
|
32
38
|
*/
|
|
33
39
|
import { logger } from '../logger/index.js';
|
|
34
40
|
import { extractErrorStatus } from '../utils/errorUtils.js';
|
|
41
|
+
import { CENTRAL_IDP_APEX } from '../utils/authWebUrl.js';
|
|
35
42
|
import { projectSwitchableAccounts, switchableAccountIds, } from './accountProjection.js';
|
|
36
43
|
/**
|
|
37
44
|
* Slow FALLBACK poll cadence for the QR flow. The `/auth-session` socket delivers
|
|
@@ -86,6 +93,10 @@ export class AccountDialogController {
|
|
|
86
93
|
* single-use token concurrently.
|
|
87
94
|
*/
|
|
88
95
|
this.pollInFlight = false;
|
|
96
|
+
/** The popup opened by {@link startPasskeyHubSignIn}, or `null`. */
|
|
97
|
+
this.activePopup = null;
|
|
98
|
+
/** Watches {@link activePopup}'s `closed` state; see {@link watchPopup}. */
|
|
99
|
+
this.popupWatchTimer = null;
|
|
89
100
|
// --- Store plumbing ---
|
|
90
101
|
this.unsubscribeSession = null;
|
|
91
102
|
this.unsubscribeTokens = null;
|
|
@@ -104,6 +115,8 @@ export class AccountDialogController {
|
|
|
104
115
|
this.openUrl = options.openUrl;
|
|
105
116
|
this.canOpenApp = options.canOpenApp;
|
|
106
117
|
this.socketFactory = options.socketFactory;
|
|
118
|
+
this.openPopup = options.openPopup;
|
|
119
|
+
this.hubBaseUrl = options.hubBaseUrl ?? `https://auth.${CENTRAL_IDP_APEX}`;
|
|
107
120
|
this.snapshot = this.computeSnapshot();
|
|
108
121
|
}
|
|
109
122
|
// =========================================================================
|
|
@@ -177,6 +190,7 @@ export class AccountDialogController {
|
|
|
177
190
|
}
|
|
178
191
|
this.clearPollTimer();
|
|
179
192
|
this.closeAuthSessionSocket();
|
|
193
|
+
this.closeActivePopup();
|
|
180
194
|
this.signInToken = null;
|
|
181
195
|
this.listeners.clear();
|
|
182
196
|
}
|
|
@@ -444,9 +458,62 @@ export class AccountDialogController {
|
|
|
444
458
|
async showQr() {
|
|
445
459
|
this.cancelSignIn();
|
|
446
460
|
this.setView('qr');
|
|
461
|
+
await this.startDeviceFlowSession();
|
|
462
|
+
}
|
|
463
|
+
/**
|
|
464
|
+
* Web-only: "Sign in with a passkey" on a non-Oxy origin cannot run the
|
|
465
|
+
* WebAuthn ceremony locally — a credential minted with `WEBAUTHN_RP_ID=oxy.so`
|
|
466
|
+
* can only be asserted from `oxy.so`/a subdomain/loopback, a browser-enforced
|
|
467
|
+
* boundary `isOxyRpOrigin()` (consumer-side) already gates on. Instead, open
|
|
468
|
+
* a popup at the auth.oxy.so passkey hub, scoped to the SAME device-flow
|
|
469
|
+
* session {@link showQr} would create (same `authorizeCode`/`sessionToken`
|
|
470
|
+
* pair), and let the SAME poll/socket/claim engine complete it once the hub
|
|
471
|
+
* authorizes the session (`POST /auth/session/authorize-code/:authorizeCode`,
|
|
472
|
+
* bearer-authed, server-side — this method never sees or transmits the
|
|
473
|
+
* secret `sessionToken`).
|
|
474
|
+
*
|
|
475
|
+
* The popup MUST be opened synchronously, before any `await`, or the
|
|
476
|
+
* browser's popup blocker loses the click-gesture attribution and silently
|
|
477
|
+
* blocks it — so {@link openPopup} is invoked as the very first step, before
|
|
478
|
+
* the device-flow session (which needs an async call) even exists. If the
|
|
479
|
+
* popup is blocked (or no `openPopup` was injected), this falls back to
|
|
480
|
+
* `showQr`'s plain QR rendering — no dead end.
|
|
481
|
+
*/
|
|
482
|
+
async startPasskeyHubSignIn() {
|
|
483
|
+
this.cancelSignIn();
|
|
484
|
+
this.setView('qr');
|
|
485
|
+
const popup = this.openPopup?.() ?? null;
|
|
486
|
+
if (!popup) {
|
|
487
|
+
await this.startDeviceFlowSession();
|
|
488
|
+
return;
|
|
489
|
+
}
|
|
490
|
+
const handle = await this.startDeviceFlowSession();
|
|
491
|
+
if (!handle) {
|
|
492
|
+
popup.close();
|
|
493
|
+
return;
|
|
494
|
+
}
|
|
495
|
+
// The user may have closed the popup during the async session creation
|
|
496
|
+
// above, before any watcher was attached to catch it — guard rather than
|
|
497
|
+
// navigate a dead window (browsers vary on whether that throws).
|
|
498
|
+
if (popup.closed) {
|
|
499
|
+
this.failSignIn('Sign-in was cancelled.');
|
|
500
|
+
return;
|
|
501
|
+
}
|
|
502
|
+
this.activePopup = popup;
|
|
503
|
+
popup.location.href = `${this.hubBaseUrl}/hub-passkey?code=${encodeURIComponent(handle.authorizeCode)}`;
|
|
504
|
+
this.watchPopup(popup);
|
|
505
|
+
}
|
|
506
|
+
/**
|
|
507
|
+
* Shared device-flow session creation for both {@link showQr} (renders the
|
|
508
|
+
* QR) and {@link startPasskeyHubSignIn} (also opens the hub popup) — the
|
|
509
|
+
* same `startCommonsSignIn` → poll/socket wiring either way. Returns the
|
|
510
|
+
* handle on success (already reflected in `signIn`), or `null` on failure
|
|
511
|
+
* (already set as `signIn.error`).
|
|
512
|
+
*/
|
|
513
|
+
async startDeviceFlowSession() {
|
|
447
514
|
if (!this.clientId) {
|
|
448
515
|
this.setSignIn({ ...IDLE_SIGN_IN, phase: 'error', error: 'This app is not configured for sign-in (missing clientId).' });
|
|
449
|
-
return;
|
|
516
|
+
return null;
|
|
450
517
|
}
|
|
451
518
|
this.setSignIn({ ...IDLE_SIGN_IN, phase: 'starting' });
|
|
452
519
|
try {
|
|
@@ -471,9 +538,49 @@ export class AccountDialogController {
|
|
|
471
538
|
// stay live as the fallback, so a user who dismisses the app-open still
|
|
472
539
|
// completes the sign-in by scanning.
|
|
473
540
|
void this.deepLinkIntoCommonsIfAvailable(handle.qrPayload);
|
|
541
|
+
return handle;
|
|
474
542
|
}
|
|
475
543
|
catch (error) {
|
|
476
544
|
this.setSignIn({ ...IDLE_SIGN_IN, phase: 'error', error: errorMessage(error) });
|
|
545
|
+
return null;
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
/**
|
|
549
|
+
* Poll {@link PopupWindowHandle.closed} so a user who dismisses the hub
|
|
550
|
+
* popup without completing sign-in gets prompt feedback (there is no DOM
|
|
551
|
+
* event for a cross-origin popup closing — polling is the only mechanism).
|
|
552
|
+
* Cleared by {@link closeActivePopup}, which every sign-in exit path already
|
|
553
|
+
* calls.
|
|
554
|
+
*/
|
|
555
|
+
watchPopup(popup) {
|
|
556
|
+
this.clearPopupWatchTimer();
|
|
557
|
+
this.popupWatchTimer = setInterval(() => {
|
|
558
|
+
if (!popup.closed)
|
|
559
|
+
return;
|
|
560
|
+
this.clearPopupWatchTimer();
|
|
561
|
+
if (this.signIn.phase === 'starting' || this.signIn.phase === 'waiting') {
|
|
562
|
+
this.failSignIn('Sign-in was cancelled.');
|
|
563
|
+
}
|
|
564
|
+
}, 1000);
|
|
565
|
+
}
|
|
566
|
+
clearPopupWatchTimer() {
|
|
567
|
+
if (this.popupWatchTimer !== null) {
|
|
568
|
+
clearInterval(this.popupWatchTimer);
|
|
569
|
+
this.popupWatchTimer = null;
|
|
570
|
+
}
|
|
571
|
+
}
|
|
572
|
+
/** Tear down the popup watch timer and close the popup, if any. Idempotent. */
|
|
573
|
+
closeActivePopup() {
|
|
574
|
+
this.clearPopupWatchTimer();
|
|
575
|
+
const popup = this.activePopup;
|
|
576
|
+
this.activePopup = null;
|
|
577
|
+
if (!popup || popup.closed)
|
|
578
|
+
return;
|
|
579
|
+
try {
|
|
580
|
+
popup.close();
|
|
581
|
+
}
|
|
582
|
+
catch (error) {
|
|
583
|
+
logger.debug('[AccountDialogController] popup close failed', { component: 'AccountDialogController' }, error);
|
|
477
584
|
}
|
|
478
585
|
}
|
|
479
586
|
/**
|
|
@@ -523,10 +630,11 @@ export class AccountDialogController {
|
|
|
523
630
|
this.openUrl(qrPayload);
|
|
524
631
|
}
|
|
525
632
|
}
|
|
526
|
-
/** Tear down the active sign-in device flow (timers + socket + token) and reset to idle. */
|
|
633
|
+
/** Tear down the active sign-in device flow (timers + socket + popup + token) and reset to idle. */
|
|
527
634
|
cancelSignIn() {
|
|
528
635
|
this.clearPollTimer();
|
|
529
636
|
this.closeAuthSessionSocket();
|
|
637
|
+
this.closeActivePopup();
|
|
530
638
|
this.signInToken = null;
|
|
531
639
|
if (this.signIn !== IDLE_SIGN_IN) {
|
|
532
640
|
this.setSignIn(IDLE_SIGN_IN);
|
|
@@ -635,6 +743,7 @@ export class AccountDialogController {
|
|
|
635
743
|
this.signInToken = null;
|
|
636
744
|
this.clearPollTimer();
|
|
637
745
|
this.closeAuthSessionSocket();
|
|
746
|
+
this.closeActivePopup();
|
|
638
747
|
this.signIn = IDLE_SIGN_IN;
|
|
639
748
|
this.view = 'accounts';
|
|
640
749
|
this.emit();
|
|
@@ -666,6 +775,7 @@ export class AccountDialogController {
|
|
|
666
775
|
failSignIn(message) {
|
|
667
776
|
this.clearPollTimer();
|
|
668
777
|
this.closeAuthSessionSocket();
|
|
778
|
+
this.closeActivePopup();
|
|
669
779
|
this.signInToken = null;
|
|
670
780
|
this.setSignIn({ ...IDLE_SIGN_IN, phase: 'error', error: message });
|
|
671
781
|
}
|