@rabbitio/ui-kit 1.0.0-beta.7 → 1.0.0-beta.70
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/.gitlab-ci.yml +29 -0
- package/.husky/commit-msg +14 -0
- package/.husky/pre-push +1 -0
- package/CHANGELOG.md +0 -0
- package/README.md +27 -18
- package/coverage/base.css +224 -0
- package/coverage/block-navigation.js +87 -0
- package/coverage/clover.xml +11536 -0
- package/coverage/coverage-final.json +100 -0
- package/coverage/favicon.png +0 -0
- package/coverage/index.html +986 -0
- package/coverage/prettify.css +1 -0
- package/coverage/prettify.js +2 -0
- package/coverage/rabbit-ui-kit/index.html +116 -0
- package/coverage/rabbit-ui-kit/index.js.html +88 -0
- package/coverage/rabbit-ui-kit/src/assets/wrappedImages/arrowIcon.jsx.html +124 -0
- package/coverage/rabbit-ui-kit/src/assets/wrappedImages/arrowTosca.jsx.html +127 -0
- package/coverage/rabbit-ui-kit/src/assets/wrappedImages/arrowWhite.jsx.html +127 -0
- package/coverage/rabbit-ui-kit/src/assets/wrappedImages/darkRectangle.jsx.html +106 -0
- package/coverage/rabbit-ui-kit/src/assets/wrappedImages/determinedError.jsx.html +439 -0
- package/coverage/rabbit-ui-kit/src/assets/wrappedImages/failedValidationIcon.jsx.html +202 -0
- package/coverage/rabbit-ui-kit/src/assets/wrappedImages/index.html +251 -0
- package/coverage/rabbit-ui-kit/src/assets/wrappedImages/infoIcon.jsx.html +133 -0
- package/coverage/rabbit-ui-kit/src/assets/wrappedImages/noticeQuestionIcon.jsx.html +247 -0
- package/coverage/rabbit-ui-kit/src/assets/wrappedImages/successfulValidationIcon.jsx.html +163 -0
- package/coverage/rabbit-ui-kit/src/assets/wrappedImages/walletIcon.jsx.html +151 -0
- package/coverage/rabbit-ui-kit/src/common/adapters/axiosAdapter.js.html +190 -0
- package/coverage/rabbit-ui-kit/src/common/adapters/index.html +131 -0
- package/coverage/rabbit-ui-kit/src/common/adapters/qrUtils.js.html +139 -0
- package/coverage/rabbit-ui-kit/src/common/amountUtils.js.html +1162 -0
- package/coverage/rabbit-ui-kit/src/common/errorUtils.js.html +211 -0
- package/coverage/rabbit-ui-kit/src/common/external-apis/apiGroups.js.html +250 -0
- package/coverage/rabbit-ui-kit/src/common/external-apis/index.html +131 -0
- package/coverage/rabbit-ui-kit/src/common/external-apis/ipAddressProviders.js.html +352 -0
- package/coverage/rabbit-ui-kit/src/common/fiatCurrenciesService.js.html +544 -0
- package/coverage/rabbit-ui-kit/src/common/index.html +146 -0
- package/coverage/rabbit-ui-kit/src/common/models/blockchain.js.html +115 -0
- package/coverage/rabbit-ui-kit/src/common/models/coin.js.html +544 -0
- package/coverage/rabbit-ui-kit/src/common/models/index.html +146 -0
- package/coverage/rabbit-ui-kit/src/common/models/protocol.js.html +100 -0
- package/coverage/rabbit-ui-kit/src/common/utils/cache.js.html +811 -0
- package/coverage/rabbit-ui-kit/src/common/utils/emailAPI.js.html +133 -0
- package/coverage/rabbit-ui-kit/src/common/utils/index.html +161 -0
- package/coverage/rabbit-ui-kit/src/common/utils/logging/index.html +131 -0
- package/coverage/rabbit-ui-kit/src/common/utils/logging/logger.js.html +208 -0
- package/coverage/rabbit-ui-kit/src/common/utils/logging/logsStorage.js.html +268 -0
- package/coverage/rabbit-ui-kit/src/common/utils/postponeExecution.js.html +118 -0
- package/coverage/rabbit-ui-kit/src/common/utils/safeStringify.js.html +235 -0
- package/coverage/rabbit-ui-kit/src/components/atoms/AssetIcon/AssetIcon.jsx.html +247 -0
- package/coverage/rabbit-ui-kit/src/components/atoms/AssetIcon/index.html +116 -0
- package/coverage/rabbit-ui-kit/src/components/atoms/AssetSelection/AssetSelection.jsx.html +286 -0
- package/coverage/rabbit-ui-kit/src/components/atoms/AssetSelection/index.html +116 -0
- package/coverage/rabbit-ui-kit/src/components/atoms/BackgroundTitle/BackgroundTitle.jsx.html +187 -0
- package/coverage/rabbit-ui-kit/src/components/atoms/BackgroundTitle/index.html +116 -0
- package/coverage/rabbit-ui-kit/src/components/atoms/InformationMessage/InformationMessage.jsx.html +235 -0
- package/coverage/rabbit-ui-kit/src/components/atoms/InformationMessage/index.html +116 -0
- package/coverage/rabbit-ui-kit/src/components/atoms/Input/Input.jsx.html +631 -0
- package/coverage/rabbit-ui-kit/src/components/atoms/Input/index.html +116 -0
- package/coverage/rabbit-ui-kit/src/components/atoms/LoadingDots/LoadingDots.jsx.html +196 -0
- package/coverage/rabbit-ui-kit/src/components/atoms/LoadingDots/index.html +116 -0
- package/coverage/rabbit-ui-kit/src/components/atoms/NoticeIcon/NoticeIcon.jsx.html +277 -0
- package/coverage/rabbit-ui-kit/src/components/atoms/NoticeIcon/index.html +116 -0
- package/coverage/rabbit-ui-kit/src/components/atoms/QrCode/QrCode.jsx.html +187 -0
- package/coverage/rabbit-ui-kit/src/components/atoms/QrCode/index.html +116 -0
- package/coverage/rabbit-ui-kit/src/components/atoms/RateSelector/RateSelector.jsx.html +172 -0
- package/coverage/rabbit-ui-kit/src/components/atoms/RateSelector/index.html +116 -0
- package/coverage/rabbit-ui-kit/src/components/atoms/SupportChat/SupportChat.jsx.html +214 -0
- package/coverage/rabbit-ui-kit/src/components/atoms/SupportChat/index.html +116 -0
- package/coverage/rabbit-ui-kit/src/components/atoms/Textarea/Textarea.jsx.html +523 -0
- package/coverage/rabbit-ui-kit/src/components/atoms/Textarea/index.html +116 -0
- package/coverage/rabbit-ui-kit/src/components/atoms/TitleBox/TitleBox.jsx.html +508 -0
- package/coverage/rabbit-ui-kit/src/components/atoms/TitleBox/index.html +116 -0
- package/coverage/rabbit-ui-kit/src/components/atoms/Tooltip/Tooltip.jsx.html +289 -0
- package/coverage/rabbit-ui-kit/src/components/atoms/Tooltip/index.html +116 -0
- package/coverage/rabbit-ui-kit/src/components/atoms/TwoLinesOfText/LinesOfText.jsx.html +307 -0
- package/coverage/rabbit-ui-kit/src/components/atoms/TwoLinesOfText/index.html +116 -0
- package/coverage/rabbit-ui-kit/src/components/atoms/Validation/Validation.jsx.html +208 -0
- package/coverage/rabbit-ui-kit/src/components/atoms/Validation/index.html +116 -0
- package/coverage/rabbit-ui-kit/src/components/atoms/buttons/Button/Button.jsx.html +712 -0
- package/coverage/rabbit-ui-kit/src/components/atoms/buttons/Button/index.html +116 -0
- package/coverage/rabbit-ui-kit/src/components/atoms/buttons/Close/Close.jsx.html +244 -0
- package/coverage/rabbit-ui-kit/src/components/atoms/buttons/Close/index.html +116 -0
- package/coverage/rabbit-ui-kit/src/components/atoms/buttons/LinkButton/LinkButton.jsx.html +403 -0
- package/coverage/rabbit-ui-kit/src/components/atoms/buttons/LinkButton/index.html +116 -0
- package/coverage/rabbit-ui-kit/src/components/atoms/buttons/RadioButtonWithText/RadioButtonWithText.jsx.html +415 -0
- package/coverage/rabbit-ui-kit/src/components/atoms/buttons/RadioButtonWithText/index.html +116 -0
- package/coverage/rabbit-ui-kit/src/components/hooks/index.html +131 -0
- package/coverage/rabbit-ui-kit/src/components/hooks/useCallHandlingErrors.js.html +151 -0
- package/coverage/rabbit-ui-kit/src/components/hooks/useReferredState.js.html +157 -0
- package/coverage/rabbit-ui-kit/src/components/molecules/AmountInput/AmountInput.jsx.html +997 -0
- package/coverage/rabbit-ui-kit/src/components/molecules/AmountInput/index.html +116 -0
- package/coverage/rabbit-ui-kit/src/components/molecules/CoinPicker/CoinPicker.jsx.html +1612 -0
- package/coverage/rabbit-ui-kit/src/components/molecules/CoinPicker/index.html +116 -0
- package/coverage/rabbit-ui-kit/src/components/molecules/LineWithIconLink/LineWithIconLink.jsx.html +190 -0
- package/coverage/rabbit-ui-kit/src/components/molecules/LineWithIconLink/index.html +116 -0
- package/coverage/rabbit-ui-kit/src/components/molecules/TitledLineWithIconLink/TitledLineWithIconLink.jsx.html +175 -0
- package/coverage/rabbit-ui-kit/src/components/molecules/TitledLineWithIconLink/index.html +116 -0
- package/coverage/rabbit-ui-kit/src/components/organisms/CoinPickerDialogStep/CoinPickerDialogStep.jsx.html +277 -0
- package/coverage/rabbit-ui-kit/src/components/organisms/CoinPickerDialogStep/index.html +116 -0
- package/coverage/rabbit-ui-kit/src/components/organisms/Dialog/Dialog.jsx.html +1480 -0
- package/coverage/rabbit-ui-kit/src/components/organisms/Dialog/DialogButtons/DialogButtons.jsx.html +451 -0
- package/coverage/rabbit-ui-kit/src/components/organisms/Dialog/DialogButtons/index.html +116 -0
- package/coverage/rabbit-ui-kit/src/components/organisms/Dialog/DialogStep/DialogStep.jsx.html +1684 -0
- package/coverage/rabbit-ui-kit/src/components/organisms/Dialog/DialogStep/index.html +116 -0
- package/coverage/rabbit-ui-kit/src/components/organisms/Dialog/index.html +116 -0
- package/coverage/rabbit-ui-kit/src/components/organisms/SwapForm/SwapForm.jsx.html +3400 -0
- package/coverage/rabbit-ui-kit/src/components/organisms/SwapForm/index.html +116 -0
- package/coverage/rabbit-ui-kit/src/components/templates/DeterminedErrorDialogStep/DeterminedErrorDialogStep.jsx.html +316 -0
- package/coverage/rabbit-ui-kit/src/components/templates/DeterminedErrorDialogStep/index.html +116 -0
- package/coverage/rabbit-ui-kit/src/components/utils/index.html +161 -0
- package/coverage/rabbit-ui-kit/src/components/utils/inputValueProviders.js.html +235 -0
- package/coverage/rabbit-ui-kit/src/components/utils/textUtils.js.html +139 -0
- package/coverage/rabbit-ui-kit/src/components/utils/uiUtils.js.html +121 -0
- package/coverage/rabbit-ui-kit/src/components/utils/urlQueryUtils.js.html +271 -0
- package/coverage/rabbit-ui-kit/src/constants/atoms/Close/close.jsx.html +100 -0
- package/coverage/rabbit-ui-kit/src/constants/atoms/Close/index.html +116 -0
- package/coverage/rabbit-ui-kit/src/constants/atoms/LinkButton/index.html +116 -0
- package/coverage/rabbit-ui-kit/src/constants/atoms/LinkButton/linkButton.jsx.html +103 -0
- package/coverage/rabbit-ui-kit/src/constants/atoms/Tooltip/index.html +116 -0
- package/coverage/rabbit-ui-kit/src/constants/atoms/Tooltip/tooltip.jsx.html +109 -0
- package/coverage/rabbit-ui-kit/src/constants/globalConstants.jsx.html +94 -0
- package/coverage/rabbit-ui-kit/src/constants/index.html +116 -0
- package/coverage/rabbit-ui-kit/src/constants/organisms/dialog/DialogStep/dialogStep.js.html +88 -0
- package/coverage/rabbit-ui-kit/src/constants/organisms/dialog/DialogStep/index.html +116 -0
- package/coverage/rabbit-ui-kit/src/constants/organisms/dialog/dialog.js.html +172 -0
- package/coverage/rabbit-ui-kit/src/constants/organisms/dialog/index.html +116 -0
- package/coverage/rabbit-ui-kit/src/index.html +116 -0
- package/coverage/rabbit-ui-kit/src/index.js.html +349 -0
- package/coverage/rabbit-ui-kit/src/robustExteranlApiCallerService/cacheAndConcurrentRequestsResolver.js.html +1570 -0
- package/coverage/rabbit-ui-kit/src/robustExteranlApiCallerService/cachedRobustExternalApiCallerService.js.html +526 -0
- package/coverage/rabbit-ui-kit/src/robustExteranlApiCallerService/cancelProcessing.js.html +172 -0
- package/coverage/rabbit-ui-kit/src/robustExteranlApiCallerService/concurrentCalculationsMetadataHolder.js.html +310 -0
- package/coverage/rabbit-ui-kit/src/robustExteranlApiCallerService/externalApiProvider.js.html +553 -0
- package/coverage/rabbit-ui-kit/src/robustExteranlApiCallerService/externalServicesStatsCollector.js.html +319 -0
- package/coverage/rabbit-ui-kit/src/robustExteranlApiCallerService/index.html +206 -0
- package/coverage/rabbit-ui-kit/src/robustExteranlApiCallerService/robustExternalAPICallerService.js.html +997 -0
- package/coverage/rabbit-ui-kit/src/swaps-lib/external-apis/index.html +131 -0
- package/coverage/rabbit-ui-kit/src/swaps-lib/external-apis/swapProvider.js.html +709 -0
- package/coverage/rabbit-ui-kit/src/swaps-lib/external-apis/swapspaceSwapProvider.js.html +2197 -0
- package/coverage/rabbit-ui-kit/src/swaps-lib/models/baseSwapCreationInfo.js.html +214 -0
- package/coverage/rabbit-ui-kit/src/swaps-lib/models/existingSwap.js.html +304 -0
- package/coverage/rabbit-ui-kit/src/swaps-lib/models/existingSwapWithFiatData.js.html +469 -0
- package/coverage/rabbit-ui-kit/src/swaps-lib/models/index.html +146 -0
- package/coverage/rabbit-ui-kit/src/swaps-lib/services/index.html +116 -0
- package/coverage/rabbit-ui-kit/src/swaps-lib/services/publicSwapService.js.html +1888 -0
- package/coverage/rabbit-ui-kit/src/swaps-lib/utils/index.html +116 -0
- package/coverage/rabbit-ui-kit/src/swaps-lib/utils/swapUtils.js.html +595 -0
- package/coverage/rabbit-ui-kit/stories/atoms/BackgroundTitle.stories.jsx.html +202 -0
- package/coverage/rabbit-ui-kit/stories/atoms/LinesOfText.stories.jsx.html +283 -0
- package/coverage/rabbit-ui-kit/stories/atoms/LoadingDots.stories.jsx.html +226 -0
- package/coverage/rabbit-ui-kit/stories/atoms/QrCode.stories.jsx.html +175 -0
- package/coverage/rabbit-ui-kit/stories/atoms/RateSelector.stories.jsx.html +136 -0
- package/coverage/rabbit-ui-kit/stories/atoms/Validation.stories.jsx.html +178 -0
- package/coverage/rabbit-ui-kit/stories/atoms/buttons/Button.stories.jsx.html +946 -0
- package/coverage/rabbit-ui-kit/stories/atoms/buttons/Close.stories.jsx.html +214 -0
- package/coverage/rabbit-ui-kit/stories/atoms/buttons/LinkButton.stories.jsx.html +295 -0
- package/coverage/rabbit-ui-kit/stories/atoms/buttons/index.html +146 -0
- package/coverage/rabbit-ui-kit/stories/atoms/index.html +191 -0
- package/coverage/rabbit-ui-kit/stories/molecules/LineWithIconLink.stories.jsx.html +154 -0
- package/coverage/rabbit-ui-kit/stories/molecules/TitledLineWithIconLink.stories.jsx.html +160 -0
- package/coverage/rabbit-ui-kit/stories/molecules/index.html +131 -0
- package/coverage/rabbit-ui-kit/stories/organisms/Dialog/Dialog.stories.jsx.html +589 -0
- package/coverage/rabbit-ui-kit/stories/organisms/Dialog/DialogButtons/DialogButtons.stories.jsx.html +328 -0
- package/coverage/rabbit-ui-kit/stories/organisms/Dialog/DialogButtons/index.html +116 -0
- package/coverage/rabbit-ui-kit/stories/organisms/Dialog/DialogStep/DialogStep.stories.jsx.html +337 -0
- package/coverage/rabbit-ui-kit/stories/organisms/Dialog/DialogStep/index.html +116 -0
- package/coverage/rabbit-ui-kit/stories/organisms/Dialog/index.html +116 -0
- package/coverage/rabbit-ui-kit/stories/stubs/exampleContent.jsx.html +145 -0
- package/coverage/rabbit-ui-kit/stories/stubs/index.html +116 -0
- package/coverage/rabbit-ui-kit/stories/templates/DeterminedErrorDialogStep.stories.jsx.html +193 -0
- package/coverage/rabbit-ui-kit/stories/templates/index.html +116 -0
- package/coverage/sort-arrow-sprite.png +0 -0
- package/coverage/sorter.js +196 -0
- package/dist/index.cjs +10019 -9
- package/dist/index.cjs.map +1 -1
- package/dist/index.css +71418 -1641
- package/dist/index.css.map +1 -1
- package/dist/index.modern.js +7716 -11
- package/dist/index.modern.js.map +1 -1
- package/dist/index.module.js +9939 -11
- package/dist/index.module.js.map +1 -1
- package/dist/index.umd.js +10010 -12
- package/dist/index.umd.js.map +1 -1
- package/index.js +1 -1
- package/package.json +29 -5
- package/src/assets/image/icons/arrow-tosca.svg +3 -0
- package/src/assets/wrappedImages/arrowIcon.jsx +13 -0
- package/src/assets/wrappedImages/arrowTosca.jsx +14 -0
- package/src/assets/wrappedImages/arrowWhite.jsx +14 -0
- package/src/assets/wrappedImages/darkRectangle.jsx +7 -0
- package/src/assets/wrappedImages/determinedError.jsx +118 -0
- package/src/assets/wrappedImages/failedValidationIcon.jsx +39 -0
- package/src/assets/wrappedImages/infoIcon.jsx +16 -0
- package/src/assets/wrappedImages/noticeQuestionIcon.jsx +54 -0
- package/src/assets/wrappedImages/successfulValidationIcon.jsx +26 -0
- package/src/assets/wrappedImages/walletIcon.jsx +22 -0
- package/src/common/adapters/axiosAdapter.js +35 -0
- package/src/common/adapters/qrUtils.js +18 -0
- package/src/common/amountUtils.js +359 -0
- package/src/common/errorUtils.js +42 -0
- package/src/common/external-apis/apiGroups.js +55 -0
- package/src/common/external-apis/ipAddressProviders.js +89 -0
- package/src/common/fiatCurrenciesService.js +153 -0
- package/src/common/models/blockchain.js +10 -0
- package/src/common/models/coin.js +153 -0
- package/src/common/models/protocol.js +5 -0
- package/src/common/tests/amountUtils/composeRateText.test.js +152 -0
- package/src/common/tests/integration/external-apis/ipAddressProviders/getClientIpAddress.test.js +12 -0
- package/src/common/utils/cache.js +242 -0
- package/src/common/utils/emailAPI.js +16 -0
- package/src/common/utils/logging/logger.js +41 -0
- package/src/common/utils/logging/logsStorage.js +61 -0
- package/src/common/utils/postponeExecution.js +11 -0
- package/src/common/utils/safeStringify.js +50 -0
- package/src/components/atoms/AssetIcon/AssetIcon.jsx +54 -0
- package/{stories → src/components}/atoms/AssetIcon/asset-icon.module.scss +1 -1
- package/src/components/atoms/AssetSelection/AssetSelection.jsx +67 -0
- package/src/components/atoms/AssetSelection/asset-selection.module.scss +56 -0
- package/src/components/atoms/BackgroundTitle/BackgroundTitle.jsx +34 -0
- package/src/components/atoms/BackgroundTitle/background-title.module.scss +52 -0
- package/src/components/atoms/InformationMessage/InformationMessage.jsx +50 -0
- package/src/components/atoms/InformationMessage/information-message.module.scss +38 -0
- package/src/components/atoms/Input/Input.jsx +182 -0
- package/src/components/atoms/Input/input.module.scss +107 -0
- package/{stories → src/components}/atoms/LoadingDots/LoadingDots.jsx +8 -28
- package/{stories → src/components}/atoms/LoadingDots/LoadingDots.module.scss +1 -1
- package/src/components/atoms/NoticeIcon/NoticeIcon.jsx +64 -0
- package/src/components/atoms/NoticeIcon/notice-icon.module.scss +14 -0
- package/src/components/atoms/QrCode/QrCode.jsx +34 -0
- package/src/components/atoms/QrCode/qr-code.module.scss +15 -0
- package/src/components/atoms/RateSelector/RateSelector.jsx +29 -0
- package/src/components/atoms/RateSelector/rate-selector.module.scss +47 -0
- package/{stories/atoms/SupportChat/SupportChat.js → src/components/atoms/SupportChat/SupportChat.jsx} +4 -1
- package/src/components/atoms/Textarea/Textarea.jsx +146 -0
- package/src/components/atoms/Textarea/textarea.module.scss +71 -0
- package/src/components/atoms/TitleBox/TitleBox.jsx +141 -0
- package/src/components/atoms/TitleBox/title-box.module.scss +32 -0
- package/src/components/atoms/Tooltip/Tooltip.jsx +68 -0
- package/src/components/atoms/Tooltip/tooltip.module.scss +237 -0
- package/src/components/atoms/TwoLinesOfText/LinesOfText.jsx +74 -0
- package/src/components/atoms/TwoLinesOfText/lines-of-text.module.scss +65 -0
- package/src/components/atoms/Validation/Validation.jsx +41 -0
- package/src/components/atoms/Validation/validation.module.scss +15 -0
- package/{stories → src/components}/atoms/buttons/Button/Button.jsx +22 -48
- package/{stories → src/components}/atoms/buttons/Button/Button.module.scss +1 -1
- package/src/components/atoms/buttons/Close/Close.jsx +53 -0
- package/src/components/atoms/buttons/Close/close.module.scss +75 -0
- package/src/components/atoms/buttons/LinkButton/LinkButton.jsx +106 -0
- package/src/components/atoms/buttons/LinkButton/link-button.module.scss +49 -0
- package/src/components/atoms/buttons/RadioButtonWithText/RadioButtonWithText.jsx +110 -0
- package/src/components/atoms/buttons/RadioButtonWithText/radio-button-with-text.module.scss +86 -0
- package/src/components/hooks/useCallHandlingErrors.js +22 -0
- package/src/components/hooks/useReferredState.js +24 -0
- package/src/components/molecules/AmountInput/AmountInput.jsx +304 -0
- package/src/components/molecules/AmountInput/amount-input.module.scss +189 -0
- package/src/components/molecules/CoinPicker/CoinPicker.jsx +509 -0
- package/src/components/molecules/CoinPicker/coin-picker.module.scss +207 -0
- package/src/components/molecules/LineWithIconLink/LineWithIconLink.jsx +35 -0
- package/src/components/molecules/LineWithIconLink/line-with-icon-link.module.scss +25 -0
- package/src/components/molecules/TitledLineWithIconLink/TitledLineWithIconLink.jsx +30 -0
- package/src/components/organisms/CoinPickerDialogStep/CoinPickerDialogStep.jsx +64 -0
- package/src/components/organisms/Dialog/Dialog.jsx +465 -0
- package/src/components/organisms/Dialog/DialogButtons/DialogButtons.jsx +122 -0
- package/src/components/organisms/Dialog/DialogButtons/dialog-buttons.module.scss +25 -0
- package/src/components/organisms/Dialog/DialogStep/DialogStep.jsx +533 -0
- package/src/components/organisms/Dialog/DialogStep/dialog-step.module.scss +381 -0
- package/src/components/organisms/Dialog/dialog.module.scss +226 -0
- package/src/components/organisms/SwapForm/SwapForm.jsx +1105 -0
- package/src/components/organisms/SwapForm/swap-form.module.scss +134 -0
- package/src/components/templates/DeterminedErrorDialogStep/DeterminedErrorDialogStep.jsx +77 -0
- package/src/components/tests/utils/inputValueProviders/provideFormatOfFloatValueByInputString.test.js +132 -0
- package/src/components/tests/utils/urlQueryUtils/getQueryParameterValues.test.js +65 -0
- package/src/components/tests/utils/urlQueryUtils/saveQueryParameterAndValues.test.js +104 -0
- package/src/components/utils/inputValueProviders.js +50 -0
- package/src/components/utils/textUtils.js +18 -0
- package/src/components/utils/uiUtils.js +12 -0
- package/src/components/utils/urlQueryUtils.js +62 -0
- package/src/constants/atoms/Close/close.jsx +5 -0
- package/src/constants/atoms/LinkButton/linkButton.jsx +6 -0
- package/src/constants/atoms/Tooltip/tooltip.jsx +8 -0
- package/src/constants/globalConstants.jsx +3 -0
- package/src/constants/organisms/dialog/DialogStep/dialogStep.js +1 -0
- package/src/constants/organisms/dialog/dialog.js +29 -0
- package/src/index.js +88 -0
- package/src/robustExteranlApiCallerService/cacheAndConcurrentRequestsResolver.js +495 -0
- package/src/robustExteranlApiCallerService/cachedRobustExternalApiCallerService.js +147 -0
- package/src/robustExteranlApiCallerService/cancelProcessing.js +29 -0
- package/src/robustExteranlApiCallerService/concurrentCalculationsMetadataHolder.js +75 -0
- package/src/robustExteranlApiCallerService/externalApiProvider.js +156 -0
- package/src/robustExteranlApiCallerService/externalServicesStatsCollector.js +78 -0
- package/src/robustExteranlApiCallerService/robustExternalAPICallerService.js +304 -0
- package/src/robustExteranlApiCallerService/tests/robustExternalAPICallerService/robustExternalAPICallerService/callExternalAPI/_performCallAttempt.test.js +533 -0
- package/src/robustExteranlApiCallerService/tests/robustExternalAPICallerService/robustExternalAPICallerService/callExternalAPI/callExternalAPI.test.js +532 -0
- package/src/robustExteranlApiCallerService/tests/robustExternalAPICallerService/robustExternalAPICallerService/constructor.test.js +19 -0
- package/src/swaps-lib/external-apis/swapProvider.js +208 -0
- package/src/swaps-lib/external-apis/swapspaceSwapProvider.js +704 -0
- package/src/swaps-lib/models/baseSwapCreationInfo.js +43 -0
- package/src/swaps-lib/models/existingSwap.js +73 -0
- package/src/swaps-lib/models/existingSwapWithFiatData.js +128 -0
- package/src/swaps-lib/services/publicSwapService.js +601 -0
- package/src/swaps-lib/test/external-apis/swapspaceSwapProvider/_fetchSupportedCurrenciesIfNeeded.test.js +538 -0
- package/src/swaps-lib/test/external-apis/swapspaceSwapProvider/createSwap.test.js +1249 -0
- package/src/swaps-lib/test/external-apis/swapspaceSwapProvider/getAllSupportedCurrencies.test.js +66 -0
- package/src/swaps-lib/test/external-apis/swapspaceSwapProvider/getDepositCurrencies.test.js +76 -0
- package/src/swaps-lib/test/external-apis/swapspaceSwapProvider/getSwapInfo.test.js +1580 -0
- package/src/swaps-lib/test/external-apis/swapspaceSwapProvider/getWithdrawalCurrencies.test.js +105 -0
- package/src/swaps-lib/test/utils/swapUtils/safeHandleRequestsLimitExceeding.test.js +80 -0
- package/src/swaps-lib/utils/swapUtils.js +170 -0
- package/stories/stubs/exampleContent.jsx +20 -0
- package/styles/_placeholder.scss +1 -1
- package/styles/fonts/NunitoSans-Bold.ttf +0 -0
- package/styles/fonts/NunitoSans-ExtraBold.ttf +0 -0
- package/styles/fonts/NunitoSans-Light.ttf +0 -0
- package/styles/fonts/NunitoSans-Regular.ttf +0 -0
- package/styles/fonts/NunitoSans-SemiBold.ttf +0 -0
- package/styles/global-styles-index.scss +1 -1
- package/styles/index.scss +5 -3
- package/stories/atoms/AssetIcon/AssetIcon.js +0 -55
- package/stories/index.js +0 -4
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
import { improveAndRethrow } from "../errorUtils.js";
|
|
2
|
+
import { Logger } from "./logging/logger.js";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* TODO: [tests, critical] Ued by payments logic
|
|
6
|
+
*
|
|
7
|
+
* Simple cache based on Map.
|
|
8
|
+
* Provides ability to store event-dependent data.
|
|
9
|
+
*/
|
|
10
|
+
export class Cache {
|
|
11
|
+
/**
|
|
12
|
+
* @param [eventBus=null] {EventBus} EventBus.js lib instance if you plan to use Cache with events handling
|
|
13
|
+
* @param [noSessionEvents=[]] {string[]} array of events that will be treated as "no session", you should pass EventBus to make it work
|
|
14
|
+
*/
|
|
15
|
+
constructor(eventBus = null, noSessionEvents = []) {
|
|
16
|
+
this._cache = new Map();
|
|
17
|
+
this._eventDependentDataKeys = [];
|
|
18
|
+
this._noSessionEvents = noSessionEvents;
|
|
19
|
+
this._eventBus = eventBus;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
_setupIntervalClearingExpired() {
|
|
23
|
+
let cleaner = function () {
|
|
24
|
+
try {
|
|
25
|
+
for (const key of this._cache.keys()) {
|
|
26
|
+
const item = this._cache.get(key);
|
|
27
|
+
if (item && item.ttlMs && item.addedMsTimestamp + item.ttlMs < Date.now()) {
|
|
28
|
+
this._cache.delete(key);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
} catch (e) {
|
|
32
|
+
improveAndRethrow(e, "_intervalClearingExpiredCache");
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
cleaner = cleaner.bind(this);
|
|
37
|
+
|
|
38
|
+
setInterval(cleaner, 1000);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Puts data to cache
|
|
43
|
+
*
|
|
44
|
+
* @param key {string} string key for this data
|
|
45
|
+
* @param data {any} any data
|
|
46
|
+
* @param ttlMs {number|null} optional milliseconds number for cache lifetime
|
|
47
|
+
* @throws {Error} when the data is null/undefined because these values for data are reserved for internal logic
|
|
48
|
+
*/
|
|
49
|
+
put(key, data, ttlMs = null) {
|
|
50
|
+
try {
|
|
51
|
+
if (typeof key !== "string" || data == null) {
|
|
52
|
+
throw new Error(`Trying to cache corrupted data: ${key}, ${data}`);
|
|
53
|
+
}
|
|
54
|
+
this._cache.set(key, {
|
|
55
|
+
data: data,
|
|
56
|
+
addedMsTimestamp: Date.now(),
|
|
57
|
+
ttlMs: ttlMs,
|
|
58
|
+
});
|
|
59
|
+
} catch (e) {
|
|
60
|
+
improveAndRethrow(e, "cache.put");
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
putSessionDependentData(key, data, ttlMs = null) {
|
|
65
|
+
this._putEventDependentData(key, data, this._noSessionEvents, ttlMs);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Puts data to cache and adds its key to list of keys that should be related by each of given events.
|
|
70
|
+
*
|
|
71
|
+
* @param key {string} key for cache
|
|
72
|
+
* @param data {any} any caching data
|
|
73
|
+
* @param events {string[]} list of events forcing putting data to be removed when triggered
|
|
74
|
+
* @param ttlMs {|null} optional time to live for this cache item
|
|
75
|
+
* @throws {Error} when the data is null/undefined because these values for data are reserved for internal logic
|
|
76
|
+
*/
|
|
77
|
+
putEventDependentData(key, data, events, ttlMs = null) {
|
|
78
|
+
this._putEventDependentData(key, data, events, ttlMs);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
_putEventDependentData(key, data, events, ttlMs = null) {
|
|
82
|
+
try {
|
|
83
|
+
if (typeof key !== "string" || data == null) {
|
|
84
|
+
throw new Error(`Trying to cache corrupted data: ${key}, ${data}`);
|
|
85
|
+
}
|
|
86
|
+
this._cache.set(key, {
|
|
87
|
+
data: data,
|
|
88
|
+
addedMsTimestamp: Date.now(),
|
|
89
|
+
ttlMs: ttlMs,
|
|
90
|
+
});
|
|
91
|
+
for (let event of events) {
|
|
92
|
+
const eventAndKeys = this._eventDependentDataKeys.find(item => item[0] === event);
|
|
93
|
+
if (eventAndKeys) {
|
|
94
|
+
eventAndKeys.push(key);
|
|
95
|
+
} else if (this._eventBus) {
|
|
96
|
+
this._eventDependentDataKeys.push([event, key]);
|
|
97
|
+
this._eventBus.addEventListener(event, () => {
|
|
98
|
+
try {
|
|
99
|
+
const keys = this._eventDependentDataKeys.find(item => item[0] === event);
|
|
100
|
+
(keys ?? [event]).slice(1).forEach(key => this._cache.delete(key));
|
|
101
|
+
} catch (e) {
|
|
102
|
+
Logger.logError(e, "cache.removing-for-event", `Event: ${event}`);
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
} catch (e) {
|
|
108
|
+
improveAndRethrow(e, "cache.putEventDependentData");
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// TODO: [feature, low] add clearing of expired data by schedule
|
|
113
|
+
get(key) {
|
|
114
|
+
try {
|
|
115
|
+
const item = this._cache.get(key);
|
|
116
|
+
if (item) {
|
|
117
|
+
if (item.addedMsTimestamp && item.ttlMs !== null && item.addedMsTimestamp + item.ttlMs < Date.now()) {
|
|
118
|
+
this._cache.delete(key);
|
|
119
|
+
return null;
|
|
120
|
+
} else {
|
|
121
|
+
return item.data;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
return null;
|
|
126
|
+
} catch (e) {
|
|
127
|
+
improveAndRethrow(e, "cache.get");
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
getLastUpdateTimestamp(key) {
|
|
132
|
+
return this._cache.get(key)?.addedMsTimestamp ?? null;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Updates the timestamp of the last update for specified key to the provided value.
|
|
137
|
+
* Can be useful when TTL is controlled outside this class.
|
|
138
|
+
*
|
|
139
|
+
* @param key {string}
|
|
140
|
+
* @param timestamp {number}
|
|
141
|
+
* @return {boolean}
|
|
142
|
+
*/
|
|
143
|
+
setLastUpdateTimestamp(key, timestamp) {
|
|
144
|
+
try {
|
|
145
|
+
const item = this._cache.get(key);
|
|
146
|
+
if (item != null && typeof timestamp === "number") {
|
|
147
|
+
this._cache.set(key, { ...item, addedTimestampMs: timestamp });
|
|
148
|
+
return true;
|
|
149
|
+
}
|
|
150
|
+
return false;
|
|
151
|
+
} catch (e) {
|
|
152
|
+
improveAndRethrow("cache.setLastUpdateTimestamp");
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
invalidate(key) {
|
|
157
|
+
try {
|
|
158
|
+
this._cache.delete(key);
|
|
159
|
+
} catch (e) {
|
|
160
|
+
improveAndRethrow(e, "cache.invalidate");
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
invalidateContaining(keyPart) {
|
|
165
|
+
if (typeof keyPart !== "string" || keyPart === "") {
|
|
166
|
+
throw new Error("Trying to invalidate containing wrong key or empty key: " + keyPart);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
try {
|
|
170
|
+
const matchedKeys = Array.from(this._cache.keys()).filter(
|
|
171
|
+
key => typeof key === "string" && new RegExp(keyPart).test(key)
|
|
172
|
+
);
|
|
173
|
+
for (let i = 0; i < matchedKeys.length; ++i) {
|
|
174
|
+
this._cache.delete(matchedKeys[i]);
|
|
175
|
+
}
|
|
176
|
+
} catch (e) {
|
|
177
|
+
improveAndRethrow(e, "invalidateContaining");
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
clear() {
|
|
182
|
+
this._cache.clear();
|
|
183
|
+
this._sessionDependentDataKeys = [];
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* Saves given data string to persistent cache.
|
|
188
|
+
* NOTE: we have no TTL here, implement if needed.
|
|
189
|
+
*
|
|
190
|
+
* WARNING: use only when really needed and don't store big data as we use localStorage
|
|
191
|
+
* under the hood and its capacity is restricted.
|
|
192
|
+
*
|
|
193
|
+
* @param uniqueKey {string} the key should be unique
|
|
194
|
+
* @param data {string} only string data allowed
|
|
195
|
+
*/
|
|
196
|
+
putClientPersistentData(uniqueKey, data) {
|
|
197
|
+
try {
|
|
198
|
+
if (typeof window !== "undefined") {
|
|
199
|
+
localStorage.setItem(uniqueKey, data);
|
|
200
|
+
}
|
|
201
|
+
} catch (e) {
|
|
202
|
+
improveAndRethrow(e, "cache.putClientPersistentData");
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* @param uniqueKey {string}
|
|
208
|
+
* @return {string|null}
|
|
209
|
+
*/
|
|
210
|
+
getClientPersistentData(uniqueKey) {
|
|
211
|
+
try {
|
|
212
|
+
if (typeof window !== "undefined") {
|
|
213
|
+
return localStorage.getItem(uniqueKey);
|
|
214
|
+
}
|
|
215
|
+
return null;
|
|
216
|
+
} catch (e) {
|
|
217
|
+
improveAndRethrow(e, "cache.getClientPersistentData");
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/**
|
|
222
|
+
* Only makes effect if the TTL is not null.
|
|
223
|
+
*
|
|
224
|
+
* @param key {string}
|
|
225
|
+
* @param ttlMs {number|null}
|
|
226
|
+
*/
|
|
227
|
+
markCacheItemAsExpiredButDontRemove(key, ttlMs = null) {
|
|
228
|
+
try {
|
|
229
|
+
const item = this._cache.get(key);
|
|
230
|
+
const ttlFinalMs = ttlMs ?? item?.ttlMs;
|
|
231
|
+
if (item != null && ttlFinalMs) {
|
|
232
|
+
this._cache.set(key, {
|
|
233
|
+
data: item.data,
|
|
234
|
+
addedMsTimestamp: Date.now() - ttlFinalMs - 1,
|
|
235
|
+
ttlMs: ttlFinalMs,
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
} catch (e) {
|
|
239
|
+
improveAndRethrow(e, "cache.markCacheItemAsExpiredButDontRemove");
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import axios from "axios";
|
|
2
|
+
|
|
3
|
+
import { improveAndRethrow } from "../errorUtils.js";
|
|
4
|
+
|
|
5
|
+
export class EmailsApi {
|
|
6
|
+
static serverEndpointEntity = "emails";
|
|
7
|
+
|
|
8
|
+
static async sendEmail(subject, body) {
|
|
9
|
+
try {
|
|
10
|
+
const url = `${window.location.protocol + "//" + window.location.host}/api/v1/${this.serverEndpointEntity}`;
|
|
11
|
+
await axios.post(url, { subject, body });
|
|
12
|
+
} catch (e) {
|
|
13
|
+
improveAndRethrow(e, "sendEmail", subject + body);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { LogsStorage } from "./logsStorage.js";
|
|
2
|
+
import { safeStringify } from "../safeStringify.js";
|
|
3
|
+
|
|
4
|
+
export class Logger {
|
|
5
|
+
/**
|
|
6
|
+
* Logs to client logs storage.
|
|
7
|
+
*
|
|
8
|
+
* WARNING! this method should ce used carefully for critical logging as we have the restriction for storing logs
|
|
9
|
+
* on client side as we store them inside the local storage. Please see details inside storage.js
|
|
10
|
+
* @param logString {string} log string
|
|
11
|
+
* @param source {string} source of the log entry
|
|
12
|
+
*/
|
|
13
|
+
static log(logString, source) {
|
|
14
|
+
const timestamp = new Date().toISOString();
|
|
15
|
+
LogsStorage.saveLog(`${timestamp}|${source}:${logString}`);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
static logError(e, settingFunction, additionalMessage = "", onlyToConsole = false) {
|
|
19
|
+
let message = `\nFunction call ${settingFunction ?? ""} failed. Error message: ${
|
|
20
|
+
e?.message
|
|
21
|
+
}. ${additionalMessage} `;
|
|
22
|
+
message +=
|
|
23
|
+
`${e?.errorDescription ?? ""}${e?.howToFix ?? ""}` +
|
|
24
|
+
(e?.httpStatus === 403 ? "Authentication has expired or was lost. " : "");
|
|
25
|
+
|
|
26
|
+
if (e?.response) {
|
|
27
|
+
try {
|
|
28
|
+
const responseData = safeStringify({ response: e.response });
|
|
29
|
+
responseData && (message += `\n${responseData}. `);
|
|
30
|
+
} catch (e) {}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const finalErrorText = message + ". " + safeStringify(e);
|
|
34
|
+
// eslint-disable-next-line no-console
|
|
35
|
+
console.error(finalErrorText, e);
|
|
36
|
+
|
|
37
|
+
if (!onlyToConsole) {
|
|
38
|
+
this.log(finalErrorText, "logError");
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
export class LogsStorage {
|
|
2
|
+
static _inMemoryStorage = [];
|
|
3
|
+
static _logsStorageId = "clietnLogs_j203fj2D0n-d1";
|
|
4
|
+
|
|
5
|
+
static saveLog(log) {
|
|
6
|
+
this._inMemoryStorage.push(log);
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
static getInMemoryLogs() {
|
|
10
|
+
return this._inMemoryStorage;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
static getAllLogs() {
|
|
14
|
+
let storedLogs = "";
|
|
15
|
+
if (typeof window !== "undefined") {
|
|
16
|
+
storedLogs = localStorage.getItem(this._logsStorageId);
|
|
17
|
+
}
|
|
18
|
+
return `${storedLogs}\n${this._inMemoryStorage.join("\n")}`;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* @param logger {Logger}
|
|
23
|
+
*/
|
|
24
|
+
static saveToTheDisk(logger) {
|
|
25
|
+
try {
|
|
26
|
+
const MAX_LOCAL_STORAGE_VOLUME_BYTES = 5 * 1024 * 1024;
|
|
27
|
+
const MAX_LOGS_STORAGE_BYTES = MAX_LOCAL_STORAGE_VOLUME_BYTES * 0.65;
|
|
28
|
+
if (typeof window !== "undefined") {
|
|
29
|
+
const existingLogs = localStorage.getItem(this._logsStorageId);
|
|
30
|
+
const logsString = `${existingLogs}\n${this._inMemoryStorage.join("\n")}`;
|
|
31
|
+
const lettersCountToRemove = logsString.length - Math.round(MAX_LOGS_STORAGE_BYTES / 2);
|
|
32
|
+
if (lettersCountToRemove > 0) {
|
|
33
|
+
localStorage.setItem(
|
|
34
|
+
this._logsStorageId,
|
|
35
|
+
logsString.slice(lettersCountToRemove, logsString.length)
|
|
36
|
+
);
|
|
37
|
+
} else {
|
|
38
|
+
localStorage.setItem(this._logsStorageId, logsString);
|
|
39
|
+
}
|
|
40
|
+
this._inMemoryStorage = [];
|
|
41
|
+
}
|
|
42
|
+
} catch (e) {
|
|
43
|
+
logger?.logError(e, "saveToTheDisk", "Failed to save logs to disk");
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
static removeAllClientLogs() {
|
|
48
|
+
if (typeof window !== "undefined") {
|
|
49
|
+
if (localStorage.getItem("doNotRemoveClientLogsWhenSignedOut") !== "true") {
|
|
50
|
+
localStorage.removeItem(this._logsStorageId);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
this._inMemoryStorage = [];
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
static setDoNotRemoveClientLogsWhenSignedOut(value) {
|
|
57
|
+
if (typeof window !== "undefined") {
|
|
58
|
+
localStorage.setItem("doNotRemoveClientLogsWhenSignedOut", value);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stringify given object by use of JSON.stringify but handles circular structures and "response", "request" properties
|
|
3
|
+
* to avoid stringing redundant data when printing errors containing request/response objects.
|
|
4
|
+
*
|
|
5
|
+
* @param object - object to be stringed
|
|
6
|
+
* @param indent - custom indentation
|
|
7
|
+
* @return {string} - stringed object
|
|
8
|
+
*/
|
|
9
|
+
export function safeStringify(object, indent = 2) {
|
|
10
|
+
let cache = [];
|
|
11
|
+
if (
|
|
12
|
+
typeof object === "string" ||
|
|
13
|
+
typeof object === "function" ||
|
|
14
|
+
typeof object === "number" ||
|
|
15
|
+
typeof object === "undefined" ||
|
|
16
|
+
typeof object === "boolean"
|
|
17
|
+
) {
|
|
18
|
+
return String(object);
|
|
19
|
+
}
|
|
20
|
+
const retVal = JSON.stringify(
|
|
21
|
+
object,
|
|
22
|
+
(key, value) => {
|
|
23
|
+
if (key.toLowerCase().includes("request")) {
|
|
24
|
+
return JSON.stringify({
|
|
25
|
+
body: value?.body,
|
|
26
|
+
query: value?.query,
|
|
27
|
+
headers: value?.headers,
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
if (key.toLowerCase().includes("response")) {
|
|
32
|
+
return JSON.stringify({
|
|
33
|
+
statusText: value?.statusText,
|
|
34
|
+
status: value?.status,
|
|
35
|
+
data: value?.data,
|
|
36
|
+
headers: value?.headers,
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
return typeof value === "object" && value !== null
|
|
41
|
+
? cache.includes(value)
|
|
42
|
+
? "duplicated reference" // Duplicated references were found, discarding this key
|
|
43
|
+
: cache.push(value) && value // Store value in our collection
|
|
44
|
+
: value;
|
|
45
|
+
},
|
|
46
|
+
indent
|
|
47
|
+
);
|
|
48
|
+
cache = null;
|
|
49
|
+
return retVal;
|
|
50
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import PropTypes from "prop-types";
|
|
3
|
+
|
|
4
|
+
import s from "./asset-icon.module.scss";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* AssetIcon component to display an icon for an asset.
|
|
8
|
+
*
|
|
9
|
+
* @component
|
|
10
|
+
* @param {string} assetIconSrc - The source URL for the asset icon.
|
|
11
|
+
* @param {string} [assetIconProtocolSrc=null] - The source URL for the asset icon that is base for this asset (e.g. ETH for USDT ERC20).
|
|
12
|
+
* @param {string} [fallbackSrc=null] - The fallback source URL in case the main source fails to load.
|
|
13
|
+
* @param {boolean} [small=false] - Whether to display a smaller version of the icon.
|
|
14
|
+
*/
|
|
15
|
+
export const AssetIcon = ({ assetIconSrc, assetIconProtocolSrc = null, fallbackSrc = null, small = false }) => {
|
|
16
|
+
const handleFailedLoad = e => {
|
|
17
|
+
e.target.onerror = null;
|
|
18
|
+
e.target.src = fallbackSrc;
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
return (
|
|
22
|
+
<div className={s["asset-icon"] + (small ? " " + s["small"] : "")}>
|
|
23
|
+
<img
|
|
24
|
+
src={assetIconSrc}
|
|
25
|
+
className={s["asset-icon-primary"] + (small ? " " + s["small"] : "")}
|
|
26
|
+
alt={" "}
|
|
27
|
+
onError={handleFailedLoad}
|
|
28
|
+
/>
|
|
29
|
+
{assetIconProtocolSrc ? (
|
|
30
|
+
<img
|
|
31
|
+
src={assetIconProtocolSrc}
|
|
32
|
+
className={s["asset-icon-secondary"] + (small ? " " + s["small"] : "")}
|
|
33
|
+
alt={" "}
|
|
34
|
+
onError={handleFailedLoad}
|
|
35
|
+
/>
|
|
36
|
+
) : (
|
|
37
|
+
""
|
|
38
|
+
)}
|
|
39
|
+
</div>
|
|
40
|
+
);
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
AssetIcon.propTypes = {
|
|
44
|
+
assetIconSrc: PropTypes.string.isRequired,
|
|
45
|
+
assetIconProtocolSrc: PropTypes.string,
|
|
46
|
+
fallbackSrc: PropTypes.string,
|
|
47
|
+
small: PropTypes.bool,
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
AssetIcon.defaultProps = {
|
|
51
|
+
assetIconProtocolSrc: null,
|
|
52
|
+
fallbackSrc: null,
|
|
53
|
+
small: false,
|
|
54
|
+
};
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import PropTypes from "prop-types";
|
|
3
|
+
|
|
4
|
+
import s from "./asset-selection.module.scss";
|
|
5
|
+
import ArrowIcon from "../../../assets/wrappedImages/arrowIcon.jsx";
|
|
6
|
+
|
|
7
|
+
import { AssetIcon } from "../AssetIcon/AssetIcon.jsx";
|
|
8
|
+
|
|
9
|
+
import { useCallHandlingErrors } from "../../hooks/useCallHandlingErrors.js";
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Component-button for triggering selecting an asset.
|
|
13
|
+
*
|
|
14
|
+
* @component
|
|
15
|
+
* @param {Function} handleClick - The function to call when the component is clicked
|
|
16
|
+
* @param {boolean} disabled - If true, disables click functionality
|
|
17
|
+
* @param {string} assetIconSrc - The source URL for the asset icon
|
|
18
|
+
* @param {string} [protocolName] - The name of the protocol, if any
|
|
19
|
+
* @param {string} [assetIconProtocolSrc] - The source URL for the asset protocol icon
|
|
20
|
+
* @param {string} [fallbackSrc] - The fallback source URL if the main asset icon fails to load
|
|
21
|
+
*/
|
|
22
|
+
export const AssetSelection = ({
|
|
23
|
+
handleClick = () => {},
|
|
24
|
+
disabled = false,
|
|
25
|
+
assetIconSrc,
|
|
26
|
+
protocolName,
|
|
27
|
+
assetIconProtocolSrc = null,
|
|
28
|
+
fallbackSrc,
|
|
29
|
+
}) => {
|
|
30
|
+
const handleError = useCallHandlingErrors();
|
|
31
|
+
|
|
32
|
+
return (
|
|
33
|
+
<div
|
|
34
|
+
className={s["asset-selection"] + " " + (disabled ? s["disabled"] : "")}
|
|
35
|
+
onClick={disabled ? () => {} : e => handleError(handleClick, e)}
|
|
36
|
+
>
|
|
37
|
+
<div className={s["asset-selection-icon-wrapper"]}>
|
|
38
|
+
<AssetIcon
|
|
39
|
+
small
|
|
40
|
+
assetIconSrc={assetIconSrc}
|
|
41
|
+
assetIconProtocolSrc={assetIconProtocolSrc}
|
|
42
|
+
fallbackSrc={fallbackSrc}
|
|
43
|
+
/>
|
|
44
|
+
</div>
|
|
45
|
+
{protocolName ? <div className={s["asset-selection-protocol-wrapper"]}>{protocolName}</div> : ""}
|
|
46
|
+
<div className={s["arrow"]}>
|
|
47
|
+
<ArrowIcon />
|
|
48
|
+
</div>
|
|
49
|
+
{/*<img src={arrowIcon} className="arrow" alt=""></img>*/}
|
|
50
|
+
</div>
|
|
51
|
+
);
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
AssetSelection.propTypes = {
|
|
55
|
+
handleClick: PropTypes.func,
|
|
56
|
+
disabled: PropTypes.bool,
|
|
57
|
+
assetIconSrc: PropTypes.string.isRequired,
|
|
58
|
+
protocolName: PropTypes.string,
|
|
59
|
+
assetIconProtocolSrc: PropTypes.string,
|
|
60
|
+
fallbackSrc: PropTypes.string,
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
AssetSelection.defaultProps = {
|
|
64
|
+
handleClick: () => {},
|
|
65
|
+
disabled: false,
|
|
66
|
+
assetIconProtocolSrc: null,
|
|
67
|
+
};
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
@import "../../../../styles/index";
|
|
2
|
+
|
|
3
|
+
.asset-selection {
|
|
4
|
+
display: flex;
|
|
5
|
+
align-items: center;
|
|
6
|
+
background-color: $white;
|
|
7
|
+
border-radius: 100px;
|
|
8
|
+
user-select: none;
|
|
9
|
+
box-shadow: $shadowOutlineStatic;
|
|
10
|
+
transition: all 0.2s ease;
|
|
11
|
+
cursor: pointer;
|
|
12
|
+
|
|
13
|
+
@media (hover: hover) {
|
|
14
|
+
&:hover:not(.disabled) {
|
|
15
|
+
box-shadow: $shadowOutlineHover;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
&.disabled {
|
|
20
|
+
opacity: 0.5;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
&:active:not(.disabled),
|
|
24
|
+
&.active:not(.disabled) {
|
|
25
|
+
box-shadow: $shadowOutlineActive;
|
|
26
|
+
transition: all 0.03s ease;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
&-protocol-wrapper {
|
|
30
|
+
background-color: LightColor("tosca-20");
|
|
31
|
+
color: SolidColor("tosca");
|
|
32
|
+
padding: 2px 5px;
|
|
33
|
+
font-size: 8px;
|
|
34
|
+
border-radius: 50px;
|
|
35
|
+
font-weight: $bold;
|
|
36
|
+
margin-right: 3px;
|
|
37
|
+
text-wrap: nowrap;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
&-icon-wrapper {
|
|
41
|
+
padding: 10px 5px 10px 10px;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
h6 {
|
|
45
|
+
color: SolidColor("dark");
|
|
46
|
+
font-weight: $semi-bold;
|
|
47
|
+
|
|
48
|
+
margin: 1px 7px 0 2px;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
.arrow {
|
|
52
|
+
margin: 10px 10px 10px 0;
|
|
53
|
+
transform: rotate(-90deg);
|
|
54
|
+
height: 14px;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import PropTypes from "prop-types";
|
|
3
|
+
|
|
4
|
+
import s from "./background-title.module.scss";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Component for displaying a title with a fancy background text, which
|
|
8
|
+
* is semi-visible. This component is designed to work with forms that
|
|
9
|
+
* have a white background, and it allows for a configuration of margins.
|
|
10
|
+
*
|
|
11
|
+
* @param {Object} props - Component props
|
|
12
|
+
* @param {string} props.text - Text to be displayed as the title
|
|
13
|
+
* @param {boolean} [props.smallMargins=false] - Whether to use smaller margins around the title
|
|
14
|
+
*/
|
|
15
|
+
export const BackgroundTitle = ({ text, smallMargins = false }) => {
|
|
16
|
+
return (
|
|
17
|
+
<div className={s["background-title"]}>
|
|
18
|
+
<div className={s["background-title-wrapper"] + (smallMargins ? " " + s["small-margins"] : "")}>
|
|
19
|
+
<div className={s["background-title-wrapper-text"] + (smallMargins ? " " + s["small-margins"] : "")}>
|
|
20
|
+
{text}
|
|
21
|
+
</div>
|
|
22
|
+
</div>
|
|
23
|
+
</div>
|
|
24
|
+
);
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
BackgroundTitle.propTypes = {
|
|
28
|
+
text: PropTypes.string.isRequired,
|
|
29
|
+
smallMargins: PropTypes.bool,
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
BackgroundTitle.defaultProps = {
|
|
33
|
+
smallMargins: false,
|
|
34
|
+
};
|