@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.
Files changed (95) hide show
  1. package/LICENCE.md +21 -0
  2. package/dist/auth/Auth.d.ts +8 -0
  3. package/dist/auth/Auth.js +52 -0
  4. package/dist/auth/AuthFooterLinks.d.ts +4 -0
  5. package/dist/auth/AuthFooterLinks.js +26 -0
  6. package/dist/auth/Forgot.d.ts +7 -0
  7. package/dist/auth/Forgot.js +68 -0
  8. package/dist/auth/Login.d.ts +8 -0
  9. package/dist/auth/Login.js +65 -0
  10. package/dist/auth/LoginForm.d.ts +6 -0
  11. package/dist/auth/LoginForm.js +48 -0
  12. package/dist/auth/RecoverPassword.d.ts +2 -0
  13. package/dist/auth/RecoverPassword.js +96 -0
  14. package/dist/auth/Register.d.ts +8 -0
  15. package/dist/auth/Register.js +68 -0
  16. package/dist/auth/ResendLinkButton.d.ts +11 -0
  17. package/dist/auth/ResendLinkButton.js +50 -0
  18. package/dist/auth/index.d.ts +8 -0
  19. package/dist/auth/index.js +22 -0
  20. package/dist/graphql/ForgotPasswordMutation.graphql.d.ts +24 -0
  21. package/dist/graphql/ForgotPasswordMutation.graphql.js +76 -0
  22. package/dist/graphql/LoginMutation.graphql.d.ts +26 -0
  23. package/dist/graphql/LoginMutation.graphql.js +69 -0
  24. package/dist/graphql/RegisterMutation.graphql.d.ts +26 -0
  25. package/dist/graphql/RegisterMutation.graphql.js +69 -0
  26. package/dist/graphql/ResendLinkButtonMutation.graphql.d.ts +25 -0
  27. package/dist/graphql/ResendLinkButtonMutation.graphql.js +76 -0
  28. package/dist/graphql/index.d.ts +5 -0
  29. package/dist/graphql/index.js +16 -0
  30. package/dist/graphql/recoveryMutation.graphql.d.ts +19 -0
  31. package/dist/graphql/recoveryMutation.graphql.js +67 -0
  32. package/dist/index.d.ts +4 -0
  33. package/dist/index.js +20 -0
  34. package/dist/ui/AreYouSure.d.ts +10 -0
  35. package/dist/ui/AreYouSure.js +43 -0
  36. package/dist/ui/FormError.d.ts +3 -0
  37. package/dist/ui/FormError.js +15 -0
  38. package/dist/ui/FormItem.d.ts +12 -0
  39. package/dist/ui/FormItem.js +27 -0
  40. package/dist/ui/H.d.ts +16 -0
  41. package/dist/ui/H.js +39 -0
  42. package/dist/ui/Panel.d.ts +16 -0
  43. package/dist/ui/Panel.js +24 -0
  44. package/dist/ui/SeoHead.d.ts +13 -0
  45. package/dist/ui/SeoHead.js +14 -0
  46. package/dist/ui/index.d.ts +6 -0
  47. package/dist/ui/index.js +18 -0
  48. package/dist/utils/FrontendContext.d.ts +14 -0
  49. package/dist/utils/FrontendContext.js +30 -0
  50. package/dist/utils/getError.d.ts +11 -0
  51. package/dist/utils/getError.js +73 -0
  52. package/dist/utils/handleFormErrors.d.ts +15 -0
  53. package/dist/utils/handleFormErrors.js +62 -0
  54. package/dist/utils/index.d.ts +5 -0
  55. package/dist/utils/index.js +28 -0
  56. package/dist/utils/isObject.d.ts +2 -0
  57. package/dist/utils/isObject.js +6 -0
  58. package/dist/utils/limitExpiresAt.d.ts +3 -0
  59. package/dist/utils/limitExpiresAt.js +19 -0
  60. package/package.json +48 -0
  61. package/src/auth/Auth.tsx +76 -0
  62. package/src/auth/AuthFooterLinks.tsx +27 -0
  63. package/src/auth/Forgot.tsx +122 -0
  64. package/src/auth/Login.tsx +115 -0
  65. package/src/auth/LoginForm.tsx +74 -0
  66. package/src/auth/RecoverPassword.tsx +185 -0
  67. package/src/auth/Register.tsx +174 -0
  68. package/src/auth/ResendLinkButton.tsx +71 -0
  69. package/src/auth/index.ts +8 -0
  70. package/src/graphql/ForgotPasswordMutation.graphql.ts +100 -0
  71. package/src/graphql/LoginMutation.graphql.ts +95 -0
  72. package/src/graphql/RegisterMutation.graphql.ts +95 -0
  73. package/src/graphql/ResendLinkButtonMutation.graphql.ts +101 -0
  74. package/src/graphql/index.ts +5 -0
  75. package/src/graphql/recoveryMutation.graphql.ts +91 -0
  76. package/src/index.ts +4 -0
  77. package/src/locales/ru/common.json +271 -0
  78. package/src/styles/auth.less +142 -0
  79. package/src/styles/colors.less +55 -0
  80. package/src/styles/components.less +2 -0
  81. package/src/styles/panels.less +61 -0
  82. package/src/styles/sizes.less +92 -0
  83. package/src/ui/AreYouSure.tsx +55 -0
  84. package/src/ui/FormError.tsx +21 -0
  85. package/src/ui/FormItem.tsx +60 -0
  86. package/src/ui/H.tsx +76 -0
  87. package/src/ui/Panel.tsx +44 -0
  88. package/src/ui/SeoHead.tsx +69 -0
  89. package/src/ui/index.ts +6 -0
  90. package/src/utils/FrontendContext.tsx +30 -0
  91. package/src/utils/getError.ts +101 -0
  92. package/src/utils/handleFormErrors.ts +77 -0
  93. package/src/utils/index.ts +5 -0
  94. package/src/utils/isObject.ts +4 -0
  95. 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;
@@ -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';
@@ -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,11 @@
1
+ interface Constraint {
2
+ code: string;
3
+ message: string;
4
+ }
5
+ interface ErrorObject {
6
+ code: string;
7
+ message: string;
8
+ data?: Record<string, Constraint>;
9
+ }
10
+ declare const getError: (error: unknown) => ErrorObject;
11
+ export default getError;
@@ -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,5 @@
1
+ export { default as getError } from './getError';
2
+ export { default as handleFormErrors } from './handleFormErrors';
3
+ export { default as isObject } from './isObject';
4
+ export * from './limitExpiresAt';
5
+ export * from './FrontendContext';
@@ -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,2 @@
1
+ declare const isObject: (value: any) => boolean;
2
+ export default isObject;
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ var isObject = function (value) {
4
+ return typeof value === 'object' && value !== null;
5
+ };
6
+ exports.default = isObject;
@@ -0,0 +1,3 @@
1
+ export declare const setLimitExpiresAt: (value: number) => void;
2
+ export declare const getLimitExpiresAt: () => number;
3
+ export declare const getLimitExpiresIn: () => number;
@@ -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;