From cee3892749051a6486b70ac7381cc697b5090356 Mon Sep 17 00:00:00 2001 From: Yasich217 Date: Fri, 5 Dec 2025 06:31:30 +0300 Subject: [PATCH] feat(TEAMMSBMOB-21008): connect business-cards service with toogle --- Dockerfile | 1 + nginx.conf | 3 + package-lock.json | 516 ++++++++++++++++++ package.json | 3 + packages/http/feature-toggles/types.ts | 1 + packages/mocks/feature-toggles/mocks.ts | 4 + packages/shared/constants/paths.tsx | 6 + services-versions.json | 5 + services/msb-host/public/feature-toggles.json | 4 + .../pages/ServicesPage/constants/services.ts | 6 +- .../pages/ServicesPage/ui/ServicesPage.tsx | 3 +- .../widgets/Sidebar/constants/redirects.ts | 1 - .../src/widgets/Sidebar/ui/MobileMenu.tsx | 24 +- .../src/widgets/Sidebar/ui/Sidebar.tsx | 35 +- services/msb-host/webpack.config.ts | 1 + 15 files changed, 599 insertions(+), 14 deletions(-) diff --git a/Dockerfile b/Dockerfile index 78fef5afa..4370325b7 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,6 +5,7 @@ COPY msb-main-page /opt/site/msb-main-page COPY msb-operations-history /opt/site/msb-operations-history COPY msb-deposits /opt/site/msb-deposits COPY msb-payments /opt/site/msb-payments +COPY msb-business-cards /opt/site/msb-business-cards COPY msb-statements-and-inquiries /opt/site/msb-statements-and-inquiries COPY msb-treasury-deals /opt/site/msb-treasury-deals COPY nginx.conf /etc/nginx/nginx.conf diff --git a/nginx.conf b/nginx.conf index c9a48dd0a..03cbce64e 100644 --- a/nginx.conf +++ b/nginx.conf @@ -33,6 +33,9 @@ http { location /msb-payments/ { try_files $uri $uri/ =404; } + location /msb-business-cards/ { + try_files $uri $uri/ =404; + } location /msb-statements-and-inquiries/ { try_files $uri $uri/ =404; } diff --git a/package-lock.json b/package-lock.json index cb1f6cc56..439cecda3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26603,6 +26603,10 @@ "resolved": "services/msb-accounts", "link": true }, + "node_modules/msb-business-cards": { + "resolved": "services/msb-business-cards", + "link": true + }, "node_modules/msb-deposits": { "resolved": "services/msb-deposits", "link": true @@ -37388,6 +37392,518 @@ "dev": true, "license": "Apache-2.0" }, + "services/msb-business-cards": { + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "@emotion/react": "11.8.1", + "@emotion/styled": "11.8.1", + "@fractal-ui/core": "30.15.0", + "@fractal-ui/extended": "30.15.0", + "@fractal-ui/form": "30.15.0", + "@fractal-ui/layout": "30.15.0", + "@fractal-ui/library": "31.4.0", + "@fractal-ui/overlays": "30.15.0", + "@fractal-ui/styling": "30.18.0", + "@fractal-ui/table": "30.15.0", + "@fractal-ui/visualization": "30.15.0", + "@msb/fractal-ui-composites": "30.15.1", + "@msb/http": "^1.0.0", + "@msb/mf-utils": "^1.0.0", + "@msb/shared": "^1.0.0", + "@styled-system/css": "^5.1.5", + "dayjs": "^1.11.3", + "react": "17.0.2", + "react-animate-height": "^2.0.23", + "react-dnd": "^11.1.3", + "react-dnd-html5-backend": "^11.1.3", + "react-dom": "17.0.2", + "react-final-form": "6.5.3", + "react-router-dom": "5.2.0", + "react-test-renderer": "17.0.2", + "styled-system": "5.1.5", + "virtua": "^0.31.0" + }, + "devDependencies": { + "@eco/lint-staged-config": "21.10.0", + "@fractal-ui/layout": "30.15.0", + "@msb/mf-builder": "1.0.0", + "@testing-library/jest-dom": "5.16.2", + "@testing-library/react": "12.1.3", + "@testing-library/react-hooks": "7.0.2", + "@testing-library/user-event": "13.5.0", + "@types/jest": "^27.4.0", + "@types/react": "17.0.36", + "@types/react-dom": "17.0.2", + "@types/react-router-dom": "5.1.7", + "@types/react-test-renderer": "17.0.2", + "@types/react-transition-group": "4.4.1", + "@types/styled-system": "5.1.15", + "@types/styled-system__css": "5.0.16", + "jest": "^27.0.6", + "jest-environment-jsdom": "^27.5.1", + "json-server": "^0.16.3", + "lint-staged": "^12.3.4", + "react-test-renderer": "17.0.2" + } + }, + "services/msb-business-cards/node_modules/@fractal-ui/styling": { + "version": "30.18.0", + "resolved": "https://nexus.gboteam.ru/repository/npm-eco-group/@fractal-ui/styling/-/styling-30.18.0.tgz", + "integrity": "sha512-mwKcZ6OvcAt4jCMtGS/Q3xZcdAxc57/JH/2k+RyxBQLqgKg37HJUK+g44uVTsZjIHFwVyUd2JpZFu64VtvxA4g==", + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "@emotion/react": "11.8.1", + "@emotion/styled": "11.8.1", + "@styled-system/css": "5.1.5", + "@types/styled-system": "5.1.15", + "dayjs": "1.11.3", + "final-form": "4.20.10", + "react": "17.0.2", + "react-animate-height": "2.0.23", + "react-dnd": "11.1.3", + "react-dnd-html5-backend": "11.1.3", + "react-dom": "17.0.2", + "react-final-form": "6.5.3", + "react-router-dom": "5.2.0", + "react-table": "7.7.0", + "styled-system": "5.1.5" + } + }, + "services/msb-business-cards/node_modules/@testing-library/dom": { + "version": "8.20.1", + "resolved": "https://nexus.gboteam.ru/repository/npm-eco-group/@testing-library/dom/-/dom-8.20.1.tgz", + "integrity": "sha512-/DiOQ5xBxgdYRC8LNk7U+RWat0S3qRLeIw3ZIkMQ9kkVlRmwD/Eg8k8CqIpD6GW7u20JIUOfMKbxtiLutpjQ4g==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.1.3", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=12" + } + }, + "services/msb-business-cards/node_modules/@testing-library/dom/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://nexus.gboteam.ru/repository/npm-eco-group/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "services/msb-business-cards/node_modules/@testing-library/jest-dom": { + "version": "5.16.2", + "resolved": "https://nexus.gboteam.ru/repository/npm-eco-group/@testing-library/jest-dom/-/jest-dom-5.16.2.tgz", + "integrity": "sha512-6ewxs1MXWwsBFZXIk4nKKskWANelkdUehchEOokHsN8X7c2eKXGw+77aRV63UU8f/DTSVUPLaGxdrj4lN7D/ug==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.9.2", + "@types/testing-library__jest-dom": "^5.9.1", + "aria-query": "^5.0.0", + "chalk": "^3.0.0", + "css": "^3.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.5.6", + "lodash": "^4.17.15", + "redent": "^3.0.0" + }, + "engines": { + "node": ">=8", + "npm": ">=6", + "yarn": ">=1" + } + }, + "services/msb-business-cards/node_modules/@testing-library/react": { + "version": "12.1.3", + "resolved": "https://nexus.gboteam.ru/repository/npm-eco-group/@testing-library/react/-/react-12.1.3.tgz", + "integrity": "sha512-oCULRXWRrBtC9m6G/WohPo1GLcLesH7T4fuKzRAKn1CWVu9BzXtqLXDDTA6KhFNNtRwLtfSMr20HFl+Qrdrvmg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.12.5", + "@testing-library/dom": "^8.0.0", + "@types/react-dom": "*" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "services/msb-business-cards/node_modules/@testing-library/react-hooks": { + "version": "7.0.2", + "resolved": "https://nexus.gboteam.ru/repository/npm-eco-group/@testing-library/react-hooks/-/react-hooks-7.0.2.tgz", + "integrity": "sha512-dYxpz8u9m4q1TuzfcUApqi8iFfR6R0FaMbr2hjZJy1uC8z+bO/K4v8Gs9eogGKYQop7QsrBTFkv/BCF7MzD2Cg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.12.5", + "@types/react": ">=16.9.0", + "@types/react-dom": ">=16.9.0", + "@types/react-test-renderer": ">=16.9.0", + "react-error-boundary": "^3.1.0" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0", + "react-test-renderer": ">=16.9.0" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-test-renderer": { + "optional": true + } + } + }, + "services/msb-business-cards/node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://nexus.gboteam.ru/repository/npm-eco-group/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "services/msb-business-cards/node_modules/acorn-globals": { + "version": "6.0.0", + "resolved": "https://nexus.gboteam.ru/repository/npm-eco-group/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "dev": true, + "dependencies": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } + }, + "services/msb-business-cards/node_modules/acorn-globals/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://nexus.gboteam.ru/repository/npm-eco-group/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "services/msb-business-cards/node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://nexus.gboteam.ru/repository/npm-eco-group/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "services/msb-business-cards/node_modules/aria-query": { + "version": "5.1.3", + "resolved": "https://nexus.gboteam.ru/repository/npm-eco-group/aria-query/-/aria-query-5.1.3.tgz", + "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "dev": true, + "dependencies": { + "deep-equal": "^2.0.5" + } + }, + "services/msb-business-cards/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://nexus.gboteam.ru/repository/npm-eco-group/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "services/msb-business-cards/node_modules/cssom": { + "version": "0.4.4", + "resolved": "https://nexus.gboteam.ru/repository/npm-eco-group/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "dev": true + }, + "services/msb-business-cards/node_modules/data-urls": { + "version": "2.0.0", + "resolved": "https://nexus.gboteam.ru/repository/npm-eco-group/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "dev": true, + "dependencies": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "services/msb-business-cards/node_modules/domexception": { + "version": "2.0.1", + "resolved": "https://nexus.gboteam.ru/repository/npm-eco-group/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "deprecated": "Use your platform's native DOMException instead", + "dev": true, + "dependencies": { + "webidl-conversions": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "services/msb-business-cards/node_modules/domexception/node_modules/webidl-conversions": { + "version": "5.0.0", + "resolved": "https://nexus.gboteam.ru/repository/npm-eco-group/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "services/msb-business-cards/node_modules/form-data": { + "version": "3.0.3", + "resolved": "https://nexus.gboteam.ru/repository/npm-eco-group/form-data/-/form-data-3.0.3.tgz", + "integrity": "sha512-q5YBMeWy6E2Un0nMGWMgI65MAKtaylxfNJGJxpGh45YDciZB4epbWpaAfImil6CPAPTYB4sh0URQNDRIZG5F2w==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "mime-types": "^2.1.35" + }, + "engines": { + "node": ">= 6" + } + }, + "services/msb-business-cards/node_modules/html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://nexus.gboteam.ru/repository/npm-eco-group/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "dev": true, + "dependencies": { + "whatwg-encoding": "^1.0.5" + }, + "engines": { + "node": ">=10" + } + }, + "services/msb-business-cards/node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://nexus.gboteam.ru/repository/npm-eco-group/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dev": true, + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "services/msb-business-cards/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://nexus.gboteam.ru/repository/npm-eco-group/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "services/msb-business-cards/node_modules/jest-environment-jsdom": { + "version": "27.5.1", + "resolved": "https://nexus.gboteam.ru/repository/npm-eco-group/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz", + "integrity": "sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==", + "dev": true, + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1", + "jsdom": "^16.6.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "services/msb-business-cards/node_modules/jsdom": { + "version": "16.7.0", + "resolved": "https://nexus.gboteam.ru/repository/npm-eco-group/jsdom/-/jsdom-16.7.0.tgz", + "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", + "dev": true, + "dependencies": { + "abab": "^2.0.5", + "acorn": "^8.2.4", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.5.0", + "ws": "^7.4.6", + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "services/msb-business-cards/node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://nexus.gboteam.ru/repository/npm-eco-group/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, + "services/msb-business-cards/node_modules/saxes": { + "version": "5.0.1", + "resolved": "https://nexus.gboteam.ru/repository/npm-eco-group/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dev": true, + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=10" + } + }, + "services/msb-business-cards/node_modules/tr46": { + "version": "2.1.0", + "resolved": "https://nexus.gboteam.ru/repository/npm-eco-group/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "dev": true, + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "services/msb-business-cards/node_modules/w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://nexus.gboteam.ru/repository/npm-eco-group/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "dev": true, + "dependencies": { + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "services/msb-business-cards/node_modules/webidl-conversions": { + "version": "6.1.0", + "resolved": "https://nexus.gboteam.ru/repository/npm-eco-group/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "dev": true, + "engines": { + "node": ">=10.4" + } + }, + "services/msb-business-cards/node_modules/whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://nexus.gboteam.ru/repository/npm-eco-group/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dev": true, + "dependencies": { + "iconv-lite": "0.4.24" + } + }, + "services/msb-business-cards/node_modules/whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://nexus.gboteam.ru/repository/npm-eco-group/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "dev": true + }, + "services/msb-business-cards/node_modules/whatwg-url": { + "version": "8.7.0", + "resolved": "https://nexus.gboteam.ru/repository/npm-eco-group/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "dev": true, + "dependencies": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "services/msb-business-cards/node_modules/ws": { + "version": "7.5.10", + "resolved": "https://nexus.gboteam.ru/repository/npm-eco-group/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "dev": true, + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "services/msb-business-cards/node_modules/xml-name-validator": { + "version": "3.0.0", + "resolved": "https://nexus.gboteam.ru/repository/npm-eco-group/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true + }, "services/msb-deposits": { "version": "1.7.0", "license": "ISC", diff --git a/package.json b/package.json index 489083ed1..892d59573 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,7 @@ "msb-payments", "msb-statements-and-inquiries", "msb-accounts", + "msb-business-cards", "msb-fea", "msb-partner-check", "msb-treasury-deals" @@ -31,7 +32,9 @@ "start:payments": "lerna run start --scope=msb-host --scope=msb-payments --stream", "start:stage:payments": "lerna run start:stage --scope=msb-host --stream & lerna run start --scope=msb-payments --stream", "start:accounts": "lerna run start --scope=msb-host --scope=msb-accounts --stream", + "start:business-cards": "lerna run start --scope=msb-host --scope=msb-business-cards --stream", "start:stage:accounts": "lerna run start:stage --stream & lerna run start --scope=msb-host --scope=msb-accounts --stream", + "start:stage:business-cards": "lerna run start:stage --stream & lerna run start --scope=msb-host --scope=msb-business-cards --stream", "start:stage:treasury-deals": "lerna run start:stage --scope=msb-host --stream & lerna run start --scope=msb-treasury-deals --stream", "start:stage:treasury-deals:win": "npx concurrently \"lerna run start:stage --scope=msb-host --stream\" \"lerna run start --scope=msb-treasury-deals --stream\"", "start:host": "lerna run start --scope=msb-host --stream", diff --git a/packages/http/feature-toggles/types.ts b/packages/http/feature-toggles/types.ts index 7d77a955a..3b56da715 100644 --- a/packages/http/feature-toggles/types.ts +++ b/packages/http/feature-toggles/types.ts @@ -16,6 +16,7 @@ interface FeatureToggleResponse { } enum FEATURE_TOGGLE_NAMES { + BUSINESS_CARDS_IBMSB = 'businessCardsIBMSB', MAIN_PAGE_AVAILABLE_BALANCE = 'mainpageAvailablebalanceIBMSB', MAIN_PAGE_ACCOUNT = 'mainpageAccountsIBMSB', PAYMENT_THIRD_PARTY_SWITCH = 'Payment3RdPartyIBMSB', diff --git a/packages/mocks/feature-toggles/mocks.ts b/packages/mocks/feature-toggles/mocks.ts index bc101702e..fb7cd741f 100644 --- a/packages/mocks/feature-toggles/mocks.ts +++ b/packages/mocks/feature-toggles/mocks.ts @@ -6,6 +6,10 @@ const FEATURE_TOGGLE_MOCK: FeatureToggleResponse = { actualTimestamp: Date.now(), data: { features: [ + { + featureCode: FEATURE_TOGGLE_NAMES.BUSINESS_CARDS_IBMSB, + isEnabled: true, + }, { featureCode: FEATURE_TOGGLE_NAMES.MAIN_PAGE_AVAILABLE_BALANCE, isEnabled: true, diff --git a/packages/shared/constants/paths.tsx b/packages/shared/constants/paths.tsx index bd1779fc7..ea7988c01 100644 --- a/packages/shared/constants/paths.tsx +++ b/packages/shared/constants/paths.tsx @@ -64,6 +64,11 @@ const ACCOUNTS_PATHS = { OPEN_ACCOUNT_ORDERS_LIST: `${PATHS.ACCOUNTS}/open-account`, } as const; +const BUSINESS_CARDS_PATHS = { + HOME: `${PATHS.BUSINESS_CARDS}/cards`, + DETAILS: `${PATHS.BUSINESS_CARDS}/cards-view/:id`, +} as const; + const ECO_CLIENT_ENDPOINT = process.env.ECO_CLIENT_ENDPOINT || ''; const EXTERNAL_PATHS = { @@ -158,6 +163,7 @@ export { CROSS_SELLING_JSON, CROSS_BORDER_AB_PAYMENTS, ACCOUNTS_PATHS, + BUSINESS_CARDS_PATHS, CROSS_SALE_PATHS, EXTERNAL_LINKS, queryStringVersion, diff --git a/services-versions.json b/services-versions.json index 05eb195c5..add6921d2 100644 --- a/services-versions.json +++ b/services-versions.json @@ -4,6 +4,11 @@ "version": "1.6.0", "private": false }, + { + "name": "msb-business-cards", + "version": "1.0.0", + "private": false + }, { "name": "msb-deposits", "version": "1.7.0", diff --git a/services/msb-host/public/feature-toggles.json b/services/msb-host/public/feature-toggles.json index 5f817b7c4..685f496db 100644 --- a/services/msb-host/public/feature-toggles.json +++ b/services/msb-host/public/feature-toggles.json @@ -3,6 +3,10 @@ "actualTimestamp": 1718901234567, "data": { "features": [ + { + "featureCode": "businessCardsIBMSB", + "isEnabled": false + }, { "featureCode": "mainpageAvailablebalanceIBMSB", "isEnabled": true diff --git a/services/msb-host/src/pages/ServicesPage/constants/services.ts b/services/msb-host/src/pages/ServicesPage/constants/services.ts index 098447036..a66b71731 100644 --- a/services/msb-host/src/pages/ServicesPage/constants/services.ts +++ b/services/msb-host/src/pages/ServicesPage/constants/services.ts @@ -1,6 +1,7 @@ import { lightTheme } from '@fractal-ui/styling'; import { ACCOUNTS_PATHS, + BUSINESS_CARDS_PATHS, CROSS_BORDER_AB_PAYMENTS, ECO_SERVICES_PATHS, EXTERNAL_LINKS, @@ -13,10 +14,11 @@ import type { ServicesGroup } from '../model'; import LOCALIZATION from './localization'; interface EnabledServices { + isBusinessCardsEnabled: boolean; isSecondAccountEnabled: boolean; } -function getServicesForYou({ isSecondAccountEnabled }: EnabledServices): ServicesGroup[] { +function getServicesForYou({ isBusinessCardsEnabled, isSecondAccountEnabled }: EnabledServices): ServicesGroup[] { return [ { title: LOCALIZATION.OPENING_MAINTAINING_ACCOUNT, @@ -108,7 +110,7 @@ function getServicesForYou({ isSecondAccountEnabled }: EnabledServices): Service description: LOCALIZATION.TOOL_FOR_PAYING_BUSINESS_EXPENSES, iconBackground: lightTheme.gradients.sapphire, icon: icons.businessCards, - navigateUrl: ECO_SERVICES_PATHS.BUSINESS_CARDS, + navigateUrl: isBusinessCardsEnabled ? BUSINESS_CARDS_PATHS.HOME : ECO_SERVICES_PATHS.BUSINESS_CARDS, ymCode: 'business_cards', }, { diff --git a/services/msb-host/src/pages/ServicesPage/ui/ServicesPage.tsx b/services/msb-host/src/pages/ServicesPage/ui/ServicesPage.tsx index bd164360d..ddae55204 100644 --- a/services/msb-host/src/pages/ServicesPage/ui/ServicesPage.tsx +++ b/services/msb-host/src/pages/ServicesPage/ui/ServicesPage.tsx @@ -37,11 +37,12 @@ const ServicesPage = () => { const { handleReachGoal } = useYaMetrika(); const { isEnabled: isSecondAccountEnabled } = useFeatureToggles(FEATURE_TOGGLE_NAMES.OPEN_SECOND_ACCOUNT); + const { isEnabled: isBusinessCardsEnabled } = useFeatureToggles(FEATURE_TOGGLE_NAMES.BUSINESS_CARDS_IBMSB); const tabsComponents: Record = { forYou: ( - {getServicesForYou({ isSecondAccountEnabled }).map(blockServices => ( + {getServicesForYou({ isBusinessCardsEnabled, isSecondAccountEnabled }).map(blockServices => ( ))} diff --git a/services/msb-host/src/widgets/Sidebar/constants/redirects.ts b/services/msb-host/src/widgets/Sidebar/constants/redirects.ts index 4a5757903..881191d81 100644 --- a/services/msb-host/src/widgets/Sidebar/constants/redirects.ts +++ b/services/msb-host/src/widgets/Sidebar/constants/redirects.ts @@ -3,7 +3,6 @@ import { EXTERNAL_PATHS, PATHS } from '@msb/shared'; const LIST_OF_REDIRECTS: Partial> = { [PATHS.SALARY_PROJECT]: EXTERNAL_PATHS.SALARY_PROJECT, [PATHS.CREDIT_ACCOUNT]: EXTERNAL_PATHS.CREDIT_ACCOUNT, - [PATHS.BUSINESS_CARDS]: EXTERNAL_PATHS.BUSINESS_CARDS, [PATHS.ACQUIRING]: EXTERNAL_PATHS.ACQUIRING, }; diff --git a/services/msb-host/src/widgets/Sidebar/ui/MobileMenu.tsx b/services/msb-host/src/widgets/Sidebar/ui/MobileMenu.tsx index 870bdf68e..ec4d93147 100644 --- a/services/msb-host/src/widgets/Sidebar/ui/MobileMenu.tsx +++ b/services/msb-host/src/widgets/Sidebar/ui/MobileMenu.tsx @@ -1,6 +1,7 @@ import type { FC } from 'react'; import type { RemoteRouteConfigVisibleOnMobile } from '@msb/http'; -import { PATHS, useYaMetrika, YM_GOALS } from '@msb/shared'; +import { FEATURE_TOGGLE_NAMES } from '@msb/http'; +import { BUSINESS_CARDS_PATHS, EXTERNAL_PATHS, PATHS, useFeatureToggles, useYaMetrika, YM_GOALS } from '@msb/shared'; import { useHistory } from 'react-router-dom'; import { LOCALIZATION, LIST_OF_REDIRECTS } from '../constants'; import * as S from './Sidebar.styles'; @@ -13,6 +14,8 @@ const MobileMenu: FC = ({ modules = [] }) => { const { handleReachGoal } = useYaMetrika(); const history = useHistory(); + const { isEnabled: isBusinessCardsEnabled } = useFeatureToggles(FEATURE_TOGGLE_NAMES.BUSINESS_CARDS_IBMSB); + const onClickLink = (event: React.MouseEvent, path: PATHS, ymCode: string) => { event.preventDefault(); @@ -26,9 +29,20 @@ const MobileMenu: FC = ({ modules = [] }) => { const renderLink = (item: RemoteRouteConfigVisibleOnMobile) => { const icon = item.path in SIDEBAR_ICONS ? SIDEBAR_ICONS[item.path as keyof typeof SIDEBAR_ICONS] : null; - if (item.path in LIST_OF_REDIRECTS) { + /** Заменяем путь на полный(с /cards на конце) при включенном флаге. */ + const itemPath = isBusinessCardsEnabled && item.path === PATHS.BUSINESS_CARDS ? BUSINESS_CARDS_PATHS.HOME : item.path; + + /** Если флаг выключен, добавляем во внешний редирект, вместо внутреннего роута. */ + const listOfRedirects = isBusinessCardsEnabled + ? LIST_OF_REDIRECTS + : { + ...LIST_OF_REDIRECTS, + [PATHS.BUSINESS_CARDS]: EXTERNAL_PATHS.BUSINESS_CARDS, + }; + + if (item.path in listOfRedirects) { return ( - + {item.shortTitle} ); @@ -38,8 +52,8 @@ const MobileMenu: FC = ({ modules = [] }) => { onClickLink(event, item.path as PATHS, item.ymCode)} + to={itemPath} + onClick={event => onClickLink(event, itemPath as PATHS, item.ymCode)} > {item.shortTitle} diff --git a/services/msb-host/src/widgets/Sidebar/ui/Sidebar.tsx b/services/msb-host/src/widgets/Sidebar/ui/Sidebar.tsx index 824da9fd7..6468e7b4a 100644 --- a/services/msb-host/src/widgets/Sidebar/ui/Sidebar.tsx +++ b/services/msb-host/src/widgets/Sidebar/ui/Sidebar.tsx @@ -1,6 +1,18 @@ import type { FC } from 'react'; import type { RemoteRouteConfigDto } from '@msb/http'; -import { MEDIA, PATHS, useAccountsPermissions, useMediaQuery, useUnauthorizedModal, useYaMetrika, YM_GOALS } from '@msb/shared'; +import { FEATURE_TOGGLE_NAMES } from '@msb/http'; +import { + BUSINESS_CARDS_PATHS, + EXTERNAL_PATHS, + MEDIA, + PATHS, + useAccountsPermissions, + useFeatureToggles, + useMediaQuery, + useUnauthorizedModal, + useYaMetrika, + YM_GOALS, +} from '@msb/shared'; import { useHistory } from 'react-router-dom'; import { LOCALIZATION, LIST_OF_REDIRECTS } from '../constants'; import * as S from './Sidebar.styles'; @@ -13,6 +25,8 @@ const Sidebar: FC = ({ modules = [] }) => { const isDesktop = useMediaQuery(MEDIA.desktop); const { handleReachGoal } = useYaMetrika(); + const { isEnabled: isBusinessCardsEnabled } = useFeatureToggles(FEATURE_TOGGLE_NAMES.BUSINESS_CARDS_IBMSB); + const history = useHistory(); const { haveAccountsPermission } = useAccountsPermissions(); @@ -45,11 +59,22 @@ const Sidebar: FC = ({ modules = [] }) => { const icon = item.path in SIDEBAR_ICONS ? SIDEBAR_ICONS[item.path as keyof typeof SIDEBAR_ICONS] : null; - if (item.path in LIST_OF_REDIRECTS) { + /** Заменяем путь на полный(с /cards на конце) при включенном флаге. */ + const itemPath = isBusinessCardsEnabled && item.path === PATHS.BUSINESS_CARDS ? BUSINESS_CARDS_PATHS.HOME : item.path; + + /** Если флаг выключен, добавляем во внешний редирект, вместо внутреннего роута. */ + const listOfRedirects = isBusinessCardsEnabled + ? LIST_OF_REDIRECTS + : { + ...LIST_OF_REDIRECTS, + [PATHS.BUSINESS_CARDS]: EXTERNAL_PATHS.BUSINESS_CARDS, + }; + + if (item.path in listOfRedirects) { return ( @@ -69,8 +94,8 @@ const Sidebar: FC = ({ modules = [] }) => { onClickLink(event, item.path as PATHS, item.ymCode)} + to={itemPath} + onClick={event => onClickLink(event, itemPath as PATHS, item.ymCode)} > {item.title} diff --git a/services/msb-host/webpack.config.ts b/services/msb-host/webpack.config.ts index 8a68e644c..de28eca8d 100644 --- a/services/msb-host/webpack.config.ts +++ b/services/msb-host/webpack.config.ts @@ -66,6 +66,7 @@ const config: IWebpackAppConfig = { pathRewrite: { '/msb-partner-check': '' }, }, { context: ['/msb-accounts'], target: 'http://localhost:3006', changeOrigin: true, pathRewrite: { '/msb-accounts': '' } }, + { context: ['/msb-business-cards'], target: 'http://localhost:3011', changeOrigin: true, pathRewrite: { '/msb-business-cards': '' } }, { context: ['/msb-treasury-deals'], target: 'http://localhost:3010', changeOrigin: true, pathRewrite: { '/msb-treasury-deals': '' } }, { context: ['/api', '/.well-known'],