@ttoss/react-auth-strapi 0.2.53 → 0.2.56
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/package.json +7 -7
- package/dist/esm/index.js +0 -293
- package/dist/index.d.cts +0 -20
- package/dist/index.d.ts +0 -20
- package/dist/index.js +0 -342
- package/i18n/compiled/en.json +0 -404
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ttoss/react-auth-strapi",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.56",
|
|
4
4
|
"description": "Authentication components and abstractions for React apps using Strapi.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "ttoss",
|
|
@@ -26,19 +26,19 @@
|
|
|
26
26
|
"sideEffects": false,
|
|
27
27
|
"peerDependencies": {
|
|
28
28
|
"react": ">=16.8.0",
|
|
29
|
-
"@ttoss/react-auth-core": "^0.2.
|
|
30
|
-
"@ttoss/react-
|
|
31
|
-
"@ttoss/react-
|
|
29
|
+
"@ttoss/react-auth-core": "^0.2.56",
|
|
30
|
+
"@ttoss/react-notifications": "^2.5.9",
|
|
31
|
+
"@ttoss/react-i18n": "^2.0.25"
|
|
32
32
|
},
|
|
33
33
|
"devDependencies": {
|
|
34
34
|
"@types/react": "^19.2.7",
|
|
35
35
|
"jest": "^30.2.0",
|
|
36
36
|
"react": "^19.2.1",
|
|
37
37
|
"tsup": "^8.5.1",
|
|
38
|
-
"@ttoss/i18n-cli": "^0.7.38",
|
|
39
38
|
"@ttoss/react-i18n": "^2.0.25",
|
|
40
|
-
"@ttoss/react-
|
|
41
|
-
"@ttoss/
|
|
39
|
+
"@ttoss/react-notifications": "^2.5.9",
|
|
40
|
+
"@ttoss/i18n-cli": "^0.7.38",
|
|
41
|
+
"@ttoss/react-auth-core": "^0.2.56"
|
|
42
42
|
},
|
|
43
43
|
"keywords": [
|
|
44
44
|
"React",
|
package/dist/esm/index.js
DELETED
|
@@ -1,293 +0,0 @@
|
|
|
1
|
-
/** Powered by @ttoss/config. https://ttoss.dev/docs/modules/packages/config/ */
|
|
2
|
-
var __defProp = Object.defineProperty;
|
|
3
|
-
var __name = (target, value) => __defProp(target, "name", {
|
|
4
|
-
value,
|
|
5
|
-
configurable: true
|
|
6
|
-
});
|
|
7
|
-
|
|
8
|
-
// src/Auth.tsx
|
|
9
|
-
import { Auth as AuthCore, useAuthScreen } from "@ttoss/react-auth-core";
|
|
10
|
-
import { useNotifications } from "@ttoss/react-notifications";
|
|
11
|
-
import * as React2 from "react";
|
|
12
|
-
|
|
13
|
-
// src/AuthProvider.tsx
|
|
14
|
-
import { AuthProvider as AuthProviderCore, useAuth as useAuthCore } from "@ttoss/react-auth-core";
|
|
15
|
-
import * as React from "react";
|
|
16
|
-
|
|
17
|
-
// src/storage.ts
|
|
18
|
-
var AUTH_STORAGE_REFRESH_TOKEN_KEY = "ttoss-strapi-auth-refresh-token";
|
|
19
|
-
var isBrowser = typeof window !== "undefined";
|
|
20
|
-
var getLocalStorage = /* @__PURE__ */__name(() => {
|
|
21
|
-
try {
|
|
22
|
-
return isBrowser ? window.localStorage : null;
|
|
23
|
-
} catch {
|
|
24
|
-
return null;
|
|
25
|
-
}
|
|
26
|
-
}, "getLocalStorage");
|
|
27
|
-
var storage = {
|
|
28
|
-
getRefreshToken: /* @__PURE__ */__name(() => {
|
|
29
|
-
const ls = getLocalStorage();
|
|
30
|
-
if (!ls) return null;
|
|
31
|
-
try {
|
|
32
|
-
return ls.getItem(AUTH_STORAGE_REFRESH_TOKEN_KEY);
|
|
33
|
-
} catch {
|
|
34
|
-
return null;
|
|
35
|
-
}
|
|
36
|
-
}, "getRefreshToken"),
|
|
37
|
-
setRefreshToken: /* @__PURE__ */__name(refreshToken => {
|
|
38
|
-
const ls = getLocalStorage();
|
|
39
|
-
if (!ls) return;
|
|
40
|
-
try {
|
|
41
|
-
ls.setItem(AUTH_STORAGE_REFRESH_TOKEN_KEY, refreshToken);
|
|
42
|
-
} catch {}
|
|
43
|
-
}, "setRefreshToken"),
|
|
44
|
-
clearRefreshToken: /* @__PURE__ */__name(() => {
|
|
45
|
-
const ls = getLocalStorage();
|
|
46
|
-
if (!ls) return;
|
|
47
|
-
try {
|
|
48
|
-
ls.removeItem(AUTH_STORAGE_REFRESH_TOKEN_KEY);
|
|
49
|
-
} catch {}
|
|
50
|
-
}, "clearRefreshToken")
|
|
51
|
-
};
|
|
52
|
-
|
|
53
|
-
// src/AuthProvider.tsx
|
|
54
|
-
var AuthContext = /* @__PURE__ */React.createContext({
|
|
55
|
-
apiUrl: ""
|
|
56
|
-
});
|
|
57
|
-
var AuthProvider = /* @__PURE__ */__name(props => {
|
|
58
|
-
const getAuthData = React.useCallback(async () => {
|
|
59
|
-
try {
|
|
60
|
-
const refreshToken = storage.getRefreshToken();
|
|
61
|
-
if (!refreshToken) {
|
|
62
|
-
return null;
|
|
63
|
-
}
|
|
64
|
-
const refreshResponse = await fetch(`${props.apiUrl}/auth/local/refresh`, {
|
|
65
|
-
method: "POST",
|
|
66
|
-
headers: {
|
|
67
|
-
"Content-Type": "application/json"
|
|
68
|
-
},
|
|
69
|
-
body: JSON.stringify({
|
|
70
|
-
refreshToken
|
|
71
|
-
})
|
|
72
|
-
});
|
|
73
|
-
const refreshData = await refreshResponse.json();
|
|
74
|
-
if ("error" in refreshData) {
|
|
75
|
-
storage.clearRefreshToken();
|
|
76
|
-
return null;
|
|
77
|
-
}
|
|
78
|
-
const meResponse = await fetch(`${props.apiUrl}/users/me`, {
|
|
79
|
-
headers: {
|
|
80
|
-
Authorization: `Bearer ${refreshData.jwt}`
|
|
81
|
-
}
|
|
82
|
-
});
|
|
83
|
-
const data = await meResponse.json();
|
|
84
|
-
if (!meResponse.ok) {
|
|
85
|
-
storage.clearRefreshToken();
|
|
86
|
-
return null;
|
|
87
|
-
}
|
|
88
|
-
storage.setRefreshToken(refreshData.refreshToken);
|
|
89
|
-
return {
|
|
90
|
-
user: {
|
|
91
|
-
id: data.id,
|
|
92
|
-
email: data.email,
|
|
93
|
-
emailVerified: data.confirmed ?? data.emailVerified ?? data.user?.confirmed
|
|
94
|
-
},
|
|
95
|
-
tokens: {
|
|
96
|
-
accessToken: refreshData.jwt,
|
|
97
|
-
refreshToken: refreshData.refreshToken
|
|
98
|
-
},
|
|
99
|
-
isAuthenticated: true
|
|
100
|
-
};
|
|
101
|
-
} catch {
|
|
102
|
-
storage.clearRefreshToken();
|
|
103
|
-
return null;
|
|
104
|
-
}
|
|
105
|
-
}, [props.apiUrl]);
|
|
106
|
-
const signOut = React.useCallback(async () => {
|
|
107
|
-
storage.clearRefreshToken();
|
|
108
|
-
}, []);
|
|
109
|
-
return /* @__PURE__ */React.createElement(AuthContext.Provider, {
|
|
110
|
-
value: {
|
|
111
|
-
apiUrl: props.apiUrl
|
|
112
|
-
}
|
|
113
|
-
}, /* @__PURE__ */React.createElement(AuthProviderCore, {
|
|
114
|
-
getAuthData,
|
|
115
|
-
signOut
|
|
116
|
-
}, props.children));
|
|
117
|
-
}, "AuthProvider");
|
|
118
|
-
var useAuth = /* @__PURE__ */__name(() => {
|
|
119
|
-
const authCore = useAuthCore();
|
|
120
|
-
const {
|
|
121
|
-
apiUrl
|
|
122
|
-
} = React.useContext(AuthContext);
|
|
123
|
-
return {
|
|
124
|
-
apiUrl,
|
|
125
|
-
...authCore
|
|
126
|
-
};
|
|
127
|
-
}, "useAuth");
|
|
128
|
-
|
|
129
|
-
// src/Auth.tsx
|
|
130
|
-
var Auth = /* @__PURE__ */__name(props => {
|
|
131
|
-
const {
|
|
132
|
-
setAuthData,
|
|
133
|
-
apiUrl
|
|
134
|
-
} = useAuth();
|
|
135
|
-
const {
|
|
136
|
-
screen,
|
|
137
|
-
setScreen
|
|
138
|
-
} = useAuthScreen();
|
|
139
|
-
const {
|
|
140
|
-
addNotification
|
|
141
|
-
} = useNotifications();
|
|
142
|
-
const onSignIn = React2.useCallback(async ({
|
|
143
|
-
email,
|
|
144
|
-
password
|
|
145
|
-
}) => {
|
|
146
|
-
try {
|
|
147
|
-
const response = await fetch(`${apiUrl}/auth/local`, {
|
|
148
|
-
method: "POST",
|
|
149
|
-
headers: {
|
|
150
|
-
"Content-Type": "application/json"
|
|
151
|
-
},
|
|
152
|
-
body: JSON.stringify({
|
|
153
|
-
identifier: email,
|
|
154
|
-
password
|
|
155
|
-
})
|
|
156
|
-
});
|
|
157
|
-
const data = await response.json();
|
|
158
|
-
if (!response.ok) {
|
|
159
|
-
const errorMessage = data.error?.message;
|
|
160
|
-
if (errorMessage === "Your account email is not confirmed") {
|
|
161
|
-
const resendResponse = await fetch(`${apiUrl}/auth/send-email-confirmation`, {
|
|
162
|
-
method: "POST",
|
|
163
|
-
headers: {
|
|
164
|
-
"Content-Type": "application/json"
|
|
165
|
-
},
|
|
166
|
-
body: JSON.stringify({
|
|
167
|
-
email
|
|
168
|
-
})
|
|
169
|
-
});
|
|
170
|
-
if (!resendResponse.ok) {
|
|
171
|
-
const resendData = await resendResponse.json();
|
|
172
|
-
addNotification({
|
|
173
|
-
title: "Resend confirmation email failed",
|
|
174
|
-
message: resendData.error?.message || "An error occurred while resending the confirmation email.",
|
|
175
|
-
type: "error"
|
|
176
|
-
});
|
|
177
|
-
return;
|
|
178
|
-
}
|
|
179
|
-
setScreen({
|
|
180
|
-
value: "confirmSignUpCheckEmail"
|
|
181
|
-
});
|
|
182
|
-
return;
|
|
183
|
-
}
|
|
184
|
-
addNotification({
|
|
185
|
-
title: "Sign in failed",
|
|
186
|
-
message: data.error?.message || "An error occurred during sign in.",
|
|
187
|
-
type: "error"
|
|
188
|
-
});
|
|
189
|
-
return;
|
|
190
|
-
}
|
|
191
|
-
storage.setRefreshToken(data.refreshToken);
|
|
192
|
-
setAuthData({
|
|
193
|
-
user: {
|
|
194
|
-
id: data.user.id,
|
|
195
|
-
email: data.user.email,
|
|
196
|
-
emailVerified: data.user.confirmed
|
|
197
|
-
},
|
|
198
|
-
tokens: {
|
|
199
|
-
accessToken: data.jwt,
|
|
200
|
-
refreshToken: data.refreshToken
|
|
201
|
-
},
|
|
202
|
-
isAuthenticated: true
|
|
203
|
-
});
|
|
204
|
-
} catch {
|
|
205
|
-
addNotification({
|
|
206
|
-
title: "Network Error",
|
|
207
|
-
message: "Unable to connect to the server. Please check your connection.",
|
|
208
|
-
type: "error"
|
|
209
|
-
});
|
|
210
|
-
}
|
|
211
|
-
}, [setAuthData, setScreen, addNotification, apiUrl]);
|
|
212
|
-
const onSignUp = React2.useCallback(async ({
|
|
213
|
-
email,
|
|
214
|
-
password
|
|
215
|
-
}) => {
|
|
216
|
-
try {
|
|
217
|
-
const response = await fetch(`${apiUrl}/auth/local/register`, {
|
|
218
|
-
method: "POST",
|
|
219
|
-
headers: {
|
|
220
|
-
"Content-Type": "application/json"
|
|
221
|
-
},
|
|
222
|
-
body: JSON.stringify({
|
|
223
|
-
username: email,
|
|
224
|
-
email,
|
|
225
|
-
password
|
|
226
|
-
})
|
|
227
|
-
});
|
|
228
|
-
const data = await response.json();
|
|
229
|
-
if (!response.ok) {
|
|
230
|
-
addNotification({
|
|
231
|
-
title: "Sign up failed",
|
|
232
|
-
message: data.error?.message || "An error occurred during sign up.",
|
|
233
|
-
type: "error"
|
|
234
|
-
});
|
|
235
|
-
return;
|
|
236
|
-
}
|
|
237
|
-
setScreen({
|
|
238
|
-
value: "confirmSignUpCheckEmail"
|
|
239
|
-
});
|
|
240
|
-
} catch {
|
|
241
|
-
addNotification({
|
|
242
|
-
title: "Network Error",
|
|
243
|
-
message: "Unable to connect to the server. Please check your connection.",
|
|
244
|
-
type: "error"
|
|
245
|
-
});
|
|
246
|
-
}
|
|
247
|
-
}, [addNotification, setScreen, apiUrl]);
|
|
248
|
-
const onForgotPassword = React2.useCallback(async ({
|
|
249
|
-
email
|
|
250
|
-
}) => {
|
|
251
|
-
try {
|
|
252
|
-
const response = await fetch(`${apiUrl}/auth/forgot-password`, {
|
|
253
|
-
method: "POST",
|
|
254
|
-
headers: {
|
|
255
|
-
"Content-Type": "application/json"
|
|
256
|
-
},
|
|
257
|
-
body: JSON.stringify({
|
|
258
|
-
email
|
|
259
|
-
})
|
|
260
|
-
});
|
|
261
|
-
const data = await response.json();
|
|
262
|
-
if (!response.ok) {
|
|
263
|
-
addNotification({
|
|
264
|
-
title: "Forgot password failed",
|
|
265
|
-
message: data.error?.message || "An error occurred during forgot password.",
|
|
266
|
-
type: "error"
|
|
267
|
-
});
|
|
268
|
-
return;
|
|
269
|
-
}
|
|
270
|
-
} catch {
|
|
271
|
-
addNotification({
|
|
272
|
-
title: "Network Error",
|
|
273
|
-
message: "Unable to connect to the server. Please check your connection.",
|
|
274
|
-
type: "error"
|
|
275
|
-
});
|
|
276
|
-
}
|
|
277
|
-
}, [addNotification, apiUrl]);
|
|
278
|
-
const onConfirmSignUpCheckEmail = React2.useCallback(async () => {
|
|
279
|
-
setScreen({
|
|
280
|
-
value: "signIn"
|
|
281
|
-
});
|
|
282
|
-
}, [setScreen]);
|
|
283
|
-
return /* @__PURE__ */React2.createElement(AuthCore, {
|
|
284
|
-
...props,
|
|
285
|
-
screen,
|
|
286
|
-
setScreen,
|
|
287
|
-
onSignIn,
|
|
288
|
-
onSignUp,
|
|
289
|
-
onForgotPassword,
|
|
290
|
-
onConfirmSignUpCheckEmail
|
|
291
|
-
});
|
|
292
|
-
}, "Auth");
|
|
293
|
-
export { Auth, AuthProvider, useAuth };
|
package/dist/index.d.cts
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
-
import * as _ttoss_react_auth_core from '@ttoss/react-auth-core';
|
|
3
|
-
import { AuthProps } from '@ttoss/react-auth-core';
|
|
4
|
-
import * as React from 'react';
|
|
5
|
-
|
|
6
|
-
declare const Auth: (props: Pick<AuthProps, "logo" | "layout">) => react_jsx_runtime.JSX.Element;
|
|
7
|
-
|
|
8
|
-
declare const AuthProvider: (props: React.PropsWithChildren<{
|
|
9
|
-
apiUrl: string;
|
|
10
|
-
}>) => react_jsx_runtime.JSX.Element;
|
|
11
|
-
declare const useAuth: () => {
|
|
12
|
-
signOut: () => Promise<void>;
|
|
13
|
-
isAuthenticated: boolean;
|
|
14
|
-
user: _ttoss_react_auth_core.AuthUser | null;
|
|
15
|
-
tokens: _ttoss_react_auth_core.AuthTokens | null;
|
|
16
|
-
setAuthData: React.Dispatch<React.SetStateAction<_ttoss_react_auth_core.AuthData>>;
|
|
17
|
-
apiUrl: string;
|
|
18
|
-
};
|
|
19
|
-
|
|
20
|
-
export { Auth, AuthProvider, useAuth };
|
package/dist/index.d.ts
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
-
import * as _ttoss_react_auth_core from '@ttoss/react-auth-core';
|
|
3
|
-
import { AuthProps } from '@ttoss/react-auth-core';
|
|
4
|
-
import * as React from 'react';
|
|
5
|
-
|
|
6
|
-
declare const Auth: (props: Pick<AuthProps, "logo" | "layout">) => react_jsx_runtime.JSX.Element;
|
|
7
|
-
|
|
8
|
-
declare const AuthProvider: (props: React.PropsWithChildren<{
|
|
9
|
-
apiUrl: string;
|
|
10
|
-
}>) => react_jsx_runtime.JSX.Element;
|
|
11
|
-
declare const useAuth: () => {
|
|
12
|
-
signOut: () => Promise<void>;
|
|
13
|
-
isAuthenticated: boolean;
|
|
14
|
-
user: _ttoss_react_auth_core.AuthUser | null;
|
|
15
|
-
tokens: _ttoss_react_auth_core.AuthTokens | null;
|
|
16
|
-
setAuthData: React.Dispatch<React.SetStateAction<_ttoss_react_auth_core.AuthData>>;
|
|
17
|
-
apiUrl: string;
|
|
18
|
-
};
|
|
19
|
-
|
|
20
|
-
export { Auth, AuthProvider, useAuth };
|
package/dist/index.js
DELETED
|
@@ -1,342 +0,0 @@
|
|
|
1
|
-
/** Powered by @ttoss/config. https://ttoss.dev/docs/modules/packages/config/ */
|
|
2
|
-
import * as React from 'react';
|
|
3
|
-
"use strict";
|
|
4
|
-
|
|
5
|
-
var __create = Object.create;
|
|
6
|
-
var __defProp = Object.defineProperty;
|
|
7
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
8
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
9
|
-
var __getProtoOf = Object.getPrototypeOf;
|
|
10
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
11
|
-
var __name = (target, value) => __defProp(target, "name", {
|
|
12
|
-
value,
|
|
13
|
-
configurable: true
|
|
14
|
-
});
|
|
15
|
-
var __export = (target, all) => {
|
|
16
|
-
for (var name in all) __defProp(target, name, {
|
|
17
|
-
get: all[name],
|
|
18
|
-
enumerable: true
|
|
19
|
-
});
|
|
20
|
-
};
|
|
21
|
-
var __copyProps = (to, from, except, desc) => {
|
|
22
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
23
|
-
for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
|
|
24
|
-
get: () => from[key],
|
|
25
|
-
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
|
|
26
|
-
});
|
|
27
|
-
}
|
|
28
|
-
return to;
|
|
29
|
-
};
|
|
30
|
-
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
31
|
-
// If the importer is in node compatibility mode or this is not an ESM
|
|
32
|
-
// file that has been converted to a CommonJS file using a Babel-
|
|
33
|
-
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
34
|
-
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
35
|
-
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
|
|
36
|
-
value: mod,
|
|
37
|
-
enumerable: true
|
|
38
|
-
}) : target, mod));
|
|
39
|
-
var __toCommonJS = mod => __copyProps(__defProp({}, "__esModule", {
|
|
40
|
-
value: true
|
|
41
|
-
}), mod);
|
|
42
|
-
|
|
43
|
-
// src/index.ts
|
|
44
|
-
var index_exports = {};
|
|
45
|
-
__export(index_exports, {
|
|
46
|
-
Auth: () => Auth,
|
|
47
|
-
AuthProvider: () => AuthProvider,
|
|
48
|
-
useAuth: () => useAuth
|
|
49
|
-
});
|
|
50
|
-
module.exports = __toCommonJS(index_exports);
|
|
51
|
-
|
|
52
|
-
// src/Auth.tsx
|
|
53
|
-
var import_react_auth_core2 = require("@ttoss/react-auth-core");
|
|
54
|
-
var import_react_notifications = require("@ttoss/react-notifications");
|
|
55
|
-
var React2 = __toESM(require("react"), 1);
|
|
56
|
-
|
|
57
|
-
// src/AuthProvider.tsx
|
|
58
|
-
var import_react_auth_core = require("@ttoss/react-auth-core");
|
|
59
|
-
var React = __toESM(require("react"), 1);
|
|
60
|
-
|
|
61
|
-
// src/storage.ts
|
|
62
|
-
var AUTH_STORAGE_REFRESH_TOKEN_KEY = "ttoss-strapi-auth-refresh-token";
|
|
63
|
-
var isBrowser = typeof window !== "undefined";
|
|
64
|
-
var getLocalStorage = /* @__PURE__ */__name(() => {
|
|
65
|
-
try {
|
|
66
|
-
return isBrowser ? window.localStorage : null;
|
|
67
|
-
} catch {
|
|
68
|
-
return null;
|
|
69
|
-
}
|
|
70
|
-
}, "getLocalStorage");
|
|
71
|
-
var storage = {
|
|
72
|
-
getRefreshToken: /* @__PURE__ */__name(() => {
|
|
73
|
-
const ls = getLocalStorage();
|
|
74
|
-
if (!ls) return null;
|
|
75
|
-
try {
|
|
76
|
-
return ls.getItem(AUTH_STORAGE_REFRESH_TOKEN_KEY);
|
|
77
|
-
} catch {
|
|
78
|
-
return null;
|
|
79
|
-
}
|
|
80
|
-
}, "getRefreshToken"),
|
|
81
|
-
setRefreshToken: /* @__PURE__ */__name(refreshToken => {
|
|
82
|
-
const ls = getLocalStorage();
|
|
83
|
-
if (!ls) return;
|
|
84
|
-
try {
|
|
85
|
-
ls.setItem(AUTH_STORAGE_REFRESH_TOKEN_KEY, refreshToken);
|
|
86
|
-
} catch {}
|
|
87
|
-
}, "setRefreshToken"),
|
|
88
|
-
clearRefreshToken: /* @__PURE__ */__name(() => {
|
|
89
|
-
const ls = getLocalStorage();
|
|
90
|
-
if (!ls) return;
|
|
91
|
-
try {
|
|
92
|
-
ls.removeItem(AUTH_STORAGE_REFRESH_TOKEN_KEY);
|
|
93
|
-
} catch {}
|
|
94
|
-
}, "clearRefreshToken")
|
|
95
|
-
};
|
|
96
|
-
|
|
97
|
-
// src/AuthProvider.tsx
|
|
98
|
-
var AuthContext = /* @__PURE__ */React.createContext({
|
|
99
|
-
apiUrl: ""
|
|
100
|
-
});
|
|
101
|
-
var AuthProvider = /* @__PURE__ */__name(props => {
|
|
102
|
-
const getAuthData = React.useCallback(async () => {
|
|
103
|
-
try {
|
|
104
|
-
const refreshToken = storage.getRefreshToken();
|
|
105
|
-
if (!refreshToken) {
|
|
106
|
-
return null;
|
|
107
|
-
}
|
|
108
|
-
const refreshResponse = await fetch(`${props.apiUrl}/auth/local/refresh`, {
|
|
109
|
-
method: "POST",
|
|
110
|
-
headers: {
|
|
111
|
-
"Content-Type": "application/json"
|
|
112
|
-
},
|
|
113
|
-
body: JSON.stringify({
|
|
114
|
-
refreshToken
|
|
115
|
-
})
|
|
116
|
-
});
|
|
117
|
-
const refreshData = await refreshResponse.json();
|
|
118
|
-
if ("error" in refreshData) {
|
|
119
|
-
storage.clearRefreshToken();
|
|
120
|
-
return null;
|
|
121
|
-
}
|
|
122
|
-
const meResponse = await fetch(`${props.apiUrl}/users/me`, {
|
|
123
|
-
headers: {
|
|
124
|
-
Authorization: `Bearer ${refreshData.jwt}`
|
|
125
|
-
}
|
|
126
|
-
});
|
|
127
|
-
const data = await meResponse.json();
|
|
128
|
-
if (!meResponse.ok) {
|
|
129
|
-
storage.clearRefreshToken();
|
|
130
|
-
return null;
|
|
131
|
-
}
|
|
132
|
-
storage.setRefreshToken(refreshData.refreshToken);
|
|
133
|
-
return {
|
|
134
|
-
user: {
|
|
135
|
-
id: data.id,
|
|
136
|
-
email: data.email,
|
|
137
|
-
emailVerified: data.confirmed ?? data.emailVerified ?? data.user?.confirmed
|
|
138
|
-
},
|
|
139
|
-
tokens: {
|
|
140
|
-
accessToken: refreshData.jwt,
|
|
141
|
-
refreshToken: refreshData.refreshToken
|
|
142
|
-
},
|
|
143
|
-
isAuthenticated: true
|
|
144
|
-
};
|
|
145
|
-
} catch {
|
|
146
|
-
storage.clearRefreshToken();
|
|
147
|
-
return null;
|
|
148
|
-
}
|
|
149
|
-
}, [props.apiUrl]);
|
|
150
|
-
const signOut = React.useCallback(async () => {
|
|
151
|
-
storage.clearRefreshToken();
|
|
152
|
-
}, []);
|
|
153
|
-
return /* @__PURE__ */React.createElement(AuthContext.Provider, {
|
|
154
|
-
value: {
|
|
155
|
-
apiUrl: props.apiUrl
|
|
156
|
-
}
|
|
157
|
-
}, /* @__PURE__ */React.createElement(import_react_auth_core.AuthProvider, {
|
|
158
|
-
getAuthData,
|
|
159
|
-
signOut
|
|
160
|
-
}, props.children));
|
|
161
|
-
}, "AuthProvider");
|
|
162
|
-
var useAuth = /* @__PURE__ */__name(() => {
|
|
163
|
-
const authCore = (0, import_react_auth_core.useAuth)();
|
|
164
|
-
const {
|
|
165
|
-
apiUrl
|
|
166
|
-
} = React.useContext(AuthContext);
|
|
167
|
-
return {
|
|
168
|
-
apiUrl,
|
|
169
|
-
...authCore
|
|
170
|
-
};
|
|
171
|
-
}, "useAuth");
|
|
172
|
-
|
|
173
|
-
// src/Auth.tsx
|
|
174
|
-
var Auth = /* @__PURE__ */__name(props => {
|
|
175
|
-
const {
|
|
176
|
-
setAuthData,
|
|
177
|
-
apiUrl
|
|
178
|
-
} = useAuth();
|
|
179
|
-
const {
|
|
180
|
-
screen,
|
|
181
|
-
setScreen
|
|
182
|
-
} = (0, import_react_auth_core2.useAuthScreen)();
|
|
183
|
-
const {
|
|
184
|
-
addNotification
|
|
185
|
-
} = (0, import_react_notifications.useNotifications)();
|
|
186
|
-
const onSignIn = React2.useCallback(async ({
|
|
187
|
-
email,
|
|
188
|
-
password
|
|
189
|
-
}) => {
|
|
190
|
-
try {
|
|
191
|
-
const response = await fetch(`${apiUrl}/auth/local`, {
|
|
192
|
-
method: "POST",
|
|
193
|
-
headers: {
|
|
194
|
-
"Content-Type": "application/json"
|
|
195
|
-
},
|
|
196
|
-
body: JSON.stringify({
|
|
197
|
-
identifier: email,
|
|
198
|
-
password
|
|
199
|
-
})
|
|
200
|
-
});
|
|
201
|
-
const data = await response.json();
|
|
202
|
-
if (!response.ok) {
|
|
203
|
-
const errorMessage = data.error?.message;
|
|
204
|
-
if (errorMessage === "Your account email is not confirmed") {
|
|
205
|
-
const resendResponse = await fetch(`${apiUrl}/auth/send-email-confirmation`, {
|
|
206
|
-
method: "POST",
|
|
207
|
-
headers: {
|
|
208
|
-
"Content-Type": "application/json"
|
|
209
|
-
},
|
|
210
|
-
body: JSON.stringify({
|
|
211
|
-
email
|
|
212
|
-
})
|
|
213
|
-
});
|
|
214
|
-
if (!resendResponse.ok) {
|
|
215
|
-
const resendData = await resendResponse.json();
|
|
216
|
-
addNotification({
|
|
217
|
-
title: "Resend confirmation email failed",
|
|
218
|
-
message: resendData.error?.message || "An error occurred while resending the confirmation email.",
|
|
219
|
-
type: "error"
|
|
220
|
-
});
|
|
221
|
-
return;
|
|
222
|
-
}
|
|
223
|
-
setScreen({
|
|
224
|
-
value: "confirmSignUpCheckEmail"
|
|
225
|
-
});
|
|
226
|
-
return;
|
|
227
|
-
}
|
|
228
|
-
addNotification({
|
|
229
|
-
title: "Sign in failed",
|
|
230
|
-
message: data.error?.message || "An error occurred during sign in.",
|
|
231
|
-
type: "error"
|
|
232
|
-
});
|
|
233
|
-
return;
|
|
234
|
-
}
|
|
235
|
-
storage.setRefreshToken(data.refreshToken);
|
|
236
|
-
setAuthData({
|
|
237
|
-
user: {
|
|
238
|
-
id: data.user.id,
|
|
239
|
-
email: data.user.email,
|
|
240
|
-
emailVerified: data.user.confirmed
|
|
241
|
-
},
|
|
242
|
-
tokens: {
|
|
243
|
-
accessToken: data.jwt,
|
|
244
|
-
refreshToken: data.refreshToken
|
|
245
|
-
},
|
|
246
|
-
isAuthenticated: true
|
|
247
|
-
});
|
|
248
|
-
} catch {
|
|
249
|
-
addNotification({
|
|
250
|
-
title: "Network Error",
|
|
251
|
-
message: "Unable to connect to the server. Please check your connection.",
|
|
252
|
-
type: "error"
|
|
253
|
-
});
|
|
254
|
-
}
|
|
255
|
-
}, [setAuthData, setScreen, addNotification, apiUrl]);
|
|
256
|
-
const onSignUp = React2.useCallback(async ({
|
|
257
|
-
email,
|
|
258
|
-
password
|
|
259
|
-
}) => {
|
|
260
|
-
try {
|
|
261
|
-
const response = await fetch(`${apiUrl}/auth/local/register`, {
|
|
262
|
-
method: "POST",
|
|
263
|
-
headers: {
|
|
264
|
-
"Content-Type": "application/json"
|
|
265
|
-
},
|
|
266
|
-
body: JSON.stringify({
|
|
267
|
-
username: email,
|
|
268
|
-
email,
|
|
269
|
-
password
|
|
270
|
-
})
|
|
271
|
-
});
|
|
272
|
-
const data = await response.json();
|
|
273
|
-
if (!response.ok) {
|
|
274
|
-
addNotification({
|
|
275
|
-
title: "Sign up failed",
|
|
276
|
-
message: data.error?.message || "An error occurred during sign up.",
|
|
277
|
-
type: "error"
|
|
278
|
-
});
|
|
279
|
-
return;
|
|
280
|
-
}
|
|
281
|
-
setScreen({
|
|
282
|
-
value: "confirmSignUpCheckEmail"
|
|
283
|
-
});
|
|
284
|
-
} catch {
|
|
285
|
-
addNotification({
|
|
286
|
-
title: "Network Error",
|
|
287
|
-
message: "Unable to connect to the server. Please check your connection.",
|
|
288
|
-
type: "error"
|
|
289
|
-
});
|
|
290
|
-
}
|
|
291
|
-
}, [addNotification, setScreen, apiUrl]);
|
|
292
|
-
const onForgotPassword = React2.useCallback(async ({
|
|
293
|
-
email
|
|
294
|
-
}) => {
|
|
295
|
-
try {
|
|
296
|
-
const response = await fetch(`${apiUrl}/auth/forgot-password`, {
|
|
297
|
-
method: "POST",
|
|
298
|
-
headers: {
|
|
299
|
-
"Content-Type": "application/json"
|
|
300
|
-
},
|
|
301
|
-
body: JSON.stringify({
|
|
302
|
-
email
|
|
303
|
-
})
|
|
304
|
-
});
|
|
305
|
-
const data = await response.json();
|
|
306
|
-
if (!response.ok) {
|
|
307
|
-
addNotification({
|
|
308
|
-
title: "Forgot password failed",
|
|
309
|
-
message: data.error?.message || "An error occurred during forgot password.",
|
|
310
|
-
type: "error"
|
|
311
|
-
});
|
|
312
|
-
return;
|
|
313
|
-
}
|
|
314
|
-
} catch {
|
|
315
|
-
addNotification({
|
|
316
|
-
title: "Network Error",
|
|
317
|
-
message: "Unable to connect to the server. Please check your connection.",
|
|
318
|
-
type: "error"
|
|
319
|
-
});
|
|
320
|
-
}
|
|
321
|
-
}, [addNotification, apiUrl]);
|
|
322
|
-
const onConfirmSignUpCheckEmail = React2.useCallback(async () => {
|
|
323
|
-
setScreen({
|
|
324
|
-
value: "signIn"
|
|
325
|
-
});
|
|
326
|
-
}, [setScreen]);
|
|
327
|
-
return /* @__PURE__ */React2.createElement(import_react_auth_core2.Auth, {
|
|
328
|
-
...props,
|
|
329
|
-
screen,
|
|
330
|
-
setScreen,
|
|
331
|
-
onSignIn,
|
|
332
|
-
onSignUp,
|
|
333
|
-
onForgotPassword,
|
|
334
|
-
onConfirmSignUpCheckEmail
|
|
335
|
-
});
|
|
336
|
-
}, "Auth");
|
|
337
|
-
// Annotate the CommonJS export names for ESM import in node:
|
|
338
|
-
0 && (module.exports = {
|
|
339
|
-
Auth,
|
|
340
|
-
AuthProvider,
|
|
341
|
-
useAuth
|
|
342
|
-
});
|
package/i18n/compiled/en.json
DELETED
|
@@ -1,404 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"0+4wTp": [
|
|
3
|
-
{
|
|
4
|
-
"type": 0,
|
|
5
|
-
"value": ","
|
|
6
|
-
}
|
|
7
|
-
],
|
|
8
|
-
"0EjvY6": [
|
|
9
|
-
{
|
|
10
|
-
"type": 0,
|
|
11
|
-
"value": "∞"
|
|
12
|
-
}
|
|
13
|
-
],
|
|
14
|
-
"0XOzcH": [
|
|
15
|
-
{
|
|
16
|
-
"type": 0,
|
|
17
|
-
"value": "Required field"
|
|
18
|
-
}
|
|
19
|
-
],
|
|
20
|
-
"1DbX9V": [
|
|
21
|
-
{
|
|
22
|
-
"type": 0,
|
|
23
|
-
"value": "Near limit"
|
|
24
|
-
}
|
|
25
|
-
],
|
|
26
|
-
"38HSjr": [
|
|
27
|
-
{
|
|
28
|
-
"type": 0,
|
|
29
|
-
"value": "Sign In"
|
|
30
|
-
}
|
|
31
|
-
],
|
|
32
|
-
"4NwCn9": [
|
|
33
|
-
{
|
|
34
|
-
"type": 0,
|
|
35
|
-
"value": "Reached limit"
|
|
36
|
-
}
|
|
37
|
-
],
|
|
38
|
-
"5E12mO": [
|
|
39
|
-
{
|
|
40
|
-
"type": 0,
|
|
41
|
-
"value": "Email"
|
|
42
|
-
}
|
|
43
|
-
],
|
|
44
|
-
"6PdOcy": [
|
|
45
|
-
{
|
|
46
|
-
"type": 0,
|
|
47
|
-
"value": "Cancel"
|
|
48
|
-
}
|
|
49
|
-
],
|
|
50
|
-
"8GMUPk": [
|
|
51
|
-
{
|
|
52
|
-
"type": 0,
|
|
53
|
-
"value": "I'm already registered"
|
|
54
|
-
}
|
|
55
|
-
],
|
|
56
|
-
"9cApwd": [
|
|
57
|
-
{
|
|
58
|
-
"type": 0,
|
|
59
|
-
"value": "Please, insert a valid e-mail"
|
|
60
|
-
}
|
|
61
|
-
],
|
|
62
|
-
"BtK6KR": [
|
|
63
|
-
{
|
|
64
|
-
"type": 0,
|
|
65
|
-
"value": "Forgot password?"
|
|
66
|
-
}
|
|
67
|
-
],
|
|
68
|
-
"Co3exe": [
|
|
69
|
-
{
|
|
70
|
-
"type": 0,
|
|
71
|
-
"value": "By signing up, you agree to the following Terms and Conditions."
|
|
72
|
-
}
|
|
73
|
-
],
|
|
74
|
-
"D1C6fR": [
|
|
75
|
-
{
|
|
76
|
-
"type": 0,
|
|
77
|
-
"value": "Field must be at least "
|
|
78
|
-
},
|
|
79
|
-
{
|
|
80
|
-
"type": 1,
|
|
81
|
-
"value": "min"
|
|
82
|
-
},
|
|
83
|
-
{
|
|
84
|
-
"type": 0,
|
|
85
|
-
"value": " characters"
|
|
86
|
-
}
|
|
87
|
-
],
|
|
88
|
-
"EZ3YF2": [
|
|
89
|
-
{
|
|
90
|
-
"type": 0,
|
|
91
|
-
"value": "Sign up"
|
|
92
|
-
}
|
|
93
|
-
],
|
|
94
|
-
"G/yZLu": [
|
|
95
|
-
{
|
|
96
|
-
"type": 0,
|
|
97
|
-
"value": "Remove"
|
|
98
|
-
}
|
|
99
|
-
],
|
|
100
|
-
"HT4tSM": [
|
|
101
|
-
{
|
|
102
|
-
"type": 0,
|
|
103
|
-
"value": "Reset Password"
|
|
104
|
-
}
|
|
105
|
-
],
|
|
106
|
-
"JEsxDw": [
|
|
107
|
-
{
|
|
108
|
-
"type": 0,
|
|
109
|
-
"value": "Uploading..."
|
|
110
|
-
}
|
|
111
|
-
],
|
|
112
|
-
"JnCaDG": [
|
|
113
|
-
{
|
|
114
|
-
"type": 0,
|
|
115
|
-
"value": "."
|
|
116
|
-
}
|
|
117
|
-
],
|
|
118
|
-
"KY2T6J": [
|
|
119
|
-
{
|
|
120
|
-
"type": 0,
|
|
121
|
-
"value": "Code"
|
|
122
|
-
}
|
|
123
|
-
],
|
|
124
|
-
"MfWGyg": [
|
|
125
|
-
{
|
|
126
|
-
"type": 0,
|
|
127
|
-
"value": "Field is required"
|
|
128
|
-
}
|
|
129
|
-
],
|
|
130
|
-
"NJ57Qj": [
|
|
131
|
-
{
|
|
132
|
-
"type": 0,
|
|
133
|
-
"value": "Confirm password field is required"
|
|
134
|
-
}
|
|
135
|
-
],
|
|
136
|
-
"OhDL0i": [
|
|
137
|
-
{
|
|
138
|
-
"type": 0,
|
|
139
|
-
"value": "Invalid email"
|
|
140
|
-
}
|
|
141
|
-
],
|
|
142
|
-
"PylVqx": [
|
|
143
|
-
{
|
|
144
|
-
"type": 0,
|
|
145
|
-
"value": "Password"
|
|
146
|
-
}
|
|
147
|
-
],
|
|
148
|
-
"S3pjKw": [
|
|
149
|
-
{
|
|
150
|
-
"type": 0,
|
|
151
|
-
"value": "Minimum "
|
|
152
|
-
},
|
|
153
|
-
{
|
|
154
|
-
"type": 1,
|
|
155
|
-
"value": "value"
|
|
156
|
-
},
|
|
157
|
-
{
|
|
158
|
-
"type": 0,
|
|
159
|
-
"value": " characters"
|
|
160
|
-
}
|
|
161
|
-
],
|
|
162
|
-
"S4bbEj": [
|
|
163
|
-
{
|
|
164
|
-
"type": 0,
|
|
165
|
-
"value": "Recovering Password"
|
|
166
|
-
}
|
|
167
|
-
],
|
|
168
|
-
"SQJto2": [
|
|
169
|
-
{
|
|
170
|
-
"type": 0,
|
|
171
|
-
"value": "Sign in"
|
|
172
|
-
}
|
|
173
|
-
],
|
|
174
|
-
"SfWKyS": [
|
|
175
|
-
{
|
|
176
|
-
"type": 0,
|
|
177
|
-
"value": "Maximum "
|
|
178
|
-
},
|
|
179
|
-
{
|
|
180
|
-
"type": 1,
|
|
181
|
-
"value": "value"
|
|
182
|
-
},
|
|
183
|
-
{
|
|
184
|
-
"type": 0,
|
|
185
|
-
"value": " characters"
|
|
186
|
-
}
|
|
187
|
-
],
|
|
188
|
-
"TZ4WUk": [
|
|
189
|
-
{
|
|
190
|
-
"type": 0,
|
|
191
|
-
"value": "Password requires "
|
|
192
|
-
},
|
|
193
|
-
{
|
|
194
|
-
"type": 1,
|
|
195
|
-
"value": "value"
|
|
196
|
-
},
|
|
197
|
-
{
|
|
198
|
-
"type": 0,
|
|
199
|
-
"value": " characters"
|
|
200
|
-
}
|
|
201
|
-
],
|
|
202
|
-
"UNttd+": [
|
|
203
|
-
{
|
|
204
|
-
"type": 0,
|
|
205
|
-
"value": "Confirm"
|
|
206
|
-
}
|
|
207
|
-
],
|
|
208
|
-
"URJDrG": [
|
|
209
|
-
{
|
|
210
|
-
"type": 0,
|
|
211
|
-
"value": "Sign up"
|
|
212
|
-
}
|
|
213
|
-
],
|
|
214
|
-
"WU/CqP": [
|
|
215
|
-
{
|
|
216
|
-
"type": 0,
|
|
217
|
-
"value": "Passwords are not the same"
|
|
218
|
-
}
|
|
219
|
-
],
|
|
220
|
-
"XKyo5X": [
|
|
221
|
-
{
|
|
222
|
-
"type": 0,
|
|
223
|
-
"value": "File Upload"
|
|
224
|
-
}
|
|
225
|
-
],
|
|
226
|
-
"XreZg+": [
|
|
227
|
-
{
|
|
228
|
-
"type": 0,
|
|
229
|
-
"value": "Registered Email"
|
|
230
|
-
}
|
|
231
|
-
],
|
|
232
|
-
"ZhaPt0": [
|
|
233
|
-
{
|
|
234
|
-
"type": 0,
|
|
235
|
-
"value": "Invalid Value for Field of type "
|
|
236
|
-
},
|
|
237
|
-
{
|
|
238
|
-
"type": 1,
|
|
239
|
-
"value": "type"
|
|
240
|
-
}
|
|
241
|
-
],
|
|
242
|
-
"cGR2eI": [
|
|
243
|
-
{
|
|
244
|
-
"type": 0,
|
|
245
|
-
"value": "Confirmation"
|
|
246
|
-
}
|
|
247
|
-
],
|
|
248
|
-
"d1YCuH": [
|
|
249
|
-
{
|
|
250
|
-
"type": 0,
|
|
251
|
-
"value": "Enter your email address"
|
|
252
|
-
}
|
|
253
|
-
],
|
|
254
|
-
"e3IQoc": [
|
|
255
|
-
{
|
|
256
|
-
"type": 0,
|
|
257
|
-
"value": "New Password"
|
|
258
|
-
}
|
|
259
|
-
],
|
|
260
|
-
"eRShvB": [
|
|
261
|
-
{
|
|
262
|
-
"type": 0,
|
|
263
|
-
"value": "Maximum files reached"
|
|
264
|
-
}
|
|
265
|
-
],
|
|
266
|
-
"fDCMA6": [
|
|
267
|
-
{
|
|
268
|
-
"type": 0,
|
|
269
|
-
"value": "Select Files"
|
|
270
|
-
}
|
|
271
|
-
],
|
|
272
|
-
"fOOwej": [
|
|
273
|
-
{
|
|
274
|
-
"offset": 0,
|
|
275
|
-
"options": {
|
|
276
|
-
"one": {
|
|
277
|
-
"value": [
|
|
278
|
-
{
|
|
279
|
-
"type": 0,
|
|
280
|
-
"value": "Up to "
|
|
281
|
-
},
|
|
282
|
-
{
|
|
283
|
-
"type": 7
|
|
284
|
-
},
|
|
285
|
-
{
|
|
286
|
-
"type": 0,
|
|
287
|
-
"value": " file"
|
|
288
|
-
}
|
|
289
|
-
]
|
|
290
|
-
},
|
|
291
|
-
"other": {
|
|
292
|
-
"value": [
|
|
293
|
-
{
|
|
294
|
-
"type": 0,
|
|
295
|
-
"value": "Up to "
|
|
296
|
-
},
|
|
297
|
-
{
|
|
298
|
-
"type": 7
|
|
299
|
-
},
|
|
300
|
-
{
|
|
301
|
-
"type": 0,
|
|
302
|
-
"value": " files"
|
|
303
|
-
}
|
|
304
|
-
]
|
|
305
|
-
}
|
|
306
|
-
},
|
|
307
|
-
"pluralType": "cardinal",
|
|
308
|
-
"type": 6,
|
|
309
|
-
"value": "max_files"
|
|
310
|
-
}
|
|
311
|
-
],
|
|
312
|
-
"gy0Ynb": [
|
|
313
|
-
{
|
|
314
|
-
"type": 0,
|
|
315
|
-
"value": "Click or drag files here"
|
|
316
|
-
}
|
|
317
|
-
],
|
|
318
|
-
"kdFYba": [
|
|
319
|
-
{
|
|
320
|
-
"type": 0,
|
|
321
|
-
"value": "Password field is required"
|
|
322
|
-
}
|
|
323
|
-
],
|
|
324
|
-
"khMx/2": [
|
|
325
|
-
{
|
|
326
|
-
"type": 0,
|
|
327
|
-
"value": "An error occurred with your authentication. Please try again."
|
|
328
|
-
}
|
|
329
|
-
],
|
|
330
|
-
"lY+cuM": [
|
|
331
|
-
{
|
|
332
|
-
"type": 0,
|
|
333
|
-
"value": "Confirm password"
|
|
334
|
-
}
|
|
335
|
-
],
|
|
336
|
-
"lZvoYL": [
|
|
337
|
-
{
|
|
338
|
-
"type": 0,
|
|
339
|
-
"value": "Sign up now"
|
|
340
|
-
}
|
|
341
|
-
],
|
|
342
|
-
"mZzmNV": [
|
|
343
|
-
{
|
|
344
|
-
"type": 0,
|
|
345
|
-
"value": "Recover Password"
|
|
346
|
-
}
|
|
347
|
-
],
|
|
348
|
-
"oYpm71": [
|
|
349
|
-
{
|
|
350
|
-
"type": 0,
|
|
351
|
-
"value": "of "
|
|
352
|
-
},
|
|
353
|
-
{
|
|
354
|
-
"type": 1,
|
|
355
|
-
"value": "max"
|
|
356
|
-
}
|
|
357
|
-
],
|
|
358
|
-
"oayEC3": [
|
|
359
|
-
{
|
|
360
|
-
"type": 0,
|
|
361
|
-
"value": "Sign up"
|
|
362
|
-
}
|
|
363
|
-
],
|
|
364
|
-
"pwv2cR": [
|
|
365
|
-
{
|
|
366
|
-
"type": 0,
|
|
367
|
-
"value": "We have sent a confirmation code to your email address. Please enter the code below."
|
|
368
|
-
}
|
|
369
|
-
],
|
|
370
|
-
"qTQ4hP": [
|
|
371
|
-
{
|
|
372
|
-
"type": 0,
|
|
373
|
-
"value": "An email has been sent to your address. Please check your inbox and follow the instructions to confirm your sign up."
|
|
374
|
-
}
|
|
375
|
-
],
|
|
376
|
-
"qnQYqN": [
|
|
377
|
-
{
|
|
378
|
-
"type": 0,
|
|
379
|
-
"value": "You must accept the terms and conditions"
|
|
380
|
-
}
|
|
381
|
-
],
|
|
382
|
-
"rskBv4": [
|
|
383
|
-
{
|
|
384
|
-
"type": 0,
|
|
385
|
-
"value": "Unlimited"
|
|
386
|
-
}
|
|
387
|
-
],
|
|
388
|
-
"s1OmP0": [
|
|
389
|
-
{
|
|
390
|
-
"type": 0,
|
|
391
|
-
"value": "Confirmation code"
|
|
392
|
-
}
|
|
393
|
-
],
|
|
394
|
-
"zr0OS6": [
|
|
395
|
-
{
|
|
396
|
-
"type": 1,
|
|
397
|
-
"value": "percentage"
|
|
398
|
-
},
|
|
399
|
-
{
|
|
400
|
-
"type": 0,
|
|
401
|
-
"value": "% used"
|
|
402
|
-
}
|
|
403
|
-
]
|
|
404
|
-
}
|