@oxyhq/services 5.12.11 → 5.13.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/lib/commonjs/core/OxyServices.js +86 -8
- package/lib/commonjs/core/OxyServices.js.map +1 -1
- package/lib/commonjs/i18n/index.js +37 -1
- package/lib/commonjs/i18n/index.js.map +1 -1
- package/lib/commonjs/i18n/locales/ar-SA.json +128 -0
- package/lib/commonjs/i18n/locales/ca-ES.json +128 -0
- package/lib/commonjs/i18n/locales/de-DE.json +128 -0
- package/lib/commonjs/i18n/locales/en-US.json +85 -12
- package/lib/commonjs/i18n/locales/es-ES.json +58 -6
- package/lib/commonjs/i18n/locales/fr-FR.json +128 -0
- package/lib/commonjs/i18n/locales/it-IT.json +128 -0
- package/lib/commonjs/i18n/locales/ja-JP.json +127 -0
- package/lib/commonjs/i18n/locales/ko-KR.json +128 -0
- package/lib/commonjs/i18n/locales/pt-PT.json +128 -0
- package/lib/commonjs/i18n/locales/zh-CN.json +128 -0
- package/lib/commonjs/ui/components/FontLoader.js +22 -42
- package/lib/commonjs/ui/components/FontLoader.js.map +1 -1
- package/lib/commonjs/ui/components/OxyProvider.js +5 -8
- package/lib/commonjs/ui/components/OxyProvider.js.map +1 -1
- package/lib/commonjs/ui/components/StepBasedScreen.js +64 -44
- package/lib/commonjs/ui/components/StepBasedScreen.js.map +1 -1
- package/lib/commonjs/ui/components/internal/GroupedPillButtons.js +14 -35
- package/lib/commonjs/ui/components/internal/GroupedPillButtons.js.map +1 -1
- package/lib/commonjs/ui/components/internal/PinInput.js +2 -2
- package/lib/commonjs/ui/components/internal/PinInput.js.map +1 -1
- package/lib/commonjs/ui/context/OxyContext.js +434 -321
- package/lib/commonjs/ui/context/OxyContext.js.map +1 -1
- package/lib/commonjs/ui/screens/FileManagementScreen.js +56 -5
- package/lib/commonjs/ui/screens/FileManagementScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/SignInScreen.js +43 -39
- package/lib/commonjs/ui/screens/SignInScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/WelcomeNewUserScreen.js +139 -125
- package/lib/commonjs/ui/screens/WelcomeNewUserScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/internal/SignInUsernameStep.js +2 -4
- package/lib/commonjs/ui/screens/internal/SignInUsernameStep.js.map +1 -1
- package/lib/commonjs/ui/screens/steps/RecoverRequestStep.js +45 -25
- package/lib/commonjs/ui/screens/steps/RecoverRequestStep.js.map +1 -1
- package/lib/commonjs/ui/screens/steps/RecoverResetPasswordStep.js +88 -53
- package/lib/commonjs/ui/screens/steps/RecoverResetPasswordStep.js.map +1 -1
- package/lib/commonjs/ui/screens/steps/RecoverSuccessStep.js +79 -58
- package/lib/commonjs/ui/screens/steps/RecoverSuccessStep.js.map +1 -1
- package/lib/commonjs/ui/screens/steps/RecoverVerifyStep.js +61 -52
- package/lib/commonjs/ui/screens/steps/RecoverVerifyStep.js.map +1 -1
- package/lib/commonjs/ui/screens/steps/SignInPasswordStep.js +220 -31
- package/lib/commonjs/ui/screens/steps/SignInPasswordStep.js.map +1 -1
- package/lib/commonjs/ui/screens/steps/SignInTotpStep.js +77 -50
- package/lib/commonjs/ui/screens/steps/SignInTotpStep.js.map +1 -1
- package/lib/commonjs/ui/screens/steps/SignInUsernameStep.js +527 -66
- package/lib/commonjs/ui/screens/steps/SignInUsernameStep.js.map +1 -1
- package/lib/commonjs/ui/screens/steps/SignUpIdentityStep.js +55 -30
- package/lib/commonjs/ui/screens/steps/SignUpIdentityStep.js.map +1 -1
- package/lib/commonjs/ui/screens/steps/SignUpSecurityStep.js +64 -46
- package/lib/commonjs/ui/screens/steps/SignUpSecurityStep.js.map +1 -1
- package/lib/commonjs/ui/screens/steps/SignUpSummaryStep.js +84 -146
- package/lib/commonjs/ui/screens/steps/SignUpSummaryStep.js.map +1 -1
- package/lib/commonjs/ui/screens/steps/SignUpWelcomeStep.js +113 -34
- package/lib/commonjs/ui/screens/steps/SignUpWelcomeStep.js.map +1 -1
- package/lib/commonjs/ui/stores/authStore.js +16 -20
- package/lib/commonjs/ui/stores/authStore.js.map +1 -1
- package/lib/commonjs/ui/styles/authStyles.js +2 -1
- package/lib/commonjs/ui/styles/authStyles.js.map +1 -1
- package/lib/commonjs/ui/styles/index.js +11 -0
- package/lib/commonjs/ui/styles/index.js.map +1 -1
- package/lib/commonjs/ui/styles/spacing.js +51 -0
- package/lib/commonjs/ui/styles/spacing.js.map +1 -0
- package/lib/commonjs/utils/validationUtils.js +1 -1
- package/lib/module/core/OxyServices.js +86 -8
- package/lib/module/core/OxyServices.js.map +1 -1
- package/lib/module/i18n/index.js +37 -1
- package/lib/module/i18n/index.js.map +1 -1
- package/lib/module/i18n/locales/ar-SA.json +128 -0
- package/lib/module/i18n/locales/ca-ES.json +128 -0
- package/lib/module/i18n/locales/de-DE.json +128 -0
- package/lib/module/i18n/locales/en-US.json +85 -12
- package/lib/module/i18n/locales/es-ES.json +58 -6
- package/lib/module/i18n/locales/fr-FR.json +128 -0
- package/lib/module/i18n/locales/it-IT.json +128 -0
- package/lib/module/i18n/locales/ja-JP.json +127 -0
- package/lib/module/i18n/locales/ko-KR.json +128 -0
- package/lib/module/i18n/locales/pt-PT.json +128 -0
- package/lib/module/i18n/locales/zh-CN.json +128 -0
- package/lib/module/ui/components/FontLoader.js +23 -43
- package/lib/module/ui/components/FontLoader.js.map +1 -1
- package/lib/module/ui/components/OxyProvider.js +6 -8
- package/lib/module/ui/components/OxyProvider.js.map +1 -1
- package/lib/module/ui/components/StepBasedScreen.js +65 -45
- package/lib/module/ui/components/StepBasedScreen.js.map +1 -1
- package/lib/module/ui/components/internal/GroupedPillButtons.js +14 -35
- package/lib/module/ui/components/internal/GroupedPillButtons.js.map +1 -1
- package/lib/module/ui/components/internal/PinInput.js +2 -2
- package/lib/module/ui/components/internal/PinInput.js.map +1 -1
- package/lib/module/ui/context/OxyContext.js +434 -321
- package/lib/module/ui/context/OxyContext.js.map +1 -1
- package/lib/module/ui/screens/FileManagementScreen.js +56 -5
- package/lib/module/ui/screens/FileManagementScreen.js.map +1 -1
- package/lib/module/ui/screens/SignInScreen.js +44 -40
- package/lib/module/ui/screens/SignInScreen.js.map +1 -1
- package/lib/module/ui/screens/WelcomeNewUserScreen.js +138 -126
- package/lib/module/ui/screens/WelcomeNewUserScreen.js.map +1 -1
- package/lib/module/ui/screens/internal/SignInUsernameStep.js +2 -4
- package/lib/module/ui/screens/internal/SignInUsernameStep.js.map +1 -1
- package/lib/module/ui/screens/steps/RecoverRequestStep.js +45 -25
- package/lib/module/ui/screens/steps/RecoverRequestStep.js.map +1 -1
- package/lib/module/ui/screens/steps/RecoverResetPasswordStep.js +89 -54
- package/lib/module/ui/screens/steps/RecoverResetPasswordStep.js.map +1 -1
- package/lib/module/ui/screens/steps/RecoverSuccessStep.js +80 -59
- package/lib/module/ui/screens/steps/RecoverSuccessStep.js.map +1 -1
- package/lib/module/ui/screens/steps/RecoverVerifyStep.js +62 -53
- package/lib/module/ui/screens/steps/RecoverVerifyStep.js.map +1 -1
- package/lib/module/ui/screens/steps/SignInPasswordStep.js +221 -32
- package/lib/module/ui/screens/steps/SignInPasswordStep.js.map +1 -1
- package/lib/module/ui/screens/steps/SignInTotpStep.js +78 -51
- package/lib/module/ui/screens/steps/SignInTotpStep.js.map +1 -1
- package/lib/module/ui/screens/steps/SignInUsernameStep.js +530 -68
- package/lib/module/ui/screens/steps/SignInUsernameStep.js.map +1 -1
- package/lib/module/ui/screens/steps/SignUpIdentityStep.js +55 -30
- package/lib/module/ui/screens/steps/SignUpIdentityStep.js.map +1 -1
- package/lib/module/ui/screens/steps/SignUpSecurityStep.js +65 -47
- package/lib/module/ui/screens/steps/SignUpSecurityStep.js.map +1 -1
- package/lib/module/ui/screens/steps/SignUpSummaryStep.js +84 -146
- package/lib/module/ui/screens/steps/SignUpSummaryStep.js.map +1 -1
- package/lib/module/ui/screens/steps/SignUpWelcomeStep.js +114 -35
- package/lib/module/ui/screens/steps/SignUpWelcomeStep.js.map +1 -1
- package/lib/module/ui/stores/authStore.js +16 -20
- package/lib/module/ui/stores/authStore.js.map +1 -1
- package/lib/module/ui/styles/authStyles.js +2 -1
- package/lib/module/ui/styles/authStyles.js.map +1 -1
- package/lib/module/ui/styles/index.js +1 -0
- package/lib/module/ui/styles/index.js.map +1 -1
- package/lib/module/ui/styles/spacing.js +48 -0
- package/lib/module/ui/styles/spacing.js.map +1 -0
- package/lib/module/utils/validationUtils.js +1 -1
- package/lib/typescript/core/OxyServices.d.ts +38 -2
- package/lib/typescript/core/OxyServices.d.ts.map +1 -1
- package/lib/typescript/i18n/index.d.ts.map +1 -1
- package/lib/typescript/ui/components/FontLoader.d.ts +3 -3
- package/lib/typescript/ui/components/FontLoader.d.ts.map +1 -1
- package/lib/typescript/ui/components/OxyProvider.d.ts +2 -2
- package/lib/typescript/ui/components/OxyProvider.d.ts.map +1 -1
- package/lib/typescript/ui/components/StepBasedScreen.d.ts.map +1 -1
- package/lib/typescript/ui/components/internal/GroupedPillButtons.d.ts.map +1 -1
- package/lib/typescript/ui/context/OxyContext.d.ts +1 -0
- package/lib/typescript/ui/context/OxyContext.d.ts.map +1 -1
- package/lib/typescript/ui/screens/FileManagementScreen.d.ts +10 -0
- package/lib/typescript/ui/screens/FileManagementScreen.d.ts.map +1 -1
- package/lib/typescript/ui/screens/SignInScreen.d.ts.map +1 -1
- package/lib/typescript/ui/screens/WelcomeNewUserScreen.d.ts.map +1 -1
- package/lib/typescript/ui/screens/steps/RecoverRequestStep.d.ts.map +1 -1
- package/lib/typescript/ui/screens/steps/RecoverResetPasswordStep.d.ts.map +1 -1
- package/lib/typescript/ui/screens/steps/RecoverSuccessStep.d.ts.map +1 -1
- package/lib/typescript/ui/screens/steps/RecoverVerifyStep.d.ts.map +1 -1
- package/lib/typescript/ui/screens/steps/SignInPasswordStep.d.ts +2 -0
- package/lib/typescript/ui/screens/steps/SignInPasswordStep.d.ts.map +1 -1
- package/lib/typescript/ui/screens/steps/SignInTotpStep.d.ts.map +1 -1
- package/lib/typescript/ui/screens/steps/SignInUsernameStep.d.ts.map +1 -1
- package/lib/typescript/ui/screens/steps/SignUpIdentityStep.d.ts.map +1 -1
- package/lib/typescript/ui/screens/steps/SignUpSecurityStep.d.ts.map +1 -1
- package/lib/typescript/ui/screens/steps/SignUpSummaryStep.d.ts.map +1 -1
- package/lib/typescript/ui/screens/steps/SignUpWelcomeStep.d.ts.map +1 -1
- package/lib/typescript/ui/stores/authStore.d.ts +7 -3
- package/lib/typescript/ui/stores/authStore.d.ts.map +1 -1
- package/lib/typescript/ui/styles/authStyles.d.ts +1 -0
- package/lib/typescript/ui/styles/authStyles.d.ts.map +1 -1
- package/lib/typescript/ui/styles/index.d.ts +1 -0
- package/lib/typescript/ui/styles/index.d.ts.map +1 -1
- package/lib/typescript/ui/styles/spacing.d.ts +43 -0
- package/lib/typescript/ui/styles/spacing.d.ts.map +1 -0
- package/lib/typescript/utils/validationUtils.d.ts +1 -1
- package/package.json +1 -1
- package/src/core/OxyServices.ts +96 -10
- package/src/i18n/index.ts +36 -0
- package/src/i18n/locales/ar-SA.json +128 -0
- package/src/i18n/locales/ca-ES.json +128 -0
- package/src/i18n/locales/de-DE.json +128 -0
- package/src/i18n/locales/en-US.json +85 -12
- package/src/i18n/locales/es-ES.json +58 -6
- package/src/i18n/locales/fr-FR.json +128 -0
- package/src/i18n/locales/it-IT.json +128 -0
- package/src/i18n/locales/ja-JP.json +127 -0
- package/src/i18n/locales/ko-KR.json +128 -0
- package/src/i18n/locales/pt-PT.json +128 -0
- package/src/i18n/locales/zh-CN.json +128 -0
- package/src/ui/components/FontLoader.tsx +17 -37
- package/src/ui/components/OxyProvider.tsx +14 -13
- package/src/ui/components/StepBasedScreen.tsx +66 -43
- package/src/ui/components/internal/GroupedPillButtons.tsx +15 -31
- package/src/ui/components/internal/PinInput.tsx +2 -2
- package/src/ui/context/OxyContext.tsx +404 -285
- package/src/ui/screens/FileManagementScreen.tsx +81 -4
- package/src/ui/screens/SignInScreen.tsx +59 -36
- package/src/ui/screens/WelcomeNewUserScreen.tsx +102 -91
- package/src/ui/screens/internal/SignInUsernameStep.tsx +1 -1
- package/src/ui/screens/steps/RecoverRequestStep.tsx +34 -24
- package/src/ui/screens/steps/RecoverResetPasswordStep.tsx +65 -36
- package/src/ui/screens/steps/RecoverSuccessStep.tsx +71 -47
- package/src/ui/screens/steps/RecoverVerifyStep.tsx +60 -50
- package/src/ui/screens/steps/SignInPasswordStep.tsx +191 -29
- package/src/ui/screens/steps/SignInTotpStep.tsx +68 -34
- package/src/ui/screens/steps/SignInUsernameStep.tsx +586 -57
- package/src/ui/screens/steps/SignUpIdentityStep.tsx +49 -35
- package/src/ui/screens/steps/SignUpSecurityStep.tsx +56 -39
- package/src/ui/screens/steps/SignUpSummaryStep.tsx +99 -89
- package/src/ui/screens/steps/SignUpWelcomeStep.tsx +88 -20
- package/src/ui/stores/authStore.ts +15 -19
- package/src/ui/styles/authStyles.ts +2 -1
- package/src/ui/styles/index.ts +1 -0
- package/src/ui/styles/spacing.ts +46 -0
- package/src/utils/validationUtils.ts +1 -1
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
{
|
|
2
|
+
"signin": {
|
|
3
|
+
"title": "로그인",
|
|
4
|
+
"subtitle": "계속하려면 로그인하세요",
|
|
5
|
+
"addAccountTitle": "다른 계정 추가",
|
|
6
|
+
"addAccountSubtitle": "다른 계정으로 로그인",
|
|
7
|
+
"username": {
|
|
8
|
+
"label": "사용자 이름",
|
|
9
|
+
"placeholder": "사용자 이름을 입력하세요",
|
|
10
|
+
"helper": "3-30자, 영문과 숫자만",
|
|
11
|
+
"required": "사용자 이름을 입력해주세요.",
|
|
12
|
+
"minLength": "사용자 이름은 최소 3자 이상이어야 합니다."
|
|
13
|
+
},
|
|
14
|
+
"password": {
|
|
15
|
+
"label": "비밀번호",
|
|
16
|
+
"placeholder": "비밀번호를 입력하세요",
|
|
17
|
+
"required": "비밀번호를 입력해주세요.",
|
|
18
|
+
"hint": "로그인하려면 비밀번호를 입력하세요"
|
|
19
|
+
},
|
|
20
|
+
"actions": {
|
|
21
|
+
"continue": "계속",
|
|
22
|
+
"back": "뒤로",
|
|
23
|
+
"signIn": "로그인",
|
|
24
|
+
"verify": "확인",
|
|
25
|
+
"openAccountSwitcher": "다른 계정으로 전환",
|
|
26
|
+
"openAccountSwitcherSubtitle": "{{count}}개의 다른 계정 사용 가능",
|
|
27
|
+
"openAccountSwitcherSubtitle_singular": "1개의 다른 계정 사용 가능",
|
|
28
|
+
"openAccountSwitcherSubtitle_zero": "저장된 계정 검토",
|
|
29
|
+
"manageAccounts": "저장된 계정 관리",
|
|
30
|
+
"manageAccountsSubtitle": "세션 검토, 제거 또는 로그아웃",
|
|
31
|
+
"loadingOtherAccounts": "다른 계정 로드 중…",
|
|
32
|
+
"switchAccountFailed": "계정을 전환할 수 없습니다. 다시 시도해주세요."
|
|
33
|
+
},
|
|
34
|
+
"forgotPrompt": "비밀번호를 잊으셨나요?",
|
|
35
|
+
"security": {
|
|
36
|
+
"dataSecure": "데이터가 암호화되어 안전합니다"
|
|
37
|
+
},
|
|
38
|
+
"currentlySignedInAs": "현재 로그인 중:",
|
|
39
|
+
"alreadySignedInWith": "이미 로그인 중:",
|
|
40
|
+
"alreadySignedIn": "이미 로그인됨",
|
|
41
|
+
"alreadySignedInMessage": "이 계정은 이미 로그인되어 있습니다. 이 계정으로 계속하시겠습니까?",
|
|
42
|
+
"continueWithAccount": "계속",
|
|
43
|
+
"currentAccount": "현재",
|
|
44
|
+
"or": "또는",
|
|
45
|
+
"viewAllAccounts": "{{count}}개 더 보기",
|
|
46
|
+
"status": {
|
|
47
|
+
"accountSwitched": "{{name}} 사용 중"
|
|
48
|
+
},
|
|
49
|
+
"totp": {
|
|
50
|
+
"title": "2단계 인증 코드",
|
|
51
|
+
"subtitle": "@{{username}}의 인증 앱에서 6자리 코드를 입력하세요",
|
|
52
|
+
"invalidCode": "잘못된 코드입니다. 다시 시도해주세요.",
|
|
53
|
+
"noAccess": "인증 앱에 액세스할 수 없나요?",
|
|
54
|
+
"useBackupCode": "백업 코드 사용",
|
|
55
|
+
"useRecoveryKey": "복구 키 사용"
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
"signup": {
|
|
59
|
+
"welcome": {
|
|
60
|
+
"title": "Oxy에 오신 것을 환영합니다!",
|
|
61
|
+
"subtitle": "몇 단계만으로 계정을 만드세요",
|
|
62
|
+
"haveAccount": "이미 계정이 있으신가요?",
|
|
63
|
+
"signInCta": "로그인"
|
|
64
|
+
},
|
|
65
|
+
"identity": {
|
|
66
|
+
"title": "당신은 누구인가요?",
|
|
67
|
+
"subtitle": "사용자 이름을 선택하고 이메일을 입력하세요"
|
|
68
|
+
},
|
|
69
|
+
"username": {
|
|
70
|
+
"helper": "3-30자, 영문과 숫자만",
|
|
71
|
+
"required": "사용자 이름을 입력해주세요",
|
|
72
|
+
"minLength": "사용자 이름은 최소 3자 이상이어야 합니다"
|
|
73
|
+
},
|
|
74
|
+
"email": {
|
|
75
|
+
"required": "이메일 주소를 입력해주세요",
|
|
76
|
+
"invalid": "유효한 이메일 주소를 입력해주세요",
|
|
77
|
+
"helper": "이메일을 공유하지 않습니다"
|
|
78
|
+
},
|
|
79
|
+
"security": {
|
|
80
|
+
"title": "계정 보호",
|
|
81
|
+
"subtitle": "계정을 보호하기 위한 강력한 비밀번호를 만드세요"
|
|
82
|
+
},
|
|
83
|
+
"password": {
|
|
84
|
+
"helper": "최소 8자",
|
|
85
|
+
"required": "비밀번호를 입력해주세요",
|
|
86
|
+
"minLength": "비밀번호는 최소 8자 이상이어야 합니다",
|
|
87
|
+
"confirmRequired": "비밀번호를 확인해주세요",
|
|
88
|
+
"mismatch": "비밀번호가 일치하지 않습니다",
|
|
89
|
+
"confirmHint": "확인을 위해 비밀번호를 다시 입력하세요"
|
|
90
|
+
},
|
|
91
|
+
"summary": {
|
|
92
|
+
"title": "거의 완료되었습니다!",
|
|
93
|
+
"subtitle": "정보를 검토하고 계정을 만드세요",
|
|
94
|
+
"sectionTitle": "계정 정보",
|
|
95
|
+
"fields": {
|
|
96
|
+
"username": "사용자 이름",
|
|
97
|
+
"email": "이메일",
|
|
98
|
+
"password": "비밀번호"
|
|
99
|
+
},
|
|
100
|
+
"notSet": "설정되지 않음",
|
|
101
|
+
"securityTip": "더 강력한 보안을 위해 계정을 만든 후 계정 설정에서 2단계 인증(TOTP)을 활성화하세요.",
|
|
102
|
+
"legalReminder": "계정을 만들면 서비스 약관 및 개인정보 보호정책에 동의하는 것입니다."
|
|
103
|
+
}
|
|
104
|
+
},
|
|
105
|
+
"common": {
|
|
106
|
+
"actions": {
|
|
107
|
+
"back": "뒤로",
|
|
108
|
+
"continue": "계속",
|
|
109
|
+
"next": "다음",
|
|
110
|
+
"getStarted": "시작하기",
|
|
111
|
+
"createAccount": "계정 만들기",
|
|
112
|
+
"signIn": "로그인",
|
|
113
|
+
"verify": "확인",
|
|
114
|
+
"resetPassword": "비밀번호 재설정"
|
|
115
|
+
},
|
|
116
|
+
"links": {
|
|
117
|
+
"recoverAccount": "계정 복구",
|
|
118
|
+
"signUp": "가입하기"
|
|
119
|
+
},
|
|
120
|
+
"labels": {
|
|
121
|
+
"username": "사용자 이름",
|
|
122
|
+
"email": "이메일",
|
|
123
|
+
"password": "비밀번호",
|
|
124
|
+
"confirmPassword": "비밀번호 확인"
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
{
|
|
2
|
+
"signin": {
|
|
3
|
+
"title": "Iniciar sessão",
|
|
4
|
+
"subtitle": "Inicie sessão para continuar",
|
|
5
|
+
"addAccountTitle": "Adicionar outra conta",
|
|
6
|
+
"addAccountSubtitle": "Iniciar sessão com outra conta",
|
|
7
|
+
"username": {
|
|
8
|
+
"label": "Nome de utilizador",
|
|
9
|
+
"placeholder": "Introduza o seu nome de utilizador",
|
|
10
|
+
"helper": "3-30 caracteres, apenas letras e números",
|
|
11
|
+
"required": "Por favor, introduza o seu nome de utilizador.",
|
|
12
|
+
"minLength": "O nome de utilizador deve ter pelo menos 3 caracteres."
|
|
13
|
+
},
|
|
14
|
+
"password": {
|
|
15
|
+
"label": "Palavra-passe",
|
|
16
|
+
"placeholder": "Introduza a sua palavra-passe",
|
|
17
|
+
"required": "Por favor, introduza a sua palavra-passe.",
|
|
18
|
+
"hint": "Introduza a sua palavra-passe para iniciar sessão"
|
|
19
|
+
},
|
|
20
|
+
"actions": {
|
|
21
|
+
"continue": "Continuar",
|
|
22
|
+
"back": "Voltar",
|
|
23
|
+
"signIn": "Iniciar sessão",
|
|
24
|
+
"verify": "Verificar",
|
|
25
|
+
"openAccountSwitcher": "Mudar para outra conta",
|
|
26
|
+
"openAccountSwitcherSubtitle": "{{count}} outras contas disponíveis",
|
|
27
|
+
"openAccountSwitcherSubtitle_singular": "1 outra conta disponível",
|
|
28
|
+
"openAccountSwitcherSubtitle_zero": "Revise as suas contas guardadas",
|
|
29
|
+
"manageAccounts": "Gerir contas guardadas",
|
|
30
|
+
"manageAccountsSubtitle": "Rever sessões, remover ou terminar sessão",
|
|
31
|
+
"loadingOtherAccounts": "A carregar outras contas…",
|
|
32
|
+
"switchAccountFailed": "Não foi possível mudar de conta. Por favor, tente novamente."
|
|
33
|
+
},
|
|
34
|
+
"forgotPrompt": "Esqueceu-se da palavra-passe?",
|
|
35
|
+
"security": {
|
|
36
|
+
"dataSecure": "Os seus dados estão encriptados e seguros"
|
|
37
|
+
},
|
|
38
|
+
"currentlySignedInAs": "Atualmente com sessão iniciada como",
|
|
39
|
+
"alreadySignedInWith": "Já tem sessão iniciada com",
|
|
40
|
+
"alreadySignedIn": "Já tem sessão iniciada",
|
|
41
|
+
"alreadySignedInMessage": "Esta conta já tem sessão iniciada. Continuar com esta conta?",
|
|
42
|
+
"continueWithAccount": "Continuar",
|
|
43
|
+
"currentAccount": "Atual",
|
|
44
|
+
"or": "ou",
|
|
45
|
+
"viewAllAccounts": "Ver mais {{count}}",
|
|
46
|
+
"status": {
|
|
47
|
+
"accountSwitched": "Agora a usar {{name}}"
|
|
48
|
+
},
|
|
49
|
+
"totp": {
|
|
50
|
+
"title": "Código de dois fatores",
|
|
51
|
+
"subtitle": "Introduza o código de 6 dígitos da sua app autenticadora para @{{username}}",
|
|
52
|
+
"invalidCode": "Código inválido. Por favor, tente novamente.",
|
|
53
|
+
"noAccess": "Sem acesso ao seu autenticador?",
|
|
54
|
+
"useBackupCode": "Usar código de backup",
|
|
55
|
+
"useRecoveryKey": "Usar chave de recuperação"
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
"signup": {
|
|
59
|
+
"welcome": {
|
|
60
|
+
"title": "Bem-vindo ao Oxy!",
|
|
61
|
+
"subtitle": "Crie a sua conta em poucos passos",
|
|
62
|
+
"haveAccount": "Já tem uma conta?",
|
|
63
|
+
"signInCta": "Iniciar sessão"
|
|
64
|
+
},
|
|
65
|
+
"identity": {
|
|
66
|
+
"title": "Quem é?",
|
|
67
|
+
"subtitle": "Escolha o seu nome de utilizador e introduza o seu email"
|
|
68
|
+
},
|
|
69
|
+
"username": {
|
|
70
|
+
"helper": "3-30 caracteres, apenas letras e números",
|
|
71
|
+
"required": "Por favor, introduza um nome de utilizador",
|
|
72
|
+
"minLength": "O nome de utilizador deve ter pelo menos 3 caracteres"
|
|
73
|
+
},
|
|
74
|
+
"email": {
|
|
75
|
+
"required": "Por favor, introduza um endereço de email",
|
|
76
|
+
"invalid": "Por favor, introduza um endereço de email válido",
|
|
77
|
+
"helper": "Nunca partilharemos o seu email"
|
|
78
|
+
},
|
|
79
|
+
"security": {
|
|
80
|
+
"title": "Proteja a sua conta",
|
|
81
|
+
"subtitle": "Crie uma palavra-passe forte para proteger a sua conta"
|
|
82
|
+
},
|
|
83
|
+
"password": {
|
|
84
|
+
"helper": "Pelo menos 8 caracteres",
|
|
85
|
+
"required": "Por favor, introduza uma palavra-passe",
|
|
86
|
+
"minLength": "A palavra-passe deve ter pelo menos 8 caracteres",
|
|
87
|
+
"confirmRequired": "Por favor, confirme a sua palavra-passe",
|
|
88
|
+
"mismatch": "As palavras-passe não coincidem",
|
|
89
|
+
"confirmHint": "Reintroduza a sua palavra-passe para confirmar"
|
|
90
|
+
},
|
|
91
|
+
"summary": {
|
|
92
|
+
"title": "Quase lá!",
|
|
93
|
+
"subtitle": "Revise as suas informações e crie a sua conta",
|
|
94
|
+
"sectionTitle": "Informações da conta",
|
|
95
|
+
"fields": {
|
|
96
|
+
"username": "Nome de utilizador",
|
|
97
|
+
"email": "Email",
|
|
98
|
+
"password": "Palavra-passe"
|
|
99
|
+
},
|
|
100
|
+
"notSet": "Não definido",
|
|
101
|
+
"securityTip": "Para maior segurança, ative a Autenticação de Dois Fatores (TOTP) nas Definições da conta após criar a sua conta.",
|
|
102
|
+
"legalReminder": "Ao criar uma conta, concorda com os nossos Termos de Serviço e Política de Privacidade."
|
|
103
|
+
}
|
|
104
|
+
},
|
|
105
|
+
"common": {
|
|
106
|
+
"actions": {
|
|
107
|
+
"back": "Voltar",
|
|
108
|
+
"continue": "Continuar",
|
|
109
|
+
"next": "Seguinte",
|
|
110
|
+
"getStarted": "Começar",
|
|
111
|
+
"createAccount": "Criar conta",
|
|
112
|
+
"signIn": "Iniciar sessão",
|
|
113
|
+
"verify": "Verificar",
|
|
114
|
+
"resetPassword": "Repor palavra-passe"
|
|
115
|
+
},
|
|
116
|
+
"links": {
|
|
117
|
+
"recoverAccount": "Recuperar a sua conta",
|
|
118
|
+
"signUp": "Registar-se"
|
|
119
|
+
},
|
|
120
|
+
"labels": {
|
|
121
|
+
"username": "Nome de utilizador",
|
|
122
|
+
"email": "Email",
|
|
123
|
+
"password": "Palavra-passe",
|
|
124
|
+
"confirmPassword": "Confirmar palavra-passe"
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
{
|
|
2
|
+
"signin": {
|
|
3
|
+
"title": "登录",
|
|
4
|
+
"subtitle": "登录以继续",
|
|
5
|
+
"addAccountTitle": "添加另一个账户",
|
|
6
|
+
"addAccountSubtitle": "使用另一个账户登录",
|
|
7
|
+
"username": {
|
|
8
|
+
"label": "用户名",
|
|
9
|
+
"placeholder": "输入您的用户名",
|
|
10
|
+
"helper": "3-30个字符,仅字母和数字",
|
|
11
|
+
"required": "请输入您的用户名。",
|
|
12
|
+
"minLength": "用户名必须至少包含3个字符。"
|
|
13
|
+
},
|
|
14
|
+
"password": {
|
|
15
|
+
"label": "密码",
|
|
16
|
+
"placeholder": "输入您的密码",
|
|
17
|
+
"required": "请输入您的密码。",
|
|
18
|
+
"hint": "输入您的密码以登录"
|
|
19
|
+
},
|
|
20
|
+
"actions": {
|
|
21
|
+
"continue": "继续",
|
|
22
|
+
"back": "返回",
|
|
23
|
+
"signIn": "登录",
|
|
24
|
+
"verify": "验证",
|
|
25
|
+
"openAccountSwitcher": "切换到另一个账户",
|
|
26
|
+
"openAccountSwitcherSubtitle": "{{count}}个其他账户可用",
|
|
27
|
+
"openAccountSwitcherSubtitle_singular": "1个其他账户可用",
|
|
28
|
+
"openAccountSwitcherSubtitle_zero": "查看您保存的账户",
|
|
29
|
+
"manageAccounts": "管理保存的账户",
|
|
30
|
+
"manageAccountsSubtitle": "查看会话、删除或登出",
|
|
31
|
+
"loadingOtherAccounts": "加载其他账户中…",
|
|
32
|
+
"switchAccountFailed": "无法切换账户。请重试。"
|
|
33
|
+
},
|
|
34
|
+
"forgotPrompt": "忘记密码?",
|
|
35
|
+
"security": {
|
|
36
|
+
"dataSecure": "您的数据已加密且安全"
|
|
37
|
+
},
|
|
38
|
+
"currentlySignedInAs": "当前登录为",
|
|
39
|
+
"alreadySignedInWith": "已登录",
|
|
40
|
+
"alreadySignedIn": "已登录",
|
|
41
|
+
"alreadySignedInMessage": "此账户已登录。继续使用此账户?",
|
|
42
|
+
"continueWithAccount": "继续",
|
|
43
|
+
"currentAccount": "当前",
|
|
44
|
+
"or": "或",
|
|
45
|
+
"viewAllAccounts": "查看更多{{count}}个",
|
|
46
|
+
"status": {
|
|
47
|
+
"accountSwitched": "正在使用{{name}}"
|
|
48
|
+
},
|
|
49
|
+
"totp": {
|
|
50
|
+
"title": "双因素验证码",
|
|
51
|
+
"subtitle": "输入@{{username}}的验证器应用中的6位数字代码",
|
|
52
|
+
"invalidCode": "无效的代码。请重试。",
|
|
53
|
+
"noAccess": "无法访问您的验证器?",
|
|
54
|
+
"useBackupCode": "使用备份代码",
|
|
55
|
+
"useRecoveryKey": "使用恢复密钥"
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
"signup": {
|
|
59
|
+
"welcome": {
|
|
60
|
+
"title": "欢迎使用Oxy!",
|
|
61
|
+
"subtitle": "只需几步即可创建您的账户",
|
|
62
|
+
"haveAccount": "已有账户?",
|
|
63
|
+
"signInCta": "登录"
|
|
64
|
+
},
|
|
65
|
+
"identity": {
|
|
66
|
+
"title": "您是谁?",
|
|
67
|
+
"subtitle": "选择您的用户名并输入您的电子邮件"
|
|
68
|
+
},
|
|
69
|
+
"username": {
|
|
70
|
+
"helper": "3-30个字符,仅字母和数字",
|
|
71
|
+
"required": "请输入用户名",
|
|
72
|
+
"minLength": "用户名必须至少包含3个字符"
|
|
73
|
+
},
|
|
74
|
+
"email": {
|
|
75
|
+
"required": "请输入电子邮件地址",
|
|
76
|
+
"invalid": "请输入有效的电子邮件地址",
|
|
77
|
+
"helper": "我们绝不会分享您的电子邮件"
|
|
78
|
+
},
|
|
79
|
+
"security": {
|
|
80
|
+
"title": "保护您的账户",
|
|
81
|
+
"subtitle": "创建强密码以保护您的账户"
|
|
82
|
+
},
|
|
83
|
+
"password": {
|
|
84
|
+
"helper": "至少8个字符",
|
|
85
|
+
"required": "请输入密码",
|
|
86
|
+
"minLength": "密码必须至少包含8个字符",
|
|
87
|
+
"confirmRequired": "请确认您的密码",
|
|
88
|
+
"mismatch": "密码不匹配",
|
|
89
|
+
"confirmHint": "重新输入您的密码以确认"
|
|
90
|
+
},
|
|
91
|
+
"summary": {
|
|
92
|
+
"title": "快完成了!",
|
|
93
|
+
"subtitle": "查看您的信息并创建账户",
|
|
94
|
+
"sectionTitle": "账户信息",
|
|
95
|
+
"fields": {
|
|
96
|
+
"username": "用户名",
|
|
97
|
+
"email": "电子邮件",
|
|
98
|
+
"password": "密码"
|
|
99
|
+
},
|
|
100
|
+
"notSet": "未设置",
|
|
101
|
+
"securityTip": "为了更强的安全性,创建账户后,请在账户设置中启用双因素身份验证(TOTP)。",
|
|
102
|
+
"legalReminder": "创建账户即表示您同意我们的服务条款和隐私政策。"
|
|
103
|
+
}
|
|
104
|
+
},
|
|
105
|
+
"common": {
|
|
106
|
+
"actions": {
|
|
107
|
+
"back": "返回",
|
|
108
|
+
"continue": "继续",
|
|
109
|
+
"next": "下一步",
|
|
110
|
+
"getStarted": "开始",
|
|
111
|
+
"createAccount": "创建账户",
|
|
112
|
+
"signIn": "登录",
|
|
113
|
+
"verify": "验证",
|
|
114
|
+
"resetPassword": "重置密码"
|
|
115
|
+
},
|
|
116
|
+
"links": {
|
|
117
|
+
"recoverAccount": "恢复您的账户",
|
|
118
|
+
"signUp": "注册"
|
|
119
|
+
},
|
|
120
|
+
"labels": {
|
|
121
|
+
"username": "用户名",
|
|
122
|
+
"email": "电子邮件",
|
|
123
|
+
"password": "密码",
|
|
124
|
+
"confirmPassword": "确认密码"
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type React from 'react';
|
|
2
2
|
import { useState, useEffect } from 'react';
|
|
3
|
-
import {
|
|
3
|
+
import { Platform } from 'react-native';
|
|
4
4
|
import * as Font from 'expo-font';
|
|
5
5
|
|
|
6
6
|
/**
|
|
@@ -21,21 +21,22 @@ const getPhuduFonts = () => {
|
|
|
21
21
|
'Phudu-Black': require('../../assets/fonts/Phudu/Phudu-Black.ttf'),
|
|
22
22
|
};
|
|
23
23
|
} catch (error) {
|
|
24
|
+
if (__DEV__) {
|
|
24
25
|
console.warn('Failed to load Phudu fonts:', error);
|
|
26
|
+
}
|
|
25
27
|
return null;
|
|
26
28
|
}
|
|
27
29
|
};
|
|
28
30
|
|
|
29
31
|
/**
|
|
30
|
-
* FontLoader component that loads custom fonts
|
|
32
|
+
* FontLoader component that loads custom fonts in the background while rendering children immediately
|
|
31
33
|
* This works in both the package development and when consumed as an npm package
|
|
34
|
+
* Children render immediately with system fonts as fallback until custom fonts are loaded
|
|
32
35
|
*/
|
|
33
36
|
export const FontLoader = ({
|
|
34
37
|
children,
|
|
35
|
-
fallbackContent,
|
|
36
38
|
}: {
|
|
37
39
|
children: React.ReactNode;
|
|
38
|
-
fallbackContent?: React.ReactNode;
|
|
39
40
|
}) => {
|
|
40
41
|
const [fontState, setFontState] = useState<'loading' | 'loaded' | 'error'>('loading');
|
|
41
42
|
|
|
@@ -54,8 +55,9 @@ export const FontLoader = ({
|
|
|
54
55
|
|
|
55
56
|
setFontState('loaded');
|
|
56
57
|
} catch (error) {
|
|
58
|
+
if (__DEV__) {
|
|
57
59
|
console.error('Error loading fonts:', error);
|
|
58
|
-
|
|
60
|
+
}
|
|
59
61
|
setFontState('error');
|
|
60
62
|
}
|
|
61
63
|
};
|
|
@@ -63,23 +65,14 @@ export const FontLoader = ({
|
|
|
63
65
|
loadFonts();
|
|
64
66
|
}, []);
|
|
65
67
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
return <>{fallbackContent}</>;
|
|
70
|
-
}
|
|
71
|
-
return (
|
|
72
|
-
<View style={styles.loaderContainer}>
|
|
73
|
-
<ActivityIndicator size="small" color="#d169e5" />
|
|
74
|
-
</View>
|
|
75
|
-
);
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
if (fontState === 'error') {
|
|
68
|
+
// Always render children immediately - fonts will load in background
|
|
69
|
+
// If fonts aren't loaded yet, the app will use system fonts as fallback
|
|
70
|
+
if (fontState === 'error' && __DEV__) {
|
|
79
71
|
console.warn('Fonts failed to load. Using system fonts instead.');
|
|
80
72
|
}
|
|
81
73
|
|
|
82
|
-
//
|
|
74
|
+
// Render children immediately, even while fonts are loading
|
|
75
|
+
// Fonts will apply when they're ready, otherwise system fonts are used
|
|
83
76
|
return <>{children}</>;
|
|
84
77
|
};
|
|
85
78
|
|
|
@@ -148,35 +141,22 @@ export const setupFonts = async () => {
|
|
|
148
141
|
`;
|
|
149
142
|
|
|
150
143
|
style.textContent = fontFaceRules;
|
|
151
|
-
// Append to the document head
|
|
152
144
|
document.head.appendChild(style);
|
|
145
|
+
if (__DEV__) {
|
|
153
146
|
console.info('All Phudu web fonts have been dynamically loaded');
|
|
147
|
+
}
|
|
154
148
|
}
|
|
155
149
|
} else {
|
|
156
|
-
// For native platforms, guidance for the package users
|
|
157
|
-
console.info('Fonts should be linked in native projects to use Phudu fonts');
|
|
158
|
-
|
|
159
150
|
// Attempt to load the fonts anyway (this works if the consumer has linked the assets)
|
|
160
151
|
await Font.loadAsync(phuduFonts);
|
|
161
152
|
}
|
|
162
153
|
|
|
163
154
|
return true;
|
|
164
155
|
} catch (error: unknown) {
|
|
156
|
+
if (__DEV__) {
|
|
165
157
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
166
158
|
console.warn('Error setting up fonts:', errorMessage);
|
|
159
|
+
}
|
|
167
160
|
return false;
|
|
168
161
|
}
|
|
169
|
-
};
|
|
170
|
-
|
|
171
|
-
const styles = StyleSheet.create({
|
|
172
|
-
loaderContainer: {
|
|
173
|
-
position: 'absolute',
|
|
174
|
-
top: 0,
|
|
175
|
-
left: 0,
|
|
176
|
-
right: 0,
|
|
177
|
-
bottom: 0,
|
|
178
|
-
justifyContent: 'center',
|
|
179
|
-
alignItems: 'center',
|
|
180
|
-
backgroundColor: 'transparent',
|
|
181
|
-
},
|
|
182
|
-
});
|
|
162
|
+
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { useCallback, useRef, useState, useEffect, useMemo, forwardRef, useImperativeHandle, type FC } from 'react';
|
|
2
2
|
import { View, Text, StyleSheet, Platform, Animated, StatusBar, Keyboard, KeyboardEvent, AppState } from 'react-native';
|
|
3
3
|
import { SafeAreaProvider, useSafeAreaInsets } from 'react-native-safe-area-context';
|
|
4
4
|
import { GestureHandlerRootView } from 'react-native-gesture-handler';
|
|
@@ -10,7 +10,7 @@ import { Toaster } from '../../lib/sonner';
|
|
|
10
10
|
import { QueryClient, QueryClientProvider, focusManager } from '@tanstack/react-query';
|
|
11
11
|
|
|
12
12
|
// Import bottom sheet components directly - no longer a peer dependency
|
|
13
|
-
import { BottomSheetModal, BottomSheetBackdrop, type BottomSheetBackdropProps, BottomSheetModalProvider, BottomSheetView
|
|
13
|
+
import { BottomSheetModal, BottomSheetBackdrop, type BottomSheetBackdropProps, BottomSheetModalProvider, BottomSheetView } from '@gorhom/bottom-sheet';
|
|
14
14
|
import type { BottomSheetModalMethods as BottomSheetModalRef } from '@gorhom/bottom-sheet/lib/typescript/types';
|
|
15
15
|
|
|
16
16
|
// Initialize fonts automatically
|
|
@@ -23,7 +23,7 @@ setupFonts();
|
|
|
23
23
|
* 1. As a context provider for authentication and session management across the app
|
|
24
24
|
* 2. As a UI component for authentication and account management using a bottom sheet
|
|
25
25
|
*/
|
|
26
|
-
const OxyProvider:
|
|
26
|
+
const OxyProvider: FC<OxyProviderProps> = (props) => {
|
|
27
27
|
const {
|
|
28
28
|
oxyServices,
|
|
29
29
|
children,
|
|
@@ -335,18 +335,19 @@ const OxyBottomSheet = forwardRef<BottomSheetController, OxyBottomSheetProps>(({
|
|
|
335
335
|
onChange={(index) => { isOpenRef.current = index !== -1; }}
|
|
336
336
|
onDismiss={() => { isOpenRef.current = false; }}
|
|
337
337
|
>
|
|
338
|
-
<
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
338
|
+
<BottomSheetView style={[styles.contentContainer]}>
|
|
339
|
+
<View
|
|
340
|
+
style={[
|
|
341
|
+
styles.centeredContentWrapper,
|
|
342
|
+
{ paddingBottom: (insets?.bottom ?? 0) + (appInsets?.bottom ?? 0) }
|
|
343
|
+
]}
|
|
344
|
+
>
|
|
344
345
|
<Animated.View
|
|
345
346
|
style={[
|
|
346
347
|
styles.animatedContent,
|
|
347
|
-
Platform.OS === 'android'
|
|
348
|
-
{ opacity: 1 }
|
|
349
|
-
{ opacity: fadeAnim, transform: [{ translateY: slideAnim }] }
|
|
348
|
+
Platform.OS === 'android'
|
|
349
|
+
? { opacity: 1 }
|
|
350
|
+
: { opacity: fadeAnim, transform: [{ translateY: slideAnim }] }
|
|
350
351
|
]}
|
|
351
352
|
>
|
|
352
353
|
{oxyServices ? (
|
|
@@ -366,7 +367,7 @@ const OxyBottomSheet = forwardRef<BottomSheetController, OxyBottomSheetProps>(({
|
|
|
366
367
|
)}
|
|
367
368
|
</Animated.View>
|
|
368
369
|
</View>
|
|
369
|
-
</
|
|
370
|
+
</BottomSheetView>
|
|
370
371
|
{showInternalToaster && (
|
|
371
372
|
<View style={styles.toasterContainer}>
|
|
372
373
|
<Toaster position="top-center" swipeToDismissDirection="left" />
|