feat(TEAMMSBMOB-22636): added currency transfer list page

This commit is contained in:
Anton Tarakanov
2026-01-27 13:04:33 +05:00
parent 0c2a19d5be
commit 5b91de339f
17 changed files with 164 additions and 0 deletions
+1
View File
@@ -40,6 +40,7 @@ enum FEATURE_TOGGLE_NAMES {
LOCAL_QUALIFIED_SIGN_IBMSB = 'localQualifiedSignIBMSB',
IMPORT_PAYMENTS = 'ImportPaymentsIBMSB',
FEA_OPERATION_DAY = 'vedOperationDayInformIBMSB',
CURRENCY_TRANSFER_LIST = 'currencyTransferIBMSB',
MAIN_PAGE_DYNAMIC_BANNERS = 'mainpageDinamicBannersIBMSB',
SENTRY = 'monitoringIBMSB',
STAR_RATING = 'starRatingIBMSB',
+4
View File
@@ -78,6 +78,10 @@ const FEATURE_TOGGLE_MOCK: FeatureToggleResponse = {
featureCode: FEATURE_TOGGLE_NAMES.VED_CALLBACK_IMSB,
isEnabled: true,
},
{
featureCode: FEATURE_TOGGLE_NAMES.CURRENCY_TRANSFER_LIST,
isEnabled: true,
},
{
featureCode: FEATURE_TOGGLE_NAMES.STAR_RATING,
isEnabled: true,
@@ -1,10 +1,12 @@
import { Route, Switch } from 'react-router-dom';
import { CurrencyTransferListPage } from '@/pages/CurrencyTransferListPage';
import { FeaMainPage } from '@/pages/FeaMainPage';
import { PATHS } from '@/shared/constants';
const AppRouter = () => (
<Switch>
<Route exact component={FeaMainPage} path={PATHS.HOME.PATH} />
<Route exact component={CurrencyTransferListPage} path={PATHS.CURRENCY_TRANSFER.PATH} />
</Switch>
);
@@ -0,0 +1 @@
export { CurrencyTransferListPage } from './ui';
@@ -0,0 +1,5 @@
import { CurrencyTransferList } from '@/widgets/CurrencyTransferList';
const CurrencyTransferListPage = () => <CurrencyTransferList />;
export { CurrencyTransferListPage };
@@ -0,0 +1 @@
export { CurrencyTransferListPage } from './CurrencyTransferListPage';
+1
View File
@@ -1 +1,2 @@
export * from './FeaMainPage';
export * from './CurrencyTransferListPage';
@@ -1,7 +1,10 @@
const ROOT_PATH = '/fea';
const CURRENCY_TRANSFER = `${ROOT_PATH}/currency-transfer/paydoccurr`;
const PATHS = {
HOME: { PATH: ROOT_PATH, TITLE: 'ВЭД' },
CURRENCY_TRANSFER: { PATH: CURRENCY_TRANSFER, TITLE: '' },
} as const;
export { PATHS, ROOT_PATH };
@@ -0,0 +1,87 @@
import { render } from '@msb/shared/lib/tests/customRender';
import '@testing-library/jest-dom';
import { screen } from '@testing-library/react';
import { CurrencyTransferList } from '../ui';
const userAuthorities = {
data: {
authorities: ['CURRENCY_TRANSFER_CLIENT_SCROLLER_VIEW'],
clientAuthorities: {
'123': ['CURRENCY_TRANSFER_CLIENT_SCROLLER_VIEW'],
},
tmgUser: true,
},
};
const appContextMock = {
organizations: [],
userProfile: {},
isUserProfileError: false,
refetchUserProfile: jest.fn(),
organizationsError: null,
userAuthorities,
refetchUserAuthorities: jest.fn(),
refetchOrganizations: jest.fn(),
systemConfigs: {
systemClientConfig: new Map([]),
systemPublicConfig: new Map([]),
},
refetchSystemConfigs: jest.fn(),
};
const useFeatureTogglesMock = jest.fn(() => ({ isEnabled: true }));
const useAppContextMock = jest.fn(() => appContextMock);
const useMediaQueryMock = jest.fn();
const showModalMock = jest.fn();
jest.mock('@msb/shared', () => ({
...jest.requireActual('@msb/shared'),
Permissions: ({ children }: any) => <div>{children}</div>,
useAppContext: () => useAppContextMock(),
useRedirect: jest.fn(),
useFeatureToggles: () => useFeatureTogglesMock(),
useModal: () => ({
showModal: (data: any) => showModalMock(data),
hideModal: jest.fn(),
updateModal: jest.fn(),
}),
useModalContext: () => ({
showModal: (data: any) => showModalMock(data),
hideModal: jest.fn(),
updateModal: jest.fn(),
}),
useMediaQuery: () => useMediaQueryMock(),
}));
const historyPushMock = jest.fn();
jest.mock('react-router-dom', () => ({
...jest.requireActual('react-router-dom'),
useHistory: () => ({
push: historyPushMock,
}),
}));
const renderAccountsMainPage = () => render(<CurrencyTransferList />);
describe('CurrencyTransferList', () => {
beforeEach(() => {
useAppContextMock.mockReturnValue(appContextMock);
});
it('должен показывать модальное окно "Раздел в разработке" при выключенном FT', () => {
useFeatureTogglesMock.mockReturnValue({ isEnabled: false });
renderAccountsMainPage();
expect(showModalMock).toHaveBeenCalled();
});
it('должен показывать контент при включенном FT', () => {
useFeatureTogglesMock.mockReturnValue({ isEnabled: true });
renderAccountsMainPage();
expect(screen.getByText('CurrencyTransferList')).toBeInTheDocument();
});
});
@@ -0,0 +1 @@
export { CurrencyTransferList } from './ui';
@@ -0,0 +1,12 @@
import { AUTHORITIES_FIELD } from '@msb/shared';
import type { PermissionItem } from '@msb/shared';
import { PERMISSIONS } from '@/shared/constants';
const PERMISSION_CONFIG: PermissionItem[] = [
{
permissions: [PERMISSIONS.CURRENCY_TRANSFER_CLIENT_SCROLLER_VIEW],
authoritiesField: AUTHORITIES_FIELD.CLIENT_AUTHORITIES,
},
];
export { PERMISSION_CONFIG };
@@ -0,0 +1,2 @@
export * from './constants';
export * from './localization';
@@ -0,0 +1,5 @@
const LOCALIZATION = {
TITLE: 'Поручения на перевод валюты',
};
export { LOCALIZATION };
@@ -0,0 +1,25 @@
import { Permissions, TableLayout } from '@msb/shared';
import { PERMISSION_CONFIG, LOCALIZATION } from '../lib';
import { useCurrencyTransferList } from './useCurrencyTransferList';
const CurrencyTransferList = () => {
const { isEnabled } = useCurrencyTransferList();
// При отсутствии доступа показываем модалку и редиректим на стартовую в компоненте "useRedirectByToggle".
if (!isEnabled) {
return null;
}
/**
* TODO: Когда появятся метрики - использовать "PermissionsWithYM", чтобы не прокидывать YaMetrikaReachGoal.
*/
return (
<Permissions permissionsList={PERMISSION_CONFIG}>
<TableLayout title={LOCALIZATION.TITLE}>
<div>CurrencyTransferList</div>
</TableLayout>
</Permissions>
);
};
export { CurrencyTransferList };
@@ -0,0 +1 @@
export { CurrencyTransferList } from './CurrencyTransferList';
@@ -0,0 +1,12 @@
import { FEATURE_TOGGLE_NAMES } from '@msb/http';
import { useRedirectByToggle } from '@msb/shared';
const useCurrencyTransferList = () => {
const { isEnabled } = useRedirectByToggle(FEATURE_TOGGLE_NAMES.CURRENCY_TRANSFER_LIST);
return {
isEnabled,
};
};
export { useCurrencyTransferList };
+1
View File
@@ -1,2 +1,3 @@
export * from './AvailableServices';
export * from './FeaNeedHelp';
export * from './CurrencyTransferList';