@skroz/frontend 0.0.2
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/LICENCE.md +21 -0
- package/dist/auth/Auth.d.ts +8 -0
- package/dist/auth/Auth.js +52 -0
- package/dist/auth/AuthFooterLinks.d.ts +4 -0
- package/dist/auth/AuthFooterLinks.js +26 -0
- package/dist/auth/Forgot.d.ts +7 -0
- package/dist/auth/Forgot.js +68 -0
- package/dist/auth/Login.d.ts +8 -0
- package/dist/auth/Login.js +65 -0
- package/dist/auth/LoginForm.d.ts +6 -0
- package/dist/auth/LoginForm.js +48 -0
- package/dist/auth/RecoverPassword.d.ts +2 -0
- package/dist/auth/RecoverPassword.js +96 -0
- package/dist/auth/Register.d.ts +8 -0
- package/dist/auth/Register.js +68 -0
- package/dist/auth/ResendLinkButton.d.ts +11 -0
- package/dist/auth/ResendLinkButton.js +50 -0
- package/dist/auth/index.d.ts +8 -0
- package/dist/auth/index.js +22 -0
- package/dist/graphql/ForgotPasswordMutation.graphql.d.ts +24 -0
- package/dist/graphql/ForgotPasswordMutation.graphql.js +76 -0
- package/dist/graphql/LoginMutation.graphql.d.ts +26 -0
- package/dist/graphql/LoginMutation.graphql.js +69 -0
- package/dist/graphql/RegisterMutation.graphql.d.ts +26 -0
- package/dist/graphql/RegisterMutation.graphql.js +69 -0
- package/dist/graphql/ResendLinkButtonMutation.graphql.d.ts +25 -0
- package/dist/graphql/ResendLinkButtonMutation.graphql.js +76 -0
- package/dist/graphql/index.d.ts +5 -0
- package/dist/graphql/index.js +16 -0
- package/dist/graphql/recoveryMutation.graphql.d.ts +19 -0
- package/dist/graphql/recoveryMutation.graphql.js +67 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +20 -0
- package/dist/ui/AreYouSure.d.ts +10 -0
- package/dist/ui/AreYouSure.js +43 -0
- package/dist/ui/FormError.d.ts +3 -0
- package/dist/ui/FormError.js +15 -0
- package/dist/ui/FormItem.d.ts +12 -0
- package/dist/ui/FormItem.js +27 -0
- package/dist/ui/H.d.ts +16 -0
- package/dist/ui/H.js +39 -0
- package/dist/ui/Panel.d.ts +16 -0
- package/dist/ui/Panel.js +24 -0
- package/dist/ui/SeoHead.d.ts +13 -0
- package/dist/ui/SeoHead.js +14 -0
- package/dist/ui/index.d.ts +6 -0
- package/dist/ui/index.js +18 -0
- package/dist/utils/FrontendContext.d.ts +14 -0
- package/dist/utils/FrontendContext.js +30 -0
- package/dist/utils/getError.d.ts +11 -0
- package/dist/utils/getError.js +73 -0
- package/dist/utils/handleFormErrors.d.ts +15 -0
- package/dist/utils/handleFormErrors.js +62 -0
- package/dist/utils/index.d.ts +5 -0
- package/dist/utils/index.js +28 -0
- package/dist/utils/isObject.d.ts +2 -0
- package/dist/utils/isObject.js +6 -0
- package/dist/utils/limitExpiresAt.d.ts +3 -0
- package/dist/utils/limitExpiresAt.js +19 -0
- package/package.json +48 -0
- package/src/auth/Auth.tsx +76 -0
- package/src/auth/AuthFooterLinks.tsx +27 -0
- package/src/auth/Forgot.tsx +122 -0
- package/src/auth/Login.tsx +115 -0
- package/src/auth/LoginForm.tsx +74 -0
- package/src/auth/RecoverPassword.tsx +185 -0
- package/src/auth/Register.tsx +174 -0
- package/src/auth/ResendLinkButton.tsx +71 -0
- package/src/auth/index.ts +8 -0
- package/src/graphql/ForgotPasswordMutation.graphql.ts +100 -0
- package/src/graphql/LoginMutation.graphql.ts +95 -0
- package/src/graphql/RegisterMutation.graphql.ts +95 -0
- package/src/graphql/ResendLinkButtonMutation.graphql.ts +101 -0
- package/src/graphql/index.ts +5 -0
- package/src/graphql/recoveryMutation.graphql.ts +91 -0
- package/src/index.ts +4 -0
- package/src/locales/ru/common.json +271 -0
- package/src/styles/auth.less +142 -0
- package/src/styles/colors.less +55 -0
- package/src/styles/components.less +2 -0
- package/src/styles/panels.less +61 -0
- package/src/styles/sizes.less +92 -0
- package/src/ui/AreYouSure.tsx +55 -0
- package/src/ui/FormError.tsx +21 -0
- package/src/ui/FormItem.tsx +60 -0
- package/src/ui/H.tsx +76 -0
- package/src/ui/Panel.tsx +44 -0
- package/src/ui/SeoHead.tsx +69 -0
- package/src/ui/index.ts +6 -0
- package/src/utils/FrontendContext.tsx +30 -0
- package/src/utils/getError.ts +101 -0
- package/src/utils/handleFormErrors.ts +77 -0
- package/src/utils/index.ts +5 -0
- package/src/utils/isObject.ts +4 -0
- package/src/utils/limitExpiresAt.ts +14 -0
package/dist/ui/H.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
interface HProps {
|
|
3
|
+
type: 'h1' | 'h2' | 'h3' | 'h4';
|
|
4
|
+
onBack?: () => void;
|
|
5
|
+
backLink?: string;
|
|
6
|
+
children: React.ReactNode;
|
|
7
|
+
extra?: React.ReactNode;
|
|
8
|
+
subHeader?: React.ReactNode;
|
|
9
|
+
preHeader?: React.ReactNode;
|
|
10
|
+
prefix?: React.ReactNode;
|
|
11
|
+
postfix?: React.ReactNode;
|
|
12
|
+
textAlign?: 'left' | 'center' | 'right';
|
|
13
|
+
className?: string;
|
|
14
|
+
}
|
|
15
|
+
declare const H: React.FC<HProps>;
|
|
16
|
+
export default H;
|
package/dist/ui/H.js
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __assign = (this && this.__assign) || function () {
|
|
3
|
+
__assign = Object.assign || function(t) {
|
|
4
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
5
|
+
s = arguments[i];
|
|
6
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
7
|
+
t[p] = s[p];
|
|
8
|
+
}
|
|
9
|
+
return t;
|
|
10
|
+
};
|
|
11
|
+
return __assign.apply(this, arguments);
|
|
12
|
+
};
|
|
13
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
14
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
var jsx_runtime_1 = require("react/jsx-runtime");
|
|
18
|
+
var react_1 = require("react");
|
|
19
|
+
var antd_1 = require("antd");
|
|
20
|
+
var icons_1 = require("@ant-design/icons");
|
|
21
|
+
var link_1 = __importDefault(require("next/link"));
|
|
22
|
+
var classnames_1 = __importDefault(require("classnames"));
|
|
23
|
+
var H = function (_a) {
|
|
24
|
+
var onBack = _a.onBack, children = _a.children, type = _a.type, extra = _a.extra, subHeader = _a.subHeader, backLink = _a.backLink, prefix = _a.prefix, postfix = _a.postfix, preHeader = _a.preHeader, _b = _a.textAlign, textAlign = _b === void 0 ? 'left' : _b, className = _a.className;
|
|
25
|
+
var header = (0, react_1.useMemo)(function () {
|
|
26
|
+
if (type === 'h1')
|
|
27
|
+
return (0, jsx_runtime_1.jsx)("h1", { children: children });
|
|
28
|
+
if (type === 'h2')
|
|
29
|
+
return (0, jsx_runtime_1.jsx)("h2", { children: children });
|
|
30
|
+
if (type === 'h3')
|
|
31
|
+
return (0, jsx_runtime_1.jsx)("h3", { children: children });
|
|
32
|
+
if (type === 'h4')
|
|
33
|
+
return (0, jsx_runtime_1.jsx)("h4", { children: children });
|
|
34
|
+
return null;
|
|
35
|
+
}, [children, type]);
|
|
36
|
+
var backButton = (0, react_1.useMemo)(function () { return ((0, jsx_runtime_1.jsx)(antd_1.Button, { type: 'link', icon: (0, jsx_runtime_1.jsx)(icons_1.LeftOutlined, {}), size: 'large', shape: 'circle', onClick: onBack })); }, [onBack]);
|
|
37
|
+
return ((0, jsx_runtime_1.jsxs)("div", __assign({ className: (0, classnames_1.default)('h', className) }, { children: [preHeader && (0, jsx_runtime_1.jsx)("div", __assign({ className: "h-row ".concat(textAlign) }, { children: preHeader })), (0, jsx_runtime_1.jsxs)("div", __assign({ className: "h-row ".concat(textAlign) }, { children: [prefix && (0, jsx_runtime_1.jsx)("div", __assign({ className: 'h-row-prefix' }, { children: prefix })), (onBack || backLink) && ((0, jsx_runtime_1.jsx)("div", __assign({ className: 'h-row-back' }, { children: backLink ? (0, jsx_runtime_1.jsx)(link_1.default, __assign({ href: backLink }, { children: backButton })) : backButton }))), (0, jsx_runtime_1.jsxs)("div", __assign({ className: 'h-row-content' }, { children: [header, postfix && (0, jsx_runtime_1.jsx)("div", __assign({ className: 'h-row-content-postfix' }, { children: postfix }))] })), extra && (0, jsx_runtime_1.jsx)("div", __assign({ className: 'h-row-extra' }, { children: extra }))] })), subHeader && (0, jsx_runtime_1.jsx)("div", __assign({ className: "h-row ".concat(textAlign) }, { children: subHeader }))] })));
|
|
38
|
+
};
|
|
39
|
+
exports.default = H;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import React, { CSSProperties } from 'react';
|
|
2
|
+
interface PanelProps {
|
|
3
|
+
children: React.ReactNode;
|
|
4
|
+
bg: 'white' | 'primary' | 'secondary' | 'black' | 'blue' | 'venice' | 'grey';
|
|
5
|
+
link?: {
|
|
6
|
+
href: string;
|
|
7
|
+
title: string;
|
|
8
|
+
};
|
|
9
|
+
image?: React.ReactNode;
|
|
10
|
+
id?: string;
|
|
11
|
+
className?: string;
|
|
12
|
+
style?: CSSProperties;
|
|
13
|
+
marginBottom?: 'xs' | 's' | 'md';
|
|
14
|
+
}
|
|
15
|
+
declare const Panel: React.FC<PanelProps>;
|
|
16
|
+
export default Panel;
|
package/dist/ui/Panel.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __assign = (this && this.__assign) || function () {
|
|
3
|
+
__assign = Object.assign || function(t) {
|
|
4
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
5
|
+
s = arguments[i];
|
|
6
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
7
|
+
t[p] = s[p];
|
|
8
|
+
}
|
|
9
|
+
return t;
|
|
10
|
+
};
|
|
11
|
+
return __assign.apply(this, arguments);
|
|
12
|
+
};
|
|
13
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
14
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
var jsx_runtime_1 = require("react/jsx-runtime");
|
|
18
|
+
var link_1 = __importDefault(require("next/link"));
|
|
19
|
+
var Panel = function (_a) {
|
|
20
|
+
var children = _a.children, bg = _a.bg, link = _a.link, image = _a.image, id = _a.id, className = _a.className, style = _a.style, marginBottom = _a.marginBottom;
|
|
21
|
+
var classNames = "panel ".concat(bg, "-bg ").concat(link ? 'is-panel-link' : '', " ").concat(className || '', " ").concat(marginBottom ? "mb-".concat(marginBottom) : '');
|
|
22
|
+
return link ? ((0, jsx_runtime_1.jsxs)(link_1.default, __assign({ className: classNames, href: link.href, id: id, style: style }, { children: [(0, jsx_runtime_1.jsx)("div", __assign({ className: 'panel-image' }, { children: image })), (0, jsx_runtime_1.jsx)("div", __assign({ className: 'panel-content' }, { children: children }))] }))) : ((0, jsx_runtime_1.jsxs)("div", __assign({ className: classNames, id: id, style: style }, { children: [(0, jsx_runtime_1.jsx)("div", __assign({ className: 'panel-image' }, { children: image })), (0, jsx_runtime_1.jsx)("div", __assign({ className: 'panel-content' }, { children: children }))] })));
|
|
23
|
+
};
|
|
24
|
+
exports.default = Panel;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
interface SeoHeadProps {
|
|
3
|
+
children?: React.ReactNode;
|
|
4
|
+
metaTitle: string;
|
|
5
|
+
metaDescription: string;
|
|
6
|
+
noindex?: boolean;
|
|
7
|
+
nofollow?: boolean;
|
|
8
|
+
smmType?: 'website' | 'profile';
|
|
9
|
+
smmImageUrl?: string;
|
|
10
|
+
smmPageUrl?: string;
|
|
11
|
+
}
|
|
12
|
+
declare const SeoHead: React.FC<SeoHeadProps>;
|
|
13
|
+
export default SeoHead;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
var jsx_runtime_1 = require("react/jsx-runtime");
|
|
7
|
+
var head_1 = __importDefault(require("next/head"));
|
|
8
|
+
var FrontendContext_1 = require("../utils/FrontendContext");
|
|
9
|
+
var SeoHead = function (_a) {
|
|
10
|
+
var metaTitle = _a.metaTitle, metaDescription = _a.metaDescription, children = _a.children, _b = _a.noindex, noindex = _b === void 0 ? false : _b, _c = _a.nofollow, nofollow = _c === void 0 ? false : _c, smmImageUrl = _a.smmImageUrl, smmPageUrl = _a.smmPageUrl, _d = _a.smmType, smmType = _d === void 0 ? 'website' : _d;
|
|
11
|
+
var domain = (0, FrontendContext_1.useFrontendConfig)().domain;
|
|
12
|
+
return ((0, jsx_runtime_1.jsxs)(head_1.default, { children: [(0, jsx_runtime_1.jsx)("title", { children: metaTitle }), (0, jsx_runtime_1.jsx)("meta", { name: 'description', content: metaDescription }), (0, jsx_runtime_1.jsx)("meta", { name: 'theme-color', content: '#edf1f6' }), (0, jsx_runtime_1.jsx)("meta", { charSet: 'UTF-8' }), (0, jsx_runtime_1.jsx)("meta", { name: 'viewport', content: 'width=device-width, initial-scale=1, viewport-fit=cover' }), (0, jsx_runtime_1.jsx)("link", { rel: 'apple-touch-icon', sizes: '180x180', href: '/apple-touch-icon.png' }), (0, jsx_runtime_1.jsx)("link", { rel: 'icon', type: 'image/png', sizes: '32x32', href: '/favicon-32x32.png' }), (0, jsx_runtime_1.jsx)("link", { rel: 'icon', type: 'image/png', sizes: '16x16', href: '/favicon-16x16.png' }), (0, jsx_runtime_1.jsx)("link", { rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }), (0, jsx_runtime_1.jsx)("link", { rel: 'manifest', href: '/manifest.json' }), (0, jsx_runtime_1.jsx)("meta", { name: 'robots', content: "".concat(noindex ? 'noindex' : 'index', ",").concat(nofollow ? 'nofollow' : 'follow') }), (0, jsx_runtime_1.jsx)("meta", { property: 'og:type', content: smmType }), smmPageUrl && (0, jsx_runtime_1.jsx)("meta", { property: 'og:url', content: smmPageUrl }), smmImageUrl && (0, jsx_runtime_1.jsx)("meta", { name: 'og:image', content: smmImageUrl }), (0, jsx_runtime_1.jsx)("meta", { property: 'og:title', content: metaTitle }), (0, jsx_runtime_1.jsx)("meta", { property: 'og:description', content: metaDescription }), (0, jsx_runtime_1.jsx)("meta", { name: 'twitter:card', content: 'summary_large_image' }), smmImageUrl && (0, jsx_runtime_1.jsx)("meta", { name: 'twitter:image', content: smmImageUrl }), domain && (0, jsx_runtime_1.jsx)("meta", { property: 'twitter:domain', content: domain }), smmPageUrl && (0, jsx_runtime_1.jsx)("meta", { property: 'twitter:url', content: smmPageUrl }), (0, jsx_runtime_1.jsx)("meta", { name: 'twitter:title', content: metaTitle }), (0, jsx_runtime_1.jsx)("meta", { name: 'twitter:description', content: metaDescription }), children] }));
|
|
13
|
+
};
|
|
14
|
+
exports.default = SeoHead;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { default as H } from './H';
|
|
2
|
+
export { default as Panel } from './Panel';
|
|
3
|
+
export { default as FormItem } from './FormItem';
|
|
4
|
+
export { default as FormError } from './FormError';
|
|
5
|
+
export { default as AreYouSure } from './AreYouSure';
|
|
6
|
+
export { default as SeoHead } from './SeoHead';
|
package/dist/ui/index.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.SeoHead = exports.AreYouSure = exports.FormError = exports.FormItem = exports.Panel = exports.H = void 0;
|
|
7
|
+
var H_1 = require("./H");
|
|
8
|
+
Object.defineProperty(exports, "H", { enumerable: true, get: function () { return __importDefault(H_1).default; } });
|
|
9
|
+
var Panel_1 = require("./Panel");
|
|
10
|
+
Object.defineProperty(exports, "Panel", { enumerable: true, get: function () { return __importDefault(Panel_1).default; } });
|
|
11
|
+
var FormItem_1 = require("./FormItem");
|
|
12
|
+
Object.defineProperty(exports, "FormItem", { enumerable: true, get: function () { return __importDefault(FormItem_1).default; } });
|
|
13
|
+
var FormError_1 = require("./FormError");
|
|
14
|
+
Object.defineProperty(exports, "FormError", { enumerable: true, get: function () { return __importDefault(FormError_1).default; } });
|
|
15
|
+
var AreYouSure_1 = require("./AreYouSure");
|
|
16
|
+
Object.defineProperty(exports, "AreYouSure", { enumerable: true, get: function () { return __importDefault(AreYouSure_1).default; } });
|
|
17
|
+
var SeoHead_1 = require("./SeoHead");
|
|
18
|
+
Object.defineProperty(exports, "SeoHead", { enumerable: true, get: function () { return __importDefault(SeoHead_1).default; } });
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export interface FrontendConfig {
|
|
3
|
+
loginPath?: string;
|
|
4
|
+
registerPath?: string;
|
|
5
|
+
forgotPasswordPath?: string;
|
|
6
|
+
defaultPath?: string;
|
|
7
|
+
domain?: string;
|
|
8
|
+
websiteUrl?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare const useFrontendConfig: () => FrontendConfig;
|
|
11
|
+
export declare const FrontendProvider: React.FC<{
|
|
12
|
+
config: FrontendConfig;
|
|
13
|
+
children: React.ReactNode;
|
|
14
|
+
}>;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __assign = (this && this.__assign) || function () {
|
|
3
|
+
__assign = Object.assign || function(t) {
|
|
4
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
5
|
+
s = arguments[i];
|
|
6
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
7
|
+
t[p] = s[p];
|
|
8
|
+
}
|
|
9
|
+
return t;
|
|
10
|
+
};
|
|
11
|
+
return __assign.apply(this, arguments);
|
|
12
|
+
};
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.FrontendProvider = exports.useFrontendConfig = void 0;
|
|
15
|
+
var jsx_runtime_1 = require("react/jsx-runtime");
|
|
16
|
+
var react_1 = require("react");
|
|
17
|
+
var defaultConfig = {
|
|
18
|
+
loginPath: '/login',
|
|
19
|
+
registerPath: '/register',
|
|
20
|
+
forgotPasswordPath: '/forgot',
|
|
21
|
+
defaultPath: '/',
|
|
22
|
+
};
|
|
23
|
+
var FrontendContext = (0, react_1.createContext)(defaultConfig);
|
|
24
|
+
var useFrontendConfig = function () { return (0, react_1.useContext)(FrontendContext); };
|
|
25
|
+
exports.useFrontendConfig = useFrontendConfig;
|
|
26
|
+
var FrontendProvider = function (_a) {
|
|
27
|
+
var config = _a.config, children = _a.children;
|
|
28
|
+
return ((0, jsx_runtime_1.jsx)(FrontendContext.Provider, __assign({ value: __assign(__assign({}, defaultConfig), config) }, { children: children })));
|
|
29
|
+
};
|
|
30
|
+
exports.FrontendProvider = FrontendProvider;
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
var DEFAULT_CODE = 'no_code';
|
|
4
|
+
var DEFAULT_MESSAGE = 'Error';
|
|
5
|
+
var isObject = function (value) {
|
|
6
|
+
return typeof value === 'object' && !Array.isArray(value) && value !== null;
|
|
7
|
+
};
|
|
8
|
+
var isData = function (value) {
|
|
9
|
+
return isObject(value) &&
|
|
10
|
+
Object.values(value).every(function (constraint) {
|
|
11
|
+
return isObject(constraint) &&
|
|
12
|
+
'code' in constraint &&
|
|
13
|
+
typeof constraint.code === 'string' &&
|
|
14
|
+
'message' in constraint &&
|
|
15
|
+
typeof constraint.message === 'string';
|
|
16
|
+
});
|
|
17
|
+
};
|
|
18
|
+
var getError = function (error) {
|
|
19
|
+
// Trying to find the message of an error
|
|
20
|
+
if (!isObject(error) ||
|
|
21
|
+
!('message' in error) ||
|
|
22
|
+
typeof error.message !== 'string') {
|
|
23
|
+
return {
|
|
24
|
+
code: DEFAULT_CODE,
|
|
25
|
+
message: DEFAULT_MESSAGE,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
// Trying to find the first GraphQL error
|
|
29
|
+
if (!('source' in error) ||
|
|
30
|
+
!isObject(error.source) ||
|
|
31
|
+
!('errors' in error.source) ||
|
|
32
|
+
!Array.isArray(error.source.errors) ||
|
|
33
|
+
error.source.errors.length === 0) {
|
|
34
|
+
return {
|
|
35
|
+
code: DEFAULT_CODE,
|
|
36
|
+
message: error.message,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
var firstError = error.source.errors[0];
|
|
40
|
+
// Trying to find the message of the GraphQL error
|
|
41
|
+
if (!isObject(firstError) ||
|
|
42
|
+
!('message' in firstError) ||
|
|
43
|
+
typeof firstError.message !== 'string') {
|
|
44
|
+
return {
|
|
45
|
+
code: DEFAULT_CODE,
|
|
46
|
+
message: error.message,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
// Trying to find the code of the GraphQL message
|
|
50
|
+
if (!('extensions' in firstError) ||
|
|
51
|
+
!isObject(firstError.extensions) ||
|
|
52
|
+
!('code' in firstError.extensions) ||
|
|
53
|
+
typeof firstError.extensions.code !== 'string') {
|
|
54
|
+
return {
|
|
55
|
+
code: DEFAULT_CODE,
|
|
56
|
+
message: firstError.message,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
// Trying to find the data in the GraphQL message
|
|
60
|
+
if (!('data' in firstError.extensions) ||
|
|
61
|
+
!isData(firstError.extensions.data)) {
|
|
62
|
+
return {
|
|
63
|
+
code: firstError.extensions.code,
|
|
64
|
+
message: firstError.message,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
return {
|
|
68
|
+
code: firstError.extensions.code,
|
|
69
|
+
message: firstError.message,
|
|
70
|
+
data: firstError.extensions.data,
|
|
71
|
+
};
|
|
72
|
+
};
|
|
73
|
+
exports.default = getError;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Form } from '@os-design/form';
|
|
2
|
+
declare const handleFormErrors: (form: Form<any>, error: unknown) => void;
|
|
3
|
+
/**
|
|
4
|
+
* @example { isExists: 'The error message' }
|
|
5
|
+
*/
|
|
6
|
+
export type ConstraintMessageMap = Record<string, string>;
|
|
7
|
+
/**
|
|
8
|
+
* @example { name: { isExists: 'The error message' } }
|
|
9
|
+
*/
|
|
10
|
+
export type FieldConstraintMessageMap = Record<string, ConstraintMessageMap>;
|
|
11
|
+
/**
|
|
12
|
+
* Formats the argument validation error to the field/message map.
|
|
13
|
+
*/
|
|
14
|
+
export declare const formatArgumentValidationError: (error: Error, messages?: FieldConstraintMessageMap) => Record<string, string>;
|
|
15
|
+
export default handleFormErrors;
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.formatArgumentValidationError = void 0;
|
|
7
|
+
var getError_1 = __importDefault(require("./getError"));
|
|
8
|
+
var isObject_1 = __importDefault(require("./isObject"));
|
|
9
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
10
|
+
var handleFormErrors = function (form, error) {
|
|
11
|
+
var _a = (0, getError_1.default)(error), message = _a.message, data = _a.data;
|
|
12
|
+
if (data) {
|
|
13
|
+
Object.entries(data).forEach(function (_a) {
|
|
14
|
+
var key = _a[0], constraint = _a[1];
|
|
15
|
+
form.errors.set(key, constraint.message);
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
form.errors.set('_error', message);
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Formats the argument validation error to the field/message map.
|
|
24
|
+
*/
|
|
25
|
+
var formatArgumentValidationError = function (error, messages) {
|
|
26
|
+
if (messages === void 0) { messages = {}; }
|
|
27
|
+
// Check if validationErrors is exists
|
|
28
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
29
|
+
var e = error;
|
|
30
|
+
if (!(0, isObject_1.default)(e.source) ||
|
|
31
|
+
!Array.isArray(e.source.errors) ||
|
|
32
|
+
e.source.errors.length === 0 ||
|
|
33
|
+
!(0, isObject_1.default)(e.source.errors[0]) ||
|
|
34
|
+
e.source.errors[0].message !== 'Argument Validation Error' ||
|
|
35
|
+
!(0, isObject_1.default)(e.source.errors[0].extensions) ||
|
|
36
|
+
!(0, isObject_1.default)(e.source.errors[0].extensions.exception) ||
|
|
37
|
+
!Array.isArray(e.source.errors[0].extensions.exception.validationErrors))
|
|
38
|
+
return {};
|
|
39
|
+
var validationErrors = e.source.errors[0].extensions.exception.validationErrors;
|
|
40
|
+
var errors = {};
|
|
41
|
+
validationErrors.forEach(function (validationError) {
|
|
42
|
+
// Check if validationError has property and constraints
|
|
43
|
+
if (!(0, isObject_1.default)(validationError) ||
|
|
44
|
+
typeof validationError.property !== 'string' ||
|
|
45
|
+
!(0, isObject_1.default)(validationError.constraints))
|
|
46
|
+
return;
|
|
47
|
+
// Check if constraints has key/value
|
|
48
|
+
var constraints = Object.entries(validationError.constraints);
|
|
49
|
+
if (constraints.length === 0)
|
|
50
|
+
return;
|
|
51
|
+
var _a = constraints[0], key = _a[0], message = _a[1];
|
|
52
|
+
if (typeof message !== 'string')
|
|
53
|
+
return;
|
|
54
|
+
var customMessage = messages[validationError.property]
|
|
55
|
+
? messages[validationError.property][key]
|
|
56
|
+
: undefined;
|
|
57
|
+
errors[validationError.property] = customMessage || message;
|
|
58
|
+
});
|
|
59
|
+
return errors;
|
|
60
|
+
};
|
|
61
|
+
exports.formatArgumentValidationError = formatArgumentValidationError;
|
|
62
|
+
exports.default = handleFormErrors;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
17
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
18
|
+
};
|
|
19
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
+
exports.isObject = exports.handleFormErrors = exports.getError = void 0;
|
|
21
|
+
var getError_1 = require("./getError");
|
|
22
|
+
Object.defineProperty(exports, "getError", { enumerable: true, get: function () { return __importDefault(getError_1).default; } });
|
|
23
|
+
var handleFormErrors_1 = require("./handleFormErrors");
|
|
24
|
+
Object.defineProperty(exports, "handleFormErrors", { enumerable: true, get: function () { return __importDefault(handleFormErrors_1).default; } });
|
|
25
|
+
var isObject_1 = require("./isObject");
|
|
26
|
+
Object.defineProperty(exports, "isObject", { enumerable: true, get: function () { return __importDefault(isObject_1).default; } });
|
|
27
|
+
__exportStar(require("./limitExpiresAt"), exports);
|
|
28
|
+
__exportStar(require("./FrontendContext"), exports);
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getLimitExpiresIn = exports.getLimitExpiresAt = exports.setLimitExpiresAt = void 0;
|
|
4
|
+
var LIMIT_EXPIRES_AT_KEY = 'lea';
|
|
5
|
+
var setLimitExpiresAt = function (value) {
|
|
6
|
+
if (typeof window === 'undefined')
|
|
7
|
+
return;
|
|
8
|
+
window.sessionStorage.setItem(LIMIT_EXPIRES_AT_KEY, value.toString());
|
|
9
|
+
};
|
|
10
|
+
exports.setLimitExpiresAt = setLimitExpiresAt;
|
|
11
|
+
var getLimitExpiresAt = function () {
|
|
12
|
+
if (typeof window === 'undefined')
|
|
13
|
+
return 0;
|
|
14
|
+
var value = window.sessionStorage.getItem(LIMIT_EXPIRES_AT_KEY);
|
|
15
|
+
return Number(value) || 0;
|
|
16
|
+
};
|
|
17
|
+
exports.getLimitExpiresAt = getLimitExpiresAt;
|
|
18
|
+
var getLimitExpiresIn = function () { return (0, exports.getLimitExpiresAt)() - Date.now(); };
|
|
19
|
+
exports.getLimitExpiresIn = getLimitExpiresIn;
|
package/package.json
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@skroz/frontend",
|
|
3
|
+
"version": "0.0.2",
|
|
4
|
+
"license": "MIT",
|
|
5
|
+
"main": "src/index.ts",
|
|
6
|
+
"types": "src/index.ts",
|
|
7
|
+
"files": [
|
|
8
|
+
"dist",
|
|
9
|
+
"src"
|
|
10
|
+
],
|
|
11
|
+
"scripts": {
|
|
12
|
+
"clean": "rimraf dist",
|
|
13
|
+
"build": "yarn clean && tsc",
|
|
14
|
+
"lint": "eslint --fix ."
|
|
15
|
+
},
|
|
16
|
+
"peerDependencies": {
|
|
17
|
+
"@os-design/form": "1.0.82",
|
|
18
|
+
"antd": "5.19.1",
|
|
19
|
+
"classnames": "2.3.2",
|
|
20
|
+
"next": "14.2.5",
|
|
21
|
+
"next-i18next": "15.3.0",
|
|
22
|
+
"react": "18.3.1",
|
|
23
|
+
"react-dom": "18.3.1",
|
|
24
|
+
"react-relay": "17.0.0"
|
|
25
|
+
},
|
|
26
|
+
"devDependencies": {
|
|
27
|
+
"@ant-design/icons": "^5.0.0",
|
|
28
|
+
"@os-design/form": "1.0.82",
|
|
29
|
+
"@os-design/use-interval": "1.0.18",
|
|
30
|
+
"@types/node": "18.17.5",
|
|
31
|
+
"@types/react": "18.3.3",
|
|
32
|
+
"@types/react-relay": "16.0.6",
|
|
33
|
+
"antd": "5.19.1",
|
|
34
|
+
"babel-plugin-relay": "^17.0.0",
|
|
35
|
+
"classnames": "2.3.2",
|
|
36
|
+
"next": "14.2.5",
|
|
37
|
+
"next-i18next": "15.3.0",
|
|
38
|
+
"react": "18.3.1",
|
|
39
|
+
"react-dom": "18.3.1",
|
|
40
|
+
"react-relay": "17.0.0",
|
|
41
|
+
"rimraf": "4.4.1",
|
|
42
|
+
"typescript": "4.9.5"
|
|
43
|
+
},
|
|
44
|
+
"publishConfig": {
|
|
45
|
+
"access": "public"
|
|
46
|
+
},
|
|
47
|
+
"gitHead": "3f0c992cd2b622b92fd58a82ba60137a58b73834"
|
|
48
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Tabs } from 'antd';
|
|
3
|
+
import { FormProvider, useForm } from "@os-design/form";
|
|
4
|
+
import { useRouter } from "next/router";
|
|
5
|
+
import { useTranslation } from 'next-i18next';
|
|
6
|
+
import Login from './Login';
|
|
7
|
+
import Register from './Register';
|
|
8
|
+
import Forgot from './Forgot';
|
|
9
|
+
import { RegisterInput } from "../graphql/RegisterMutation.graphql";
|
|
10
|
+
|
|
11
|
+
interface AuthProps {
|
|
12
|
+
authType: 'login' | 'register' | 'forgot';
|
|
13
|
+
setAuthType: (type: 'login' | 'register' | 'forgot') => void;
|
|
14
|
+
onFinish: () => void;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const Auth: React.FC<AuthProps> = ({ authType, setAuthType, onFinish }) => {
|
|
18
|
+
const router = useRouter();
|
|
19
|
+
const { t } = useTranslation('common');
|
|
20
|
+
|
|
21
|
+
// если это отдельная страница восстановления пароля, то он может быть передан в строке
|
|
22
|
+
let initialEmail = router.query.email;
|
|
23
|
+
if (typeof initialEmail !== 'string') initialEmail = '';
|
|
24
|
+
|
|
25
|
+
const { form } = useForm<RegisterInput>({
|
|
26
|
+
email: initialEmail || '',
|
|
27
|
+
password: '',
|
|
28
|
+
isPrivacyPolicyAgree: false,
|
|
29
|
+
isUserAgreementAgree: false
|
|
30
|
+
})
|
|
31
|
+
|
|
32
|
+
return (
|
|
33
|
+
<FormProvider form={form}>
|
|
34
|
+
{authType !== 'forgot' && (
|
|
35
|
+
<Tabs
|
|
36
|
+
activeKey={authType}
|
|
37
|
+
centered
|
|
38
|
+
onChange={(activeKey: string) => setAuthType(activeKey as 'login' | 'register' | 'forgot')}
|
|
39
|
+
className='no-text-selection'
|
|
40
|
+
items={[
|
|
41
|
+
{
|
|
42
|
+
label: t('buttons.login'),
|
|
43
|
+
key: 'login',
|
|
44
|
+
children: (
|
|
45
|
+
<Login
|
|
46
|
+
isModal
|
|
47
|
+
onFinish={onFinish}
|
|
48
|
+
onForgotClick={() => setAuthType('forgot')}
|
|
49
|
+
/>
|
|
50
|
+
),
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
label: t('buttons.register'),
|
|
54
|
+
key: 'register',
|
|
55
|
+
children: (
|
|
56
|
+
<Register
|
|
57
|
+
isModal
|
|
58
|
+
onFinish={onFinish}
|
|
59
|
+
onForgotClick={() => setAuthType('forgot')}
|
|
60
|
+
/>
|
|
61
|
+
),
|
|
62
|
+
},
|
|
63
|
+
]}
|
|
64
|
+
/>
|
|
65
|
+
)}
|
|
66
|
+
{authType === 'forgot' && (
|
|
67
|
+
<Forgot
|
|
68
|
+
onFinish={onFinish}
|
|
69
|
+
onLoginClick={() => setAuthType('login')}
|
|
70
|
+
/>
|
|
71
|
+
)}
|
|
72
|
+
</FormProvider>
|
|
73
|
+
);
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
export default Auth;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { useTranslation } from 'next-i18next';
|
|
3
|
+
import Link from 'next/link';
|
|
4
|
+
|
|
5
|
+
export type DocPage = 'privacy-policy' | 'agency-agreement';
|
|
6
|
+
|
|
7
|
+
const AuthFooterLinks: React.FC = () => {
|
|
8
|
+
const { t } = useTranslation('common');
|
|
9
|
+
const docs: DocPage[] = ['agency-agreement', 'privacy-policy'];
|
|
10
|
+
|
|
11
|
+
return (
|
|
12
|
+
<div className='auth-footer-issues'>
|
|
13
|
+
{t('auth.agreeLoginLabel')}{' '}
|
|
14
|
+
{docs.map((doc, index) => (
|
|
15
|
+
<React.Fragment key={doc}>
|
|
16
|
+
<Link href={`/docs/${doc}`} passHref target='_blank'>
|
|
17
|
+
{t(`docsPage.${doc}`)}
|
|
18
|
+
</Link>
|
|
19
|
+
{index < docs.length - 1 && ', '}
|
|
20
|
+
</React.Fragment>
|
|
21
|
+
))}
|
|
22
|
+
.
|
|
23
|
+
</div>
|
|
24
|
+
);
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
export default AuthFooterLinks;
|