{"version":3,"file":"index_z5beb5.js","sources":["../src/lib/utils.ts","../src/setup-sentry.tsx","../src/lib/queryClient.ts","../src/shared/icons/outline/ArrowCross.tsx","../src/shared/icons/outline/ArrowDown.tsx","../src/shared/icons/outline/ArrowLeftRight.tsx","../src/shared/icons/outline/ArrowLeft.tsx","../src/shared/icons/outline/ArrowRight.tsx","../src/shared/icons/outline/ArrowTrendUp.tsx","../src/shared/icons/outline/ArrowUp.tsx","../src/shared/icons/outline/Bag.tsx","../src/shared/icons/outline/Bank.tsx","../src/shared/icons/outline/Book.tsx","../src/shared/icons/outline/Building.tsx","../src/shared/icons/outline/BusFront.tsx","../src/shared/icons/outline/Calculator.tsx","../src/shared/icons/outline/Calendar.tsx","../src/shared/icons/outline/Cart.tsx","../src/shared/icons/outline/ChartMixed.tsx","../src/shared/icons/outline/ChartTrendUp.tsx","../src/shared/icons/outline/CheckCircle.tsx","../src/shared/icons/outline/Check.tsx","../src/shared/icons/outline/Checkmark.tsx","../src/shared/icons/outline/ChevronDown.tsx","../src/shared/icons/outline/ChevronLeft.tsx","../src/shared/icons/outline/ChevronRight.tsx","../src/shared/icons/outline/ChevronUp.tsx","../src/shared/icons/outline/CircleCancel.tsx","../src/shared/icons/outline/Circle.tsx","../src/shared/icons/outline/Clock.tsx","../src/shared/icons/outline/CloudDownload.tsx","../src/shared/icons/outline/Coin.tsx","../src/shared/icons/outline/CompressArrows.tsx","../src/shared/icons/outline/Copy.tsx","../src/shared/icons/outline/CreditCard.tsx","../src/shared/icons/outline/Document.tsx","../src/shared/icons/outline/DolarappWhite.tsx","../src/shared/icons/outline/Dolarapp.tsx","../src/shared/icons/outline/DoubleRight.tsx","../src/shared/icons/outline/DoubleTick.tsx","../src/shared/icons/outline/DownloadFile.tsx","../src/shared/icons/outline/Download.tsx","../src/shared/icons/outline/Earth.tsx","../src/shared/icons/outline/EllipsisVertical.tsx","../src/shared/icons/outline/EnvelopeOpen.tsx","../src/shared/icons/outline/Envelope.tsx","../src/shared/icons/outline/Exchange.tsx","../src/shared/icons/outline/EyeOff.tsx","../src/shared/icons/outline/Eye.tsx","../src/shared/icons/outline/FileUser.tsx","../src/shared/icons/outline/Gear.tsx","../src/shared/icons/outline/Gears.tsx","../src/shared/icons/outline/Headset.tsx","../src/shared/icons/outline/Home.tsx","../src/shared/icons/outline/IdCard.tsx","../src/shared/icons/outline/InfoCircle.tsx","../src/shared/icons/outline/InfoTriangle.tsx","../src/shared/icons/outline/Invoice.tsx","../src/shared/icons/outline/LightbulbOn.tsx","../src/shared/icons/outline/Lightning.tsx","../src/shared/icons/outline/Link.tsx","../src/shared/icons/outline/Logout.tsx","../src/shared/icons/outline/MapMark.tsx","../src/shared/icons/outline/MedicalKit.tsx","../src/shared/icons/outline/Mobile.tsx","../src/shared/icons/outline/MoneyBag.tsx","../src/shared/icons/outline/Navigation.tsx","../src/shared/icons/outline/Notes.tsx","../src/shared/icons/outline/Pause.tsx","../src/shared/icons/outline/Payment.tsx","../src/shared/icons/outline/PencilEdit.tsx","../src/shared/icons/outline/Pencil.tsx","../src/shared/icons/outline/Person.tsx","../src/shared/icons/outline/PhonePad.tsx","../src/shared/icons/outline/Play.tsx","../src/shared/icons/outline/Playlist.tsx","../src/shared/icons/outline/Plus.tsx","../src/shared/icons/outline/Receipt.tsx","../src/shared/icons/outline/Reload.tsx","../src/shared/icons/outline/Scan.tsx","../src/shared/icons/outline/Search.tsx","../src/shared/icons/outline/Setting.tsx","../src/shared/icons/outline/SettingsAdjust.tsx","../src/shared/icons/outline/Snow.tsx","../src/shared/icons/outline/Soda.tsx","../src/shared/icons/outline/SortBy.tsx","../src/shared/icons/outline/SortDown.tsx","../src/shared/icons/outline/SortUpDown.tsx","../src/shared/icons/outline/SortUp.tsx","../src/shared/icons/outline/SquareCheck.tsx","../src/shared/icons/outline/Statements.tsx","../src/shared/icons/outline/ThreeDots.tsx","../src/shared/icons/outline/Transactions.tsx","../src/shared/icons/outline/Trash.tsx","../src/shared/icons/outline/Tv.tsx","../src/shared/icons/outline/Unlink.tsx","../src/shared/icons/outline/UserCross.tsx","../src/shared/icons/outline/User.tsx","../src/shared/icons/outline/Users.tsx","../src/shared/icons/outline/X.tsx","../src/shared/ui/Accordion.tsx","../src/shared/ui/animations.ts","../src/lib/typography.ts","../src/shared/ui/Typography.tsx","../src/shared/ui/Avatar.tsx","../src/shared/ui/Badge.tsx","../src/shared/ui/Breadcrumb.tsx","../src/shared/ui/buttonVariants.ts","../src/shared/ui/Spinner.tsx","../src/shared/ui/Button.tsx","../src/constants/keys.ts","../src/constants/locales.ts","../src/lib/localization.ts","../src/lib/date.ts","../src/providers/LocaleProvider/LocaleContext.tsx","../src/providers/LocaleProvider/LocaleProvider.tsx","../src/providers/LocaleProvider/useLocale.ts","../src/shared/ui/Calendar.tsx","../src/shared/ui/Card.tsx","../src/shared/ui/Checkbox.tsx","../src/shared/ui/Command.tsx","../src/constants/breakpoints.ts","../src/hooks/useMediaQuery.ts","../src/assets/images/flags/mx.png?url","../src/assets/images/flags/us.png?url","../src/assets/images/cards/business-cards.webp?url","../src/assets/images/cards/card-back.webp?url","../src/assets/images/cards/card-chip.webp?url","../src/assets/images/cards/card-front.webp?url","../src/assets/images/cards/card-physical-frozen.webp?url","../src/assets/images/cards/card-physical.webp?url","../src/assets/images/cards/card-virtual-frozen.webp?url","../src/assets/images/cards/card-virtual.webp?url","../src/assets/images/cards/empty-card-transactions.webp?url","../src/assets/images/cards/empty-cards.webp?url","../src/assets/images/cards/frozen-card.webp?url","../src/assets/images/cards/physical.webp?url","../src/assets/images/cards/terminated-card.webp?url","../src/assets/images/cards/virtual.webp?url","../src/assets/images/contractor/mobile-app-screenshot.webp?url","../src/assets/images/contractors/bell.webp?url","../src/assets/images/contractors/empty-contractors.webp?url","../src/assets/images/contractors/empty-payments.webp?url","../src/assets/images/contractors/todo-list.webp?url","../src/assets/images/recipients/empty-recipients.webp?url","../src/assets/images/shared/2fa.webp?url","../src/assets/images/shared/app-store-badge.webp?url","../src/assets/images/shared/apple-pay-card.webp?url","../src/assets/images/shared/application.webp?url","../src/assets/images/shared/cards.webp?url","../src/assets/images/shared/dolarapp-logo-black.webp?url","../src/assets/images/shared/email-2fa.webp?url","../src/assets/images/shared/empty-card.webp?url","../src/assets/images/shared/empty-search.webp?url","../src/assets/images/shared/google-play-badge.webp?url","../src/assets/images/shared/magnifier.webp?url","../src/assets/images/shared/transactions.webp?url","../src/assets/images/tasks/empty-tasks.webp?url","../src/assets/images/transactions/empty-transactions.webp?url","../src/types/country.ts","../src/constants/currency.ts","../src/constants/countries.ts","../src/lib/images.ts","../src/shared/ui/TableLoader.tsx","../src/shared/ui/DataTable.tsx","../src/shared/ui/DataTableColumnHeader.tsx","../src/shared/ui/DateInput.tsx","../src/shared/ui/DatePickerInput.tsx","../src/hooks/useCopyToClipboard.ts","../src/shared/ui/Skeleton.tsx","../src/shared/ui/Details.tsx","../src/shared/ui/Dialog.tsx","../src/shared/ui/DropdownMenu.tsx","../src/domains/Business/types/business.ts","../src/domains/Business/types/features.ts","../src/domains/Business/types/limits.ts","../src/domains/Business/types/permissions.ts","../src/domains/Business/types/roles.ts","../src/constants/messages.ts","../src/shared/ui/Form.tsx","../src/shared/ui/FullScreen.tsx","../src/shared/ui/inputVariants.ts","../src/shared/ui/Input.tsx","../src/shared/ui/Label.tsx","../src/shared/ui/MoneyInput.tsx","../src/shared/ui/MotionDiv.tsx","../src/shared/ui/MotionSpan.tsx","../src/shared/ui/PhoneNumberInput.tsx","../src/shared/ui/Popover.tsx","../src/shared/ui/Progress.tsx","../src/shared/ui/RadioGroup.tsx","../src/shared/ui/ScrollArea.tsx","../src/shared/icons/solid/Bag.tsx","../src/shared/icons/solid/Bank.tsx","../src/shared/icons/solid/Building.tsx","../src/shared/icons/solid/BulkArrows.tsx","../src/shared/icons/solid/Calendar.tsx","../src/shared/icons/solid/Card.tsx","../src/shared/icons/solid/Cloud.tsx","../src/shared/icons/solid/Desktop.tsx","../src/shared/icons/solid/Document.tsx","../src/shared/icons/solid/DownloadFile.tsx","../src/shared/icons/solid/Download.tsx","../src/shared/icons/solid/Ellipsis.tsx","../src/shared/icons/solid/FileUser.tsx","../src/shared/icons/solid/Filter.tsx","../src/shared/icons/solid/Globe.tsx","../src/shared/icons/solid/Headset.tsx","../src/shared/icons/solid/Home.tsx","../src/shared/icons/solid/IdCard.tsx","../src/shared/icons/solid/InfoCircle.tsx","../src/shared/icons/solid/Invoice.tsx","../src/shared/icons/solid/Location.tsx","../src/shared/icons/solid/Lock.tsx","../src/shared/icons/solid/Logout.tsx","../src/shared/icons/solid/Navigation.tsx","../src/shared/icons/solid/PaperPlain.tsx","../src/shared/icons/solid/Settings.tsx","../src/shared/icons/solid/SquareCheck.tsx","../src/shared/icons/solid/Upload.tsx","../src/shared/icons/solid/User.tsx","../src/shared/icons/solid/Users.tsx","../src/shared/icons/solid/X.tsx","../src/shared/ui/SearchInput.tsx","../src/shared/ui/Select.tsx","../src/shared/ui/Sheet.tsx","../src/shared/ui/SlideInLeft.tsx","../src/shared/ui/SlideInScreen.tsx","../src/shared/ui/StickyContainer.tsx","../src/shared/ui/Switch.tsx","../src/shared/ui/Table.tsx","../src/shared/ui/Tabs.tsx","../src/shared/ui/Textarea.tsx","../src/shared/ui/Toaster.tsx","../src/shared/ui/Tooltip.tsx","../src/constants/paths.ts","../src/hooks/useDebounce.ts","../src/lib/country.ts","../src/lib/address.ts","../src/shared/components/AddressAutocompleteField.tsx","../src/lib/money.ts","../src/shared/components/CurrencyFlag.tsx","../src/shared/components/AmountInput.tsx","../src/shared/components/BankName.tsx","../src/constants/queryKeys.ts","../src/constants/urls.ts","../src/domains/Contractor/api/activatePaymentMethod.ts","../src/domains/Contractor/api/getContactorBank.ts","../src/domains/Contractor/api/getContractor2FAMethod.ts","../src/domains/Contractor/api/getContractor2FASetupInfo.ts","../src/domains/Contractor/api/getContractorCompany.ts","../src/domains/Contractor/api/getContractorDetails.ts","../src/domains/Contractor/api/getContractorPaymentMethods.ts","../src/domains/Contractor/api/getContractorTransactions.ts","../src/domains/Contractor/api/getCurrentContractor.ts","../src/lib/fingerprint.ts","../src/domains/Contractor/api/refreshContractorToken.ts","../src/domains/Contractor/api/setupContractor2FA.ts","../src/domains/Contractor/api/unlinkPaymentMethod.ts","../src/lib/api.ts","../src/domains/Business/api/downloadInvoice.ts","../src/domains/Business/api/get2FASetupInfo.ts","../src/domains/Business/api/getBankByReference.ts","../src/domains/Business/api/getBusinessIdentity.ts","../src/domains/Business/api/getBusinessPaymentLimits.ts","../src/domains/Business/api/getBusinessUser.ts","../src/domains/Business/api/getCountryCodes.ts","../src/domains/Business/api/getCurrent2FAMethod.ts","../src/domains/Business/api/getFeatures.ts","../src/domains/Business/api/getFXRates.ts","../src/domains/Business/api/getIdentity.ts","../src/domains/Business/api/getPriceChartRates.ts","../src/domains/Business/api/getRatesWithFees.ts","../src/domains/Business/api/refreshToken.ts","../src/domains/Business/api/setup2FAAuthenticator.ts","../src/domains/Business/api/mocks/businessUser.mock.ts","../src/domains/Business/api/mocks/countryCodes.mocks.ts","../src/domains/Business/api/mocks/identity.mocks.ts","../src/domains/Business/api/mocks/paymentLimits.mocks.ts","../src/types/recharts.ts","../src/domains/Business/api/mocks/priceRates.mocks.ts","../src/domains/Business/api/mocks/index.ts","../src/hooks/useCountryCodes.ts","../src/shared/components/CountryCodeField.tsx","../src/shared/components/CountryCombobox.tsx","../src/shared/components/OptionalTag.tsx","../src/shared/components/Widget.tsx","../src/shared/components/CardAddressFields.tsx","../src/shared/components/CodeInput.tsx","../src/shared/components/codeValidation.ts","../src/shared/components/CountryName.tsx","../src/shared/components/CountryWithFlag.tsx","../src/shared/components/DeleteDialog.tsx","../src/shared/components/DragAndDropContainer.tsx","../src/shared/components/EmptyCard.tsx","../src/shared/components/EmptyChart.tsx","../src/shared/components/EmptyContractorPayments.tsx","../src/shared/components/EyeOnOffButton.tsx","../src/shared/components/FreeLabel.tsx","../src/shared/components/GoBackButton.tsx","../src/shared/components/InputLikeCard.tsx","../src/shared/components/LanguageSelector.tsx","../src/shared/components/Loader.tsx","../src/shared/components/Logo.tsx","../src/shared/components/LogoIcon.tsx","../src/lib/validations.ts","../src/shared/components/PasswordRules.tsx","../src/hooks/useKeyPress.ts","../src/shared/components/ProgressButton.tsx","../src/shared/components/SlideInSpan.tsx","../src/shared/components/StateSelectOrInput.tsx","../src/shared/components/StatusBadge.tsx","../src/shared/components/SwitchLanguageTooltip.tsx","../src/shared/components/TwoFactorRequiredDialog.tsx","../src/shared/components/UploadedFile.tsx","../src/domains/Business/features/Accounts/api/createAccount.ts","../src/domains/Business/features/Accounts/api/deleteAccount.ts","../src/domains/Business/features/Accounts/api/downloadAccountStatements.ts","../src/domains/Business/features/Accounts/api/editWallet.ts","../src/domains/Business/features/Accounts/api/getAccount.ts","../src/domains/Business/features/Accounts/api/getAccountDetails.ts","../src/domains/Business/features/Accounts/api/getAccountPDF.ts","../src/domains/Business/hooks/useBusinessRole.ts","../src/domains/Business/hooks/useBusinessUser.ts","../src/domains/Business/features/Team/api/blockTeamMember.ts","../src/domains/Business/features/Team/api/deleteTeamMember.ts","../src/domains/Business/features/Team/api/editTeamMemberDetails.ts","../src/domains/Business/features/Team/api/getPaymentLimit.ts","../src/domains/Business/features/Team/api/getTeamMember.ts","../src/domains/Business/features/Team/api/getTeamMemberPaymentLimit.ts","../src/domains/Business/features/Team/api/getTeamMembers.ts","../src/domains/Business/features/Team/api/inviteBusinessUser.ts","../src/domains/Business/features/Team/api/sendTeamMemberInviteReminder.ts","../src/domains/Business/features/Team/api/unblockTeamMember.ts","../src/domains/Business/features/Team/types/index.ts","../src/domains/Business/features/Team/api/mocks/teamMembers.mock.ts","../src/domains/Business/features/Team/api/mocks/index.ts","../src/domains/Business/hooks/useCheckUserPaymentLimit.ts","../src/domains/Business/hooks/useFeatures.ts","../src/domains/Business/hooks/useGetBankName.ts","../src/domains/Business/api/logout.ts","../src/hooks/useErrorToast.ts","../src/providers/AuthProvider/AuthContext.tsx","../src/providers/AuthProvider/useAuth.tsx","../src/providers/AuthProvider/AuthProvider.tsx","../src/hooks/useReset.ts","../src/domains/Business/hooks/useLogout.ts","../src/domains/Business/hooks/usePermissions.ts","../src/domains/Business/features/Transactions/types/index.ts","../src/hooks/useSearchParamsValue.ts","../src/hooks/useSidebar.ts","../src/domains/Business/hooks/useTransactionUtils.ts","../src/domains/Business/features/Accounts/types/index.ts","../src/domains/Business/hooks/useWallets.ts","../src/domains/Business/components/AccountBalance.tsx","../src/domains/Business/components/AccountIcon.tsx","../src/domains/Business/components/WalletItem.tsx","../src/domains/Business/components/AccountSelect.tsx","../src/store.ts","../src/types/auth.ts","../src/domains/Business/components/Auth2FADialog/AuthenticatorDialog.tsx","../src/domains/Business/features/Auth/api/acceptInvitation.ts","../src/domains/Business/features/Auth/api/authenticate.ts","../src/domains/Business/features/Auth/api/createPassword.ts","../src/domains/Business/features/Auth/api/recoverPassword.ts","../src/domains/Business/features/Auth/api/getCompanyTypes.ts","../src/domains/Business/features/Auth/api/signIn.ts","../src/domains/Business/features/Auth/api/signUp.ts","../src/domains/Business/features/Auth/api/updatePassword.ts","../src/domains/Business/features/Auth/api/mocks/index.ts","../src/domains/Business/components/Auth2FADialog/ResendCode.tsx","../src/domains/Business/components/Auth2FADialog/EmailDialog.tsx","../src/domains/Business/components/Auth2FADialog/MethodDialog.tsx","../src/domains/Business/components/Auth2FADialog/ResetAppDialog.tsx","../src/domains/Business/components/Auth2FADialog/Auth2FADialog.tsx","../src/domains/Business/components/LimitTypeSelect.tsx","../src/domains/Business/components/WithPermissions.tsx","../src/domains/Business/components/UserSelect.tsx","../src/domains/Business/components/CardFields.tsx","../src/lib/card.ts","../src/domains/Business/features/Cards/types/index.ts","../src/domains/Business/components/CardsTable/CardCell.tsx","../src/domains/Business/components/CardsTable/CardholderCell.tsx","../src/domains/Business/components/CardsTable/CardLimitCell.tsx","../src/domains/Business/components/CardsTable/CardStateCell.tsx","../src/domains/Business/components/CardsTable/CardWalletCell.tsx","../src/domains/Business/components/CardsTable/useCardsColumns.tsx","../src/domains/Business/components/CardsTable/useTeamCardsColumns.tsx","../src/domains/Business/features/Cards/constants/index.ts","../src/domains/Business/constants/cardTypes.ts","../src/domains/Business/constants/google.ts","../src/domains/Business/constants/payments.ts","../src/domains/Business/features/Recipients/types/index.ts","../src/domains/Business/constants/recipients.ts","../src/domains/Business/constants/payment-rails.ts","../src/domains/Business/features/Transactions/constants/index.ts","../src/domains/Business/features/Transactions/utils/index.ts","../src/domains/Business/components/CardTransactionIcon.tsx","../src/domains/Business/components/CountryBankDetails/CountryFields.tsx","../src/domains/Business/components/CountryBankDetails/BankDetails.tsx","../src/domains/Business/components/CountryBankDetails/CountryBankDetails.tsx","../src/domains/Business/components/DolarAppAvatar.tsx","../src/domains/Business/components/EmptyTransactionsCard.tsx","../src/domains/Business/components/Filters/data.ts","../src/domains/Business/components/Filters/AccountsFilter.tsx","../src/domains/Business/components/Filters/ActiveFilters.tsx","../src/domains/Business/components/Filters/CardholderFilter.tsx","../src/domains/Business/components/Filters/CardStateFilter.tsx","../src/domains/Business/features/Contractors/types/index.ts","../src/domains/Business/components/Filters/ContractTypeFilter.tsx","../src/domains/Business/features/Transactions/api/getBulkTransaction.ts","../src/domains/Business/features/Transactions/api/getCashbackTransactions.ts","../src/domains/Business/features/Transactions/api/getTransaction.ts","../src/domains/Business/features/Transactions/api/getTransactionByType.ts","../src/domains/Business/features/Transactions/api/getTransactions.ts","../src/domains/Business/features/Transactions/api/getTransactionsCSV.ts","../src/domains/Business/features/Transactions/api/getTransactionCurrencies.ts","../src/domains/Business/features/Transactions/api/mocks/transactions.mocks.ts","../src/domains/Business/features/Transactions/api/mocks/index.ts","../src/domains/Business/components/Filters/CurrencyFilter.tsx","../src/domains/Business/components/Filters/DateFilter.tsx","../src/domains/Business/components/Filters/FiltersWidget.tsx","../src/domains/Business/components/Filters/HistoricalPaymentCategoryFilter.tsx","../src/domains/Business/components/Filters/HistoricalPaymentCycleFilter.tsx","../src/domains/Business/components/Filters/HistoricalPaymentStateFilter.tsx","../src/domains/Business/components/Filters/StateFilter.tsx","../src/domains/Business/features/Tasks/types/index.ts","../src/domains/Business/components/Filters/TasksTypeFilter.tsx","../src/domains/Business/components/Filters/TeamRoleFilter.tsx","../src/domains/Business/components/Filters/TeamStateFilter.tsx","../src/domains/Business/components/Filters/TypeFilter.tsx","../src/domains/Business/components/Filters/FilterBadge.tsx","../src/domains/Business/components/Filters/AccountsBadge.tsx","../src/domains/Business/components/Filters/CardholderBadge.tsx","../src/domains/Business/components/Filters/CardStateBadge.tsx","../src/domains/Business/components/Filters/ContractTypeBadge.tsx","../src/domains/Business/components/Filters/CurrencyBadge.tsx","../src/domains/Business/components/Filters/DateBadge.tsx","../src/domains/Business/components/Filters/HistoricalPaymentCategoryBadge.tsx","../src/domains/Business/components/Filters/HistoricalPaymentCycleBadge.tsx","../src/domains/Business/components/Filters/HistoricalPaymentStateBadge.tsx","../src/domains/Business/components/Filters/StateBadge.tsx","../src/domains/Business/components/Filters/TasksTypeBadge.tsx","../src/domains/Business/components/Filters/TeamRoleBadge.tsx","../src/domains/Business/components/Filters/TeamStateBadge.tsx","../src/domains/Business/components/Filters/TypeBadge.tsx","../src/domains/Business/components/Filters/ContractorPaymentDestinationBadge.tsx","../src/domains/Business/components/Filters/ContractorPaymentDestinationFilter.tsx","../src/domains/Business/components/Filters/ContractorPaymentStateBadge.tsx","../src/domains/Business/components/Filters/ContractorPaymentStateFilter.tsx","../src/domains/Business/components/MoveMoneyWidget.tsx","../src/domains/Business/components/AccountLimitsSidebar.tsx","../src/domains/Business/components/TeamDetailsSidebar/BlockTeamMemberDialog.tsx","../src/domains/Business/components/TeamDetailsSidebar/PermissionsList.tsx","../src/domains/Business/features/Cards/api/activateCard.ts","../src/domains/Business/features/Cards/api/createPhysicalCard.ts","../src/domains/Business/features/Cards/api/createVirtualCard.ts","../src/domains/Business/features/Cards/api/freezeCard.ts","../src/domains/Business/features/Cards/api/getAllCards.ts","../src/domains/Business/features/Cards/api/getCardDeliveryDetails.ts","../src/domains/Business/features/Cards/api/getCardPin.ts","../src/domains/Business/features/Cards/api/getEncryptedCardDetails.ts","../src/domains/Business/features/Cards/api/getSingleCard.ts","../src/domains/Business/features/Cards/api/storeCardEncryptionKey.ts","../src/domains/Business/features/Cards/api/getUnmaskedCardDetails.ts","../src/domains/Business/features/Cards/api/getUserCards.ts","../src/domains/Business/features/Cards/api/unfreezeCard.ts","../src/domains/Business/features/Cards/api/updateCard.ts","../src/domains/Business/features/Cards/api/mocks/cards.mocks.ts","../src/domains/Business/features/Cards/api/mocks/index.ts","../src/domains/Business/components/TeamDetailsSidebar/TeamCardsTable.tsx","../src/domains/Business/components/TeamDetailsSidebar/TeamMemberInviteSection.tsx","../src/domains/Business/components/TeamDetailsSidebar/UnblockTeamMemberDialog.tsx","../src/domains/Business/components/TeamDetailsSidebar/TeamMemberUnblockSection.tsx","../src/domains/Business/components/TeamDetailsSidebar/TeamMoneyLimit.tsx","../src/domains/Business/components/TeamDetailsSidebar/BaseTeamDetails.tsx","../src/domains/Business/components/TeamDetailsSidebar/DeleteTeamMemberAction.tsx","../src/domains/Business/components/TeamDetailsSidebar/EditTeamMemberFields/RoleSelectField.tsx","../src/domains/Business/components/TeamDetailsSidebar/EditTeamMemberFields/MoneyMovementSelectField.tsx","../src/domains/Business/components/TeamDetailsSidebar/EditTeamDetails.tsx","../src/domains/Business/components/TeamDetailsSidebar/TeamDetailsSidebar.tsx","../src/domains/Business/components/ProfileDropdown.tsx","../src/domains/Business/components/RecipientAccountAvatar.tsx","../src/domains/Business/features/Recipients/utils/index.ts","../src/domains/Business/components/RecipientAvatar.tsx","../src/domains/Business/components/TransactionIcon.tsx","../src/domains/Business/components/TransactionsShortList/TransactionShortListRow.tsx","../src/domains/Business/components/TransactionsShortList/TransactionsShortList.tsx","../src/domains/Business/components/TransactionDetailsSidebar/BulkTransactionDetails.tsx","../src/domains/Business/components/TransactionDetailsSidebar/PaymentDetails.tsx","../src/domains/Business/components/TransactionsTable/SingleAmountCell.tsx","../src/domains/Business/components/TransactionsTable/AmountCell.tsx","../src/domains/Business/components/TransactionsTable/DateCell.tsx","../src/domains/Business/components/TransactionsTable/SingleMethodCell.tsx","../src/domains/Business/components/TransactionsTable/MethodCell.tsx","../src/domains/Business/components/TransactionsTable/SingleTransactionCell.tsx","../src/domains/Business/components/TransactionsTable/StateCell.tsx","../src/domains/Business/components/TransactionsTable/BulkTransactionCell.tsx","../src/domains/Business/components/TransactionsTable/TransactionCell.tsx","../src/domains/Business/components/TransactionsTable/TransactionsTable.tsx","../src/domains/Business/components/TransactionsTable/WalletCell.tsx","../src/domains/Business/components/TransactionsTable/useTransactionColumns.tsx","../src/domains/Business/components/TransactionDetailsSidebar/ShortCashbackTransactionsTable.tsx","../src/domains/Business/components/TransactionDetailsSidebar/TrackingInformation.tsx","../src/domains/Business/components/TransactionDetailsSidebar/TransactionAmountDetails.tsx","../src/domains/Business/components/TransactionDetailsSidebar/TransactionStatusInformation.tsx","../src/domains/Business/components/TransactionDetailsSidebar/TypeSpecificTransactionInfo.tsx","../src/domains/Business/components/TransactionDetailsSidebar/SingleTransactionDetails.tsx","../src/domains/Business/components/TransactionDetailsSidebar/TransactionDetailsSidebar.tsx","../src/domains/Business/components/WalletLabel.tsx","../src/domains/Business/features/Accounts/api/getAccountStatements.ts","../src/domains/Business/features/Accounts/api/getDefaultAccountDetails.ts","../src/domains/Business/features/Accounts/api/getStatementsCreditCycleInfo.ts","../src/domains/Business/features/Accounts/api/mocks/accounts.mocks.ts","../src/domains/Business/features/Accounts/api/mocks/index.ts","../src/domains/Business/features/MoveMoney/api/sendMoney.ts","../src/domains/Business/features/MoveMoney/api/transferMoney.ts","../src/domains/Business/features/MoveMoney/api/getRecentRecipients.ts","../src/domains/Business/features/MoveMoney/api/mocks/index.ts","../src/domains/Business/features/Accounts/components/TransferBalanceDialog.tsx","../src/domains/Business/features/Accounts/components/DeleteAccountAction.tsx","../src/domains/Business/features/Accounts/components/EditAccountSidebar.tsx","../src/domains/Business/features/Accounts/components/CreditCycleScreen.tsx","../src/domains/Business/features/Accounts/components/StatementsDateFilter.tsx","../src/domains/Business/features/Accounts/components/StatementsBaseScreen.tsx","../src/domains/Business/features/Accounts/components/StatementsSidebar.tsx","../src/domains/Business/features/Accounts/components/AccountActions.tsx","../src/constants/pagination.ts","../src/domains/Business/features/Accounts/components/useAccountTransactionsColumns.tsx","../src/domains/Business/features/Accounts/components/AccountTransactionsList.tsx","../src/domains/Business/features/Accounts/AccountDetails.tsx","../src/domains/Business/features/Accounts/components/AccountDetailsSidebar.tsx","../src/domains/Business/features/Accounts/components/AccountsTable/AccountStateCell.tsx","../src/domains/Business/features/Accounts/components/AccountsTable/DetailsButtonCell.tsx","../src/domains/Business/features/Accounts/components/AccountsTable/LabelCell.tsx","../src/domains/Business/features/Accounts/components/AccountsTable/MoneyInOutCell.tsx","../src/domains/Business/features/Accounts/components/AccountsTable/useAccountsColumns.tsx","../src/domains/Business/features/Accounts/Accounts.tsx","../src/hooks/useSearchInput.ts","../src/domains/Business/features/Accounts/AccountTransactions.tsx","../src/domains/Business/features/Accounts/CreateAccount.tsx","../src/domains/Business/features/Accounts/routes.tsx","../src/domains/Business/features/Auth/components/PasswordFields.tsx","../src/domains/Business/features/Auth/AcceptInvite.tsx","../src/domains/Business/features/Auth/components/ForgetPasswordEmailForm.tsx","../src/domains/Business/features/Auth/components/ForgetPasswordForm.tsx","../src/domains/Business/features/Auth/components/ForgetPasswordVerifyForm.tsx","../src/domains/Business/features/Auth/ForgetPassword.tsx","../src/domains/Business/features/Auth/Layout.tsx","../src/domains/Business/features/Auth/components/Confirm2FADialog.tsx","../src/domains/Business/features/Auth/components/SignInForm.tsx","../src/domains/Business/features/Auth/SignIn.tsx","../src/domains/Business/features/Auth/components/PasswordForm.tsx","../src/domains/Business/features/Auth/components/CompanyTypeCombobox.tsx","../src/domains/Business/features/Auth/components/CompanyStep.tsx","../src/lib/phone.ts","../src/domains/Business/features/Auth/components/UserStep.tsx","../src/domains/Business/features/Auth/components/VerifyEmail.tsx","../src/domains/Business/features/Auth/components/UserForm.tsx","../src/domains/Business/features/Auth/SignUp.tsx","../src/domains/Business/features/Auth/routes.tsx","../src/domains/Business/features/BulkPayments/api/createBulkPayment.ts","../src/domains/Business/features/BulkPayments/api/getBulkTransactions.ts","../src/domains/Business/features/BulkPayments/api/getCSVFiles.ts","../src/domains/Business/features/BulkPayments/api/getCSVTransactions.ts","../src/domains/Business/features/BulkPayments/api/parseCSV.ts","../src/domains/Business/features/BulkPayments/api/quoteBulkPayment.ts","../src/domains/Business/features/BulkPayments/api/removeFile.ts","../src/domains/Business/features/BulkPayments/api/scheduleBulkPayment.ts","../src/domains/Business/features/BulkPayments/api/mocks/bulkPayments.mocks.ts","../src/domains/Business/features/BulkPayments/api/mocks/index.ts","../src/domains/Business/features/BulkPayments/utils/index.ts","../src/domains/Business/features/BulkPayments/components/CSVTransactionDetailsRow.tsx","../src/domains/Business/features/BulkPayments/components/BulkRecipientRow.tsx","../src/domains/Business/features/BulkPayments/components/steps/BulkPaymentReview.tsx","../src/domains/Business/features/BulkPayments/constants/index.ts","../src/domains/Business/features/BulkPayments/components/CSVFailedTransactionRow.tsx","../src/domains/Business/features/BulkPayments/components/CSVFailedTransactionsList.tsx","../src/domains/Business/features/BulkPayments/components/CSVTransactionRow.tsx","../src/domains/Business/features/BulkPayments/components/CSVTransactionsList.tsx","../src/domains/Business/features/BulkPayments/components/steps/BulkPaymentSelectTransactions.tsx","../src/domains/Business/features/BulkPayments/components/UploadedCSV.tsx","../src/domains/Business/features/BulkPayments/components/UploadCSVFileField.tsx","../src/domains/Business/features/BulkPayments/components/steps/BulkPaymentUploadCSV.tsx","../src/domains/Business/features/BulkPayments/BulkPayments.tsx","../src/domains/Business/features/BulkPayments/BulkTransactions.tsx","../src/domains/Business/features/BulkPayments/routes.tsx","../src/domains/Business/features/Cards/components/CardTransactionShortList.tsx","../src/domains/Business/features/Cards/components/FlipCard/CardBack.tsx","../src/domains/Business/features/Cards/components/FlipCard/CardFront.tsx","../src/domains/Business/features/Cards/components/FlipCard/FlipCard.tsx","../src/domains/Business/features/Cards/components/BaseCardDetails.tsx","../src/hooks/useCoordinatesFromAddress.ts","../src/domains/Business/features/Cards/components/CardDeliveryProgress.tsx","../src/domains/Business/features/Cards/components/CardDelivery.tsx","../src/domains/Business/features/Cards/components/CardDetailsLoader.tsx","../src/domains/Business/features/Cards/components/CardBillingAddress.tsx","../src/domains/Business/features/Cards/components/CardInformation.tsx","../src/domains/Business/features/Cards/components/CardPIN.tsx","../src/domains/Business/features/Cards/components/CardStatements.tsx","../src/domains/Business/features/Cards/api/terminateCard.ts","../src/domains/Business/features/Cards/components/DeleteCardAction.tsx","../src/domains/Business/features/Cards/components/EditCard.tsx","../src/domains/Business/features/Cards/components/CardDetailsSidebar.tsx","../src/domains/Business/features/Cards/components/EmptyCardsWidget.tsx","../src/domains/Business/features/Cards/Cards.tsx","../src/domains/Business/features/Cards/components/useCardTransactionsColumn.tsx","../src/domains/Business/features/Cards/CardTransactions.tsx","../src/domains/Business/features/Cards/components/CreateCardSteps/CardAddressStep.tsx","../src/domains/Business/features/Cards/components/CreateCardSteps/CardReviewStep.tsx","../src/domains/Business/features/Cards/components/CreateCardSteps/CardTypeStep.tsx","../src/domains/Business/features/Cards/components/CreateCardSteps/CreatePhysicalCardStep.tsx","../src/domains/Business/features/Cards/components/CreateCardSteps/CreateVirtualCardStep.tsx","../src/domains/Business/features/Cards/CreateCard.tsx","../src/domains/Business/features/Cards/routes.tsx","../src/domains/Business/features/Contractors/api/calculateProRata.ts","../src/domains/Business/features/Contractors/api/createContractor.ts","../src/domains/Business/features/Contractors/api/deleteContractDocument.ts","../src/domains/Business/features/Contractors/api/dismissPayment.ts","../src/domains/Business/features/Contractors/api/downloadContractDocument.ts","../src/domains/Business/features/Contractors/api/getAllContractDocuments.ts","../src/domains/Business/features/Contractors/api/getContractor.ts","../src/domains/Business/features/Contractors/api/getContractorPayments.ts","../src/domains/Business/features/Contractors/api/getContractors.ts","../src/domains/Business/features/Contractors/api/getHistoricalPayment.ts","../src/domains/Business/features/Contractors/api/getHistoricalPayments.ts","../src/domains/Business/features/Contractors/api/getOffCycleDetails.ts","../src/domains/Business/features/Contractors/api/getPaymentCycleDetails.ts","../src/domains/Business/features/Contractors/api/getPaymentCycles.ts","../src/domains/Business/features/Contractors/api/getPaymentCyclesCount.ts","../src/domains/Business/features/Contractors/api/retryHistoricalPayment.ts","../src/domains/Business/features/Contractors/api/runPayment.ts","../src/domains/Business/features/Contractors/api/sendContractorReminder.ts","../src/domains/Business/features/Contractors/api/updateContractor.ts","../src/domains/Business/features/Contractors/api/uploadCustomContract.ts","../src/domains/Business/features/Contractors/api/uploadDocumentToExistingContact.ts","../src/domains/Business/features/Contractors/api/mocks/contractors.mocks.ts","../src/domains/Business/features/Contractors/api/mocks/index.ts","../src/domains/Business/features/Contractors/Contractors.tsx","../src/domains/Business/features/Contractors/components/ContractorPaymentActions.tsx","../src/domains/Business/features/Contractors/utils/index.ts","../src/domains/Business/features/Contractors/components/ContractorAmountRow.tsx","../src/domains/Business/features/Contractors/components/ContractorsReviewRow.tsx","../src/domains/Business/features/Contractors/components/ContractStateBadge.tsx","../src/domains/Business/features/Contractors/components/ContractorPaymentBadge.tsx","../src/domains/Business/features/Contractors/components/ContractorStateBadge.tsx","../src/domains/Business/features/Contractors/components/BulkUploadCSV/BulkCSVFileField.tsx","../src/domains/Business/features/Contractors/components/OffCyclePayment/OffCyclePaymentSteps/schema.ts","../src/domains/Business/features/Contractors/components/OffCyclePayment/OffCyclePaymentSteps/OffCycleFixedContractorsStep.tsx","../src/domains/Business/features/Contractors/components/OffCyclePayment/OffCyclePaymentSteps/OffCyclePayAsYouGoContractors.tsx","../src/domains/Business/features/Contractors/components/OffCyclePayment/OffCycleCategorySelect.tsx","../src/domains/Business/features/Contractors/components/OffCyclePayment/OffCyclePaymentSteps/OffCycleReviewStep.tsx","../src/domains/Business/features/Contractors/components/BulkUploadCSV/BulkUploadCSVSteps/BulkUploadCSVReview.tsx","../src/domains/Business/features/Contractors/components/BulkUploadCSV/BulkUploadCSVSteps/BulkUploadCSVUpload.tsx","../src/domains/Business/features/Contractors/components/UploadManualCSV/ManualCSVFileField.tsx","../src/domains/Business/features/Contractors/components/UploadManualCSV/UploadManualCSVSteps/UploadManualCSVUpload.tsx","../src/domains/Business/features/Contractors/components/UploadManualCSV/ManualCSVContractorRow.tsx","../src/domains/Business/features/Contractors/components/UploadManualCSV/ManualCSVContractorsList.tsx","../src/domains/Business/features/Contractors/components/UploadManualCSV/UploadManualCSVSteps/UploadManualFixedContractors.tsx","../src/domains/Business/features/Contractors/components/UploadManualCSV/UploadManualCSVSteps/UploadManualCSVReview.tsx","../src/domains/Business/features/Contractors/components/UploadManualCSV/UploadManualCSVSteps/UploadManualPayAsYouGoContractors.tsx","../src/domains/Business/features/Contractors/components/BulkUploadCSV/BulkUploadCSVSteps/BulkUploadFixedContractors.tsx","../src/domains/Business/features/Contractors/components/BulkUploadCSV/BulkUploadCSVSteps/BulkUploadPayAsYouGoContractors.tsx","../src/domains/Business/features/Contractors/components/BulkUploadContractors/BulkContractorsCSVFileField.tsx","../src/domains/Business/features/Contractors/components/BulkUploadContractors/BulkUploadContractorsSteps/BulkUploadContractorsUpload.tsx","../src/domains/Business/features/Contractors/components/BulkUploadContractors/CSVContractorRow.tsx","../src/domains/Business/features/Contractors/components/BulkUploadContractors/CSVContractorsList.tsx","../src/domains/Business/features/Contractors/components/BulkUploadContractors/CSVFailedContractorRow.tsx","../src/domains/Business/features/Contractors/components/BulkUploadContractors/CSVFailedContractorsList.tsx","../src/domains/Business/features/Contractors/components/BulkUploadContractors/BulkUploadContractorsSteps/BulkUploadContractorsSelect.tsx","../src/domains/Business/features/Contractors/components/HistoricalPayments/EmptyHistoricalPayments.tsx","../src/domains/Business/features/Contractors/hooks/usePaymentDate.ts","../src/domains/Business/features/Contractors/hooks/usePaymentFrequency.ts","../src/domains/Business/features/Contractors/hooks/useActivePaymentMethod.ts","../src/domains/Business/features/Contractors/components/HistoricalPayments/HistoricalPaymentsTable/HistoricalPaymentCycleCell.tsx","../src/domains/Business/features/Contractors/components/HistoricalPayments/HistoricalPaymentsTable/HistoricalPaymentContractorsCell.tsx","../src/domains/Business/features/Contractors/components/HistoricalPayments/HistoricalPaymentsTable/HistoricalPaymentDateCell.tsx","../src/domains/Business/features/Contractors/components/HistoricalPayments/HistoricalPaymentsTable/HistoricalPaidDateCell.tsx","../src/domains/Business/features/Contractors/components/HistoricalPayments/HistoricalPaymentsTable/HistoricalPaymentStateCell.tsx","../src/domains/Business/features/Contractors/components/HistoricalPayments/HistoricalPaymentsTable/HistoricalAmountCell.tsx","../src/domains/Business/features/Contractors/components/HistoricalPayments/HistoricalPaymentCycleDetails.tsx","../src/domains/Business/features/Contractors/components/HistoricalPayments/HistoricalPaymentDetailsSidebar.tsx","../src/domains/Business/features/Contractors/components/ContractorDetails/ContractActionsSteps.tsx","../src/domains/Business/features/Contractors/components/ContractorDetails/UploadedDocument.tsx","../src/domains/Business/features/Contractors/components/ContractorDetails/UploadDocumentToExistingContract.tsx","../src/domains/Business/features/Contractors/components/ContractorDetails/ContractDocuments.tsx","../src/domains/Business/features/Contractors/components/ContractorDetails/ContractSidebarHeading.tsx","../src/domains/Business/features/Contractors/components/ContractorDetails/ContractSidebarInfoWidget.tsx","../src/domains/Business/features/Contractors/components/ContractorDetails/ContractSidebarPaymentWidget.tsx","../src/domains/Business/features/Contractors/components/ContractorDetails/BaseContractDetailsScreen.tsx","../src/constants/scope-of-work.ts","../src/domains/Business/features/Contractors/components/CreateContractor/CustomDaySelect.tsx","../src/domains/Business/features/Contractors/components/CreateContractor/FirstCycleMethodSelect.tsx","../src/domains/Business/features/Contractors/components/CreateContractor/PaymentDaySelect.tsx","../src/domains/Business/features/Contractors/components/CreateContractor/PaymentFrequencySelect.tsx","../src/domains/Business/features/Contractors/components/CreateContractor/ScopeOfWorkField.tsx","../src/domains/Business/features/Contractors/components/ContractorDetails/EditContactDetailsScreen.tsx","../src/domains/Business/features/Contractors/components/ContractorDetails/ContractDetailsSidebar.tsx","../src/domains/Business/features/Contractors/components/ContractorDetails/DeleteContractorDialog.tsx","../src/domains/Business/features/Contractors/components/ContractorDetails/PauseContractDialog.tsx","../src/domains/Business/features/Contractors/components/ContractorDetails/UnpauseContractDialog.tsx","../src/domains/Business/features/Contractors/components/ContractorDetails/ContractorActions.tsx","../src/domains/Business/features/Contractors/components/ContractorDetails/ContractorPaymentDetails.tsx","../src/domains/Business/features/Contractors/components/ContractorDetails/ContractorPaymentInformation.tsx","../src/domains/Business/features/Contractors/components/ContractorDetails/SendReminderToDo.tsx","../src/domains/Business/features/Contractors/components/ContractorDetails/ContractorPaymentDetailsSidebar.tsx","../src/domains/Business/features/Contractors/components/ContractorDetails/ContractorPaymentAvatar.tsx","../src/domains/Business/features/Contractors/components/ContractorDetails/ContractorPaymentCard.tsx","../src/domains/Business/features/Contractors/components/ContractorDetails/ContractorPayments.tsx","../src/domains/Business/features/Contractors/components/ContractorDetails/ContractorPersonalInformation.tsx","../src/domains/Business/features/Contractors/components/ContractorDetails/ContractorPersonalInformationEdit.tsx","../src/domains/Business/features/Contractors/components/ContractorDetails/ContractorTaxInformation.tsx","../src/domains/Business/features/Contractors/components/ContractorDetails/SignContractTodo.tsx","../src/domains/Business/features/Contractors/components/ContractorDetails/ContractorToDos.tsx","../src/domains/Business/features/Contractors/components/ContractorDetails/ContractsSection.tsx","../src/domains/Business/features/Contractors/components/CreateContractor/CreateContractorSteps/ContractDocumentTypeStep.tsx","../src/domains/Business/features/Contractors/components/CreateContractor/CreateContractorSteps/ContractorDetailsStep.tsx","../src/domains/Business/features/Contractors/components/CreateContractor/CreateContractorSteps/ContractTypeStep.tsx","../src/domains/Business/features/Contractors/components/CreateContractor/CreateContractorSteps/PayAsYouGoContractStep.tsx","../src/domains/Business/features/Contractors/components/CreateContractor/UploadCustomContactField.tsx","../src/domains/Business/features/Contractors/components/CreateContractor/CreateContractorSteps/UploadCustomContractStep.tsx","../src/domains/Business/features/Contractors/components/CreateContractor/CreateContractorSteps/ContractorReviewStep.tsx","../src/domains/Business/features/Contractors/components/CreateContractor/CreateContractorSteps/schema.ts","../src/domains/Business/features/Contractors/components/CreateContractor/CreateContractorSteps/FixedRateContractStep.tsx","../src/domains/Business/features/Contractors/components/RunPayment/DismissDialog.tsx","../src/domains/Business/features/Contractors/components/RunPayment/FixedContractorRow.tsx","../src/domains/Business/features/Contractors/components/RunPayment/RunPaymentSteps/FixedContractorsStep.tsx","../src/domains/Business/features/Contractors/components/RunPayment/RunPaymentSteps/schema.ts","../src/domains/Business/features/Contractors/components/RunPayment/RunPaymentSteps/PayAsYouGoContractorStep.tsx","../src/domains/Business/features/Contractors/components/RunPayment/RunPaymentSteps/RunPaymentReviewStep.tsx","../src/domains/Business/features/Contractors/components/ContractorPayments/ContractorPaymentTable/ContractorPaymentAmountCell.tsx","../src/domains/Business/features/Contractors/components/ContractorPayments/ContractorPaymentTable/ContractorPaymentCycleCell.tsx","../src/domains/Business/features/Contractors/components/ContractorPayments/ContractorPaymentTable/ContractorPaymentDateCell.tsx","../src/domains/Business/features/Contractors/components/ContractorPayments/ContractorPaymentTable/ContractorPaymentStateCell.tsx","../src/domains/Business/features/Contractors/components/ContractorPayments/ContractorPaymentTable/DestinationCell.tsx","../src/domains/Business/features/Contractors/components/ContractorPayments/ContractorPaymentTable/useContractorPaymentColumns.tsx","../src/domains/Business/features/Contractors/components/ContractorsOverview/EmptyOverview.tsx","../src/domains/Business/features/Contractors/components/ContractorsOverview/ContractorPaymentsTable/PaymentCycleCell.tsx","../src/domains/Business/features/Contractors/components/ContractorsOverview/ContractorPaymentsTable/ContractorsAmountCell.tsx","../src/domains/Business/features/Contractors/components/ContractorsOverview/ContractorPaymentsTable/ContractorsPaymentDateCell.tsx","../src/domains/Business/features/Contractors/components/ContractorsOverview/ContractorPaymentsTable/DismissPaymentDialog.tsx","../src/domains/Business/features/Contractors/components/ContractorsOverview/ContractorPaymentsTable/PaymentActionsCell.tsx","../src/domains/Business/features/Contractors/components/ContractorsOverview/usePaymentCyclesColumn.tsx","../src/domains/Business/features/Contractors/components/AllContractors/ContractorsTable/CitizenshipCell.tsx","../src/domains/Business/features/Contractors/components/AllContractors/ContractorsTable/ContractorCell.tsx","../src/domains/Business/features/Contractors/components/AllContractors/ContractorsTable/ContractorStartDateCell.tsx","../src/domains/Business/features/Contractors/components/AllContractors/ContractorsTable/ContractorStateCell.tsx","../src/domains/Business/features/Contractors/components/AllContractors/ContractorsTable/ContractTypeCell.tsx","../src/domains/Business/features/Contractors/components/AllContractors/ContractorsTable/LastPaymentDateCell.tsx","../src/domains/Business/features/Contractors/components/AllContractors/ContractorsTable/useContractorsColumns.tsx","../src/domains/Business/features/Contractors/components/AllContractors/EmptyContractors.tsx","../src/domains/Business/features/Contractors/features/AllContractors.tsx","../src/domains/Business/features/Contractors/features/BulkUploadContractors.tsx","../src/domains/Business/features/Contractors/features/BulkUploadCSV.tsx","../src/domains/Business/features/Contractors/features/ContractorDetails.tsx","../src/domains/Business/features/Contractors/features/ContractorsOverview.tsx","../src/domains/Business/features/Contractors/features/ContractorsTransactions.tsx","../src/domains/Business/features/Contractors/features/CreateContractor.tsx","../src/domains/Business/features/Contractors/features/EndContract.tsx","../src/domains/Business/features/Contractors/components/HistoricalPayments/useHistoricalPaymentsColumns.tsx","../src/domains/Business/features/Contractors/features/HistoricalPayments.tsx","../src/domains/Business/features/Contractors/features/OffCyclePayment.tsx","../src/domains/Business/features/Contractors/features/RunPayment.tsx","../src/domains/Business/features/Contractors/features/UploadManualCSV.tsx","../src/domains/Business/features/Contractors/routes.tsx","../src/lib/error.ts","../src/domains/Business/features/BusinessStateChecker.tsx","../src/domains/Business/features/MoveMoney/components/AddBalanceDetails.tsx","../src/domains/Business/features/MoveMoney/components/SelectAccountScreen.tsx","../src/domains/Business/features/MoveMoney/AddBalance.tsx","../src/domains/Business/features/Recipients/api/createRecipient.ts","../src/domains/Business/features/Recipients/api/deleteRecipient.ts","../src/domains/Business/features/Recipients/api/editRecipient.ts","../src/domains/Business/features/Recipients/api/getRecipients.ts","../src/domains/Business/features/Recipients/api/getSingleRecipient.ts","../src/domains/Business/features/Recipients/api/getDolarAppUsers.ts","../src/domains/Business/features/Recipients/api/mocks/recipients.mocks.ts","../src/domains/Business/features/Recipients/api/mocks/index.ts","../src/lib/recipient.ts","../src/domains/Business/features/MoveMoney/components/AmountScreenSubtitle.tsx","../src/domains/Business/features/MoveMoney/components/AmountScreen.tsx","../src/domains/Business/features/MoveMoney/components/ReviewPaymentDetails.tsx","../src/domains/Business/features/MoveMoney/components/ReviewScreen.tsx","../src/domains/Business/features/Recipients/components/AddRecipientSteps/RecipientAccountTypeStep.tsx","../src/domains/Business/features/Recipients/components/BusinessFields.tsx","../src/domains/Business/features/Recipients/components/ContactDetailsFields.tsx","../src/domains/Business/features/Recipients/components/DeleteRecipientAction.tsx","../src/domains/Business/features/Recipients/components/MXPaymentFields.tsx","../src/domains/Business/features/Recipients/components/validations.ts","../src/domains/Business/features/Recipients/components/MXBusinessForm.tsx","../src/domains/Business/features/Recipients/components/IndividualFields.tsx","../src/domains/Business/features/Recipients/components/MXIndividualForm.tsx","../src/domains/Business/features/Recipients/components/PaymentMethodSelect.tsx","../src/domains/Business/features/Recipients/components/USPaymentFields.tsx","../src/domains/Business/features/Recipients/components/USBusinessForm.tsx","../src/domains/Business/features/Recipients/components/USIndividualForm.tsx","../src/domains/Business/features/Recipients/components/RecipientForm.tsx","../src/domains/Business/features/Recipients/components/AddRecipientSteps/RecipientDetailsStep.tsx","../src/domains/Business/features/Recipients/components/AddRecipientSteps/RecipientDolarTagStep.tsx","../src/domains/Business/features/Recipients/components/AddRecipientSteps/RecipientEntityStep.tsx","../src/domains/Business/features/Recipients/components/DolarAppRecipientReview.tsx","../src/domains/Business/features/Recipients/components/RecipientPaymentDetails.tsx","../src/domains/Business/features/Recipients/components/AddRecipientSteps/RecipientReview.tsx","../src/domains/Business/features/Recipients/components/AddRecipientSteps/RecipientReviewStep.tsx","../src/domains/Business/features/Recipients/AddRecipient.tsx","../src/domains/Business/features/Recipients/components/EmptyRecipients.tsx","../src/domains/Business/features/Recipients/components/PaymentDetails.tsx","../src/domains/Business/features/Recipients/components/RecipientContactDetails.tsx","../src/domains/Business/features/Recipients/components/BaseRecipientScreen.tsx","../src/domains/Business/features/Recipients/components/DolarAppRecipientForm.tsx","../src/domains/Business/features/Recipients/components/EditRecipient.tsx","../src/domains/Business/features/Recipients/components/RecipientDetailsSidebar.tsx","../src/domains/Business/features/Recipients/components/RecipientsTable/AccountCell.tsx","../src/domains/Business/features/Recipients/components/RecipientsTable/RecipientNicknameCell.tsx","../src/domains/Business/features/Recipients/components/RecipientsTable/SendCell.tsx","../src/domains/Business/features/Recipients/components/RecipientsTable/useRecipientsColumns.tsx","../src/domains/Business/features/Recipients/Recipients.tsx","../src/domains/Business/features/Recipients/routes.tsx","../src/domains/Business/features/MoveMoney/components/RecipientCard.tsx","../src/domains/Business/features/MoveMoney/components/SelectRecipientScreen.tsx","../src/domains/Business/features/MoveMoney/Send.tsx","../src/domains/Business/features/MoveMoney/TransferMoney.tsx","../src/domains/Business/features/MoveMoney/routes.tsx","../src/domains/Business/features/Settings/CompanySettings.tsx","../src/domains/Business/features/Settings/Settings.tsx","../src/domains/Business/features/Settings/routes.tsx","../src/domains/Business/features/Tasks/api/approveMultipleTasks.ts","../src/domains/Business/features/Tasks/api/approveTask.ts","../src/domains/Business/features/Tasks/api/cancelTask.ts","../src/domains/Business/features/Tasks/api/declineTask.ts","../src/domains/Business/features/Tasks/api/getAdminTask.ts","../src/domains/Business/features/Tasks/api/getAdminTasks.ts","../src/domains/Business/features/Tasks/api/getBulkPaymentTaskDetails.ts","../src/domains/Business/features/Tasks/api/getTasksCount.ts","../src/domains/Business/features/Tasks/api/getUserTask.ts","../src/domains/Business/features/Tasks/api/getUserTasks.ts","../src/domains/Business/features/Tasks/api/getWithdrawalTaskDetails.ts","../src/domains/Business/features/Tasks/api/mocks/tasks.mocks.ts","../src/domains/Business/features/Tasks/api/mocks/index.ts","../src/domains/Business/features/Tasks/components/AddRecipientTaskReview.tsx","../src/domains/Business/features/Tasks/components/BulkPaymentTaskReview.tsx","../src/domains/Business/features/Tasks/components/CancelTaskDialog.tsx","../src/domains/Business/features/Tasks/components/DeclineTasksDialog.tsx","../src/domains/Business/features/Tasks/components/WithdrawalTaskReview.tsx","../src/domains/Business/features/Tasks/hooks/useApproveTask.ts","../src/domains/Business/features/Tasks/ReviewTask.tsx","../src/domains/Business/features/Tasks/components/EmptyTasks.tsx","../src/domains/Business/features/Tasks/components/FloatingTaskButton.tsx","../src/domains/Business/features/Tasks/components/SubmittedOnCell.tsx","../src/domains/Business/features/Tasks/components/TasksTable/RequestedByCell.tsx","../src/domains/Business/features/Tasks/components/TasksTable/TaskActionsCell.tsx","../src/domains/Business/features/Tasks/components/TasksTable/TaskDescriptionCell.tsx","../src/domains/Business/features/Tasks/components/TasksTable/useTasksColumns.tsx","../src/domains/Business/features/Tasks/Tasks.tsx","../src/domains/Business/features/Tasks/routes.tsx","../src/domains/Business/features/Team/components/AddTeamMemberSteps/schemas.ts","../src/domains/Business/features/Team/components/AddTeamMemberSteps/MoneyMovementStep.tsx","../src/domains/Business/features/Team/components/AddTeamMemberSteps/TeamCardAddressStep.tsx","../src/domains/Business/features/Team/components/AddTeamMemberSteps/TeamMemberDetailsStep.tsx","../src/domains/Business/features/Team/components/MoneyMovementReviewSection.tsx","../src/domains/Business/features/Team/components/TeamCardAddressReview.tsx","../src/domains/Business/features/Team/components/TeamCardReviewSection.tsx","../src/domains/Business/features/Team/components/TeamDetailsReviewSection.tsx","../src/domains/Business/features/Team/components/AddTeamMemberSteps/TeamMemberReviewStep.tsx","../src/domains/Business/features/Team/components/AddTeamMemberSteps/TeamMemberTypeStep.tsx","../src/domains/Business/features/Team/components/AddTeamMemberSteps/TeamPhysicalCardDetailsStep.tsx","../src/domains/Business/features/Team/components/AddTeamMemberSteps/TeamSelectCardStep.tsx","../src/domains/Business/features/Team/components/AddTeamMemberSteps/TeamVirtualCardDetailsStep.tsx","../src/domains/Business/features/Team/AddTeamMember.tsx","../src/domains/Business/features/Team/components/TeamTable/TeamNameCell.tsx","../src/domains/Business/features/Team/components/TeamTable/TeamRoleCell.tsx","../src/domains/Business/features/Team/components/TeamTable/TeamStateCell.tsx","../src/domains/Business/features/Team/components/TeamTable/useTeamColumns.tsx","../src/domains/Business/features/Team/Team.tsx","../src/domains/Business/features/Team/routes.tsx","../src/domains/Business/features/Transactions/components/useCashbackTransactionsColumns.tsx","../src/domains/Business/features/Transactions/CashbackTransactions.tsx","../src/domains/Business/features/Transactions/Transactions.tsx","../src/domains/Business/features/Transactions/routes.tsx","../src/domains/Business/features/TwoFactorGuardChecker.tsx","../src/domains/Business/features/Dashboard/components/CardsBanner.tsx","../src/domains/Business/features/Dashboard/components/CalculateRateSidebar.tsx","../src/lib/chart.ts","../src/domains/Business/features/Dashboard/components/FXChart.tsx","../src/domains/Business/features/Dashboard/components/FXRatesValues.tsx","../src/domains/Business/features/Dashboard/components/FXRatesWidget.tsx","../src/domains/Business/features/Dashboard/components/LimitBanner.tsx","../src/domains/Business/features/Dashboard/components/TransactionsWidget.tsx","../src/domains/Business/features/Dashboard/Home.tsx","../src/domains/Business/features/Dashboard/hooks/useNavigationLinks.ts","../src/domains/Business/features/Dashboard/components/Sidebar.tsx","../src/domains/Business/features/Dashboard/PreloadedImages.tsx","../src/domains/Business/features/Dashboard/Layout.tsx","../src/domains/Business/features/Dashboard/PermissionsChecker.tsx","../src/domains/Business/features/Dashboard/Setup2FAScreen.tsx","../src/domains/Business/features/Dashboard/routes.tsx","../src/domains/Business/features/Onboarding/api/createBeneficialOwner.ts","../src/domains/Business/features/Onboarding/api/deleteBeneficialOwner.ts","../src/domains/Business/features/Onboarding/api/deleteOnboardingDocument.ts","../src/domains/Business/features/Onboarding/api/getBeneficialOwner.ts","../src/domains/Business/features/Onboarding/api/getOnboardingConfig.ts","../src/domains/Business/features/Onboarding/api/getOnboardingCountries.ts","../src/domains/Business/features/Onboarding/api/getOnboardingState.ts","../src/domains/Business/features/Onboarding/api/getOnboardingStepDetails.ts","../src/domains/Business/features/Onboarding/api/startOnboarding.ts","../src/domains/Business/features/Onboarding/api/submitOnboardingStep.ts","../src/domains/Business/features/Onboarding/api/updateBeneficialOwner.ts","../src/domains/Business/features/Onboarding/api/uploadOnboardingDocument.ts","../src/domains/Business/features/Onboarding/types/index.ts","../src/domains/Business/features/Onboarding/api/mocks/onboarding.mocks.ts","../src/domains/Business/features/Onboarding/api/mocks/index.ts","../src/domains/Business/features/Onboarding/constants/index.ts","../src/domains/Business/features/Onboarding/components/OwnerAddressFields.tsx","../src/domains/Business/features/Onboarding/components/NewOwnerSteps/schema.ts","../src/domains/Business/features/Onboarding/components/NewOwnerSteps/OwnerAddressStep.tsx","../src/domains/Business/features/Onboarding/components/CountryTaxResidenceCombobox.tsx","../src/domains/Business/features/Onboarding/components/NewOwnerSteps/OwnerDetailsStep.tsx","../src/domains/Business/features/Onboarding/components/StepDetails.tsx","../src/domains/Business/features/Onboarding/components/NewOwnerSteps/OwnerReviewStep.tsx","../src/domains/Business/features/Onboarding/components/NewOwnerSteps/SelectOwnerTypeStep.tsx","../src/domains/Business/features/Onboarding/CreateOwner.tsx","../src/domains/Business/features/Onboarding/components/OnboardingSidebarStep.tsx","../src/domains/Business/features/Onboarding/components/OnboardingSidebar.tsx","../src/domains/Business/features/Onboarding/Layout.tsx","../src/domains/Business/features/Onboarding/hooks/useBusinessStateCheck.ts","../src/domains/Business/features/Onboarding/Onboarding.tsx","../src/domains/Business/features/Onboarding/OnboardingComplete.tsx","../src/domains/Business/features/Onboarding/components/DocumentsList.tsx","../src/domains/Business/features/Onboarding/OnboardingStart.tsx","../src/domains/Business/features/Onboarding/components/UploadedOnboardingDocument.tsx","../src/domains/Business/features/Onboarding/components/OnboardingDocumentField.tsx","../src/domains/Business/features/Onboarding/components/AddressFields.tsx","../src/domains/Business/features/Onboarding/components/OnboardingLoader.tsx","../src/domains/Business/features/Onboarding/utils/getPreviousStep.ts","../src/domains/Business/features/Onboarding/steps/BusinessAddressStep.tsx","../src/domains/Business/features/Onboarding/components/ConfirmActivityField.tsx","../src/domains/Business/features/Onboarding/components/HighRiskActivitiesScreen.tsx","../src/domains/Business/features/Onboarding/components/IndustryField.tsx","../src/domains/Business/features/Onboarding/components/MonthlyVolumeSelectField.tsx","../src/domains/Business/features/Onboarding/components/ProhibitedActivitiesScreen.tsx","../src/domains/Business/features/Onboarding/components/ProhibitedCountriesScreen.tsx","../src/domains/Business/features/Onboarding/components/SourceOfFundsDescription.tsx","../src/domains/Business/features/Onboarding/components/SourceOfFundsMultiSelectField.tsx","../src/domains/Business/features/Onboarding/steps/CompanyActivityStep.tsx","../src/domains/Business/features/Onboarding/steps/CompanyFormationStep.tsx","../src/domains/Business/features/Onboarding/components/BeneficialOwner.tsx","../src/domains/Business/features/Onboarding/steps/CompanyOwnershipStep.tsx","../src/domains/Business/features/Onboarding/api/restartIdentityValidation.ts","../src/domains/Business/features/Onboarding/api/sendIdentityValidationEmail.ts","../src/domains/Business/features/Onboarding/api/startIdentityValidation.ts","../src/domains/Business/features/Onboarding/components/IdentityEmailDialog.tsx","../src/domains/Business/features/Onboarding/components/IdentityTable/IdentityActionCell.tsx","../src/domains/Business/features/Onboarding/components/IdentityTable/KeyIndividualCell.tsx","../src/domains/Business/features/Onboarding/components/IdentityTable/RoleCell.tsx","../src/domains/Business/features/Onboarding/components/IdentityTable/TaskCell.tsx","../src/domains/Business/features/Onboarding/components/VerificationBadge.tsx","../src/domains/Business/features/Onboarding/components/IdentityTable/VerificationStateCell.tsx","../src/domains/Business/features/Onboarding/components/IdentityTable/useIdentityTableColumns.tsx","../src/domains/Business/features/Onboarding/steps/IdentityValidationStep.tsx","../src/domains/Business/features/Onboarding/components/LegalRepresentativeSteps/SelectLegalRepresentative.tsx","../src/domains/Business/features/Onboarding/components/LegalRepresentativeSteps/LegalRepresentativeForm.tsx","../src/domains/Business/features/Onboarding/components/LegalRepresentativeSteps/LegalRepresentativeAddress.tsx","../src/domains/Business/features/Onboarding/steps/LegalRepresentativeStep.tsx","../src/domains/Business/features/Onboarding/hooks/useDocumentsList.tsx","../src/domains/Business/features/Onboarding/components/ReviewSteps/BusinessAddressReview.tsx","../src/domains/Business/features/Onboarding/components/ReviewSteps/CompanyActivityReview.tsx","../src/domains/Business/features/Onboarding/components/ReviewSteps/CompanyFormationReview.tsx","../src/domains/Business/features/Onboarding/components/ReviewSteps/CompanyOwnershipReview.tsx","../src/domains/Business/features/Onboarding/components/ReviewSteps/IdentityValidationReview.tsx","../src/domains/Business/features/Onboarding/components/ReviewSteps/LegalRepresentativeReview.tsx","../src/domains/Business/features/Onboarding/components/ReviewSteps.tsx","../src/domains/Business/features/Onboarding/steps/ReviewAndSubmitStep.tsx","../src/domains/Business/features/Onboarding/OnboardingSteps.tsx","../src/domains/Business/features/Onboarding/components/QRScreen.tsx","../src/domains/Business/features/Onboarding/components/CopyIdentityLinkDialog.tsx","../src/domains/Business/features/Onboarding/components/UploadDocsScreen.tsx","../src/domains/Business/features/Onboarding/ValidateIdentity.tsx","../src/domains/Business/features/Onboarding/routes.tsx","../src/domains/Business/features/BusinessLoader.tsx","../src/constants/errors.ts","../src/domains/Business/features/Dashboard/App2FAInterceptor.tsx","../src/domains/Business/features/Dashboard/RoleChecker.tsx","../src/domains/Business/features/Routes.tsx","../src/domains/Business/features/AuthChecker.tsx","../src/domains/Contractor/types/index.ts","../src/domains/Contractor/features/ContractorOnboarding/api/completeContractorOnboarding.ts","../src/domains/Contractor/features/ContractorOnboarding/api/getContractorOnboardingState.ts","../src/domains/Contractor/features/ContractorOnboarding/api/linkDolarTag.ts","../src/domains/Contractor/features/ContractorOnboarding/api/startContractorOnboarding.ts","../src/domains/Contractor/features/ContractorOnboarding/api/submitPaymentDetails.ts","../src/domains/Contractor/features/ContractorOnboarding/api/submitPersonalInformation.ts","../src/domains/Contractor/features/ContractorOnboarding/api/getDolarTagLinkingState.ts","../src/domains/Contractor/features/ContractorOnboarding/types/index.ts","../src/domains/Contractor/features/ContractorOnboarding/api/mocks/contractorOnboarding.mocks.ts","../src/domains/Contractor/features/ContractorOnboarding/api/mocks/index.ts","../src/domains/Contractor/features/ContractorOnboarding/ContractorOnboarding.tsx","../src/domains/Contractor/features/ContractorOnboarding/components/ContractorStepsInfo.tsx","../src/domains/Contractor/features/ContractorOnboarding/ContractorOnboardingStart.tsx","../src/domains/Contractor/features/ContractorOnboarding/components/PaymentInformationReview.tsx","../src/domains/Contractor/features/ContractorOnboarding/components/PersonalInformationReview.tsx","../src/domains/Contractor/features/ContractorOnboarding/components/ContractorsOnboardingSubmitStep.tsx","../src/domains/Contractor/features/ContractorOnboarding/components/DownloadAppScreen.tsx","../src/domains/Contractor/features/ContractorOnboarding/components/DolarAppLinkedDialog.tsx","../src/domains/Contractor/features/ContractorOnboarding/components/DolarAppLinkingDialog.tsx","../src/domains/Contractor/features/ContractorOnboarding/components/DolarAppLinkingFailedDialog.tsx","../src/domains/Contractor/features/ContractorOnboarding/components/LinkDolarTagScreen.tsx","../src/domains/Contractor/features/ContractorOnboarding/components/DolarTagPaymentDetails.tsx","../src/domains/Contractor/hooks/useContractorBankName.ts","../src/domains/Contractor/hooks/useContractorLinks.ts","../src/domains/Contractor/api/contractorLogout.ts","../src/domains/Contractor/hooks/useContractorLogout.ts","../src/domains/Contractor/features/ContractorOnboarding/components/MXBankPaymentDetails.tsx","../src/domains/Contractor/utils/index.ts","../src/domains/Contractor/features/ContractorOnboarding/components/LinkAction.tsx","../src/domains/Contractor/features/ContractorOnboarding/components/BankAccountCard.tsx","../src/domains/Contractor/features/ContractorOnboarding/components/DolarTagCard.tsx","../src/domains/Contractor/features/ContractorOnboarding/components/SelectPaymentMethodScreen.tsx","../src/domains/Contractor/features/ContractorOnboarding/components/USBankPaymentDetails.tsx","../src/domains/Contractor/features/ContractorOnboarding/components/PaymentMethodStep.tsx","../src/domains/Contractor/features/ContractorOnboarding/components/PersonalInformationStep.tsx","../src/domains/Contractor/features/ContractorOnboarding/components/SignContractStep.tsx","../src/domains/Contractor/features/ContractorOnboarding/components/TaxFormsStep.tsx","../src/domains/Contractor/features/ContractorOnboarding/ContractorOnboardingSteps.tsx","../src/domains/Contractor/components/ContractorProfileDropdown.tsx","../src/domains/Contractor/components/ContractorSidebar.tsx","../src/domains/Contractor/features/ContractorOnboarding/components/ContractorsOnboardingSidebarStep.tsx","../src/domains/Contractor/features/ContractorOnboarding/components/ContractorsOnboardingSidebar.tsx","../src/domains/Contractor/features/ContractorOnboarding/Layout.tsx","../src/domains/Contractor/features/ContractorOnboarding/routes.tsx","../src/domains/Contractor/features/ExternalContractorDetails/api/downloadContractorDocument.ts","../src/domains/Contractor/features/ExternalContractorDetails/api/getContractorDocuments.tsx","../src/domains/Contractor/features/ExternalContractorDetails/api/downloadContractorInvoice.ts","../src/domains/Contractor/features/ExternalContractorDetails/api/mocks/index.ts","../src/domains/Contractor/features/ExternalContractorDetails/components/UploadedContractDocument.tsx","../src/domains/Contractor/features/ExternalContractorDetails/components/ContractorDocuments.tsx","../src/domains/Contractor/features/ExternalContractorDetails/components/ExternalContractorDetailsSidebar.tsx","../src/domains/Contractor/features/ExternalContractorDetails/components/ContractorInvoiceDropdown.tsx","../src/domains/Contractor/features/ExternalContractorDetails/ExternalContractorDetails.tsx","../src/domains/Contractor/features/ExternalContractorDetails/ExternalContractorTransactions.tsx","../src/domains/Contractor/features/ExternalContractorDetails/Layout.tsx","../src/domains/Contractor/features/ExternalContractorDetails/routes.tsx","../src/domains/Contractor/features/ContractorSignIn/api/acceptContractorInvitation.ts","../src/domains/Contractor/features/ContractorSignIn/api/authenticateContractor.ts","../src/domains/Contractor/features/ContractorSignIn/api/recoverContractorPassword.ts","../src/domains/Contractor/features/ContractorSignIn/api/signInContractor.ts","../src/domains/Contractor/features/ContractorSignIn/api/updateContractorPassword.ts","../src/domains/Contractor/features/ContractorSignIn/api/mocks/index.ts","../src/domains/Contractor/features/ContractorSignIn/ContractorAcceptInvite.tsx","../src/domains/Contractor/features/ContractorSignIn/components/ContractorForgetPasswordEmail.tsx","../src/domains/Contractor/features/ContractorSignIn/components/ContractorForgetPasswordEmailSent.tsx","../src/domains/Contractor/features/ContractorSignIn/components/ContractorResetPassword.tsx","../src/domains/Contractor/features/ContractorSignIn/ContractorForgetPassword.tsx","../src/domains/Contractor/features/ContractorSignIn/components/SignIn2FADialog.tsx","../src/domains/Contractor/features/ContractorSignIn/ContractorSignIn.tsx","../src/domains/Contractor/features/ContractorSignIn/Layout.tsx","../src/domains/Contractor/features/ContractorSignIn/routes.tsx","../src/domains/Contractor/features/Contractor2FAChecker.tsx","../src/domains/Contractor/features/ContractorActivityChecker.tsx","../src/domains/Contractor/features/ContractorSetup2FA.tsx","../src/domains/Contractor/features/ContractorStateChecker.tsx","../src/domains/Contractor/features/Routes.tsx","../src/domains/Contractor/features/ContractorAuthChecker.tsx","../src/NotFound.tsx","../src/PageError.tsx","../src/AppRouter.tsx","../src/constants/intercom.ts","../src/NeedRefreshBanner.tsx","../src/App.tsx","../src/main.tsx"],"sourcesContent":["import { clsx, type ClassValue } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n\nexport function isProduction() {\n return import.meta.env.VITE_ENV === 'production'\n}\n\nexport function isDevelopment() {\n return import.meta.env.VITE_ENV === 'development'\n}\n\nexport function parseAdditionalDetails(details?: string): T | null {\n if (!details) {\n return null\n }\n\n const parsedDetails = JSON.parse(details) as T\n\n return parsedDetails\n}\n\ntype NestedObject = {\n [key: string]: string | boolean | null | undefined | NestedObject | unknown[]\n}\n\nexport function removeEmptyFormFields(data: NestedObject): void {\n Object.keys(data).forEach((key) => {\n if (data[key] === '' || data[key] === null || data[key] === undefined) {\n delete data[key]\n } else if (typeof data[key] === 'object') {\n removeEmptyFormFields(data[key] as NestedObject)\n\n if (Object.keys(data[key] as NestedObject).length === 0) {\n delete data[key]\n }\n }\n })\n}\n\nexport function downloadFile(file: BlobPart, fileName: string) {\n const url = window.URL.createObjectURL(new Blob([file]))\n\n const link = document.createElement('a')\n link.href = url\n link.download = fileName\n\n document.body.appendChild(link)\n\n link.click()\n\n link.parentNode?.removeChild(link)\n}\n\nexport function handleURLSearchParams(\n params: URLSearchParams,\n key: string,\n value: string,\n) {\n const query = params.get(key)\n\n if (!query) {\n params.set(key, value)\n return params\n }\n\n if (query === value) {\n params.delete(key)\n return params\n }\n\n if (!query.split(',').includes(value)) {\n const newType = `${query},${value}`\n params.set(key, newType)\n return params\n }\n\n const newType = query\n .split(',')\n .filter((type) => type !== value)\n .join(',')\n\n params.set(key, newType)\n\n return params\n}\n\nexport function partition(\n array: T[],\n predicate: (value: T) => boolean,\n): [T[], T[]] {\n return [\n array.filter((value) => predicate(value)),\n array.filter((value) => !predicate(value)),\n ]\n}\n\nexport function getAnimationKey(\n isPending: boolean,\n params?: { [k: string]: string },\n) {\n if (isPending) {\n return 'pending'\n }\n\n if (params && Object.keys(params).length) {\n return Object.keys(params).length.toString()\n }\n\n return 'not-pending'\n}\n","import { useEffect } from 'react'\nimport * as Sentry from '@sentry/react'\nimport {\n createRoutesFromChildren,\n matchRoutes,\n useLocation,\n useNavigationType,\n} from 'react-router'\n\nimport { isProduction } from './lib/utils'\n\nSentry.init({\n dsn: import.meta.env.VITE_SENTRY_DSN,\n integrations: [\n Sentry.reactRouterV6BrowserTracingIntegration({\n useEffect: useEffect,\n useLocation,\n useNavigationType,\n createRoutesFromChildren,\n matchRoutes,\n }),\n Sentry.replayIntegration(),\n Sentry.replayCanvasIntegration(),\n ],\n\n tracesSampleRate: 0.1,\n tracePropagationTargets: [\n /^https:\\/\\/api\\.business\\.dolarapp\\.com/,\n /^https:\\/\\/api\\.business\\.dolarapp\\.dev/,\n ],\n beforeSend: (event) => {\n if (!isProduction()) {\n return null\n }\n\n return event\n },\n\n replaysSessionSampleRate: 0.1,\n replaysOnErrorSampleRate: 1.0,\n})\n","import { QueryClient } from '@tanstack/react-query'\n\nexport const queryClient = new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: 60 * 1000,\n },\n },\n})\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgArrowCross = (\n props: SVGProps,\n ref: Ref,\n) => (\n \n \n \n)\nconst ForwardRef = forwardRef(SvgArrowCross)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgArrowDown = (\n props: SVGProps,\n ref: Ref,\n) => (\n \n \n \n)\nconst ForwardRef = forwardRef(SvgArrowDown)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgArrowLeftRight = (\n props: SVGProps,\n ref: Ref,\n) => (\n \n \n \n)\nconst ForwardRef = forwardRef(SvgArrowLeftRight)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgArrowLeft = (\n props: SVGProps,\n ref: Ref,\n) => (\n \n \n \n)\nconst ForwardRef = forwardRef(SvgArrowLeft)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgArrowRight = (\n props: SVGProps,\n ref: Ref,\n) => (\n \n \n \n)\nconst ForwardRef = forwardRef(SvgArrowRight)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgArrowTrendUp = (\n props: SVGProps,\n ref: Ref,\n) => (\n \n \n \n)\nconst ForwardRef = forwardRef(SvgArrowTrendUp)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgArrowUp = (\n props: SVGProps,\n ref: Ref,\n) => (\n \n \n \n)\nconst ForwardRef = forwardRef(SvgArrowUp)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgBag = (props: SVGProps, ref: Ref) => (\n \n \n \n \n)\nconst ForwardRef = forwardRef(SvgBag)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgBank = (props: SVGProps, ref: Ref) => (\n \n \n \n \n \n \n \n \n)\nconst ForwardRef = forwardRef(SvgBank)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgBook = (props: SVGProps, ref: Ref) => (\n \n \n \n \n)\nconst ForwardRef = forwardRef(SvgBook)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgBuilding = (\n props: SVGProps,\n ref: Ref,\n) => (\n \n \n \n \n \n \n \n \n)\nconst ForwardRef = forwardRef(SvgBuilding)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgBusFront = (\n props: SVGProps,\n ref: Ref,\n) => (\n \n \n \n)\nconst ForwardRef = forwardRef(SvgBusFront)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgCalculator = (\n props: SVGProps,\n ref: Ref,\n) => (\n \n \n \n \n \n)\nconst ForwardRef = forwardRef(SvgCalculator)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgCalendar = (\n props: SVGProps,\n ref: Ref,\n) => (\n \n \n \n)\nconst ForwardRef = forwardRef(SvgCalendar)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgCart = (props: SVGProps, ref: Ref) => (\n \n \n \n \n)\nconst ForwardRef = forwardRef(SvgCart)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgChartMixed = (\n props: SVGProps,\n ref: Ref,\n) => (\n \n \n \n)\nconst ForwardRef = forwardRef(SvgChartMixed)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgChartTrendUp = (\n props: SVGProps,\n ref: Ref,\n) => (\n \n \n \n)\nconst ForwardRef = forwardRef(SvgChartTrendUp)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgCheckCircle = (\n props: SVGProps,\n ref: Ref,\n) => (\n \n \n \n \n)\nconst ForwardRef = forwardRef(SvgCheckCircle)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgCheck = (props: SVGProps, ref: Ref) => (\n \n \n \n)\nconst ForwardRef = forwardRef(SvgCheck)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgCheckmark = (\n props: SVGProps,\n ref: Ref,\n) => (\n \n \n \n \n)\nconst ForwardRef = forwardRef(SvgCheckmark)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgChevronDown = (\n props: SVGProps,\n ref: Ref,\n) => (\n \n \n \n)\nconst ForwardRef = forwardRef(SvgChevronDown)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgChevronLeft = (\n props: SVGProps,\n ref: Ref,\n) => (\n \n \n \n)\nconst ForwardRef = forwardRef(SvgChevronLeft)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgChevronRight = (\n props: SVGProps,\n ref: Ref,\n) => (\n \n \n \n)\nconst ForwardRef = forwardRef(SvgChevronRight)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgChevronUp = (\n props: SVGProps,\n ref: Ref,\n) => (\n \n \n \n)\nconst ForwardRef = forwardRef(SvgChevronUp)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgCircleCancel = (\n props: SVGProps,\n ref: Ref,\n) => (\n \n \n \n \n)\nconst ForwardRef = forwardRef(SvgCircleCancel)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgCircle = (props: SVGProps, ref: Ref) => (\n \n \n \n)\nconst ForwardRef = forwardRef(SvgCircle)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgClock = (props: SVGProps, ref: Ref) => (\n \n \n \n \n)\nconst ForwardRef = forwardRef(SvgClock)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgCloudDownload = (\n props: SVGProps,\n ref: Ref,\n) => (\n \n \n \n)\nconst ForwardRef = forwardRef(SvgCloudDownload)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgCoin = (props: SVGProps, ref: Ref) => (\n \n \n \n \n)\nconst ForwardRef = forwardRef(SvgCoin)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgCompressArrows = (\n props: SVGProps,\n ref: Ref,\n) => (\n \n \n \n \n)\nconst ForwardRef = forwardRef(SvgCompressArrows)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgCopy = (props: SVGProps, ref: Ref) => (\n \n \n \n \n)\nconst ForwardRef = forwardRef(SvgCopy)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgCreditCard = (\n props: SVGProps,\n ref: Ref,\n) => (\n \n \n \n \n \n \n \n \n)\nconst ForwardRef = forwardRef(SvgCreditCard)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgDocument = (\n props: SVGProps,\n ref: Ref,\n) => (\n \n \n \n \n)\nconst ForwardRef = forwardRef(SvgDocument)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgDolarappWhite = (\n props: SVGProps,\n ref: Ref,\n) => (\n \n \n \n \n \n \n \n \n \n \n \n \n)\nconst ForwardRef = forwardRef(SvgDolarappWhite)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgDolarapp = (\n props: SVGProps,\n ref: Ref,\n) => (\n \n \n \n \n \n \n \n \n \n \n \n \n)\nconst ForwardRef = forwardRef(SvgDolarapp)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgDoubleRight = (\n props: SVGProps,\n ref: Ref,\n) => (\n \n \n \n)\nconst ForwardRef = forwardRef(SvgDoubleRight)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgDoubleTick = (\n props: SVGProps,\n ref: Ref,\n) => (\n \n \n \n)\nconst ForwardRef = forwardRef(SvgDoubleTick)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgDownloadFile = (\n props: SVGProps,\n ref: Ref,\n) => (\n \n \n \n \n)\nconst ForwardRef = forwardRef(SvgDownloadFile)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgDownload = (\n props: SVGProps,\n ref: Ref,\n) => (\n \n \n \n \n)\nconst ForwardRef = forwardRef(SvgDownload)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgEarth = (props: SVGProps, ref: Ref) => (\n \n \n \n)\nconst ForwardRef = forwardRef(SvgEarth)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgEllipsisVertical = (\n props: SVGProps,\n ref: Ref,\n) => (\n \n \n \n)\nconst ForwardRef = forwardRef(SvgEllipsisVertical)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgEnvelopeOpen = (\n props: SVGProps,\n ref: Ref,\n) => (\n \n \n \n \n)\nconst ForwardRef = forwardRef(SvgEnvelopeOpen)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgEnvelope = (\n props: SVGProps,\n ref: Ref,\n) => (\n \n \n \n)\nconst ForwardRef = forwardRef(SvgEnvelope)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgExchange = (\n props: SVGProps,\n ref: Ref,\n) => (\n \n \n \n)\nconst ForwardRef = forwardRef(SvgExchange)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgEyeOff = (props: SVGProps, ref: Ref) => (\n \n \n \n \n \n)\nconst ForwardRef = forwardRef(SvgEyeOff)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgEye = (props: SVGProps, ref: Ref) => (\n \n \n \n \n)\nconst ForwardRef = forwardRef(SvgEye)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgFileUser = (\n props: SVGProps,\n ref: Ref,\n) => (\n \n \n \n \n \n \n \n \n)\nconst ForwardRef = forwardRef(SvgFileUser)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgGear = (props: SVGProps, ref: Ref) => (\n \n \n \n \n)\nconst ForwardRef = forwardRef(SvgGear)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgGears = (props: SVGProps, ref: Ref) => (\n \n \n \n \n \n \n \n \n)\nconst ForwardRef = forwardRef(SvgGears)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgHeadset = (\n props: SVGProps,\n ref: Ref,\n) => (\n \n \n \n \n)\nconst ForwardRef = forwardRef(SvgHeadset)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgHome = (props: SVGProps, ref: Ref) => (\n \n \n \n \n \n \n \n \n)\nconst ForwardRef = forwardRef(SvgHome)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgIdCard = (props: SVGProps, ref: Ref) => (\n \n \n \n \n \n \n)\nconst ForwardRef = forwardRef(SvgIdCard)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgInfoCircle = (\n props: SVGProps,\n ref: Ref,\n) => (\n \n \n \n \n)\nconst ForwardRef = forwardRef(SvgInfoCircle)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgInfoTriangle = (\n props: SVGProps,\n ref: Ref,\n) => (\n \n \n \n \n)\nconst ForwardRef = forwardRef(SvgInfoTriangle)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgInvoice = (\n props: SVGProps,\n ref: Ref,\n) => (\n \n \n \n \n)\nconst ForwardRef = forwardRef(SvgInvoice)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgLightbulbOn = (\n props: SVGProps,\n ref: Ref,\n) => (\n \n \n \n \n)\nconst ForwardRef = forwardRef(SvgLightbulbOn)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgLightning = (\n props: SVGProps,\n ref: Ref,\n) => (\n \n \n \n)\nconst ForwardRef = forwardRef(SvgLightning)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgLink = (props: SVGProps, ref: Ref) => (\n \n \n \n)\nconst ForwardRef = forwardRef(SvgLink)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgLogout = (props: SVGProps, ref: Ref) => (\n \n \n \n \n)\nconst ForwardRef = forwardRef(SvgLogout)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgMapMark = (\n props: SVGProps,\n ref: Ref,\n) => (\n \n \n \n)\nconst ForwardRef = forwardRef(SvgMapMark)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgMedicalKit = (\n props: SVGProps,\n ref: Ref,\n) => (\n \n \n \n)\nconst ForwardRef = forwardRef(SvgMedicalKit)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgMobile = (props: SVGProps, ref: Ref) => (\n \n \n \n \n \n)\nconst ForwardRef = forwardRef(SvgMobile)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgMoneyBag = (\n props: SVGProps,\n ref: Ref,\n) => (\n \n \n \n \n \n \n)\nconst ForwardRef = forwardRef(SvgMoneyBag)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgNavigation = (\n props: SVGProps,\n ref: Ref,\n) => (\n \n \n \n \n \n \n \n \n)\nconst ForwardRef = forwardRef(SvgNavigation)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgNotes = (props: SVGProps, ref: Ref) => (\n \n \n \n \n)\nconst ForwardRef = forwardRef(SvgNotes)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgPause = (props: SVGProps, ref: Ref) => (\n \n \n \n)\nconst ForwardRef = forwardRef(SvgPause)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgPayment = (\n props: SVGProps,\n ref: Ref,\n) => (\n \n \n \n)\nconst ForwardRef = forwardRef(SvgPayment)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgPencilEdit = (\n props: SVGProps,\n ref: Ref,\n) => (\n \n \n \n \n)\nconst ForwardRef = forwardRef(SvgPencilEdit)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgPencil = (props: SVGProps, ref: Ref) => (\n \n \n \n)\nconst ForwardRef = forwardRef(SvgPencil)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgPerson = (props: SVGProps, ref: Ref) => (\n \n \n \n)\nconst ForwardRef = forwardRef(SvgPerson)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgPhonePad = (\n props: SVGProps,\n ref: Ref,\n) => (\n \n \n \n)\nconst ForwardRef = forwardRef(SvgPhonePad)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgPlay = (props: SVGProps, ref: Ref) => (\n \n \n \n)\nconst ForwardRef = forwardRef(SvgPlay)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgPlaylist = (\n props: SVGProps,\n ref: Ref,\n) => (\n \n \n \n)\nconst ForwardRef = forwardRef(SvgPlaylist)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgPlus = (props: SVGProps, ref: Ref) => (\n \n \n \n)\nconst ForwardRef = forwardRef(SvgPlus)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgReceipt = (\n props: SVGProps,\n ref: Ref,\n) => (\n \n \n \n)\nconst ForwardRef = forwardRef(SvgReceipt)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgReload = (props: SVGProps, ref: Ref) => (\n \n \n \n)\nconst ForwardRef = forwardRef(SvgReload)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgScan = (props: SVGProps, ref: Ref) => (\n \n \n \n)\nconst ForwardRef = forwardRef(SvgScan)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgSearch = (props: SVGProps, ref: Ref) => (\n \n \n \n)\nconst ForwardRef = forwardRef(SvgSearch)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgSetting = (\n props: SVGProps,\n ref: Ref,\n) => (\n \n \n \n \n)\nconst ForwardRef = forwardRef(SvgSetting)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgSettingsAdjust = (\n props: SVGProps,\n ref: Ref,\n) => (\n \n \n \n)\nconst ForwardRef = forwardRef(SvgSettingsAdjust)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgSnow = (props: SVGProps, ref: Ref) => (\n \n \n \n)\nconst ForwardRef = forwardRef(SvgSnow)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgSoda = (props: SVGProps, ref: Ref) => (\n \n \n \n \n)\nconst ForwardRef = forwardRef(SvgSoda)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgSortBy = (props: SVGProps, ref: Ref) => (\n \n \n \n \n)\nconst ForwardRef = forwardRef(SvgSortBy)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgSortDown = (\n props: SVGProps,\n ref: Ref,\n) => (\n \n \n \n)\nconst ForwardRef = forwardRef(SvgSortDown)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgSortUpDown = (\n props: SVGProps,\n ref: Ref,\n) => (\n \n \n \n)\nconst ForwardRef = forwardRef(SvgSortUpDown)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgSortUp = (props: SVGProps, ref: Ref) => (\n \n \n \n)\nconst ForwardRef = forwardRef(SvgSortUp)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgSquareCheck = (\n props: SVGProps,\n ref: Ref,\n) => (\n \n \n \n \n \n \n \n \n)\nconst ForwardRef = forwardRef(SvgSquareCheck)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgStatements = (\n props: SVGProps,\n ref: Ref,\n) => (\n \n \n \n \n)\nconst ForwardRef = forwardRef(SvgStatements)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgThreeDots = (\n props: SVGProps,\n ref: Ref,\n) => (\n \n \n \n \n \n \n \n \n)\nconst ForwardRef = forwardRef(SvgThreeDots)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgTransactions = (\n props: SVGProps,\n ref: Ref,\n) => (\n \n \n \n \n \n \n \n \n)\nconst ForwardRef = forwardRef(SvgTransactions)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgTrash = (props: SVGProps, ref: Ref) => (\n \n \n \n \n)\nconst ForwardRef = forwardRef(SvgTrash)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgTv = (props: SVGProps, ref: Ref) => (\n \n \n \n \n)\nconst ForwardRef = forwardRef(SvgTv)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgUnlink = (props: SVGProps, ref: Ref) => (\n \n \n \n)\nconst ForwardRef = forwardRef(SvgUnlink)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgUserCross = (\n props: SVGProps,\n ref: Ref,\n) => (\n \n \n \n \n)\nconst ForwardRef = forwardRef(SvgUserCross)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgUser = (props: SVGProps, ref: Ref) => (\n \n \n \n)\nconst ForwardRef = forwardRef(SvgUser)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgUsers = (props: SVGProps, ref: Ref) => (\n \n \n \n \n)\nconst ForwardRef = forwardRef(SvgUsers)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgX = (props: SVGProps, ref: Ref) => (\n \n \n \n)\nconst ForwardRef = forwardRef(SvgX)\nexport default ForwardRef\n","import * as React from 'react'\nimport * as AccordionPrimitive from '@radix-ui/react-accordion'\n\nimport { cn } from '@/lib/utils'\n\nimport { ChevronDown } from '../icons/outline'\n\nconst Accordion = AccordionPrimitive.Root\n\nconst AccordionItem = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef\n>(({ className, ...props }, ref) => (\n \n))\nAccordionItem.displayName = 'AccordionItem'\n\nconst AccordionTrigger = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef\n>(({ className, children, ...props }, ref) => (\n \n svg]:rotate-180',\n className,\n )}\n {...props}\n >\n {children}\n \n \n \n))\nAccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName\n\nconst AccordionContent = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef\n>(({ className, children, ...props }, ref) => (\n \n
{children}
\n \n))\n\nAccordionContent.displayName = AccordionPrimitive.Content.displayName\n\nexport { Accordion, AccordionItem, AccordionTrigger, AccordionContent }\n","export const slideFromLeftAnimation = {\n hidden: {\n opacity: 0,\n x: -50,\n },\n visible: {\n opacity: 1,\n x: 0,\n },\n exit: {\n opacity: 0,\n x: 50,\n transition: {\n ease: 'easeOut',\n },\n },\n}\n\nexport const slideInFromBottomAnimation = {\n hidden: {\n opacity: 0,\n y: 50,\n },\n visible: {\n opacity: 1,\n y: 0,\n },\n exit: {\n opacity: 0,\n y: 50,\n transition: {\n ease: 'easeOut',\n },\n },\n}\n","export function getFirstLetter(name?: string) {\n return name?.charAt(0).toUpperCase() ?? ''\n}\n\nexport function getFirstLetters(name?: string) {\n return (\n name\n ?.split(' ')\n .map((n) => n.charAt(0).toUpperCase())\n .slice(0, 2)\n .join('') ?? ''\n )\n}\n\nexport function getFullName({\n firstName,\n lastName,\n secondLastName,\n}: {\n firstName?: string | null\n lastName?: string | null\n secondLastName?: string | null\n} = {}) {\n const initials = [firstName, lastName, secondLastName].filter(Boolean)\n\n return initials.join(' ')\n}\n\nexport function maskValue(value: string, repeat = 4) {\n const lastFour = value.slice(-4)\n\n return '• '.repeat(repeat) + lastFour\n}\n\nexport function intersperse(\n arr: (string | React.ReactNode)[],\n sep: string | React.ReactNode = ', ',\n) {\n const filteredArr = arr.filter(\n (item) => item !== null && item !== undefined && item !== '',\n )\n\n if (filteredArr.length === 0) {\n return []\n }\n\n return filteredArr.slice(1).reduce(\n function (xs, x) {\n if (Array.isArray(xs)) {\n return xs.concat([sep, x])\n }\n\n return [xs, sep, x]\n },\n [filteredArr[0]],\n )\n}\n\nexport function slugify(str?: string) {\n if (!str) {\n return ''\n }\n\n return str\n .replace(/^\\s+|\\s+$/g, '')\n .toLowerCase()\n .replace(/[^a-z0-9 -]/g, '')\n .replace(/[^a-z0-9 -]/g, '')\n .replace(/\\s+/g, '-')\n .replace(/-+/g, '-')\n}\n\nexport function nonEmptyString(str?: string | null) {\n if (str && str !== '') {\n return str\n }\n\n return null\n}\n","import * as React from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\n\nimport { cn } from '@/lib/utils'\n\nconst typographyVariants = cva('', {\n variants: {\n variant: {\n h1: 'text-7xl font-bold',\n h2: '',\n h3: 'text-2xl md:text-2.5xl font-bold',\n h4: 'text-2xl font-bold',\n h5: '',\n h6: '',\n body: 'text-sm',\n 'body-small': 'text-xs',\n 'body-tiny': 'text-[0.625rem]',\n 'body-base': 'text-base',\n button: 'text-base font-bold',\n },\n bold: {\n true: 'font-semibold',\n },\n text: {\n right: 'text-right',\n left: 'text-left',\n center: 'text-center',\n },\n },\n defaultVariants: {\n variant: 'body',\n bold: false,\n text: 'left',\n },\n})\n\nexport type TypographyVariant =\n | 'h1'\n | 'h2'\n | 'h3'\n | 'h4'\n | 'h5'\n | 'h6'\n | 'body'\n | 'button'\n | 'body-small'\n | 'body-base'\n | 'body-tiny'\n\nconst variantsMapping: Record = {\n h1: 'h1',\n h2: 'h2',\n h3: 'h3',\n h4: 'h4',\n h5: 'h5',\n h6: 'h6',\n body: 'p',\n 'body-small': 'p',\n 'body-base': 'p',\n 'body-tiny': 'p',\n button: 'p',\n}\n\nexport interface TypographyProps\n extends React.ButtonHTMLAttributes,\n VariantProps {\n bold?: boolean\n}\n\nexport const Typography = React.forwardRef(\n ({ bold, className, text, variant, ...props }, ref) => {\n const Comp: React.ElementType = variant ? variantsMapping[variant] : 'p'\n\n return (\n \n )\n },\n)\n\nTypography.displayName = 'Button'\n","import { forwardRef } from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\n\nimport { getFirstLetters } from '@/lib/typography'\nimport { cn } from '@/lib/utils'\n\nimport { Typography, TypographyVariant } from './Typography'\n\nconst textVariant: Record, TypographyVariant> = {\n sm: 'body-tiny',\n md: 'body-tiny',\n lg: 'body',\n xl: 'h4',\n}\n\nconst avatarVariants = cva(\n 'relative flex shrink-0 items-center justify-center bg-neutral-gray-100',\n {\n variants: {\n size: {\n xl: 'size-14',\n lg: 'size-9',\n md: 'size-6',\n sm: 'size-5',\n },\n variant: {\n neutral: 'bg-neutral-gray-100',\n 'dark-neutral': 'bg-neutral-gray-200',\n primary: 'bg-primary-light',\n 'primary-dark': 'bg-primary',\n dark: 'bg-neutral-gray-800',\n },\n shape: {\n square: 'rounded-lg',\n circle: 'rounded-full',\n },\n },\n defaultVariants: {\n size: 'lg',\n variant: 'neutral',\n shape: 'circle',\n },\n },\n)\n\ninterface AvatarProps extends VariantProps {\n name?: string\n icon?: React.ReactNode\n className?: string\n}\n\nexport type AvatarVariant = VariantProps['variant']\nexport type AvatarSize = VariantProps['size']\nexport type AvatarShape = VariantProps['shape']\n\nexport const Avatar = forwardRef(\n ({ name, icon, size, variant, className, shape }, ref) => {\n return (\n \n {icon ? (\n
\n {icon}\n
\n ) : name ? (\n \n {getFirstLetters(name)}\n \n ) : null}\n \n )\n },\n)\n\nAvatar.displayName = 'Avatar'\n","import * as React from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\n\nimport { cn } from '@/lib/utils'\n\nconst badgeVariants = cva(\n 'inline-flex items-center rounded-xl border h-5 px-2 text-xs uppercase transition-colors whitespace-nowrap focus:outline-hidden focus:ring-1 focus:ring-ring focus:ring-offset-2',\n {\n variants: {\n variant: {\n default:\n 'border-transparent bg-primary/20 text-primary-dark hover:bg-primary/20',\n destructive:\n 'border-transparent bg-primary-error/10 text-primary-error hover:bg-primary-error/20',\n neutral:\n 'border-transparent bg-neutral-gray-100 text-neutral-gray-800 hover:bg-neutral-gray-200',\n 'dark-neutral':\n 'border-transparent bg-neutral-gray-200 text-neutral-gray-800 hover:bg-neutral-gray-200',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n },\n)\n\nexport interface BadgeProps\n extends React.HTMLAttributes,\n VariantProps {}\n\nfunction Badge({ className, variant, ...props }: BadgeProps) {\n return (\n
\n )\n}\n\nexport { Badge }\n","import * as React from 'react'\nimport { Slot } from '@radix-ui/react-slot'\n\nimport { cn } from '@/lib/utils'\n\nimport { ChevronRight } from '../icons/outline'\n\nconst Breadcrumb = React.forwardRef<\n HTMLElement,\n React.ComponentPropsWithoutRef<'nav'> & {\n separator?: React.ReactNode\n }\n>(({ ...props }, ref) =>
\n )\n }\n\n return (\n \n \n {title}\n {column.getIsSorted() === 'desc' ? (\n \n ) : column.getIsSorted() === 'asc' ? (\n \n ) : (\n \n )}\n \n \n )\n}\n","import * as React from 'react'\n\nimport { parseInputDate } from '@/lib/date'\nimport { cn } from '@/lib/utils'\n\nimport { X } from '../icons/outline'\n\nimport { Button, Input } from '.'\n\nexport interface DateInputProps\n extends Omit<\n React.InputHTMLAttributes,\n 'onChange' | 'value'\n > {\n onClear?: () => void\n onChange: (value: string) => void\n value: string\n}\n\nexport const DateInput = React.forwardRef(\n ({ className, ...props }, ref) => {\n return (\n
\n {\n const formatted = parseInputDate(e.target.value)\n\n props.onChange(formatted)\n }}\n />\n\n {props.onClear && props.value.length > 0 ? (\n \n \n \n ) : null}\n
\n )\n },\n)\n\nDateInput.displayName = 'DateInput'\n","import * as React from 'react'\nimport { useState } from 'react'\nimport {\n format,\n getMonth,\n getYear,\n isValid,\n parse,\n setMonth,\n setYear,\n} from 'date-fns'\nimport { useIntl } from 'react-intl'\nimport { useRifm } from 'rifm'\n\nimport { getMonthsNames } from '@/lib/date'\nimport { cn } from '@/lib/utils'\n\nimport { Calendar as CalendarIcon } from '../icons/outline'\n\nimport {\n AnimatedFormLabel,\n Button,\n Calendar,\n FormControl,\n Input,\n Popover,\n PopoverContent,\n PopoverTrigger,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '.'\n\nconst YEAR_RANGE = 20\n\nconst START_YEAR = 1900\nconst END_YEAR = new Date().getFullYear() + YEAR_RANGE\n\nexport interface DatePickerInputProps\n extends Omit<\n React.InputHTMLAttributes,\n 'onChange' | 'value'\n > {\n onClear?: () => void\n onChange: (value: string) => void\n value: string\n}\n\nconst formatDate = (string: string) => {\n const digits = (string.match(/\\d/g) || []).join('')\n const chars = digits.split('')\n\n return chars\n .reduce(\n (r, v, index) => (index === 1 || index === 3 ? `${r}${v}/` : `${r}${v}`),\n '',\n )\n .substring(0, 10)\n}\n\nexport const DatePickerInput = React.forwardRef<\n HTMLInputElement,\n DatePickerInputProps\n>(({ className, ...props }, ref) => {\n const intl = useIntl()\n const [date, setDate] = useState(new Date())\n const [selectedDate, setSelectedDate] = useState(undefined)\n\n const [openCalendar, setOpenCalendar] = useState(false)\n\n const rifm = useRifm({\n accept: /[\\d]/g,\n value: props.value,\n mask: 10 < props.value.length,\n format: formatDate,\n onChange: props.onChange,\n })\n\n const months = getMonthsNames(intl.locale)\n\n const years = Array.from(\n { length: END_YEAR - START_YEAR + 1 },\n (_, i) => START_YEAR + i,\n )\n\n const handleMonthChange = (month: string) => {\n const newDate = setMonth(date, months.indexOf(month))\n setDate(newDate)\n }\n\n const handleYearChange = (year: string) => {\n const newDate = setYear(date, parseInt(year))\n setDate(newDate)\n }\n\n return (\n
\n \n {\n rifm.onChange(e)\n\n const parsedDate = parse(e.target.value, 'dd/MM/yyyy', new Date())\n\n if (isValid(parsedDate)) {\n setSelectedDate(parsedDate)\n setDate(parsedDate)\n } else {\n setSelectedDate(undefined)\n setDate(new Date())\n }\n }}\n />\n \n\n {props.placeholder}\n\n \n \n \n \n \n \n \n
\n \n \n \n \n \n {months.map((month) => (\n \n {month}\n \n ))}\n \n \n \n \n \n \n \n {years.map((year) => (\n \n {year}\n \n ))}\n \n \n
\n\n {\n if (!value) {\n return\n }\n\n const parsedDate = format(value, 'dd/MM/yyyy')\n\n props.onChange(formatDate(parsedDate))\n\n setSelectedDate(value)\n\n setOpenCalendar(false)\n }}\n initialFocus\n />\n
\n
\n
\n )\n})\n\nDatePickerInput.displayName = 'DatePickerInput'\n","import { useIntl } from 'react-intl'\nimport { toast } from 'sonner'\n\nexport function useCopyToClipboard() {\n const intl = useIntl()\n\n const copyToClipboard = async (text: string) => {\n try {\n await navigator.clipboard.writeText(text)\n } catch (err) {\n console.error(err)\n\n toast.error(\n intl.formatMessage({\n id: 'toast.error.copy.message',\n defaultMessage: 'Failed to copy to clipboard',\n }),\n { duration: 1000 },\n )\n }\n\n toast.success(\n intl.formatMessage({\n id: 'toast.success.copy.message',\n defaultMessage: 'Copied to clipboard',\n }),\n { duration: 1000 },\n )\n }\n\n return copyToClipboard\n}\n","import { cn } from '@/lib/utils'\n\nexport function Skeleton({\n className,\n ...props\n}: React.HTMLAttributes) {\n return (\n \n )\n}\n","import { ReactNode, useState } from 'react'\nimport { useIntl } from 'react-intl'\n\nimport { useCopyToClipboard } from '@/hooks/useCopyToClipboard'\nimport { maskValue } from '@/lib/typography'\nimport { cn } from '@/lib/utils'\n\nimport { Copy, Eye, EyeOff } from '../icons/outline'\n\nimport { Button, Card, Typography } from '.'\nimport { Skeleton } from './Skeleton'\n\ntype Props = {\n align?: 'start' | 'end' | 'center'\n children: ReactNode\n className?: string\n}\n\nconst Details = ({ align, children, className }: Props) => {\n return (\n \n {children}\n \n )\n}\n\nconst Label = ({ children }: Props) => {\n return {children}\n}\n\ntype ValueProps = {\n children: ReactNode\n masked?: boolean\n copyable?: boolean\n className?: string\n}\n\nconst Value = ({ children, className, masked, copyable }: ValueProps) => {\n const intl = useIntl()\n const [hide, setHide] = useState(masked)\n const copyTextToClipboard = useCopyToClipboard()\n\n if (typeof children === 'string') {\n return (\n
\n copyTextToClipboard(children) : undefined}\n >\n {hide ? maskValue(children.toString()) : children}\n \n {masked ? (\n setHide((h) => !h)}\n aria-label={\n hide\n ? intl.formatMessage({\n defaultMessage: 'Show value',\n id: 'action.showValue',\n })\n : intl.formatMessage({\n defaultMessage: 'Hide value',\n id: 'action.hideValue',\n })\n }\n type=\"button\"\n >\n {hide ? : }\n \n ) : null}\n {copyable ? (\n copyTextToClipboard(children)}\n variant=\"ghost\"\n size=\"inline\"\n type=\"button\"\n aria-label={intl.formatMessage({\n defaultMessage: 'Copy value',\n id: 'action.copyValue',\n })}\n >\n \n \n ) : null}\n
\n )\n }\n\n return {children}\n}\n\nconst DetailsSkeleton = () => {\n return \n}\n\nconst DetailsLoader = ({ rows = 3 }: { rows?: number }) => {\n return (\n \n {Array.from({ length: rows }).map((_, index) => (\n
\n \n \n
\n ))}\n
\n )\n}\n\nDetails.Label = Label\nDetails.Value = Value\nDetails.Skeleton = DetailsSkeleton\nDetails.Loader = DetailsLoader\n\nexport { Details }\n","import * as React from 'react'\nimport * as DialogPrimitive from '@radix-ui/react-dialog'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { FormattedMessage } from 'react-intl'\n\nimport { cn } from '@/lib/utils'\n\nimport { X } from '../icons/outline'\n\nimport { Typography } from '.'\n\nconst Dialog = DialogPrimitive.Root\n\nconst DialogTrigger = DialogPrimitive.Trigger\n\nconst DialogPortal = DialogPrimitive.Portal\n\nconst DialogClose = DialogPrimitive.Close\n\nconst dialogContentVariants = cva(\n 'fixed left-[50%] top-[50%] z-50 grid w-[90%] max-w-lg translate-x-[-50%] translate-y-[-50%] rounded-xl bg-white p-6 shadow-lg sm:rounded-lg',\n {\n variants: {\n variant: {\n default:\n 'duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-bottom-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-bottom-[48%] sm:max-w-[425px]',\n fullscreen:\n 'bg-neutral-gray-100 max-w-screen overflow-y-auto h-screen w-screen duration-200 px-6 pt-28 data-[state=open]:fade-in-0 data-[state=closed]:animate-out data-[state=closed]:zoom-out data-[state=closed]:fade-out-50',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n },\n)\n\nconst DialogOverlay = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef & {\n className?: string\n }\n>(({ className, ...props }, ref) => (\n \n))\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName\n\nconst DialogContent = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef &\n VariantProps & {\n className?: string\n hideCloseButton?: boolean\n hideCloseButtonOnDesktop?: boolean\n }\n>(\n (\n {\n hideCloseButtonOnDesktop = true,\n hideCloseButton,\n className,\n children,\n variant,\n ...props\n },\n ref,\n ) => {\n return (\n \n \n\n \n {hideCloseButton ? null : (\n <>\n \n \n \n \n \n \n
\n \n )}\n {children}\n \n \n )\n },\n)\nDialogContent.displayName = DialogPrimitive.Content.displayName\n\nconst DialogHeader = ({\n className,\n ...props\n}: React.HTMLAttributes & {\n className?: string\n}) => (\n \n)\nDialogHeader.displayName = 'DialogHeader'\n\nconst DialogFooter = ({\n className,\n ...props\n}: React.HTMLAttributes & {\n className?: string\n}) => (\n \n)\nDialogFooter.displayName = 'DialogFooter'\n\nconst DialogTitle = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef & {\n className?: string\n }\n>(({ className, children, ...props }, ref) => (\n \n {children}\n \n))\nDialogTitle.displayName = DialogPrimitive.Title.displayName\n\nconst DialogDescription = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef & {\n className?: string\n }\n>(({ className, children, ...props }, ref) => (\n \n {children}\n \n))\nDialogDescription.displayName = DialogPrimitive.Description.displayName\n\nconst DialogActions = ({\n className,\n children,\n}: {\n children: React.ReactNode\n className?: string\n}) =>
{children}
\nDialogActions.displayName = 'DialogActions'\n\nexport {\n Dialog,\n DialogPortal,\n DialogOverlay,\n DialogClose,\n DialogTrigger,\n DialogContent,\n DialogHeader,\n DialogFooter,\n DialogTitle,\n DialogDescription,\n DialogActions,\n}\n","import * as React from 'react'\nimport * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu'\n\nimport { cn } from '@/lib/utils'\n\nimport { Check, CheckCircle } from '../icons/outline'\n\nconst DropdownMenu = DropdownMenuPrimitive.Root\n\nconst DropdownMenuTrigger = DropdownMenuPrimitive.Trigger\n\nconst DropdownMenuGroup = DropdownMenuPrimitive.Group\n\nconst DropdownMenuPortal = DropdownMenuPrimitive.Portal\n\nconst DropdownMenuSub = DropdownMenuPrimitive.Sub\n\nconst DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup\n\nconst DropdownMenuSubTrigger = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef & {\n inset?: boolean\n className?: string\n }\n>(({ className, inset, children, ...props }, ref) => (\n \n {children}\n \n))\nDropdownMenuSubTrigger.displayName =\n DropdownMenuPrimitive.SubTrigger.displayName\n\nconst DropdownMenuSubContent = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef & {\n className?: string\n }\n>(({ className, ...props }, ref) => (\n \n))\nDropdownMenuSubContent.displayName =\n DropdownMenuPrimitive.SubContent.displayName\n\nconst DropdownMenuContent = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef & {\n sideOffset?: number\n className?: string\n }\n>(({ className, sideOffset = 4, ...props }, ref) => (\n \n \n \n))\nDropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName\n\nconst DropdownMenuItem = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef & {\n inset?: boolean\n className?: string\n }\n>(({ className, inset, ...props }, ref) => (\n \n))\nDropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName\n\nconst DropdownMenuCheckboxItem = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef & {\n checked?: boolean\n className?: string\n }\n>(({ className, children, checked, ...props }, ref) => (\n \n \n \n \n \n \n {children}\n \n))\nDropdownMenuCheckboxItem.displayName =\n DropdownMenuPrimitive.CheckboxItem.displayName\n\nconst DropdownMenuRadioItem = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef & {\n className?: string\n }\n>(({ className, children, ...props }, ref) => (\n \n \n \n \n \n \n {children}\n \n))\nDropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName\n\nconst DropdownMenuLabel = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef & {\n inset?: boolean\n className?: string\n }\n>(({ className, inset, ...props }, ref) => (\n \n))\nDropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName\n\nconst DropdownMenuSeparator = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef & {\n className?: string\n }\n>(({ className, ...props }, ref) => (\n \n))\nDropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName\n\nconst DropdownMenuShortcut = ({\n className,\n ...props\n}: React.HTMLAttributes & {\n className?: string\n}) => {\n return (\n \n )\n}\nDropdownMenuShortcut.displayName = 'DropdownMenuShortcut'\n\nexport {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuGroup,\n DropdownMenuPortal,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuRadioGroup,\n}\n","import { CountryCode, CountryTaxId } from '@/types/country'\n\nimport { TeamState } from '../features/Team/types'\n\nimport { Permission } from './permissions'\nimport { Role } from './roles'\n\nexport enum BusinessState {\n ACTIVE = 'ACTIVE',\n ONBOARDING = 'ONBOARDING',\n}\n\nexport type UserIdentity = {\n identityId: string\n businessId: string\n}\n\nexport type Identity = {\n id: string\n email: string\n state: 'ACTIVE'\n firstName: string\n secondLastName?: string\n lastName: string\n phoneNumber?: {\n internationalPhonePrefix: string\n localPhoneNumber: string\n }\n}\n\nexport type BusinessIdentity = {\n id: string\n legalName: string\n countryOfIncorporation: CountryCode\n addressCity: string | null\n addressMunicipality?: string | null\n addressNeighborhood?: string | null\n addressPostalCode?: string | null\n addressState?: string | null\n addressStreet?: string | null\n addressStreetNumber?: string | null\n dateOfIncorporation?: string | null\n taxId: string\n taxIdType: CountryTaxId\n state: BusinessState\n}\n\nexport type BusinessUser = {\n id: string\n businessId: string\n identityId: string\n email: string\n userTitle?: string\n firstName: string\n lastName: string\n secondLastName?: string\n state: TeamState\n role: Role\n permissions: Permission[]\n}\n","export enum Feature {\n HOME = 'home',\n ACCOUNTS = 'accounts',\n RECIPIENTS = 'recipients',\n TRANSACTIONS = 'transactions',\n TEAM = 'team',\n TASKS = 'tasks',\n ACTIONS = 'actions',\n SETTINGS = 'settings',\n\n // BE Features\n CONTRACTORS = 'CONTRACTORS',\n CARDS = 'CARDS',\n}\n\nexport type Features = {\n features: Feature[]\n}\n","import { Currency } from '@/constants/currency'\n\nexport enum PaymentLimitType {\n DAILY = 'DAILY',\n WEEKLY = 'WEEKLY',\n MONTHLY = 'MONTHLY',\n YEARLY = 'YEARLY',\n}\n\nexport type PaymentLimit = {\n businessId: string\n periodTransferLimit?: {\n limitType: PaymentLimitType\n limitAmount: number\n usedAmount: number\n limitCurrency: Currency\n periodStartDate: string\n periodResetDate: string\n }\n}\n","export enum Permission {\n TEAM_MANAGEMENT = 'TEAM_MANAGEMENT',\n REQUEST_APPROVALS = 'REQUEST_APPROVALS',\n CARDS_MANAGEMENT = 'CARDS_MANAGEMENT',\n TRANSFERS = 'TRANSFERS',\n CARDS_ACCESS = 'CARDS_ACCESS',\n READ_ACCESS = 'READ_ACCESS',\n}\n","export enum Role {\n ADMIN = 'ADMIN',\n PAYMENT_OPS = 'PAYMENT_OPS',\n CARD_USER = 'CARD_USER',\n READ_ONLY = 'READ_ONLY',\n}\n","import { defineMessage, defineMessages, MessageDescriptor } from 'react-intl'\n\nimport { Permission } from '@/domains/Business/types'\n\ntype MessageBody = {\n defaultMessage: string\n id: string\n}\n\nexport type DefineMessages =\n Record\n\nexport const backendErrorMessages: DefineMessages = defineMessages({\n OTP_EXPIRED: {\n defaultMessage: 'Your verification code has expired',\n id: 'error.backend.otp.expired',\n },\n VERIFICATION_CODE_EXPIRED: {\n defaultMessage: 'Your verification link has expired',\n id: 'error.backend.verificationCode.expired',\n },\n PASSWORD_CHANGE_FORBIDDEN: {\n defaultMessage: 'Unable to change password',\n id: 'error.backend.passwordChange.forbidden',\n },\n GENERATE_OTP_FORBIDDEN: {\n defaultMessage: 'Unable to generate one time password',\n id: 'error.backend.generateOtp.forbidden',\n },\n VERIFY_OTP_FORBIDDEN: {\n defaultMessage:\n 'Unable to verify one time password. You have {attempt, plural, =0 {} one {# attempt} other {# attempts}} left before being locked out',\n id: 'error.backend.verifyOtp.forbidden',\n },\n UNABLE_TO_AUTHORIZE: {\n defaultMessage: 'You have entered an incorrect username or password',\n id: 'error.backend.unableToAuthorize',\n },\n EMPTY_FILE_ERROR: {\n defaultMessage: 'File can not be empty',\n id: 'error.backend.emptyFile',\n },\n INVALID_FILE_EXTENSION_ERROR: {\n defaultMessage: 'This file extension is not supported',\n id: 'error.backend.invalidFileExtension',\n },\n FILE_ALREADY_EXIST_ERROR: {\n defaultMessage: 'This file has already been uploaded',\n id: 'error.backend.fileAlreadyExist',\n },\n MISSING_FILES_ERROR: {\n defaultMessage: 'Some required files are missing',\n id: 'error.backend.missingFiles',\n },\n UNSUCCESSFUL_UPLOAD_ERROR: {\n defaultMessage: 'Some files were not correctly uploaded',\n id: 'error.backend.unsuccessfulUpload',\n },\n BENEFICIARY_ALREADY_EXISTS: {\n defaultMessage: 'Beneficiary already exists',\n id: 'error.backend.beneficiaryAlreadyExists',\n },\n NOT_ENOUGH_BALANCE: {\n defaultMessage: 'Not enough balance',\n id: 'error.backend.notEnoughBalance',\n },\n TOO_LOW_WITHDRAW_AMOUNT: {\n defaultMessage: 'Amount is too low to withdraw',\n id: 'error.backend.tooLowWithdrawAmount',\n },\n ONE_TIME_PASSWORD_REQUIRED: {\n defaultMessage:\n 'This action requires verification code. Please check your e-mail',\n id: 'error.backend.oneTimePasswordRequired',\n },\n INVALID_ROUTING_NUMBER: {\n defaultMessage: 'Invalid ABA / routing number',\n id: 'error.backend.invalidRoutingNumber',\n },\n INVALID_PHONE_NUMBER: {\n defaultMessage: 'Phone number is not correct',\n id: 'error.backend.invalidPhoneNumber',\n },\n INVALID_EMAIL: {\n defaultMessage: 'Email is not correct',\n id: 'error.backend.invalidEmail',\n },\n NOT_ELIGIBLE_FOR_SIGNUP: {\n defaultMessage: 'Not eligible for signup',\n id: 'error.backend.notEligibleForSignup',\n },\n UNABLE_TO_CREATE_ACCOUNT: {\n defaultMessage: 'Unable to create account',\n id: 'error.backend.unableToCreateAccount',\n },\n VERIFICATION_FAILED: {\n defaultMessage: 'Unable to verify account',\n id: 'error.backend.verificationFailed',\n },\n TAX_ID_INVALID: {\n defaultMessage: 'Tax ID is invalid',\n id: 'error.backend.taxIdInvalid',\n },\n TAX_ID_TYPE_INVALID: {\n defaultMessage: 'Tax ID type is invalid',\n id: 'error.backend.taxIdTypeInvalid',\n },\n COUNTRY_OF_INCORPORATION_NOT_SUPPORTED: {\n defaultMessage: 'Country of incorporation is not supported',\n id: 'error.backend.countryOfIncorporationNotSupported',\n },\n FORBIDDEN_ACTION: {\n defaultMessage: 'This action is forbidden',\n id: 'error.backend.forbiddenAction',\n },\n BULK_PAYMENTS_FILE_ALREADY_UPLOADED: {\n defaultMessage:\n 'File with this name was already uploaded. Please rename your file',\n id: 'error.backend.bulkPayments.fileAlreadyUploaded',\n },\n BULK_PAYMENTS_CSV_EMPTY_ERROR: {\n defaultMessage:\n 'Unable to retrieve information from the CSV file. Please ensure that your CSV contains headers from the template and at least 1 row with data',\n id: 'error.backend.bulkPayments.csvEmptyError',\n },\n DUPLICATE_BENEFICIAL_OWNER: {\n defaultMessage: 'Such beneficial owner already exists!',\n id: 'error.backend.duplicateBeneficialOwner',\n },\n MISSING_BENEFICIAL_OWNER_DOCUMENTS: {\n defaultMessage: 'Missing beneficial owner documents',\n id: 'error.backend.missingBeneficialOwnerDocuments',\n },\n INVALID_ACCOUNT_NUMBER_ERROR: {\n defaultMessage: 'Account number is not valid!',\n id: 'error.backend.invalidAccountNumber',\n },\n BUSINESS_USER_ALREADY_EXISTS_ERROR: {\n defaultMessage: 'User already exists',\n id: 'error.backend.businessUserAlreadyExists',\n },\n IDENTITY_LOCKED_ERROR: {\n defaultMessage:\n \"Your account is locked. You've reached the maximum number of access attempts. Please reset your password\",\n id: 'error.backend.accountIsLocked',\n },\n INSUFFICIENT_FUNDS_TO_ORDER_CARD_ERROR: {\n defaultMessage:\n 'The account that was selected has insufficient funds to order a physical card',\n id: 'error.backend.insufficientFundsToOrderCard',\n },\n MAX_NUMBER_OF_CARDS_REACHED_ERROR: {\n defaultMessage:\n 'Maximum number of cards reached. If you need additional cards, please contact support',\n id: 'error.backend.maxNumberOfCardsReached',\n },\n INVITATION_EXPIRED_ERROR: {\n defaultMessage:\n 'The invitation link has expired. Please reach out to your company admin to request a new one',\n id: 'error.backend.invitationExpired',\n },\n INVOICE_PENDING_GENERATION_ERROR: {\n defaultMessage:\n 'Your invoice is currently being generated. This process may take a few moments. Please try again later',\n id: 'error.backend.invoicePendingGeneration',\n },\n})\n\nexport const errorMessages: DefineMessages = defineMessages({\n 'validation.email.invalid': {\n defaultMessage: 'Must be a valid email',\n id: 'validation.email.invalid',\n },\n 'validation.email.required': {\n defaultMessage: 'Email is required',\n id: 'validation.email.required',\n },\n 'validation.password.required': {\n defaultMessage: 'Password is required',\n id: 'validation.password.required',\n },\n 'validation.password.minLength': {\n defaultMessage: 'Password must be at least 12 characters',\n id: 'validation.password.minLength',\n },\n 'validation.password.upperCase': {\n defaultMessage: 'Password must contain at least one uppercase character',\n id: 'validation.password.upperCase',\n },\n 'validation.password.lowerCase': {\n defaultMessage: 'Password must contain at least one lowercase character',\n id: 'validation.password.lowerCase',\n },\n 'validation.password.hasNumber': {\n defaultMessage: 'Password must contain at least one number',\n id: 'validation.password.hasNumber',\n },\n 'validation.password.hasSpecialCharacter': {\n defaultMessage: 'Password must contain at least one special character',\n id: 'validation.password.hasSpecialCharacter',\n },\n 'validation.confirmPassword.required': {\n defaultMessage: 'Confirm password is required',\n id: 'validation.confirmPassword.required',\n },\n 'validation.password.match': {\n defaultMessage: 'Passwords must match',\n id: 'validation.confirmPassword.match',\n },\n\n 'validation.generic.error': {\n defaultMessage: 'Something went wrong. Please try again',\n id: 'validation.generic.error',\n },\n 'validation.firstName.required': {\n defaultMessage: 'Please provide your first name',\n id: 'validation.firstName.required',\n },\n 'validation.lastName.required': {\n defaultMessage: 'Please provide your last name',\n id: 'validation.lastName.required',\n },\n 'validation.phoneCode.required': {\n defaultMessage: 'Please select your phone code',\n id: 'validation.phoneCode.required',\n },\n 'validation.phoneNumber.required': {\n defaultMessage: 'Please provide your phone number',\n id: 'validation.phoneNumber.required',\n },\n 'validation.phoneNumber.invalid': {\n defaultMessage: 'Please provide a valid phone number',\n id: 'validation.phoneNumber.invalid',\n },\n 'validation.terms.required': {\n defaultMessage:\n \"Only the company's legal representatives can open the account\",\n id: 'validation.terms.required',\n },\n 'validation.legalName.required': {\n defaultMessage: 'Please provide your legal name',\n id: 'validation.legalName.required',\n },\n 'validation.nickname.required': {\n defaultMessage: 'Please provide a nickname',\n id: 'validation.nickname.required',\n },\n 'validation.country.required': {\n defaultMessage: 'Please select a country',\n id: 'validation.country.required',\n },\n 'validation.taxId.required': {\n defaultMessage: 'Please provide your tax ID',\n id: 'validation.taxId.required',\n },\n 'validation.taxId.length': {\n defaultMessage: 'Tax ID must be 12 characters',\n id: 'validation.taxId.length',\n },\n 'validation.taxId.invalid': {\n defaultMessage: 'Please provide a valid tax ID',\n id: 'validation.taxId.invalid',\n },\n 'validation.taxId.type': {\n defaultMessage: 'Please provide your tax ID type',\n id: 'validation.taxId.type',\n },\n 'validation.otp.required': {\n defaultMessage: 'Verification code is required',\n id: 'validation.opt.required',\n },\n 'validation.otp.length': {\n defaultMessage: 'Verification code must be 6 characters long',\n id: 'validation.otp.length',\n },\n 'validation.balance.insufficient': {\n defaultMessage: 'Insufficient balance',\n id: 'validation.balance.insufficient',\n },\n 'validation.balance.MXN.min': {\n defaultMessage: 'Minimum amount: 50 MXN',\n id: 'validation.balance.MXN.min',\n },\n 'validation.balance.USDC.min': {\n defaultMessage: 'Minimum amount: 1 USDc',\n id: 'validation.balance.USDC.min',\n },\n 'validation.balance.dolarPay.min': {\n defaultMessage: 'Minimum amount: 0.01 USDc',\n id: 'validation.balance.dolarPay.min',\n },\n 'validation.MEX.maxLength': {\n defaultMessage: 'Payment message must be less or equal to 40 characters',\n id: 'validation.MEX.maxLength',\n },\n 'validation.USA.maxLength': {\n defaultMessage: 'Payment message must be less or equal to 255 characters',\n id: 'validation.USA.maxLength',\n },\n 'validation.accountName.required': {\n defaultMessage: 'Name is required',\n id: 'validation.accountName.required',\n },\n 'validation.accountName.exists': {\n defaultMessage: 'Name already in use',\n id: 'validation.accountName.exists',\n },\n 'validation.clabe.invalid': {\n defaultMessage: 'Please provide a valid CLABE',\n id: 'validation.clabe.invalid',\n },\n 'validation.paymentMethod.required': {\n defaultMessage: 'Please select a payment method',\n id: 'validation.paymentMethod.required',\n },\n 'validation.accountNumber.required': {\n defaultMessage: 'Please provide an account number',\n id: 'validation.accountNumber.required',\n },\n 'validation.routingNumber.required': {\n defaultMessage: 'Please provide an ABA / routing number',\n id: 'validation.routingNumber.required',\n },\n 'validation.addressStreet.required': {\n defaultMessage: 'Please provide an address',\n id: 'validation.addressStreet.required',\n },\n 'validation.addressStreetNumber.required': {\n defaultMessage: 'Please provide a street number',\n id: 'validation.addressStreetNumber.required',\n },\n 'validation.addressDistrict.required': {\n defaultMessage: 'Please provide a neighborhood or district',\n id: 'validation.addressDistrict.required',\n },\n 'validation.addressCity.required': {\n defaultMessage: 'Please provide a city',\n id: 'validation.addressCity.required',\n },\n 'validation.addressCountry.required': {\n defaultMessage: 'Please provide a country',\n id: 'validation.addressCountry.required',\n },\n 'validation.addressState.required': {\n defaultMessage: 'Please provide a state',\n id: 'validation.addressState.required',\n },\n 'validation.addressZipCode.required': {\n defaultMessage: 'Please provide a postal code',\n id: 'validation.addressZipCode.required',\n },\n 'validation.file.wrongFormat': {\n defaultMessage: 'This file format is not supported',\n id: 'validation.file.wrongFormat',\n },\n 'validation.cvs.transactions.required': {\n defaultMessage: 'Please select at least one transaction',\n id: 'validation.cvs.transactions.required',\n },\n 'validation.dateOfIncorporation.notMatchingRFC': {\n defaultMessage: 'Does not match RFC',\n id: 'validation.dateOfIncorporation.notMatchingRFC',\n },\n 'validation.dateOfIncorporation.invalidDate': {\n defaultMessage: 'Please provide a valid date',\n id: 'validation.dateOfIncorporation.invalidDate',\n },\n 'validation.dateOfIncorporation.invalidDateFormat': {\n defaultMessage: 'Please provide a valid date in the format DD/MM/YYYY',\n id: 'validation.dateOfIncorporation.invalidDateFormat',\n },\n 'validation.url.invalid': {\n defaultMessage: 'Please provide a valid URL',\n id: 'validation.url.invalid',\n },\n 'validation.cardNumber.required': {\n defaultMessage: 'Please provide a card number',\n id: 'validation.cardNumber.required',\n },\n 'validation.cardNumber.lastFour': {\n defaultMessage: 'Please provide last 4 digits of card number',\n id: 'validation.cardNumber.lastFour',\n },\n 'validation.pin.required': {\n defaultMessage: 'Please provide a 4-digit PIN',\n id: 'validation.pin.required',\n },\n 'validation.balance.minAmount': {\n defaultMessage: 'Amount must be greater than 0',\n id: 'validation.balance.minAmount',\n },\n 'validation.singleTransactionLimit.greaterThanCycleLimit': {\n defaultMessage: 'Cannot be greater than cycle limit',\n id: 'validation.singleTransactionLimit.greaterThanCycleLimit',\n },\n 'validation.pin.match': {\n defaultMessage: 'Pins must match',\n id: 'validation.pin.match',\n },\n 'validation.role.required': {\n defaultMessage: 'Please select a role',\n id: 'validation.role.required',\n },\n 'validation.scopeOfWork.required': {\n defaultMessage: 'Please provide a scope of work',\n id: 'validation.scopeOfWork.required',\n },\n 'validation.startDate.required': {\n defaultMessage: 'Please provide a start date',\n id: 'validation.startDate.required',\n },\n 'validation.dateOfBirth.required': {\n defaultMessage: 'Please provide a date of birth',\n id: 'validation.dateOfBirth.required',\n },\n 'validation.description.max': {\n defaultMessage: 'Description must be less than 1024 characters',\n id: 'validation.description.max',\n },\n 'validation.label.required': {\n defaultMessage: 'Please provide a label',\n id: 'validation.label.required',\n },\n 'validation.otp.invalid': {\n defaultMessage: 'Unable to verify one time password. Please try again',\n id: 'validation.otp.invalid',\n },\n})\n\nexport const passwordMessages: DefineMessages<\n 'minLength' | 'upperCase' | 'lowerCase' | 'hasNumber' | 'hasSpecialCharacter'\n> = defineMessages({\n minLength: {\n defaultMessage: 'At least 12 characters',\n id: 'password.rule.minLength',\n },\n upperCase: {\n defaultMessage: 'At least 1 uppercase character',\n id: 'password.rule.upperCase',\n },\n lowerCase: {\n defaultMessage: 'At least 1 lowercase character',\n id: 'password.rule.lowerCase',\n },\n hasNumber: {\n defaultMessage: 'At least 1 number',\n id: 'password.rule.hasNumber',\n },\n hasSpecialCharacter: {\n defaultMessage: 'At least 1 special character',\n id: 'password.rule.hasSpecialCharacter',\n },\n})\n\nexport const termsMessages: DefineMessages<\n 'terms' | 'dolarAppTerms' | 'dolarAppPrivacy' | 'bridgeTerms'\n> = defineMessages({\n terms: {\n defaultMessage:\n 'By clicking “Save & Continue” you accept the {dolarAppTerms}, {dolarAppPrivacy}, and {bridgeTerms}',\n id: 'signUp.termsAndConditions',\n },\n dolarAppTerms: {\n defaultMessage: 'Terms and Conditions of DolarApp',\n id: 'signUp.dolarApp.terms',\n },\n dolarAppPrivacy: {\n defaultMessage: 'Privacy Policy of DolarApp',\n id: 'signUp.dolarApp.privacy',\n },\n bridgeTerms: {\n defaultMessage: 'Terms of Service and Privacy Policy of Bridge',\n id: 'signUp.bridge.terms',\n },\n})\n\nexport const activityTypesMessages: DefineMessages = defineMessages({\n PRIMARY_SECTOR_AGRICULTURE: {\n defaultMessage: 'Primary Sector • Agriculture',\n id: 'activityTypes.primarySector.agriculture',\n },\n PRIMARY_SECTOR_LIVESTOCK_FARMING: {\n defaultMessage: 'Primary Sector • Livestock farming',\n id: 'activityTypes.primarySector.livestockFarming',\n },\n PRIMARY_SECTOR_EXPLOITATION: {\n defaultMessage:\n 'Primary Sector • Exploitation of Other Animals (Poultry, Beekeeping, etc.)',\n id: 'activityTypes.primarySector.exploitation',\n },\n PRIMARY_SECTOR_FORESTRY: {\n defaultMessage: 'Primary Sector • Forestry',\n id: 'activityTypes.primarySector.forestry',\n },\n PRIMARY_SECTOR_FISHING: {\n defaultMessage: 'Primary Sector • Fishing',\n id: 'activityTypes.primarySector.fishing',\n },\n MINING_MINING_OF_OTHER_RESOURCES: {\n defaultMessage: 'Mining • Mining of other resources',\n id: 'activityTypes.mining.miningOfOtherResources',\n },\n MINING_PETROLEUM_AND_GAS: {\n defaultMessage: 'Mining • Petroleum and Gas Related Activities',\n id: 'activityTypes.mining.petroleumAndGas',\n },\n MINING_GOLD: {\n defaultMessage: 'Mining • Gold',\n id: 'activityTypes.mining.gold',\n },\n MINING_SILVER: {\n defaultMessage: 'Mining • Silver',\n id: 'activityTypes.mining.silver',\n },\n MINING_PRECIOUS_STONES: {\n defaultMessage: 'Mining • Precious Stones',\n id: 'activityTypes.mining.preciousStones',\n },\n ELECTRICITY_WATER_GAS: {\n defaultMessage:\n 'Electricity Generation, Transmission and Distribution, Water and Gas Supply',\n id: 'activityTypes.electricityWaterGas',\n },\n CONSTRUCTION_OTHER_CONSTRUCTION: {\n defaultMessage: 'Construction • Other Construction • Related Activities',\n id: 'activityTypes.construction.otherConstruction',\n },\n CONSTRUCTION_BUILDINGS: {\n defaultMessage: 'Construction • Residential and Non • Residential Building',\n id: 'activityTypes.construction.buildings',\n },\n CONSTRUCTION_CIVIL_ENGINEERING_WORKS: {\n defaultMessage: 'Construction • Civil Engineering Works',\n id: 'activityTypes.construction.civilEngineeringWorks',\n },\n CONSTRUCTION_SPECIALIZED_CONSTRUCTION_WORKS: {\n defaultMessage: 'Construction • Specialized Construction Works',\n id: 'activityTypes.construction.specializedConstructionWorks',\n },\n CONSTRUCTION_ARMORING_SERVICES_FOR_BUILDINGS: {\n defaultMessage:\n 'Construction • Partial or Total Armoring Services for Buildings',\n id: 'activityTypes.construction.armoringServicesForBuildings',\n },\n INDUSTRIALS_FOOD: {\n defaultMessage: 'Industrials • Food',\n id: 'activityTypes.industrials.food',\n },\n INDUSTRIALS_BEVERAGES_AND_TOBACCO: {\n defaultMessage: 'Industrials • Beverages and Tobacco',\n id: 'activityTypes.industrials.beveragesAndTobacco',\n },\n INDUSTRIALS_TEXTILE_PRODUCTS: {\n defaultMessage: 'Industrials • Textile Products',\n id: 'activityTypes.industrials.textileProducts',\n },\n INDUSTRIALS_CLOTHING: {\n defaultMessage: 'Industrials • Clothing',\n id: 'activityTypes.industrials.clothing',\n },\n INDUSTRIALS_WOOD: {\n defaultMessage: 'Industrials • Wood',\n id: 'activityTypes.industrials.wood',\n },\n INDUSTRIALS_PAPER: {\n defaultMessage: 'Industrials • Paper',\n id: 'activityTypes.industrials.paper',\n },\n INDUSTRIALS_PRINTING_AND_RELATED_INDUSTRIES: {\n defaultMessage: 'Industrials • Printing and Related Industries',\n id: 'activityTypes.industrials.printingAndRelatedIndustries',\n },\n INDUSTRIALS_PETROLEUM_AND_COAL: {\n defaultMessage: 'Industrials • Petroleum and Coal Derivative Products',\n id: 'activityTypes.industrials.petroleumAndCoal',\n },\n INDUSTRIALS_CHEMICALS: {\n defaultMessage: 'Industrials • Chemicals',\n id: 'activityTypes.industrials.chemicals',\n },\n INDUSTRIALS_PLASTIC_AND_RUBBER: {\n defaultMessage: 'Industrials • Plastic and Rubber',\n id: 'activityTypes.industrials.plasticAndRubber',\n },\n INDUSTRIALS_MINERAL_BASED_PRODUCTS: {\n defaultMessage:\n 'Industrials • Non•Metallic Mineral • Based Products (Pottery, Porcelain, Glass, Cement)',\n id: 'activityTypes.industrials.mineralBasedProducts',\n },\n INDUSTRIALS_BASIC_METALS: {\n defaultMessage: 'Industrials • Basic Metals',\n id: 'activityTypes.industrials.basicMetals',\n },\n INDUSTRIALS_METAL_PRODUCTS: {\n defaultMessage:\n 'Industrials • Metal Products (Tools, Utensils, Structures, Parts)',\n id: 'activityTypes.industrials.metalProducts',\n },\n INDUSTRIALS_MACHINERY_AND_EQUIPMENT: {\n defaultMessage: 'Industrials • Machinery and Equipment',\n id: 'activityTypes.industrials.machineryAndEquipment',\n },\n INDUSTRIALS_COMPUTING_AND_ELECTRONIC_EQUIPMENT: {\n defaultMessage:\n 'Industrials • Computing, Communication, Measurement and Other Electronic Equipment, Components and Accessories',\n id: 'activityTypes.industrials.computingAndElectronicEquipment',\n },\n INDUSTRIALS_ELECTRICAL_ACCESSORIES: {\n defaultMessage:\n 'Industrials • Electrical Accessories, Appliances and Electric Power Generation Equipment',\n id: 'activityTypes.industrials.electricalAccessories',\n },\n INDUSTRIALS_NON_MOTORIZED_TRANSPORT_EQUIPMENT: {\n defaultMessage: 'Industrials • Non•Motorized Transport Equipment',\n id: 'activityTypes.industrials.nonMotorizedTransportEquipment',\n },\n INDUSTRIALS_AUTOMOTIVE: {\n defaultMessage: 'Industrials • Automotive',\n id: 'activityTypes.industrials.automotive',\n },\n INDUSTRIALS_ARMORED_VEHICLES_AND_EQUIPMENT: {\n defaultMessage:\n 'Industrials • Armored Vehicles and Equipment for Vehicle Armoring',\n id: 'activityTypes.industrials.armoredVehiclesAndEquipment',\n },\n INDUSTRIALS_FURNITURE_MATTRESSES_AND_BLINDS: {\n defaultMessage: 'Industrials • Furniture, Mattresses and Blinds',\n id: 'activityTypes.industrials.furnitureMattressesAndBlinds',\n },\n INDUSTRIALS_OTHER_MANUFACTURING_INDUSTRIES: {\n defaultMessage: 'Industrials • Other Manufacturing Industries',\n id: 'activityTypes.industrials.otherManufacturingIndustries',\n },\n INDUSTRIALS_GOLD_AND_PRECIOUS_JEWELRY: {\n defaultMessage:\n 'Industrials • Gold and Precious Stone Jewelry and Ornaments',\n id: 'activityTypes.industrials.goldAndPreciousJewelry',\n },\n INDUSTRIALS_NON_PRECIOUS_JEWELRY: {\n defaultMessage:\n 'Industrials • Jewelry Made of Non•Precious Metals and Stones and Other Materials',\n id: 'activityTypes.industrials.nonPreciousJewelry',\n },\n COMMERCE_GROCERIES_FOOD_BEVERAGES_AND_TOBACCO: {\n defaultMessage: 'Commerce • Groceries, Food, Beverages, Ice and Tobacco',\n id: 'activityTypes.commerce.groceriesFoodBeveragesAndTobacco',\n },\n COMMERCE_PHARMACEUTICALS_PERFUMERY_HOUSEHOLD_APPLIANCES: {\n defaultMessage:\n 'Commerce • Pharmaceuticals, Perfumery, Leisure Articles, Household Appliances and White Goods',\n id: 'activityTypes.commerce.pharmaceuticalsPerfumeryHouseholdAppliances',\n },\n COMMERCE_AGRICULTURAL_INDUSTRIAL_AND_WASTE_MATERIALS: {\n defaultMessage:\n 'Commerce • Agricultural and Forest Raw Materials, Industrial Materials, and Waste Materials',\n id: 'activityTypes.commerce.agriculturalIndustrialAndWasteMaterials',\n },\n COMMERCE_MACHINERY_COMPUTER_AND_GENERAL_USE_FURNITURE: {\n defaultMessage:\n 'Commerce • Machinery, Computer Equipment and General Use Furniture',\n id: 'activityTypes.commerce.machineryComputerAndGeneralUseFurniture',\n },\n COMMERCE_SELF_SERVICE_AND_DEPARTMENT_STORES: {\n defaultMessage: 'Commerce • Self-Service and Department Stores',\n id: 'activityTypes.commerce.selfServiceAndDepartmentStores',\n },\n COMMERCE_TEXTILES_CLOTHING_ACCESSORIES_AND_FOOTWEAR: {\n defaultMessage:\n 'Commerce • Textiles, Costume Jewelry, Clothing Accessories and Footwear',\n id: 'activityTypes.commerce.textilesClothingAccessoriesAndFootwear',\n },\n COMMERCE_STATIONERY: {\n defaultMessage: 'Commerce • Stationery',\n id: 'activityTypes.commerce.stationery',\n },\n COMMERCE_JEWELRY_AND_WATCHES: {\n defaultMessage: 'Commerce • Jewelry and Watches',\n id: 'activityTypes.commerce.jewelryAndWatches',\n },\n COMMERCE_INTERIOR_DECORATION_ITEMS: {\n defaultMessage: 'Commerce • Interior Decoration Items',\n id: 'activityTypes.commerce.interiorDecorationItems',\n },\n COMMERCE_ANTIQUES_AND_ARTWORK: {\n defaultMessage: 'Commerce • Antiques and Artwork',\n id: 'activityTypes.commerce.antiquesAndArtwork',\n },\n COMMERCE_HARDWARE_PAINTS_AND_GLASS: {\n defaultMessage: 'Commerce • Hardware, Paints and Glass',\n id: 'activityTypes.commerce.hardwarePaintsAndGlass',\n },\n COMMERCE_NEW_VEHICLES: {\n defaultMessage: 'Commerce • New Vehicles',\n id: 'activityTypes.commerce.newVehicles',\n },\n COMMERCE_USED_VEHICLES: {\n defaultMessage: 'Commerce • Used Vehicles',\n id: 'activityTypes.commerce.usedVehicles',\n },\n COMMERCE_VEHICLE_PARTS_AND_ACCESSORIES: {\n defaultMessage: 'Commerce • Vehicle Parts and Accessories',\n id: 'activityTypes.commerce.vehiclePartsAndAccessories',\n },\n COMMERCE_FUELS_AND_LUBRICANTS: {\n defaultMessage: 'Commerce • Fuels and Lubricants',\n id: 'activityTypes.commerce.fuelsAndLubricants',\n },\n COMMERCE_THROUGH_INTERNET_CATALOGS_TELEVISION: {\n defaultMessage:\n 'Commerce • Through Internet, Printed Catalogs, Television and Similar',\n id: 'activityTypes.commerce.throughInternetCatalogsTelevision',\n },\n TRANSPORTATION_AIR: {\n defaultMessage: 'Transportation • Air',\n id: 'activityTypes.transportation.air',\n },\n TRANSPORTATION_RAIL: {\n defaultMessage: 'Transportation • Rail',\n id: 'activityTypes.transportation.rail',\n },\n TRANSPORTATION_MARITIME_AND_FLUVIAL: {\n defaultMessage: 'Transportation • Maritime and Fluvial',\n id: 'activityTypes.transportation.maritimeAndFluvial',\n },\n TRANSPORTATION_LAND: {\n defaultMessage: 'Transportation • Land',\n id: 'activityTypes.transportation.land',\n },\n TRANSPORTATION_PIPELINE_TRANSPORT_AND_DISTRIBUTION: {\n defaultMessage: 'Transportation • Pipeline Transport and Distribution',\n id: 'activityTypes.transportation.pipelineTransportAndDistribution',\n },\n TRANSPORTATION_TRANSPORT_RELATED_SERVICES: {\n defaultMessage: 'Transportation • Transport Related Services',\n id: 'activityTypes.transportation.transportRelatedServices',\n },\n TRANSPORTATION_CUSTOMS_AGENCY_SERVICES: {\n defaultMessage: 'Transportation • Customs Agency Services',\n id: 'activityTypes.transportation.customsAgencyServices',\n },\n TRANSPORTATION_TRANSPORT_AND_CUSTODY_OF_VALUES_SERVICES: {\n defaultMessage:\n 'Transportation • Transport and/or Custody of Values Services',\n id: 'activityTypes.transportation.transportAndCustodyOfValuesServices',\n },\n POSTAL_SERVICES: {\n defaultMessage: 'Postal Services',\n id: 'activityTypes.postalServices',\n },\n COURIER_AND_PARCEL_SERVICES: {\n defaultMessage: 'Courier and Parcel Services',\n id: 'activityTypes.courierAndParcelServices',\n },\n STORAGE_SERVICES: {\n defaultMessage: 'Storage Services',\n id: 'activityTypes.storageServices',\n },\n MASS_MEDIA_INFORMATION: {\n defaultMessage: 'Mass Media Information',\n id: 'activityTypes.massMedia.information',\n },\n ELECTRONIC_INFORMATION_PROCESSING_AND_WEB_SERVICES: {\n defaultMessage: 'Electronic Information Processing and Other Web Services',\n id: 'activityTypes.electronicInformationProcessingAndWebServices',\n },\n FINANCIAL_SERVICES_CENTRAL_BANK: {\n defaultMessage: 'Financial Services • Central Bank',\n id: 'activityTypes.financialServices.centralBank',\n },\n FINANCIAL_SERVICES_MULTIPLE_BANKING: {\n defaultMessage: 'Financial Services • Multiple Banking',\n id: 'activityTypes.financialServices.multipleBanking',\n },\n FINANCIAL_SERVICES_DEVELOPMENT_BANKING: {\n defaultMessage: 'Financial Services • Development Banking',\n id: 'activityTypes.financialServices.developmentBanking',\n },\n FINANCIAL_SERVICES_FINANCIAL_FUNDS_AND_TRUSTS: {\n defaultMessage: 'Financial Services • Financial Funds and Trusts',\n id: 'activityTypes.financialServices.financialFundsAndTrusts',\n },\n FINANCIAL_SERVICES_CREDIT_UNIONS: {\n defaultMessage: 'Financial Services • Credit Unions',\n id: 'activityTypes.financialServices.creditUnions',\n },\n FINANCIAL_SERVICES_POPULAR_SAVINGS_BANKS: {\n defaultMessage: 'Financial Services • Popular Savings Banks',\n id: 'activityTypes.financialServices.popularSavingsBanks',\n },\n FINANCIAL_SERVICES_OTHER_NON_STOCK_FINANCIAL_AND_CREDIT_INSTITUTIONS: {\n defaultMessage:\n 'Financial Services • Other Non•Stock Financial Intermediaries and Credit Institutions',\n id: 'activityTypes.financialServices.otherNonStockFinancialAndCreditInstitutions',\n },\n FINANCIAL_SERVICES_OTHER_SAVINGS_AND_LOAN_INSTITUTIONS: {\n defaultMessage: 'Financial Services • Other Savings and Loan Institutions',\n id: 'activityTypes.financialServices.otherSavingsAndLoanInstitutions',\n },\n FINANCIAL_SERVICES_SELF_FINANCING_COMPANIES: {\n defaultMessage: 'Financial Services • Self-Financing Companies',\n id: 'activityTypes.financialServices.selfFinancingCompanies',\n },\n FINANCIAL_SERVICES_MUTUAL_AID_SOCIETIES: {\n defaultMessage: 'Financial Services • Mutual Aid Societies',\n id: 'activityTypes.financialServices.mutualAidSocieties',\n },\n FINANCIAL_SERVICES_PAWNSHOPS: {\n defaultMessage: 'Financial Services • Pawnshops',\n id: 'activityTypes.financialServices.pawnshops',\n },\n FINANCIAL_SERVICES_MULTIPLE_OBJECT_FINANCIAL_COMPANIES: {\n defaultMessage: 'Financial Services • Multiple Object Financial Companies',\n id: 'activityTypes.financialServices.multipleObjectFinancialCompanies',\n },\n FINANCIAL_SERVICES_STOCK_EXCHANGE_HOUSES: {\n defaultMessage: 'Financial Services • Stock Exchange Houses',\n id: 'activityTypes.financialServices.stockExchangeHouses',\n },\n FINANCIAL_SERVICES_EXCHANGE_HOUSES_AND_FOREIGN_EXCHANGE_CENTERS: {\n defaultMessage:\n 'Financial Services • Exchange Houses and Foreign Exchange Centers',\n id: 'activityTypes.financialServices.exchangeHousesAndForeignExchangeCenters',\n },\n FINANCIAL_SERVICES_MONEY_TRANSMITTERS: {\n defaultMessage: 'Financial Services • Money Transmitters',\n id: 'activityTypes.financialServices.moneyTransmitters',\n },\n FINANCIAL_SERVICES_OTHER_SERVICES_RELATED_TO_STOCK_EXCHANGE_INTERMEDIATION: {\n defaultMessage:\n 'Financial Services • Other Services Related to Stock Exchange Intermediation',\n id: 'activityTypes.financialServices.otherServicesRelatedToStockExchangeIntermediation',\n },\n FINANCIAL_SERVICES_INSURANCE_COMPANIES: {\n defaultMessage: 'Financial Services • Insurance Companies',\n id: 'activityTypes.financialServices.insuranceCompanies',\n },\n FINANCIAL_SERVICES_SURETY_COMPANIES: {\n defaultMessage: 'Financial Services • Surety Companies',\n id: 'activityTypes.financialServices.suretyCompanies',\n },\n FINANCIAL_SERVICES_INSURANCE_AND_SURETY_AGENTS_ADJUSTERS_AND_MANAGERS: {\n defaultMessage:\n 'Financial Services • Insurance and Surety Agents, Adjusters and Managers',\n id: 'activityTypes.financialServices.insuranceAndSuretyAgentsAdjustersAndManagers',\n },\n FINANCIAL_SERVICES_PENSION_FUND_MANAGEMENT: {\n defaultMessage: 'Financial Services • Pension Fund Management',\n id: 'activityTypes.financialServices.pensionFundManagement',\n },\n FINANCIAL_SERVICES_TRAVELERS_CHEQUES_ISSUANCE: {\n defaultMessage: `Financial Services • Traveler's Cheques Issuance and/or Marketing`,\n id: 'activityTypes.financialServices.travelersChequesIssuance',\n },\n OTHER_NON_FINANCIAL_CREDIT_INTERMEDIATION_COMPANIES: {\n defaultMessage: 'Other Non-Financial Credit Intermediation Companies',\n id: 'activityTypes.otherNonFinancialCreditIntermediationCompanies',\n },\n REAL_ESTATE_AND_RENTAL_SERVICES_WITHOUT_INTERMEDIATION: {\n defaultMessage:\n 'Real Estate and Rental Services • Real Estate Rental without Intermediation',\n id: 'activityTypes.realEstateAndRentalServices.withoutIntermediation',\n },\n REAL_ESTATE_AND_RENTAL_SERVICES_AGENCIES_AND_BROKERS: {\n defaultMessage:\n 'Real Estate and Rental Services • Real Estate Agencies and Brokers',\n id: 'activityTypes.realEstateAndRentalServices.agenciesAndBrokers',\n },\n REAL_ESTATE_AND_RENTAL_SERVICES_FOR_MOVABLE_PROPERTY_EXCEPT_VEHICLES: {\n defaultMessage:\n 'Real Estate and Rental Services • Rental Services for Movable Property Except Vehicles',\n id: 'activityTypes.realEstateAndRentalServices.forMovablePropertyExceptVehicles',\n },\n REAL_ESTATE_AND_RENTAL_SERVICES_VEHICLE_RENTAL: {\n defaultMessage: 'Real Estate and Rental Services • Vehicle Rental',\n id: 'activityTypes.realEstateAndRentalServices.vehicleRental',\n },\n REAL_ESTATE_AND_RENTAL_SERVICES_FOR_PATENTS_AND_FRANCHISES: {\n defaultMessage:\n 'Real Estate and Rental Services • Rental Services for Registered Trademarks, Patents, and Franchises',\n id: 'activityTypes.realEstateAndRentalServices.forPatentsAndFranchises',\n },\n PROFESSIONAL_AND_TECHNICAL_SERVICES_LEGAL: {\n defaultMessage: 'Professional and Technical Services • Legal Services',\n id: 'activityTypes.professionalAndTechnicalServices.legal',\n },\n PROFESSIONAL_AND_TECHNICAL_SERVICES_BROKERAGE: {\n defaultMessage:\n 'Professional and Technical Services • Notary and Public Brokerage Services',\n id: 'activityTypes.professionalAndTechnicalServices.brokerage',\n },\n PROFESSIONAL_AND_TECHNICAL_SERVICES_ACCOUNTING_AND_AUDITING: {\n defaultMessage:\n 'Professional and Technical Services • Accounting and Auditing Services',\n id: 'activityTypes.professionalAndTechnicalServices.accountingAndAuditing',\n },\n PROFESSIONAL_AND_TECHNICAL_SERVICES_ARCHITECTURE_ENGINEERING: {\n defaultMessage:\n 'Professional and Technical Services • Architecture, Engineering, and Related Activities',\n id: 'activityTypes.professionalAndTechnicalServices.architectureEngineering',\n },\n PROFESSIONAL_AND_TECHNICAL_SERVICES_COMPUTER_SYSTEMS_DESIGN: {\n defaultMessage:\n 'Professional and Technical Services • Computer Systems Design and Related Services',\n id: 'activityTypes.professionalAndTechnicalServices.computerSystemsDesign',\n },\n PROFESSIONAL_AND_TECHNICAL_SERVICES_SCIENTIFIC_AND_TECHNICAL_CONSULTING: {\n defaultMessage:\n 'Professional and Technical Services • Administrative, Scientific, and Technical Consulting',\n id: 'activityTypes.professionalAndTechnicalServices.scientificAndTechnicalConsulting',\n },\n PROFESSIONAL_AND_TECHNICAL_SERVICES_SCIENTIFIC_RESEARCH_AND_DEVELOPMENT: {\n defaultMessage:\n 'Professional and Technical Services • Scientific Research and Development',\n id: 'activityTypes.professionalAndTechnicalServices.scientificResearchAndDevelopment',\n },\n PROFESSIONAL_AND_TECHNICAL_SERVICES_ADVERTISING_AND_RELATED_ACTIVITIES: {\n defaultMessage:\n 'Professional and Technical Services • Advertising and Related Activities',\n id: 'activityTypes.professionalAndTechnicalServices.advertisingAndRelatedActivities',\n },\n PROFESSIONAL_AND_TECHNICAL_SERVICES_OTHER_OUTSOURCING_SERVICES: {\n defaultMessage:\n 'Professional and Technical Services • Other Outsourcing Services',\n id: 'activityTypes.professionalAndTechnicalServices.otherOutsourcingServices',\n },\n BUSINESS_SUPPORT_SERVICES_BUSINESS_MANAGEMENT_SERVICES: {\n defaultMessage: 'Business Support Services • Business Management Services',\n id: 'activityTypes.businessSupportServices.businessManagementServices',\n },\n BUSINESS_SUPPORT_SERVICES_COLLECTION_AGENCIES_INVESTIGATION_AGENCIES: {\n defaultMessage:\n 'Business Support Services • Collection Agencies, Investigation Agencies',\n id: 'activityTypes.businessSupportServices.collectionAgenciesInvestigationAgencies',\n },\n BUSINESS_SUPPORT_SERVICES_PROTECTION_AND_SECURITY_SERVICES: {\n defaultMessage:\n 'Business Support Services • Protection and Security Services',\n id: 'activityTypes.businessSupportServices.protectionAndSecurityServices',\n },\n BUSINESS_SUPPORT_SERVICES_CLEANING_AND_MAINTENANCE_SERVICES: {\n defaultMessage:\n 'Business Support Services • Cleaning and Maintenance Services',\n id: 'activityTypes.businessSupportServices.cleaningAndMaintenanceServices',\n },\n BUSINESS_SUPPORT_SERVICES_OTHER_SERVICES: {\n defaultMessage: 'Business Support Services • Other Services',\n id: 'activityTypes.businessSupportServices.otherServices',\n },\n EDUCATIONAL_SERVICES: {\n defaultMessage: 'Educational Services',\n id: 'activityTypes.educationalServices',\n },\n HEALTH_AND_SOCIAL_ASSISTANCE_SERVICES: {\n defaultMessage: 'Health and Social Assistance Services',\n id: 'activityTypes.healthAndSocialAssistanceServices',\n },\n CULTURAL_AND_SPORTS_RECREATION_SERVICES: {\n defaultMessage:\n 'Cultural and Sports Recreation Services and Other Recreational Services',\n id: 'activityTypes.culturalAndSportsRecreationServices',\n },\n RECREATION_SERVICES_MUSEUMS_AND_SIMILAR_ATTRACTIONS: {\n defaultMessage:\n 'Recreation Services • Museums, Historic Sites, Zoos, and Similar Attractions',\n id: 'activityTypes.recreationServices.museumsAndSimilarAttractions',\n },\n RECREATION_SERVICES_ELECTRONIC_GAMING_HOUSES: {\n defaultMessage: 'Recreation Services • Electronic Gaming Houses',\n id: 'activityTypes.recreationServices.electronicGamingHouses',\n },\n RECREATION_SERVICES_CASINOS_OR_BETTING_CENTERS: {\n defaultMessage: 'Recreation Services • Casinos or Betting Centers',\n id: 'activityTypes.recreationServices.casinosOrBettingCenters',\n },\n RECREATION_SERVICES_LOTTERY_TICKETS_AND_DRAWS: {\n defaultMessage:\n 'Recreation Services • Sale of Lottery Tickets, Sports Forecasts or Other Draws',\n id: 'activityTypes.recreationServices.lotteryTicketsAndDraws',\n },\n TEMPORARY_ACCOMMODATION_AND_FOOD_AND_BEVERAGE_PREPARATION_SERVICES: {\n defaultMessage:\n 'Temporary Accommodation and Food and Beverage Preparation Services',\n id: 'activityTypes.temporaryAccommodationAndFoodAndBeveragePreparationServices',\n },\n REPAIR_AND_MAINTENANCE_SERVICES: {\n defaultMessage:\n 'Repair and Maintenance Services • Industrial, Commercial, Service and Automotive Equipment',\n id: 'activityTypes.repairAndMaintenanceServices',\n },\n PERSONAL_FUNERAL_PARKING_PHOTO_SERVICES: {\n defaultMessage:\n 'Personal Services • Laundries, Funeral Services, Public Baths, Parking Services, Photo Developing and Printing',\n id: 'activityTypes.personal.funeralParkingPhotoServices',\n },\n ASSOCIATIONS_PRODUCERS_TRADERS_AND_SERVICE_PROVIDERS_ORGANIZATIONS: {\n defaultMessage:\n 'Associations • Producers, Traders, and Service Providers Organizations',\n id: 'activityTypes.associations.producersTradersAndServiceProvidersOrganizations',\n },\n ASSOCIATIONS_LABOR_AND_UNION_ORGANIZATIONS: {\n defaultMessage: 'Associations • Labor and Union Organizations',\n id: 'activityTypes.associations.laborAndUnionOrganizations',\n },\n ASSOCIATIONS_PROFESSIONAL_ORGANIZATIONS: {\n defaultMessage: 'Associations • Professional Organizations',\n id: 'activityTypes.associations.professionalOrganizations',\n },\n ASSOCIATIONS_RECREATIONAL_ACTIVITIES_ORGANIZATIONS: {\n defaultMessage: 'Associations • Recreational Activities Organizations',\n id: 'activityTypes.associations.recreationalActivitiesOrganizations',\n },\n ASSOCIATIONS_RELIGIOUS_ORGANIZATIONS: {\n defaultMessage: 'Associations • Religious Organizations',\n id: 'activityTypes.associations.religiousOrganizations',\n },\n ASSOCIATIONS_POLITICAL_ORGANIZATIONS: {\n defaultMessage: 'Associations • Political Organizations',\n id: 'activityTypes.associations.politicalOrganizations',\n },\n ASSOCIATIONS_CIVIL_ORGANIZATIONS: {\n defaultMessage: 'Associations • Civil Organizations',\n id: 'activityTypes.associations.civilOrganizations',\n },\n INTERNATIONAL_AND_EXTRATERRITORIAL_ORGANIZATIONS: {\n defaultMessage: 'International and Extraterritorial Organizations',\n id: 'activityTypes.internationalAndExtraterritorialOrganizations',\n },\n PUBLIC_SECTOR_FEDERAL_EXECUTIVE_POWER: {\n defaultMessage: 'Public Sector • Federal Executive Power',\n id: 'activityTypes.publicSector.federalExecutivePower',\n },\n PUBLIC_SECTOR_STATE_AND_FEDERAL_DISTRICT_EXECUTIVE_POWER: {\n defaultMessage:\n 'Public Sector • State and Federal District Executive Power',\n id: 'activityTypes.publicSector.stateAndFederalDistrictExecutivePower',\n },\n PUBLIC_SECTOR_MUNICIPAL_AND_DELEGATIONAL_EXECUTIVE_POWER: {\n defaultMessage:\n 'Public Sector • Municipal and Delegational Executive Power',\n id: 'activityTypes.publicSector.municipalAndDelegationalExecutivePower',\n },\n PUBLIC_SECTOR_FEDERAL_JUDICIAL_POWER: {\n defaultMessage: 'Public Sector • Federal Judicial Power',\n id: 'activityTypes.publicSector.federalJudicialPower',\n },\n PUBLIC_SECTOR_STATE_AND_FEDERAL_DISTRICT_JUDICIAL_POWER: {\n defaultMessage: 'Public Sector • State and Federal District Judicial Power',\n id: 'activityTypes.publicSector.stateAndFederalDistrictJudicialPower',\n },\n PUBLIC_SECTOR_FEDERAL_LEGISLATIVE_POWER: {\n defaultMessage: 'Public Sector • Federal Legislative Power',\n id: 'activityTypes.publicSector.federalLegislativePower',\n },\n PUBLIC_SECTOR_STATE_AND_FEDERAL_DISTRICT_LEGISLATIVE_POWER: {\n defaultMessage:\n 'Public Sector • State and Federal District Legislative Power',\n id: 'activityTypes.publicSector.stateAndFederalDistrictLegislativePower',\n },\n PUBLIC_SECTOR_AUTONOMOUS_BODIES_AND_PARA_STATE_ENTITIES: {\n defaultMessage: 'Public Sector • Autonomous Bodies and Para-State Entities',\n id: 'activityTypes.publicSector.autonomousBodiesAndParaStateEntities',\n },\n})\n\nexport const sourceOfFundsMessages: Record = {\n BUSINESS_LOANS: defineMessage({\n id: 'sourceOfFunds.businessLoans',\n defaultMessage: 'Business loans',\n }),\n BUSINESS_REVENUE: defineMessage({\n id: 'sourceOfFunds.businessRevenue',\n defaultMessage: 'Business revenue',\n }),\n EQUITY_FUNDING: defineMessage({\n id: 'sourceOfFunds.equityFunding',\n defaultMessage: 'Equity funding',\n }),\n GRANTS: defineMessage({\n id: 'sourceOfFunds.grants',\n defaultMessage: 'Grants',\n }),\n INVESTMENT_PROCEEDS: defineMessage({\n id: 'sourceOfFunds.investmentProceeds',\n defaultMessage: 'Investment proceeds',\n }),\n LEGAL_SETTLEMENT: defineMessage({\n id: 'sourceOfFunds.legalSettlement',\n defaultMessage: 'Legal settlement',\n }),\n RETIREMENT_PENSION: defineMessage({\n id: 'sourceOfFunds.retirementPension',\n defaultMessage: 'Retirement pension',\n }),\n SALE_OF_ASSETS: defineMessage({\n id: 'sourceOfFunds.saleOfAssets',\n defaultMessage: 'Sale of assets',\n }),\n TAX_REFUND: defineMessage({\n id: 'sourceOfFunds.taxRefund',\n defaultMessage: 'Tax refund',\n }),\n THIRD_PARTY_FUNDS: defineMessage({\n id: 'sourceOfFunds.thirdPartyFunds',\n defaultMessage: 'Third party funds',\n }),\n}\n\nexport const teamPermissionsMessages: Record<\n Permission,\n Record<'title' | 'description', MessageDescriptor>\n> = {\n [Permission.TEAM_MANAGEMENT]: {\n title: defineMessage({\n id: 'team.permissions.teamManagement',\n defaultMessage: 'Team management',\n }),\n description: defineMessage({\n id: 'team.permissions.teamManagement.description',\n defaultMessage: 'Can invite, block, edit and delete team members',\n }),\n },\n [Permission.REQUEST_APPROVALS]: {\n title: defineMessage({\n id: 'team.permissions.approveRequests',\n defaultMessage: 'Approve requests',\n }),\n description: defineMessage({\n id: 'team.permissions.approveRequests.description',\n defaultMessage: 'Can approve new recipients and money transfers',\n }),\n },\n [Permission.CARDS_MANAGEMENT]: {\n title: defineMessage({\n id: 'team.permissions.cardsCreation',\n defaultMessage: 'Cards creation',\n }),\n description: defineMessage({\n id: 'team.permissions.cardsCreation.description',\n defaultMessage:\n 'Can create corporate cards for them and other team members',\n }),\n },\n [Permission.TRANSFERS]: {\n title: defineMessage({\n id: 'team.permissions.moneyMovement',\n defaultMessage: 'Money movement',\n }),\n description: defineMessage({\n id: 'team.permissions.moneyMovement.description',\n defaultMessage: 'Can make or request money transfers',\n }),\n },\n [Permission.CARDS_ACCESS]: {\n title: defineMessage({\n id: 'team.permissions.cardsAccess',\n defaultMessage: 'Cards access',\n }),\n description: defineMessage({\n id: 'team.permissions.cardsAccess.description',\n defaultMessage: 'Can be granted and manage their own corporate cards',\n }),\n },\n [Permission.READ_ACCESS]: {\n title: defineMessage({\n id: 'team.permissions.readingPermissions',\n defaultMessage: 'Reading permissions',\n }),\n description: defineMessage({\n id: 'team.permissions.readingPermissions.description',\n defaultMessage: 'Can access the entire account as viewer',\n }),\n },\n}\n\nexport const contractorPaymentsFailReasons: Record =\n {\n NOT_ENOUGH_BALANCE: defineMessage({\n id: 'contractor.payment.failReason.notEnoughBalance',\n defaultMessage: 'Insufficient balance',\n }),\n } as const\n","import * as React from 'react'\nimport * as LabelPrimitive from '@radix-ui/react-label'\nimport { Slot } from '@radix-ui/react-slot'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { motion } from 'framer-motion'\nimport {\n Controller,\n ControllerProps,\n FieldPath,\n FieldValues,\n FormProvider,\n useFormContext,\n} from 'react-hook-form'\nimport { useIntl } from 'react-intl'\n\nimport { errorMessages } from '@/constants/messages'\nimport { cn } from '@/lib/utils'\nimport { Input, Label } from '@/shared/ui'\n\nconst Form = FormProvider\n\ntype FormFieldContextValue<\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath = FieldPath,\n> = {\n name: TName\n}\n\nconst FormFieldContext = React.createContext(\n {} as FormFieldContextValue,\n)\n\nconst FormField = <\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath = FieldPath,\n>({\n ...props\n}: ControllerProps) => {\n return (\n \n \n \n )\n}\n\nconst useFormField = () => {\n const fieldContext = React.useContext(FormFieldContext)\n const itemContext = React.useContext(FormItemContext)\n const { getFieldState, formState } = useFormContext()\n\n const fieldState = getFieldState(fieldContext.name, formState)\n\n if (!fieldContext) {\n throw new Error('useFormField should be used within ')\n }\n\n const { id } = itemContext\n\n return {\n id,\n name: fieldContext.name,\n formItemId: `${id}-form-item`,\n formDescriptionId: `${id}-form-item-description`,\n formMessageId: `${id}-form-item-message`,\n ...fieldState,\n }\n}\n\ntype FormItemContextValue = {\n id: string\n}\n\nconst FormItemContext = React.createContext(\n {} as FormItemContextValue,\n)\n\nconst FormItem = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes & { className?: string }\n>(({ className, ...props }, ref) => {\n const id = React.useId()\n\n return (\n \n
\n \n )\n})\nFormItem.displayName = 'FormItem'\n\nconst MotionFormItem = motion(FormItem)\n\nconst FormLabel = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef & {\n className?: string\n }\n>(({ children, className, ...props }, ref) => {\n const intl = useIntl()\n const { error, formItemId } = useFormField()\n\n const getChildren = () => {\n if (error?.message && errorMessages[String(error.message)]) {\n try {\n return intl.formatMessage(errorMessages[String(error.message)])\n } catch (e) {\n console.error('unhandled validation message', e)\n return String(error.message)\n }\n }\n\n return children\n }\n\n return (\n \n {getChildren()}\n \n )\n})\n\nFormLabel.displayName = 'FormLabel'\n\nconst FormInput = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef & {\n className?: string\n }\n>(({ className, ...props }, ref) => {\n const { error } = useFormField()\n\n return (\n \n )\n})\n\nFormInput.displayName = 'FormInput'\n\nconst animatedFormVariants = cva(\n 'absolute peer-focus:w-64 md:w-64 top-4 z-10 transform text-[0.625rem] text-neutral-gray-600 duration-300 peer-placeholder-shown:translate-y-0 peer-placeholder-shown:text-sm peer-focus:text-[0.625rem] peer-placeholder-shown:w-auto',\n {\n variants: {\n align: {\n start: 'start-4 text-left origin-[0]',\n end: '-end-1 right-4 text-right peer-focus:right-4 peer-placeholder-shown:right-4',\n },\n error: {\n true: 'text-primary-error peer-focus:text-primary-error',\n },\n\n size: {\n default:\n 'top-5 -translate-y-3 peer-focus:-translate-y-3 peer-placeholder-shown:top-4 peer-focus:top-5',\n textarea:\n 'top-3 pt-2 -translate-y-3 peer-focus:-translate-y-3 peer-placeholder-shown:top-2 peer-focus:top-5 peer-focus:top-3 peer-focus:pt-2 peer-focus:w-[calc(100%-1rem)] md:w-[calc(100%-1rem)] bg-white',\n '2fa':\n 'top-4 -translate-y-2.5 peer-focus:-translate-y-3.5 peer-placeholder-shown:top-3 peer-focus:top-5',\n },\n },\n defaultVariants: {\n align: 'start',\n size: 'default',\n },\n },\n)\n\nconst AnimatedFormLabel = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef & {\n className?: string\n } & VariantProps\n>(({ align, children, className, size, ...props }, ref) => {\n const intl = useIntl()\n const { error, formItemId } = useFormField()\n\n const getChildren = () => {\n if (error?.message && errorMessages[String(error.message)]) {\n try {\n return intl.formatMessage(errorMessages[String(error.message)])\n } catch (e) {\n console.error('unhandled validation message', e)\n return String(error.message)\n }\n }\n\n return children\n }\n\n return (\n \n {getChildren()}\n \n )\n})\n\nAnimatedFormLabel.displayName = 'AnimatedFormLabel'\n\nconst FormControl = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef\n>(({ ...props }, ref) => {\n const { error, formItemId, formDescriptionId, formMessageId } = useFormField()\n\n return (\n \n )\n})\nFormControl.displayName = 'FormControl'\n\nconst FormDescription = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes & { className?: string }\n>(({ className, ...props }, ref) => {\n const { formDescriptionId } = useFormField()\n\n return (\n \n )\n})\nFormDescription.displayName = 'FormDescription'\n\nconst FormMessage = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes & { className?: string }\n>(({ className, children, ...props }, ref) => {\n const { error, formMessageId } = useFormField()\n const intl = useIntl()\n\n const getChildren = () => {\n if (error?.message && errorMessages[String(error.message)]) {\n try {\n return intl.formatMessage(errorMessages[String(error.message)])\n } catch (e) {\n console.error('unhandled validation message', e)\n return String(error.message)\n }\n }\n\n return children\n }\n\n return (\n \n {getChildren()}\n

\n )\n})\nFormMessage.displayName = 'FormMessage'\n\nexport {\n AnimatedFormLabel,\n Form,\n FormControl,\n FormDescription,\n FormField,\n FormItem,\n FormLabel,\n FormMessage,\n MotionFormItem,\n}\n","import { cn } from '@/lib/utils'\n\ntype Props = {\n children: React.ReactNode\n className?: string\n}\n\nexport const FullScreen = ({ children, className }: Props) => {\n return (\n \n {children}\n \n )\n}\n","import { cva } from 'class-variance-authority'\n\nexport const inputVariants = cva(\n 'placeholder:text-transparent disabled:cursor-not-allowed peer flex w-full rounded-lg bg-white px-4 py-3 pt-5 text-sm file:border-0 file:bg-transparent file:text-sm file:font-medium focus-visible:outline-hidden disabled:bg-neutral-gray-200 disabled:text-neutral-gray-600 [&::-webkit-inner-spin-button]:appearance-none [&::-webkit-outer-spin-button]:appearance-none',\n {\n variants: {\n variant: {\n search:\n 'placeholder:text-neutral-gray-900 bg-neutral-gray-200 rounded-lg pt-0',\n '2fa': 'border border-neutral-gray-100 rounded-lg',\n },\n inputSize: {\n default: 'h-10',\n large: 'h-[54px]',\n medium: 'h-12',\n },\n },\n defaultVariants: {\n inputSize: 'large',\n variant: undefined,\n },\n },\n)\n","import * as React from 'react'\nimport { type VariantProps } from 'class-variance-authority'\n\nimport { cn } from '@/lib/utils'\n\nimport { inputVariants } from './inputVariants'\n\nconst Input = React.forwardRef<\n HTMLInputElement,\n React.InputHTMLAttributes &\n VariantProps\n>(({ inputSize, variant, className, type, ...props }, ref) => {\n return (\n \n )\n})\n\nInput.displayName = 'Input'\n\nexport { Input }\n","import * as React from 'react'\nimport * as LabelPrimitive from '@radix-ui/react-label'\nimport { cva, type VariantProps } from 'class-variance-authority'\n\nimport { cn } from '@/lib/utils'\n\nconst labelVariants = cva(\n 'leading-none text-sm peer-disabled:cursor-not-allowed peer-disabled:text-neutral-gray-400',\n)\n\nexport const Label = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef &\n VariantProps\n>(({ className, ...props }, ref) => (\n \n))\n\nLabel.displayName = 'Label'\n","import { useMemo } from 'react'\nimport * as React from 'react'\nimport { useRifm } from 'rifm'\n\nimport { cn } from '@/lib/utils'\n\nimport { Input } from '.'\n\nconst MAX_INPUT_LENGTH = 18\n\nexport interface MoneyInputProps\n extends Omit, 'onChange'> {\n currency?: string\n locale?: string\n onChange?: (value: string) => void\n}\n\nexport const MoneyInput = React.forwardRef(\n ({ currency, locale = 'en-US', className, ...props }, ref) => {\n const { accept, reverseFormatNumber, format } = useMemo(() => {\n const groupSeparator = ','\n const decimalSeparator = '.'\n\n const formatValue = (value: string) => {\n const [whole, decimal] = value.split('.')\n\n const formattedWhole = new Intl.NumberFormat(\n locale,\n currency\n ? {\n style: 'currency',\n currency,\n maximumFractionDigits: 0,\n }\n : {\n maximumFractionDigits: 0,\n },\n ).format(Number(whole))\n\n if (decimal !== undefined) {\n const limitedDecimal = decimal.substring(0, 2)\n\n return `${formattedWhole}.${limitedDecimal}`\n }\n\n return formattedWhole\n }\n\n return {\n accept: new RegExp(`[\\\\d${decimalSeparator}]`, 'g'),\n reverseFormatNumber: (inputValue: string) => {\n let reversedValue = inputValue\n\n reversedValue = reversedValue.replace(\n new RegExp(`\\\\${groupSeparator}`, 'g'),\n '',\n )\n\n reversedValue = reversedValue.replace(\n new RegExp(`\\\\${decimalSeparator}`, 'g'),\n '.',\n )\n\n reversedValue = reversedValue.replace(/(?:\\..*)\\./g, '')\n reversedValue = reversedValue.replace(/[^\\d.]/g, '')\n\n return reversedValue\n },\n format: (inputValue: string) => {\n return inputValue ? formatValue(inputValue) : ''\n },\n }\n }, [locale, currency])\n\n const rifm = useRifm({\n accept,\n value: format(String(props.value)),\n format: (next) => format(reverseFormatNumber(next)),\n onChange: (next) => props.onChange?.(reverseFormatNumber(next)),\n })\n\n return (\n \n )\n },\n)\n\nMoneyInput.displayName = 'MoneyInput'\n","import { HTMLAttributes } from 'react'\nimport { motion, MotionProps } from 'framer-motion'\n\nimport { cn } from '@/lib/utils'\n\ntype Props = {\n children: React.ReactNode\n className?: string\n} & MotionProps &\n HTMLAttributes\n\nexport const MotionDiv = ({\n children,\n className,\n ...rest\n}: Props & MotionProps) => {\n return (\n \n {children}\n \n )\n}\n","import { HTMLAttributes } from 'react'\nimport { motion, MotionProps } from 'framer-motion'\n\nimport { cn } from '@/lib/utils'\n\ntype Props = {\n children: React.ReactNode\n className?: string\n} & MotionProps &\n HTMLAttributes\n\nexport const MotionSpan = ({\n children,\n className,\n ...rest\n}: Props & MotionProps) => {\n return (\n \n {children}\n \n )\n}\n","import * as React from 'react'\nimport { useMemo } from 'react'\nimport PhoneInput, {\n getCountries,\n getCountryCallingCode,\n Value,\n} from 'react-phone-number-input/input'\n\nimport { Input } from '.'\n\ninterface PhoneNumberInputProps\n extends Omit, 'onChange'> {\n placeholder?: string\n phonePrefix: string\n onChange?: (value: string) => void\n}\n\nexport const PhoneNumberInput = React.forwardRef<\n HTMLInputElement,\n PhoneNumberInputProps\n>(({ placeholder, phonePrefix, className, ...props }, ref) => {\n const country = useMemo(() => {\n return getCountries().find(\n (c) => `+${getCountryCallingCode(c)}` === phonePrefix,\n )\n }, [phonePrefix])\n\n return (\n void}\n country={country}\n international={false}\n inputComponent={Input}\n placeholder={placeholder}\n ref={ref}\n />\n )\n})\n\nPhoneNumberInput.displayName = 'PhoneNumberInput'\n","import * as React from 'react'\nimport * as PopoverPrimitive from '@radix-ui/react-popover'\n\nimport { cn } from '@/lib/utils'\n\nconst Popover = PopoverPrimitive.Root\n\nconst PopoverTrigger = PopoverPrimitive.Trigger\n\nconst PopoverContent = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef & {\n className?: string\n align?: 'start' | 'center' | 'end'\n sideOffset?: number\n }\n>(({ className, align = 'center', sideOffset = 4, ...props }, ref) => (\n \n \n \n))\n\nPopoverContent.displayName = PopoverPrimitive.Content.displayName\n\nexport { Popover, PopoverTrigger, PopoverContent }\n","import * as React from 'react'\nimport * as ProgressPrimitive from '@radix-ui/react-progress'\n\nimport { cn } from '@/lib/utils'\n\nconst Progress = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef & {\n value?: number\n className?: string\n }\n>(({ className, value, ...props }, ref) => (\n \n \n \n))\nProgress.displayName = ProgressPrimitive.Root.displayName\n\nexport { Progress }\n","import * as React from 'react'\nimport * as RadioGroupPrimitive from '@radix-ui/react-radio-group'\n\nimport { cn } from '@/lib/utils'\n\nimport { Check } from '../icons/outline'\n\nconst RadioGroup = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef & {\n className?: string\n }\n>(({ className, ...props }, ref) => {\n return (\n \n )\n})\nRadioGroup.displayName = RadioGroupPrimitive.Root.displayName\n\nconst RadioGroupItem = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef & {\n className?: string\n checked?: boolean\n }\n>(({ className, ...props }, ref) => {\n return (\n \n \n \n \n
\n \n \n )\n})\nRadioGroupItem.displayName = RadioGroupPrimitive.Item.displayName\n\nexport { RadioGroup, RadioGroupItem }\n","import * as React from 'react'\nimport * as ScrollAreaPrimitive from '@radix-ui/react-scroll-area'\n\nimport { cn } from '@/lib/utils'\n\nconst ScrollArea = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef & {\n className?: string\n }\n>(({ className, children, ...props }, ref) => (\n \n \n {children}\n \n \n \n \n))\nScrollArea.displayName = ScrollAreaPrimitive.Root.displayName\n\nconst ScrollBar = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef<\n typeof ScrollAreaPrimitive.ScrollAreaScrollbar\n > & {\n orientation?: 'vertical' | 'horizontal'\n className?: string\n }\n>(({ className, orientation = 'vertical', ...props }, ref) => (\n \n \n \n))\nScrollBar.displayName = ScrollAreaPrimitive.ScrollAreaScrollbar.displayName\n\nexport { ScrollArea, ScrollBar }\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgBag = (props: SVGProps, ref: Ref) => (\n \n \n \n \n)\nconst ForwardRef = forwardRef(SvgBag)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgBank = (props: SVGProps, ref: Ref) => (\n \n \n \n)\nconst ForwardRef = forwardRef(SvgBank)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgBuilding = (\n props: SVGProps,\n ref: Ref,\n) => (\n \n \n \n)\nconst ForwardRef = forwardRef(SvgBuilding)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgBulkArrows = (\n props: SVGProps,\n ref: Ref,\n) => (\n \n \n \n)\nconst ForwardRef = forwardRef(SvgBulkArrows)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgCalendar = (\n props: SVGProps,\n ref: Ref,\n) => (\n \n \n \n \n \n \n \n \n)\nconst ForwardRef = forwardRef(SvgCalendar)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgCard = (props: SVGProps, ref: Ref) => (\n \n \n \n \n)\nconst ForwardRef = forwardRef(SvgCard)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgCloud = (props: SVGProps, ref: Ref) => (\n \n \n \n)\nconst ForwardRef = forwardRef(SvgCloud)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgDesktop = (\n props: SVGProps,\n ref: Ref,\n) => (\n \n \n \n)\nconst ForwardRef = forwardRef(SvgDesktop)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgDocument = (\n props: SVGProps,\n ref: Ref,\n) => (\n \n \n \n \n)\nconst ForwardRef = forwardRef(SvgDocument)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgDownloadFile = (\n props: SVGProps,\n ref: Ref,\n) => (\n \n \n \n \n)\nconst ForwardRef = forwardRef(SvgDownloadFile)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgDownload = (\n props: SVGProps,\n ref: Ref,\n) => (\n \n \n \n \n)\nconst ForwardRef = forwardRef(SvgDownload)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgEllipsis = (\n props: SVGProps,\n ref: Ref,\n) => (\n \n \n \n)\nconst ForwardRef = forwardRef(SvgEllipsis)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgFileUser = (\n props: SVGProps,\n ref: Ref,\n) => (\n \n \n \n \n)\nconst ForwardRef = forwardRef(SvgFileUser)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgFilter = (props: SVGProps, ref: Ref) => (\n \n \n \n)\nconst ForwardRef = forwardRef(SvgFilter)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgGlobe = (props: SVGProps, ref: Ref) => (\n \n \n \n \n \n \n \n \n)\nconst ForwardRef = forwardRef(SvgGlobe)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgHeadset = (\n props: SVGProps,\n ref: Ref,\n) => (\n \n \n \n)\nconst ForwardRef = forwardRef(SvgHeadset)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgHome = (props: SVGProps, ref: Ref) => (\n \n \n \n)\nconst ForwardRef = forwardRef(SvgHome)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgIdCard = (props: SVGProps, ref: Ref) => (\n \n \n \n \n \n \n \n \n \n \n)\nconst ForwardRef = forwardRef(SvgIdCard)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgInfoCircle = (\n props: SVGProps,\n ref: Ref,\n) => (\n \n \n \n)\nconst ForwardRef = forwardRef(SvgInfoCircle)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgInvoice = (\n props: SVGProps,\n ref: Ref,\n) => (\n \n \n \n)\nconst ForwardRef = forwardRef(SvgInvoice)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgLocation = (\n props: SVGProps,\n ref: Ref,\n) => (\n \n \n \n \n)\nconst ForwardRef = forwardRef(SvgLocation)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgLock = (props: SVGProps, ref: Ref) => (\n \n \n \n)\nconst ForwardRef = forwardRef(SvgLock)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgLogout = (props: SVGProps, ref: Ref) => (\n \n \n \n \n)\nconst ForwardRef = forwardRef(SvgLogout)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgNavigation = (\n props: SVGProps,\n ref: Ref,\n) => (\n \n \n \n)\nconst ForwardRef = forwardRef(SvgNavigation)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgPaperPlain = (\n props: SVGProps,\n ref: Ref,\n) => (\n \n \n \n \n)\nconst ForwardRef = forwardRef(SvgPaperPlain)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgSettings = (\n props: SVGProps,\n ref: Ref,\n) => (\n \n \n \n \n \n \n \n)\nconst ForwardRef = forwardRef(SvgSettings)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgSquareCheck = (\n props: SVGProps,\n ref: Ref,\n) => (\n \n \n \n)\nconst ForwardRef = forwardRef(SvgSquareCheck)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgUpload = (props: SVGProps, ref: Ref) => (\n \n \n \n)\nconst ForwardRef = forwardRef(SvgUpload)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgUser = (props: SVGProps, ref: Ref) => (\n \n \n \n)\nconst ForwardRef = forwardRef(SvgUser)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgUsers = (props: SVGProps, ref: Ref) => (\n \n \n \n \n \n \n \n \n \n \n)\nconst ForwardRef = forwardRef(SvgUsers)\nexport default ForwardRef\n","import { forwardRef, Ref, type SVGProps } from 'react'\n\nconst SvgX = (props: SVGProps, ref: Ref) => (\n \n \n \n)\nconst ForwardRef = forwardRef(SvgX)\nexport default ForwardRef\n","import * as React from 'react'\nimport { zodResolver } from '@hookform/resolvers/zod'\nimport { useForm } from 'react-hook-form'\nimport { useIntl } from 'react-intl'\nimport { z } from 'zod'\n\nimport { cn } from '@/lib/utils'\n\nimport { Search } from '../icons/outline'\nimport { X } from '../icons/solid'\n\nimport { Button, Form, FormControl, FormField, FormItem, Input } from '.'\n\nconst searchSchema = z.object({\n search: z.string().or(z.number()).optional(),\n})\n\ntype SearchSchema = z.infer\n\ntype SearchInputProps = Omit<\n React.InputHTMLAttributes,\n 'value' | 'onChange'\n> & {\n value?: string\n onChange?: (value: string) => void\n}\n\nexport const SearchInput = React.forwardRef(\n ({ className, onChange, ...props }, ref) => {\n const intl = useIntl()\n const form = useForm({\n mode: 'onChange',\n resolver: zodResolver(searchSchema),\n defaultValues: {\n search: props.value ?? '',\n },\n })\n\n return (\n
\n \n (\n \n \n\n \n e.key === 'Enter' && e.preventDefault()}\n {...field}\n onChange={(e) => {\n field.onChange(e)\n onChange?.(e.target.value)\n }}\n placeholder={intl.formatMessage({\n id: 'label.search',\n defaultMessage: 'Search',\n })}\n ref={ref}\n {...props}\n />\n \n\n {props.value ? (\n {\n field.onChange('')\n onChange?.('')\n }}\n >\n \n \n ) : null}\n \n )}\n />\n \n \n )\n },\n)\n\nSearchInput.displayName = 'MoneyInput'\n","import * as React from 'react'\nimport * as SelectPrimitive from '@radix-ui/react-select'\nimport { cva, type VariantProps } from 'class-variance-authority'\n\nimport { cn } from '@/lib/utils'\n\nimport { Check, ChevronDown, ChevronUp } from '../icons/outline'\n\nconst selectTriggerVariants = cva(\n 'flex w-full items-center justify-between gap-2 rounded-lg bg-white px-4 text-sm disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1',\n {\n variants: {\n variant: {\n default:\n 'text-neutral-gray-600 ring-offset-neutral-gray-200 focus:outline-hidden focus:ring-1 focus:ring-neutral-gray-200 focus:ring-offset-1',\n outline: 'border border-neutral-gray-100',\n },\n size: {\n default: 'h-[54px]',\n medium: 'h-10',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n },\n)\n\nconst Select = SelectPrimitive.Root\n\nconst SelectGroup = SelectPrimitive.Group\n\nconst SelectValue = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef & {\n className?: string\n }\n>(({ className, children, ...props }, ref) => (\n \n {children}\n \n))\n\nSelectValue.displayName = SelectPrimitive.SelectValue.displayName\n\nconst SelectTrigger = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef & {\n className?: string\n } & VariantProps\n>(({ className, children, variant, size, ...props }, ref) => (\n \n {children}\n \n \n \n \n))\nSelectTrigger.displayName = SelectPrimitive.Trigger.displayName\n\nconst SelectScrollUpButton = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef & {\n className?: string\n }\n>(({ className, ...props }, ref) => (\n \n \n \n))\nSelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName\n\nconst SelectScrollDownButton = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef & {\n className?: string\n }\n>(({ className, ...props }, ref) => (\n \n \n \n))\nSelectScrollDownButton.displayName =\n SelectPrimitive.ScrollDownButton.displayName\n\nconst SelectContent = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef & {\n className?: string\n position?: 'item-aligned' | 'popper'\n }\n>(({ className, children, position = 'popper', ...props }, ref) => (\n \n \n \n {children}\n \n \n \n))\nSelectContent.displayName = SelectPrimitive.Content.displayName\n\nconst SelectLabel = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef & {\n className?: string\n }\n>(({ className, ...props }, ref) => (\n \n))\nSelectLabel.displayName = SelectPrimitive.Label.displayName\n\nconst SelectItem = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef & {\n className?: string\n hideChecked?: boolean\n }\n>(({ hideChecked, className, children, ...props }, ref) => {\n return (\n \n \n <>{children}\n \n\n {hideChecked ? null : (\n \n \n \n \n \n )}\n \n )\n})\n\nSelectItem.displayName = SelectPrimitive.Item.displayName\n\nconst SelectSeparator = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef & {\n className?: string\n }\n>(({ className, ...props }, ref) => (\n \n))\nSelectSeparator.displayName = SelectPrimitive.Separator.displayName\n\nexport {\n Select,\n SelectGroup,\n SelectValue,\n SelectTrigger,\n SelectContent,\n SelectLabel,\n SelectItem,\n SelectSeparator,\n SelectScrollUpButton,\n SelectScrollDownButton,\n}\n","/* eslint-disable jsx-a11y/no-noninteractive-tabindex */\nimport * as React from 'react'\nimport * as SheetPrimitive from '@radix-ui/react-dialog'\nimport { VisuallyHidden } from '@radix-ui/react-visually-hidden'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { FormattedMessage } from 'react-intl'\n\nimport { cn } from '@/lib/utils'\n\nimport { X } from '../icons/solid'\n\nimport { DialogDescription, DialogTitle } from './Dialog'\n\nconst Sheet = SheetPrimitive.Root\n\nconst SheetTrigger = SheetPrimitive.Trigger\n\nconst SheetClose = SheetPrimitive.Close\n\nconst SheetPortal = SheetPrimitive.Portal\n\nconst SheetOverlay = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef & {\n className?: string\n }\n>(({ className, ...props }, ref) => (\n \n))\nSheetOverlay.displayName = SheetPrimitive.Overlay.displayName\n\nconst sheetVariants = cva(\n 'flex flex-col fixed z-50 hide-scrollbar overflow-y-scroll bg-neutral-gray-100 px-6 md:px-12 md:py-16 pt-24 pb-0 shadow-medium transition focus:outline-hidden ease-in-out data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:duration-300 data-[state=open]:duration-300',\n {\n variants: {\n side: {\n top: 'inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top',\n bottom:\n 'inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom',\n left: 'inset-y-0 left-0 h-full w-full sm:w-[40rem] border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left',\n right:\n 'inset-y-0 right-0 h-full w-full sm:w-[40rem] border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right',\n },\n },\n defaultVariants: {\n side: 'right',\n },\n },\n)\n\ninterface SheetContentProps\n extends React.ComponentPropsWithoutRef,\n VariantProps {}\n\nconst SheetContent = React.forwardRef<\n React.ElementRef,\n SheetContentProps\n>(({ side = 'right', className, children, ...props }, ref) => (\n <>\n \n\n \n \n \n \n \n \n \n {/* to prevent autofocus on element inside sheet */}\n \n\n {children}\n \n \n \n \n \n \n \n \n))\nSheetContent.displayName = SheetPrimitive.Content.displayName\n\nconst SheetHeader = ({\n className,\n ...props\n}: React.HTMLAttributes & {\n className?: string\n}) => (\n \n)\nSheetHeader.displayName = 'SheetHeader'\n\nconst SheetFooter = ({\n className,\n ...props\n}: React.HTMLAttributes & {\n className?: string\n}) =>
\nSheetFooter.displayName = 'SheetFooter'\n\nconst SheetTitle = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef & {\n className?: string\n }\n>(({ className, ...props }, ref) => (\n \n))\nSheetTitle.displayName = SheetPrimitive.Title.displayName\n\nconst SheetDescription = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef & {\n className?: string\n }\n>(({ className, ...props }, ref) => (\n \n))\nSheetDescription.displayName = SheetPrimitive.Description.displayName\n\nexport {\n Sheet,\n SheetPortal,\n SheetOverlay,\n SheetTrigger,\n SheetClose,\n SheetContent,\n SheetHeader,\n SheetFooter,\n SheetTitle,\n SheetDescription,\n}\n","import { motion } from 'framer-motion'\n\nimport { cn } from '@/lib/utils'\n\nimport { slideFromLeftAnimation } from './animations'\n\ntype Props = {\n children: React.ReactNode\n className?: string\n}\n\nexport const SlideInLeft = ({ children, className }: Props) => {\n return (\n \n {children}\n \n )\n}\n","import { motion } from 'framer-motion'\n\nimport { cn } from '@/lib/utils'\n\nimport { slideFromLeftAnimation } from '.'\n\ntype Props = {\n children: React.ReactNode\n className?: string\n}\n\nexport const SlideInScreen = ({ children, className }: Props) => {\n return (\n \n {children}\n \n )\n}\n","import { cn } from '@/lib/utils'\n\ntype Props = {\n children: React.ReactNode\n className?: string\n}\n\nexport const StickyContainer = ({ children, className }: Props) => {\n return (\n \n {children}\n
\n )\n}\n","import * as React from 'react'\nimport * as SwitchPrimitives from '@radix-ui/react-switch'\nimport { FormattedMessage } from 'react-intl'\n\nimport { Locale } from '@/constants/locales'\nimport { cn } from '@/lib/utils'\n\nconst Switch = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef & {\n className?: string\n checked?: boolean\n locale?: Locale\n }\n>(({ className, ...props }, ref) => (\n \n \n\n \n \n
\n \n \n \n \n))\nSwitch.displayName = SwitchPrimitives.Root.displayName\n\nexport { Switch }\n","import * as React from 'react'\n\nimport { cn } from '@/lib/utils'\n\nconst Table = React.forwardRef<\n HTMLTableElement,\n React.HTMLAttributes & {\n className?: string\n }\n>(({ className, ...props }, ref) => (\n
\n \n
\n))\n\nTable.displayName = 'Table'\n\nconst TableHeader = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes & {\n className?: string\n }\n>(({ className, ...props }, ref) => (\n \n))\n\nTableHeader.displayName = 'TableHeader'\n\nconst TableBody = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes & {\n className?: string\n }\n>(({ className, ...props }, ref) => (\n \n))\n\nTableBody.displayName = 'TableBody'\n\nconst TableFooter = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes & {\n className?: string\n }\n>(({ className, ...props }, ref) => (\n tr]:border-b-0',\n className,\n )}\n {...props}\n />\n))\n\nTableFooter.displayName = 'TableFooter'\n\nconst TableRow = React.forwardRef<\n HTMLTableRowElement,\n React.HTMLAttributes & {\n className?: string\n }\n>(({ className, ...props }, ref) => (\n td]:first:rounded-tl-xl last:[&>td]:last:rounded-br-xl last:[&>td]:first:rounded-bl-xl first:[&>td]:last:rounded-tr-xl',\n className,\n )}\n {...props}\n />\n))\n\nTableRow.displayName = 'TableRow'\n\nconst TableHead = React.forwardRef<\n HTMLTableCellElement,\n React.ThHTMLAttributes & {\n className?: string\n }\n>(({ className, ...props }, ref) => (\n \n))\n\nTableHead.displayName = 'TableHead'\n\nconst TableCell = React.forwardRef<\n HTMLTableCellElement,\n React.TdHTMLAttributes & {\n className?: string\n }\n>(({ className, ...props }, ref) => (\n div]:h-[80px]',\n className,\n )}\n {...props}\n />\n))\n\nTableCell.displayName = 'TableCell'\n\nconst TableCaption = React.forwardRef<\n HTMLTableCaptionElement,\n React.HTMLAttributes & {\n className?: string\n }\n>(({ className, ...props }, ref) => (\n \n))\n\nTableCaption.displayName = 'TableCaption'\n\nexport {\n Table,\n TableHeader,\n TableBody,\n TableFooter,\n TableHead,\n TableRow,\n TableCell,\n TableCaption,\n}\n","import * as React from 'react'\nimport * as TabsPrimitive from '@radix-ui/react-tabs'\nimport { cva, type VariantProps } from 'class-variance-authority'\n\nimport { cn } from '@/lib/utils'\n\nconst tabListVariants = cva('flex h-8 w-full p-0.5', {\n variants: {\n variant: {\n fill: 'rounded-xl bg-neutral-gray-200',\n outline: 'border-b-2 border-neutral-gray-300 pb-0',\n navigation: 'border-b border-neutral-gray-300 pb-0',\n },\n },\n defaultVariants: {\n variant: 'fill',\n },\n})\n\nconst tabTriggerVariants = cva(\n 'cursor-pointer inline-flex w-full items-center justify-center whitespace-nowrap bg-transparent px-3 md:px-4 text-sm font-medium ring-offset-white duration-100 transition-all focus-visible:outline-hidden disabled:pointer-events-none disabled:opacity-50 data-[state=active]:font-bold relative',\n {\n variants: {\n variant: {\n fill: 'rounded-lg bg-transparent data-[state=active]:bg-white h-7',\n outline:\n 'data-[state=active]:after:content-[\"\"] data-[state=active]:after:absolute data-[state=active]:after:w-full data-[state=active]:after:left-0 data-[state=active]:after:border-b-2 data-[state=active]:after:border-neutral-gray-900 data-[state=active]:after:-bottom-0.5 p-2 h-7',\n navigation:\n 'font-bold data-[state=active]:after:content-[\"\"] data-[state=active]:after:absolute data-[state=active]:after:w-full data-[state=active]:text-neutral-gray-900 text-neutral-gray-600 data-[state=active]:after:left-0 data-[state=active]:after:border-b-2 data-[state=active]:after:border-neutral-gray-900 data-[state=active]:after:-bottom-0.5 pb-4 md:px-1',\n },\n size: {\n full: 'w-full',\n fit: 'min-w-[128px] w-fit',\n inline: 'w-fit',\n },\n },\n defaultVariants: {\n variant: 'fill',\n size: 'full',\n },\n },\n)\n\nconst Tabs = TabsPrimitive.Root\n\nconst TabsList = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef & {\n className?: string\n } & VariantProps\n>(({ className, variant, ...props }, ref) => (\n \n))\nTabsList.displayName = TabsPrimitive.List.displayName\n\nconst TabsTrigger = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef & {\n className?: string\n } & VariantProps\n>(({ className, variant, size, ...props }, ref) => (\n \n))\nTabsTrigger.displayName = TabsPrimitive.Trigger.displayName\n\nconst TabsContent = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef & {\n className?: string\n }\n>(({ className, ...props }, ref) => (\n \n))\nTabsContent.displayName = TabsPrimitive.Content.displayName\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent }\n","import * as React from 'react'\n\nimport { cn } from '@/lib/utils'\n\nexport interface TextareaProps\n extends React.TextareaHTMLAttributes {\n hasError?: boolean\n}\n\nconst Textarea = React.forwardRef(\n ({ className, hasError, ...props }, ref) => {\n return (\n \n )\n },\n)\n\nTextarea.displayName = 'Textarea'\n\nexport { Textarea }\n","import { createPortal } from 'react-dom'\nimport { Toaster as Sonner } from 'sonner'\n\ntype ToasterProps = React.ComponentProps\n\nconst Toaster = ({ ...props }: ToasterProps) => {\n const toastComponent = (\n \n )\n\n return createPortal(toastComponent, document.body)\n}\n\nexport { Toaster }\n","import * as React from 'react'\nimport * as TooltipPrimitive from '@radix-ui/react-tooltip'\n\nimport { cn } from '@/lib/utils'\n\nconst TooltipProvider = TooltipPrimitive.Provider\n\nconst Tooltip = TooltipPrimitive.Root\n\nconst TooltipTrigger = TooltipPrimitive.Trigger\n\nconst TooltipContent = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef & {\n sideOffset?: number\n className?: string\n }\n>(({ className, sideOffset = 4, ...props }, ref) => (\n \n))\nTooltipContent.displayName = TooltipPrimitive.Content.displayName\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }\n","import { defineMessages } from 'react-intl'\n\nimport { Icon } from '@/types/global'\n\nimport { DefineMessages } from './messages'\n\nexport const BaseRoute = {\n Root: '/',\n SigningIn: '/signing-in',\n LoggingOut: '/logging-out',\n}\n\nexport const BusinessRoute = {\n // Login\n SignIn: '/sign-in',\n SignUp: '/sign-up',\n ForgotPassword: '/forgot-password',\n AcceptInvite: '/accept-invite',\n\n // 2FA\n DashboardSetup2fa: '/dashboard/setup-2fa',\n\n // Onboarding\n Onboarding: '/onboarding',\n OnboardingStart: '/onboarding/start',\n OnboardingCompleted: '/onboarding/completed',\n OnboardingCreateOwner: '/onboarding/create-owner/:ownerId?',\n OnboardingValidateIdentity: '/onboarding/validate-identity/:type',\n OnboardingStep: '/onboarding/:step',\n\n // Dashboard\n Dashboard: '/dashboard',\n Transactions: '/dashboard/transactions',\n\n // Recipients\n Recipients: '/dashboard/recipients',\n AddRecipients: '/recipients/add',\n\n // Team\n Team: '/dashboard/team',\n AddTeamMember: '/add-new-member',\n\n // Cards\n Cards: '/dashboard/cards',\n CardsTransactions: '/dashboard/cards/:id/transactions',\n CreateCard: '/create-card',\n\n // Contractors\n Contractors: '/dashboard/contractors',\n ContractorsDetails: '/dashboard/contractors/:id',\n ContractorsCreate: '/create-contractor',\n ContractorsAddContract: '/add-contract/:id',\n ContractorsOverview: '/dashboard/contractors/overview',\n ContractorsAll: '/dashboard/contractors/all',\n ContractorsHistoricalPayments: '/dashboard/contractors/historical-payments',\n ContractorsRunPayment: '/contractors/run-payment/:id',\n ContractorsOffsetCyclePayment: '/contractors/new-payment',\n ContractorsHistoricalPaymentTransactions:\n '/dashboard/contractors/historical-payments/:id/transactions',\n ContractorsPayments: '/dashboard/contractors/:id/payments',\n ContractorsManualCSV: '/contractors/upload-csv/:id',\n ContractorsEndContract: '/contractors/end-contract/:id',\n ContractorsBulkUploadCSV: '/contractors/bulk-upload-csv',\n ContractorsBulkUpload: '/contractors/bulk-upload',\n\n // Accounts\n Accounts: '/dashboard/accounts',\n SingleAccount: '/dashboard/accounts/:id',\n AccountTransactions: '/dashboard/accounts/:id/transactions',\n CashbackTransactions: '/dashboard/cashback/:id/transactions',\n CreateAccount: '/account/create',\n\n // Tasks\n Tasks: '/dashboard/tasks',\n ReviewTask: '/review-task/:id',\n\n // Move Money\n AddBalance: '/add-balance',\n Transfer: '/transfer',\n Send: '/send',\n\n // Bulk Payments\n BulkPayment: '/bulk-payment',\n BulkPaymentTransactions: '/dashboard/bulk-payment/:id/transactions',\n\n // Settings\n Settings: '/dashboard/settings',\n CompanySettings: '/dashboard/settings/company',\n}\n\nexport const ContractorRoute = {\n Root: '/contractor',\n SigningIn: '/contractor/signing-in',\n LoggingOut: '/contractor/logging-out',\n // Sign In\n SignIn: '/contractor/sign-in',\n ForgotPassword: '/contractor/forgot-password',\n AcceptInvite: '/contractor/accept-invite',\n\n // 2FA\n ContractorSetup2fa: '/contractor/setup-2fa',\n\n // Onboarding\n Onboarding: '/contractor/onboarding',\n OnboardingStep: '/contractor/onboarding/step/:step',\n OnboardingStart: '/contractor/onboarding/start',\n\n // Overview\n Dashboard: '/contractor/dashboard',\n Transactions: '/contractor/dashboard/transactions',\n}\n\nexport type NavigationLink = {\n key: NavKeys\n icon: Icon\n path: string\n enabled: boolean\n count?: number\n}\n\nexport type ContractorNavigationLink = {\n key: NavKeys\n icon: Icon\n path: string\n}\n\nexport type NavKeys =\n | 'home'\n | 'accounts'\n | 'recipients'\n | 'cards'\n | 'transactions'\n | 'settings'\n | 'signOut'\n | 'logout'\n | 'support'\n | 'team'\n | 'tasks'\n | 'myProfile'\n | 'transactionsLimit'\n | 'contractors'\n\nexport const navMessages: DefineMessages = defineMessages({\n home: {\n id: 'nav.home',\n defaultMessage: 'Home',\n },\n accounts: {\n id: 'dashboard.accounts.title',\n defaultMessage: 'My accounts',\n },\n recipients: {\n id: 'nav.recipients',\n defaultMessage: 'Recipients',\n },\n cards: {\n id: 'nav.cards',\n defaultMessage: 'Cards',\n },\n transactions: {\n id: 'nav.transactions',\n defaultMessage: 'Transactions',\n },\n settings: {\n id: 'nav.settings',\n defaultMessage: 'Settings',\n },\n signOut: {\n id: 'nav.signOut',\n defaultMessage: 'Sign out',\n },\n logout: {\n id: 'nav.logout',\n defaultMessage: 'Log out',\n },\n support: {\n id: 'nav.chatWithSupport',\n defaultMessage: 'Chat with support',\n },\n team: {\n id: 'nav.team',\n defaultMessage: 'Team',\n },\n myProfile: {\n id: 'nav.myProfile',\n defaultMessage: 'My profile',\n },\n tasks: {\n id: 'nav.tasks',\n defaultMessage: 'Tasks',\n },\n transactionsLimit: {\n id: 'nav.accountLimits',\n defaultMessage: 'Account limits',\n },\n contractors: {\n id: 'nav.contractors',\n defaultMessage: 'Contractors',\n },\n})\n","import { useEffect, useRef } from 'react'\n\ntype Timer = ReturnType\n\nexport function useDebounce ReturnType>(\n func: T,\n delay = 300,\n) {\n const timer = useRef()\n\n useEffect(() => {\n return () => {\n if (!timer.current) return\n clearTimeout(timer.current)\n }\n }, [])\n\n const debouncedFunction = ((...args: Parameters) => {\n const newTimer = setTimeout(() => {\n func(...args)\n }, delay)\n clearTimeout(timer.current)\n timer.current = newTimer\n }) as T\n\n return debouncedFunction\n}\n","import { CountryCode } from '@/types/country'\n\nexport function getCodeByCountry(country?: CountryCode): string {\n switch (country) {\n case CountryCode.MX:\n return '+52'\n\n case CountryCode.US:\n return '+1'\n\n default:\n return ''\n }\n}\n\nexport function getCountryNameByISO2Code(countryCode: string, locale = 'en') {\n try {\n const regionName = new Intl.DisplayNames([locale], { type: 'region' })\n\n return regionName.of(countryCode)\n } catch {\n return countryCode\n }\n}\n\nconst countryISOMapping: Record = {\n AF: 'AFG',\n AX: 'ALA',\n AL: 'ALB',\n DZ: 'DZA',\n AS: 'ASM',\n AD: 'AND',\n AO: 'AGO',\n AI: 'AIA',\n AQ: 'ATA',\n AG: 'ATG',\n AR: 'ARG',\n AM: 'ARM',\n AW: 'ABW',\n AU: 'AUS',\n AT: 'AUT',\n AZ: 'AZE',\n BS: 'BHS',\n BH: 'BHR',\n BD: 'BGD',\n BB: 'BRB',\n BY: 'BLR',\n BE: 'BEL',\n BZ: 'BLZ',\n BJ: 'BEN',\n BM: 'BMU',\n BT: 'BTN',\n BO: 'BOL',\n BA: 'BIH',\n BW: 'BWA',\n BV: 'BVT',\n BR: 'BRA',\n VG: 'VGB',\n IO: 'IOT',\n BN: 'BRN',\n BG: 'BGR',\n BF: 'BFA',\n BI: 'BDI',\n KH: 'KHM',\n CM: 'CMR',\n CA: 'CAN',\n CV: 'CPV',\n KY: 'CYM',\n CF: 'CAF',\n TD: 'TCD',\n CL: 'CHL',\n CN: 'CHN',\n HK: 'HKG',\n MO: 'MAC',\n CX: 'CXR',\n CC: 'CCK',\n CO: 'COL',\n KM: 'COM',\n CG: 'COG',\n CD: 'COD',\n CK: 'COK',\n CR: 'CRI',\n CI: 'CIV',\n HR: 'HRV',\n CU: 'CUB',\n CY: 'CYP',\n CZ: 'CZE',\n DK: 'DNK',\n DJ: 'DJI',\n DM: 'DMA',\n DO: 'DOM',\n EC: 'ECU',\n EG: 'EGY',\n SV: 'SLV',\n GQ: 'GNQ',\n ER: 'ERI',\n EE: 'EST',\n ET: 'ETH',\n FK: 'FLK',\n FO: 'FRO',\n FJ: 'FJI',\n FI: 'FIN',\n FR: 'FRA',\n GF: 'GUF',\n PF: 'PYF',\n TF: 'ATF',\n GA: 'GAB',\n GM: 'GMB',\n GE: 'GEO',\n DE: 'DEU',\n GH: 'GHA',\n GI: 'GIB',\n GR: 'GRC',\n GL: 'GRL',\n GD: 'GRD',\n GP: 'GLP',\n GU: 'GUM',\n GT: 'GTM',\n GG: 'GGY',\n GN: 'GIN',\n GW: 'GNB',\n GY: 'GUY',\n HT: 'HTI',\n HM: 'HMD',\n VA: 'VAT',\n HN: 'HND',\n HU: 'HUN',\n IS: 'ISL',\n IN: 'IND',\n ID: 'IDN',\n IR: 'IRN',\n IQ: 'IRQ',\n IE: 'IRL',\n IM: 'IMN',\n IL: 'ISR',\n IT: 'ITA',\n JM: 'JAM',\n JP: 'JPN',\n JE: 'JEY',\n JO: 'JOR',\n KZ: 'KAZ',\n KE: 'KEN',\n KI: 'KIR',\n KP: 'PRK',\n KR: 'KOR',\n KW: 'KWT',\n KG: 'KGZ',\n LA: 'LAO',\n LV: 'LVA',\n LB: 'LBN',\n LS: 'LSO',\n LR: 'LBR',\n LY: 'LBY',\n LI: 'LIE',\n LT: 'LTU',\n LU: 'LUX',\n MK: 'MKD',\n MG: 'MDG',\n MW: 'MWI',\n MY: 'MYS',\n MV: 'MDV',\n ML: 'MLI',\n MT: 'MLT',\n MH: 'MHL',\n MQ: 'MTQ',\n MR: 'MRT',\n MU: 'MUS',\n YT: 'MYT',\n MX: 'MEX',\n FM: 'FSM',\n MD: 'MDA',\n MC: 'MCO',\n MN: 'MNG',\n ME: 'MNE',\n MS: 'MSR',\n MA: 'MAR',\n MZ: 'MOZ',\n MM: 'MMR',\n NA: 'NAM',\n NR: 'NRU',\n NP: 'NPL',\n NL: 'NLD',\n AN: 'ANT',\n NC: 'NCL',\n NZ: 'NZL',\n NI: 'NIC',\n NE: 'NER',\n NG: 'NGA',\n NU: 'NIU',\n NF: 'NFK',\n MP: 'MNP',\n NO: 'NOR',\n OM: 'OMN',\n PK: 'PAK',\n PW: 'PLW',\n PS: 'PSE',\n PA: 'PAN',\n PG: 'PNG',\n PY: 'PRY',\n PE: 'PER',\n PH: 'PHL',\n PN: 'PCN',\n PL: 'POL',\n PT: 'PRT',\n PR: 'PRI',\n QA: 'QAT',\n RE: 'REU',\n RO: 'ROU',\n RU: 'RUS',\n RW: 'RWA',\n BL: 'BLM',\n SH: 'SHN',\n KN: 'KNA',\n LC: 'LCA',\n MF: 'MAF',\n PM: 'SPM',\n VC: 'VCT',\n WS: 'WSM',\n SM: 'SMR',\n ST: 'STP',\n SA: 'SAU',\n SN: 'SEN',\n RS: 'SRB',\n SC: 'SYC',\n SL: 'SLE',\n SG: 'SGP',\n SK: 'SVK',\n SI: 'SVN',\n SB: 'SLB',\n SO: 'SOM',\n ZA: 'ZAF',\n GS: 'SGS',\n SS: 'SSD',\n ES: 'ESP',\n LK: 'LKA',\n SD: 'SDN',\n SR: 'SUR',\n SJ: 'SJM',\n SZ: 'SWZ',\n SE: 'SWE',\n CH: 'CHE',\n SY: 'SYR',\n TW: 'TWN',\n TJ: 'TJK',\n TZ: 'TZA',\n TH: 'THA',\n TL: 'TLS',\n TG: 'TGO',\n TK: 'TKL',\n TO: 'TON',\n TT: 'TTO',\n TN: 'TUN',\n TR: 'TUR',\n TM: 'TKM',\n TC: 'TCA',\n TV: 'TUV',\n UG: 'UGA',\n UA: 'UKR',\n AE: 'ARE',\n GB: 'GBR',\n US: 'USA',\n UM: 'UMI',\n UY: 'URY',\n UZ: 'UZB',\n VU: 'VUT',\n VE: 'VEN',\n VN: 'VNM',\n VI: 'VIR',\n WF: 'WLF',\n EH: 'ESH',\n YE: 'YEM',\n ZM: 'ZMB',\n ZW: 'ZWE',\n XK: 'XKX',\n}\n\nexport function isCountryInISO3Format(countryCode: string) {\n const iso2Country = getCountryISO2ByISO3(countryCode)\n\n if (iso2Country) {\n return !!countryISOMapping[iso2Country]\n }\n}\n\nexport function getCountryISO3byISO2(countryCode: string) {\n if (countryISOMapping[countryCode]) {\n return countryISOMapping[countryCode]\n }\n\n return countryCode\n}\n\nexport function getCountryISO2ByISO3(countryCode: string) {\n const iso3ToISO2Mapping = Object.fromEntries(\n Object.entries(countryISOMapping).map(([key, value]) => [value, key]),\n )\n\n if (iso3ToISO2Mapping[countryCode]) {\n return iso3ToISO2Mapping[countryCode]\n }\n\n return countryCode\n}\n\nexport function getCountryNameByISO3(\n ISO3CountryCode?: string,\n locale = 'en',\n fallback?: string,\n) {\n if (!ISO3CountryCode) {\n return ''\n }\n\n try {\n const regionName = new Intl.DisplayNames([locale], { type: 'region' })\n\n const countryCode = getCountryISO2ByISO3(ISO3CountryCode)\n\n if (!countryCode) {\n return ISO3CountryCode\n }\n return regionName.of(countryCode)\n } catch {\n return fallback ?? ISO3CountryCode\n }\n}\n","import { IntlShape } from 'react-intl'\n\nimport { Address } from '@/domains/Business/features/Accounts/types'\nimport { Recipient } from '@/domains/Business/features/Recipients/types'\nimport { BusinessIdentity } from '@/domains/Business/types'\nimport { AddressComponent } from '@/types/global'\n\nimport { getCountryNameByISO3 } from './country'\n\nexport function getFullAddress(address: Address, intl?: IntlShape) {\n if (!address) return null\n\n if (!address.street || !address.city || !address.state || !address.postcode) {\n return null\n }\n\n return `${address.street}, ${address.city},\\n ${address.state}, ${address.postcode}, ${getCountryNameByISO3(address.countryCode, intl?.locale)}`\n}\n\nexport function getRecipientAddress(recipient?: Recipient, intl?: IntlShape) {\n if (!recipient) return ''\n\n const { addressCity, addressState, addressStreet, addressZipCode, country } =\n recipient\n\n if (\n !addressCity ||\n !addressState ||\n !addressStreet ||\n !addressZipCode ||\n !country\n ) {\n return ''\n }\n\n return `${addressStreet},\\n ${addressCity}, ${addressState}, ${addressZipCode}, ${getCountryNameByISO3(country, intl?.locale)}`\n}\n\nexport function getBusinessAddress(\n business?: BusinessIdentity,\n intl?: IntlShape,\n) {\n if (!business) return null\n\n const {\n addressCity,\n addressMunicipality,\n addressNeighborhood,\n addressPostalCode,\n addressState,\n addressStreet,\n addressStreetNumber,\n countryOfIncorporation,\n } = business\n\n const addressCountry = getCountryNameByISO3(\n countryOfIncorporation,\n intl?.locale,\n )\n\n const addressValues = [\n addressStreet,\n addressStreetNumber,\n addressNeighborhood,\n addressMunicipality,\n addressCity,\n addressState,\n addressPostalCode,\n addressCountry,\n ]\n\n const filteredValues = addressValues.filter((value) => !!value)\n\n const joinedAddress = filteredValues.reduce((acc, value, index) => {\n if (index === 1) {\n return `${acc} ${value}`\n }\n if (index === 3) {\n return `${acc},\\n ${value}`\n }\n\n return `${acc}, ${value}`\n })\n\n return joinedAddress\n}\n\nexport function getOnboardingAddress(\n address: {\n addressStreet?: string\n addressStreetNumber?: string\n addressDistrict?: string\n addressCity?: string\n addressState?: string\n addressPostCode?: string\n addressCountry?: string\n },\n intl?: IntlShape,\n) {\n const {\n addressStreet,\n addressStreetNumber,\n addressDistrict,\n addressCity,\n addressState,\n addressPostCode,\n addressCountry,\n } = address\n\n const addressValues = [\n addressStreet,\n addressStreetNumber,\n addressDistrict,\n addressCity,\n addressState,\n addressPostCode,\n getCountryNameByISO3(addressCountry, intl?.locale),\n ]\n\n const filteredValues = addressValues.filter((value) => !!value)\n\n const joinedAddress = filteredValues.reduce((acc, value, index) => {\n if (index === 1) {\n return `${acc} ${value}`\n }\n if (index === 3) {\n return `${acc},\\n ${value}`\n }\n\n return `${acc}, ${value}`\n })\n\n return joinedAddress\n}\n\nexport interface GooglePlacesParsedAddress {\n street: string\n streetNumber: string\n neighborhood: string\n city: string\n state: string\n postcode: string\n country: string\n}\n\nexport function mapGooglePlacesAddress(\n address: AddressComponent[],\n): GooglePlacesParsedAddress {\n const FIELD_STREET = 'route'\n const FIELD_NUMBER = 'street_number'\n const FIELD_NEIGHBORHOOD = 'neighborhood'\n const FIELD_SUBLOCALITY_1 = 'sublocality_level_1'\n const FIELD_LOCALITY = 'locality'\n const FIELD_ADMINISTRATIVE_AREA_1 = 'administrative_area_level_1'\n const FIELD_POSTAL_CODE = 'postal_code'\n const FIELD_COUNTRY = 'country'\n\n const street =\n address.find((component) => component.types.includes(FIELD_STREET))\n ?.long_name || ''\n\n const streetNumber =\n address.find((component) => component.types.includes(FIELD_NUMBER))\n ?.long_name || ''\n\n const neighborhood =\n address.find(\n (component) =>\n component.types.includes(FIELD_NEIGHBORHOOD) ||\n component.types.includes(FIELD_SUBLOCALITY_1),\n )?.long_name || ''\n\n const city =\n address.find((component) => component.types.includes(FIELD_LOCALITY))\n ?.long_name || ''\n\n const state =\n address.find((component) =>\n component.types.includes(FIELD_ADMINISTRATIVE_AREA_1),\n )?.short_name || ''\n\n const country =\n address.find((component) => component.types.includes(FIELD_COUNTRY))\n ?.short_name || ''\n\n const postalCode =\n address.find((component) => component.types.includes(FIELD_POSTAL_CODE))\n ?.long_name || ''\n\n return {\n street,\n streetNumber,\n neighborhood,\n city,\n state,\n postcode: postalCode,\n country,\n }\n}\n","import { ChangeEvent, useCallback, useEffect, useState } from 'react'\nimport { useMap, useMapsLibrary } from '@vis.gl/react-google-maps'\nimport { FormattedMessage } from 'react-intl'\n\nimport { useDebounce } from '@/hooks/useDebounce'\nimport {\n GooglePlacesParsedAddress,\n mapGooglePlacesAddress,\n} from '@/lib/address'\nimport { useLocale } from '@/providers/LocaleProvider'\nimport {\n AnimatedFormLabel,\n Button,\n Command,\n CommandList,\n FormControl,\n FormItem,\n Input,\n Skeleton,\n Typography,\n} from '@/shared/ui'\nimport { ISO2CountryCode } from '@/types/country'\n\nconst DEBOUNCE_DELAY = 500\n\ntype Props = {\n placeholder: string\n onManualClick: () => void\n onGoogleAddressSelected: (address: GooglePlacesParsedAddress) => void\n restrictedCountries?: ISO2CountryCode[]\n} & React.InputHTMLAttributes\n\nexport const AddressAutocompleteField = ({\n onChange,\n value,\n placeholder,\n onManualClick,\n onGoogleAddressSelected,\n restrictedCountries = [],\n ...inputProps\n}: Props) => {\n const map = useMap()\n const { locale } = useLocale()\n const places = useMapsLibrary('places')\n\n const [sessionToken, setSessionToken] =\n useState()\n\n const [autocompleteService, setAutocompleteService] =\n useState(null)\n\n const [placesService, setPlacesService] =\n useState(null)\n\n const [predictionResults, setPredictionResults] = useState<\n Array\n >([])\n\n const [isPlacePredictionsLoading, setIsPlacePredictionsLoading] =\n useState(false)\n\n useEffect(() => {\n if (!places) return\n\n setAutocompleteService(new places.AutocompleteService())\n setPlacesService(new places.PlacesService(document.createElement('div')))\n setSessionToken(new places.AutocompleteSessionToken())\n\n return () => setAutocompleteService(null)\n }, [map, places])\n\n const fetchPredictions = useCallback(\n async (inputValue: string) => {\n if (!autocompleteService || !inputValue) {\n setPredictionResults([])\n setIsPlacePredictionsLoading(false)\n return\n }\n\n const response = await autocompleteService.getPlacePredictions({\n input: inputValue,\n sessionToken,\n componentRestrictions: { country: restrictedCountries },\n })\n\n setPredictionResults(response.predictions)\n\n setIsPlacePredictionsLoading(false)\n },\n [autocompleteService, restrictedCountries, sessionToken],\n )\n\n const handleSuggestionClick = useCallback(\n (placeId: string) => {\n if (!places) return\n\n const detailRequestOptions = {\n placeId,\n fields: ['address_components'],\n sessionToken,\n locale,\n }\n\n const detailsRequestCallback = (\n placeDetails: google.maps.places.PlaceResult | null,\n ) => {\n setPredictionResults([])\n setSessionToken(new places.AutocompleteSessionToken())\n\n if (!placeDetails?.address_components) {\n return\n }\n\n const address = mapGooglePlacesAddress(placeDetails.address_components)\n\n onGoogleAddressSelected(address)\n }\n\n placesService?.getDetails(detailRequestOptions, detailsRequestCallback)\n },\n [locale, onGoogleAddressSelected, places, placesService, sessionToken],\n )\n\n const debouncedFetchPredictions = useDebounce(\n fetchPredictions,\n DEBOUNCE_DELAY,\n )\n\n const onInputChange = useCallback(\n (event: ChangeEvent) => {\n setIsPlacePredictionsLoading(true)\n onChange?.(event)\n debouncedFetchPredictions(event.target.value)\n },\n [debouncedFetchPredictions, onChange],\n )\n\n return (\n \n \n \n \n \n {placeholder}\n {value && value !== '' && (\n \n \n \n \n\n {isPlacePredictionsLoading ? (\n
\n \n \n \n
\n ) : predictionResults.length > 0 ? (\n predictionResults?.map((prediction) => {\n const text = [\n {\n text: prediction.structured_formatting.main_text + ', ',\n },\n {\n text: prediction.structured_formatting.secondary_text,\n className: 'text-neutral-gray-600',\n },\n ]\n\n return (\n handleSuggestionClick(prediction.place_id)}\n className=\"font-normal\"\n >\n {\n \n {text.map((text, index) => (\n \n {text.text}\n \n ))}\n \n }\n \n )\n })\n ) : (\n
\n \n \n \n
\n )}\n
\n )}\n
\n
\n )\n}\n","import { Big } from 'big.js'\n\nimport { Currency } from '@/constants/currency'\n\nexport function formatMoney(\n amount: number | string,\n currency = Currency.USD,\n options: { signDisplay?: boolean } = {},\n) {\n const amountAsNumber =\n typeof amount === 'string' ? Big(amount).toNumber() : amount\n\n if (Number.isNaN(amountAsNumber)) {\n return '$0'\n }\n\n const decimalFormatter = new Intl.NumberFormat('en-US', {\n style: 'currency',\n currency,\n signDisplay: options.signDisplay ? 'always' : undefined,\n })\n\n const nonDecimalFormatter = new Intl.NumberFormat('en-US', {\n style: 'currency',\n currency,\n minimumFractionDigits: 0,\n maximumFractionDigits: 0,\n signDisplay: options.signDisplay ? 'always' : undefined,\n })\n\n const numberToFixed = Number(Big(amountAsNumber).toFixed(2))\n\n const hasDecimal = numberToFixed % 1 !== 0\n\n if (hasDecimal) {\n return decimalFormatter.format(numberToFixed)\n }\n\n return nonDecimalFormatter.format(numberToFixed)\n}\n\nexport function formatCurrency(currency?: Currency): Currency {\n switch (currency) {\n case Currency.USDC:\n return 'USDc' as Currency\n\n case Currency.EURC:\n return 'EURc' as Currency\n\n default:\n return currency as Currency\n }\n}\n\nexport function formatAmount(\n amount: {\n amount: number | string\n currency: Currency\n },\n options: { signDisplay?: boolean } = {},\n) {\n return (\n formatMoney(amount.amount, Currency.USD, options) +\n ' ' +\n formatCurrency(amount.currency)\n )\n}\n\nexport function formatRate(rate?: number | string) {\n return Big(rate ?? 0).toFixed(4)\n}\n\nexport function formatPercentage(percentage?: number | string) {\n return `${Big(percentage ?? 0).toFixed(2)}%`\n}\n\nexport function calculateProgress({\n value,\n total,\n}: {\n value?: number | string\n total?: number | string\n}) {\n if (!value || !total) {\n return 0\n }\n return new Big(value).div(total).times(100).toNumber()\n}\n","import { useIntl } from 'react-intl'\n\nimport { flagByCurrency } from '@/constants/countries'\nimport { Currency } from '@/constants/currency'\nimport { getFlagUrl } from '@/lib/images'\nimport { formatCurrency } from '@/lib/money'\nimport { CountryCode } from '@/types/country'\n\nimport { Typography } from '../ui'\n\ntype Props = {\n currency?: Currency\n countryCode?: CountryCode\n flagCode?: 'us' | 'mx'\n}\n\nexport const CurrencyFlag = ({\n currency = Currency.USDC,\n countryCode = CountryCode.US,\n}: Props) => {\n const intl = useIntl()\n\n return (\n
\n \n {formatCurrency(currency)}\n
\n )\n}\n","import { forwardRef } from 'react'\n\nimport { Currency } from '@/constants/currency'\nimport { cn } from '@/lib/utils'\nimport { CountryCode } from '@/types/country'\n\nimport { AnimatedFormLabel, Card, FormControl, MoneyInput } from '../ui'\n\nimport { CurrencyFlag } from './CurrencyFlag'\n\nexport interface AmountInputProps\n extends Omit, 'onChange'> {\n currency?: Currency\n countryCode?: CountryCode\n disabled?: boolean\n placeholder?: string\n value?: string\n onChange?: (value: string) => void\n}\n\nexport const AmountInput = forwardRef(\n (\n { currency, countryCode, disabled, placeholder, value, onChange, ...props },\n ref,\n ) => {\n return (\n \n \n\n \n \n \n\n {placeholder}\n \n )\n },\n)\n\nAmountInput.displayName = 'AmountInput'\n","import { Check } from '@/shared/icons/outline'\nimport { MotionDiv, Spinner, Typography } from '@/shared/ui'\n\ntype Props = {\n name?: string\n isPending?: boolean\n}\n\nexport const BankName = ({ name, isPending }: Props) => {\n return (\n
\n {isPending ? (\n \n ) : name ? (\n \n {name}\n \n \n \n \n ) : null}\n
\n )\n}\n","export const queryKeys = {\n // BUSINESS\n\n // Identity\n getBusinessIdentity: 'getBusinessIdentity',\n getIdentity: 'getIdentity',\n\n // Account\n getAccount: 'getAccount',\n getAccountDetails: 'getAccountDetails',\n getDefaultAccountDetails: 'getDefaultAccountDetails',\n getAccountStatements: 'getAccountStatements',\n getStatementsCreditCycleInfo: 'getStatementsCreditCycleInfo',\n\n // Authentication\n getCurrent2FAMethod: 'getCurrent2FAMethod',\n get2FASetupInfo: 'get2FASetupInfo',\n\n // Bulk Payments\n quoteBulkPayment: 'quoteBulkPayment',\n\n // Team\n getTeamMembers: 'getTeamMembers',\n getTeamMember: 'getTeamMember',\n getBusinessUser: 'getBusinessUser',\n getTeamMemberPaymentLimit: 'getTeamMemberPaymentLimit',\n getPaymentLimit: 'getPaymentLimit',\n getBusinessPaymentLimits: 'getBusinessPaymentLimits',\n\n // Tasks\n getAdminTasks: 'getAdminTasks',\n getAdminTask: 'getAdminTask',\n getUserTasks: 'getUserTasks',\n getUserTask: 'getUserTask',\n getTasksCount: 'getTasksCount',\n getWithdrawalTaskDetails: 'getWithdrawalTaskDetails',\n getBulkPaymentTaskDetails: 'getBulkPaymentTaskDetails',\n\n // Cards\n getAllCards: 'getAllCards',\n getUserCards: 'getUserCards',\n getSingleCard: 'getSingleCard',\n getUnmaskedCardDetails: 'getUnmaskedCardDetails',\n getCardTransactions: 'getCardTransactions',\n getCardDeliveryDetails: 'getCardDeliveryDetails',\n\n // Transactions\n getTransactions: 'getTransactions',\n getTransaction: 'getTransaction',\n getTransactionCurrencies: 'getTransactionCurrencies',\n getCashbackTransactions: 'getCashbackTransactions',\n getBulkTransaction: 'getBulkTransaction',\n getBulkTransactions: 'getBulkTransactions',\n createBulkPayment: 'createBulkPayment',\n getCSVTransactions: 'getCSVTransactions',\n getCSVFiles: 'getCSVFiles',\n\n // Recipients\n getRecipients: 'getRecipients',\n getSingleRecipient: 'getSingleRecipient',\n getRecipientBank: 'getRecipientBank',\n getRecentRecipients: 'getRecentRecipients',\n getDolarAppUsers: 'getDolarAppUsers',\n\n // Contractors\n getContractor: 'getContractor',\n getContractors: 'getContractors',\n calculateProRata: 'calculateProRata',\n getAllContractDocuments: 'getAllContractDocuments',\n getHistoricalPayments: 'getHistoricalPayments',\n getHistoricalPayment: 'getHistoricalPayment',\n getPaymentCycles: 'getPaymentCycles',\n getPaymentCyclesCount: 'getPaymentCyclesCount',\n getOffCycleDetails: 'getOffCycleDetails',\n getContractorPayments: 'getContractorPayments',\n getPaymentCycleDetails: 'getPaymentCycleDetails',\n\n // Onboarding\n getOnboardingState: 'getOnboardingState',\n getOnboardingConfig: 'getOnboardingConfig',\n getOnboardingStepDetails: 'getOnboardingStepDetails',\n getOnboardingCountries: 'getOnboardingCountries',\n startIdentityValidation: 'startIdentityValidation',\n restartIdentityValidation: 'restartIdentityValidation',\n getBeneficialOwner: 'getBeneficialOwner',\n\n // Miscellaneous\n getFXRates: 'getFXRates',\n getCountryCodes: 'getCountryCodes',\n getCompanyTypes: 'getCompanyTypes',\n getGooglePlacesDetails: 'getGooglePlacesDetails',\n getPriceChartRates: 'getPriceChartRates',\n getBankByReference: 'getBankByReference',\n getFeatures: 'getFeatures',\n\n // CONTRACTOR\n\n // Details\n getContractorDetails: 'getContractorDetails',\n getCurrentContractor: 'getCurrentContractor',\n getContractorTransactions: 'getContractorTransactions',\n\n // Documents\n getContractorDocuments: 'getContractorDocuments',\n\n // Authentication\n getContractor2FAMethod: 'getContractor2FAMethod',\n getContractor2FASetupInfo: 'getContractor2FASetupInfo',\n\n // Onboarding\n getContractorCompany: 'getContractorCompany',\n getContactorBank: 'getContactorBank',\n getContractorOnboardingState: 'getContractorOnboardingState',\n getContractorPaymentMethods: 'getContractorPaymentMethods',\n\n // DolarTag\n linkDolarTag: 'linkDolarTag',\n getDolarTagLinkingState: 'getDolarTagLinkingState',\n}\n","import { Locale } from '@/constants/locales'\n\nexport const BASE_API_DEV = `https://api.business.dolarapp.dev`\nexport const BASE_API_PROD = `https://api.business.dolarapp.com`\n\nexport const BASE_CONTRACTOR_API_DEV = `https://contractor-api.business.dolarapp.dev`\nexport const BASE_CONTRACTOR_API_PROD = `https://contractor-api.business.dolarapp.com`\n\nexport const CALENDLY_URL = 'https://calendly.com/juan_dolarapp/onboarding'\nexport const BRIDGE_LEGAL_URL = 'https://bridge.xyz/legal'\nexport const DOLAR_APP_TERMS_URL =\n 'https://cdn.dolarapp.com/legal/Terminos+y+Condiciones+-+DolarApp+Business.pdf'\nexport const DOLAR_APP_PRIVACY_URL = `https://cdn.dolarapp.com/legal/privacy-policy-mexico.pdf`\n\nexport const BULK_PAYMENT_TEMPLATE_EN = `https://cdn.dolarapp.com/business/dab-bulk-payment.csv`\nexport const BULK_PAYMENT_TEMPLATE_ES = `https://cdn.dolarapp.com/business/dab-pago-masivo.csv`\n\nexport const BULK_PAYMENT_GUIDE_EN = `https://cdn.dolarapp.com/business/dab-bp-template-guide.pdf`\nexport const BULK_PAYMENT_GUIDE_ES = `https://cdn.dolarapp.com/business/dab-pm-guia-plantilla.pdf`\n\nexport const templateUrlByLocale: Record = {\n [Locale.ES]: BULK_PAYMENT_TEMPLATE_ES,\n [Locale.EN]: BULK_PAYMENT_TEMPLATE_EN,\n}\n\nexport const guideUrlByLocale: Record = {\n [Locale.ES]: BULK_PAYMENT_GUIDE_ES,\n [Locale.EN]: BULK_PAYMENT_GUIDE_EN,\n}\n","import { contractorApi } from '@/lib/api'\n\nexport function activatePaymentMethod(id: string) {\n return contractorApi.post(`/v1/payment-methods/${id}`)\n}\n","import { contractorApi } from '@/lib/api'\nimport { CountryCode } from '@/types/country'\n\nexport function getContactorBank({\n country,\n bankReference,\n}: {\n country: CountryCode\n bankReference: string\n}) {\n return contractorApi.get<{ name: string }>(\n `/v1/me/bank-info/${country}/references/${bankReference} `,\n )\n}\n","import { contractorApi } from '@/lib/api'\nimport { TwoFactorMethod } from '@/types/auth'\n\nexport type Current2FAResponse = {\n identityId: string\n otpMethod: TwoFactorMethod\n initialSetup: boolean\n}\n\nexport function getContractor2FAMethod() {\n return contractorApi.get(`/v1/me/one-time-passwords/2FA`)\n}\n","import { contractorApi } from '@/lib/api'\n\nexport type Setup2FAInfoResponse = {\n identityId: string\n plainTextSecret: string\n qrCodeUrl: string\n}\n\ntype Setup2FAInfoRequest = {\n reset?: boolean\n}\n\nexport function getContractor2FASetupInfo({ reset }: Setup2FAInfoRequest) {\n const searchParams = new URLSearchParams()\n\n if (reset) {\n searchParams.set('reset', 'true')\n }\n\n return contractorApi.post(\n `/v1/me/one-time-passwords/2FA/secret?${searchParams.toString()}`,\n )\n}\n","import { contractorApi } from '@/lib/api'\n\nimport { ExternalContractorCompany } from '../types'\n\nexport function getContractorCompany() {\n return contractorApi.get(`/v1/my/business`)\n}\n","import { ContractorDetails } from '@/domains/Contractor/types'\nimport { contractorApi } from '@/lib/api'\n\nexport function getContractorDetails() {\n return contractorApi.get(`/v1/my/contractor/details`)\n}\n","import { contractorApi } from '@/lib/api'\n\nimport { ContractorOnboardingPaymentMethod } from '../types'\n\nexport function getContractorPaymentMethods() {\n return contractorApi.get(\n '/v1/payment-methods',\n )\n}\n","import { contractorApi } from '@/lib/api'\nimport { handleDateQueryParams } from '@/lib/date'\n\nimport { ContractorsTransaction } from '../types'\n\nexport const getContractorTransactions = (\n params: Record = {},\n) => {\n const searchQuery = handleDateQueryParams(params)\n\n const search =\n searchQuery.toString().length > 0 ? `?${searchQuery.toString()}` : ''\n\n return contractorApi.get(\n `/v1/my/contractor-payments/search${search}`,\n )\n}\n","import { contractorApi } from '@/lib/api'\n\nimport { ExternalContractor } from '../types'\n\nexport function getCurrentContractor() {\n return contractorApi.get(`/v1/my/contractor`)\n}\n","import forge from 'node-forge'\n\nimport { sessionStorageKeys } from '@/constants/keys'\n\nexport function hashSHA256Fingerprint(fingerprint: string) {\n return crypto.subtle.digest('SHA-256', new TextEncoder().encode(fingerprint))\n}\n\nexport async function generateFingerprint() {\n const { language, languages } = navigator\n\n const fingerprint = {\n language,\n languages,\n timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n }\n\n const hash = await hashSHA256Fingerprint(JSON.stringify(fingerprint))\n\n const response = Array.from(new Uint8Array(hash))\n\n const hashed = response.map((b) => b.toString(16).padStart(2, '0')).join('')\n\n return hashed\n}\n\nexport function cleanupPublicKey(key: string) {\n return key\n .replace(/-----BEGIN PUBLIC KEY-----/, '')\n .replace(/-----END PUBLIC KEY-----/, '')\n .replace(/\\s+/g, '')\n}\n\nexport async function generateRSAKeyPairForCards() {\n const publicKeyFromStorage = sessionStorage.getItem(\n sessionStorageKeys.cardsDetailsPublicKey,\n )\n\n const privateKeyFromStorage = sessionStorage.getItem(\n sessionStorageKeys.cardsDetailsPrivateKey,\n )\n\n if (publicKeyFromStorage && privateKeyFromStorage) {\n return\n }\n\n const rsa = forge.pki.rsa\n\n rsa.generateKeyPair({ bits: 2048, workers: 2 }, (err, pair) => {\n if (err) {\n console.error(err)\n return\n }\n\n const publicKey = forge.pki.publicKeyToPem(pair.publicKey)\n const privateKey = forge.pki.privateKeyToPem(pair.privateKey)\n\n sessionStorage.setItem(sessionStorageKeys.cardsDetailsPublicKey, publicKey)\n sessionStorage.setItem(\n sessionStorageKeys.cardsDetailsPrivateKey,\n privateKey,\n )\n })\n}\n","import {\n BASE_CONTRACTOR_API_DEV,\n BASE_CONTRACTOR_API_PROD,\n} from '@/constants/urls'\nimport { generateFingerprint } from '@/lib/fingerprint'\nimport { isProduction } from '@/lib/utils'\n\nexport type RefreshTokenRequest = {\n refreshToken: string\n}\n\nconst BASE_URL = isProduction()\n ? BASE_CONTRACTOR_API_PROD\n : BASE_CONTRACTOR_API_DEV\n\n// we use fetch cause we make this request inside axios interceptor\nexport async function refreshContractorToken() {\n const token = sessionStorage.getItem('access-token')\n const refreshToken = sessionStorage.getItem('refresh-token')\n\n const deviceFingerprint = await generateFingerprint()\n\n if (!token || !refreshToken) {\n return Promise.reject('No token or device id or refresh token')\n }\n\n return fetch(`${BASE_URL}/v1/authentication/refresh-token`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${token}`,\n 'Device-Fingerprint': deviceFingerprint,\n },\n body: JSON.stringify({ refreshToken }),\n })\n}\n","import { contractorApi } from '@/lib/api'\n\nimport { Current2FAResponse } from './getContractor2FAMethod'\n\ntype Setup2FARequest = {\n method: 'AUTHENTICATOR_APP'\n code: string\n}\n\nexport function setupContractor2FA(data: Setup2FARequest) {\n return contractorApi.post(\n `/v1/me/one-time-passwords/2FA/setup`,\n data,\n )\n}\n","import { contractorApi } from '@/lib/api'\n\nexport function unlinkPaymentMethod(id: string) {\n return contractorApi.delete(`/v1/payment-methods/${id}`)\n}\n","import axios from 'axios'\nimport { jwtDecode } from 'jwt-decode'\n\nimport { sessionStorageKeys } from '@/constants/keys'\nimport {\n BASE_API_DEV,\n BASE_API_PROD,\n BASE_CONTRACTOR_API_DEV,\n BASE_CONTRACTOR_API_PROD,\n} from '@/constants/urls'\nimport { refreshToken } from '@/domains/Business/api'\nimport { refreshContractorToken } from '@/domains/Contractor/api'\nimport { isDevelopment } from '@/lib/utils'\n\nimport { generateFingerprint } from './fingerprint'\n\nconst AUTH_HEADER = 'authorization'\n\nconst FIVE_MINUTES = 5 * 60 * 1000\n\nexport const api = axios.create({\n baseURL: isDevelopment() ? BASE_API_DEV : BASE_API_PROD,\n})\n\n// same as api but without authorization\nexport const publicApi = axios.create({\n baseURL: isDevelopment() ? BASE_API_DEV : BASE_API_PROD,\n})\n\napi.interceptors.request.use(async (config) => {\n const accessToken = sessionStorage.getItem(sessionStorageKeys.accessToken)\n\n const deviceFingerprint = await generateFingerprint()\n\n config.headers['Device-Fingerprint'] = deviceFingerprint\n\n if (accessToken) {\n config.headers.Authorization = `Bearer ${accessToken}`\n\n const decoded = jwtDecode(accessToken)\n\n const expires = decoded.exp ? decoded.exp * 1000 : 0\n\n // If the token expires in less than 5 minutes, refresh it\n if (expires - Date.now() < FIVE_MINUTES) {\n refreshToken()\n .then((response) => {\n const auth = response.headers.get(AUTH_HEADER)\n\n if (auth) {\n const [, token] = auth.split(' ')\n\n sessionStorage.setItem(sessionStorageKeys.accessToken, token)\n }\n })\n .catch((error) => {\n console.error('Error refreshing token', error)\n })\n }\n }\n\n return config\n})\n\napi.interceptors.response.use(\n (response) => {\n const auth = response.headers[AUTH_HEADER]\n\n if (auth) {\n const [, token] = auth.split(' ')\n\n sessionStorage.setItem(sessionStorageKeys.accessToken, token)\n }\n\n return response\n },\n (error) => {\n return Promise.reject(error)\n },\n)\n\nexport const contractorApi = axios.create({\n baseURL: isDevelopment() ? BASE_CONTRACTOR_API_DEV : BASE_CONTRACTOR_API_PROD,\n})\n\ncontractorApi.interceptors.request.use(async (config) => {\n const accessToken = sessionStorage.getItem(sessionStorageKeys.accessToken)\n\n const deviceFingerprint = await generateFingerprint()\n\n config.headers['Device-Fingerprint'] = deviceFingerprint\n\n if (accessToken) {\n config.headers.Authorization = `Bearer ${accessToken}`\n\n const decoded = jwtDecode(accessToken)\n\n const expires = decoded.exp ? decoded.exp * 1000 : 0\n\n // If the token expires in less than 5 minutes, refresh it\n if (expires - Date.now() < FIVE_MINUTES) {\n refreshContractorToken()\n .then((response) => {\n const auth = response.headers.get(AUTH_HEADER)\n\n if (auth) {\n const [, token] = auth.split(' ')\n\n sessionStorage.setItem(sessionStorageKeys.accessToken, token)\n }\n })\n .catch((error) => {\n console.error('Error refreshing token', error)\n })\n }\n }\n\n return config\n})\n\ncontractorApi.interceptors.response.use(\n (response) => {\n const auth = response.headers[AUTH_HEADER]\n\n if (auth) {\n const [, token] = auth.split(' ')\n\n sessionStorage.setItem(sessionStorageKeys.accessToken, token)\n }\n\n return response\n },\n (error) => {\n return Promise.reject(error)\n },\n)\n","import { api } from '@/lib/api'\n\nexport function downloadInvoice({ transactionId }: { transactionId: string }) {\n return api.get(\n `/v1/me/contractor-invoices/transaction/${transactionId}`,\n { responseType: 'blob' },\n )\n}\n","import { api } from '@/lib/api'\n\nexport type Setup2FAInfoResponse = {\n identityId: string\n plainTextSecret: string\n qrCodeUrl: string\n}\n\ntype Setup2FAInfoRequest = {\n reset?: boolean\n}\n\nexport function get2FASetupInfo({ reset }: Setup2FAInfoRequest) {\n const searchParams = new URLSearchParams()\n\n if (reset) {\n searchParams.set('reset', 'true')\n }\n\n return api.post(\n `/v1/me/one-time-passwords/2FA/secret?${searchParams.toString()}`,\n )\n}\n","import { api } from '@/lib/api'\nimport { CountryCode } from '@/types/country'\n\nexport function getBankByReference({\n country,\n bankReference,\n}: {\n country: CountryCode\n bankReference: string\n}) {\n return api.get<{ name: string }>(\n `/v1/me/bank-info/${country}/references/${bankReference} `,\n )\n}\n","import { api } from '@/lib/api'\n\nimport { BusinessIdentity } from '../types'\n\nexport function getBusinessIdentity() {\n return api.get('/v1/me/business/details')\n}\n","import { api } from '@/lib/api'\n\nimport { PaymentLimit } from '../types'\n\nexport function getBusinessPaymentLimits() {\n return api.get('/v1/me/business/payment-limits')\n}\n","import { api } from '@/lib/api'\n\nimport { BusinessUser } from '../types'\n\nexport function getBusinessUser() {\n return api.get('/v1/my/business-users')\n}\n","import { publicApi } from '@/lib/api'\nimport { CountryData } from '@/types/country'\n\ntype GetCountryCodesParams = {\n showAllCountries?: boolean\n}\n\nexport function getCountryCodes({\n showAllCountries = false,\n}: GetCountryCodesParams) {\n const query = showAllCountries ? '' : '?acceptedPhoneNumbers=true'\n\n return publicApi.get(`/v2/signup/country-codes${query}`)\n}\n","import { api } from '@/lib/api'\nimport { TwoFactorMethod } from '@/types/auth'\n\nexport type Current2FAResponse = {\n identityId: string\n otpMethod: TwoFactorMethod\n initialSetup: boolean\n}\n\nexport function getCurrent2FAMethod() {\n return api.get(`/v1/me/one-time-passwords/2FA`)\n}\n","import { api } from '@/lib/api'\n\nimport { Features } from '../types'\n\nexport function getFeatures() {\n return api.get(`/v1/me/features`)\n}\n","import { api } from '@/lib/api'\n\ntype RatesRequest = {\n from: string\n to: string\n}\n\nexport type FXRatesResponse = {\n symbol: string\n bidRate: number // buy rate\n askRate: number // sell rate\n midRate: number\n rateChangeToday: number\n rateChangeTodayPercentage: number\n}\n\nexport function getFXRates({ from, to }: RatesRequest) {\n return api.get(`/v1/me/fx-rate?ticker=${from}_${to}`)\n}\n","import { api } from '@/lib/api'\n\nimport { Identity } from '../types'\n\nexport function getIdentity() {\n return api.get('/v1/me/identity/details')\n}\n","import { Currency } from '@/constants/currency'\nimport { api } from '@/lib/api'\nimport { ChartFXRate, Period } from '@/types/recharts'\n\ntype ChartRatesRequest = {\n currency: Currency\n period: Period\n}\n\nexport type PriceChartRatesResponse = {\n baseCurrency: Currency\n endDate: string\n startDate: string\n localCurrency: Currency\n period: Period\n fxRates: ChartFXRate[]\n}\n\nexport function getPriceChartRates({ currency, period }: ChartRatesRequest) {\n return api.get(\n `/v1/price-chart?currency=${currency}&period=${period}`,\n )\n}\n","import { api } from '@/lib/api'\n\ntype RatesWithFeesRequest = {\n from: string\n to: string\n}\n\nexport type RatesWithFeesResponse = {\n fxRate: number\n}\n\nexport function getRatesWithFees({ from, to }: RatesWithFeesRequest) {\n return api.get(\n `/v1/me/withdrawal-quotes/from/${from}/to/${to}`,\n )\n}\n","import { BASE_API_DEV, BASE_API_PROD } from '@/constants/urls'\nimport { generateFingerprint } from '@/lib/fingerprint'\nimport { isProduction } from '@/lib/utils'\n\nexport type RefreshTokenRequest = {\n refreshToken: string\n}\n\nconst BASE_URL = isProduction() ? BASE_API_PROD : BASE_API_DEV\n\n// we use fetch cause we make this request inside axios interceptor\nexport async function refreshToken() {\n const token = sessionStorage.getItem('access-token')\n const refreshToken = sessionStorage.getItem('refresh-token')\n\n const deviceFingerprint = await generateFingerprint()\n\n if (!token || !refreshToken) {\n return Promise.reject('No token or device id or refresh token')\n }\n\n return fetch(`${BASE_URL}/v1/authentication/refresh-token`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${token}`,\n 'Device-Fingerprint': deviceFingerprint,\n },\n body: JSON.stringify({ refreshToken }),\n })\n}\n","import { api } from '@/lib/api'\n\nimport { Current2FAResponse } from './getCurrent2FAMethod'\n\ntype Setup2FARequest = {\n method: 'AUTHENTICATOR_APP'\n code: string\n}\n\nexport function setup2FAAuthenticator(data: Setup2FARequest) {\n return api.post(\n `/v1/me/one-time-passwords/2FA/setup`,\n data,\n )\n}\n","import { Permission, Role } from '../../types'\n\nexport const MOCKED_BUSINESS_USER = {\n id: 'ab9890c1-8ed5-4f52-a1fd-1039ba5ddce4',\n businessId: 'c002df21-b54c-4ace-8f54-52b4d3a2a2bb',\n identityId: '00283379-242d-4cae-8e12-2d8fd831d9fa',\n email: 'maks@dolarapp.com',\n userTitle: undefined,\n firstName: 'Maks',\n lastName: 'Akymenko',\n secondLastName: '',\n state: 'ACTIVE',\n role: Role.ADMIN,\n permissions: [\n Permission.TEAM_MANAGEMENT,\n Permission.CARDS_MANAGEMENT,\n Permission.CARDS_ACCESS,\n Permission.TRANSFERS,\n Permission.READ_ACCESS,\n Permission.REQUEST_APPROVALS,\n ],\n}\n\nexport const MOCKED_PAYMENT_OPS_BUSINESS_USER = {\n id: '0ceaf1d2-20b6-4de0-8e74-ad514f0df81c',\n businessId: 'c002df21-b54c-4ace-8f54-52b4d3a2a2bb',\n identityId: 'baa98df2-0831-4ac9-954f-346de5b66f41',\n email: 'john.doe@test.com',\n userTitle: undefined,\n firstName: 'John',\n lastName: 'Doe',\n secondLastName: undefined,\n state: 'ACTIVE',\n role: Role.PAYMENT_OPS,\n permissions: [\n Permission.TEAM_MANAGEMENT,\n Permission.TRANSFERS,\n Permission.READ_ACCESS,\n Permission.REQUEST_APPROVALS,\n ],\n}\n","export const MOCK_COUNTRY_CODES = [\n {\n name: 'Argentina',\n nameToShow: 'Argentina',\n flag: '\\uD83C\\uDDE6\\uD83C\\uDDF7',\n internationalPhonePrefix: '+54',\n isoCode: 'ARG',\n },\n {\n name: 'Colombia',\n nameToShow: 'Colombia',\n flag: '\\uD83C\\uDDE8\\uD83C\\uDDF4',\n internationalPhonePrefix: '+57',\n isoCode: 'COL',\n },\n {\n name: 'Mexico',\n nameToShow: 'Mexico',\n flag: '\\uD83C\\uDDF2\\uD83C\\uDDFD',\n internationalPhonePrefix: '+52',\n isoCode: 'MEX',\n },\n {\n name: 'United States of America',\n nameToShow: 'USA',\n flag: '\\uD83C\\uDDFA\\uD83C\\uDDF8',\n internationalPhonePrefix: '+1',\n isoCode: 'USA',\n },\n]\n","import { CountryCode, CountryTaxId } from '@/types/country'\n\nimport { BusinessIdentity, BusinessState, Identity } from '../../types'\n\nexport const IDENTITY_MOCK_RESPONSE: Identity = {\n id: 'baa98df2-0831-4ac9-954f-346de5b66f41',\n email: 'john.doe@test.com',\n state: 'ACTIVE',\n firstName: 'John',\n lastName: 'Doe',\n phoneNumber: {\n internationalPhonePrefix: '+52',\n localPhoneNumber: '5512341234',\n },\n}\n\nexport const BUSINESS_IDENTITY_MOCK_RESPONSE: BusinessIdentity = {\n countryOfIncorporation: CountryCode.MX,\n id: 'c002df21-b54c-4ace-8f54-52b4d3a2a2bb',\n legalName: 'John Doe AAA.',\n taxId: 'EBC451231AAA',\n taxIdType: CountryTaxId.MX,\n state: BusinessState.ACTIVE,\n addressCity: 'Mexico City',\n addressMunicipality: 'Mexico City',\n addressNeighborhood: 'Colonia del Valle',\n addressPostalCode: '03100',\n addressState: 'CDMX',\n addressStreet: 'Avenida Insurgentes Sur',\n addressStreetNumber: '123',\n dateOfIncorporation: '2020-01-01',\n}\n\nexport const BUSINESS_IDENTITY_MOCK_ONBOARDING: BusinessIdentity = {\n countryOfIncorporation: CountryCode.MX,\n id: '826f70e8-88c3-4fdd-9514-66b3a9c6e47e',\n legalName: 'John Doe AAA.',\n taxId: 'EBC451231AAA',\n taxIdType: CountryTaxId.MX,\n state: BusinessState.ONBOARDING,\n addressCity: 'Mexico City',\n addressMunicipality: 'Mexico City',\n addressNeighborhood: 'Colonia del Valle',\n addressPostalCode: '03100',\n addressState: 'CDMX',\n addressStreet: 'Avenida Insurgentes Sur',\n addressStreetNumber: '123',\n dateOfIncorporation: '2020-01-01',\n}\n","import { Currency } from '@/constants/currency'\n\nimport { PaymentLimit, PaymentLimitType } from '../../types'\n\nexport const MOCK_PAYMENT_LIMITS: PaymentLimit = {\n businessId: 'c002df21-b54c-4ace-8f54-52b4d3a2a2bb',\n periodTransferLimit: {\n limitType: PaymentLimitType.WEEKLY,\n limitAmount: 1000,\n usedAmount: 500,\n limitCurrency: Currency.USD,\n periodStartDate: '2024-08-19T05:00:00',\n periodResetDate: '2024-08-19T05:00:00',\n },\n}\n","import { Currency } from '@/constants/currency'\n\nexport enum Period {\n Day = '1D',\n Week = '1W',\n Month = '1M',\n SixMonths = '6M',\n Year = '1Y',\n FiveYears = '5Y',\n}\n\nexport type AxisProps = {\n textAnchor: 'middle' | 'start' | 'end'\n verticalAnchor: 'start' | 'middle' | 'end'\n orientation: 'top' | 'bottom' | 'left' | 'right'\n width: number\n height: number\n x: number\n y: number\n className: string\n stroke: string\n fill: string\n index: number\n payload: {\n coordinate: number\n value: number\n index: number\n offset: number\n tickCoord: number\n isShow: boolean\n }\n visibleTicksCount: number\n}\n\nexport type ChartFXRate = {\n ask: number\n mid: number\n bid: number\n baseCurrency: Currency\n book: string\n createdAt: string\n id: string\n localCurrency: Currency\n}\n\nexport type ChartFXRateWithTimestamp = Omit & {\n createdAt: number\n}\n","import { Currency } from '@/constants/currency'\nimport { Period } from '@/types/recharts'\n\nimport { PriceChartRatesResponse } from '../getPriceChartRates'\n\nexport const PRICE_CHART_RATES: PriceChartRatesResponse = {\n period: Period.Day,\n localCurrency: Currency.MXN,\n baseCurrency: Currency.USD,\n startDate: '2024-05-22T17:20:00',\n endDate: '2024-05-23T17:23:00.108074',\n fxRates: [\n {\n id: '5aa0700c-17b5-4f32-96d3-037fb6621ba3',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.7727,\n bid: 16.438,\n mid: 16.60535,\n createdAt: '2024-05-22T17:20:00',\n },\n {\n id: '5ef37a0b-e9d6-4ece-a1b1-1c7ef4ced200',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.7838,\n bid: 16.4419,\n mid: 16.61285,\n createdAt: '2024-05-22T17:30:00',\n },\n {\n id: '5f061737-03fd-49ac-b32b-351a485c636a',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.7899,\n bid: 16.4538,\n mid: 16.62185,\n createdAt: '2024-05-22T17:40:00',\n },\n {\n id: '0d9cc9af-dcb3-4677-a9d3-006b6a335e42',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8061,\n bid: 16.4617,\n mid: 16.6339,\n createdAt: '2024-05-22T17:50:00',\n },\n {\n id: '38fb3bb7-bb87-412b-86f2-85f5f1b0beb4',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8,\n bid: 16.4568,\n mid: 16.6284,\n createdAt: '2024-05-22T18:00:00',\n },\n {\n id: 'bed61e09-4090-46a6-84f8-645a712c777f',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8111,\n bid: 16.4696,\n mid: 16.64035,\n createdAt: '2024-05-22T18:10:00',\n },\n {\n id: 'b02df85a-0276-41e3-9f47-7c82e67edbdd',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8414,\n bid: 16.4944,\n mid: 16.6679,\n createdAt: '2024-05-22T18:20:00',\n },\n {\n id: '13d4dccf-e356-44a4-bf58-6743f17ff19c',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8535,\n bid: 16.5073,\n mid: 16.6804,\n createdAt: '2024-05-22T18:30:00',\n },\n {\n id: '6bbaf537-0660-47bd-9095-2e449f976b3b',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8465,\n bid: 16.5063,\n mid: 16.6764,\n createdAt: '2024-05-22T18:40:00',\n },\n {\n id: '0c8f39d3-4890-4578-be1b-4b48915074df',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8475,\n bid: 16.4993,\n mid: 16.6734,\n createdAt: '2024-05-22T18:50:00',\n },\n {\n id: 'efed3396-bcc5-41f4-bb04-14507daf96e4',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8283,\n bid: 16.4884,\n mid: 16.65835,\n createdAt: '2024-05-22T19:00:00',\n },\n {\n id: '681b4c56-7dc9-4ba1-aed3-9b68d6d45500',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8374,\n bid: 16.4914,\n mid: 16.6644,\n createdAt: '2024-05-22T19:10:00',\n },\n {\n id: '23e7a736-bff8-48dc-9473-011f66a48edd',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8354,\n bid: 16.4964,\n mid: 16.6659,\n createdAt: '2024-05-22T19:20:00',\n },\n {\n id: 'b2fbe320-77cd-4201-9156-f8e0441c4a68',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8333,\n bid: 16.4875,\n mid: 16.6604,\n createdAt: '2024-05-22T19:30:00',\n },\n {\n id: 'f9f754f6-f718-4b5a-b8cc-b87170797c21',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8303,\n bid: 16.4845,\n mid: 16.6574,\n createdAt: '2024-05-22T19:40:00',\n },\n {\n id: 'abe25dfc-b4f0-4afa-beb9-a60bf77da673',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8293,\n bid: 16.4845,\n mid: 16.6569,\n createdAt: '2024-05-22T19:50:00',\n },\n {\n id: '56932cf1-85cd-4417-b242-74184c9b15e1',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8212,\n bid: 16.4746,\n mid: 16.6479,\n createdAt: '2024-05-22T20:00:00',\n },\n {\n id: '05ac4242-d6cd-46c9-9b45-ecd8ae9d44a6',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8141,\n bid: 16.4686,\n mid: 16.64135,\n createdAt: '2024-05-22T20:10:00',\n },\n {\n id: 'ce96e9a3-79d3-4bab-9c96-c2cac010d544',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8172,\n bid: 16.4766,\n mid: 16.6469,\n createdAt: '2024-05-22T20:20:00',\n },\n {\n id: '95bc6c3c-a4b8-48e8-9dd8-5d50c470447b',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8242,\n bid: 16.4795,\n mid: 16.65185,\n createdAt: '2024-05-22T20:30:00',\n },\n {\n id: '862492ac-a28c-45f1-98f4-5b4ae7d4bca4',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8242,\n bid: 16.4815,\n mid: 16.65285,\n createdAt: '2024-05-22T20:40:00',\n },\n {\n id: '1afa1a02-99fc-4d2f-abdf-66d217227786',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8273,\n bid: 16.4865,\n mid: 16.6569,\n createdAt: '2024-05-22T20:50:00',\n },\n {\n id: '984322b2-2ce0-4b2a-8d2d-e0e6cb2fb3fb',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8263,\n bid: 16.4835,\n mid: 16.6549,\n createdAt: '2024-05-22T21:00:00',\n },\n {\n id: 'b0be5a4d-3cc9-4b8e-8c45-9d64690de723',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8152,\n bid: 16.4716,\n mid: 16.6434,\n createdAt: '2024-05-22T21:10:00',\n },\n {\n id: '40f72a03-8730-42e6-a776-60974585d238',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8192,\n bid: 16.4756,\n mid: 16.6474,\n createdAt: '2024-05-22T21:20:00',\n },\n {\n id: '8b95bdc7-c7ea-4644-bfd3-489c71e52da4',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8232,\n bid: 16.4756,\n mid: 16.6494,\n createdAt: '2024-05-22T21:30:00',\n },\n {\n id: '887440c7-483b-46b2-8cb9-5b767c3a40c6',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8222,\n bid: 16.4776,\n mid: 16.6499,\n createdAt: '2024-05-22T21:40:00',\n },\n {\n id: 'f2607ed7-ee3e-4f82-a613-0b6623443f2a',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8192,\n bid: 16.4795,\n mid: 16.64935,\n createdAt: '2024-05-22T21:50:00',\n },\n {\n id: 'deaedaec-2180-468f-b123-9c76aa7121b4',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8172,\n bid: 16.4716,\n mid: 16.6444,\n createdAt: '2024-05-22T22:00:00',\n },\n {\n id: '586f065a-cb79-4f64-a58f-b2219a14b831',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8141,\n bid: 16.4686,\n mid: 16.64135,\n createdAt: '2024-05-22T22:10:00',\n },\n {\n id: '545fb503-8b60-4ced-b48c-8c6154916392',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8162,\n bid: 16.4696,\n mid: 16.6429,\n createdAt: '2024-05-22T22:20:00',\n },\n {\n id: '459414f2-eaa9-4068-9c0c-d5e9671a0148',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.803,\n bid: 16.4647,\n mid: 16.63385,\n createdAt: '2024-05-22T22:30:00',\n },\n {\n id: '11fe1a1b-d3ad-4ec8-9627-495b1b970788',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8182,\n bid: 16.4736,\n mid: 16.6459,\n createdAt: '2024-05-22T22:40:00',\n },\n {\n id: '38f2bb1e-582b-4587-8be1-5afe34d834b3',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8162,\n bid: 16.4726,\n mid: 16.6444,\n createdAt: '2024-05-22T22:50:00',\n },\n {\n id: '2faa4a4f-c6ae-44d4-9633-a17ceb1306a9',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8162,\n bid: 16.4746,\n mid: 16.6454,\n createdAt: '2024-05-22T23:00:00',\n },\n {\n id: '6b446a50-2aaf-4485-b709-cc6eee5332e2',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8172,\n bid: 16.4716,\n mid: 16.6444,\n createdAt: '2024-05-22T23:10:00',\n },\n {\n id: '2ab9352f-d875-4d52-ab0e-cb241a6e85c8',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8192,\n bid: 16.4746,\n mid: 16.6469,\n createdAt: '2024-05-22T23:20:00',\n },\n {\n id: 'eb7f0f1b-d2df-4583-87e1-5cf79d81f792',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8172,\n bid: 16.4736,\n mid: 16.6454,\n createdAt: '2024-05-22T23:30:00',\n },\n {\n id: '5d0b1df8-6fab-4a06-b48f-46860573cf97',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8172,\n bid: 16.4726,\n mid: 16.6449,\n createdAt: '2024-05-22T23:40:00',\n },\n {\n id: 'cdedde1e-b42c-4fca-adca-e7b5d4f0ee9b',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8172,\n bid: 16.4726,\n mid: 16.6449,\n createdAt: '2024-05-22T23:50:00',\n },\n {\n id: 'e69416a2-d87c-4a4d-868e-36951d0406a7',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8222,\n bid: 16.4786,\n mid: 16.6504,\n createdAt: '2024-05-23T00:00:00',\n },\n {\n id: '8e34dd1c-7d7a-46d6-88a5-a0cd785bacf8',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8162,\n bid: 16.4746,\n mid: 16.6454,\n createdAt: '2024-05-23T00:10:00',\n },\n {\n id: 'cb3ae16f-0c36-4488-971d-c62b86d75a84',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8121,\n bid: 16.4736,\n mid: 16.64285,\n createdAt: '2024-05-23T00:20:00',\n },\n {\n id: '01c7a1a7-8365-4e20-94f9-24b4e347e9b6',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8162,\n bid: 16.4736,\n mid: 16.6449,\n createdAt: '2024-05-23T00:30:00',\n },\n {\n id: '323ab87c-2805-4b89-b113-d18ca162a163',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8162,\n bid: 16.4726,\n mid: 16.6444,\n createdAt: '2024-05-23T00:40:00',\n },\n {\n id: 'f7f611a3-0004-479d-a0ca-1ad751ff3eb8',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8141,\n bid: 16.4746,\n mid: 16.64435,\n createdAt: '2024-05-23T00:50:00',\n },\n {\n id: 'eec643e9-d801-4809-b14a-a9a5131c59b7',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8212,\n bid: 16.4756,\n mid: 16.6484,\n createdAt: '2024-05-23T01:00:00',\n },\n {\n id: 'c7dae147-38f1-4142-aee6-a9e6c5d9f185',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8172,\n bid: 16.4726,\n mid: 16.6449,\n createdAt: '2024-05-23T01:10:00',\n },\n {\n id: '403cd7d8-2fac-4869-9ebf-76d377b5f82b',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8141,\n bid: 16.4686,\n mid: 16.64135,\n createdAt: '2024-05-23T01:20:00',\n },\n {\n id: '228344f9-8388-4524-9533-a2dc0575178b',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8222,\n bid: 16.4756,\n mid: 16.6489,\n createdAt: '2024-05-23T01:30:00',\n },\n {\n id: 'cda174f6-e312-4437-bdfe-fa67ef77890b',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8212,\n bid: 16.4766,\n mid: 16.6489,\n createdAt: '2024-05-23T01:40:00',\n },\n {\n id: '07f55d9f-f930-4e04-8e2d-372bc3f7ef5b',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8212,\n bid: 16.4825,\n mid: 16.65185,\n createdAt: '2024-05-23T01:50:00',\n },\n {\n id: '3b89cdab-77d6-4709-8025-9e520a3a2e0c',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8293,\n bid: 16.4825,\n mid: 16.6559,\n createdAt: '2024-05-23T02:00:00',\n },\n {\n id: '39ce9feb-e698-48f4-ba56-fdcc7d87171b',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8283,\n bid: 16.4815,\n mid: 16.6549,\n createdAt: '2024-05-23T02:10:00',\n },\n {\n id: 'fa20ea3c-b42e-433b-a1af-53d96baa9eaa',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8333,\n bid: 16.4855,\n mid: 16.6594,\n createdAt: '2024-05-23T02:20:00',\n },\n {\n id: 'e6534726-4749-4e87-86c9-8b54b426f498',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8333,\n bid: 16.4875,\n mid: 16.6604,\n createdAt: '2024-05-23T02:30:00',\n },\n {\n id: 'fb5e394c-8e14-4fed-b183-cbb6e37cff1d',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8222,\n bid: 16.4766,\n mid: 16.6494,\n createdAt: '2024-05-23T02:40:00',\n },\n {\n id: '8a93a524-0a85-4f82-9230-545794f6309c',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8111,\n bid: 16.4706,\n mid: 16.64085,\n createdAt: '2024-05-23T02:50:00',\n },\n {\n id: '98f13c8c-10e2-467b-8ff3-428365cef234',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8091,\n bid: 16.4706,\n mid: 16.63985,\n createdAt: '2024-05-23T03:00:00',\n },\n {\n id: '0437ac8f-cd97-41dc-9be4-5fe3460670b9',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8081,\n bid: 16.4637,\n mid: 16.6359,\n createdAt: '2024-05-23T03:10:00',\n },\n {\n id: '64ea63b3-3824-41fa-b145-2f2543652af7',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.802,\n bid: 16.4637,\n mid: 16.63285,\n createdAt: '2024-05-23T03:20:00',\n },\n {\n id: '3672a84e-d39a-4020-b5a2-7c8e6e20bc12',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.799,\n bid: 16.4558,\n mid: 16.6274,\n createdAt: '2024-05-23T03:30:00',\n },\n {\n id: 'b1117ca2-2216-40c7-9c89-c1491ac3d59c',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8051,\n bid: 16.4617,\n mid: 16.6334,\n createdAt: '2024-05-23T03:40:00',\n },\n {\n id: '4b994713-e31c-4911-9ffb-22ddd53af18f',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8051,\n bid: 16.4617,\n mid: 16.6334,\n createdAt: '2024-05-23T03:50:00',\n },\n {\n id: '3f074496-fe75-4055-b54e-8423f9dc387a',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8,\n bid: 16.4607,\n mid: 16.63035,\n createdAt: '2024-05-23T04:00:00',\n },\n {\n id: '22324efc-a823-4d6b-9efc-745c60ab8611',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.798,\n bid: 16.4588,\n mid: 16.6284,\n createdAt: '2024-05-23T04:10:00',\n },\n {\n id: '0aba4118-5392-4825-80c1-39d9bbff16bd',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.803,\n bid: 16.4597,\n mid: 16.63135,\n createdAt: '2024-05-23T04:20:00',\n },\n {\n id: '02c5370d-5aaf-4151-9558-79a9a6e1efc4',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.802,\n bid: 16.4637,\n mid: 16.63285,\n createdAt: '2024-05-23T04:30:00',\n },\n {\n id: '4b51f1af-7f4b-45d5-98f1-1ea0e1550093',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8081,\n bid: 16.4696,\n mid: 16.63885,\n createdAt: '2024-05-23T04:40:00',\n },\n {\n id: '2e8424e6-8882-4532-8b42-0560eec734b7',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8111,\n bid: 16.4716,\n mid: 16.64135,\n createdAt: '2024-05-23T04:50:00',\n },\n {\n id: 'ebc9a326-cdbf-4db1-9905-c1271719adc9',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8121,\n bid: 16.4677,\n mid: 16.6399,\n createdAt: '2024-05-23T05:00:00',\n },\n {\n id: '2b0369ca-f6d2-4cbf-830e-379b40f7b1ac',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8182,\n bid: 16.4736,\n mid: 16.6459,\n createdAt: '2024-05-23T05:10:00',\n },\n {\n id: '28ab75c3-fe50-4341-a256-604f0e227c8e',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8202,\n bid: 16.4746,\n mid: 16.6474,\n createdAt: '2024-05-23T05:20:00',\n },\n {\n id: '93796cf9-9b51-446a-a2fc-cda871322483',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8172,\n bid: 16.4716,\n mid: 16.6444,\n createdAt: '2024-05-23T05:30:00',\n },\n {\n id: '984dcc79-e8c9-47e8-82d2-4fc6c91d1c01',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8242,\n bid: 16.4766,\n mid: 16.6504,\n createdAt: '2024-05-23T05:40:00',\n },\n {\n id: '60f90f93-f439-4816-adbf-209ded0c23af',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8273,\n bid: 16.4795,\n mid: 16.6534,\n createdAt: '2024-05-23T05:50:00',\n },\n {\n id: '78c6ecd2-4daa-45b8-928b-2c79d48c4358',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8212,\n bid: 16.4786,\n mid: 16.6499,\n createdAt: '2024-05-23T06:00:00',\n },\n {\n id: '69e653fe-4bc0-462a-a0c3-28dfde247c96',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8101,\n bid: 16.4657,\n mid: 16.6379,\n createdAt: '2024-05-23T06:10:00',\n },\n {\n id: 'ad0fe2bc-a3fc-4f6a-bcdc-660e7f776471',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8061,\n bid: 16.4607,\n mid: 16.6334,\n createdAt: '2024-05-23T06:20:00',\n },\n {\n id: 'f52547e4-b5e0-42b9-9fc0-36baf7ab1d12',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.804,\n bid: 16.4597,\n mid: 16.63185,\n createdAt: '2024-05-23T06:30:00',\n },\n {\n id: '48a015b6-5d81-4eb3-895b-459124b80188',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.801,\n bid: 16.4588,\n mid: 16.6299,\n createdAt: '2024-05-23T06:40:00',\n },\n {\n id: '93515d29-b893-4403-a7de-548a870228f7',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8051,\n bid: 16.4647,\n mid: 16.6349,\n createdAt: '2024-05-23T06:50:00',\n },\n {\n id: 'e8b6030a-1901-4afd-a681-085ee90a4110',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8061,\n bid: 16.4647,\n mid: 16.6354,\n createdAt: '2024-05-23T07:00:00',\n },\n {\n id: '04f289aa-b672-450d-af75-a4736106820e',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8182,\n bid: 16.4815,\n mid: 16.64985,\n createdAt: '2024-05-23T07:10:00',\n },\n {\n id: 'f89dd18f-603f-4d5e-8bdf-f64fd539467f',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8283,\n bid: 16.4865,\n mid: 16.6574,\n createdAt: '2024-05-23T07:20:00',\n },\n {\n id: '67803e04-0fee-498a-a7fa-0f4213cb7445',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8263,\n bid: 16.4835,\n mid: 16.6549,\n createdAt: '2024-05-23T07:30:00',\n },\n {\n id: '8eac4cf8-796a-49da-88e1-692fb4851fed',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8192,\n bid: 16.4835,\n mid: 16.65135,\n createdAt: '2024-05-23T07:40:00',\n },\n {\n id: 'e53776bf-fa13-4753-bf87-d85fa25fb869',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8242,\n bid: 16.4795,\n mid: 16.65185,\n createdAt: '2024-05-23T07:50:00',\n },\n {\n id: '10ca144b-9dbc-4342-9dd2-db4930656edb',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8222,\n bid: 16.4786,\n mid: 16.6504,\n createdAt: '2024-05-23T08:00:00',\n },\n {\n id: 'cf7d4992-48d1-4073-8f89-e924491321ee',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8273,\n bid: 16.4815,\n mid: 16.6544,\n createdAt: '2024-05-23T08:10:00',\n },\n {\n id: '8a475dd6-d9e0-435e-ac1f-d967163d88e3',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8212,\n bid: 16.4805,\n mid: 16.65085,\n createdAt: '2024-05-23T08:20:00',\n },\n {\n id: '19a999bf-1544-4a9f-88e7-495ceb1057a5',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8232,\n bid: 16.4786,\n mid: 16.6509,\n createdAt: '2024-05-23T08:30:00',\n },\n {\n id: '55410047-9188-4ab0-a07c-c68023c97d6b',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8192,\n bid: 16.4746,\n mid: 16.6469,\n createdAt: '2024-05-23T08:40:00',\n },\n {\n id: '56631873-6e69-4e11-9a8a-c9b6465b4e31',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8131,\n bid: 16.4677,\n mid: 16.6404,\n createdAt: '2024-05-23T08:50:00',\n },\n {\n id: '592b056d-0889-4277-ae3f-3b28e669b592',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8111,\n bid: 16.4686,\n mid: 16.63985,\n createdAt: '2024-05-23T09:00:00',\n },\n {\n id: '2151c4a9-b118-4e10-aa4f-cbce814c9737',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8121,\n bid: 16.4667,\n mid: 16.6394,\n createdAt: '2024-05-23T09:10:00',\n },\n {\n id: '45d6c139-ba65-41ae-9c93-84def4c9137c',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8111,\n bid: 16.4686,\n mid: 16.63985,\n createdAt: '2024-05-23T09:20:00',\n },\n {\n id: '88d0fca6-0d06-4d3e-9e12-0d15bca4e1c3',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8111,\n bid: 16.4677,\n mid: 16.6394,\n createdAt: '2024-05-23T09:30:00',\n },\n {\n id: 'aac8e780-a963-4ae3-a388-5f51e697ddec',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8111,\n bid: 16.4637,\n mid: 16.6374,\n createdAt: '2024-05-23T09:40:00',\n },\n {\n id: 'e1160b48-aee9-4971-8b8a-aca134969f6b',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.8111,\n bid: 16.4637,\n mid: 16.6374,\n createdAt: '2024-05-23T09:50:00',\n },\n {\n id: '3c747c2b-9b89-44b4-aeb7-09f1d30a9e3a',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.797,\n bid: 16.4498,\n mid: 16.6234,\n createdAt: '2024-05-23T10:00:00',\n },\n {\n id: 'c43d3f9d-02a8-4e1c-941f-b86c2c2f09e0',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.7929,\n bid: 16.4449,\n mid: 16.6189,\n createdAt: '2024-05-23T10:10:00',\n },\n {\n id: 'fb0304f6-cb81-4047-8d20-47550b11fb02',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.7889,\n bid: 16.4479,\n mid: 16.6184,\n createdAt: '2024-05-23T10:20:00',\n },\n {\n id: '1e0fa0c6-e627-4603-b478-b02a1a5c48fd',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.7889,\n bid: 16.4479,\n mid: 16.6184,\n createdAt: '2024-05-23T10:30:00',\n },\n {\n id: '6acedff3-6ed3-4f2f-9cd0-b29dd49614da',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.7889,\n bid: 16.4419,\n mid: 16.6154,\n createdAt: '2024-05-23T10:40:00',\n },\n {\n id: 'bb106271-fa27-492a-9199-28bc4a4a4676',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.7848,\n bid: 16.4399,\n mid: 16.61235,\n createdAt: '2024-05-23T10:50:00',\n },\n {\n id: 'e1416677-9ad4-411d-a624-43318edd5b7f',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.7818,\n bid: 16.4399,\n mid: 16.61085,\n createdAt: '2024-05-23T11:00:00',\n },\n {\n id: 'd540a8af-6f7c-4f71-839f-4eaa09c8589d',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.7869,\n bid: 16.4518,\n mid: 16.61935,\n createdAt: '2024-05-23T11:10:00',\n },\n {\n id: 'fd346ac5-f123-4233-9567-6028bbd9b4ad',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.7919,\n bid: 16.4538,\n mid: 16.62285,\n createdAt: '2024-05-23T11:20:00',\n },\n {\n id: '6c3234ac-2463-4ad2-bd6e-9eeedecd1bc0',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.799,\n bid: 16.4548,\n mid: 16.6269,\n createdAt: '2024-05-23T11:30:00',\n },\n {\n id: 'b74fdffd-2020-40f4-8fcc-1c452fe9b48c',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.7949,\n bid: 16.4508,\n mid: 16.62285,\n createdAt: '2024-05-23T11:40:00',\n },\n {\n id: '969ab5d9-17e8-46b7-b59d-cd24a117ea1c',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.7929,\n bid: 16.4508,\n mid: 16.62185,\n createdAt: '2024-05-23T11:50:00',\n },\n {\n id: '9c006cae-1fae-473e-b0ec-79f2faad83d1',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.7828,\n bid: 16.4399,\n mid: 16.61135,\n createdAt: '2024-05-23T12:00:00',\n },\n {\n id: '41e20565-eadc-4f00-aba1-2f0b5751da30',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.7778,\n bid: 16.431,\n mid: 16.6044,\n createdAt: '2024-05-23T12:10:00',\n },\n {\n id: '02dd228e-53c6-4a87-8cc9-ba061d54961c',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.7717,\n bid: 16.433,\n mid: 16.60235,\n createdAt: '2024-05-23T12:20:00',\n },\n {\n id: 'e98ac107-b686-49eb-884c-11791588412b',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.7778,\n bid: 16.434,\n mid: 16.6059,\n createdAt: '2024-05-23T12:30:00',\n },\n {\n id: 'c7387ad7-bf93-4a5a-b377-9de0f42052c2',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.7828,\n bid: 16.438,\n mid: 16.6104,\n createdAt: '2024-05-23T12:40:00',\n },\n {\n id: 'cbe9b2bb-62b0-4ee1-b836-1666ca7c3a24',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.7727,\n bid: 16.438,\n mid: 16.60535,\n createdAt: '2024-05-23T12:50:00',\n },\n {\n id: 'b7c0875d-d1ed-49e3-b6e7-6b9af8638751',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.7859,\n bid: 16.4439,\n mid: 16.6149,\n createdAt: '2024-05-23T13:00:00',\n },\n {\n id: 'ec4fa3c0-258f-4f7b-bcee-2f6f107145b8',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.7818,\n bid: 16.4399,\n mid: 16.61085,\n createdAt: '2024-05-23T13:10:00',\n },\n {\n id: 'e7811804-e62d-446f-adf8-2b17e5cdb9db',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.7848,\n bid: 16.4419,\n mid: 16.61335,\n createdAt: '2024-05-23T13:20:00',\n },\n {\n id: '7c711826-7928-40bc-a3f7-2d11f008855e',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.7848,\n bid: 16.437,\n mid: 16.6109,\n createdAt: '2024-05-23T13:30:00',\n },\n {\n id: 'c883ac71-51d1-4784-9663-24c672c33ac4',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.7929,\n bid: 16.4488,\n mid: 16.62085,\n createdAt: '2024-05-23T13:40:00',\n },\n {\n id: '08c4988d-a41a-48b1-af43-cffd2f87f477',\n book: 'usd_mxn',\n baseCurrency: Currency.USD,\n localCurrency: Currency.MXN,\n ask: 16.802,\n bid: 16.4538,\n mid: 16.6279,\n createdAt: '2024-05-23T13:50:00',\n },\n ],\n}\n","import { http, HttpResponse } from 'msw'\n\nimport { BASE_API_DEV } from '@/constants/urls'\n\nimport { Feature } from '../../types'\n\nimport { MOCKED_BUSINESS_USER } from './businessUser.mock'\nimport { MOCK_COUNTRY_CODES } from './countryCodes.mocks'\nimport {\n BUSINESS_IDENTITY_MOCK_RESPONSE,\n IDENTITY_MOCK_RESPONSE,\n} from './identity.mocks'\nimport { MOCK_PAYMENT_LIMITS } from './paymentLimits.mocks'\nimport { PRICE_CHART_RATES } from './priceRates.mocks'\n\nexport const apiHandlers = [\n http.get(`${BASE_API_DEV}/v2/signup/country-codes`, async () => {\n return HttpResponse.json(MOCK_COUNTRY_CODES, { status: 200 })\n }),\n\n http.get(\n `${BASE_API_DEV}/v1/me/withdrawal-quotes/from/:from/to/:to`,\n async () => {\n return HttpResponse.json({ fxRate: 17.022 }, { status: 200 })\n },\n ),\n\n http.get(`${BASE_API_DEV}/v1/me/fx-rate`, async () => {\n return HttpResponse.json(\n {\n symbol: 'usdc_mxn',\n bidRate: 17.022,\n askRate: 17.042,\n midRate: 17.0585,\n rateChangeToday: -0.001,\n rateChangeTodayPercentage: -0.00586339,\n },\n { status: 200 },\n )\n }),\n http.get(`${BASE_API_DEV}/v1/price-chart`, async () => {\n return HttpResponse.json(PRICE_CHART_RATES)\n }),\n\n http.get(`${BASE_API_DEV}/v1/me/identity/details`, async () => {\n return HttpResponse.json(IDENTITY_MOCK_RESPONSE)\n }),\n\n http.get(`${BASE_API_DEV}/v1/me/business/details`, async () => {\n return HttpResponse.json(BUSINESS_IDENTITY_MOCK_RESPONSE)\n }),\n\n http.get(`${BASE_API_DEV}/v1/my/business-users`, async () => {\n return HttpResponse.json(MOCKED_BUSINESS_USER)\n }),\n\n http.get(`${BASE_API_DEV}/v1/me/business/payment-limits`, async () => {\n return HttpResponse.json(MOCK_PAYMENT_LIMITS)\n }),\n\n http.get(`${BASE_API_DEV}/v1/me/one-time-passwords/2FA`, async () => {\n return HttpResponse.json({\n identityId: '64eb0105-8484-4f38-ba20-91c27159ee2c',\n otpMethod: 'EMAIL',\n })\n }),\n\n http.get(`${BASE_API_DEV}/v1/me/features`, async () => {\n return HttpResponse.json({\n features: [Feature.CONTRACTORS, Feature.CARDS],\n })\n }),\n]\n\nexport * from './countryCodes.mocks'\nexport * from './identity.mocks'\nexport * from './priceRates.mocks'\n","import { useQuery } from '@tanstack/react-query'\n\nimport { queryKeys } from '@/constants/queryKeys'\nimport { getCountryCodes } from '@/domains/Business/api'\n\nexport function useCountryCodes({ showAllCountries = false } = {}) {\n return useQuery({\n queryKey: [queryKeys.getCountryCodes, showAllCountries],\n queryFn: () => getCountryCodes({ showAllCountries }),\n select: (data) => data.data,\n staleTime: 30 * 1000 * 60,\n })\n}\n","import { useMemo, useState } from 'react'\nimport { FormattedMessage, useIntl } from 'react-intl'\n\nimport { useCountryCodes } from '@/hooks/useCountryCodes'\nimport { getCountryNameByISO3 } from '@/lib/country'\nimport { cn } from '@/lib/utils'\n\nimport { Check, ChevronDown } from '../icons/outline'\nimport {\n Button,\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n FormControl,\n FormItem,\n MotionSpan,\n Popover,\n PopoverContent,\n PopoverTrigger,\n Spinner,\n Typography,\n} from '../ui'\n\ntype Props = {\n disabled?: boolean\n value?: string\n onSelect: (value: string) => void\n}\n\nexport const CountryCodeField = ({ disabled, value, onSelect }: Props) => {\n const intl = useIntl()\n const [open, setOpen] = useState(false)\n\n const countriesQuery = useCountryCodes()\n\n const selectedCountry = useMemo(\n () =>\n countriesQuery.data?.find((c) => c.internationalPhonePrefix === value),\n [countriesQuery.data, value],\n )\n\n return (\n \n \n \n \n \n \n {countriesQuery.isPending ? (\n \n ) : (\n \n {selectedCountry?.flag}\n {selectedCountry?.internationalPhonePrefix}\n \n )}\n \n\n \n \n \n \n \n {\n const searchValue = search.toLowerCase().trim()\n\n const [code, country] = value.split('-')\n\n if (\n country.includes(searchValue.trim().toLowerCase()) ||\n code.includes(searchValue.trim().toLowerCase())\n ) {\n return 1\n }\n\n return 0\n }}\n >\n \n \n \n \n \n \n {countriesQuery.data?.map((country) => (\n {\n onSelect(country.internationalPhonePrefix)\n setOpen((open) => !open)\n }}\n >\n \n {country.flag}{' '}\n {country.internationalPhonePrefix}{' '}\n {getCountryNameByISO3(\n country.isoCode,\n intl.locale,\n country.nameToShow,\n )}\n \n\n \n \n ))}\n \n \n \n \n \n \n )\n}\n","import { useMemo, useState } from 'react'\nimport { FormattedMessage, useIntl } from 'react-intl'\n\nimport { useCountryCodes } from '@/hooks/useCountryCodes'\nimport { getCountryNameByISO3 } from '@/lib/country'\nimport { cn, getAnimationKey } from '@/lib/utils'\nimport { Check, ChevronDown } from '@/shared/icons/outline'\nimport {\n Button,\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n FormControl,\n FormItem,\n MotionDiv,\n MotionSpan,\n Popover,\n PopoverContent,\n PopoverTrigger,\n Typography,\n} from '@/shared/ui'\nimport { CountryCode } from '@/types/country'\n\ntype Value = {\n valueAsCode: string\n valueAsName: string\n}\n\nconst SUBSET_COUNTRIES = {\n 'sign-up': Object.values(CountryCode).filter(\n (country) => ![CountryCode.CL, CountryCode.PT].includes(country),\n ),\n 'contractor-onboarding': [\n CountryCode.MX,\n CountryCode.AR,\n CountryCode.CO,\n CountryCode.BR,\n CountryCode.US,\n ],\n}\n\ntype Props = {\n disabled?: boolean\n onSelect: (value: Value) => void\n placeholder?: string\n subset?: 'sign-up' | 'contractor-onboarding' | 'all'\n value?: string\n}\n\nexport const CountryCombobox = ({\n disabled,\n onSelect,\n placeholder,\n subset = 'all',\n value,\n}: Props) => {\n const intl = useIntl()\n const [open, setOpen] = useState(false)\n\n const countryCodesQuery = useCountryCodes()\n\n const selected = useMemo(\n () => countryCodesQuery.data?.find((country) => country.isoCode === value),\n [countryCodesQuery.data, value],\n )\n\n return (\n \n \n \n \n \n {selected ? (\n \n \n {placeholder}\n \n \n {selected.flag}\n \n {getCountryNameByISO3(\n selected.isoCode,\n intl.locale,\n selected.nameToShow,\n )}\n \n \n \n ) : (\n \n {placeholder}\n \n )}\n\n {disabled ? null : (\n \n )}\n \n \n \n \n {\n const searchValue = search.toLowerCase().trim()\n\n const [code, country] = value.split('-')\n\n if (\n country.includes(searchValue.trim().toLowerCase()) ||\n code.includes(searchValue.trim().toLowerCase())\n ) {\n return 1\n }\n\n return 0\n }}\n >\n \n \n \n \n \n \n {countryCodesQuery.data\n ?.filter((country) =>\n subset === 'all'\n ? true\n : SUBSET_COUNTRIES[subset].includes(\n country.isoCode as CountryCode,\n ),\n )\n .map((country) => (\n {\n onSelect({\n valueAsCode: country.isoCode,\n valueAsName: country.name,\n })\n setOpen((open) => !open)\n }}\n >\n \n {country.flag}\n {getCountryNameByISO3(country.isoCode, intl.locale)}\n \n\n \n \n ))}\n \n \n \n \n \n \n )\n}\n","import { FormattedMessage } from 'react-intl'\n\nimport { Typography } from '../ui'\n\nexport const OptionalTag = () => {\n return (\n
\n \n \n \n
\n )\n}\n","import { Children, isValidElement } from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\n\nimport { cn } from '@/lib/utils'\n\nimport { Button, Card, Typography } from '../ui'\n\nconst widgetVariants = cva('flex w-full flex-col', {\n variants: {\n variant: {\n default: 'gap-6',\n form: 'gap-3 bg-transparent p-0',\n },\n maxWidth: {\n full: 'max-w-full',\n '3xl': 'max-w-3xl',\n },\n gap: {\n none: 'gap-0',\n },\n },\n defaultVariants: {\n variant: 'default',\n maxWidth: '3xl',\n },\n})\n\ntype Props = {\n scalable?: boolean\n children: React.ReactNode\n className?: string\n title: string | React.ReactNode\n onClick?: () => void\n} & VariantProps\n\nexport const Widget = ({\n scalable,\n children,\n className,\n title,\n onClick,\n variant = 'default',\n maxWidth,\n gap,\n}: Props) => {\n const hasMultipleChildren =\n isValidElement(title) && Children.count(title.props.children) > 1\n\n return (\n
\n {hasMultipleChildren ? title : {title}}\n\n
\n\n {onClick ? (\n \n \n \n ) : (\n \n {children}\n \n )}\n
\n )\n}\n\nconst Title = ({ children }: { children: React.ReactNode }) => {\n return (\n \n {children}\n \n )\n}\n\nWidget.Title = Title\n","import { UseFormReturn } from 'react-hook-form'\nimport { FormattedMessage, useIntl } from 'react-intl'\n\nimport { getCountryISO3byISO2 } from '@/lib/country'\nimport {\n AnimatedFormLabel,\n FormControl,\n FormField,\n FormItem,\n Input,\n PhoneNumberInput,\n} from '@/shared/ui'\n\nimport { CountryCodeField } from './CountryCodeField'\nimport { CountryCombobox } from './CountryCombobox'\nimport { OptionalTag } from './OptionalTag'\nimport { Widget } from './Widget'\n\nconst MAX_ADDRESS_STREET_LENGTH = 20\n\ntype Props = {\n form: UseFormReturn<{\n addressStreet: string\n addressStreetNumber: string\n addressApartment?: string\n addressReferences?: string\n addressDistrict: string\n addressCity: string\n addressState: string\n addressPostCode: string\n addressCountry: string\n localPhoneNumber: string\n internationalPhonePrefix: string\n }>\n}\n\nexport const CardAddressFields = ({ form }: Props) => {\n const intl = useIntl()\n\n return (\n
\n \n }\n variant=\"form\"\n >\n (\n \n \n \n \n \n \n \n \n )}\n />\n\n
\n (\n \n \n \n \n \n \n \n \n )}\n />\n (\n \n \n \n \n \n \n \n\n {field.value === '' && }\n \n )}\n />\n
\n\n (\n \n \n \n \n \n \n \n\n {field.value === '' && }\n \n )}\n />\n\n (\n \n \n \n \n \n \n \n \n )}\n />\n\n (\n \n \n \n \n \n \n \n \n )}\n />\n\n
\n (\n \n \n \n \n \n \n \n \n )}\n />\n (\n \n \n \n \n \n \n \n \n )}\n />\n
\n\n (\n \n \n {\n field.onChange(value.valueAsCode)\n }}\n value={getCountryISO3byISO2(field.value)}\n />\n \n \n )}\n />\n \n\n \n }\n variant=\"form\"\n >\n
\n {\n return (\n \n form.setValue('internationalPhonePrefix', value)\n }\n />\n )\n }}\n />\n\n (\n \n \n \n \n \n \n \n \n )}\n />\n
\n \n
\n )\n}\n","import * as React from 'react'\nimport { useIntl } from 'react-intl'\n\nimport { Input } from '../ui'\n\nconst MAX_INPUT_LENGTH = 6\n\nexport interface CodeInputProps\n extends Omit, 'onChange'> {\n onChange?: (value: string) => void\n}\n\nexport const CodeInput = React.forwardRef(\n ({ className, ...props }, ref) => {\n const intl = useIntl()\n return (\n {\n if (e.target.value.match(/\\D/g)) {\n return\n }\n\n props.onChange?.(e.target.value)\n }}\n ref={ref}\n />\n )\n },\n)\n\nCodeInput.displayName = 'CodeInput'\n","import { z } from 'zod'\n\nexport const codeInputSchema = z.object({\n otp: z\n .string()\n .min(1, {\n message: 'validation.otp.required',\n })\n .length(6, {\n message: 'validation.otp.length',\n }),\n})\n\nexport type CodeInputSchema = z.infer\n","import { useIntl } from 'react-intl'\n\nimport { useCountryCodes } from '@/hooks/useCountryCodes'\nimport { getCountryNameByISO3 } from '@/lib/country'\nimport { getAnimationKey } from '@/lib/utils'\n\nimport { MotionDiv, Skeleton, Typography } from '../ui'\n\nexport const CountryName = ({\n countryCode,\n}: {\n countryCode?: string | null\n}) => {\n const { data: codes, isPending } = useCountryCodes()\n const intl = useIntl()\n\n const country = codes?.find((code) => code.isoCode === countryCode)\n\n return (\n \n {isPending ? (\n \n ) : (\n \n {country ? (\n <>\n {country?.flag}\n {getCountryNameByISO3(country.isoCode, intl.locale)}\n \n ) : (\n '-'\n )}\n \n )}\n \n )\n}\n","import { useIntl } from 'react-intl'\n\nimport { countryCodeToCountryData } from '@/constants/countries'\nimport { getCountryNameByISO3 } from '@/lib/country'\nimport { getFlagUrl } from '@/lib/images'\nimport { CountryCode } from '@/types/country'\n\nimport { Typography } from '../ui'\n\ntype Props = {\n country: CountryCode\n hideName?: boolean\n}\n\nexport const CountryWithFlag = ({ country, hideName = false }: Props) => {\n const intl = useIntl()\n\n return (\n
\n \n\n {hideName ? null : (\n {getCountryNameByISO3(country, intl.locale)}\n )}\n
\n )\n}\n","import { FormattedMessage } from 'react-intl'\n\nimport {\n Button,\n Dialog,\n DialogActions,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from '@/shared/ui'\n\ntype Props = {\n description: React.ReactNode\n descriptionAdditional?: React.ReactNode\n isOpen: boolean\n isPending: boolean\n onDelete: () => void\n onOpenChange: (isOpen: boolean) => void\n title: React.ReactNode\n}\n\nexport const DeleteDialog = ({\n description,\n descriptionAdditional,\n isOpen,\n isPending,\n onDelete,\n onOpenChange,\n title,\n}: Props) => {\n return (\n \n \n \n {title}\n\n
\n {description}\n\n {descriptionAdditional ? (\n {descriptionAdditional}\n ) : null}\n
\n
\n\n
\n\n \n onOpenChange(false)}\n variant=\"secondary\"\n >\n \n \n \n \n \n \n \n
\n )\n}\n","import { FormattedMessage } from 'react-intl'\n\nimport { cn } from '@/lib/utils'\n\nimport { Download } from '../icons/solid'\nimport { Spinner, Typography } from '../ui'\n\ntype Props = {\n isDragActive: boolean\n files: string[]\n isPending: boolean\n}\n\nexport const DragAndDropContainer = ({\n isDragActive,\n files,\n isPending,\n}: Props) => {\n return (\n 0,\n 'bg-neutral-gray-200': isDragActive,\n },\n )}\n >\n
\n {isPending ? (\n \n ) : (\n \n )}\n \n \n \n
\n
\n )\n}\n","import { getImage } from '@/lib/images'\n\nimport { Card, Typography } from '../ui'\n\ntype Props = {\n children: React.ReactNode\n image?: React.ReactNode\n}\n\nexport const EmptyCard = ({ children }: Props) => {\n return (\n \n
\n \n
{children}
\n
\n
\n )\n}\n\nconst Title = ({ children }: Props) => {\n return {children}\n}\n\nconst Description = ({ children }: Props) => {\n return {children}\n}\n\nEmptyCard.Title = Title\nEmptyCard.Description = Description\n","import { useEffect, useMemo, useRef, useState } from 'react'\nimport { AnimatePresence, motion } from 'framer-motion'\nimport { FormattedMessage } from 'react-intl'\n\nimport { Card, slideInFromBottomAnimation, Typography } from '@/shared/ui'\n\nimport { ChartMixed } from '../icons/outline'\n\nconst EMPTY_CHART_COLUMNS = [\n 280, 140, 230, 230, 276, 253, 246, 151, 183, 276, 238, 281, 281, 182, 131,\n]\n\ntype Props = {\n show: boolean\n}\n\nexport const EmptyChart = ({ show }: Props) => {\n const chartRef = useRef(null)\n const [width, setWidth] = useState(0)\n\n useEffect(() => {\n if (!chartRef.current) {\n return\n }\n\n setWidth(chartRef.current?.offsetWidth ?? 0)\n }, [width])\n\n useEffect(() => {\n const ref = chartRef.current\n\n window.addEventListener('resize', () => {\n setWidth(ref?.offsetWidth ?? 0)\n })\n\n return () => {\n window.removeEventListener('resize', () => {\n setWidth(ref?.offsetWidth ?? 0)\n })\n }\n })\n\n const emptyChartCols = useMemo(() => {\n const widthWithoutPadding = width - 32 * 2\n\n const columnsCount = Math.ceil(widthWithoutPadding / 64)\n\n let currentIndex = 1\n\n const columns = []\n\n for (let i = 0; i < columnsCount; i++) {\n columns.push(EMPTY_CHART_COLUMNS[currentIndex])\n\n currentIndex = (currentIndex + 1) % EMPTY_CHART_COLUMNS.length\n }\n\n return columns\n }, [width])\n\n return (\n \n
\n {show && (\n <>\n
\n \n {emptyChartCols.map((height, i) => (\n \n ))}\n\n \n
\n \n\n \n \n \n\n \n \n \n
\n \n \n \n )}\n
\n \n )\n}\n","import { FormattedMessage } from 'react-intl'\n\nimport { getImage } from '@/lib/images'\nimport { Card, Typography } from '@/shared/ui'\n\nexport const EmptyContractorPayments = () => {\n return (\n \n
\n
\n \n )\n}\n","import { useIntl } from 'react-intl'\n\nimport { Eye, EyeOff } from '../icons/outline'\nimport { Button } from '../ui'\n\ntype Props = {\n show: boolean\n onClick: () => void\n}\n\nexport const EyeOnOffButton = ({ show, onClick }: Props) => {\n const intl = useIntl()\n\n return (\n \n {show ? : }\n \n )\n}\n","import { FormattedMessage } from 'react-intl'\n\nimport { Typography, TypographyProps } from '../ui'\n\nexport const FreeLabel = ({\n variant,\n}: {\n variant?: TypographyProps['variant']\n}) => {\n return (\n \n \n \n )\n}\n","import { FormattedMessage } from 'react-intl'\nimport { Link, To } from 'react-router'\n\nimport { cn } from '@/lib/utils'\n\nimport { ArrowLeft } from '../icons/outline'\nimport { Button } from '../ui'\n\ntype Props = {\n className?: string\n to?: To\n onClick?: () => void\n}\n\nexport const GoBackButton = ({ className, onClick, to }: Props) => {\n if (to) {\n return (\n }\n asChild\n variant=\"ghost\"\n size=\"lg\"\n className={cn(\n 'min-w-auto absolute left-6 top-6 flex items-center justify-start gap-1 px-0 md:left-12 md:top-12',\n className,\n )}\n >\n \n \n \n \n )\n }\n\n if (onClick) {\n return (\n }\n variant=\"ghost\"\n size=\"lg\"\n className={cn(\n 'min-w-auto absolute left-6 top-6 flex items-center justify-start gap-1 px-0 md:left-12 md:top-12',\n className,\n )}\n onClick={onClick}\n >\n \n \n )\n }\n\n return null\n}\n","import { cn } from '@/lib/utils'\n\nimport { MotionDiv, Typography } from '../ui'\n\ntype Props = {\n className?: string\n disabled?: boolean\n placeholder?: string\n children: React.ReactNode\n}\n\nexport const InputLikeCard = ({\n className,\n disabled,\n placeholder,\n children,\n}: Props) => {\n return (\n \n \n \n {placeholder}\n \n\n \n {children}\n \n \n
\n )\n}\n","import { AVAILABLE_LANGUAGES, Locale } from '@/constants/locales'\nimport { getFlagUrl } from '@/lib/images'\nimport { useLocale } from '@/providers/LocaleProvider'\n\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n Typography,\n} from '../ui'\n\nexport const LanguageSelector = () => {\n const { locale, changeLocale } = useLocale()\n\n return (\n \n )\n}\n","import { motion } from 'framer-motion'\nimport { useIntl } from 'react-intl'\n\nimport { Spinner } from '../ui'\n\nexport const Loader = () => {\n const intl = useIntl()\n\n return (\n \n \n \n )\n}\n","import { cn } from '@/lib/utils'\n\ntype Props = {\n className?: string\n}\n\nexport const Logo = ({ className }: Props) => {\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n )\n}\n","import { cn } from '@/lib/utils'\n\ntype Props = {\n className?: string\n}\n\nexport const LogoIcon = ({ className }: Props) => {\n return (\n \n \n \n \n \n )\n}\n","import { z } from 'zod'\n\nexport function isValidRoutingNumber(routingNumber: string) {\n return routingNumber.length === 9\n}\n\nexport function isValidClabe(clabe: string) {\n return clabe.length === 18\n}\n\nexport function hasUpperCaseCharacter(value: string) {\n return /[A-Z]/.test(value)\n}\n\nexport function hasLowerCaseCharacter(value: string) {\n return /[a-z]/.test(value)\n}\n\nexport function hasNumber(value: string) {\n return /[0-9]/.test(value)\n}\n\nexport function hasSpecialCharacter(value: string) {\n return /[^A-Za-z0-9]/.test(value)\n}\n\nexport const PASSWORD_MIN_LENGTH = 12\n\nexport const passwordValidation = z\n .object({\n password: z\n .string()\n .min(PASSWORD_MIN_LENGTH, {\n message: 'validation.password.minLength',\n })\n .refine(hasUpperCaseCharacter, {\n message: 'validation.password.upperCase',\n })\n .refine(hasLowerCaseCharacter, {\n message: 'validation.password.lowerCase',\n })\n .refine(hasNumber, {\n message: 'validation.password.hasNumber',\n })\n .refine(hasSpecialCharacter, {\n message: 'validation.password.hasSpecialCharacter',\n }),\n confirmPassword: z.string().min(1, {\n message: 'validation.confirmPassword.required',\n }),\n })\n .refine((data) => data.password === data.confirmPassword, {\n message: 'validation.password.match',\n path: ['confirmPassword'],\n })\n","import { FormattedMessage } from 'react-intl'\n\nimport { passwordMessages } from '@/constants/messages'\nimport { cn } from '@/lib/utils'\nimport {\n hasLowerCaseCharacter,\n hasNumber,\n hasSpecialCharacter,\n hasUpperCaseCharacter,\n PASSWORD_MIN_LENGTH,\n} from '@/lib/validations'\n\nimport { Check } from '../icons/outline'\nimport { Typography } from '../ui'\n\nexport const PasswordRules = ({ password }: { password: string }) => {\n const rules = [\n {\n key: 'minLength',\n isValid: password.length >= PASSWORD_MIN_LENGTH,\n },\n {\n key: 'upperCase',\n isValid: hasUpperCaseCharacter(password),\n },\n {\n key: 'lowerCase',\n isValid: hasLowerCaseCharacter(password),\n },\n {\n key: 'hasNumber',\n isValid: hasNumber(password),\n },\n {\n key: 'hasSpecialCharacter',\n isValid: hasSpecialCharacter(password),\n },\n ] as const\n\n return (\n
    \n {rules.map((rule) => (\n \n \n \n \n {rule.isValid && }\n \n ))}\n
\n )\n}\n","import { useEffect } from 'react'\n\nexport function useKeyPress(key: string, callback: () => void) {\n useEffect(() => {\n function handleKeyDown(event: KeyboardEvent) {\n if (event.key === key) {\n callback()\n }\n }\n\n window.addEventListener('keydown', handleKeyDown)\n\n return () => {\n window.removeEventListener('keydown', handleKeyDown)\n }\n }, [key, callback])\n}\n","import { useIntl } from 'react-intl'\nimport { Link, To, useNavigate } from 'react-router'\n\nimport { useKeyPress } from '@/hooks/useKeyPress'\nimport { cn } from '@/lib/utils'\n\nimport { X } from '../icons/outline'\nimport { Button } from '../ui'\n\ntype ProgressProps = {\n size?: number\n progress?: number\n trackWidth?: number\n indicatorWidth?: number\n indicatorColor?: string\n}\n\nconst ProgressCircle = (props: ProgressProps) => {\n const {\n size = 36,\n progress = 25,\n trackWidth = 2,\n indicatorWidth = 2,\n indicatorColor = `#1F1F1F`,\n } = props\n\n const center = size / 2\n const radius =\n center - (trackWidth > indicatorWidth ? trackWidth : indicatorWidth)\n const dashArray = 2 * Math.PI * radius\n const dashOffset = dashArray * ((100 - progress) / 100)\n\n return (\n \n \n \n \n )\n}\n\ntype Props = {\n className?: string\n to?: To\n progress?: 0 | 25 | 50 | 75 | 100\n onClick?: () => void\n}\n\nexport const ProgressButton = ({ className, onClick, progress, to }: Props) => {\n const intl = useIntl()\n\n const navigate = useNavigate()\n\n useKeyPress('Escape', () => {\n if (document.body.style.pointerEvents === 'none') {\n // means any dialog is open, so we prevent closing everything\n return\n }\n\n if (onClick) {\n onClick()\n }\n\n if (to) {\n navigate(to)\n }\n })\n\n if (onClick) {\n return (\n \n \n \n\n \n \n
\n )\n }\n\n if (!to) {\n return null\n }\n\n return (\n \n \n \n \n\n \n \n \n \n )\n}\n","import { motion } from 'framer-motion'\n\nexport const SlideInSpan = ({\n children,\n className,\n}: {\n children: React.ReactNode\n className?: string\n}) => {\n return (\n \n {children}\n \n )\n}\n","import { FormattedMessage, useIntl } from 'react-intl'\n\nimport { STATES } from '@/constants/countries'\nimport {\n AnimatedFormLabel,\n FormControl,\n Input,\n MotionDiv,\n MotionSpan,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Typography,\n} from '@/shared/ui'\n\ntype Props = {\n value: string\n onChange: (value: string) => void\n variant: 'select' | 'input'\n}\n\nexport const StateSelectOrInput = ({ value, onChange, variant }: Props) => {\n const intl = useIntl()\n\n if (variant === 'select') {\n return (\n \n )\n }\n\n if (variant === 'input') {\n return (\n <>\n \n onChange(e.target.value)}\n value={value}\n />\n \n \n \n \n \n )\n }\n}\n","import { cn } from '@/lib/utils'\n\nimport { Typography } from '../ui'\n\nexport type StatusVariant =\n | 'active'\n | 'failed'\n | 'warning'\n | 'neutral'\n | 'info'\n | 'neutral-dark'\n\ntype Props = {\n variant: StatusVariant\n title: string | React.ReactNode\n className?: string\n}\n\nconst bgColorByVariant: Record = {\n active: 'bg-primary-light',\n failed: 'bg-primary-error/15',\n info: 'bg-primary-info/10',\n neutral: 'bg-neutral-gray-100',\n 'neutral-dark': 'bg-neutral-gray-200',\n warning: 'bg-primary-warning/25',\n}\n\nconst textColorByVariant: Record = {\n active: 'text-primary-dark',\n failed: 'text-primary-error',\n info: 'text-primary-info',\n neutral: 'text-neutral-gray-800',\n 'neutral-dark': 'text-neutral-gray-800',\n warning: 'text-primary-warning',\n}\n\nconst dotColorByVariant: Record = {\n active: 'bg-primary-dark',\n failed: 'bg-primary-error',\n info: 'bg-primary-info',\n neutral: 'bg-neutral-gray-800',\n 'neutral-dark': 'bg-neutral-gray-800',\n warning: 'bg-primary-warning',\n}\n\nexport const StatusBadge = ({ className, variant, title }: Props) => {\n return (\n \n \n\n \n {title}\n \n \n )\n}\n","import { useIntl } from 'react-intl'\n\nimport { isSmallScreen } from '@/constants/breakpoints'\nimport { countryCodeByLocale, flagByLocale } from '@/constants/countries'\nimport { AVAILABLE_LANGUAGES, Locale } from '@/constants/locales'\nimport { useMediaQuery } from '@/hooks/useMediaQuery'\nimport { getFlagUrl } from '@/lib/images'\nimport { useLocale } from '@/providers/LocaleProvider'\n\nimport { Check } from '../icons/outline'\nimport {\n Button,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n Typography,\n} from '../ui'\n\ntype Props = {\n isOpen: boolean\n onOpenChange: (value: (prev: boolean) => boolean) => void\n}\n\nexport const SwitchLanguageTooltip = ({ isOpen, onOpenChange }: Props) => {\n const intl = useIntl()\n const { locale, changeLocale } = useLocale()\n const isMobile = useMediaQuery(isSmallScreen)\n\n const getUserLocale = (lang: string) => {\n return AVAILABLE_LANGUAGES.find((l) => l.code === lang)?.lang\n }\n\n return (\n onOpenChange((o) => !o)}\n delayDuration={0}\n >\n onOpenChange((o) => !o) : undefined}\n asChild\n >\n \n \n\n \n {getUserLocale(locale)}\n \n \n \n \n {Object.values(Locale).map((lang) => (\n changeLocale(lang)}\n >\n \n \n \n {AVAILABLE_LANGUAGES.find((l) => l.code === lang)?.lang}\n \n \n\n {lang === locale && (\n \n )}\n \n ))}\n \n \n )\n}\n","import { FormattedMessage } from 'react-intl'\nimport { Link, useLocation } from 'react-router'\nimport { useIntercom } from 'react-use-intercom'\n\nimport { BusinessRoute, ContractorRoute } from '@/constants/paths'\nimport { getImage } from '@/lib/images'\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n Typography,\n} from '@/shared/ui'\n\ntype Props = {\n flow?: 'business' | 'contractor'\n isOpen: boolean\n}\n\nexport const TwoFactorRequiredDialog = ({\n isOpen,\n flow = 'business',\n}: Props) => {\n const { showArticle } = useIntercom()\n const location = useLocation()\n\n const redirectLink =\n flow === 'business'\n ? BusinessRoute.DashboardSetup2fa\n : ContractorRoute.ContractorSetup2fa\n\n return (\n \n e.preventDefault()}\n onPointerDownOutside={(e) => e.preventDefault()}\n onEscapeKeyDown={(e) => e.preventDefault()}\n onOpenAutoFocus={(e) => e.preventDefault()}\n >\n \n \n \n \n \n\n \n ,\n }}\n />\n \n \n\n
\n\n \n\n
\n\n \n showArticle(10205735)}\n className=\"text-xs\"\n variant=\"link\"\n size=\"inline\"\n >\n \n \n ),\n }}\n />\n \n \n
\n )\n}\n","import { useIntl } from 'react-intl'\n\nimport { X } from '../icons/outline'\nimport { Document } from '../icons/solid'\nimport { Button, Spinner, Typography } from '../ui'\n\ntype Props = {\n isPending: boolean\n file: string\n onClick: (file: string) => void\n}\n\nexport const UploadedFile = ({ onClick, isPending, file }: Props) => {\n const intl = useIntl()\n return (\n
\n
\n \n {file}\n
\n {\n e.stopPropagation()\n\n onClick(file)\n }}\n variant=\"ghost\"\n >\n {isPending ? : }\n \n
\n )\n}\n","import { Currency } from '@/constants/currency'\nimport { api } from '@/lib/api'\n\nimport { Account } from '../types'\n\nexport type CreateAccountRequest = {\n accountId: string\n currency: Currency\n label: string\n}\n\nexport function createAccount(data: CreateAccountRequest) {\n const { accountId, ...rest } = data\n return api.post(`/v1/me/account/${accountId}/wallets`, rest)\n}\n","import { api } from '@/lib/api'\n\nexport function deleteAccount(id: string) {\n return api.post(`/v1/me/wallets/${id}`, {})\n}\n","import { api } from '@/lib/api'\n\nexport function downloadAccountStatements({ id }: { id: string }) {\n return api.get(`/v1/me/statements/${id}/download`, {\n responseType: 'blob',\n })\n}\n","import { api } from '@/lib/api'\n\nimport { Account } from '../types'\n\nexport type EditAccountRequest = {\n walletId: string\n label: string\n}\n\nexport function editWallet(data: EditAccountRequest) {\n const { walletId, ...rest } = data\n\n return api.patch(`/v1/me/wallets/${walletId}`, rest)\n}\n","import { api } from '@/lib/api'\n\nimport { Account } from '../types'\n\nexport function getAccount() {\n return api.get('/v1/me/account')\n}\n","import { api } from '@/lib/api'\n\nimport { AccountDetails } from '../types'\n\nexport function getAccountDetails({ id }: { id: string }) {\n return api.get(`/v1/me/bank-accounts/wallet/${id}`)\n}\n","import { api } from '@/lib/api'\n\nimport { BankAccount, Wallet } from '../types'\n\ntype PDFRequest = {\n type: BankAccount['type']\n id: Wallet['id']\n}\n\nexport function getAccountPDF(data: PDFRequest) {\n return api.get(\n `/v1/me/bank-accounts/wallet/${data.id}/type/${data.type}/pdf`,\n {\n responseType: 'blob',\n },\n )\n}\n","import { useQuery } from '@tanstack/react-query'\n\nimport { queryKeys } from '@/constants/queryKeys'\nimport { getBusinessUser } from '@/domains/Business/api'\nimport { Role } from '@/domains/Business/types/roles'\n\nexport function useBusinessRole() {\n const businessUserQuery = useQuery({\n queryKey: [queryKeys.getBusinessUser],\n queryFn: getBusinessUser,\n select: (data) => data.data,\n })\n\n return {\n isPending: businessUserQuery.isPending,\n role: businessUserQuery.data?.role,\n isAdmin: businessUserQuery.data?.role === Role.ADMIN,\n isPaymentOps: businessUserQuery.data?.role === Role.PAYMENT_OPS,\n isCardUser: businessUserQuery.data?.role === Role.CARD_USER,\n isReadOnly: businessUserQuery.data?.role === Role.READ_ONLY,\n }\n}\n","import { useQuery } from '@tanstack/react-query'\n\nimport { queryKeys } from '@/constants/queryKeys'\nimport { getBusinessUser } from '@/domains/Business/api'\n\nexport function useBusinessUser() {\n const businessUserQuery = useQuery({\n queryKey: [queryKeys.getBusinessUser],\n queryFn: getBusinessUser,\n select: (data) => data.data,\n })\n\n return businessUserQuery.data\n}\n","import { api } from '@/lib/api'\nimport { OTPCode } from '@/types/auth'\n\nimport { TeamMember } from '../types'\n\ntype BlockTeamMemberRequest = {\n id: string\n} & OTPCode\n\nexport function blockTeamMember({ id, otp }: BlockTeamMemberRequest) {\n return api.post(`/v1/me/business-users/${id}/block`, { otp })\n}\n","import { api } from '@/lib/api'\nimport { OTPCode } from '@/types/auth'\n\nimport { TeamMember } from '../types'\n\ntype DeleteTeamMemberRequest = {\n id: string\n} & OTPCode\n\nexport function deleteTeamMember({ id, otp }: DeleteTeamMemberRequest) {\n return api.post(`/v1/me/business-users/${id}/terminate`, { otp })\n}\n","import { Role } from '@/domains/Business/types/roles'\nimport { api } from '@/lib/api'\nimport { OTPCode } from '@/types/auth'\n\nimport { LimitPeriodType, MovementPermission, TeamMember } from '../types'\n\ntype EditTeamMemberRequest = {\n id: string\n role: Role\n firstName: string\n lastName: string\n secondLastName?: string\n userTitle?: string\n transferPermissions?: {\n type: MovementPermission\n limitPeriodType?: LimitPeriodType\n periodTransferLimitAmount?: string\n singleTransferLimitAmount?: string\n }\n} & OTPCode\n\nexport function editTeamMemberDetails(data: EditTeamMemberRequest) {\n const { id, ...rest } = data\n\n return api.put(`/v1/me/business-users/${id}`, rest)\n}\n","import { api } from '@/lib/api'\n\nimport { TeamMemberPaymentLimit } from '../types'\n\nexport function getPaymentLimit() {\n return api.get(`/v1/my/business-users/payment-limits`)\n}\n","import { api } from '@/lib/api'\n\nimport { TeamMember } from '../types'\n\nexport function getTeamMember({ id }: { id: string }) {\n return api.get(`/v1/me/business-users/${id}`)\n}\n","import { api } from '@/lib/api'\n\nimport { TeamMemberPaymentLimit } from '../types'\n\nexport function getTeamMemberPaymentLimit({ id }: { id: string }) {\n return api.get(\n `/v1/me/business-users/${id}/payment-limits`,\n )\n}\n","import {\n STATUS_FILTER_NAME,\n TEAM_ROLE_FILTER_NAME,\n} from '@/domains/Business/components'\nimport { api } from '@/lib/api'\n\nimport { TeamMember } from '../types'\n\ntype SearchParams = {\n [STATUS_FILTER_NAME]?: string\n [TEAM_ROLE_FILTER_NAME]?: string\n}\n\nexport function getTeamMembers(params: SearchParams = {}) {\n const searchParams = new URLSearchParams(params)\n const searchQuery = searchParams.size > 0 ? '?' + searchParams.toString() : ''\n\n return api.get(`/v1/me/business-users/search${searchQuery}`)\n}\n","import { Role } from '@/domains/Business/types/roles'\nimport { api } from '@/lib/api'\nimport { OTPCode } from '@/types/auth'\n\nimport {\n InvitedTeamMember,\n LimitPeriodType,\n MovementPermission,\n} from '../types'\n\ntype InviteBusinessUserRequest = {\n role: Role\n firstName: string\n lastName: string\n secondLastName?: string\n userTitle?: string\n email: string\n transferPermissions?: {\n type: MovementPermission\n limitPeriodType?: LimitPeriodType\n periodTransferLimitAmount?: string\n singleTransferLimitAmount?: string\n }\n} & OTPCode\n\nexport function inviteBusinessUser(data: InviteBusinessUserRequest) {\n return api.post(`/v1/me/business-user-invitations`, data)\n}\n","import { api } from '@/lib/api'\n\nexport function sendTeamMemberInviteReminder({ id }: { id: string }) {\n return api.post(`/v1/me/business-user-invitations/${id}/resend`)\n}\n","import { api } from '@/lib/api'\nimport { OTPCode } from '@/types/auth'\n\nimport { TeamMember } from '../types'\n\ntype UnblockTeamMemberRequest = {\n id: string\n} & OTPCode\n\nexport function unblockTeamMember({ id, otp }: UnblockTeamMemberRequest) {\n return api.post(`/v1/me/business-users/${id}/unblock`, { otp })\n}\n","import { Currency } from '@/constants/currency'\nimport { Permission, Role } from '@/domains/Business/types'\n\nexport enum TeamState {\n ACTIVE = 'ACTIVE',\n BLOCKED = 'BLOCKED',\n INVITED = 'INVITED',\n TERMINATED = 'TERMINATED',\n}\n\nexport type TeamMember = {\n id: string\n businessId: string\n identityId: string\n email: string\n firstName: string\n secondLastName?: string\n lastName: string\n userTitle?: string\n state: TeamState\n role: Role\n permissions: Permission[]\n limitPeriodType?: LimitPeriodType\n periodTransferLimitAmount?: string\n singleTransferLimitAmount?: string\n moneyMovementPermission?: MovementPermission\n}\n\nexport enum MovementPermission {\n NO_APPROVAL_REQUIRED = 'NO_APPROVAL_REQUIRED',\n ALWAYS_REQUIRE_APPROVAL = 'ALWAYS_REQUIRE_APPROVAL',\n REQUIRE_APPROVAL_ABOVE_THE_LIMIT = 'REQUIRE_APPROVAL_ABOVE_THE_LIMIT',\n NO_LIMIT = 'NO_LIMIT',\n}\n\nexport enum LimitPeriodType {\n DAILY = 'DAILY',\n WEEKLY = 'WEEKLY',\n MONTHLY = 'MONTHLY',\n YEARLY = 'YEARLY',\n}\n\nexport type InvitedTeamMember = {\n businessId: string\n id: string\n identityId: string\n permissions: Permission[]\n role: Role\n state: TeamState\n}\n\nexport type TeamMemberTransferPermission = {\n businessId: string\n businessIdentityId: string\n businessUserId: string\n type: MovementPermission\n limitCurrency: Currency\n limitPeriodType: LimitPeriodType\n periodTransferLimitAmount: number\n singleTransferLimitAmount: number\n periodStartDate: string\n periodResetDate: string\n}\n\nexport type TeamMemberPaymentLimit = {\n businessUserId: string\n type: MovementPermission\n periodTransferLimit?: {\n limitType: LimitPeriodType\n limitAmount: number\n usedAmount: number\n limitCurrency: Currency\n periodStartDate: string\n periodResetDate: string\n } | null\n singleTransferLimit?: { limitAmount: number; limitCurrency: Currency } | null\n}\n","import { Currency } from '@/constants/currency'\nimport { Permission, Role } from '@/domains/Business/types'\n\nimport {\n InvitedTeamMember,\n LimitPeriodType,\n MovementPermission,\n TeamMember,\n TeamMemberPaymentLimit,\n TeamMemberTransferPermission,\n TeamState,\n} from '../../types'\n\nexport const INVITED_TEAM_MEMBER_MOCK_RESPONSE: InvitedTeamMember = {\n id: '0ceaf1d2-20b6-4de0-8e74-ad514f0df81c',\n businessId: 'c002df21-b54c-4ace-8f54-52b4d3a2a2bb',\n identityId: 'baa98df2-0831-4ac9-954f-346de5b66f41',\n permissions: [Permission.READ_ACCESS],\n state: TeamState.INVITED,\n role: Role.READ_ONLY,\n}\n\nexport const MOCKED_TEAM_MEMBERS: TeamMember[] = [\n {\n id: 'ab9890c1-8ed5-4f52-a1fd-1039ba5ddce4',\n businessId: 'c002df21-b54c-4ace-8f54-52b4d3a2a2bb',\n identityId: '00283379-242d-4cae-8e12-2d8fd831d9fa',\n email: 'maks@dolarapp.com',\n userTitle: undefined,\n firstName: 'Joe',\n lastName: 'Rogan',\n secondLastName: '',\n state: TeamState.ACTIVE,\n role: Role.ADMIN,\n\n permissions: [\n Permission.TEAM_MANAGEMENT,\n Permission.CARDS_MANAGEMENT,\n Permission.CARDS_ACCESS,\n Permission.TRANSFERS,\n Permission.READ_ACCESS,\n Permission.REQUEST_APPROVALS,\n ],\n },\n {\n id: '063993e9-93aa-4d56-a13e-5a2cb2855dbb',\n businessId: 'c002df21-b54c-4ace-8f54-52b4d3a2a2bb',\n identityId: '97092bab-95be-4484-98fa-c5012babca60',\n email: 'maks.admin@dolarapp.com',\n userTitle: 'Chief Admin Officer',\n firstName: 'Mark',\n lastName: 'Zuckerberg',\n secondLastName: '',\n state: TeamState.ACTIVE,\n role: Role.ADMIN,\n permissions: [\n Permission.TEAM_MANAGEMENT,\n Permission.CARDS_MANAGEMENT,\n Permission.CARDS_ACCESS,\n Permission.TRANSFERS,\n Permission.READ_ACCESS,\n Permission.REQUEST_APPROVALS,\n ],\n },\n {\n id: '6d089c92-0f42-48d0-b6a3-78e6e45e70af',\n businessId: 'c002df21-b54c-4ace-8f54-52b4d3a2a2bb',\n identityId: 'd890b160-aea3-4ad5-a1d2-79c15c19befc',\n email: 'maks.readonly@dolarapp.com',\n userTitle: 'Read Only ',\n firstName: 'Elon',\n lastName: 'Musk',\n secondLastName: '',\n state: TeamState.INVITED,\n role: Role.READ_ONLY,\n permissions: [Permission.READ_ACCESS],\n },\n]\n\nexport const MOCKED_TEAM_MEMBER_TRANSFER_PERMISSION: TeamMemberTransferPermission =\n {\n businessId: 'c002df21-b54c-4ace-8f54-52b4d3a2a2bb',\n businessIdentityId: '00283379-242d-4cae-8e12-2d8fd831d9fa',\n businessUserId: 'ab9890c1-8ed5-4f52-a1fd-1039ba5ddce4',\n type: MovementPermission.NO_APPROVAL_REQUIRED,\n limitCurrency: Currency.USDC,\n limitPeriodType: LimitPeriodType.MONTHLY,\n periodTransferLimitAmount: 6000.0,\n singleTransferLimitAmount: 1000.0,\n periodStartDate: '2024-08-01T05:00:00',\n periodResetDate: '2024-09-01T05:00:00',\n }\n\nexport const MOCKED_PAYMENT_LIMIT: TeamMemberPaymentLimit = {\n businessUserId: 'b89ff7c0-c562-49ae-aafc-b862ed65bb2b',\n type: MovementPermission.NO_APPROVAL_REQUIRED,\n periodTransferLimit: {\n limitType: LimitPeriodType.MONTHLY,\n limitAmount: 200,\n usedAmount: 3,\n limitCurrency: Currency.USDC,\n periodStartDate: '2024-08-23T05:00:00',\n periodResetDate: '2024-08-24T05:00:00',\n },\n singleTransferLimit: {\n limitAmount: 50,\n limitCurrency: Currency.USDC,\n },\n}\n","import { http, HttpResponse } from 'msw'\n\nimport { BASE_API_DEV } from '@/constants/urls'\n\nimport {\n INVITED_TEAM_MEMBER_MOCK_RESPONSE,\n MOCKED_PAYMENT_LIMIT,\n MOCKED_TEAM_MEMBERS,\n} from './teamMembers.mock'\n\nexport const teamHandlers = [\n http.post(`${BASE_API_DEV}/v1/me/business-user-invitations`, async () => {\n return HttpResponse.json(INVITED_TEAM_MEMBER_MOCK_RESPONSE)\n }),\n http.get(`${BASE_API_DEV}/v1/me/business-users/search`, async () => {\n return HttpResponse.json(MOCKED_TEAM_MEMBERS)\n }),\n\n http.get(`${BASE_API_DEV}/v1/me/business-users/:id`, async ({ params }) => {\n const { id } = params\n\n const user = MOCKED_TEAM_MEMBERS.find((user) => user.id === id)\n\n if (!user) {\n return HttpResponse.json(MOCKED_TEAM_MEMBERS[0])\n }\n\n return HttpResponse.json(user)\n }),\n\n http.get(\n `${BASE_API_DEV}/v1/me/business-users/:id/payment-limits`,\n async () => {\n return HttpResponse.json(MOCKED_PAYMENT_LIMIT)\n },\n ),\n\n http.get(`${BASE_API_DEV}/v1/my/business-users/payment-limits`, async () => {\n return HttpResponse.json(MOCKED_PAYMENT_LIMIT)\n }),\n\n http.put(`${BASE_API_DEV}/v1/me/business-users/:id`, async () => {\n return HttpResponse.json(MOCKED_TEAM_MEMBERS[0])\n }),\n\n http.post(`${BASE_API_DEV}/v1/me/business-users/:id/block`, async () => {\n return HttpResponse.json(MOCKED_TEAM_MEMBERS[0])\n }),\n\n http.post(`${BASE_API_DEV}/v1/me/business-users/:id/unblock`, async () => {\n return HttpResponse.json(MOCKED_TEAM_MEMBERS[0])\n }),\n\n http.post(`${BASE_API_DEV}/v1/me/business-users/:id/terminate`, async () => {\n return HttpResponse.json(MOCKED_TEAM_MEMBERS[0])\n }),\n]\n\nexport * from './teamMembers.mock'\n","import { useCallback } from 'react'\nimport { useQuery } from '@tanstack/react-query'\nimport { Big } from 'big.js'\n\nimport { queryKeys } from '@/constants/queryKeys'\nimport { getPaymentLimit } from '@/domains/Business/features/Team/api'\nimport { MovementPermission } from '@/domains/Business/features/Team/types'\n\nexport function useCheckUserPaymentLimit() {\n const paymentLimitQuery = useQuery({\n queryKey: [queryKeys.getPaymentLimit],\n queryFn: () => getPaymentLimit(),\n select: (data) => data.data,\n })\n\n const hasCrossedLimit = useCallback(\n (amount?: number | string) => {\n if (!paymentLimitQuery.data || !amount) {\n return false\n }\n\n const { periodTransferLimit, singleTransferLimit, type } =\n paymentLimitQuery.data\n\n if (type === MovementPermission.ALWAYS_REQUIRE_APPROVAL) {\n return true\n }\n\n if (!periodTransferLimit || !singleTransferLimit) {\n return false\n }\n\n return (\n type === MovementPermission.REQUIRE_APPROVAL_ABOVE_THE_LIMIT &&\n (Big(amount)\n .plus(periodTransferLimit.usedAmount)\n .gt(periodTransferLimit.limitAmount) ||\n Big(amount).gt(singleTransferLimit.limitAmount))\n )\n },\n [paymentLimitQuery.data],\n )\n\n return hasCrossedLimit\n}\n","import { useMemo } from 'react'\nimport { useQuery } from '@tanstack/react-query'\nimport { AxiosResponse } from 'axios'\n\nimport { queryKeys } from '@/constants/queryKeys'\nimport { getFeatures } from '@/domains/Business/api'\nimport { Feature, Features, Permission, Role } from '@/domains/Business/types'\n\nimport { useBusinessRole } from './useBusinessRole'\nimport { useBusinessUser } from './useBusinessUser'\n\ntype FeatureFlags = {\n [K in Feature]: boolean\n}\n\nexport function useFeatures(features: Feature[]) {\n const { role, isPending: rolePending } = useBusinessRole()\n const businessUser = useBusinessUser()\n\n const featuresQuery = useQuery({\n queryKey: [queryKeys.getFeatures],\n queryFn: getFeatures,\n select: (data: AxiosResponse) => data.data,\n })\n\n const hasContractorsEnabled = useMemo(() => {\n return featuresQuery.data?.features.includes(Feature.CONTRACTORS) ?? false\n }, [featuresQuery.data])\n\n const hasCardsEnabled = useMemo(() => {\n return featuresQuery.data?.features.includes(Feature.CARDS) ?? false\n }, [featuresQuery.data])\n\n const enabledFeatures = useMemo((): FeatureFlags => {\n if (!role) {\n return {\n [Feature.ACCOUNTS]: true,\n [Feature.ACTIONS]: true,\n [Feature.CARDS]: true,\n [Feature.HOME]: true,\n [Feature.RECIPIENTS]: true,\n [Feature.SETTINGS]: false,\n [Feature.TASKS]: true,\n [Feature.TEAM]: true,\n [Feature.TRANSACTIONS]: true,\n [Feature.CONTRACTORS]: false,\n }\n }\n\n const BASE_ACCESS_ROLES = [Role.ADMIN, Role.READ_ONLY, Role.PAYMENT_OPS]\n\n return {\n [Feature.HOME]: BASE_ACCESS_ROLES.includes(role),\n [Feature.ACCOUNTS]: BASE_ACCESS_ROLES.includes(role),\n [Feature.CARDS]:\n [...BASE_ACCESS_ROLES, Role.CARD_USER].includes(role) &&\n hasCardsEnabled,\n [Feature.RECIPIENTS]: BASE_ACCESS_ROLES.includes(role),\n [Feature.TRANSACTIONS]: BASE_ACCESS_ROLES.includes(role),\n [Feature.TEAM]: [Role.ADMIN].includes(role),\n [Feature.TASKS]: [Role.ADMIN, Role.PAYMENT_OPS].includes(role),\n [Feature.ACTIONS]: !!businessUser?.permissions.includes(\n Permission.TRANSFERS,\n ),\n [Feature.CONTRACTORS]:\n [Role.ADMIN].includes(role) && hasContractorsEnabled,\n\n [Feature.SETTINGS]: false,\n }\n }, [businessUser?.permissions, role, hasContractorsEnabled, hasCardsEnabled])\n\n return {\n features: features.map((feature) => enabledFeatures[feature]),\n isPending: featuresQuery.isPending || rolePending,\n featuresAvailable: !!featuresQuery.data?.features,\n }\n}\n\nexport function useFeature(feature: Feature) {\n const features = useFeatures([feature])\n\n const [isEnabled] = features.features\n\n return {\n isEnabled,\n isPending: features.isPending,\n }\n}\n","import { useQuery } from '@tanstack/react-query'\n\nimport { queryKeys } from '@/constants/queryKeys'\nimport { getBankByReference } from '@/domains/Business/api'\nimport { CountryCode } from '@/types/country'\n\ntype Props = {\n country: CountryCode\n bankReference: string\n enabled: boolean\n}\n\nexport function useGetBankName({ country, bankReference, enabled }: Props) {\n const bankNameQuery = useQuery({\n queryKey: [queryKeys.getBankByReference, country, bankReference],\n queryFn: () => getBankByReference({ country, bankReference }),\n select: (data) => data.data,\n enabled,\n retry: 1,\n })\n\n return {\n name: bankNameQuery.data?.name,\n isPending: bankNameQuery.isFetching,\n }\n}\n","import { api } from '@/lib/api'\n\nexport function logout() {\n return api.post('/v1/logout')\n}\n","import { useCallback } from 'react'\nimport { Big } from 'big.js'\nimport { useIntl } from 'react-intl'\nimport { toast } from 'sonner'\n\nimport { backendErrorMessages, errorMessages } from '@/constants/messages'\nimport { parseAdditionalDetails } from '@/lib/utils'\nimport { ApiError } from '@/types/global'\n\nfunction handleErrorMessageWithAdditionalData(error: ApiError) {\n const code = error.response?.data?.error\n\n switch (code) {\n case 'VERIFY_OTP_FORBIDDEN': {\n return {\n attempt: Big(error.response?.data?.details?.maxAttempts ?? 0)\n .minus(Big(error.response?.data?.details?.currentAttempt ?? 0))\n .toNumber(),\n }\n }\n\n default:\n return {}\n }\n}\n\nexport function useErrorToast() {\n const intl = useIntl()\n\n return useCallback(\n async (err: unknown) => {\n if (err instanceof Error) {\n const error = err as ApiError\n\n let errorCode: string | undefined\n\n const errorMessage = intl.formatMessage(\n errorMessages['validation.generic.error'],\n )\n\n if (error.response?.data instanceof Blob) {\n const errorResponse = parseAdditionalDetails<{ error: string }>(\n await error.response?.data.text(),\n )\n\n if (errorResponse?.error) {\n errorCode = errorResponse.error\n } else {\n errorCode = error.response?.data?.error\n }\n } else {\n errorCode = error.response?.data?.error\n }\n\n if (errorCode) {\n if (backendErrorMessages[errorCode] === undefined) {\n if (error.response?.data?.description) {\n return toast.error(error.response.data.description)\n }\n\n return toast.error(errorMessage)\n }\n\n const backendErrorMessage = intl.formatMessage(\n backendErrorMessages[errorCode],\n {\n ...handleErrorMessageWithAdditionalData(error),\n },\n )\n\n return toast.error(backendErrorMessage)\n }\n\n return toast.error(errorMessage)\n }\n },\n [intl],\n )\n}\n","import { createContext } from 'react'\n\ntype State = {\n accessToken: string | null\n setAuthToken: (token: string | null) => void\n updateRefreshToken: (token: string | null) => void\n}\n\nexport const AuthContext = createContext(undefined)\n","import { useContext } from 'react'\n\nimport { AuthContext } from './AuthContext'\n\nexport const useAuth = () => {\n const context = useContext(AuthContext)\n\n if (!context) {\n throw new Error('useAuth must be used within an AuthProvider')\n }\n\n return context\n}\n","import { useCallback, useEffect, useMemo, useState } from 'react'\nimport { jwtDecode } from 'jwt-decode'\n\nimport { sessionStorageKeys } from '@/constants/keys'\n\nimport { AuthContext } from './AuthContext'\n\ntype Props = {\n children: React.ReactNode\n}\n\nexport const AuthProvider = ({ children }: Props) => {\n const [, setRefreshToken] = useState(\n sessionStorage.getItem(sessionStorageKeys.refreshToken),\n )\n\n const [accessToken, setAccessToken] = useState(() =>\n sessionStorage.getItem(sessionStorageKeys.accessToken),\n )\n\n useEffect(() => {\n const accessTokenFromStorage = sessionStorage.getItem(\n sessionStorageKeys.accessToken,\n )\n\n if (accessTokenFromStorage) {\n setAccessToken(accessTokenFromStorage)\n }\n }, [accessToken])\n\n const setAuthToken = useCallback((token: string | null) => {\n if (!token) {\n setAccessToken(null)\n sessionStorage.removeItem(sessionStorageKeys.accessToken)\n return\n }\n\n setAccessToken(token)\n }, [])\n\n const updateRefreshToken = useCallback((token: string | null) => {\n if (!token) {\n setRefreshToken(null)\n sessionStorage.removeItem(sessionStorageKeys.refreshToken)\n return\n }\n\n sessionStorage.setItem(sessionStorageKeys.refreshToken, token)\n\n // we set token thru interceptor, so we double set it here\n const accessTokenFromStorage = sessionStorage.getItem(\n sessionStorageKeys.accessToken,\n )\n\n if (accessTokenFromStorage) {\n setAccessToken(accessTokenFromStorage)\n }\n\n setRefreshToken(token)\n }, [])\n\n useEffect(() => {\n const intervalId = setInterval(() => {\n const tokenFromStorage = sessionStorage.getItem(\n sessionStorageKeys.accessToken,\n )\n\n const decodedToken = tokenFromStorage\n ? jwtDecode(tokenFromStorage)\n : undefined\n\n const tokenExpiryDate = decodedToken?.exp ? decodedToken.exp * 1000 : 0\n\n if (tokenExpiryDate < Date.now()) {\n updateRefreshToken(null)\n setAuthToken(null)\n }\n }, 1000)\n\n return () => clearInterval(intervalId)\n }, [updateRefreshToken, setAuthToken])\n\n const contextValue = useMemo(\n () => ({\n accessToken,\n setAuthToken,\n updateRefreshToken,\n }),\n [accessToken, setAuthToken, updateRefreshToken],\n )\n\n return (\n {children}\n )\n}\n","import { useCallback } from 'react'\nimport * as Sentry from '@sentry/react'\nimport { useLocation, useNavigate } from 'react-router'\nimport { useIntercom } from 'react-use-intercom'\n\nimport { BusinessRoute, ContractorRoute } from '@/constants/paths'\nimport { queryClient } from '@/lib/queryClient'\nimport { useAuth } from '@/providers/AuthProvider'\n\nexport function useReset() {\n const { hide } = useIntercom()\n const { updateRefreshToken, setAuthToken } = useAuth()\n const navigate = useNavigate()\n const { pathname } = useLocation()\n\n const isContractorPath = /^\\/contractor\\//i.test(pathname)\n\n const reset = useCallback(() => {\n hide()\n\n setAuthToken(null)\n updateRefreshToken(null)\n sessionStorage.clear()\n Sentry.setUser(null)\n\n queryClient.removeQueries()\n\n if (isContractorPath) {\n navigate(ContractorRoute.SignIn, { replace: true })\n } else {\n navigate(BusinessRoute.SignIn, { replace: true })\n }\n }, [hide, setAuthToken, updateRefreshToken, isContractorPath, navigate])\n\n return reset\n}\n","import { useCallback } from 'react'\nimport { useMutation } from '@tanstack/react-query'\nimport { useNavigate } from 'react-router'\n\nimport { BaseRoute } from '@/constants/paths'\nimport { logout as logoutApi } from '@/domains/Business/api/logout'\nimport { useErrorToast } from '@/hooks/useErrorToast'\nimport { useReset } from '@/hooks/useReset'\n\nexport function useLogout() {\n const reset = useReset()\n\n const navigate = useNavigate()\n const notifyError = useErrorToast()\n\n const { mutateAsync } = useMutation({\n mutationFn: logoutApi,\n })\n\n const logout = useCallback(async () => {\n navigate(BaseRoute.LoggingOut, { replace: true })\n\n try {\n await mutateAsync()\n } catch (error) {\n notifyError(error)\n }\n\n reset()\n }, [mutateAsync, navigate, notifyError, reset])\n\n return { logout }\n}\n","import { useQuery } from '@tanstack/react-query'\n\nimport { queryKeys } from '@/constants/queryKeys'\nimport { getBusinessUser } from '@/domains/Business/api'\n\nexport function usePermissions() {\n const businessUserQuery = useQuery({\n queryKey: [queryKeys.getBusinessUser],\n queryFn: getBusinessUser,\n select: (data) => data.data,\n })\n\n return businessUserQuery.data?.permissions\n}\n","import { Currency } from '@/constants/currency'\nimport {\n ACCOUNTS_FILTER_NAME,\n CARDS_ID_FILTER_NAME,\n CURRENCY_FILTER_NAME,\n DATE_FROM_FILTER_NAME,\n DATE_TO_FILTER_NAME,\n SEARCH_FILTER_NAME,\n STATUS_FILTER_NAME,\n TYPE_FILTER_NAME,\n} from '@/domains/Business/components'\n\nexport enum DisplayableType {\n BULK = 'BULK',\n SINGLE = 'SINGLE',\n}\n\nexport enum TransactionStatus {\n COMPLETED = 'COMPLETED',\n FAILED = 'FAILED',\n PENDING = 'PENDING',\n REVERTED = 'REVERTED',\n BLOCKED = 'BLOCKED',\n}\n\nexport enum BulkTransactionStatus {\n COMPLETED = 'COMPLETED',\n INCOMPLETE = 'INCOMPLETE',\n PENDING = 'PENDING',\n}\n\nexport enum TransactionType {\n CARD_PAYMENT = 'CARD_PAYMENT',\n DEPOSIT = 'DEPOSIT',\n INTERNAL_SWAP_DEPOSIT = 'INTERNAL_SWAP_DEPOSIT',\n INTERNAL_SWAP_WITHDRAW = 'INTERNAL_SWAP_WITHDRAW',\n REWARD = 'REWARD',\n FEE = 'FEE',\n CARD_PAYMENT_REFUND = 'CARD_PAYMENT_REFUND',\n WITHDRAW = 'WITHDRAW',\n WITHDRAW_REFUND = 'WITHDRAW_REFUND',\n CARD_PAYMENT_CHARGEBACK = 'CARD_PAYMENT_CHARGEBACK',\n CASHBACK = 'CASHBACK',\n INCOMING_DIRECT_DEBIT = 'INCOMING_DIRECT_DEBIT',\n}\n\nexport type SingleTransaction = {\n displayableType: DisplayableType.SINGLE\n accountId: string\n // BE returns it as string cause it can contain any amount of additional data, use parseAdditionalDetails helper\n additionalDetails: string\n baseAmount: number\n baseCurrency: Currency\n createdOn: string\n description: string\n feeAmount: number\n feeCurrency: Currency\n fxRate: number\n id: string\n localAmount: number\n localCurrency: Currency\n name: string\n provider: string\n transactionStatus: TransactionStatus\n transactionType: TransactionType\n postTransactionBalance?: number | null\n relatedTransactionId?: string\n groupId?: string\n completedAt?: string | null\n providerRef?: string\n updatedOn: string\n walletId: string\n visible?: boolean\n}\n\nexport type BulkTransaction = {\n displayableType: DisplayableType.BULK\n accountId: string\n bulkTransactionLabel: string\n bulkTransactionStatus: BulkTransactionStatus\n createdOn: string\n failedTransactions: SingleTransaction[]\n groupId: string\n localCurrencies: Currency[]\n totalBaseAmount: number\n totalBaseCurrency: Currency\n totalFeeAmount: number\n totalFeeCurrency: Currency\n transactions: SingleTransaction[]\n walletId: string\n}\n\nexport type Transaction = SingleTransaction | BulkTransaction\n\nexport type TransactionSearchParams = {\n [ACCOUNTS_FILTER_NAME]?: string\n [TYPE_FILTER_NAME]?: string\n [CURRENCY_FILTER_NAME]?: string\n [STATUS_FILTER_NAME]?: string\n [DATE_FROM_FILTER_NAME]?: string\n [DATE_TO_FILTER_NAME]?: string\n [CARDS_ID_FILTER_NAME]?: string\n [SEARCH_FILTER_NAME]?: string\n\n page?: string\n limit?: string\n}\n\nexport type CashbackTransaction = {\n id: string\n businessId: string\n walletId: string\n accountId: string\n transactionId: string\n total: { amount: number; currency: Currency }\n totalCardPayment: { amount: number; currency: Currency }\n eligibleTransactions: SingleTransaction[]\n paymentDate: string\n standardRate: number\n standardCashback: { amount: number; currency: Currency }\n}\n","import { useSearchParams } from 'react-router'\n\nexport function useSearchParamsValue(queries: string[]) {\n const [searchQuery] = useSearchParams()\n const searchParams = new URLSearchParams(searchQuery)\n\n return queries.map((query) => searchParams.get(query))\n}\n","import { useEffect, useState } from 'react'\n\nimport { useSearchParamsValue } from './useSearchParamsValue'\n\ntype Props = {\n key: string\n}\n\nexport const useSidebar = ({ key }: Props) => {\n const [query] = useSearchParamsValue([key])\n\n const [showDetails, setShowDetails] = useState(!!query)\n\n useEffect(() => {\n if (!query) {\n setShowDetails(false)\n } else {\n setShowDetails(true)\n }\n }, [query])\n\n return [showDetails, setShowDetails] as const\n}\n","import { useCallback } from 'react'\nimport { useSearchParams } from 'react-router'\n\nimport {\n DisplayableType,\n Transaction,\n} from '@/domains/Business/features/Transactions/types'\nimport { useSearchParamsValue } from '@/hooks/useSearchParamsValue'\n\nimport { useSidebar } from '../../../hooks/useSidebar'\n\nconst TX_QUERY_KEY = 'tx'\nconst TX_TYPE_QUERY_KEY = 'type'\n\nexport function useTransactionUtils() {\n const [searchParams, setSearchParams] = useSearchParams()\n\n const [transactionIdFromQuery, transactionTypeFromQuery] =\n useSearchParamsValue([TX_QUERY_KEY, TX_TYPE_QUERY_KEY])\n\n const [showDetails, setShowDetails] = useSidebar({ key: TX_QUERY_KEY })\n\n const params = Object.fromEntries(\n [...searchParams].filter(\n ([key]) => key !== TX_QUERY_KEY && key !== TX_TYPE_QUERY_KEY,\n ),\n )\n\n const openSidebar = useCallback(\n (tx: Transaction) => {\n setSearchParams(\n (params) => {\n switch (tx.displayableType) {\n case DisplayableType.SINGLE: {\n params.set(TX_QUERY_KEY, tx.id)\n params.set(TX_TYPE_QUERY_KEY, DisplayableType.SINGLE)\n break\n }\n\n case DisplayableType.BULK: {\n params.set(TX_QUERY_KEY, tx.groupId)\n params.set(TX_TYPE_QUERY_KEY, DisplayableType.BULK)\n break\n }\n\n default: {\n break\n }\n }\n\n return params\n },\n {\n preventScrollReset: true,\n },\n )\n },\n [setSearchParams],\n )\n\n const closeSidebar = useCallback(() => {\n setShowDetails((s) => !s)\n setSearchParams(\n (params) => {\n params.delete(TX_QUERY_KEY)\n params.delete(TX_TYPE_QUERY_KEY)\n return params\n },\n { preventScrollReset: true },\n )\n }, [setSearchParams, setShowDetails])\n\n return {\n closeSidebar,\n openSidebar,\n params,\n isSidebarOpen: showDetails,\n transactionIdFromQuery,\n transactionTypeFromQuery: transactionTypeFromQuery as\n | DisplayableType\n | undefined,\n }\n}\n","import { Currency } from '@/constants/currency'\n\nexport type Account = {\n defaultWalletId: string\n id: string\n wallets: Wallet[]\n totalBalance: number\n totalBalanceCurrency: Currency\n}\n\nexport enum WalletState {\n ACTIVE = 'ACTIVE',\n CLOSED = 'CLOSED',\n}\n\nexport type Wallet = {\n id: string\n accountId: string\n currency: Currency\n state: WalletState\n balance: number\n label: string\n monthlyTotalMoneyIn: number\n monthlyTotalMoneyOut: number\n}\n\nexport enum AccountType {\n WIRE = 'USA_LOCAL_WIRE',\n ACH = 'USA_LOCAL_ACH',\n LOCAL_MX = 'MEX_LOCAL',\n}\n\nexport type AccountDetails = {\n bankAccounts: BankAccount[]\n}\n\nexport type Address = {\n street: string\n city: string\n postcode: string\n state: string\n countryCode: string\n}\n\ntype HolderDetails = {\n bankName: string\n entityName: string\n bankAddress: Address\n}\n\ntype Identifier = {\n type: string\n value: string\n}\n\ntype DetailsWire = {\n accountIdentifier: Identifier\n accountEntityType: string\n bankIdentifier: Identifier\n additionalInformation: {\n DEPOSIT_MESSAGE: string\n }\n}\n\ntype DetailsACH = {\n accountIdentifier: Identifier\n accountEntityType: string\n bankIdentifier: Identifier\n additionalInformation: null\n}\n\ntype USAccountACH = {\n type: AccountType.ACH\n currency: Currency\n state: string\n holderDetails: HolderDetails\n accountDetails: DetailsACH\n}\n\ntype USAccountWire = {\n type: AccountType.WIRE\n currency: Currency\n state: string\n holderDetails: HolderDetails\n accountDetails: DetailsWire\n}\n\ntype MXAccount = {\n type: AccountType.LOCAL_MX\n currency: Currency\n state: string\n holderDetails: { bankName: string; entityName: string }\n accountDetails: {\n accountIdentifier: Identifier\n accountEntityType: null\n bankIdentifier: null\n }\n}\n\nexport type BankAccount = MXAccount | USAccountWire | USAccountACH\n\nexport interface AccountIdentifier {\n type: string\n value: string\n}\n\nexport enum StatementType {\n CREDIT = 'CREDIT',\n ACCOUNT = 'ACCOUNT',\n}\n\nexport type AccountStatement = {\n id: string\n businessId: string\n entityId: string\n type: StatementType\n startDate: string\n endDate: string\n}\n\nexport type AccountCreditCycle = {\n businessId: string\n walletId: string\n totalBalance: number\n cycleCredit: number\n availableBalance: number\n startDate: string\n endDate: string\n dueDate: string\n daysInCycle: number\n outstandingDebt: number\n currency: Currency\n debtAPR: number\n}\n","import { useQuery } from '@tanstack/react-query'\n\nimport { queryKeys } from '@/constants/queryKeys'\n\nimport { getAccount } from '../features/Accounts/api'\nimport { WalletState } from '../features/Accounts/types'\n\ntype Props = {\n enabled?: boolean\n showAll?: boolean\n staleTime?: number\n}\n\nexport function useWallets({\n enabled = true,\n showAll = false,\n staleTime = 1000 * 60 * 5,\n}: Props = {}) {\n const query = useQuery({\n queryKey: [queryKeys.getAccount],\n queryFn: getAccount,\n select: (data) => data?.data,\n enabled,\n staleTime,\n })\n\n return {\n defaultWalletId: query.data?.defaultWalletId,\n totalBalance: query.data?.totalBalance,\n totalBalanceCurrency: query.data?.totalBalanceCurrency,\n accountId: query.data?.id,\n wallets: query.data?.wallets.filter(\n (wallet) => showAll || wallet.state !== WalletState.CLOSED,\n ),\n isPending: query.isPending,\n }\n}\n","import { useState } from 'react'\nimport { FormattedMessage } from 'react-intl'\n\nimport { Currency } from '@/constants/currency'\nimport { useWallets } from '@/domains/Business/hooks'\nimport { formatAmount } from '@/lib/money'\nimport { EmptyChart } from '@/shared/components'\nimport { ChartMixed } from '@/shared/icons/outline'\nimport { Button, Card, Skeleton, Typography } from '@/shared/ui'\n\nexport const AccountBalance = () => {\n const { isPending, wallets, totalBalance, totalBalanceCurrency } = useWallets(\n {\n staleTime: 0,\n },\n )\n\n const [showChart, setShowChart] = useState(false)\n\n return (\n \n
\n
\n
\n \n \n \n \n \n \n
\n\n
\n\n {isPending ? (\n \n ) : (\n \n {formatAmount({\n amount: totalBalance ?? 0,\n currency: totalBalanceCurrency ?? Currency.USDC,\n })}\n \n )}\n
\n }\n onClick={() => setShowChart((c) => !c)}\n size=\"md\"\n variant=\"secondary\"\n >\n {showChart ? (\n \n ) : (\n \n )}\n \n
\n\n \n \n )\n}\n","import { cn } from '@/lib/utils'\nimport { Bank } from '@/shared/icons/outline'\n\nimport { useWallets } from '../hooks'\n\nconst COLOR_BY_INDEX = [\n { backgroundColor: '#E9E9E9', color: '#2C2C2E' },\n { backgroundColor: '#FBF0E3', color: '#E4A056' },\n { backgroundColor: '#F0F3F9', color: '#337CE5' },\n { backgroundColor: '#E8F5E9', color: '#1B5E20' },\n { backgroundColor: '#EDE7F6', color: '#4A148C' },\n { backgroundColor: '#FBE9E7', color: '#BF360C' },\n { backgroundColor: '#E3F2FD', color: '#0D47A1' },\n { backgroundColor: '#FFEEFF', color: '#880E4F' },\n { backgroundColor: '#E8F0FE', color: '#1A237E' },\n { backgroundColor: '#F9FBE7', color: '#33691E' },\n { backgroundColor: '#FFCDD2', color: '#B71C1C' },\n { backgroundColor: '#E0F2F1', color: '#004D40' },\n { backgroundColor: '#FFF3E0', color: '#E65100' },\n]\n\ntype Size = 'sm' | 'md' | 'lg'\n\nexport const AccountIcon = ({\n id,\n size = 'md',\n}: {\n id?: string\n size?: Size\n}) => {\n const { wallets } = useWallets({ showAll: true })\n\n const walletIndex = wallets?.findIndex((wallet) => wallet.id === id) ?? 0\n\n const { backgroundColor, color } = COLOR_BY_INDEX[\n walletIndex % COLOR_BY_INDEX.length\n ] ?? { ...COLOR_BY_INDEX[0] }\n\n return (\n \n \n
\n )\n}\n","import { formatAmount } from '@/lib/money'\nimport { Typography } from '@/shared/ui'\n\nimport { Wallet } from '../features/Accounts/types'\n\nimport { AccountIcon } from './AccountIcon'\n\ntype Props = {\n accountIconVariant?: 'md' | 'sm'\n balance?: boolean\n boldText?: boolean\n wallet: Wallet\n}\n\nexport const WalletItem = ({\n accountIconVariant = 'md',\n balance = true,\n boldText = false,\n wallet,\n}: Props) => {\n return (\n
\n \n\n
\n \n {wallet.label}\n \n\n {balance ? (\n <>\n \n •\n \n \n {formatAmount({\n amount: wallet.balance,\n currency: wallet.currency,\n })}\n \n \n ) : null}\n
\n
\n )\n}\n","import { cn } from '@/lib/utils'\nimport {\n MotionDiv,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Typography,\n} from '@/shared/ui'\n\nimport { useWallets } from '../hooks'\n\nimport { WalletItem } from './WalletItem'\n\ntype Props = {\n value: string\n onChange: (v: string) => void\n disabled?: boolean\n label: string\n showLabel?: boolean\n hasError?: boolean\n variant?: 'default' | 'outline'\n excludeIds?: (string | undefined)[]\n}\n\nexport const AccountSelect = ({\n disabled,\n label,\n onChange,\n value,\n hasError = false,\n showLabel = false,\n variant = 'default',\n excludeIds,\n}: Props) => {\n const { wallets, isPending } = useWallets()\n\n const walletOptions = wallets?.filter(\n (wallet) => !excludeIds?.includes(wallet.id),\n )\n\n const wallet = walletOptions?.find((a) => a.id === value)\n\n return (\n \n \n {wallet ? (\n \n {showLabel ? (\n \n {label}\n \n ) : null}\n \n \n \n \n ) : (\n \n )}\n \n\n \n {walletOptions?.map((wallet) => (\n \n \n \n ))}\n \n \n )\n}\n","import { create } from 'zustand'\nimport { createJSONStorage, persist } from 'zustand/middleware'\n\ntype TwoFactorResetStorage = {\n reset2FA: boolean\n enable2FAReset: () => void\n disable2FAReset: () => void\n}\n\nexport const use2FAResetStorage = create<\n TwoFactorResetStorage,\n [['zustand/persist', TwoFactorResetStorage]]\n>(\n persist(\n (set) => ({\n reset2FA: false,\n enable2FAReset: () => set({ reset2FA: true }),\n disable2FAReset: () => set({ reset2FA: false }),\n }),\n {\n name: '2fa-storage',\n storage: createJSONStorage(() => sessionStorage),\n },\n ),\n)\n","export enum TwoFactorMethod {\n AUTHENTICATOR_APP = 'AUTHENTICATOR_APP',\n EMAIL = 'EMAIL',\n}\n\nexport type OTPCode = {\n otp?: string\n}\n","import { useCallback, useEffect } from 'react'\nimport { zodResolver } from '@hookform/resolvers/zod'\nimport { motion } from 'framer-motion'\nimport { SubmitHandler, useForm } from 'react-hook-form'\nimport { FormattedMessage } from 'react-intl'\n\nimport { getImage } from '@/lib/images'\nimport {\n CodeInput,\n codeInputSchema,\n CodeInputSchema,\n} from '@/shared/components'\nimport {\n AnimatedFormLabel,\n Button,\n DialogActions,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n Form,\n FormControl,\n FormField,\n FormItem,\n slideInFromBottomAnimation,\n Typography,\n} from '@/shared/ui'\nimport { TwoFactorMethod } from '@/types/auth'\n\nimport { Auth2FAResponse, Configuration } from '../../types'\n\ntype Props = {\n configurations: Configuration[]\n isPending: boolean\n onClose: () => void\n onContinue: (data: Auth2FAResponse) => void\n onMethodChange: () => void\n}\n\nexport const AuthenticatorDialog = ({\n configurations,\n isPending,\n onClose,\n onContinue,\n onMethodChange,\n}: Props) => {\n const form = useForm({\n mode: 'onChange',\n resolver: zodResolver(codeInputSchema),\n defaultValues: { otp: '' },\n })\n\n const onSubmit: SubmitHandler = useCallback(\n async (data) => {\n onContinue({ otp: data.otp, method: TwoFactorMethod.AUTHENTICATOR_APP })\n },\n [onContinue],\n )\n\n useEffect(() => {\n const subscription = form.watch(() => form.handleSubmit(onSubmit)())\n\n return () => subscription.unsubscribe()\n }, [form, onSubmit])\n\n return (\n \n \n\n
\n\n \n \n \n \n\n \n \n \n \n\n
\n\n
\n \n (\n \n \n \n \n \n \n \n \n )}\n />\n\n
\n\n \n \n \n \n \n \n \n \n\n
\n \n \n\n {configurations.includes('use-another-method') && (\n \n \n \n \n ),\n }}\n />\n \n )}\n \n )\n}\n","import { api } from '@/lib/api'\n\nexport type AcceptInvitationRequest = {\n identityId: string\n businessId: string\n otp: string\n rawPassword: string\n}\n\nexport type AcceptInvitationResponse = {\n refreshToken: string\n}\n\nexport function acceptInvitation(data: AcceptInvitationRequest) {\n return api.post(\n '/v1/invitation-verifications',\n data,\n )\n}\n","import { api } from '@/lib/api'\nimport { TwoFactorMethod } from '@/types/auth'\n\nexport type AuthenticateResponse = {\n identityId: string\n twoFactorAuthentication: { otpMethod: TwoFactorMethod; initialSetup: boolean }\n}\n\nexport type AuthenticateRequest = {\n email: string\n password: string\n otpMethod?: TwoFactorMethod\n}\n\nexport function authenticate(data: AuthenticateRequest) {\n return api.post('/v1/authentication', data)\n}\n","import { api } from '@/lib/api'\n\nexport type CreatePasswordResponse = {\n refreshToken: string\n}\n\nexport type CreatePasswordRequest = {\n signupId: string\n email: string\n password: string\n verificationCode: string\n}\n\nexport function createPassword(data: CreatePasswordRequest) {\n return api.post('/v1/verification', data)\n}\n","import { api } from '@/lib/api'\n\nexport type RecoverPasswordRequest = {\n email: string\n}\n\nexport function recoverPassword(data: RecoverPasswordRequest) {\n return api.post('/v1/password-recovery', data)\n}\n","import { api } from '@/lib/api'\n\nexport function getCompanyTypes(country?: string) {\n return api.get(`/v1/signup/company-types?country=${country}`)\n}\n","import { api } from '@/lib/api'\n\nexport type SignInRequest = {\n identityId: string\n otp?: string\n}\n\ntype SignInResponse = {\n refreshToken: string\n}\n\nexport function signIn(data: SignInRequest) {\n return api.post('/v1/signin', data)\n}\n","import { api } from '@/lib/api'\n\nexport type SignUpResponse = {\n signupId: string\n}\n\nexport type SignUpRequest = {\n firstName: string\n lastName: string\n email: string\n legalName: string\n countryOfIncorporation: string\n localPhoneNumber: string\n internationalPhonePrefix: string\n taxId: string\n taxIdType: string\n secondLastName?: string\n}\n\nexport function signUp(data: SignUpRequest) {\n return api.post('/v1/signup', data)\n}\n","import { api } from '@/lib/api'\n\nexport type UpdatePasswordRequest = {\n identityId: string\n otp: string\n newPassword: string\n}\n\nexport function updatePassword(data: UpdatePasswordRequest) {\n return api.post('/v1/password-change', data)\n}\n","import { http, HttpResponse } from 'msw'\n\nimport { BASE_API_DEV } from '@/constants/urls'\nimport { TwoFactorMethod } from '@/types/auth'\n\nexport const signInHandlers = [\n http.post(`${BASE_API_DEV}/v1/signup`, async () => {\n return HttpResponse.json({\n signupId: 'baa98df2-0831-4ac9-954f-346de5b66f41',\n })\n }),\n http.post(`${BASE_API_DEV}/v1/verification`, async () => {\n return HttpResponse.json({})\n }),\n http.post(`${BASE_API_DEV}/v1/authentication`, async () => {\n return HttpResponse.json({\n identityId: 'baa98df2-0831-4ac9-954f-346de5b66f41',\n twoFactorAuthentication: {\n otpMethod: TwoFactorMethod.EMAIL,\n initialSetup: false,\n },\n })\n }),\n http.post(`${BASE_API_DEV}/v1/signin`, async () => {\n return HttpResponse.json({})\n }),\n http.post(`${BASE_API_DEV}/v1/password-recovery`, async () => {\n return HttpResponse.json({})\n }),\n http.post(`${BASE_API_DEV}/v1/password-change`, async () => {\n return HttpResponse.json({})\n }),\n http.post(`${BASE_API_DEV}/v1/invitation-verifications`, async () => {\n return HttpResponse.json({})\n }),\n http.get(`${BASE_API_DEV}/v1/signup/company-types`, async () => {\n return HttpResponse.json([\n 'Asociación Civil',\n 'Sociedad Anónima',\n 'Sociedad Anónima de Capital Variable',\n 'Sociedad Anónima Promotora de Inversión',\n 'Sociedad Anónima Promotora de Inversión de Capital Variable',\n 'Sociedad Anónima Simplificada',\n 'Sociedad Anónima Simplificada de Capital Variable',\n 'Sociedad Cooperativa',\n 'Sociedad de Responsabilidad Limitada',\n 'Sociedad en Comandita por Acciones',\n 'Sociedad en Comandita Simple',\n 'Sociedad en Nombre Colectivo',\n ])\n }),\n]\n\nexport * from './auth.mocks'\n","import { useEffect, useState } from 'react'\nimport { useMutation } from '@tanstack/react-query'\nimport { FormattedMessage, useIntl } from 'react-intl'\nimport { toast } from 'sonner'\n\nimport { useErrorToast } from '@/hooks/useErrorToast'\nimport { Button, Typography } from '@/shared/ui'\n\nimport { authenticate } from '../../features/Auth/api'\n\nconst TIMER_COUNTDOWN = 60\n\ntype Props = {\n email?: string\n password?: string\n}\n\nexport const ResendCode = ({ email, password }: Props) => {\n const intl = useIntl()\n const notifyError = useErrorToast()\n const [countdown, setCountdown] = useState(TIMER_COUNTDOWN)\n\n const { mutateAsync, isPending } = useMutation({ mutationFn: authenticate })\n\n useEffect(() => {\n let timeoutId: NodeJS.Timeout\n\n if (countdown > 0) {\n timeoutId = setTimeout(() => setCountdown(countdown - 1), 1000)\n }\n\n return () => {\n clearTimeout(timeoutId)\n }\n }, [countdown])\n\n return (\n \n \n \n {' '}\n 0}\n variant=\"link\"\n size=\"inline\"\n className=\"text-xs\"\n onClick={() => {\n if (email && password) {\n try {\n mutateAsync({ email, password })\n } catch (error) {\n notifyError(error)\n }\n } else {\n toast.error(\n intl.formatMessage({\n defaultMessage: 'Email or password is missing',\n id: 'auth.error.missingEmailOrPassword',\n }),\n )\n }\n\n setCountdown(TIMER_COUNTDOWN)\n }}\n >\n {countdown === 0\n ? intl.formatMessage({\n defaultMessage: 'Resend now',\n id: 'auth.resendNow',\n })\n : isPending\n ? intl.formatMessage({\n defaultMessage: 'Sending now...',\n id: 'auth.sendNow',\n })\n : intl.formatMessage(\n {\n defaultMessage: 'Send again in {countdown}...',\n id: 'auth.sendAgainIn',\n },\n { countdown },\n )}\n \n \n )\n}\n","import { useCallback, useEffect } from 'react'\nimport { zodResolver } from '@hookform/resolvers/zod'\nimport { motion } from 'framer-motion'\nimport { SubmitHandler, useForm } from 'react-hook-form'\nimport { FormattedMessage } from 'react-intl'\n\nimport { isSmallScreen } from '@/constants/breakpoints'\nimport { useMediaQuery } from '@/hooks/useMediaQuery'\nimport { getImage } from '@/lib/images'\nimport {\n CodeInput,\n CodeInputSchema,\n codeInputSchema,\n} from '@/shared/components'\nimport {\n AnimatedFormLabel,\n Button,\n DialogActions,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n Form,\n FormControl,\n FormField,\n FormItem,\n slideInFromBottomAnimation,\n Typography,\n} from '@/shared/ui'\nimport { TwoFactorMethod } from '@/types/auth'\n\nimport { Auth2FAResponse, Configuration } from '../../types'\n\nimport { ResendCode } from './ResendCode'\n\ntype Props = {\n configurations: Configuration[]\n email?: string\n error?: Error | null\n isPending: boolean\n onClose: () => void\n onContinue: (data: Auth2FAResponse) => void\n onMethodChange: () => void\n password?: string\n}\n\nexport const EmailDialog = ({\n error,\n configurations,\n email,\n isPending,\n onClose,\n onContinue,\n onMethodChange,\n password,\n}: Props) => {\n const isMobile = useMediaQuery(isSmallScreen)\n\n const form = useForm({\n mode: 'onChange',\n resolver: zodResolver(codeInputSchema),\n defaultValues: { otp: '' },\n })\n\n const onSubmit: SubmitHandler = useCallback(\n async (data) => {\n onContinue({ otp: data.otp, method: TwoFactorMethod.EMAIL })\n },\n [onContinue],\n )\n\n useEffect(() => {\n const subscription = form.watch(() => form.handleSubmit(onSubmit)())\n\n return () => subscription.unsubscribe()\n }, [form, onSubmit])\n\n useEffect(() => {\n if (error && isMobile) {\n form.setError('otp', {\n type: 'custom',\n message: 'validation.otp.invalid',\n })\n }\n }, [form, error, isMobile])\n\n return (\n \n \n\n
\n\n \n \n \n \n\n \n \n \n \n\n
\n\n
\n \n (\n \n \n \n \n \n \n \n \n )}\n />\n\n
\n\n \n \n \n \n \n \n \n \n\n
\n \n \n\n
\n {configurations.includes('resend-code') && (\n \n )}\n {configurations.includes('use-another-method') && (\n \n onMethodChange()}\n >\n \n \n ),\n }}\n />\n \n )}\n
\n \n )\n}\n","import { motion } from 'framer-motion'\nimport { defineMessage, FormattedMessage, MessageDescriptor } from 'react-intl'\nimport { useIntercom } from 'react-use-intercom'\n\nimport { ChevronRight } from '@/shared/icons/outline'\nimport {\n Badge,\n Button,\n Card,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n slideInFromBottomAnimation,\n Typography,\n} from '@/shared/ui'\nimport { TwoFactorMethod } from '@/types/auth'\n\ntype AvailableMethod = {\n title: MessageDescriptor\n description: MessageDescriptor\n label?: boolean\n type: TwoFactorMethod\n}\n\nconst availableMethods: AvailableMethod[] = [\n {\n title: defineMessage({\n id: '2fa.method.app.title',\n defaultMessage: 'Authenticator app',\n }),\n description: defineMessage({\n id: '2fa.method.app.description',\n defaultMessage: 'e.g. Google Authenticator, Duo, Okta, 1Password',\n }),\n label: true,\n type: TwoFactorMethod.AUTHENTICATOR_APP,\n },\n {\n title: defineMessage({\n id: '2fa.method.email.title',\n defaultMessage: 'Email',\n }),\n description: defineMessage({\n id: '2fa.method.email.description',\n defaultMessage: 'Verify with a code sent to your email',\n }),\n label: false,\n type: TwoFactorMethod.EMAIL,\n },\n]\n\ntype Props = {\n onReset: () => void\n onMethodChange: (method: 'APP' | 'EMAIL' | 'METHOD' | 'RESET') => void\n onSelect: (method: TwoFactorMethod) => void\n}\n\nexport const MethodDialog = ({ onReset, onMethodChange, onSelect }: Props) => {\n const { boot, showNewMessage } = useIntercom()\n\n return (\n \n \n \n \n \n\n \n \n \n \n\n
\n\n
\n {availableMethods.map((method) => {\n return (\n \n {\n onSelect(method.type)\n\n switch (method.type) {\n case TwoFactorMethod.AUTHENTICATOR_APP:\n onMethodChange('APP')\n break\n\n case TwoFactorMethod.EMAIL:\n onMethodChange('EMAIL')\n break\n\n default:\n break\n }\n }}\n >\n
\n
\n \n \n \n {method.label && (\n \n \n \n )}\n
\n \n \n \n
\n\n \n \n \n )\n })}\n
\n\n
\n\n \n \n \n \n ),\n chatWithSupport: (\n {\n boot({\n customAttributes: { user_type: 'BUSINESS' },\n })\n showNewMessage()\n }}\n >\n \n \n ),\n }}\n />\n \n \n )\n}\n","import { useCallback, useEffect } from 'react'\nimport { zodResolver } from '@hookform/resolvers/zod'\nimport { motion } from 'framer-motion'\nimport { SubmitHandler, useForm } from 'react-hook-form'\nimport { FormattedMessage } from 'react-intl'\nimport { useIntercom } from 'react-use-intercom'\n\nimport { getImage } from '@/lib/images'\nimport {\n CodeInput,\n CodeInputSchema,\n codeInputSchema,\n} from '@/shared/components'\nimport {\n AnimatedFormLabel,\n Button,\n DialogActions,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n Form,\n FormControl,\n FormField,\n FormItem,\n slideInFromBottomAnimation,\n Typography,\n} from '@/shared/ui'\nimport { TwoFactorMethod } from '@/types/auth'\n\nimport { Auth2FAResponse } from '../../types'\n\ntype Props = {\n isPending: boolean\n onClose: () => void\n onReset: (data: Auth2FAResponse) => void\n}\n\nexport const ResetAppDialog = ({ isPending, onClose, onReset }: Props) => {\n const { boot, showNewMessage } = useIntercom()\n\n const form = useForm({\n mode: 'onChange',\n resolver: zodResolver(codeInputSchema),\n defaultValues: { otp: '' },\n })\n\n const onSubmit: SubmitHandler = useCallback(\n async (data) => {\n onReset({\n otp: data.otp,\n method: TwoFactorMethod.EMAIL,\n })\n },\n [onReset],\n )\n\n useEffect(() => {\n if (isPending) {\n return\n }\n\n const subscription = form.watch(() => form.handleSubmit(onSubmit)())\n\n return () => subscription.unsubscribe()\n }, [form, isPending, onSubmit])\n\n return (\n \n \n \n \n \n \n\n
\n \n \n \n \n \n \n
\n
\n\n
\n\n
\n \n (\n \n \n \n \n \n \n \n \n )}\n />\n\n
\n\n \n \n \n \n \n \n \n \n\n
\n\n \n {\n boot({\n customAttributes: { user_type: 'BUSINESS' },\n })\n showNewMessage()\n }}\n >\n \n \n ),\n }}\n />\n \n \n \n \n )\n}\n","import { useCallback, useEffect, useState } from 'react'\nimport { use2FAResetStorage } from '@/store'\n\nimport { getImage } from '@/lib/images'\nimport { Dialog, DialogContent } from '@/shared/ui'\nimport { TwoFactorMethod } from '@/types/auth'\n\nimport { Auth2FAResponse, Configuration } from '../../types'\n\nimport { AuthenticatorDialog } from './AuthenticatorDialog'\nimport { EmailDialog } from './EmailDialog'\nimport { MethodDialog } from './MethodDialog'\nimport { ResetAppDialog } from './ResetAppDialog'\n\nexport type AuthProps = {\n email?: string\n password?: string\n identityId?: string\n}\n\nexport type DialogScreen = 'APP' | 'EMAIL' | 'METHOD' | 'RESET'\n\ntype Props = {\n email?: string\n password?: string\n error?: Error | null\n configurations?: Configuration[]\n defaultMethod: TwoFactorMethod\n isOpen: boolean\n onContinue: (data: Auth2FAResponse) => void\n onOpenChange: (isOpen: boolean) => void\n onMethodChange: (method: TwoFactorMethod) => void\n isPending: boolean\n}\n\nexport const Auth2FADialog = ({\n error,\n email,\n password,\n configurations = [],\n defaultMethod,\n isOpen,\n isPending,\n onContinue,\n onMethodChange,\n onOpenChange,\n}: Props) => {\n const enable2FAReset = use2FAResetStorage((state) => state.enable2FAReset)\n const disable2FAReset = use2FAResetStorage((state) => state.disable2FAReset)\n\n const [screen, setScreen] = useState()\n\n const getDefaultScreen = useCallback(() => {\n switch (defaultMethod) {\n case TwoFactorMethod.EMAIL:\n return 'EMAIL'\n case TwoFactorMethod.AUTHENTICATOR_APP:\n return 'APP'\n\n default:\n return 'EMAIL'\n }\n }, [defaultMethod])\n\n useEffect(() => {\n const defaultScreen = getDefaultScreen()\n\n setScreen(defaultScreen)\n }, [getDefaultScreen, isOpen])\n\n return (\n <>\n \n \n\n {\n onOpenChange(open)\n\n disable2FAReset()\n }}\n >\n \n {(() => {\n switch (screen) {\n case 'APP':\n return (\n onOpenChange(false)}\n onContinue={onContinue}\n onMethodChange={() => {\n setScreen('METHOD')\n }}\n />\n )\n\n case 'EMAIL':\n return (\n onOpenChange(false)}\n onContinue={onContinue}\n onMethodChange={() => {\n setScreen('METHOD')\n }}\n />\n )\n\n case 'METHOD':\n return (\n {\n onMethodChange(TwoFactorMethod.EMAIL)\n\n enable2FAReset()\n\n setScreen('RESET')\n }}\n />\n )\n\n case 'RESET':\n return (\n {\n disable2FAReset()\n onOpenChange(false)\n }}\n />\n )\n\n default:\n return null\n }\n })()}\n \n \n \n )\n}\n","import { FormattedMessage, useIntl } from 'react-intl'\n\nimport {\n MotionDiv,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Typography,\n} from '@/shared/ui'\n\nimport { PaymentLimitType } from '../types'\n\ntype Props = {\n disabled?: boolean\n value?: string\n onChange: (v: string) => void\n placeholder?: string | React.ReactNode\n}\n\nexport const LimitTypeSelect = ({\n disabled,\n onChange,\n value,\n placeholder,\n}: Props) => {\n const intl = useIntl()\n\n return (\n \n )\n}\n","import { usePermissions } from '../hooks'\nimport { Permission } from '../types'\n\ntype Props = {\n children: React.ReactNode\n permissions: Permission[]\n}\n\nexport const WithPermissions = ({ children, permissions }: Props) => {\n const businessUserPermissions = usePermissions()\n\n const hasPermissions = permissions.some((permission) =>\n businessUserPermissions?.includes(permission),\n )\n\n if (!hasPermissions) {\n return null\n }\n\n return <>{children}\n}\n","import { FormattedMessage } from 'react-intl'\nimport { useLocation, useNavigate } from 'react-router'\n\nimport { BusinessRoute } from '@/constants/paths'\nimport { getFullName } from '@/lib/typography'\nimport { cn } from '@/lib/utils'\nimport { Plus } from '@/shared/icons/outline'\nimport {\n Badge,\n MotionDiv,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Typography,\n} from '@/shared/ui'\n\nimport { TeamMember } from '../features/Team/types'\nimport { BusinessUser, Permission } from '../types'\n\nimport { WithPermissions } from './WithPermissions'\n\ntype Props = {\n businessUser?: BusinessUser\n value: string\n onChange: (v: string) => void\n user?: TeamMember\n users?: TeamMember[]\n label: string\n showLabel?: boolean\n hasError?: boolean\n}\n\nexport const UserSelect = ({\n businessUser,\n user,\n users,\n label,\n onChange,\n value,\n hasError = false,\n showLabel = false,\n}: Props) => {\n const navigate = useNavigate()\n const location = useLocation()\n\n return (\n {\n if (v === 'new-team-member-action') {\n navigate(BusinessRoute.AddTeamMember, {\n state: { from: location },\n })\n return\n }\n\n onChange(v)\n }}\n >\n \n <>\n {user ? (\n \n {showLabel ? (\n \n {label}\n \n ) : null}\n \n \n {getFullName(user)}\n \n \n \n ) : (\n \n )}\n \n \n\n \n \n \n
\n \n \n \n \n
\n \n
\n\n {users?.map((user) => (\n \n \n {getFullName(user)}\n \n {businessUser?.identityId === user.identityId && (\n \n \n \n \n \n )}\n \n ))}\n
\n \n )\n}\n","import { useQueries } from '@tanstack/react-query'\nimport { AxiosResponse } from 'axios'\nimport { UseFormReturn } from 'react-hook-form'\nimport { FormattedMessage, useIntl } from 'react-intl'\n\nimport { queryKeys } from '@/constants/queryKeys'\nimport { getFullName } from '@/lib/typography'\nimport { AmountInput } from '@/shared/components'\nimport {\n AnimatedFormLabel,\n FormControl,\n FormField,\n FormItem,\n Input,\n Skeleton,\n} from '@/shared/ui'\n\nimport { getTeamMembers } from '../features/Team/api'\nimport { TeamMember, TeamState } from '../features/Team/types'\nimport { useBusinessUser } from '../hooks'\nimport { PaymentLimitType, Role } from '../types'\n\nimport { AccountSelect } from './AccountSelect'\nimport { LimitTypeSelect } from './LimitTypeSelect'\nimport { UserSelect } from './UserSelect'\n\ntype Props = {\n isPending?: boolean\n fullName?: string\n form: UseFormReturn<{\n nickname: string\n walletId: string\n requestId: string\n identityId: string\n limitAmount: string\n limitType: PaymentLimitType\n }>\n onSelectCardholder?: (cardholder: string) => void\n}\n\nexport const CardFields = ({\n isPending,\n fullName,\n form,\n onSelectCardholder,\n}: Props) => {\n const intl = useIntl()\n\n const businessUser = useBusinessUser()\n\n // TODO: move to separate component\n const [getTeamMembersQuery] = useQueries({\n queries: [\n {\n queryKey: [queryKeys.getTeamMembers],\n queryFn: () => getTeamMembers(),\n select: (data: AxiosResponse) =>\n data.data\n .filter((member) => member.role !== Role.READ_ONLY)\n .filter((member) =>\n [TeamState.ACTIVE, TeamState.INVITED].includes(member.state),\n ),\n enabled: !fullName,\n },\n ],\n })\n\n return (\n
\n {\n const user = getTeamMembersQuery.data?.find(\n (member) => member.identityId === field.value,\n )\n\n if (getTeamMembersQuery.isFetching || isPending) {\n return \n }\n\n if (fullName) {\n return (\n \n \n\n \n \n \n \n )\n }\n\n return (\n \n {\n const selectedUser = getTeamMembersQuery.data?.find(\n (member) => member.identityId === value,\n )\n\n if (selectedUser) {\n onSelectCardholder?.(getFullName(selectedUser))\n }\n\n field.onChange(value)\n }}\n />\n \n )\n }}\n />\n\n (\n \n \n \n \n \n \n \n \n )}\n />\n\n {\n return (\n \n )\n }}\n />\n\n (\n \n \n \n )}\n />\n\n (\n \n \n \n )}\n />\n
\n )\n}\n","import { Card } from '@/domains/Business/features/Cards/types'\n\nexport function formatLastFour(cardNumber?: string | null, repeat = 3) {\n if (!cardNumber) {\n return ''\n }\n\n return '• '.repeat(repeat) + cardNumber\n}\n\nexport function getCardTitle(card?: Card) {\n return (card?.nickname + ' ' + formatLastFour(card?.lastFourDigits)).trim()\n}\n\nexport function formatCardNumber(cardNumber?: string): string {\n if (!cardNumber) {\n return ''\n }\n\n const cleaned = cardNumber.replace(/\\D/g, '')\n\n const formatted = cleaned.replace(/(.{4})/g, '$1 ')\n\n return formatted.trim()\n}\n","import { Currency } from '@/constants/currency'\nimport { PaymentLimitType } from '@/domains/Business/types'\n\nexport enum CardCategory {\n GROCERIES = 'GROCERIES',\n SHOPPING = 'SHOPPING',\n RESTAURANTS = 'RESTAURANTS',\n TRANSPORT = 'TRANSPORT',\n TRAVEL = 'TRAVEL',\n ENTERTAINMENT = 'ENTERTAINMENT',\n UTILITIES = 'UTILITIES',\n HEALTH = 'HEALTH',\n SERVICES = 'SERVICES',\n FINANCE_AND_INVESTMENTS = 'FINANCE_AND_INVESTMENTS',\n OTHER = 'OTHER',\n}\n\nexport type CardLimit = {\n limitAmount: number\n limitCurrency: Currency\n limitType: PaymentLimitType\n periodResetDate: string\n usedAmount: number\n}\n\nexport enum CardState {\n CREATED = 'CREATED',\n ACTIVE = 'ACTIVE',\n BLOCKED = 'BLOCKED',\n TERMINATED = 'TERMINATED',\n}\n\nexport enum CardType {\n PHYSICAL = 'PHYSICAL',\n VIRTUAL = 'VIRTUAL',\n}\n\nexport type Card = {\n businessId: string\n createdAt: string\n id: string\n identityId: string\n lastFourDigits?: string | null\n nickname: string\n printedUserName: string\n state: CardState\n type: CardType\n validDate?: string | null\n validToMMYY?: string | null\n walletId: string\n cardLimit?: CardLimit\n cardDeliveryDetails?: CardDeliveryDetails\n}\n\nexport type UnmaskedCard = Card & {\n cvv2: string\n cardNumber: string\n}\n\nexport enum CardDeliveryState {\n CREATED = 'CREATED',\n SHIPPED = 'SHIPPED',\n DELIVERED = 'DELIVERED',\n}\n\nexport type CardDeliveryAddress = {\n street: string\n streetNumber: string\n apartment?: string\n references?: string\n neighborhood: string\n city: string\n state: string\n country: string\n postcode: string\n}\n\nexport type CardDeliveryDetails = {\n id: '7e6c7550-301d-4b91-9519-945ad04bf46b'\n state: CardDeliveryState\n address: CardDeliveryAddress\n internationalPhonePrefix?: string\n localPhoneNumber?: string\n createdAt: string\n updatedAt: string\n}\n\nexport type CardDelivery = {\n id: string\n cardId: string\n street: string\n streetNumber: string\n neighborhood: string\n city: string\n country: string\n postcode: string\n state: string\n status: CardDeliveryState\n createdAt: string\n shippedAt?: string\n deliveredAt?: string\n updatedAt: string\n courierCompany: string\n courierTrackingId: string\n courierLocation: string\n courierLocationType: string\n courierType: string\n externalCourierTrackingId: string\n externalCourierTrackingUrl: string\n}\n\nexport type CardScreenType =\n | { type: 'base' }\n | { type: 'info' }\n | { type: 'terms' }\n | { type: 'statements' }\n | { type: 'edit' }\n | { type: 'pin'; pin?: string }\n | { type: 'delivery' }\n","import { formatLastFour } from '@/lib/card'\nimport { getImage } from '@/lib/images'\nimport { cn } from '@/lib/utils'\nimport { Typography } from '@/shared/ui'\n\nimport { Card, CardState } from '../../features/Cards/types'\n\nfunction getCardImageUrl(card: Card) {\n const lowerCaseCardType = card.type.toLowerCase()\n\n switch (card.state) {\n case CardState.BLOCKED:\n return getImage({\n category: 'cards',\n name: `card-${lowerCaseCardType}-frozen`,\n })\n\n default:\n return getImage({\n category: 'cards',\n name: `card-${lowerCaseCardType}`,\n })\n }\n}\n\ntype Props = {\n card: Card\n}\n\nexport const CardCell = ({ card }: Props) => {\n const isTerminated = card.state === CardState.TERMINATED\n\n return (\n
\n \n
\n \n {card.nickname}\n \n \n {formatLastFour(card.lastFourDigits)}\n \n
\n
\n )\n}\n","import { useEffect, useMemo, useRef, useState } from 'react'\nimport { useQuery } from '@tanstack/react-query'\nimport { FormattedMessage } from 'react-intl'\n\nimport { DESKTOP_BREAKPOINT } from '@/constants/breakpoints'\nimport { queryKeys } from '@/constants/queryKeys'\nimport { getFullName } from '@/lib/typography'\nimport { cn } from '@/lib/utils'\nimport { Avatar, Badge, Skeleton, Typography } from '@/shared/ui'\n\nimport { getIdentity } from '../../api'\nimport { Card } from '../../features/Cards/types'\nimport { useBusinessRole, useBusinessUser } from '../../hooks'\nimport { Role } from '../../types'\n\ntype Props = {\n card: Card\n}\n\nconst useContentWidth = (content: string) => {\n const measureRef = useRef(null)\n const [contentWidth, setContentWidth] = useState(null)\n\n useEffect(() => {\n const handleResize = () => {\n if (window.innerWidth >= DESKTOP_BREAKPOINT && measureRef.current) {\n measureRef.current.style.position = 'absolute'\n measureRef.current.style.visibility = 'hidden'\n measureRef.current.style.whiteSpace = 'nowrap'\n const rect = measureRef.current.getBoundingClientRect()\n setContentWidth(rect.width)\n } else {\n setContentWidth(null)\n }\n }\n\n handleResize()\n window.addEventListener('resize', handleResize)\n return () => window.removeEventListener('resize', handleResize)\n }, [content])\n\n return { measureRef, contentWidth }\n}\n\nexport const CardholderCell = ({ card }: Props) => {\n const { role, isPending } = useBusinessRole()\n const businessUser = useBusinessUser()\n const userQuery = useQuery({\n queryKey: [queryKeys.getIdentity],\n queryFn: getIdentity,\n select: (data) => data.data,\n })\n\n const isUser = useMemo(\n () => card.identityId === userQuery.data?.id,\n [card.identityId, userQuery.data?.id],\n )\n\n const cardUserName = card.printedUserName\n .toLowerCase()\n .replace(/\\b\\w/g, (l) => l.toUpperCase())\n\n const fullName = useMemo(() => {\n switch (role) {\n case Role.ADMIN:\n case Role.READ_ONLY:\n return cardUserName\n\n case Role.PAYMENT_OPS:\n case Role.CARD_USER:\n return getFullName(businessUser)\n\n default:\n return ''\n }\n }, [cardUserName, businessUser, role])\n\n const { measureRef, contentWidth } = useContentWidth(fullName)\n\n const CardholderCard = ({\n isMeasurement = false,\n }: {\n isMeasurement?: boolean\n }) => (\n
\n \n \n {fullName}\n \n {isUser && (\n \n \n \n \n \n )}\n
\n )\n\n return (\n
\n {isPending ? (\n \n ) : (\n <>\n \n \n
\n\n
\n \n
\n \n )}\n
\n )\n}\n","import { FormattedMessage } from 'react-intl'\n\nimport { calculateProgress, formatMoney } from '@/lib/money'\nimport { Progress, Typography } from '@/shared/ui'\n\nimport { Card, CardState } from '../../features/Cards/types'\n\ntype Props = {\n card: Card\n}\n\nexport const CardLimitCell = ({ card }: Props) => {\n const progress = calculateProgress({\n value: card.cardLimit?.usedAmount,\n total: card.cardLimit?.limitAmount,\n })\n\n const isTerminated = card.state === CardState.TERMINATED\n\n if (isTerminated) {\n return null\n }\n\n return (\n
\n
\n {formatMoney(card.cardLimit?.usedAmount ?? 0)}\n \n {formatMoney(card.cardLimit?.limitAmount ?? 0)} /{' '}\n \n \n
\n \n
\n )\n}\n","import { FormattedMessage } from 'react-intl'\n\nimport { StatusBadge, StatusVariant } from '@/shared/components'\n\nimport { Card, CardState } from '../../features/Cards/types'\n\nconst badgeVariantByCardState: Record = {\n [CardState.ACTIVE]: 'active',\n [CardState.CREATED]: 'neutral',\n [CardState.BLOCKED]: 'neutral',\n [CardState.TERMINATED]: 'failed',\n}\n\ntype Props = {\n card: Card\n}\n\nexport const CardStateCell = ({ card }: Props) => {\n return (\n
\n \n }\n />\n
\n )\n}\n","import { cn } from '@/lib/utils'\nimport { Skeleton, Typography } from '@/shared/ui'\n\nimport { Card, CardState } from '../../features/Cards/types'\nimport { useWallets } from '../../hooks'\nimport { AccountIcon } from '../AccountIcon'\n\ntype Props = {\n card: Card\n}\n\nexport const CardWalletCell = ({ card }: Props) => {\n const { wallets, isPending } = useWallets({ showAll: true })\n\n const wallet = wallets?.find((wallet) => wallet.id === card.walletId)\n\n const isFailed = card.state === CardState.TERMINATED\n\n return (\n
\n {isPending ? (\n \n ) : (\n <>\n \n \n {wallet?.label}\n \n \n )}\n
\n )\n}\n","import { useMemo } from 'react'\nimport { ColumnDef } from '@tanstack/react-table'\nimport { useIntl } from 'react-intl'\n\nimport { isSmallScreen } from '@/constants/breakpoints'\nimport { useMediaQuery } from '@/hooks/useMediaQuery'\nimport { DataTableColumnHeader } from '@/shared/ui'\n\nimport { Card } from '../../features/Cards/types'\n\nimport { CardCell } from './CardCell'\nimport { CardholderCell } from './CardholderCell'\nimport { CardLimitCell } from './CardLimitCell'\nimport { CardStateCell } from './CardStateCell'\nimport { CardWalletCell } from './CardWalletCell'\n\nexport function useCardsColumns(): ColumnDef[] {\n const isMobile = useMediaQuery(isSmallScreen)\n const intl = useIntl()\n\n const mobileColumns: ColumnDef[] = useMemo(\n () => [\n {\n accessorKey: 'nickname',\n cell: ({ row }) => ,\n header: ({ column }) => (\n \n ),\n },\n {\n accessorKey: 'state',\n cell: ({ row }) => ,\n header: ({ column }) => (\n \n ),\n size: 120,\n },\n ],\n [intl],\n )\n\n const desktopColumns: ColumnDef[] = useMemo(\n () => [\n {\n accessorKey: 'nickname',\n cell: ({ row }) => ,\n header: ({ column }) => (\n \n ),\n },\n {\n accessorKey: 'printedUserName',\n cell: ({ row }) => ,\n header: ({ column }) => (\n \n ),\n size: 180,\n },\n {\n accessorKey: 'state',\n cell: ({ row }) => ,\n header: ({ column }) => (\n \n ),\n size: 100,\n },\n {\n accessorKey: 'walletId',\n cell: ({ row }) => ,\n header: ({ column }) => (\n \n ),\n size: 180,\n },\n {\n accessorKey: 'cardLimit.usedAmount',\n cell: ({ row }) => ,\n header: ({ column }) => (\n \n ),\n size: 250,\n },\n ],\n [intl],\n )\n\n return isMobile ? mobileColumns : desktopColumns\n}\n","import { useMemo } from 'react'\nimport { ColumnDef } from '@tanstack/react-table'\nimport { useIntl } from 'react-intl'\n\nimport { DataTableColumnHeader } from '@/shared/ui'\n\nimport { Card } from '../../features/Cards/types'\n\nimport { CardCell } from './CardCell'\nimport { CardStateCell } from './CardStateCell'\nimport { CardWalletCell } from './CardWalletCell'\n\nexport function useTeamCardsColumns(): ColumnDef[] {\n const intl = useIntl()\n\n const desktopColumns: ColumnDef[] = useMemo(\n () => [\n {\n accessorKey: 'lastFourDigits',\n cell: ({ row }) => ,\n header: ({ column }) => (\n \n ),\n },\n {\n accessorKey: 'walletId',\n cell: ({ row }) => ,\n header: ({ column }) => (\n \n ),\n size: 160,\n },\n\n {\n accessorKey: 'state',\n cell: ({ row }) => ,\n header: ({ column }) => (\n \n ),\n size: 90,\n },\n ],\n [intl],\n )\n\n return desktopColumns\n}\n","import {\n Bag,\n BusFront,\n Cart,\n ChartTrendUp,\n CreditCard,\n LightbulbOn,\n MapMark,\n MedicalKit,\n Receipt,\n Soda,\n Tv,\n} from '@/shared/icons/outline'\nimport { Icon } from '@/types/global'\n\nimport { CardCategory } from '../types'\n\nexport const iconByCardCategory: Record = {\n [CardCategory.GROCERIES]: Cart,\n [CardCategory.SHOPPING]: Bag,\n [CardCategory.RESTAURANTS]: Soda,\n [CardCategory.TRANSPORT]: BusFront,\n [CardCategory.TRAVEL]: MapMark,\n [CardCategory.ENTERTAINMENT]: Tv,\n [CardCategory.UTILITIES]: LightbulbOn,\n [CardCategory.HEALTH]: MedicalKit,\n [CardCategory.SERVICES]: Receipt,\n [CardCategory.FINANCE_AND_INVESTMENTS]: ChartTrendUp,\n [CardCategory.OTHER]: CreditCard,\n}\n","import { defineMessage, MessageDescriptor } from 'react-intl'\n\ntype CardTypeItem = {\n title: MessageDescriptor\n description: MessageDescriptor\n label: boolean\n imageName: string\n type: 'VIRTUAL' | 'PHYSICAL'\n}\n\nexport const cardTypes: CardTypeItem[] = [\n {\n title: defineMessage({\n id: 'cards.create.virtual.title',\n defaultMessage: 'Virtual card',\n }),\n description: defineMessage({\n id: 'cards.create.virtual.description',\n defaultMessage:\n 'Get it instantly for free. Ideal for subscriptions and e-commerce',\n }),\n label: true,\n imageName: 'virtual',\n type: 'VIRTUAL',\n },\n {\n title: defineMessage({\n id: 'cards.create.physical.title',\n defaultMessage: 'Physical card',\n }),\n description: defineMessage({\n id: 'cards.create.physical.desc',\n defaultMessage: 'Pay for corporate expenses at the best FX rates',\n }),\n label: true,\n imageName: 'physical',\n type: 'PHYSICAL',\n },\n]\n","export const googlePlacesFields = [\n 'street',\n 'streetNumber',\n 'neighborhood',\n 'city',\n 'state',\n 'postcode',\n 'country',\n] as string[]\n","export enum PaymentMethod {\n WIRE = 'WIRE',\n ACH = 'ACH',\n}\n\nexport const SPEI = 'SPEI'\nexport const WIRE = 'Wire'\nexport const ACH = 'ACH'\nexport const DOLAR_TAG = 'DolarTag'\n\nexport const ACH_FEE = 3\nexport const WIRE_FEE = 10\nexport const PHYSICAL_CARD_FEE = 5\n","import { PaymentMethod, PaymentRails } from '@/domains/Business/constants'\nimport { CountryCode } from '@/types/country'\n\nexport enum DolarAppEntityType {\n RETAIL = 'RETAIL',\n BUSINESS = 'BUSINESS',\n}\n\ntype BaseRecipient = {\n nickname: string\n bankName: string | null\n addressStreet: string | null\n addressCity: string | null\n addressState: string | null\n addressZipCode: string | null\n addressCountry: string | null\n businessId: string\n createdAt: string\n email: string | null\n entityType: EntityType\n firstName: string | null\n paymentRails: PaymentRails\n id: string\n internationalPhonePrefix: string | null\n lastName: string | null\n legalName: string | null\n localPhoneNumber: string | null\n secondLastName: string | null\n state: 'ACTIVE'\n creationDetails?: {\n requestedBy?: string\n approvedBy?: string\n updatedAt?: string\n }\n}\n\nexport type DolarAppSearchRecipient = {\n owner: { type: DolarAppEntityType; displayName: string }\n alias: { value: string }\n}\n\ntype MXLocalInformation = {\n clabe: string\n}\n\ntype USLocalInformation = {\n accountNumber: string\n routingNumber: string\n paymentMethod: PaymentMethod\n}\n\ntype DolarAppLocalInformation = {\n dolarTag: string\n}\n\ntype MXRecipient = BaseRecipient & {\n country: CountryCode.MX\n paymentRails: PaymentRails.MEX\n localInformation: MXLocalInformation\n}\n\nexport type DolarAppRecipient = BaseRecipient & {\n country: CountryCode.MX\n paymentRails: PaymentRails.DOLAR_APP\n localInformation: DolarAppLocalInformation\n}\n\ntype USRecipient = BaseRecipient & {\n country: CountryCode.US\n paymentRails: PaymentRails.USA\n localInformation: USLocalInformation\n}\n\nexport type Recipient = MXRecipient | USRecipient | DolarAppRecipient\n\nexport enum EntityType {\n BUSINESS = 'BUSINESS',\n INDIVIDUAL = 'INDIVIDUAL',\n}\n\nexport enum ContractorEntityType {\n CONTRACTOR = 'CONTRACTOR',\n}\n\ntype SharedCreateRecipientFields = {\n nickname: string\n contactDetails?: {\n internationalPhonePrefix?: string\n localPhoneNumber?: string\n email?: string\n }\n}\n\ntype IndividualFields = SharedCreateRecipientFields & {\n recipient: {\n type: EntityType.INDIVIDUAL\n address?: Address\n details: { firstName: string; lastName: string; secondLastName?: string }\n }\n}\n\ntype BusinessFields = SharedCreateRecipientFields & {\n nickname: string\n recipient: {\n type: EntityType.BUSINESS\n address?: Address\n details: { legalName: string }\n }\n}\n\ntype PaymentMXInformation = {\n paymentInformation: {\n rails: PaymentRails.MEX\n railsDetails: { clabe: string }\n }\n}\n\ntype PaymentUSInformation = {\n paymentInformation: {\n rails: PaymentRails.USA\n railsDetails: {\n accountNumber: string\n routingNumber: string\n paymentMethod: string\n }\n }\n}\n\ntype Address = {\n street: string\n city: string\n postcode: string\n state: string\n countryCode: string\n}\n\nexport type IndividualMXRecipient = IndividualFields & PaymentMXInformation\nexport type BusinessMXRecipient = BusinessFields & PaymentMXInformation\n\nexport type IndividualUSRecipient = IndividualFields & PaymentUSInformation\nexport type BusinessUSRecipient = BusinessFields & PaymentUSInformation\n\nexport type CreatedDolarAppRecipient = {\n nickname: string\n paymentInformation: {\n rails: PaymentRails.DOLAR_APP\n railsDetails: {\n dolarTag: string\n }\n }\n}\n\nexport type CreatedRecipient =\n | IndividualMXRecipient\n | BusinessMXRecipient\n | IndividualUSRecipient\n | BusinessUSRecipient\n\nexport type CreatedRecipientWithId = Partial & {\n id: string\n}\n\nexport type SharedRecipientFormProps = {\n country: CountryCode\n layout?: 'edit' | 'create'\n isPending?: boolean\n recipientId?: string\n onDelete?: () => void\n}\n","import { Building, Person } from '@/shared/icons/outline'\nimport { Icon } from '@/types/global'\n\nimport { EntityType, Recipient } from '../features/Recipients/types'\n\nexport const iconByRecipientType: Record = {\n [EntityType.BUSINESS]: Building,\n [EntityType.INDIVIDUAL]: Person,\n}\n","export enum PaymentRails {\n MEX = 'MEX',\n USA = 'USA',\n DOLAR_APP = 'DOLAR_APP',\n}\n","import { StatusVariant } from '@/shared/components'\n\nimport {\n BulkTransactionStatus,\n TransactionStatus,\n TransactionType,\n} from '../types'\n\nexport const badgeVariantByTxStatus: Record =\n {\n [TransactionStatus.FAILED]: 'failed',\n [TransactionStatus.REVERTED]: 'failed',\n [TransactionStatus.PENDING]: 'neutral',\n [TransactionStatus.BLOCKED]: 'neutral',\n [TransactionStatus.COMPLETED]: 'active',\n }\n\nexport const badgeVariantByBulkTxStatus: Record<\n BulkTransactionStatus,\n StatusVariant\n> = {\n [BulkTransactionStatus.INCOMPLETE]: 'failed',\n [BulkTransactionStatus.PENDING]: 'neutral',\n [BulkTransactionStatus.COMPLETED]: 'active',\n}\n\nexport const internalTransactionTypes: TransactionType[] = [\n TransactionType.INTERNAL_SWAP_DEPOSIT,\n TransactionType.INTERNAL_SWAP_WITHDRAW,\n]\n\nexport const depositTransactionTypes: TransactionType[] = [\n TransactionType.DEPOSIT,\n TransactionType.INTERNAL_SWAP_DEPOSIT,\n]\n\nexport const failedTransactionStatuses: TransactionStatus[] = [\n TransactionStatus.FAILED,\n TransactionStatus.REVERTED,\n]\n","import { Currency } from '@/constants/currency'\nimport { TYPE_FILTER_NAME } from '@/domains/Business/components'\nimport { DOLAR_TAG, SPEI } from '@/domains/Business/constants'\nimport { handleDateQueryParams } from '@/lib/date'\nimport { parseAdditionalDetails } from '@/lib/utils'\n\nimport { CardCategory } from '../../Cards/types'\nimport { EntityType } from '../../Recipients/types'\nimport { failedTransactionStatuses } from '../constants'\nimport {\n SingleTransaction,\n TransactionSearchParams,\n TransactionType,\n} from '../types'\n\nexport function getTransactionPaymentMethod(\n transaction?: SingleTransaction,\n): string | null {\n const additionalDetails = getTransactionAdditionalDetails(transaction)\n\n if (additionalDetails?.beneficiaryDolarTag) {\n return DOLAR_TAG\n }\n\n const userClabe =\n additionalDetails?.beneficiaryClabe ?? additionalDetails?.payerClabe\n\n const paymentMethod =\n additionalDetails?.beneficiaryPaymentMethod ??\n additionalDetails?.paymentMethod\n\n const MXDefaultPaymentMethod = userClabe ? SPEI : null\n\n return paymentMethod ?? MXDefaultPaymentMethod\n}\n\nexport function handleTransactionQueryParams(\n params: TransactionSearchParams = {},\n) {\n const searchParams = handleDateQueryParams(params)\n\n if (\n params[TYPE_FILTER_NAME]?.includes(TransactionType.INTERNAL_SWAP_DEPOSIT)\n ) {\n const existingStatuses = params[TYPE_FILTER_NAME].split(',')\n\n existingStatuses.push(TransactionType.INTERNAL_SWAP_WITHDRAW)\n\n searchParams.set(TYPE_FILTER_NAME, existingStatuses.join(','))\n }\n\n const searchQuery = searchParams.size > 0 ? '?' + searchParams.toString() : ''\n\n return searchQuery\n}\n\nexport function getTransactionAdditionalDetails(\n transaction?: SingleTransaction,\n) {\n return parseAdditionalDetails<{\n beneficiaryAccountNumber?: string | null\n beneficiaryClabe?: string | null\n beneficiaryDolarTag?: string\n beneficiaryEntityType?: EntityType\n beneficiaryId?: string\n beneficiaryPaymentMethod?: string | null\n beneficiaryRoutingNumber?: string | null\n cardId?: string\n cardLastFourDigits?: string\n cardType?: string\n cashbackEndDate?: string\n cashbackRate?: number\n cashbackStartDate?: string\n claveRastreo?: string\n completedByFullName?: string\n eligibleCardSpendAmount?: number\n eligibleCardSpendCurrency?: Currency\n imad?: string\n merchantCategory?: CardCategory\n merchantLogoUrl?: string\n omad?: string\n payerBankName?: string | null\n payerClabe?: string | null\n payerRoutingNumber?: string | null\n paymentMessage?: string | null\n paymentMethod?: string | null\n taskOwnerFullName?: string\n traceNumber?: string\n withdrawalSource?: 'PAYROLL_BULK_PAYMENT' | null\n }>(transaction?.additionalDetails)\n}\n\nexport function getIsTransactionFailed(transaction?: SingleTransaction) {\n if (!transaction) return false\n\n return failedTransactionStatuses.includes(transaction.transactionStatus)\n}\n","import { cn } from '@/lib/utils'\nimport { CreditCard } from '@/shared/icons/outline'\nimport { AvatarSize } from '@/shared/ui'\n\nimport { iconByCardCategory } from '../features/Cards/constants'\nimport { SingleTransaction } from '../features/Transactions/types'\nimport { getTransactionAdditionalDetails } from '../features/Transactions/utils'\n\ntype Props = {\n transaction?: SingleTransaction\n size?: AvatarSize\n}\n\nexport const CardTransactionIcon = ({ transaction, size }: Props) => {\n const additionalDetails = getTransactionAdditionalDetails(transaction)\n\n const iconProps = {\n className: cn('size-5', {\n 'size-8': size === 'xl',\n }),\n }\n\n if (additionalDetails?.merchantLogoUrl) {\n return (\n \n )\n }\n\n if (additionalDetails?.merchantCategory) {\n const Icon = iconByCardCategory[additionalDetails.merchantCategory]\n\n return \n }\n\n return \n}\n","import { useQuery } from '@tanstack/react-query'\nimport { FormattedMessage, useIntl } from 'react-intl'\n\nimport { queryKeys } from '@/constants/queryKeys'\nimport { getBusinessIdentity } from '@/domains/Business/api'\nimport { getBusinessAddress, getFullAddress } from '@/lib/address'\nimport { Card, Details, Typography } from '@/shared/ui'\n\nimport { AccountType, BankAccount } from '../../features/Accounts/types'\n\ntype Props = {\n details: BankAccount\n}\n\nexport const CountryFields = ({ details }: Props) => {\n const intl = useIntl()\n\n const businessQuery = useQuery({\n queryKey: [queryKeys.getBusinessIdentity],\n queryFn: getBusinessIdentity,\n select: (data) => data.data,\n })\n\n const businessAddress = getBusinessAddress(businessQuery.data, intl)\n\n switch (details.type) {\n case AccountType.WIRE: {\n return null\n }\n\n case AccountType.ACH: {\n return (\n \n
\n \n \n \n {details?.holderDetails ? (\n \n {details.holderDetails.entityName}\n \n ) : (\n \n )}\n
\n\n
\n \n \n \n {details?.accountDetails ? (\n \n {details.accountDetails.bankIdentifier.value}\n \n ) : (\n \n )}\n
\n
\n \n \n \n {details?.accountDetails ? (\n \n {details.accountDetails.accountIdentifier.value}\n \n ) : (\n \n )}\n
\n
\n \n \n \n {details?.holderDetails ? (\n \n {details.holderDetails.bankName}\n \n ) : (\n \n )}\n
\n {businessAddress ? (\n
\n \n \n \n \n {businessAddress}\n \n
\n ) : null}\n {getFullAddress(details.holderDetails.bankAddress, intl) ? (\n
\n \n \n \n\n \n {getFullAddress(details.holderDetails.bankAddress, intl)}\n \n
\n ) : null}\n\n
\n \n \n \n \n \n \n
\n
\n )\n }\n\n case AccountType.LOCAL_MX: {\n return (\n \n
\n \n \n \n {details?.holderDetails ? (\n \n {details.holderDetails.entityName}\n \n ) : (\n \n )}\n
\n
\n \n \n \n {details?.accountDetails ? (\n \n {details.accountDetails.accountIdentifier.value}\n \n ) : (\n \n )}\n
\n
\n \n \n \n {details?.holderDetails ? (\n \n {details.holderDetails.bankName}\n \n ) : (\n \n )}\n
\n\n \n \n \n
\n )\n }\n\n default:\n return null\n }\n}\n","import { useMutation } from '@tanstack/react-query'\nimport { FormattedMessage, useIntl } from 'react-intl'\n\nimport { currencyToCountryFlag } from '@/constants/countries'\nimport { useErrorToast } from '@/hooks/useErrorToast'\nimport { getFlagUrl } from '@/lib/images'\nimport { downloadFile } from '@/lib/utils'\nimport { Download } from '@/shared/icons/outline'\nimport { Button, MotionDiv, Spinner, Typography } from '@/shared/ui'\n\nimport { getAccountPDF } from '../../features/Accounts/api'\nimport { AccountType, BankAccount } from '../../features/Accounts/types'\n\nimport { CountryFields } from './CountryFields'\n\ntype Props = {\n details: BankAccount\n walletId?: string\n}\n\nexport const BankDetails = ({ details, walletId }: Props) => {\n const intl = useIntl()\n const notifyError = useErrorToast()\n\n const { mutateAsync, isPending } = useMutation({\n mutationFn: getAccountPDF,\n })\n\n const getFileName = () => {\n switch (details.type) {\n case AccountType.LOCAL_MX:\n return `MX-SPEI.pdf`\n\n case AccountType.ACH:\n return `US-ACH.pdf`\n\n case AccountType.WIRE:\n return `US-WIRE.pdf`\n\n default:\n return ''\n }\n }\n\n const downloadPDF = async () => {\n if (!walletId) return\n\n const fileName = getFileName()\n\n try {\n const response = await mutateAsync({ type: details.type, id: walletId })\n\n downloadFile(response.data, fileName)\n } catch (error) {\n notifyError(error)\n }\n }\n\n if (details.type === AccountType.WIRE) {\n return null\n }\n\n return (\n \n
\n
\n \n\n \n \n \n
\n\n \n {isPending ? (\n \n ) : (\n \n )}\n \n
\n\n
\n\n \n\n
\n \n )\n}\n","import { Card, Skeleton } from '@/shared/ui'\n\nimport { BankAccount } from '../../features/Accounts/types'\n\nimport { BankDetails } from './BankDetails'\n\ntype Props = {\n accountBanks: BankAccount[]\n walletId?: string\n}\n\nexport const CountryBankDetails = ({ accountBanks, walletId }: Props) => {\n return (\n <>\n {accountBanks.map((details, index) => (\n \n ))}\n \n )\n}\n\nconst CountryDetailsSkeleton = ({ rows = 3 }: { rows?: number }) => {\n return (\n
\n
\n \n
\n\n
\n \n {Array.from({ length: rows }).map((_, index) => (\n
\n \n \n
\n ))}\n\n \n
\n
\n )\n}\n\nCountryBankDetails.Skeleton = CountryDetailsSkeleton\n","import { cn } from '@/lib/utils'\nimport { DolarappWhite } from '@/shared/icons/outline'\n\ntype Props = {\n size?: 'sm' | 'md'\n className?: string\n}\n\nexport const DolarAppAvatar = ({ size = 'sm', className }: Props) => {\n return (\n \n \n
\n )\n}\n","import { FormattedMessage } from 'react-intl'\nimport { Link, useLocation, useParams } from 'react-router'\n\nimport { BusinessRoute } from '@/constants/paths'\nimport { getImage } from '@/lib/images'\nimport { Plus } from '@/shared/icons/outline'\nimport { Button, Card, Typography } from '@/shared/ui'\n\nimport { Permission } from '../types'\n\nimport { WithPermissions } from './WithPermissions'\n\nexport const EmptyTransactionsCard = () => {\n const location = useLocation()\n const params = useParams<{ id: string }>()\n\n const addBalanceUrl = params.id\n ? `${BusinessRoute.AddBalance}?to=${params.id}`\n : BusinessRoute.AddBalance\n\n return (\n \n
\n
\n \n \n \n \n )\n}\n","import { sub } from 'date-fns'\nimport { defineMessages } from 'react-intl'\n\nimport { DefineMessages } from '@/constants/messages'\nimport { formatDate } from '@/lib/date'\n\ntype DateKeys = 'sevenDays' | 'lastMonth' | 'lastThreeMonths' | 'lastSixMonths'\n\nexport const dateMessages: DefineMessages = defineMessages({\n sevenDays: {\n id: 'dateFilter.sevenDays',\n defaultMessage: 'Last 7 days',\n },\n lastMonth: {\n id: 'dateFilter.lastMonth',\n defaultMessage: 'Last month',\n },\n lastThreeMonths: {\n id: 'dateFilter.lastThreeMonths',\n defaultMessage: 'Last 3 months',\n },\n lastSixMonths: {\n id: 'dateFilter.lastSixMonths',\n defaultMessage: 'Last 6 months',\n },\n})\n\nexport const dateFilterOptions: {\n value: {\n fromDate: string\n toDate: string\n }\n key: DateKeys\n}[] = [\n {\n value: {\n fromDate: formatDate(sub(new Date(), { days: 7 }), 'dd/MM/yy'),\n toDate: formatDate(new Date(), 'dd/MM/yy'),\n },\n key: 'sevenDays',\n },\n {\n value: {\n fromDate: formatDate(sub(new Date(), { months: 1 }), 'dd/MM/yy'),\n toDate: formatDate(new Date(), 'dd/MM/yy'),\n },\n key: 'lastMonth',\n },\n {\n value: {\n fromDate: formatDate(sub(new Date(), { months: 3 }), 'dd/MM/yy'),\n toDate: formatDate(new Date(), 'dd/MM/yy'),\n },\n key: 'lastThreeMonths',\n },\n {\n value: {\n fromDate: formatDate(sub(new Date(), { months: 6 }), 'dd/MM/yy'),\n toDate: formatDate(new Date(), 'dd/MM/yy'),\n },\n key: 'lastSixMonths',\n },\n]\n\nexport const ACCOUNTS_FILTER_NAME = 'walletIds'\nexport const TYPE_FILTER_NAME = 'types'\nexport const CURRENCY_FILTER_NAME = 'currencies'\nexport const STATUS_FILTER_NAME = 'states'\nexport const DATE_FROM_FILTER_NAME = 'fromDate'\nexport const DATE_TO_FILTER_NAME = 'toDate'\nexport const START_DATE_FROM_FILTER_NAME = 'startDateFrom'\nexport const START_DATE_TO_FILTER_NAME = 'startDateTo'\nexport const CARDS_ID_FILTER_NAME = 'cardIds'\nexport const SEARCH_FILTER_NAME = 'keyword'\nexport const TEAM_ROLE_FILTER_NAME = 'roles'\nexport const IDENTITY_FILTER_NAME = 'identityIds'\nexport const BUSINESS_USER_ID_FILTER_NAME = 'businessUserIds'\nexport const PAYMENT_TYPES_FILTER_NAME = 'paymentTypes'\nexport const CATEGORY_FILTER_NAME = 'categories'\nexport const PAYMENT_METHOD_TYPES_FILTER_NAME = 'paymentMethodTypes'\n\nexport const ALL_FILTERS = [\n ACCOUNTS_FILTER_NAME,\n TYPE_FILTER_NAME,\n CURRENCY_FILTER_NAME,\n STATUS_FILTER_NAME,\n DATE_FROM_FILTER_NAME,\n DATE_TO_FILTER_NAME,\n TEAM_ROLE_FILTER_NAME,\n IDENTITY_FILTER_NAME,\n PAYMENT_TYPES_FILTER_NAME,\n CATEGORY_FILTER_NAME,\n PAYMENT_METHOD_TYPES_FILTER_NAME,\n START_DATE_FROM_FILTER_NAME,\n START_DATE_TO_FILTER_NAME,\n]\n","import { FormattedMessage } from 'react-intl'\nimport { useSearchParams } from 'react-router'\n\nimport { Bank, Filter } from '@/shared/icons/solid'\nimport {\n Button,\n DropdownMenuCheckboxItem,\n DropdownMenuGroup,\n DropdownMenuPortal,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n Spinner,\n} from '@/shared/ui'\n\nimport { useWallets } from '../../hooks'\n\nimport { ACCOUNTS_FILTER_NAME } from './data'\n\nexport const AccountsFilter = () => {\n const { wallets, isPending } = useWallets({ showAll: true })\n\n const [searchParams, setSearchParams] = useSearchParams()\n\n function handleSearchParams(value: string) {\n setSearchParams(\n (params) => {\n const typeParams = params.get(ACCOUNTS_FILTER_NAME)\n\n if (!typeParams) {\n params.set(ACCOUNTS_FILTER_NAME, value)\n return params\n }\n\n if (typeParams === value) {\n params.delete(ACCOUNTS_FILTER_NAME)\n return params\n }\n\n if (!typeParams.includes(value)) {\n const newType = `${typeParams},${value}`\n params.set(ACCOUNTS_FILTER_NAME, newType)\n return params\n }\n\n const newType = typeParams\n .split(',')\n .filter((type) => type !== value)\n .join(',')\n\n params.set(ACCOUNTS_FILTER_NAME, newType)\n\n return params\n },\n {\n preventScrollReset: true,\n },\n )\n }\n\n return (\n \n \n \n \n \n \n \n \n {searchParams.get(ACCOUNTS_FILTER_NAME) && (\n \n )}\n \n \n \n \n event.preventDefault()}\n checked={searchParams.get(ACCOUNTS_FILTER_NAME) === null}\n onCheckedChange={() =>\n setSearchParams(\n (params) => {\n params.delete(ACCOUNTS_FILTER_NAME)\n return params\n },\n { preventScrollReset: true },\n )\n }\n >\n \n \n {isPending ? (\n
\n \n
\n ) : (\n wallets?.map((wallet) => (\n event.preventDefault()}\n checked={searchParams\n .get(ACCOUNTS_FILTER_NAME)\n ?.includes(wallet.id)}\n onCheckedChange={() => handleSearchParams(wallet.id)}\n >\n {wallet.label}\n \n ))\n )}\n \n
\n
\n
\n )\n}\n","import { FormattedMessage } from 'react-intl'\nimport { useSearchParams } from 'react-router'\n\nimport { Filter } from '@/shared/icons/solid'\nimport { Button, MotionDiv } from '@/shared/ui'\n\nimport { ALL_FILTERS } from './data'\n\ntype Props = {\n children: React.ReactNode\n}\n\nexport const ActiveFilters = ({ children }: Props) => {\n const [searchParams, setSearchParams] = useSearchParams()\n\n const activeFilters = ALL_FILTERS.filter((filter) => searchParams.has(filter))\n\n const hasMultipleFilters = activeFilters.length >= 2\n\n return (\n \n
\n {hasMultipleFilters && (\n }\n onClick={() => {\n setSearchParams(undefined, {\n preventScrollReset: true,\n })\n }}\n >\n \n \n )}\n {children}\n
\n {activeFilters.length > 0 ?
: null}\n \n )\n}\n","import { useMemo } from 'react'\nimport { useQuery } from '@tanstack/react-query'\nimport { FormattedMessage } from 'react-intl'\nimport { useSearchParams } from 'react-router'\n\nimport { queryKeys } from '@/constants/queryKeys'\nimport { useBusinessRole, useBusinessUser } from '@/domains/Business/hooks'\nimport { Permission } from '@/domains/Business/types'\nimport { getFullName } from '@/lib/typography'\nimport { Filter, User } from '@/shared/icons/solid'\nimport {\n Button,\n DropdownMenuCheckboxItem,\n DropdownMenuGroup,\n DropdownMenuPortal,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n Spinner,\n} from '@/shared/ui'\n\nimport { getTeamMembers } from '../../features/Team/api'\nimport { TeamState } from '../../features/Team/types'\n\nimport { IDENTITY_FILTER_NAME } from './data'\n\nexport const CardholderFilter = () => {\n const { isAdmin } = useBusinessRole()\n const businessUser = useBusinessUser()\n\n const teamMembersQuery = useQuery({\n queryKey: [queryKeys.getTeamMembers],\n queryFn: () => getTeamMembers(),\n select: (data) =>\n data?.data.filter(\n (member) =>\n member.permissions.includes(Permission.CARDS_ACCESS) &&\n member.state !== TeamState.TERMINATED,\n ),\n enabled: isAdmin,\n })\n\n const [searchParams, setSearchParams] = useSearchParams()\n\n const members = useMemo(() => {\n if (teamMembersQuery.data) {\n return teamMembersQuery.data\n }\n\n if (businessUser) {\n return [businessUser]\n }\n\n return []\n }, [teamMembersQuery.data, businessUser])\n\n function handleSearchParams(value: string) {\n setSearchParams(\n (params) => {\n const typeParams = params.get(IDENTITY_FILTER_NAME)\n\n if (!typeParams) {\n params.set(IDENTITY_FILTER_NAME, value)\n return params\n }\n\n if (typeParams === value) {\n params.delete(IDENTITY_FILTER_NAME)\n return params\n }\n\n if (!typeParams.includes(value)) {\n const newType = `${typeParams},${value}`\n params.set(IDENTITY_FILTER_NAME, newType)\n return params\n }\n\n const newType = typeParams\n .split(',')\n .filter((type) => type !== value)\n .join(',')\n\n params.set(IDENTITY_FILTER_NAME, newType)\n\n return params\n },\n {\n preventScrollReset: true,\n },\n )\n }\n\n return (\n \n \n \n \n \n \n \n \n {searchParams.get(IDENTITY_FILTER_NAME) && (\n \n )}\n \n \n \n \n event.preventDefault()}\n checked={searchParams.get(IDENTITY_FILTER_NAME) === null}\n onCheckedChange={() =>\n setSearchParams(\n (params) => {\n params.delete(IDENTITY_FILTER_NAME)\n return params\n },\n { preventScrollReset: true },\n )\n }\n >\n \n \n {teamMembersQuery.isFetching ? (\n
\n \n
\n ) : (\n members?.map((member) => (\n event.preventDefault()}\n checked={searchParams\n .get(IDENTITY_FILTER_NAME)\n ?.includes(member.identityId)}\n onCheckedChange={() => handleSearchParams(member.identityId)}\n >\n {getFullName(member)}\n \n ))\n )}\n \n
\n
\n
\n )\n}\n","import { useCallback } from 'react'\nimport { FormattedMessage } from 'react-intl'\nimport { useSearchParams } from 'react-router'\n\nimport { handleURLSearchParams } from '@/lib/utils'\nimport { Check } from '@/shared/icons/outline'\nimport { Filter } from '@/shared/icons/solid'\nimport {\n Button,\n DropdownMenuCheckboxItem,\n DropdownMenuGroup,\n DropdownMenuPortal,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n} from '@/shared/ui'\n\nimport { CardState } from '../../features/Cards/types'\n\nimport { STATUS_FILTER_NAME } from './data'\n\nexport const CardStateFilter = () => {\n const [searchParams, setSearchParams] = useSearchParams()\n\n const handleSearchParams = useCallback(\n (value: string) => {\n return (\n setSearchParams((params) =>\n handleURLSearchParams(params, STATUS_FILTER_NAME, value),\n ),\n { preventScrollReset: true }\n )\n },\n [setSearchParams],\n )\n\n return (\n \n \n \n \n \n \n \n \n {searchParams.get(STATUS_FILTER_NAME) && (\n \n )}\n \n \n \n \n {Object.values(CardState).map((state) => (\n event.preventDefault()}\n checked={searchParams.get(STATUS_FILTER_NAME)?.includes(state)}\n onCheckedChange={() => handleSearchParams(state)}\n >\n \n \n ))}\n \n \n \n \n )\n}\n","import { Currency } from '@/constants/currency'\nimport { CountryCode } from '@/types/country'\n\nexport enum ContractorAgreementType {\n STANDARD = 'STANDARD',\n CUSTOM = 'CUSTOM',\n}\n\nexport enum ContractorPaymentType {\n FIXED_RATE = 'FIXED_RATE',\n PAY_AS_YOU_GO = 'PAY_AS_YOU_GO',\n}\n\nexport enum ContractorState {\n WAITING_FOR_CONTRACTOR = 'WAITING_FOR_CONTRACTOR',\n ACTION_NEEDED = 'ACTION_NEEDED',\n ACTIVE = 'ACTIVE',\n}\n\nexport enum ContractState {\n ACTION_NEEDED = 'ACTION_NEEDED',\n WAITING_FOR_CONTRACTOR = 'WAITING_FOR_CONTRACTOR',\n ACTIVE = 'ACTIVE',\n PAUSED = 'PAUSED',\n TERMINATED = 'TERMINATED',\n TERMINATION_PENDING = 'TERMINATION_PENDING',\n}\n\nexport enum ContractorPaymentMethodState {\n LINKED = 'LINKED',\n NOT_LINKED = 'NOT_LINKED',\n INACTIVE = 'INACTIVE',\n}\n\nexport type Contractor = {\n id: string\n firstName: string\n lastName: string\n secondLastName?: string\n email: string\n contractorRole: string\n countryOfCitizenship: null | string\n paymentType: ContractorPaymentType\n startDate: string\n lastPaymentDate: null | string\n state: ContractorState\n}\n\nexport enum ContractPaymentDayType {\n LAST_BUSINESS_DAY_OF_PERIOD = 'LAST_BUSINESS_DAY_OF_PERIOD',\n LAST_FRIDAY_OF_PERIOD = 'LAST_FRIDAY_OF_PERIOD',\n CUSTOM_DAY_OF_MONTH = 'CUSTOM_DAY_OF_MONTH',\n CUSTOM_DAY_OF_WEEK = 'CUSTOM_DAY_OF_WEEK',\n}\n\nexport enum ContractorFirstCycleMethod {\n FULL_AMOUNT = 'FULL_AMOUNT',\n CUSTOM_AMOUNT = 'CUSTOM_AMOUNT',\n NO_PAYMENT = 'NO_PAYMENT',\n PRO_RATA = 'PRO_RATA',\n}\n\nexport enum ContractorPaymentFrequency {\n WEEKLY = 'WEEKLY',\n BIWEEKLY = 'BIWEEKLY',\n SEMIMONTHLY = 'SEMIMONTHLY',\n MONTHLY = 'MONTHLY',\n}\n\nexport enum ContractorPaymentMethodType {\n DOLAR_TAG = 'DOLAR_TAG',\n US_BANK_ACCOUNT = 'US_BANK_ACCOUNT',\n MX_BANK_ACCOUNT = 'MX_BANK_ACCOUNT',\n}\n\nexport type DolarTagDetails = {\n id: string\n type: ContractorPaymentMethodType.DOLAR_TAG\n paymentMethodInformation: {\n dolarTag: string\n }\n}\n\nexport type USBankAccountDetails = {\n id: string\n type: ContractorPaymentMethodType.US_BANK_ACCOUNT\n paymentMethodInformation: {\n accountNumber: string\n routingNumber: string\n address: {\n addressStreetNumber: string\n addressStreet: string\n addressDistrict?: string\n addressCity: string\n addressState: string\n addressPostCode: string\n addressCountry: CountryCode\n }\n }\n}\n\nexport type MXBankAccountDetails = {\n id: string\n type: ContractorPaymentMethodType.MX_BANK_ACCOUNT\n paymentMethodInformation: { clabe: string }\n}\n\nexport type ContractorPaymentMethodDetails =\n | DolarTagDetails\n | USBankAccountDetails\n | MXBankAccountDetails\n\nexport type ContractorPaymentInformation = {\n currency: Currency\n amount: number\n frequency: ContractorPaymentFrequency\n dayType: ContractPaymentDayType\n day?: number\n firstCycleMethod: ContractorFirstCycleMethod\n firstCycleAmount?: number\n}\n\nexport type Contract = {\n id: string\n state: ContractState\n paymentType: ContractorPaymentType\n agreementType: ContractorAgreementType\n contractorRole: string\n scopeOfWork: string\n startDate: string\n endDate: null | string\n createdByBusinessUserId: string\n paymentDetails?: ContractorPaymentInformation\n}\n\nexport type ContractorDetails = {\n identityId: string\n id: string\n state: ContractorState\n taxDetails: {\n countryOfTaxResidence?: string\n taxId?: string\n taxIdType?: string\n taxForm?: string\n }\n paymentMethod: {\n linkedOn?: string\n state: ContractorPaymentMethodState\n paymentMethodDetails?: ContractorPaymentMethodDetails\n }\n personalDetails: {\n firstName: string\n lastName: string\n secondLastName?: string\n email: string\n internationalPhonePrefix: string\n localPhoneNumber: string\n dateOfBirth?: string\n countryOfCitizenship?: string\n residentialAddress?: {\n addressStreetNumber: string\n addressStreet: string\n addressDistrict: string\n addressCity: string\n addressState: string\n addressPostCode: string\n addressCountry: string\n }\n }\n contracts: Contract[]\n}\n\nexport type ContractDocument = {\n id: string\n fileName: string\n uploadedOn: string\n}\n\nexport type ContractorPayment = {\n id: string\n businessId: string\n state: 'CREATED'\n paymentCycleStart: string\n paymentCycleEnd: string\n paymentDueDate: string\n paymentFrequency: ContractorPaymentFrequency\n paymentDayType: ContractPaymentDayType\n paymentDay?: number | null\n numberOfPayments: number\n}\n\nexport type ContractorPaymentCyclePayment = {\n contractId: string\n contractorId: string\n personalDetails: {\n firstName: string\n lastName: string\n secondLastName?: string\n }\n paymentMethodType: ContractorPaymentMethodType\n paymentAmount?: { amount: string; currency: Currency } | null\n}\n\nexport type ContractorPaymentCycleDetails = {\n id: string\n businessId: string\n paymentCycleStart: string\n paymentCycleEnd: string\n paymentFrequency: ContractorPaymentFrequency\n paymentDayType: ContractPaymentDayType\n paymentDay: number | null\n fixedRatePayments: ContractorPaymentCyclePayment[]\n payAsYouGoPayments: ContractorPaymentCyclePayment[]\n}\n\nexport type ContractorOffCycleDetails = {\n fixedRatePayments: ContractorPaymentCyclePayment[]\n payAsYouGoPayments: ContractorPaymentCyclePayment[]\n}\n\nexport enum HistoricalPaymentState {\n FAILED_TO_EXECUTE = 'FAILED_TO_EXECUTE',\n CREATED = 'CREATED',\n EXECUTING = 'EXECUTING',\n COMPLETED = 'COMPLETED',\n IN_PROGRESS = 'IN_PROGRESS',\n INCOMPLETE = 'INCOMPLETE',\n}\n\nexport enum HistoricalPaymentType {\n OFF_CYCLE = 'OFF_CYCLE',\n PAYMENT_CYCLE = 'PAYMENT_CYCLE',\n}\n\ntype SharedHistoricalPayment = {\n id: string\n bulkPaymentId: string | null\n failReason?: 'NOT_ENOUGH_BALANCE'\n state: HistoricalPaymentState\n paymentCategory: OffCyclePaymentCategory\n paidOn: string\n numberOfPayments: number\n totalAmount: {\n amount: number\n currency: Currency\n }\n}\n\nexport type PaymentCycleHistoricalPayment = SharedHistoricalPayment & {\n type: HistoricalPaymentType.PAYMENT_CYCLE\n paymentDetails: {\n paymentCycleStart: string\n paymentCycleEnd: string\n paymentFrequency: ContractorPaymentFrequency\n paymentDayType: ContractPaymentDayType\n paymentDay?: number\n }\n}\n\nexport type OffCycleHistoricalPayment = SharedHistoricalPayment & {\n type: HistoricalPaymentType.OFF_CYCLE\n paymentDetails: {\n paymentLabel?: string\n }\n}\n\nexport type HistoricalPayment =\n | PaymentCycleHistoricalPayment\n | OffCycleHistoricalPayment\n\nexport type HistoricalPaymentDetails = HistoricalPayment & {\n walletId: string\n}\n\nexport type RunPaymentContractor = {\n contractorId: string\n contractId: string\n amount: { amount: string; currency: Currency }\n}\n\nexport type DisplayableRunPaymentContractor = {\n fullName: string\n amount: { amount: string; currency: Currency }\n paymentMethodType?: ContractorPaymentMethodType\n}\n\nexport enum OffCyclePaymentCategory {\n BONUS = 'BONUS',\n COMMISSION = 'COMMISSION',\n REIMBURSEMENT = 'REIMBURSEMENT',\n EXTRA_HOURS = 'EXTRA_HOURS',\n ADJUSTMENT = 'ADJUSTMENT',\n SETTLEMENT = 'SETTLEMENT',\n}\n\nexport enum ContractorTransactionState {\n EXECUTING = 'EXECUTING',\n IN_PROGRESS = 'IN_PROGRESS',\n FAILED = 'FAILED',\n PENDING = 'PENDING',\n COMPLETED = 'COMPLETED',\n}\n\ntype SharedContractorTransaction = {\n state: ContractorTransactionState\n paymentMethodId: string\n paymentMethodType: ContractorPaymentMethodType\n paymentCategory: OffCyclePaymentCategory\n amount: { amount: number; currency: Currency }\n paymentDate: string\n transactionId: string | null\n payrollPaymentId: string | null\n}\n\ntype PaymentCycleContractorTransaction = SharedContractorTransaction & {\n type: HistoricalPaymentType.PAYMENT_CYCLE\n paymentDetails: {\n paymentCycleStart: string\n paymentCycleEnd: string\n paymentFrequency: ContractorPaymentFrequency\n paymentDayType: ContractPaymentDayType\n paymentDay?: number\n dolarTag?: string\n }\n}\n\ntype OffCycleContractorTransaction = SharedContractorTransaction & {\n type: HistoricalPaymentType.OFF_CYCLE\n paymentDetails: {\n paymentLabel?: string\n dolarTag?: string\n }\n}\n\nexport type ContractorsTransaction =\n | PaymentCycleContractorTransaction\n | OffCycleContractorTransaction\n","import { useCallback } from 'react'\nimport { FormattedMessage } from 'react-intl'\nimport { useSearchParams } from 'react-router'\n\nimport { handleURLSearchParams } from '@/lib/utils'\nimport { Document } from '@/shared/icons/outline'\nimport { Filter } from '@/shared/icons/solid'\nimport {\n Button,\n DropdownMenuCheckboxItem,\n DropdownMenuGroup,\n DropdownMenuPortal,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n} from '@/shared/ui'\n\nimport { ContractorPaymentType } from '../../features/Contractors/types'\n\nimport { PAYMENT_TYPES_FILTER_NAME } from './data'\n\nexport const ContractTypeFilter = () => {\n const [searchParams, setSearchParams] = useSearchParams()\n\n const handleSearchParams = useCallback(\n (value: string) => {\n return (\n setSearchParams((params) =>\n handleURLSearchParams(params, PAYMENT_TYPES_FILTER_NAME, value),\n ),\n { preventScrollReset: true }\n )\n },\n [setSearchParams],\n )\n\n return (\n \n \n \n \n \n \n \n \n {searchParams.get(PAYMENT_TYPES_FILTER_NAME) && (\n \n )}\n \n \n \n \n {Object.values(ContractorPaymentType).map((state) => (\n event.preventDefault()}\n checked={searchParams\n .get(PAYMENT_TYPES_FILTER_NAME)\n ?.includes(state)}\n onCheckedChange={() => handleSearchParams(state)}\n >\n \n \n ))}\n \n \n \n \n )\n}\n","import { api } from '@/lib/api'\n\nimport { BulkTransaction } from '../types'\n\nexport function getBulkTransaction({ id }: { id: string }) {\n return api.get(`/v2/me/transactions/group/${id}`)\n}\n","import { api } from '@/lib/api'\n\nimport { CashbackTransaction, TransactionSearchParams } from '../types'\nimport { handleTransactionQueryParams } from '../utils'\n\nexport function getCashbackTransactions({\n id,\n params = {},\n}: {\n id: string\n params?: TransactionSearchParams\n}) {\n const searchQuery = handleTransactionQueryParams(params)\n\n return api.get(\n `v1/me/cashbacks/transaction/${id}${searchQuery}`,\n )\n}\n","import { api } from '@/lib/api'\n\nimport { SingleTransaction } from '../types'\n\nexport function getTransaction({ id }: { id: string }) {\n return api.get(`/v2/me/transactions/${id}`)\n}\n","import { DisplayableType } from '../types'\n\nimport { getBulkTransaction } from './getBulkTransaction'\nimport { getTransaction } from './getTransaction'\n\ntype Params = {\n type?: DisplayableType | null\n id?: string | null\n}\n\nexport function getTransactionByType({ type, id }: Params) {\n if (!id) {\n throw new Error('Transactions: missing id from search query')\n }\n\n switch (type) {\n case DisplayableType.SINGLE:\n return getTransaction({ id })\n\n case DisplayableType.BULK:\n return getBulkTransaction({ id })\n\n default:\n console.error('Transactions: Incorrect or missing search query', type)\n return getTransaction({ id })\n }\n}\n","import { api } from '@/lib/api'\n\nimport { Transaction, TransactionSearchParams } from '../types'\nimport { handleTransactionQueryParams } from '../utils'\n\nexport function getTransactions(params: TransactionSearchParams = {}) {\n const searchQuery = handleTransactionQueryParams(params)\n\n return api.get(`/v3/me/transactions/search${searchQuery}`)\n}\n","import { api } from '@/lib/api'\n\nimport { TransactionSearchParams } from '../types'\nimport { handleTransactionQueryParams } from '../utils'\n\nexport function getTransactionsCSV(params: TransactionSearchParams) {\n const searchQuery = handleTransactionQueryParams(params)\n\n return api.get(`/v1/transaction-statements${searchQuery}`, {\n responseType: 'blob',\n })\n}\n","import { Currency } from '@/constants/currency'\nimport { api } from '@/lib/api'\n\nexport function getTransactionCurrencies() {\n return api.get(`/v1/me/transaction-currencies`)\n}\n","import { Currency } from '@/constants/currency'\n\nimport {\n BulkTransaction,\n BulkTransactionStatus,\n DisplayableType,\n SingleTransaction,\n Transaction,\n TransactionStatus,\n TransactionType,\n} from '../../types'\n\nexport const SEND_TRANSACTION: SingleTransaction = {\n displayableType: DisplayableType.SINGLE,\n id: 'cc205b8e-6d99-4926-8d35-30d658fa34ce',\n walletId: '0ceaf1d2-20b6-4de0-8e74-ad514f0df81c',\n accountId: '64eb0105-8484-4f38-ba20-91c27159ee2c',\n transactionType: TransactionType.WITHDRAW,\n transactionStatus: TransactionStatus.COMPLETED,\n description: '',\n name: 'Test account 1',\n provider: 'SYNAPSE',\n baseAmount: -1000,\n baseCurrency: Currency.USDC,\n localAmount: -1000,\n localCurrency: Currency.USD,\n feeAmount: 0,\n feeCurrency: Currency.USDC,\n fxRate: 1,\n visible: true,\n additionalDetails:\n '{\"transferType\":\"INTERNAL\",\"beneficiaryId\":\"aa8be62e-b6e3-4d61-9c52-9118871db8b1\",\"deviceIp\":\"193.42.98.98\",\"beneficiaryAccountNumber\":\"9817123411\",\"beneficiaryRoutingNumber\":\"084106768\",\"beneficiaryPaymentMethod\":\"WIRE\"}',\n createdOn: '2024-02-23T12:17:30.494684',\n updatedOn: '2024-02-23T12:20:00.373863',\n}\n\nexport const MOCKED_TRANSACTIONS: Transaction[] = [\n {\n displayableType: DisplayableType.BULK,\n groupId: 'f530af46-ef8e-4eeb-8c19-fd3f08459381',\n walletId: 'f2c1bb53-4d86-4cb7-aa48-8438b3ed489d',\n accountId: '64eb0105-8484-4f38-ba20-91c27159ee2c',\n createdOn: '2024-03-20T15:20:28.981802',\n bulkTransactionStatus: BulkTransactionStatus.INCOMPLETE,\n bulkTransactionLabel: 'Contractors Marzo',\n totalBaseAmount: -788.3054519438,\n totalBaseCurrency: Currency.USDC,\n totalFeeAmount: 0,\n totalFeeCurrency: Currency.USDC,\n localCurrencies: [Currency.MXN, Currency.USD],\n transactions: [\n {\n displayableType: DisplayableType.SINGLE,\n id: '5ed4a18a-63c2-43d5-85f9-74459ce4845e',\n walletId: 'f2c1bb53-4d86-4cb7-aa48-8438b3ed489d',\n accountId: '64eb0105-8484-4f38-ba20-91c27159ee2c',\n transactionType: TransactionType.WITHDRAW,\n transactionStatus: TransactionStatus.COMPLETED,\n description: 'SERVICIOS ABRIL',\n name: 'Alala',\n baseAmount: -238.4927259719,\n baseCurrency: Currency.USDC,\n localAmount: -4000,\n localCurrency: Currency.MXN,\n feeAmount: 0,\n feeCurrency: Currency.USDC,\n fxRate: 16.772,\n provider: 'ARCUS',\n providerRef: '6893c26d-361e-42b5-8e03-fb594794674f',\n postTransactionBalance: 4954.2095181161,\n groupId: 'f530af46-ef8e-4eeb-8c19-fd3f08459381',\n additionalDetails:\n '{\"transferType\":\"EXTERNAL\",\"beneficiaryId\":\"53a70110-cc08-43fb-8200-cb10c1346de3\",\"deviceIp\":\"190.193.35.151\",\"beneficiaryClabe\":\"002010077777777771\",\"transferLabel\":\"Contractors Marzo\",\"claveRastreo\":\"202403209070671E2KNZJ3T8YQMPQ\"}',\n completedAt: '2024-03-20T20:00:02.079667',\n createdOn: '2024-03-20T15:20:31.153476',\n updatedOn: '2024-03-20T20:00:02.079667',\n },\n {\n displayableType: DisplayableType.SINGLE,\n id: '9776164f-0ec6-4a1d-bb67-0537270c398f',\n walletId: 'f2c1bb53-4d86-4cb7-aa48-8438b3ed489d',\n accountId: '64eb0105-8484-4f38-ba20-91c27159ee2c',\n transactionType: TransactionType.WITHDRAW,\n transactionStatus: TransactionStatus.COMPLETED,\n description: 'SERVICIOS ABRIL',\n name: 'Consultorias SA de CV',\n baseAmount: -238.4927259719,\n baseCurrency: Currency.USDC,\n localAmount: -4000,\n localCurrency: Currency.MXN,\n feeAmount: 0,\n feeCurrency: Currency.USDC,\n fxRate: 16.772,\n provider: 'ARCUS',\n providerRef: 'e6dfecb4-1177-4720-a7dc-8bce6787b147',\n postTransactionBalance: 4954.2095181161,\n groupId: 'f530af46-ef8e-4eeb-8c19-fd3f08459381',\n additionalDetails:\n '{\"transferType\":\"EXTERNAL\",\"beneficiaryId\":\"8576559f-c58e-464b-b9af-caa2f50f7bfc\",\"deviceIp\":\"190.193.35.151\",\"beneficiaryClabe\":\"002010077777777771\",\"transferLabel\":\"Contractors Marzo\",\"claveRastreo\":\"2024032090706H113AVQXQ9S48ARZ\"}',\n completedAt: '2024-03-20T20:00:01.294679',\n createdOn: '2024-03-20T15:20:30.70494',\n updatedOn: '2024-03-20T20:00:01.294679',\n },\n ],\n failedTransactions: [\n {\n displayableType: DisplayableType.SINGLE,\n id: '95bde314-39af-412c-b8ae-d4a5183545ee',\n walletId: 'f2c1bb53-4d86-4cb7-aa48-8438b3ed489d',\n accountId: '64eb0105-8484-4f38-ba20-91c27159ee2c',\n transactionType: TransactionType.WITHDRAW,\n transactionStatus: TransactionStatus.FAILED,\n description: '',\n name: 'Sebastien Fernandez',\n baseAmount: -119.2642499404,\n baseCurrency: Currency.USDC,\n localAmount: -2000.3,\n localCurrency: Currency.MXN,\n feeAmount: 0,\n feeCurrency: Currency.USDC,\n fxRate: 16.772,\n provider: 'ARCUS',\n providerRef: '1369e568-c964-43f7-8085-2f71104bd4a1',\n postTransactionBalance: null,\n groupId: 'f530af46-ef8e-4eeb-8c19-fd3f08459381',\n additionalDetails:\n '{\"transferType\":\"EXTERNAL\",\"beneficiaryId\":\"39a967f1-782a-4582-ab2e-e2287e96c7b8\",\"deviceIp\":\"190.193.35.151\",\"beneficiaryClabe\":\"032180000118359719\",\"transferLabel\":\"Contractors Marzo\",\"failReason\":\"INVALID_ACCOUNT\"}',\n completedAt: null,\n createdOn: '2024-03-20T15:20:28.981802',\n updatedOn: '2024-03-20T15:22:00.581617',\n },\n ],\n },\n {\n displayableType: DisplayableType.SINGLE,\n id: 'cc205b8e-6d99-4926-8d35-30d658fa34ce',\n walletId: '0ceaf1d2-20b6-4de0-8e74-ad514f0df81c',\n accountId: '64eb0105-8484-4f38-ba20-91c27159ee2c',\n transactionType: TransactionType.WITHDRAW,\n transactionStatus: TransactionStatus.COMPLETED,\n description: '',\n name: 'Test account 1',\n provider: 'SYNAPSE',\n baseAmount: -1000,\n baseCurrency: Currency.USDC,\n localAmount: -1000,\n localCurrency: Currency.USD,\n feeAmount: 0,\n feeCurrency: Currency.USDC,\n fxRate: 1,\n visible: true,\n additionalDetails:\n '{\"transferType\":\"INTERNAL\",\"beneficiaryId\":\"aa8be62e-b6e3-4d61-9c52-9118871db8b1\",\"deviceIp\":\"193.42.98.98\",\"beneficiaryAccountNumber\":\"9817123411\",\"beneficiaryRoutingNumber\":\"084106768\",\"beneficiaryPaymentMethod\":\"WIRE\"}',\n createdOn: '2024-02-23T12:17:30.494684',\n updatedOn: '2024-02-23T12:20:00.373863',\n },\n {\n displayableType: DisplayableType.SINGLE,\n id: 'f9e69d85-f8c8-4da9-8aed-d73f82922244',\n walletId: '0ceaf1d2-20b6-4de0-8e74-ad514f0df81c',\n accountId: '64eb0105-8484-4f38-ba20-91c27159ee2c',\n transactionType: TransactionType.WITHDRAW,\n transactionStatus: TransactionStatus.COMPLETED,\n description: '',\n name: 'Test account 2',\n provider: 'SYNAPSE',\n baseAmount: -696.96,\n baseCurrency: Currency.USDC,\n localAmount: -696.96,\n localCurrency: Currency.USD,\n feeAmount: 0,\n feeCurrency: Currency.USDC,\n fxRate: 1,\n visible: true,\n additionalDetails:\n '{\"transferType\":\"INTERNAL\",\"beneficiaryId\":\"fb061a90-cf5c-4beb-a709-137acd6778eb\",\"deviceIp\":\"80.82.25.50\",\"beneficiaryAccountNumber\":\"9817123411\",\"beneficiaryRoutingNumber\":\"084106768\",\"beneficiaryPaymentMethod\":\"ACH\"}',\n createdOn: '2024-02-22T12:31:21.291232',\n updatedOn: '2024-02-22T12:34:00.222448',\n },\n {\n displayableType: DisplayableType.SINGLE,\n id: '05add299-7ed0-4eda-9ac1-a7f81766811d',\n walletId: '0ceaf1d2-20b6-4de0-8e74-ad514f0df81c',\n accountId: '64eb0105-8484-4f38-ba20-91c27159ee2c',\n transactionType: TransactionType.WITHDRAW,\n transactionStatus: TransactionStatus.FAILED,\n description: '',\n name: 'Test account 3',\n provider: 'ARCUS',\n baseAmount: -12,\n baseCurrency: Currency.USDC,\n localAmount: -204.276,\n localCurrency: Currency.MXN,\n feeAmount: 0,\n feeCurrency: Currency.USDC,\n fxRate: 17.023,\n visible: true,\n additionalDetails:\n '{\"transferType\":\"EXTERNAL\",\"beneficiaryId\":\"f73ba286-955f-4908-83f1-758f481c27da\",\"deviceIp\":\"80.82.25.50\",\"beneficiaryClabe\":\"706180132010134087\",\"claveRastreo\":\"\",\"failReason\":\"Destination Account is not available\"}',\n createdOn: '2024-02-22T12:22:05.896923',\n updatedOn: '2024-02-22T12:25:02.817752',\n },\n {\n displayableType: DisplayableType.SINGLE,\n id: 'eac46a2b-f479-48c6-8173-e948782a0771',\n walletId: '0ceaf1d2-20b6-4de0-8e74-ad514f0df81c',\n accountId: '64eb0105-8484-4f38-ba20-91c27159ee2c',\n transactionType: TransactionType.WITHDRAW,\n transactionStatus: TransactionStatus.COMPLETED,\n description: 'mooooore',\n name: 'Test account 4',\n provider: 'SYNAPSE',\n baseAmount: -1000,\n baseCurrency: Currency.USDC,\n localAmount: -1000,\n localCurrency: Currency.USD,\n feeAmount: 0,\n feeCurrency: Currency.USDC,\n fxRate: 1,\n visible: true,\n additionalDetails:\n '{\"transferType\":\"INTERNAL\",\"beneficiaryId\":\"aa8be62e-b6e3-4d61-9c52-9118871db8b1\",\"deviceIp\":\"91.236.87.136\",\"beneficiaryAccountNumber\":\"9817123411\",\"beneficiaryRoutingNumber\":\"084106768\",\"beneficiaryPaymentMethod\":\"WIRE\"}',\n createdOn: '2024-02-21T18:04:18.403816',\n updatedOn: '2024-02-21T18:07:00.358798',\n },\n {\n displayableType: DisplayableType.SINGLE,\n id: 'b51e88cc-a9d7-4e0b-83c5-e6ab92c0e20a',\n walletId: '0ceaf1d2-20b6-4de0-8e74-ad514f0df81c',\n accountId: '64eb0105-8484-4f38-ba20-91c27159ee2c',\n transactionType: TransactionType.WITHDRAW,\n transactionStatus: TransactionStatus.COMPLETED,\n description: 'moooore',\n name: 'Test account 5',\n provider: 'SYNAPSE',\n baseAmount: -100,\n baseCurrency: Currency.USDC,\n localAmount: -100,\n localCurrency: Currency.USD,\n feeAmount: 0,\n feeCurrency: Currency.USDC,\n fxRate: 1,\n visible: true,\n additionalDetails:\n '{\"transferType\":\"INTERNAL\",\"beneficiaryId\":\"aa8be62e-b6e3-4d61-9c52-9118871db8b1\",\"deviceIp\":\"91.236.87.136\",\"beneficiaryAccountNumber\":\"9817123411\",\"beneficiaryRoutingNumber\":\"084106768\",\"beneficiaryPaymentMethod\":\"WIRE\"}',\n createdOn: '2024-02-21T18:03:56.185319',\n updatedOn: '2024-02-21T18:06:00.366403',\n },\n {\n displayableType: DisplayableType.SINGLE,\n id: '19fee6af-3e2b-4de9-ad5a-abf92b2ce480',\n walletId: '0ceaf1d2-20b6-4de0-8e74-ad514f0df81c',\n accountId: '64eb0105-8484-4f38-ba20-91c27159ee2c',\n transactionType: TransactionType.WITHDRAW,\n transactionStatus: TransactionStatus.COMPLETED,\n description: 'more',\n name: 'Test account 6',\n provider: 'SYNAPSE',\n baseAmount: -10,\n baseCurrency: Currency.USDC,\n localAmount: -10,\n localCurrency: Currency.USD,\n feeAmount: 0,\n feeCurrency: Currency.USDC,\n fxRate: 1,\n visible: true,\n additionalDetails:\n '{\"transferType\":\"INTERNAL\",\"beneficiaryId\":\"aa8be62e-b6e3-4d61-9c52-9118871db8b1\",\"deviceIp\":\"91.236.87.136\",\"beneficiaryAccountNumber\":\"9817123411\",\"beneficiaryRoutingNumber\":\"084106768\",\"beneficiaryPaymentMethod\":\"WIRE\"}',\n createdOn: '2024-02-21T18:03:24.330942',\n updatedOn: '2024-02-21T18:06:00.322114',\n },\n {\n displayableType: DisplayableType.SINGLE,\n id: '8445ca08-dd5d-49f6-9d52-2f27bc729e94',\n walletId: '0ceaf1d2-20b6-4de0-8e74-ad514f0df81c',\n accountId: '64eb0105-8484-4f38-ba20-91c27159ee2c',\n transactionType: TransactionType.WITHDRAW,\n transactionStatus: TransactionStatus.COMPLETED,\n description: '',\n name: 'Test account 7',\n provider: 'SYNAPSE',\n baseAmount: -1,\n baseCurrency: Currency.USDC,\n localAmount: -1,\n localCurrency: Currency.USD,\n feeAmount: 0,\n feeCurrency: Currency.USDC,\n fxRate: 1,\n visible: true,\n additionalDetails:\n '{\"transferType\":\"INTERNAL\",\"beneficiaryId\":\"aa8be62e-b6e3-4d61-9c52-9118871db8b1\",\"deviceIp\":\"91.236.87.136\",\"beneficiaryAccountNumber\":\"9817123411\",\"beneficiaryRoutingNumber\":\"084106768\",\"beneficiaryPaymentMethod\":\"WIRE\"}',\n createdOn: '2024-02-21T17:57:53.481888',\n updatedOn: '2024-02-21T18:02:00.407292',\n },\n {\n displayableType: DisplayableType.SINGLE,\n id: '1c7700cb-eb39-41fa-b1df-8a761a71824d',\n walletId: '0ceaf1d2-20b6-4de0-8e74-ad514f0df81c',\n accountId: '64eb0105-8484-4f38-ba20-91c27159ee2c',\n transactionType: TransactionType.WITHDRAW,\n transactionStatus: TransactionStatus.COMPLETED,\n description: 'Yo!',\n name: 'Test account 8',\n provider: 'SYNAPSE',\n baseAmount: -2000.1,\n baseCurrency: Currency.USDC,\n localAmount: -2000.1,\n localCurrency: Currency.USD,\n feeAmount: 0,\n feeCurrency: Currency.USDC,\n fxRate: 1,\n visible: true,\n additionalDetails:\n '{\"transferType\":\"INTERNAL\",\"beneficiaryId\":\"aa8be62e-b6e3-4d61-9c52-9118871db8b1\",\"deviceIp\":\"91.236.87.136\",\"beneficiaryAccountNumber\":\"9817123411\",\"beneficiaryRoutingNumber\":\"084106768\",\"beneficiaryPaymentMethod\":\"WIRE\"}',\n createdOn: '2024-02-21T15:41:54.971583',\n updatedOn: '2024-02-21T17:12:03.974337',\n },\n {\n displayableType: DisplayableType.SINGLE,\n id: '490cbcdd-c1f4-4412-b907-7fdea409be2e',\n walletId: '0ceaf1d2-20b6-4de0-8e74-ad514f0df81c',\n accountId: '64eb0105-8484-4f38-ba20-91c27159ee2c',\n transactionType: TransactionType.INTERNAL_SWAP_DEPOSIT,\n transactionStatus: TransactionStatus.FAILED,\n description: '',\n name: 'Test account 9',\n provider: 'DOLARAPP',\n baseAmount: 11,\n baseCurrency: Currency.USDC,\n localAmount: 11,\n localCurrency: Currency.USDC,\n feeAmount: 0,\n feeCurrency: Currency.USDC,\n fxRate: 1,\n visible: true,\n additionalDetails: '{}',\n createdOn: '2024-02-21T11:53:28.672959',\n updatedOn: '2024-02-21T11:53:28.672959',\n },\n {\n displayableType: DisplayableType.SINGLE,\n id: '7202d5c5-a23f-4e36-aa0c-449a87c4055e',\n walletId: '0ceaf1d2-20b6-4de0-8e74-ad514f0df81c',\n accountId: '64eb0105-8484-4f38-ba20-91c27159ee2c',\n transactionType: TransactionType.INTERNAL_SWAP_WITHDRAW,\n transactionStatus: TransactionStatus.FAILED,\n description: '',\n name: 'Test account 10',\n provider: 'DOLARAPP',\n baseAmount: -11,\n baseCurrency: Currency.USDC,\n localAmount: -11,\n localCurrency: Currency.USDC,\n feeAmount: 0,\n feeCurrency: Currency.USDC,\n fxRate: 1,\n visible: true,\n additionalDetails: '{}',\n createdOn: '2024-02-21T11:53:28.672847',\n updatedOn: '2024-02-21T11:53:28.672847',\n },\n {\n accountId: '64eb0105-8484-4f38-ba20-91c27159ee2c',\n additionalDetails:\n '{\"merchantCategory\":\"HEALTH\",\"merchantLogoUrl\":\"https://cdn.dolarapp.com/merchant/logo/updates/spotify.png\",\"cardId\":\"c6be52b9-1b0c-4d39-9ef2-cdf2bc30d54b\",\"cardIdentityId\":\"00283379-242d-4cae-8e12-2d8fd831d9fa\",\"cardType\":\"VIRTUAL\",\"cardLastFourDigits\":\"5688\",\"mxnRate\":\"18.0560000000\"}',\n baseAmount: -55,\n baseCurrency: Currency.USDC,\n completedAt: null,\n createdOn: '2024-06-24T12:42:14.711255',\n description: 'Spotify',\n displayableType: DisplayableType.SINGLE,\n feeAmount: 0,\n feeCurrency: Currency.USDC,\n fxRate: 1.0909090909,\n id: '1e194b66-521f-445c-97ac-841ebeb1b8f3',\n localAmount: -60,\n localCurrency: Currency.USD,\n name: 'Spotify Usa',\n postTransactionBalance: null,\n provider: 'TUTUKA',\n providerRef: '105001',\n transactionStatus: TransactionStatus.PENDING,\n transactionType: TransactionType.CARD_PAYMENT,\n updatedOn: '2024-06-24T12:42:14.711255',\n walletId: '0ceaf1d2-20b6-4de0-8e74-ad514f0df81c',\n },\n]\n\nexport const MOCKED_BULK_TRANSACTION: BulkTransaction =\n MOCKED_TRANSACTIONS.find(\n (tx) => tx.displayableType === DisplayableType.BULK,\n ) as BulkTransaction\n","import { http, HttpResponse } from 'msw'\n\nimport { Currency } from '@/constants/currency'\nimport { BASE_API_DEV } from '@/constants/urls'\nimport {\n ACCOUNTS_FILTER_NAME,\n CARDS_ID_FILTER_NAME,\n CURRENCY_FILTER_NAME,\n STATUS_FILTER_NAME,\n TYPE_FILTER_NAME,\n} from '@/domains/Business/components'\n\nimport { DisplayableType } from '../../types'\nimport { getTransactionAdditionalDetails } from '../../utils'\n\nimport { MOCKED_TRANSACTIONS } from './transactions.mocks'\n\nexport const transactionsHandlers = [\n http.get(`${BASE_API_DEV}/v3/me/transactions/search`, async ({ request }) => {\n const url = new URL(request.url)\n\n const account = url.searchParams.get(ACCOUNTS_FILTER_NAME)\n const type = url.searchParams.get(TYPE_FILTER_NAME)\n const status = url.searchParams.get(STATUS_FILTER_NAME)\n const currency = url.searchParams.get(CURRENCY_FILTER_NAME)\n const cardId = url.searchParams.get(CARDS_ID_FILTER_NAME)\n\n const hasAnyFilters = account || type || status || currency\n\n const mockedTransactions = MOCKED_TRANSACTIONS.filter(\n (transaction) =>\n transaction.displayableType === DisplayableType.SINGLE &&\n (!account || transaction.walletId === account) &&\n (!type || transaction.transactionType === type) &&\n (!status || transaction.transactionStatus === status) &&\n (!currency || transaction.localCurrency === currency),\n )\n\n if (cardId) {\n return HttpResponse.json(\n mockedTransactions.filter(\n (transaction) =>\n transaction.displayableType === DisplayableType.SINGLE &&\n !!getTransactionAdditionalDetails(transaction)?.cardId,\n ),\n )\n }\n\n return HttpResponse.json(\n hasAnyFilters ? mockedTransactions : MOCKED_TRANSACTIONS,\n )\n }),\n\n http.get(`${BASE_API_DEV}/v2/me/transactions/:id`, async ({ params }) => {\n const { id } = params\n\n const transaction =\n MOCKED_TRANSACTIONS.find(\n (transaction) =>\n transaction.displayableType === DisplayableType.SINGLE &&\n transaction.id === id,\n ) ?? MOCKED_TRANSACTIONS[0]\n\n return HttpResponse.json(transaction)\n }),\n\n http.get(\n `${BASE_API_DEV}/v2/me/transactions/group/:bulkId`,\n async ({ params }) => {\n const { bulkId } = params\n\n const transaction =\n MOCKED_TRANSACTIONS.find(\n (transaction) =>\n transaction.displayableType === DisplayableType.BULK &&\n transaction.groupId === bulkId,\n ) ?? MOCKED_TRANSACTIONS[0]\n\n return HttpResponse.json(transaction)\n },\n ),\n http.get(\n `${BASE_API_DEV}/v2/me/transactions/group/:bulkId/search`,\n async ({ request }) => {\n const url = new URL(request.url)\n\n const account = url.searchParams.get(ACCOUNTS_FILTER_NAME)\n const type = url.searchParams.get(TYPE_FILTER_NAME)\n const status = url.searchParams.get(STATUS_FILTER_NAME)\n const currency = url.searchParams.get(CURRENCY_FILTER_NAME)\n\n const mockedTransactions = MOCKED_TRANSACTIONS.filter(\n (transaction) =>\n transaction.displayableType === DisplayableType.SINGLE &&\n (!account || transaction.walletId === account) &&\n (!type || transaction.transactionType === type) &&\n (!status || transaction.transactionStatus === status) &&\n (!currency || transaction.localCurrency === currency),\n )\n\n return HttpResponse.json(mockedTransactions)\n },\n ),\n\n http.get(`${BASE_API_DEV}/v1/me/transaction-currencies`, async () => {\n return HttpResponse.json([\n Currency.EUR,\n Currency.USD,\n Currency.MXN,\n Currency.GBP,\n ])\n }),\n]\n\nexport * from './transactions.mocks'\n","import { useQuery } from '@tanstack/react-query'\nimport { FormattedMessage } from 'react-intl'\nimport { useSearchParams } from 'react-router'\n\nimport { queryKeys } from '@/constants/queryKeys'\nimport { formatCurrency } from '@/lib/money'\nimport { handleURLSearchParams } from '@/lib/utils'\nimport { Coin } from '@/shared/icons/outline'\nimport { Filter } from '@/shared/icons/solid'\nimport {\n Button,\n DropdownMenuCheckboxItem,\n DropdownMenuGroup,\n DropdownMenuPortal,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n Spinner,\n} from '@/shared/ui'\n\nimport { getTransactionCurrencies } from '../../features/Transactions/api'\n\nimport { CURRENCY_FILTER_NAME } from './data'\n\nexport const CurrencyFilter = () => {\n const [searchParams, setSearchParams] = useSearchParams()\n\n const { data, isPending } = useQuery({\n queryKey: [queryKeys.getTransactionCurrencies],\n queryFn: () => getTransactionCurrencies(),\n select: (data) => data?.data,\n })\n\n function handleSearchParams(value: string) {\n return (\n setSearchParams((params) =>\n handleURLSearchParams(params, CURRENCY_FILTER_NAME, value),\n ),\n { preventScrollReset: true }\n )\n }\n\n return (\n \n \n \n \n \n {isPending ? (\n \n ) : (\n \n )}\n \n \n {searchParams.get(CURRENCY_FILTER_NAME) && (\n \n )}\n \n \n \n \n event.preventDefault()}\n checked={searchParams.get(CURRENCY_FILTER_NAME) === null}\n onCheckedChange={() =>\n setSearchParams(\n (params) => {\n params.delete(CURRENCY_FILTER_NAME)\n return params\n },\n { preventScrollReset: true },\n )\n }\n >\n \n \n\n {(data ?? []).map((currency) => {\n if (currency === null) {\n return null\n }\n\n return (\n event.preventDefault()}\n checked={searchParams\n .get(CURRENCY_FILTER_NAME)\n ?.split(',')\n ?.includes(currency)}\n onCheckedChange={() => handleSearchParams(currency)}\n >\n {formatCurrency(currency)}\n \n )\n })}\n \n \n \n \n )\n}\n","import { useEffect, useRef, useState } from 'react'\nimport { isValid, parse } from 'date-fns'\nimport { FormattedMessage, useIntl } from 'react-intl'\nimport { useSearchParams } from 'react-router'\n\nimport { Calendar as CalendarIcon } from '@/shared/icons/outline'\nimport { Filter } from '@/shared/icons/solid'\nimport {\n Button,\n DateInput,\n DropdownMenuCheckboxItem,\n DropdownMenuGroup,\n DropdownMenuPortal,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n Typography,\n} from '@/shared/ui'\n\nimport {\n DATE_FROM_FILTER_NAME,\n DATE_TO_FILTER_NAME,\n dateFilterOptions,\n dateMessages,\n} from './data'\n\ntype Props = {\n fromFilterName?: string\n toFilterName?: string\n label?: string\n}\n\nexport const DateFilter = ({\n fromFilterName = DATE_FROM_FILTER_NAME,\n toFilterName = DATE_TO_FILTER_NAME,\n label,\n}: Props) => {\n const intl = useIntl()\n const fromDateInputRef = useRef(null)\n const [searchParams, setSearchParams] = useSearchParams()\n const [layout, setLayout] = useState<'custom' | 'preset'>('preset')\n\n const [fromDate, setFromDate] = useState(\n searchParams.get(fromFilterName) || '',\n )\n const [toDate, setToDate] = useState(searchParams.get(toFilterName) || '')\n\n function handleSearchParams({\n fromDate,\n toDate,\n }: {\n fromDate: string\n toDate: string\n }) {\n setSearchParams(\n (params) => {\n if (\n params.get(fromFilterName) === fromDate &&\n params.get(toFilterName) === toDate\n ) {\n params.delete(fromFilterName)\n params.delete(toFilterName)\n\n return params\n }\n\n params.set(fromFilterName, fromDate)\n params.set(toFilterName, toDate)\n\n return params\n },\n { preventScrollReset: true },\n )\n }\n\n const isValidDate = (date: string) => {\n if (date.length < 6) {\n return false\n }\n\n if (date.length === 6) {\n const parsedDate = parse(date, 'd/M/yy', new Date())\n\n return isValid(parsedDate)\n }\n\n if (date.length === 7) {\n const parsedDayDate = parse(date, 'd/MM/yy', new Date())\n const parsedMonthDate = parse(date, 'dd/M/yy', new Date())\n\n return isValid(parsedDayDate) || isValid(parsedMonthDate)\n }\n\n const parsedDate = parse(date, 'dd/MM/yy', new Date())\n\n return isValid(parsedDate)\n }\n\n const hasDateFilterParams =\n searchParams.get(toFilterName) || searchParams.get(fromFilterName)\n\n const hasCustomFromRange = dateFilterOptions.every((option) => {\n return (\n !!searchParams.get(fromFilterName) &&\n searchParams.get(fromFilterName) !== option.value.fromDate\n )\n })\n\n const hasCustomToRange = dateFilterOptions.every((option) => {\n return (\n !!searchParams.get(toFilterName) &&\n searchParams.get(toFilterName) !== option.value.toDate\n )\n })\n\n useEffect(() => {\n if (layout === 'custom') {\n fromDateInputRef.current?.focus()\n }\n }, [fromDate.length, layout])\n\n return (\n \n \n \n \n \n \n {label ?? (\n \n )}\n \n {hasDateFilterParams && }\n \n \n \n \n {layout === 'preset' ? (\n <>\n {dateFilterOptions.map((option) => (\n event.preventDefault()}\n checked={\n searchParams\n .get(fromFilterName)\n ?.includes(option.value.fromDate) &&\n searchParams\n .get(toFilterName)\n ?.includes(option.value.toDate)\n }\n onCheckedChange={() => handleSearchParams(option.value)}\n >\n {intl.formatMessage(dateMessages[option.key])}\n \n ))}\n\n event.preventDefault()}\n checked={hasCustomFromRange || hasCustomToRange}\n onCheckedChange={() => setLayout('custom')}\n >\n \n \n \n ) : layout === 'custom' ? (\n
\n event.preventDefault()}\n checked\n onCheckedChange={() => setLayout('preset')}\n >\n \n \n\n
\n \n \n \n {\n setFromDate('')\n setSearchParams(\n (params) => {\n params.delete(DATE_FROM_FILTER_NAME)\n return params\n },\n { preventScrollReset: true },\n )\n }}\n onChange={(value) => {\n setFromDate(value)\n if (isValidDate(value)) {\n setSearchParams(\n (params) => {\n params.set(DATE_FROM_FILTER_NAME, value)\n return params\n },\n { preventScrollReset: true },\n )\n }\n }}\n />\n
\n\n
\n \n \n \n {\n setToDate('')\n setSearchParams(\n (params) => {\n params.delete(DATE_TO_FILTER_NAME)\n return params\n },\n { preventScrollReset: true },\n )\n }}\n onChange={(value) => {\n setToDate(value)\n if (isValidDate(value)) {\n setSearchParams(\n (params) => {\n params.set(DATE_TO_FILTER_NAME, value)\n return params\n },\n { preventScrollReset: true },\n )\n }\n }}\n />\n
\n
\n ) : null}\n
\n
\n
\n
\n )\n}\n","import { FormattedMessage } from 'react-intl'\n\nimport { SortBy } from '@/shared/icons/outline'\nimport {\n Button,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuTrigger,\n} from '@/shared/ui'\n\ntype Props = {\n children: React.ReactNode\n}\n\nexport const FiltersWidget = ({ children }: Props) => {\n return (\n \n \n \n \n {children}\n \n )\n}\n","import { FormattedMessage } from 'react-intl'\nimport { useSearchParams } from 'react-router'\n\nimport { OffCyclePaymentCategory } from '@/domains/Business/features/Contractors/types'\nimport { handleURLSearchParams } from '@/lib/utils'\nimport { Document } from '@/shared/icons/outline'\nimport { Filter } from '@/shared/icons/solid'\nimport {\n Button,\n DropdownMenuCheckboxItem,\n DropdownMenuGroup,\n DropdownMenuPortal,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n} from '@/shared/ui'\n\nimport { CATEGORY_FILTER_NAME } from './data'\n\nexport const HistoricalPaymentCategoryFilter = () => {\n const [searchParams, setSearchParams] = useSearchParams()\n\n function handleSearchParams(value: string) {\n return (\n setSearchParams((params) =>\n handleURLSearchParams(params, CATEGORY_FILTER_NAME, value),\n ),\n { preventScrollReset: true }\n )\n }\n\n return (\n \n \n \n \n \n \n \n \n {searchParams.get(CATEGORY_FILTER_NAME) && (\n \n )}\n \n \n \n \n event.preventDefault()}\n checked={searchParams.get(CATEGORY_FILTER_NAME) === null}\n onCheckedChange={() =>\n setSearchParams(\n (params) => {\n params.delete(CATEGORY_FILTER_NAME)\n return params\n },\n { preventScrollReset: true },\n )\n }\n >\n \n \n\n {Object.values(OffCyclePaymentCategory).map((category) => (\n event.preventDefault()}\n checked={searchParams\n .get(CATEGORY_FILTER_NAME)\n ?.includes(category)}\n onCheckedChange={() => handleSearchParams(category)}\n >\n \n \n ))}\n \n \n \n \n )\n}\n","import { FormattedMessage } from 'react-intl'\nimport { useSearchParams } from 'react-router'\n\nimport { HistoricalPaymentType } from '@/domains/Business/features/Contractors/types'\nimport { handleURLSearchParams } from '@/lib/utils'\nimport { Playlist } from '@/shared/icons/outline'\nimport { Filter } from '@/shared/icons/solid'\nimport {\n Button,\n DropdownMenuCheckboxItem,\n DropdownMenuGroup,\n DropdownMenuPortal,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n} from '@/shared/ui'\n\nimport { TYPE_FILTER_NAME } from './data'\n\nexport const HistoricalPaymentCycleFilter = () => {\n const [searchParams, setSearchParams] = useSearchParams()\n\n function handleSearchParams(value: string) {\n return (\n setSearchParams((params) =>\n handleURLSearchParams(params, TYPE_FILTER_NAME, value),\n ),\n { preventScrollReset: true }\n )\n }\n\n return (\n \n \n \n \n \n \n \n \n {searchParams.get(TYPE_FILTER_NAME) && (\n \n )}\n \n \n \n \n event.preventDefault()}\n checked={searchParams.get(TYPE_FILTER_NAME) === null}\n onCheckedChange={() =>\n setSearchParams(\n (params) => {\n params.delete(TYPE_FILTER_NAME)\n return params\n },\n { preventScrollReset: true },\n )\n }\n >\n \n \n\n {Object.values(HistoricalPaymentType).map((type) => (\n event.preventDefault()}\n checked={searchParams.get(TYPE_FILTER_NAME)?.includes(type)}\n onCheckedChange={() => handleSearchParams(type)}\n >\n \n \n ))}\n \n \n \n \n )\n}\n","import { FormattedMessage } from 'react-intl'\nimport { useSearchParams } from 'react-router'\n\nimport { handleURLSearchParams } from '@/lib/utils'\nimport { Check } from '@/shared/icons/outline'\nimport { Filter } from '@/shared/icons/solid'\nimport {\n Button,\n DropdownMenuCheckboxItem,\n DropdownMenuGroup,\n DropdownMenuPortal,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n} from '@/shared/ui'\n\nimport { HistoricalPaymentState } from '../../features/Contractors/types'\n\nimport { STATUS_FILTER_NAME } from './data'\n\nexport const HistoricalPaymentStateFilter = () => {\n const [searchParams, setSearchParams] = useSearchParams()\n\n function handleSearchParams(value: string) {\n return (\n setSearchParams((params) =>\n handleURLSearchParams(params, STATUS_FILTER_NAME, value),\n ),\n { preventScrollReset: true }\n )\n }\n\n return (\n \n \n \n \n \n \n \n \n {searchParams.get(STATUS_FILTER_NAME) && (\n \n )}\n \n \n \n \n event.preventDefault()}\n checked={searchParams.get(STATUS_FILTER_NAME) === null}\n onCheckedChange={() =>\n setSearchParams(\n (params) => {\n params.delete(STATUS_FILTER_NAME)\n return params\n },\n { preventScrollReset: true },\n )\n }\n >\n \n \n\n {Object.values(HistoricalPaymentState)\n .filter((state) => state !== HistoricalPaymentState.CREATED)\n .map((status) => (\n event.preventDefault()}\n checked={searchParams\n .get(STATUS_FILTER_NAME)\n ?.includes(status)}\n onCheckedChange={() => handleSearchParams(status)}\n >\n \n \n ))}\n \n \n \n \n )\n}\n","import { FormattedMessage } from 'react-intl'\nimport { useSearchParams } from 'react-router'\n\nimport { handleURLSearchParams } from '@/lib/utils'\nimport { Check } from '@/shared/icons/outline'\nimport { Filter } from '@/shared/icons/solid'\nimport {\n Button,\n DropdownMenuCheckboxItem,\n DropdownMenuGroup,\n DropdownMenuPortal,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n} from '@/shared/ui'\n\nimport { TransactionStatus } from '../../features/Transactions/types'\n\nimport { STATUS_FILTER_NAME } from './data'\n\nexport const StateFilter = () => {\n const [searchParams, setSearchParams] = useSearchParams()\n\n function handleSearchParams(value: string) {\n return (\n setSearchParams((params) =>\n handleURLSearchParams(params, STATUS_FILTER_NAME, value),\n ),\n { preventScrollReset: true }\n )\n }\n\n return (\n \n \n \n \n \n \n \n \n {searchParams.get(STATUS_FILTER_NAME) && (\n \n )}\n \n \n \n \n event.preventDefault()}\n checked={searchParams.get(STATUS_FILTER_NAME) === null}\n onCheckedChange={() =>\n setSearchParams(\n (params) => {\n params.delete(STATUS_FILTER_NAME)\n return params\n },\n { preventScrollReset: true },\n )\n }\n >\n \n \n\n {Object.values(TransactionStatus).map((status) => (\n event.preventDefault()}\n checked={searchParams.get(STATUS_FILTER_NAME)?.includes(status)}\n onCheckedChange={() => handleSearchParams(status)}\n >\n \n \n ))}\n \n \n \n \n )\n}\n","import { Currency } from '@/constants/currency'\nimport { PaymentMethod, PaymentRails } from '@/domains/Business/constants'\nimport { EntityType } from '@/domains/Business/features/Recipients/types'\nimport { CountryCode } from '@/types/country'\n\nexport enum TaskState {\n PENDING = 'PENDING',\n DECLINED = 'DECLINED',\n APPROVED = 'APPROVED',\n CANCELLED = 'CANCELLED',\n}\n\nexport enum TaskType {\n ADD_BENEFICIARY = 'ADD_BENEFICIARY',\n EXECUTE_WITHDRAWAL = 'EXECUTE_WITHDRAWAL',\n EXECUTE_BULK_PAYMENT = 'EXECUTE_BULK_PAYMENT',\n}\n\nexport enum TaskEntityType {\n BENEFICIARY = 'BENEFICIARY',\n BULK_PAYMENT = 'BULK_PAYMENT',\n WITHDRAWAL = 'WITHDRAWAL',\n}\n\ntype Amount = {\n amount: number\n currency: Currency\n}\n\ntype PaymentQuoteDetail = {\n subtotalNumberOfPayments: number\n subtotalAmount: Amount\n fxRate: number\n}\n\nexport type BulkPaymentTaskDetails = {\n id: string\n walletId: string\n paymentLabel: string\n totalNumberOfPayments: number\n totalAmount: Amount\n fee: Amount\n paymentQuoteDetails: PaymentQuoteDetail[]\n feeBeforeDiscount: Amount\n}\n\nexport type WithdrawalTaskDetails = {\n additionalDetails?: {\n paymentMessage?: string\n }\n id: string\n businessId: string\n businessUserId: string\n walletId: string\n walletLabel: string\n beneficiaryId: string\n localAmount: string\n localCurrency: Currency\n baseAmount: string\n baseCurrency: Currency\n fxRate: string\n type: string\n createdOn: string\n}\n\ntype SharedType = {\n id: string\n businessId: string\n businessUserId: string\n businessIdentityId: string\n createdByFirstName: string\n createdByLastName: string\n createdBySecondLastName?: null | string\n state: TaskState\n type: TaskType\n entityType: TaskEntityType\n entityId: string\n completedByBusinessUserId: null | string\n completedOn: null | string\n createdOn: string\n}\n\ntype AddBeneficiaryTaskMX = SharedType & {\n type: TaskType.ADD_BENEFICIARY\n entityType: TaskEntityType.BENEFICIARY\n taskDetails: {\n beneficiaryName: string\n beneficiaryClabe: string\n beneficiaryEntityType: string\n beneficiaryEmail?: string\n beneficiaryPhoneNumber?: string\n beneficiaryBank?: string\n beneficiaryCountry: CountryCode.MX\n beneficiaryPaymentRails: PaymentRails.MEX\n }\n}\n\ntype AddBeneficiaryTaskUS = SharedType & {\n type: TaskType.ADD_BENEFICIARY\n entityType: TaskEntityType.BENEFICIARY\n taskDetails: {\n beneficiaryName: string\n beneficiaryAccountNumber: string\n beneficiaryRoutingNumber: string\n beneficiaryEntityType: EntityType\n beneficiaryPaymentMethod: PaymentMethod\n beneficiaryEmail?: string\n beneficiaryPhoneNumber?: string\n beneficiaryBank?: string\n beneficiaryCountry: CountryCode.US\n beneficiaryPaymentRails: PaymentRails.USA\n }\n}\n\ntype AddBeneficiaryTaskDolarTag = SharedType & {\n type: TaskType.ADD_BENEFICIARY\n entityType: TaskEntityType.BENEFICIARY\n taskDetails: {\n beneficiaryName: string\n beneficiaryEntityType: EntityType\n beneficiaryEmail?: string\n beneficiaryPhoneNumber?: string\n beneficiaryBank?: string\n beneficiaryPaymentRails: PaymentRails.DOLAR_APP\n beneficiaryDolarTag: string\n }\n}\n\nexport type ExecuteWithdrawalTask = SharedType & {\n type: TaskType.EXECUTE_WITHDRAWAL\n entityType: TaskEntityType.WITHDRAWAL\n taskDetails: {\n localAmount: string\n localCurrency: Currency\n beneficiaryId: string\n beneficiaryName: string\n beneficiaryEntityType: EntityType\n walletLabel: string\n }\n}\n\nexport type ExecuteBulkPaymentTask = SharedType & {\n type: TaskType.EXECUTE_BULK_PAYMENT\n entityType: TaskEntityType.BULK_PAYMENT\n taskDetails: {\n bulkPaymentLabel: string\n currency: Currency\n totalAmount: string\n totalNumberOfPayments: string\n walletLabel: string\n }\n}\n\nexport type AddBeneficiaryTask =\n | AddBeneficiaryTaskMX\n | AddBeneficiaryTaskUS\n | AddBeneficiaryTaskDolarTag\n\nexport type Task =\n | AddBeneficiaryTask\n | ExecuteWithdrawalTask\n | ExecuteBulkPaymentTask\n","import { FormattedMessage } from 'react-intl'\nimport { useSearchParams } from 'react-router'\n\nimport { handleURLSearchParams } from '@/lib/utils'\nimport { Playlist } from '@/shared/icons/outline'\nimport { Filter } from '@/shared/icons/solid'\nimport {\n Button,\n DropdownMenuCheckboxItem,\n DropdownMenuGroup,\n DropdownMenuPortal,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n} from '@/shared/ui'\n\nimport { TaskType } from '../../features/Tasks/types'\n\nimport { TYPE_FILTER_NAME } from './data'\n\nexport const TasksTypeFilter = () => {\n const [searchParams, setSearchParams] = useSearchParams()\n\n function handleSearchParams(value: string) {\n return (\n setSearchParams((params) =>\n handleURLSearchParams(params, TYPE_FILTER_NAME, value),\n ),\n { preventScrollReset: true }\n )\n }\n\n return (\n \n \n \n \n \n \n \n \n {searchParams.get(TYPE_FILTER_NAME) && (\n \n )}\n \n \n \n \n event.preventDefault()}\n checked={searchParams.get(TYPE_FILTER_NAME) === null}\n onCheckedChange={() =>\n setSearchParams(\n (params) => {\n params.delete(TYPE_FILTER_NAME)\n return params\n },\n { preventScrollReset: true },\n )\n }\n >\n \n \n\n {Object.values(TaskType).map((type) => (\n event.preventDefault()}\n checked={searchParams\n .get(TYPE_FILTER_NAME)\n ?.split(',')\n ?.includes(type)}\n onCheckedChange={() => handleSearchParams(type)}\n >\n \n \n ))}\n \n \n \n \n )\n}\n","import { FormattedMessage } from 'react-intl'\nimport { useSearchParams } from 'react-router'\n\nimport { handleURLSearchParams } from '@/lib/utils'\nimport { Filter, User } from '@/shared/icons/solid'\nimport {\n Button,\n DropdownMenuCheckboxItem,\n DropdownMenuGroup,\n DropdownMenuPortal,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n} from '@/shared/ui'\n\nimport { Role } from '../../types'\n\nimport { TEAM_ROLE_FILTER_NAME } from './data'\n\nexport const TeamRoleFilter = () => {\n const [searchParams, setSearchParams] = useSearchParams()\n\n function handleSearchParams(value: string) {\n return (\n setSearchParams((params) =>\n handleURLSearchParams(params, TEAM_ROLE_FILTER_NAME, value),\n ),\n { preventScrollReset: true }\n )\n }\n\n return (\n \n \n \n \n \n \n \n \n {searchParams.get(TEAM_ROLE_FILTER_NAME) && (\n \n )}\n \n \n \n \n event.preventDefault()}\n checked={searchParams.get(TEAM_ROLE_FILTER_NAME) === null}\n onCheckedChange={() =>\n setSearchParams(\n (params) => {\n params.delete(TEAM_ROLE_FILTER_NAME)\n return params\n },\n { preventScrollReset: true },\n )\n }\n >\n \n \n\n {Object.values(Role).map((role) => (\n event.preventDefault()}\n checked={searchParams\n .get(TEAM_ROLE_FILTER_NAME)\n ?.includes(role)}\n onCheckedChange={() => handleSearchParams(role)}\n >\n \n \n ))}\n \n \n \n \n )\n}\n","import { useCallback } from 'react'\nimport { FormattedMessage } from 'react-intl'\nimport { useSearchParams } from 'react-router'\n\nimport { handleURLSearchParams } from '@/lib/utils'\nimport { Check } from '@/shared/icons/outline'\nimport { Filter } from '@/shared/icons/solid'\nimport {\n Button,\n DropdownMenuCheckboxItem,\n DropdownMenuGroup,\n DropdownMenuPortal,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n} from '@/shared/ui'\n\nimport { TeamState } from '../../features/Team/types'\n\nimport { STATUS_FILTER_NAME } from './data'\n\nexport const TeamStateFilter = () => {\n const [searchParams, setSearchParams] = useSearchParams()\n\n const handleSearchParams = useCallback(\n (value: string) => {\n return (\n setSearchParams((params) =>\n handleURLSearchParams(params, STATUS_FILTER_NAME, value),\n ),\n { preventScrollReset: true }\n )\n },\n [setSearchParams],\n )\n\n return (\n \n \n \n \n \n \n \n \n {searchParams.get(STATUS_FILTER_NAME) && (\n \n )}\n \n \n \n \n {Object.values(TeamState).map((state) => (\n event.preventDefault()}\n checked={searchParams.get(STATUS_FILTER_NAME)?.includes(state)}\n onCheckedChange={() => handleSearchParams(state)}\n >\n \n \n ))}\n \n \n \n \n )\n}\n","import { FormattedMessage } from 'react-intl'\nimport { useSearchParams } from 'react-router'\n\nimport { handleURLSearchParams } from '@/lib/utils'\nimport { Playlist } from '@/shared/icons/outline'\nimport { Filter } from '@/shared/icons/solid'\nimport {\n Button,\n DropdownMenuCheckboxItem,\n DropdownMenuGroup,\n DropdownMenuPortal,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n} from '@/shared/ui'\n\nimport { TransactionType } from '../../features/Transactions/types'\n\nimport { TYPE_FILTER_NAME } from './data'\n\nconst TRANSACTION_FILTER_TYPES = [\n TransactionType.CARD_PAYMENT,\n TransactionType.CARD_PAYMENT_REFUND,\n TransactionType.DEPOSIT,\n TransactionType.INTERNAL_SWAP_DEPOSIT,\n // we don't want to show INTERNAL_SWAP_WITHDRAW as we use one `Internal` type for both\n TransactionType.REWARD,\n TransactionType.WITHDRAW,\n]\n\nexport const TypeFilter = () => {\n const [searchParams, setSearchParams] = useSearchParams()\n\n function handleSearchParams(value: string) {\n return (\n setSearchParams((params) =>\n handleURLSearchParams(params, TYPE_FILTER_NAME, value),\n ),\n { preventScrollReset: true }\n )\n }\n\n return (\n \n \n \n \n \n \n \n \n {searchParams.get(TYPE_FILTER_NAME) && (\n \n )}\n \n \n \n \n event.preventDefault()}\n checked={searchParams.get(TYPE_FILTER_NAME) === null}\n onCheckedChange={() =>\n setSearchParams(\n (params) => {\n params.delete(TYPE_FILTER_NAME)\n return params\n },\n { preventScrollReset: true },\n )\n }\n >\n \n \n\n {TRANSACTION_FILTER_TYPES.map((type) => (\n event.preventDefault()}\n checked={searchParams\n .get(TYPE_FILTER_NAME)\n ?.split(',')\n ?.includes(type)}\n onCheckedChange={() => handleSearchParams(type)}\n >\n \n \n ))}\n \n \n \n \n )\n}\n","import { motion } from 'framer-motion'\nimport { useIntl } from 'react-intl'\n\nimport { X } from '@/shared/icons/outline'\nimport { Filter } from '@/shared/icons/solid'\nimport { Button, Typography } from '@/shared/ui'\n\ntype Props = {\n children: React.ReactNode\n name: string\n onClick: () => void\n}\n\nexport const FilterBadge = ({ children, onClick, name }: Props) => {\n const intl = useIntl()\n return (\n \n \n\n {name}\n =\n\n {children}\n\n \n \n \n \n )\n}\n","import { useMemo } from 'react'\nimport { useIntl } from 'react-intl'\nimport { useSearchParams } from 'react-router'\n\nimport { Spinner } from '@/shared/ui'\n\nimport { useWallets } from '../../hooks'\n\nimport { ACCOUNTS_FILTER_NAME } from './data'\nimport { FilterBadge } from './FilterBadge'\n\nexport const AccountsBadge = () => {\n const intl = useIntl()\n const [searchParams, setSearchParams] = useSearchParams()\n const { wallets, isPending } = useWallets({ showAll: true })\n\n const selectedAccounts = useMemo(\n () =>\n searchParams\n .get(ACCOUNTS_FILTER_NAME)\n ?.split(',')\n .map((value) => {\n const account = wallets?.find((wallet) => wallet.id === value)\n\n return account?.label\n })\n .join(', '),\n [wallets, searchParams],\n )\n\n if (!searchParams.get(ACCOUNTS_FILTER_NAME)) {\n return null\n }\n\n return (\n {\n setSearchParams(\n (params) => {\n params.delete(ACCOUNTS_FILTER_NAME)\n\n return params\n },\n { preventScrollReset: true },\n )\n }}\n name={intl.formatMessage({\n id: 'label.accounts',\n defaultMessage: 'Accounts',\n })}\n >\n {isPending ? : selectedAccounts}\n \n )\n}\n","import { useMemo } from 'react'\nimport { useQuery } from '@tanstack/react-query'\nimport { useIntl } from 'react-intl'\nimport { useSearchParams } from 'react-router'\n\nimport { queryKeys } from '@/constants/queryKeys'\nimport { useBusinessRole, useBusinessUser } from '@/domains/Business/hooks'\nimport { getFullName } from '@/lib/typography'\nimport { Spinner } from '@/shared/ui'\n\nimport { getTeamMembers } from '../../features/Team/api'\n\nimport { IDENTITY_FILTER_NAME } from './data'\nimport { FilterBadge } from './FilterBadge'\n\nexport const CardholderBadge = () => {\n const intl = useIntl()\n const [searchParams, setSearchParams] = useSearchParams()\n\n const { isAdmin } = useBusinessRole()\n const businessUser = useBusinessUser()\n\n const teamMembersQuery = useQuery({\n queryKey: [queryKeys.getTeamMembers],\n queryFn: () => getTeamMembers(),\n select: (data) => data?.data,\n enabled: isAdmin,\n })\n\n const members = useMemo(() => {\n if (teamMembersQuery.data) {\n return teamMembersQuery.data\n }\n\n if (businessUser) {\n return [businessUser]\n }\n\n return []\n }, [teamMembersQuery.data, businessUser])\n\n const selectedMembers = useMemo(\n () =>\n searchParams\n .get(IDENTITY_FILTER_NAME)\n ?.split(',')\n .map((value) => {\n const activeMember = members?.find(\n (member) => member.identityId === value,\n )\n\n return getFullName(activeMember)\n })\n .join(', '),\n [members, searchParams],\n )\n\n if (!searchParams.get(IDENTITY_FILTER_NAME)) {\n return null\n }\n\n return (\n {\n setSearchParams(\n (params) => {\n params.delete(IDENTITY_FILTER_NAME)\n\n return params\n },\n { preventScrollReset: true },\n )\n }}\n name={intl.formatMessage({\n id: 'label.cardholder',\n defaultMessage: 'Cardholder',\n })}\n >\n {teamMembersQuery.isFetching ? (\n \n ) : (\n selectedMembers\n )}\n \n )\n}\n","import { useIntl } from 'react-intl'\nimport { useSearchParams } from 'react-router'\n\nimport { CardState } from '../../features/Cards/types'\n\nimport { STATUS_FILTER_NAME } from './data'\nimport { FilterBadge } from './FilterBadge'\n\nexport const CardStateBadge = () => {\n const [searchParams, setSearchParams] = useSearchParams()\n const intl = useIntl()\n\n if (!searchParams.get(STATUS_FILTER_NAME)) {\n return null\n }\n\n return (\n {\n setSearchParams(\n (params) => {\n params.delete(STATUS_FILTER_NAME)\n\n return params\n },\n { preventScrollReset: true },\n )\n }}\n name={intl.formatMessage({\n id: 'label.status',\n defaultMessage: 'Status',\n })}\n >\n {searchParams\n .get(STATUS_FILTER_NAME)\n ?.split(',')\n .map((option) => {\n const value = Object.values(CardState).find((o) => o === option)\n\n return intl.formatMessage(\n {\n id: 'card.state.label',\n defaultMessage:\n '{state, select, ACTIVE {Active} CREATED {Inactive} BLOCKED {Frozen} TERMINATED {Terminated} other {}}',\n },\n { state: value },\n )\n })\n .join(', ')}\n \n )\n}\n","import { useIntl } from 'react-intl'\nimport { useSearchParams } from 'react-router'\n\nimport { PAYMENT_TYPES_FILTER_NAME } from './data'\nimport { FilterBadge } from './FilterBadge'\n\nexport const ContractTypeBadge = () => {\n const [searchParams, setSearchParams] = useSearchParams()\n const intl = useIntl()\n\n if (!searchParams.get(PAYMENT_TYPES_FILTER_NAME)) {\n return null\n }\n\n return (\n {\n setSearchParams(\n (params) => {\n params.delete(PAYMENT_TYPES_FILTER_NAME)\n\n return params\n },\n { preventScrollReset: true },\n )\n }}\n name={intl.formatMessage({\n id: 'label.contactType',\n defaultMessage: 'Contract type',\n })}\n >\n {searchParams\n .get(PAYMENT_TYPES_FILTER_NAME)\n ?.split(',')\n .map((state) => {\n return intl.formatMessage(\n {\n id: 'contract.type.label',\n defaultMessage:\n '{state, select, FIXED_RATE {Fixed-rate} PAY_AS_YOU_GO {Pay-as-you-go} other {}}',\n },\n { state },\n )\n })\n .join(', ')}\n \n )\n}\n","import { useIntl } from 'react-intl'\nimport { useSearchParams } from 'react-router'\n\nimport { Currency } from '@/constants/currency'\nimport { formatCurrency } from '@/lib/money'\n\nimport { CURRENCY_FILTER_NAME } from './data'\nimport { FilterBadge } from './FilterBadge'\n\nexport const CurrencyBadge = () => {\n const [searchParams, setSearchParams] = useSearchParams()\n const intl = useIntl()\n\n if (!searchParams.get(CURRENCY_FILTER_NAME)) {\n return null\n }\n\n return (\n {\n setSearchParams(\n (params) => {\n params.delete(CURRENCY_FILTER_NAME)\n\n return params\n },\n { preventScrollReset: true },\n )\n }}\n name={intl.formatMessage({\n id: 'label.currency',\n defaultMessage: 'Currency',\n })}\n >\n {searchParams\n .get(CURRENCY_FILTER_NAME)\n ?.split(',')\n .map((option) => {\n return formatCurrency(option as Currency)\n })\n .join(', ')}\n \n )\n}\n","import { useIntl } from 'react-intl'\nimport { useSearchParams } from 'react-router'\n\nimport { DATE_FROM_FILTER_NAME, DATE_TO_FILTER_NAME } from './data'\nimport { FilterBadge } from './FilterBadge'\n\nexport const DateBadge = () => {\n const [searchParams, setSearchParams] = useSearchParams()\n const intl = useIntl()\n\n return (\n <>\n {searchParams.get(DATE_FROM_FILTER_NAME) && (\n {\n setSearchParams(\n (params) => {\n params.delete(DATE_FROM_FILTER_NAME)\n\n return params\n },\n { preventScrollReset: true },\n )\n }}\n name={intl.formatMessage({\n id: 'label.dateFrom',\n defaultMessage: 'Date: From',\n })}\n >\n {searchParams.get(DATE_FROM_FILTER_NAME)}\n \n )}\n {searchParams.get(DATE_TO_FILTER_NAME) && (\n {\n setSearchParams(\n (params) => {\n params.delete(DATE_TO_FILTER_NAME)\n\n return params\n },\n { preventScrollReset: true },\n )\n }}\n name={intl.formatMessage({\n id: 'label.dateTo',\n defaultMessage: 'Date: To',\n })}\n >\n {searchParams.get(DATE_TO_FILTER_NAME)}\n \n )}\n \n )\n}\n","import { useIntl } from 'react-intl'\nimport { useSearchParams } from 'react-router'\n\nimport { OffCyclePaymentCategory } from '@/domains/Business/features/Contractors/types'\n\nimport { CATEGORY_FILTER_NAME } from './data'\nimport { FilterBadge } from './FilterBadge'\n\nexport const HistoricalPaymentCategoryBadge = () => {\n const [searchParams, setSearchParams] = useSearchParams()\n const intl = useIntl()\n\n if (!searchParams.get(CATEGORY_FILTER_NAME)) {\n return null\n }\n\n return (\n {\n setSearchParams(\n (params) => {\n params.delete(CATEGORY_FILTER_NAME)\n return params\n },\n { preventScrollReset: true },\n )\n }}\n name={intl.formatMessage({\n id: 'label.category',\n defaultMessage: 'Category',\n })}\n >\n {searchParams\n .get(CATEGORY_FILTER_NAME)\n ?.split(',')\n .map((option) => {\n const value = Object.values(OffCyclePaymentCategory).find(\n (o) => o === option,\n )\n\n return intl.formatMessage(\n {\n id: 'contractor.paymentCategory.label',\n defaultMessage:\n '{type, select, BONUS {Bonus} COMMISSION {Commission} REIMBURSEMENT {Reimbursement} EXTRA_HOURS {Extra hours} ADJUSTMENT {Adjustment} SETTLEMENT {Settlement} other {}}',\n },\n { type: value },\n )\n })\n .join(', ')}\n \n )\n}\n","import { useIntl } from 'react-intl'\nimport { useSearchParams } from 'react-router'\n\nimport { HistoricalPaymentType } from '@/domains/Business/features/Contractors/types'\n\nimport { TYPE_FILTER_NAME } from './data'\nimport { FilterBadge } from './FilterBadge'\n\nexport const HistoricalPaymentCycleBadge = () => {\n const [searchParams, setSearchParams] = useSearchParams()\n const intl = useIntl()\n\n if (!searchParams.get(TYPE_FILTER_NAME)) {\n return null\n }\n\n return (\n {\n setSearchParams(\n (params) => {\n params.delete(TYPE_FILTER_NAME)\n return params\n },\n { preventScrollReset: true },\n )\n }}\n name={intl.formatMessage({\n id: 'label.paymentCycle',\n defaultMessage: 'Payment cycle',\n })}\n >\n {searchParams\n .get(TYPE_FILTER_NAME)\n ?.split(',')\n .map((option) => {\n const value = Object.values(HistoricalPaymentType).find(\n (o) => o === option,\n )\n\n return intl.formatMessage(\n {\n id: 'contractor.paymentType.label',\n defaultMessage:\n '{type, select, OFF_CYCLE {Off-cycle} PAYMENT_CYCLE {Payment cycle} other {}}',\n },\n { type: value },\n )\n })\n .join(', ')}\n \n )\n}\n","import { useIntl } from 'react-intl'\nimport { useSearchParams } from 'react-router'\n\nimport { HistoricalPaymentState } from '@/domains/Business/features/Contractors/types'\n\nimport { STATUS_FILTER_NAME } from './data'\nimport { FilterBadge } from './FilterBadge'\n\nexport const HistoricalPaymentStateBadge = () => {\n const [searchParams, setSearchParams] = useSearchParams()\n const intl = useIntl()\n\n if (!searchParams.get(STATUS_FILTER_NAME)) {\n return null\n }\n\n return (\n {\n setSearchParams(\n (params) => {\n params.delete(STATUS_FILTER_NAME)\n return params\n },\n { preventScrollReset: true },\n )\n }}\n name={intl.formatMessage({\n id: 'label.status',\n defaultMessage: 'Status',\n })}\n >\n {searchParams\n .get(STATUS_FILTER_NAME)\n ?.split(',')\n .map((option) => {\n const value = Object.values(HistoricalPaymentState).find(\n (o) => o === option,\n )\n\n return intl.formatMessage(\n {\n id: 'historicalPayment.state.label',\n defaultMessage:\n '{state, select, CREATED {Executing} EXECUTING {Executing} FAILED_TO_EXECUTE {Failed} IN_PROGRESS {In progress} INCOMPLETE {Incomplete} COMPLETED {Completed} other {}}',\n },\n { state: value },\n )\n })\n .join(', ')}\n \n )\n}\n","import { useIntl } from 'react-intl'\nimport { useSearchParams } from 'react-router'\n\nimport { TransactionStatus } from '../../features/Transactions/types'\n\nimport { STATUS_FILTER_NAME } from './data'\nimport { FilterBadge } from './FilterBadge'\n\nexport const StateBadge = () => {\n const [searchParams, setSearchParams] = useSearchParams()\n const intl = useIntl()\n\n if (!searchParams.get(STATUS_FILTER_NAME)) {\n return null\n }\n\n return (\n {\n setSearchParams(\n (params) => {\n params.delete(STATUS_FILTER_NAME)\n\n return params\n },\n { preventScrollReset: true },\n )\n }}\n name={intl.formatMessage({\n id: 'label.status',\n defaultMessage: 'Status',\n })}\n >\n {searchParams\n .get(STATUS_FILTER_NAME)\n ?.split(',')\n .map((option) => {\n const value = Object.values(TransactionStatus).find(\n (o) => o === option,\n )\n\n return intl.formatMessage(\n {\n id: 'transaction.status',\n defaultMessage:\n '{status, select, FAILED {Failed} BLOCKED {Blocked} REVERTED {Reverted} PENDING {Pending} COMPLETED {Completed} other {}}',\n },\n { status: value },\n )\n })\n .join(', ')}\n \n )\n}\n","import { useIntl } from 'react-intl'\nimport { useSearchParams } from 'react-router'\n\nimport { TaskType } from '../../features/Tasks/types'\n\nimport { TYPE_FILTER_NAME } from './data'\nimport { FilterBadge } from './FilterBadge'\n\nexport const TasksTypeBadge = () => {\n const [searchParams, setSearchParams] = useSearchParams()\n const intl = useIntl()\n\n if (!searchParams.get(TYPE_FILTER_NAME)) {\n return null\n }\n\n return (\n {\n setSearchParams(\n (params) => {\n params.delete(TYPE_FILTER_NAME)\n\n return params\n },\n { preventScrollReset: true },\n )\n }}\n name={intl.formatMessage({\n id: 'label.type',\n defaultMessage: 'Type',\n })}\n >\n {searchParams\n .get(TYPE_FILTER_NAME)\n ?.split(',')\n .map((option) => {\n const value = Object.values(TaskType).find((o) => o === option)\n\n return intl.formatMessage(\n {\n id: 'filter.tasks.types.label',\n defaultMessage:\n '{type, select, ADD_BENEFICIARY {Recipients} EXECUTE_WITHDRAWAL {Withdrawals} EXECUTE_BULK_PAYMENT {Bulk payments} other {}}',\n },\n { type: value },\n )\n })\n .join(', ')}\n \n )\n}\n","import { useIntl } from 'react-intl'\nimport { useSearchParams } from 'react-router'\n\nimport { Role } from '../../types'\n\nimport { TEAM_ROLE_FILTER_NAME } from './data'\nimport { FilterBadge } from './FilterBadge'\n\nexport const TeamRoleBadge = () => {\n const [searchParams, setSearchParams] = useSearchParams()\n const intl = useIntl()\n\n if (!searchParams.get(TEAM_ROLE_FILTER_NAME)) {\n return null\n }\n\n return (\n {\n setSearchParams(\n (params) => {\n params.delete(TEAM_ROLE_FILTER_NAME)\n\n return params\n },\n { preventScrollReset: true },\n )\n }}\n name={intl.formatMessage({\n id: 'label.status',\n defaultMessage: 'Status',\n })}\n >\n {searchParams\n .get(TEAM_ROLE_FILTER_NAME)\n ?.split(',')\n .map((option) => {\n const value = Object.values(Role).find((o) => o === option)\n\n return intl.formatMessage(\n {\n id: 'team.role.label',\n defaultMessage:\n '{role, select, ADMIN {Admin} PAYMENT_OPS {Payment Ops} CARD_USER {Card User} READ_ONLY {Read Only} other {}}',\n },\n { role: value },\n )\n })\n .join(', ')}\n \n )\n}\n","import { useIntl } from 'react-intl'\nimport { useSearchParams } from 'react-router'\n\nimport { TeamState } from '../../features/Team/types'\n\nimport { STATUS_FILTER_NAME } from './data'\nimport { FilterBadge } from './FilterBadge'\n\nexport const TeamStateBadge = () => {\n const [searchParams, setSearchParams] = useSearchParams()\n const intl = useIntl()\n\n if (!searchParams.get(STATUS_FILTER_NAME)) {\n return null\n }\n\n return (\n {\n setSearchParams(\n (params) => {\n params.delete(STATUS_FILTER_NAME)\n\n return params\n },\n { preventScrollReset: true },\n )\n }}\n name={intl.formatMessage({\n id: 'label.status',\n defaultMessage: 'Status',\n })}\n >\n {searchParams\n .get(STATUS_FILTER_NAME)\n ?.split(',')\n .map((option) => {\n const value = Object.values(TeamState).find((o) => o === option)\n\n return intl.formatMessage(\n {\n id: 'team.status.label',\n defaultMessage:\n '{state, select, ACTIVE {Active} INVITED {Invited} BLOCKED {Blocked} TERMINATED {Terminated} other {}}',\n },\n { state: value },\n )\n })\n .join(', ')}\n \n )\n}\n","import { useIntl } from 'react-intl'\nimport { useSearchParams } from 'react-router'\n\nimport { TransactionType } from '../../features/Transactions/types'\n\nimport { TYPE_FILTER_NAME } from './data'\nimport { FilterBadge } from './FilterBadge'\n\nexport const TypeBadge = () => {\n const [searchParams, setSearchParams] = useSearchParams()\n const intl = useIntl()\n\n if (!searchParams.get(TYPE_FILTER_NAME)) {\n return null\n }\n\n return (\n {\n setSearchParams(\n (params) => {\n params.delete(TYPE_FILTER_NAME)\n\n return params\n },\n { preventScrollReset: true },\n )\n }}\n name={intl.formatMessage({\n id: 'label.type',\n defaultMessage: 'Type',\n })}\n >\n {searchParams\n .get(TYPE_FILTER_NAME)\n ?.split(',')\n .map((option) => {\n const value = Object.values(TransactionType).find((o) => o === option)\n\n return intl.formatMessage(\n {\n id: 'filter.transaction.types.label',\n defaultMessage:\n '{type, select, DEPOSIT {Deposit} WITHDRAW {Withdrawal} INTERNAL_SWAP_DEPOSIT {Internal} CARD_PAYMENT {Card} CARD_PAYMENT_REFUND {Card refund} REWARD {Refund} other {}}',\n },\n { type: value },\n )\n })\n .join(', ')}\n \n )\n}\n","import { useIntl } from 'react-intl'\nimport { useSearchParams } from 'react-router'\n\nimport { ContractorPaymentMethodType } from '../../features/Contractors/types'\n\nimport { PAYMENT_METHOD_TYPES_FILTER_NAME } from './data'\nimport { FilterBadge } from './FilterBadge'\n\nexport const ContractorPaymentDestinationBadge = () => {\n const [searchParams, setSearchParams] = useSearchParams()\n const intl = useIntl()\n\n if (!searchParams.get(PAYMENT_METHOD_TYPES_FILTER_NAME)) {\n return null\n }\n\n return (\n {\n setSearchParams(\n (params) => {\n params.delete(PAYMENT_METHOD_TYPES_FILTER_NAME)\n return params\n },\n { preventScrollReset: true },\n )\n }}\n name={intl.formatMessage({\n id: 'label.destination',\n defaultMessage: 'Destination',\n })}\n >\n {searchParams\n .get(PAYMENT_METHOD_TYPES_FILTER_NAME)\n ?.split(',')\n .map((option) => {\n const value = Object.values(ContractorPaymentMethodType).find(\n (o) => o === option,\n )\n\n return intl.formatMessage(\n {\n id: 'contractor.payment.destination.label',\n defaultMessage:\n '{type, select, DOLAR_TAG {DolarTag} US_BANK_ACCOUNT {US Bank Account} MX_BANK_ACCOUNT {MX Bank Account} other {}}',\n },\n { type: value },\n )\n })\n .join(', ')}\n \n )\n}\n","import { FormattedMessage } from 'react-intl'\nimport { useSearchParams } from 'react-router'\n\nimport { handleURLSearchParams } from '@/lib/utils'\nimport { Bank } from '@/shared/icons/outline'\nimport { Filter } from '@/shared/icons/solid'\nimport {\n Button,\n DropdownMenuCheckboxItem,\n DropdownMenuGroup,\n DropdownMenuPortal,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n} from '@/shared/ui'\n\nimport { ContractorPaymentMethodType } from '../../features/Contractors/types'\n\nimport { PAYMENT_METHOD_TYPES_FILTER_NAME } from './data'\n\nexport const ContractorPaymentDestinationFilter = () => {\n const [searchParams, setSearchParams] = useSearchParams()\n\n function handleSearchParams(value: string) {\n return (\n setSearchParams((params) =>\n handleURLSearchParams(params, PAYMENT_METHOD_TYPES_FILTER_NAME, value),\n ),\n { preventScrollReset: true }\n )\n }\n\n return (\n \n \n \n \n \n \n \n \n {searchParams.get(PAYMENT_METHOD_TYPES_FILTER_NAME) && (\n \n )}\n \n \n \n \n event.preventDefault()}\n checked={\n searchParams.get(PAYMENT_METHOD_TYPES_FILTER_NAME) === null\n }\n onCheckedChange={() =>\n setSearchParams(\n (params) => {\n params.delete(PAYMENT_METHOD_TYPES_FILTER_NAME)\n return params\n },\n { preventScrollReset: true },\n )\n }\n >\n \n \n\n {Object.values(ContractorPaymentMethodType).map((type) => (\n event.preventDefault()}\n checked={searchParams\n .get(PAYMENT_METHOD_TYPES_FILTER_NAME)\n ?.includes(type)}\n onCheckedChange={() => handleSearchParams(type)}\n >\n \n \n ))}\n \n \n \n \n )\n}\n","import { useIntl } from 'react-intl'\nimport { useSearchParams } from 'react-router'\n\nimport { ContractorTransactionState } from '../../features/Contractors/types'\n\nimport { STATUS_FILTER_NAME } from './data'\nimport { FilterBadge } from './FilterBadge'\n\nexport const ContractorPaymentStateBadge = () => {\n const [searchParams, setSearchParams] = useSearchParams()\n const intl = useIntl()\n\n if (!searchParams.get(STATUS_FILTER_NAME)) {\n return null\n }\n\n return (\n {\n setSearchParams(\n (params) => {\n params.delete(STATUS_FILTER_NAME)\n return params\n },\n { preventScrollReset: true },\n )\n }}\n name={intl.formatMessage({\n id: 'label.status',\n defaultMessage: 'Status',\n })}\n >\n {searchParams\n .get(STATUS_FILTER_NAME)\n ?.split(',')\n .map((option) => {\n const value = Object.values(ContractorTransactionState).find(\n (o) => o === option,\n )\n\n return intl.formatMessage(\n {\n id: 'contractor.payment.state.label',\n defaultMessage:\n '{state, select, EXECUTING {Executing} IN_PROGRESS {In progress} FAILED {Failed} PENDING {Pending} COMPLETED {Completed} other {}}',\n },\n { state: value },\n )\n })\n .join(', ')}\n \n )\n}\n","import { FormattedMessage } from 'react-intl'\nimport { useSearchParams } from 'react-router'\n\nimport { handleURLSearchParams } from '@/lib/utils'\nimport { Check } from '@/shared/icons/outline'\nimport { Filter } from '@/shared/icons/solid'\nimport {\n Button,\n DropdownMenuCheckboxItem,\n DropdownMenuGroup,\n DropdownMenuPortal,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n} from '@/shared/ui'\n\nimport { ContractorTransactionState } from '../../features/Contractors/types'\n\nimport { STATUS_FILTER_NAME } from './data'\n\nexport const ContractorPaymentStateFilter = () => {\n const [searchParams, setSearchParams] = useSearchParams()\n\n function handleSearchParams(value: string) {\n return (\n setSearchParams((params) =>\n handleURLSearchParams(params, STATUS_FILTER_NAME, value),\n ),\n { preventScrollReset: true }\n )\n }\n\n return (\n \n \n \n \n \n \n \n \n {searchParams.get(STATUS_FILTER_NAME) && (\n \n )}\n \n \n \n \n event.preventDefault()}\n checked={searchParams.get(STATUS_FILTER_NAME) === null}\n onCheckedChange={() =>\n setSearchParams(\n (params) => {\n params.delete(STATUS_FILTER_NAME)\n return params\n },\n { preventScrollReset: true },\n )\n }\n >\n \n \n\n {Object.values(ContractorTransactionState).map((state) => (\n event.preventDefault()}\n checked={searchParams.get(STATUS_FILTER_NAME)?.includes(state)}\n onCheckedChange={() => handleSearchParams(state)}\n >\n \n \n ))}\n \n \n \n \n )\n}\n","import { defineMessages, FormattedMessage, useIntl } from 'react-intl'\nimport { Link, useLocation } from 'react-router'\n\nimport { DefineMessages } from '@/constants/messages'\nimport { BusinessRoute } from '@/constants/paths'\nimport { cn } from '@/lib/utils'\nimport { ChevronDown, Exchange, Plus } from '@/shared/icons/outline'\nimport { BulkArrows, Navigation } from '@/shared/icons/solid'\nimport { Button, Popover, PopoverContent, PopoverTrigger } from '@/shared/ui'\nimport { Icon } from '@/types/global'\n\nimport { Permission } from '../types'\n\nimport { WithPermissions } from './WithPermissions'\n\nconst actionMessages: DefineMessages<\n 'send' | 'transfer' | 'addBalance' | 'bulkPayment'\n> = defineMessages({\n send: {\n defaultMessage: 'Send',\n id: 'action.send',\n },\n transfer: {\n defaultMessage: 'Move',\n id: 'action.transfer',\n },\n addBalance: {\n defaultMessage: 'Add balance',\n id: 'action.addBalance',\n },\n bulkPayment: {\n defaultMessage: 'Bulk payment',\n id: 'action.bulkPayment',\n },\n})\n\ntype Action = {\n key: 'send' | 'transfer' | 'addBalance' | 'bulkPayment'\n icon: Icon\n link: string\n}\n\nconst ACTIONS: Action[] = [\n {\n key: 'send',\n icon: Navigation,\n link: BusinessRoute.Send,\n },\n {\n key: 'bulkPayment',\n icon: BulkArrows,\n link: BusinessRoute.BulkPayment,\n },\n {\n key: 'transfer',\n icon: Exchange,\n link: BusinessRoute.Transfer,\n },\n {\n key: 'addBalance',\n icon: Plus,\n link: BusinessRoute.AddBalance,\n },\n]\n\nexport const MoveMoneyWidget = () => {\n const location = useLocation()\n const intl = useIntl()\n\n return (\n \n \n \n \n \n \n
\n {ACTIONS.map(({ key, icon: Icon, link }) => (\n \n \n \n\n {intl.formatMessage(actionMessages[key])}\n \n \n ))}\n
\n
\n
\n
\n )\n}\n","import { FormattedDate, FormattedMessage } from 'react-intl'\nimport { useIntercom } from 'react-use-intercom'\n\nimport { calculateProgress, formatMoney } from '@/lib/money'\nimport { Widget } from '@/shared/components'\nimport {\n Button,\n Progress,\n Sheet,\n SheetContent,\n SlideInLeft,\n StickyContainer,\n Typography,\n} from '@/shared/ui'\n\nimport { PaymentLimit } from '../types'\n\nexport type ScreenType = 'base' | 'edit'\n\ntype Props = {\n isOpen: boolean\n onOpenChange: (isOpen: boolean) => void\n limits: PaymentLimit\n}\n\nexport const AccountLimitsSidebar = ({\n isOpen,\n onOpenChange,\n limits,\n}: Props) => {\n const { showNewMessage } = useIntercom()\n\n return (\n \n \n \n
\n
\n \n \n \n\n \n \n \n
\n
\n\n \n }\n >\n
\n \n {formatMoney(limits.periodTransferLimit?.usedAmount ?? 0)}\n \n \n {formatMoney(limits.periodTransferLimit?.limitAmount ?? 0)} /{' '}\n \n \n
\n \n\n {limits.periodTransferLimit ? (\n
\n \n \n ),\n }}\n />\n \n
\n ) : null}\n \n
\n \n \n \n
\n
\n )\n}\n","import { useMutation } from '@tanstack/react-query'\nimport { FormattedMessage, useIntl } from 'react-intl'\nimport { toast } from 'sonner'\n\nimport { queryKeys } from '@/constants/queryKeys'\nimport { useErrorToast } from '@/hooks/useErrorToast'\nimport { queryClient } from '@/lib/queryClient'\nimport { getFullName } from '@/lib/typography'\nimport {\n Button,\n Dialog,\n DialogActions,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from '@/shared/ui'\n\nimport { blockTeamMember } from '../../features/Team/api'\nimport { TeamMember } from '../../features/Team/types'\n\ntype Props = {\n isOpen: boolean\n member?: TeamMember\n onBlock: () => void\n onOpenChange: (isOpen: boolean) => void\n}\n\nexport const BlockTeamMemberDialog = ({\n isOpen,\n member,\n onBlock,\n onOpenChange,\n}: Props) => {\n const notifyError = useErrorToast()\n const intl = useIntl()\n\n const { mutateAsync, isPending, isSuccess, reset } = useMutation({\n mutationFn: blockTeamMember,\n })\n\n const onBlockTeamMember = async () => {\n if (!member?.id) {\n toast.error('Missing team member ID')\n\n return\n }\n\n try {\n await mutateAsync({ id: member.id })\n\n await queryClient.invalidateQueries({\n queryKey: [queryKeys.getTeamMembers],\n })\n\n await queryClient.invalidateQueries({\n queryKey: [queryKeys.getTeamMember, member?.id],\n })\n\n onOpenChange(false)\n\n toast.success(\n intl.formatMessage({\n id: 'team.member.details.blocked',\n defaultMessage: 'Team member blocked',\n }),\n )\n\n onBlock()\n\n reset()\n } catch (error) {\n notifyError(error)\n }\n }\n\n return (\n <>\n \n \n \n \n \n \n\n
\n \n \n \n\n \n \n \n
\n
\n\n
\n\n \n onOpenChange(false)}\n variant=\"secondary\"\n >\n \n \n onBlockTeamMember()}\n >\n \n \n \n \n
\n \n )\n}\n","import { FormattedMessage } from 'react-intl'\n\nimport { teamPermissionsMessages } from '@/constants/messages'\nimport { cn } from '@/lib/utils'\nimport { Widget } from '@/shared/components'\nimport { Check, X } from '@/shared/icons/outline'\nimport { MotionDiv, Skeleton, Typography } from '@/shared/ui'\n\nimport { TeamMember, TeamState } from '../../features/Team/types'\nimport { useBusinessRole } from '../../hooks'\nimport { Permission } from '../../types'\n\ntype Props = {\n member?: TeamMember\n}\n\nexport const PermissionsList = ({ member }: Props) => {\n const isBlockedOrTerminated =\n member?.state === TeamState.BLOCKED ||\n member?.state === TeamState.TERMINATED\n\n const { isAdmin } = useBusinessRole()\n\n return (\n \n }\n className={cn(\n isBlockedOrTerminated && 'pointer-events-none bg-neutral-gray-200',\n )}\n >\n {member ? (\n \n {Object.values(Permission).map((permission) => {\n const hasActivePermission = member.permissions.includes(permission)\n\n if (!isAdmin && !hasActivePermission) {\n return null\n }\n\n return (\n \n
\n \n \n \n \n \n \n
\n\n \n {hasActivePermission ? (\n \n ) : (\n \n )}\n
\n
\n )\n })}\n \n ) : (\n Array.from({ length: 5 }).map((_, index) => {\n return (\n
\n
\n \n \n
\n \n
\n )\n })\n )}\n \n )\n}\n","import { api } from '@/lib/api'\n\nimport { Card } from '../types'\n\ntype ActivateCardRequest = {\n id: string\n}\n\nexport function activateCard(data: ActivateCardRequest) {\n const { id } = data\n return api.post(`/v1/me/physical-cards/${id}/activate`)\n}\n","import { PaymentLimitType } from '@/domains/Business/types'\nimport { api } from '@/lib/api'\n\nimport { Card } from '../types'\n\ntype CreatePhysicalCardRequest = {\n requestId: string\n walletId: string\n identityId: string\n nickname: string\n localPhoneNumber: string\n internationalPhonePrefix: string\n cardLimit: { limitAmount: string; limitType: PaymentLimitType }\n deliveryAddress: {\n street: string\n streetNumber: string\n apartment?: string\n references?: string\n neighborhood: string\n city: string\n state: string\n country: string\n postcode: string\n }\n}\n\nexport function createPhysicalCard(data: CreatePhysicalCardRequest) {\n return api.post(`/v1/me/physical-cards`, data)\n}\n","import { PaymentLimitType } from '@/domains/Business/types'\nimport { api } from '@/lib/api'\n\nimport { Card } from '../types'\n\ntype CreateVirtualCardRequest = {\n requestId: string\n walletId: string\n identityId: string\n nickname: string\n cardLimit: {\n limitAmount: string\n limitType: PaymentLimitType\n }\n}\n\nexport function createVirtualCard(data: CreateVirtualCardRequest) {\n return api.post(`/v1/me/virtual-cards`, data)\n}\n","import { api } from '@/lib/api'\n\nimport { Card } from '../types'\n\nexport function freezeCard({ id }: { id: string }) {\n return api.post(`/v1/me/cards/${id}/block`)\n}\n","import {\n ACCOUNTS_FILTER_NAME,\n IDENTITY_FILTER_NAME,\n STATUS_FILTER_NAME,\n} from '@/domains/Business/components'\nimport { api } from '@/lib/api'\n\nimport { Card } from '../types'\n\ntype SearchParams = {\n [STATUS_FILTER_NAME]?: string\n [ACCOUNTS_FILTER_NAME]?: string\n [IDENTITY_FILTER_NAME]?: string\n}\n\nexport function getAllCards(params: SearchParams = {}) {\n const searchParams = new URLSearchParams(params)\n\n const searchQuery = searchParams.size > 0 ? '?' + searchParams.toString() : ''\n\n return api.get(`/v1/me/cards/search${searchQuery}`)\n}\n","import { api } from '@/lib/api'\n\nimport { CardDelivery } from '../types'\n\nexport async function getCardDeliveryDetails({\n cardDeliveryId,\n}: {\n cardDeliveryId: string\n}) {\n return api.get(`/v1/me/card-deliveries/${cardDeliveryId}`)\n}\n","import { api } from '@/lib/api'\nimport { OTPCode } from '@/types/auth'\n\ntype GetPinRequest = {\n id: string\n} & OTPCode\n\nexport async function getCardPin({ id, otp }: GetPinRequest) {\n return api.post<{ pin: string }>(`/v1/me/physical-cards/${id}/pin`, { otp })\n}\n","import { api } from '@/lib/api'\n\ntype SecuredCardDetailsResponse = {\n encryptedCardDetails: string\n encryptedKey: string\n iv: string\n}\n\nexport async function getEncryptedCardDetails({ id }: { id: string }) {\n return api.get(`/v1/me/cards/${id}/details`)\n}\n","import { api } from '@/lib/api'\n\nimport { Card } from '../types'\n\nexport function getSingleCard({ id }: { id: string }) {\n return api.get(`/v1/me/cards/${id}`)\n}\n","import { api } from '@/lib/api'\n\ntype StoreCardEncryptionKeyRequest = {\n publicKeyPem: string\n}\n\nexport function storeCardEncryptionKey(data: StoreCardEncryptionKeyRequest) {\n return api.post(`/v1/me/card-encryption-keys`, data)\n}\n","import forge from 'node-forge'\n\nimport { sessionStorageKeys } from '@/constants/keys'\nimport { cleanupPublicKey } from '@/lib/fingerprint'\nimport { parseAdditionalDetails } from '@/lib/utils'\n\nimport { UnmaskedCard } from '../types'\n\nimport { getEncryptedCardDetails } from './getEncryptedCardDetails'\nimport { storeCardEncryptionKey } from './storeCardEncryptionKey'\n\nexport async function getUnmaskedCardDetails({ id }: { id: string }) {\n const publicKey = sessionStorage.getItem(\n sessionStorageKeys.cardsDetailsPublicKey,\n )\n\n const privateKey = sessionStorage.getItem(\n sessionStorageKeys.cardsDetailsPrivateKey,\n )\n\n if (!publicKey || !privateKey) {\n console.error('Missing public key')\n\n return\n }\n\n await storeCardEncryptionKey({\n publicKeyPem: cleanupPublicKey(publicKey),\n })\n\n const response = await getEncryptedCardDetails({ id })\n\n const { encryptedCardDetails, encryptedKey, iv } = response.data\n\n const keyAsBytes = forge.util.hexToBytes(encryptedKey)\n\n const forgedPrivateKey = forge.pki.privateKeyFromPem(privateKey ?? '')\n\n const passwordAES = forgedPrivateKey.decrypt(keyAsBytes, 'RSA-OAEP', {\n md: forge.md.sha256.create(),\n mgf1: { md: forge.md.sha1.create() },\n })\n\n const decipher = forge.cipher.createDecipher('AES-CBC', passwordAES)\n\n decipher.start({\n iv: forge.util.createBuffer(forge.util.hexToBytes(iv)).getBytes(),\n })\n\n decipher.update(\n forge.util.createBuffer(forge.util.hexToBytes(encryptedCardDetails)),\n )\n\n const result = decipher.finish()\n\n if (result) {\n return parseAdditionalDetails(decipher.output.toString())\n }\n\n return undefined\n}\n","import {\n ACCOUNTS_FILTER_NAME,\n IDENTITY_FILTER_NAME,\n STATUS_FILTER_NAME,\n} from '@/domains/Business/components'\nimport { api } from '@/lib/api'\n\nimport { Card } from '../types'\n\ntype SearchParams = {\n [STATUS_FILTER_NAME]?: string\n [ACCOUNTS_FILTER_NAME]?: string\n [IDENTITY_FILTER_NAME]?: string\n}\n\nexport function getUserCards(params: SearchParams = {}) {\n const searchParams = new URLSearchParams(params)\n\n const searchQuery = searchParams.size > 0 ? '?' + searchParams.toString() : ''\n\n return api.get(`/v1/my/cards/search${searchQuery}`)\n}\n","import { api } from '@/lib/api'\n\nimport { Card } from '../types'\n\nexport function unfreezeCard({ id }: { id: string }) {\n return api.post(`/v1/me/cards/${id}/unblock`)\n}\n","import { PaymentLimitType } from '@/domains/Business/types'\nimport { api } from '@/lib/api'\n\nimport { Card } from '../types'\n\ntype UpdateCardRequest = {\n cardId: string\n walletId?: string\n nickname?: string\n cardLimit?: {\n limitAmount: string\n limitType: PaymentLimitType\n }\n}\n\nexport function updateCard(data: UpdateCardRequest) {\n return api.patch(`/v1/me/cards`, data)\n}\n","import { Currency } from '@/constants/currency'\nimport { PaymentLimitType } from '@/domains/Business/types'\n\nimport {\n Card,\n CardDelivery,\n CardDeliveryState,\n CardState,\n CardType,\n} from '../../types'\n\nexport const CREATED_CARD: Card = {\n id: '0abd95c1-501e-4f88-92b4-3767b7f56db6',\n walletId: '0ceaf1d2-20b6-4de0-8e74-ad514f0df81c',\n businessId: 'c002df21-b54c-4ace-8f54-52b4d3a2a2bb',\n identityId: '00283379-242d-4cae-8e12-2d8fd831d9fa',\n printedUserName: 'MAKS AKYMENKO',\n nickname: 'Physical DolarApp',\n state: CardState.CREATED,\n type: CardType.PHYSICAL,\n lastFourDigits: null,\n validToMMYY: null,\n validDate: null,\n cardLimit: {\n limitAmount: 1234,\n usedAmount: 0,\n limitCurrency: Currency.USDC,\n limitType: PaymentLimitType.WEEKLY,\n periodResetDate: '2024-08-19T05:00:00',\n },\n createdAt: '2024-08-12T12:49:20.16936',\n}\n\nexport const MOCKED_CARDS: Card[] = [\n {\n id: 'ae461e3a-759a-4f03-90a8-c5e644a6adf6',\n walletId: '0ceaf1d2-20b6-4de0-8e74-ad514f0df81c',\n businessId: 'c002df21-b54c-4ace-8f54-52b4d3a2a2bb',\n identityId: '00283379-242d-4cae-8e12-2d8fd831d9fa',\n printedUserName: 'MAKS AKYMENKO',\n nickname: 'Card hehe',\n state: CardState.BLOCKED,\n type: CardType.VIRTUAL,\n lastFourDigits: '4231',\n validToMMYY: '06/27',\n validDate: '2027-06-30',\n createdAt: '2024-06-17T09:40:46.32225',\n cardLimit: {\n limitAmount: 1000,\n limitCurrency: Currency.USDC,\n limitType: PaymentLimitType.DAILY,\n periodResetDate: '2024-08-01T05:00:00',\n usedAmount: 500,\n },\n },\n {\n id: 'c6be52b9-1b0c-4d39-9ef2-cdf2bc30d54b',\n walletId: '0ceaf1d2-20b6-4de0-8e74-ad514f0df81c',\n businessId: 'c002df21-b54c-4ace-8f54-52b4d3a2a2bb',\n identityId: '00283379-242d-4cae-8e12-2d8fd831d9fa',\n printedUserName: 'MAKS AKYMENKO',\n nickname: 'Card 🤘',\n state: CardState.ACTIVE,\n type: CardType.VIRTUAL,\n lastFourDigits: '3924',\n validToMMYY: '06/27',\n validDate: '2027-06-30',\n createdAt: '2024-06-10T11:05:13.435637',\n cardLimit: {\n limitAmount: 1000,\n limitCurrency: Currency.USDC,\n limitType: PaymentLimitType.WEEKLY,\n periodResetDate: '2024-08-01T05:00:00',\n usedAmount: 500,\n },\n },\n {\n id: '20ab244e-fca0-4d6f-8e49-b7c7f32f4eba',\n walletId: '0ceaf1d2-20b6-4de0-8e74-ad514f0df81c',\n businessId: 'c002df21-b54c-4ace-8f54-52b4d3a2a2bb',\n identityId: '00283379-242d-4cae-8e12-2d8fd831d9fa',\n printedUserName: 'MAKS AKYMENKO',\n nickname: 'DolarApp Card',\n state: CardState.CREATED,\n type: CardType.VIRTUAL,\n lastFourDigits: '9860',\n validToMMYY: '06/27',\n validDate: '2027-06-30',\n createdAt: '2024-06-17T09:17:17.349145',\n cardLimit: {\n limitAmount: 1000,\n limitCurrency: Currency.USDC,\n limitType: PaymentLimitType.DAILY,\n periodResetDate: '2024-08-01T05:00:00',\n usedAmount: 500,\n },\n },\n {\n id: '4718f659-394c-42bd-b666-29248179d897',\n walletId: '0ceaf1d2-20b6-4de0-8e74-ad514f0df81c',\n businessId: 'c002df21-b54c-4ace-8f54-52b4d3a2a2bb',\n identityId: '00283379-242d-4cae-8e12-2d8fd831d9fa',\n printedUserName: 'MAKS AKYMENKO',\n nickname: 'First card',\n state: CardState.BLOCKED,\n type: CardType.VIRTUAL,\n lastFourDigits: '9761',\n validToMMYY: '06/27',\n validDate: '2027-06-30',\n createdAt: '2024-06-10T10:52:32.126804',\n cardLimit: {\n limitAmount: 1000,\n limitCurrency: Currency.USDC,\n limitType: PaymentLimitType.WEEKLY,\n periodResetDate: '2024-08-01T05:00:00',\n usedAmount: 500,\n },\n },\n {\n id: '86f50502-c77a-4386-aa90-04f6b950de26',\n walletId: '0ceaf1d2-20b6-4de0-8e74-ad514f0df81c',\n businessId: 'c002df21-b54c-4ace-8f54-52b4d3a2a2bb',\n identityId: '00283379-242d-4cae-8e12-2d8fd831d9fa',\n printedUserName: 'MAKS AKYMENKO',\n nickname: 'Second card',\n state: CardState.TERMINATED,\n type: CardType.VIRTUAL,\n lastFourDigits: '4491',\n validToMMYY: '06/27',\n validDate: '2027-06-30',\n createdAt: '2024-06-10T11:03:47.946764',\n cardLimit: {\n limitAmount: 1000,\n limitCurrency: Currency.USDC,\n limitType: PaymentLimitType.YEARLY,\n periodResetDate: '2024-08-01T05:00:00',\n usedAmount: 500,\n },\n },\n CREATED_CARD,\n]\n\nexport const MOCKED_ENCRYPTED_CARD_DETAILS: {\n encryptedCardDetails: string\n encryptedKey: string\n iv: string\n} = {\n encryptedCardDetails:\n '757e8ccb3b0498338e6ae4c339772b8d4a954902c0ec826ec7fed908f58b320b751c322969fcd73e0566c45a78fbef298db0a192882f6a1f572d12ceefff3e2d6ec8eed7a6e0beac8ad134a4500ed10b4eae6135c285a880622d8db20871c029f4e121d4df17e60a029b5d39e5bf470e7aa433588dfe5357d5c1908e161ce36642e8cf4a48da4e01b57694d143b5cd06d089222c4bc930955e689b82c153c49757e16fe873548c3fe2eb8ac9195930b9e07b1edf114c79db81ce9a2b32b5568ff287ceae2dee3b6ba0012945f0b3d54d0c415cf3235a94435e46dbcc189918e84206b824d270652d41bf6cac505f31841ce451e78483cc5847c5375732903e248e95603a95c5e3ec7866eb8747f39d0e9df6e42b5a41f52bdfddf3ca9ec4eeab8dedd692253a6e3bc93c2e3def1734c057cc30577e3dcf32dae2fb74234f7101fa056addc7fe74be783be9f8a66e711d137031beb1f173dd857cdd4721116888ccd82b9d2b40d287307a42ca5044ef8ca3f670c32e099a81c678c90c45f4807f0598540cb5043920bfe438b4810f59d2c2a0d4f52544dde567419e197f756f70d2c4d404e86cd9264424fd84c43020c2db91b10fce0a1e2342e49af27c3884426a17be09886ffeda4318b859ca823543eb3f901e50f570af9242fb6a1f19d536',\n encryptedKey:\n '4a214a8896e0a42f2a3324c9585ad7c8b2a10bde0613ae1413fe53b51d7bb7e2f13bf7f39946656d55bff72ef40f1f73ec66e1dc0146b8e63366144675d5fc694e16df1f0932814757cdb811553e9c03b37ab549524d5c34a07696ec60b51de8bb2aafd4e699b32cf1afd431f1dd703700c025ddbc5966b429e3913aaabffdd1f59c1400874ed729f03138555fdc3b156f6ea190d6284f886af0f4c48064e34fd141c5ed957b2ab2a414e64f1efb4cbad71c4dbfe9f901f0b082ac4273845cc77d18cdc0b926a3235064f37161aa055dbb33cba78a8da1f51f7bd4b3d831a881b37850135413986140ee0426fb97f17067c9ef84c6108387bfa4f607bb24d84f',\n iv: '21f6022389b648f4c349214a6fa7350f',\n}\n\nexport const MOCKED_CARD_DELIVERY: CardDelivery = {\n id: '9b2a47af-bc78-40bc-bb5e-37e32d06e18b',\n cardId: 'd73b3637-799d-4daf-9992-ab6363a5b34a',\n street: 'Calle Reforma',\n streetNumber: '123',\n neighborhood: 'Centro',\n city: 'Ciudad de Mexico',\n country: 'Mexico',\n postcode: '01000',\n state: 'CDMX',\n status: CardDeliveryState.SHIPPED,\n createdAt: '2024-08-19T10:14:43.115284',\n updatedAt: '2024-08-19T10:14:43.11529',\n courierCompany: 'NINENTY_MINUTOS_COURIER_NAME',\n courierTrackingId: '8574745',\n courierLocation: '99.242',\n courierLocationType: '99 MINUTOS',\n courierType: 'Geo',\n externalCourierTrackingId: '12515',\n externalCourierTrackingUrl: 'http://example.com',\n}\n\nexport const MOCKED_PUBLIC_RSA_KEY = `-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAkRaVVBolfPbSyK9AhmyH\nTpjopOv2BS1GFOPoxc+iP0u7WQ5NwuLvYPKjnYtK/3kNYblUvvObUh1xJqo6koSk\nIhztRUAz3PwLdniVN4bx3WsMYm53y/RolvTiqERCE6xIPvKi874GOPl9iI6MsX98\nYnSoLldjk3itMp7NhSqbzUPeeitVYGcN1DxvYdV7VaTqGd6jDbLUH83bmH0M93h4\npolYYZnsmikNyO2guM+ntAzDO9vJAAxOLOsiL2OunKoQwBUFoNHzYVp0KyrRX7Jy\nBR8W4iZXDX9RdBpoUTKff267heN9gWV+wUBEPoxkc9UqB/bg+fVh4q35MX4lY0wH\ncwIDAQAB\n-----END PUBLIC KEY-----`\n\nexport const MOCKED_PRIVATE_RSA_KEY = `-----BEGIN RSA PRIVATE KEY-----\nMIIEpAIBAAKCAQEAkRaVVBolfPbSyK9AhmyHTpjopOv2BS1GFOPoxc+iP0u7WQ5N\nwuLvYPKjnYtK/3kNYblUvvObUh1xJqo6koSkIhztRUAz3PwLdniVN4bx3WsMYm53\ny/RolvTiqERCE6xIPvKi874GOPl9iI6MsX98YnSoLldjk3itMp7NhSqbzUPeeitV\nYGcN1DxvYdV7VaTqGd6jDbLUH83bmH0M93h4polYYZnsmikNyO2guM+ntAzDO9vJ\nAAxOLOsiL2OunKoQwBUFoNHzYVp0KyrRX7JyBR8W4iZXDX9RdBpoUTKff267heN9\ngWV+wUBEPoxkc9UqB/bg+fVh4q35MX4lY0wHcwIDAQABAoIBAHqg+9X5w3W7qKy2\nc3Mqh7KGyxuZ1HbLrVA60aNfu2KEP/UlgdQWuvzWGDQwZ1NGnWjbnCVJAR6Gg/yK\nJLdyJMgwatr9SNier5GSmYw1Inhi4jTP6bEZAs2UbX6LMs4t72JE8jXRhrDhLpkc\n4w2jEx6kOwHwGtmqRbljP5IuUUFLr+mBe6Vh3QK+0Kht/xzjHbylJKZ5+ZOtzbx3\nkT+zjx4o/9fBKgc07H8U72FI3g99e6nyCUtYZxa+TCEBbfc4Haxq1+ONRrpzbGu0\neu6KwEAKGc+yMrortpKJOMsYiEzjCcOM94aESBJ95bGP2bvTDagx8E12PusZCFnG\n2TPMaAECgYEA6hDXRjo98Q090/oAYSlN9BQCibK95Alv7WBleoXgcsZXNK6IXYGv\ndOnylUfogiSMuTVDPUkQ/e5gQFAEs+AB6ZBwfVBVD2gFzdB5kctu4/dlFBpRt/uW\nkIgllLywv1GVjeH/UsCuzTsC2Ac0WCP+HikrKcE4t2HNGN3EsOizDuECgYEAnq8z\nWfNMJtAJBIXcUGYnqR7XEJN1KNCHL4oltMt9VYHgqRgS4bprwI+0SSgtGjVOl4YD\n03RGW2n/aE8dPxjD3C8o4Bhpw9iGmvh9AxPeLlFpu/gismL1/Iev21MPK5QjBPCK\ntyjZO4y4NWzH8x3LK9Y4TXtn3fajHZ1ztd8jRNMCgYEA192KPDlQkPQuVkXVfcYT\nH4wovwd6e0l80UY6sKGxWwiyumJQXzRQNZng4G3977B3nAOULHwrUJU8bXOesqlf\n+iD8rYWdvOSpnaOrypr8fP/XV4/iV7SOqmL1jdPribZbIAwSZiZPz/ShbcxPKQ6g\nuP4s0YhinzVyaoF0eddR8+ECgYAf6aQuJtvdwmDN5A3WrXS0cltWHhGlz6ogSWwj\n2/isxZ3k486ITvF0nHHpdIb9ilLv7ie+0teDcuHGnIKJOfXJxkI2LzK2DEmlyOt7\nPvej4QOepdx0e6p0yuT2+tFGNliEmcuL4k8txrMVK3da0VcWzdIs4vCUlxFe11d5\n8BIruQKBgQDnJl/s8R4csKdjN8jwz8GtjBe8R5Jnnylcg5Iek1knjNuYFi60ry7z\nwGn1DRMM+A3RBGXEcg+ht/T2pNcbQItO7pWUgFu344UzSs7AekUs0ozPzOgsnbxu\nbCdc74HHx2P7Kzk6SqHecmP7KglcXaAqYEFAwO7H/BuCn5KXlABCJA==\n-----END RSA PRIVATE KEY-----`\n","import { http, HttpResponse } from 'msw'\n\nimport { BASE_API_DEV } from '@/constants/urls'\n\nimport {\n CREATED_CARD,\n MOCKED_CARD_DELIVERY,\n MOCKED_CARDS,\n MOCKED_ENCRYPTED_CARD_DETAILS,\n} from './cards.mocks'\n\nexport const cardsHandlers = [\n http.get(`${BASE_API_DEV}/v1/me/cards/search`, async () => {\n return HttpResponse.json(MOCKED_CARDS)\n }),\n\n http.get(`${BASE_API_DEV}/v1/me/cards/:id`, async ({ params }) => {\n const { id } = params\n\n const card = MOCKED_CARDS.find((card) => card.id === id)\n\n if (!card) {\n return HttpResponse.json(MOCKED_CARDS[0])\n }\n\n return HttpResponse.json(card)\n }),\n\n http.post(`${BASE_API_DEV}/v1/me/virtual-cards`, async () => {\n return HttpResponse.json(MOCKED_CARDS[0])\n }),\n http.post(`${BASE_API_DEV}/v1/me/physical-cards`, async () => {\n return HttpResponse.json(CREATED_CARD)\n }),\n\n http.post(`${BASE_API_DEV}/v1/me/card-encryption-keys`, async () => {\n return HttpResponse.json({})\n }),\n\n http.get(`${BASE_API_DEV}/v1/me/cards/:id/details`, async () => {\n return HttpResponse.json(MOCKED_ENCRYPTED_CARD_DETAILS)\n }),\n\n http.post(`${BASE_API_DEV}/v1/me/cards/:id/unblock`, async () => {\n return HttpResponse.json(MOCKED_CARDS[0])\n }),\n\n http.post(`${BASE_API_DEV}/v1/me/cards/:id/block`, async () => {\n return HttpResponse.json(MOCKED_CARDS[0])\n }),\n\n http.post(`${BASE_API_DEV}/v1/me/cards/:id/terminate`, async () => {\n return HttpResponse.json(MOCKED_CARDS[0])\n }),\n\n http.get(`${BASE_API_DEV}/v1/me/card-deliveries/:id`, async () => {\n return HttpResponse.json(MOCKED_CARD_DELIVERY)\n }),\n\n http.post(`${BASE_API_DEV}/v1/me/physical-cards/:id/pin`, async () => {\n return HttpResponse.json({ pin: '1111' })\n }),\n http.post(`${BASE_API_DEV}/v1/me/physical-cards/:id/activate`, async () => {\n return HttpResponse.json(MOCKED_CARDS[0])\n }),\n http.patch(`${BASE_API_DEV}/v1/me/cards`, async () => {\n return HttpResponse.json(MOCKED_CARDS[0])\n }),\n]\n\nexport * from './cards.mocks'\n","import { useQuery } from '@tanstack/react-query'\nimport { FormattedMessage } from 'react-intl'\nimport { useNavigate } from 'react-router'\n\nimport { BusinessRoute } from '@/constants/paths'\nimport { queryKeys } from '@/constants/queryKeys'\nimport { getAnimationKey } from '@/lib/utils'\nimport { Widget } from '@/shared/components'\nimport { DataTable, MotionDiv } from '@/shared/ui'\n\nimport { getAllCards } from '../../features/Cards/api'\nimport { TeamMember, TeamState } from '../../features/Team/types'\nimport { useTeamCardsColumns } from '../CardsTable'\nimport { IDENTITY_FILTER_NAME } from '../Filters'\n\nexport type Props = {\n member?: TeamMember\n}\n\nexport const TeamCardsTable = ({ member }: Props) => {\n const navigate = useNavigate()\n const columns = useTeamCardsColumns()\n const isBlockedOrTerminated =\n member?.state === TeamState.BLOCKED ||\n member?.state === TeamState.TERMINATED\n\n const allCardsQuery = useQuery({\n queryKey: [queryKeys.getAllCards, member?.identityId],\n queryFn: () =>\n getAllCards({\n [IDENTITY_FILTER_NAME]: member?.identityId,\n }),\n select: (data) => data?.data,\n enabled: !!member?.identityId,\n })\n\n if (!allCardsQuery.data?.length) {\n return null\n }\n\n return (\n \n }\n className=\"bg-transparent p-0\"\n >\n {\n navigate(`${BusinessRoute.Cards}?id=${card.id}`)\n }}\n />\n \n \n )\n}\n","import { useMutation } from '@tanstack/react-query'\nimport { FormattedMessage, useIntl } from 'react-intl'\nimport { toast } from 'sonner'\n\nimport { useErrorToast } from '@/hooks/useErrorToast'\nimport { Button, Card, MotionDiv, Typography } from '@/shared/ui'\n\nimport { sendTeamMemberInviteReminder } from '../../features/Team/api'\nimport { TeamMember, TeamState } from '../../features/Team/types'\n\ntype Props = {\n member?: TeamMember\n}\n\nexport const TeamMemberInviteSection = ({ member }: Props) => {\n const intl = useIntl()\n const notifyError = useErrorToast()\n const { mutateAsync, isPending } = useMutation({\n mutationFn: sendTeamMemberInviteReminder,\n })\n\n if (member?.state !== TeamState.INVITED) {\n return null\n }\n\n const onSendReminder = async () => {\n try {\n await mutateAsync({\n id: member.id,\n })\n\n toast.success(\n intl.formatMessage({\n id: 'team.member.reminder.success',\n defaultMessage: 'Invitation reminder sent successfully',\n }),\n )\n } catch (error) {\n notifyError(error)\n }\n }\n\n return (\n \n \n
\n \n \n \n \n \n \n
\n\n \n \n \n
\n
\n )\n}\n","import { useMutation } from '@tanstack/react-query'\nimport { FormattedMessage, useIntl } from 'react-intl'\nimport { toast } from 'sonner'\n\nimport { queryKeys } from '@/constants/queryKeys'\nimport { useErrorToast } from '@/hooks/useErrorToast'\nimport { queryClient } from '@/lib/queryClient'\nimport { getFullName } from '@/lib/typography'\nimport {\n Button,\n Dialog,\n DialogActions,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from '@/shared/ui'\n\nimport { unblockTeamMember } from '../../features/Team/api'\nimport { TeamMember } from '../../features/Team/types'\n\ntype Props = {\n isOpen: boolean\n member?: TeamMember\n onOpenChange: (isOpen: boolean) => void\n}\n\nexport const UnblockTeamMemberDialog = ({\n isOpen,\n member,\n onOpenChange,\n}: Props) => {\n const notifyError = useErrorToast()\n const intl = useIntl()\n\n const { mutateAsync, isPending, isSuccess } = useMutation({\n mutationFn: unblockTeamMember,\n })\n\n const onUnblockTeamMember = async () => {\n if (!member?.id) {\n toast.error(\n intl.formatMessage({\n id: 'team.member.details.error.missingId',\n defaultMessage: 'Missing team member ID',\n }),\n )\n return\n }\n\n try {\n await mutateAsync({ id: member.id })\n\n await queryClient.invalidateQueries({\n queryKey: [queryKeys.getTeamMembers],\n })\n\n await queryClient.invalidateQueries({\n queryKey: [queryKeys.getTeamMember, member?.id],\n })\n\n onOpenChange(false)\n\n toast.success(\n intl.formatMessage({\n id: 'team.member.details.unblocked',\n defaultMessage: 'Team member unblocked',\n }),\n )\n } catch (error) {\n notifyError(error)\n }\n }\n\n return (\n <>\n \n \n \n \n \n \n\n
\n \n \n \n\n \n \n \n
\n
\n\n
\n\n \n onOpenChange(false)}\n disabled={isPending || isSuccess}\n variant=\"secondary\"\n >\n \n \n onUnblockTeamMember()}\n >\n \n \n \n \n
\n \n )\n}\n","import { useState } from 'react'\nimport { FormattedMessage } from 'react-intl'\n\nimport { Button, Card, MotionDiv, Typography } from '@/shared/ui'\n\nimport { TeamMember, TeamState } from '../../features/Team/types'\n\nimport { UnblockTeamMemberDialog } from './UnblockTeamMemberDialog'\n\ntype Props = {\n member?: TeamMember\n}\n\nexport const TeamMemberUnblockSection = ({ member }: Props) => {\n const [showUnblockDialog, setShowUnblockDialog] = useState(false)\n\n if (member?.state !== TeamState.BLOCKED) {\n return null\n }\n\n return (\n <>\n \n \n
\n \n \n \n \n \n \n
\n\n \n
\n
\n\n setShowUnblockDialog(isOpen)}\n />\n \n )\n}\n","import { useMemo } from 'react'\nimport { useQueries } from '@tanstack/react-query'\nimport { AxiosResponse } from 'axios'\nimport { FormattedDate, FormattedMessage } from 'react-intl'\n\nimport { queryKeys } from '@/constants/queryKeys'\nimport { calculateProgress, formatAmount, formatMoney } from '@/lib/money'\nimport { cn } from '@/lib/utils'\nimport { Widget } from '@/shared/components'\nimport { MotionDiv, Progress, Typography } from '@/shared/ui'\n\nimport {\n getPaymentLimit,\n getTeamMemberPaymentLimit,\n} from '../../features/Team/api'\nimport {\n TeamMember,\n TeamMemberPaymentLimit,\n TeamState,\n} from '../../features/Team/types'\nimport { useBusinessRole } from '../../hooks'\n\ntype Props = {\n member?: TeamMember\n}\n\nexport const TeamMoneyLimit = ({ member }: Props) => {\n const isBlockedOrTerminated =\n member?.state === TeamState.BLOCKED ||\n member?.state === TeamState.TERMINATED\n\n const { isAdmin } = useBusinessRole()\n const [teamMemberPaymentLimitQuery, userPaymentLimitQuery] = useQueries({\n queries: [\n {\n queryKey: [queryKeys.getTeamMemberPaymentLimit, member?.id],\n queryFn: () => getTeamMemberPaymentLimit({ id: member?.id ?? '' }),\n select: (data: AxiosResponse) => data.data,\n enabled: isAdmin && !!member?.id,\n },\n {\n queryKey: [queryKeys.getPaymentLimit],\n queryFn: () => getPaymentLimit(),\n select: (data: AxiosResponse) => data.data,\n enabled: !isAdmin && !!member?.id,\n },\n ],\n })\n\n const userPaymentLimit = useMemo(() => {\n if (teamMemberPaymentLimitQuery.data) {\n return teamMemberPaymentLimitQuery.data\n }\n\n if (userPaymentLimitQuery.data) {\n return userPaymentLimitQuery.data\n }\n\n return null\n }, [teamMemberPaymentLimitQuery.data, userPaymentLimitQuery.data])\n\n if (!userPaymentLimit?.periodTransferLimit || !member) {\n return null\n }\n\n return (\n \n \n }\n className={cn(\n 'flex flex-col gap-1',\n isBlockedOrTerminated && 'pointer-events-none bg-neutral-gray-200',\n )}\n >\n
\n \n {formatMoney(userPaymentLimit.periodTransferLimit.usedAmount)}\n \n \n {formatMoney(userPaymentLimit.periodTransferLimit.limitAmount)} /{' '}\n \n \n
\n \n\n
\n {userPaymentLimit.singleTransferLimit ? (\n \n \n \n ) : null}\n \n \n ),\n }}\n />\n \n
\n \n
\n )\n}\n","import { useState } from 'react'\nimport { FormattedMessage, useIntl } from 'react-intl'\n\nimport { getFullName, intersperse } from '@/lib/typography'\nimport { StatusBadge, StatusVariant } from '@/shared/components'\nimport { CircleCancel, Pencil } from '@/shared/icons/outline'\nimport {\n Avatar,\n Badge,\n Button,\n MotionDiv,\n Skeleton,\n SlideInLeft,\n Typography,\n} from '@/shared/ui'\n\nimport { TeamMember, TeamState } from '../../features/Team/types'\nimport { useBusinessRole, useBusinessUser } from '../../hooks'\n\nimport { BlockTeamMemberDialog } from './BlockTeamMemberDialog'\nimport { PermissionsList } from './PermissionsList'\nimport { TeamCardsTable } from './TeamCardsTable'\nimport { TeamMemberInviteSection } from './TeamMemberInviteSection'\nimport { TeamMemberUnblockSection } from './TeamMemberUnblockSection'\nimport { TeamMoneyLimit } from './TeamMoneyLimit'\n\nconst sidebarBadgeVariantByTeamStatus: Record = {\n [TeamState.ACTIVE]: 'active',\n [TeamState.INVITED]: 'neutral-dark',\n [TeamState.BLOCKED]: 'neutral-dark',\n [TeamState.TERMINATED]: 'failed',\n}\n\ntype Props = {\n member?: TeamMember\n setScreen: (screen: 'base' | 'edit') => void\n}\n\nexport const BaseTeamDetails = ({ member, setScreen }: Props) => {\n const intl = useIntl()\n\n const { isAdmin } = useBusinessRole()\n const businessUser = useBusinessUser()\n\n const [showBlockDialog, setShowBlockDialog] = useState(false)\n\n const isUser = member?.identityId === businessUser?.identityId\n\n return (\n \n {member ? (\n \n
\n
\n \n
\n {getFullName(member)}\n\n \n {intersperse([member.userTitle, member.email], ' • ')}\n \n
\n
\n\n
\n\n
\n \n \n \n \n }\n />\n
\n
\n\n {isAdmin && member?.state !== TeamState.TERMINATED && (\n
\n {!isUser && (\n }\n onClick={() => setShowBlockDialog(true)}\n variant=\"tertiary\"\n size=\"icon\"\n aria-label={intl.formatMessage({\n id: 'team.details.blockTeamMember',\n defaultMessage: 'Block team member',\n })}\n />\n )}\n }\n onClick={() => setScreen('edit')}\n variant=\"tertiary\"\n size=\"icon\"\n aria-label={intl.formatMessage({\n id: 'team.details.edit',\n defaultMessage: 'Edit team member',\n })}\n />\n
\n )}\n \n ) : (\n
\n
\n \n \n\n
\n \n \n
\n
\n\n
\n \n \n
\n
\n )}\n\n \n\n \n\n \n\n \n\n \n\n {\n setScreen('base')\n }}\n />\n\n
\n \n )\n}\n","import { useState } from 'react'\nimport { useMutation } from '@tanstack/react-query'\nimport { FormattedMessage, useIntl } from 'react-intl'\nimport { toast } from 'sonner'\n\nimport { queryKeys } from '@/constants/queryKeys'\nimport { useErrorToast } from '@/hooks/useErrorToast'\nimport { queryClient } from '@/lib/queryClient'\nimport { getFullName } from '@/lib/typography'\nimport { DeleteDialog } from '@/shared/components'\nimport { Button } from '@/shared/ui'\n\nimport { deleteTeamMember } from '../../features/Team/api'\nimport { TeamMember } from '../../features/Team/types'\n\ntype Props = {\n isPending?: boolean\n onDelete: () => void\n member?: TeamMember\n}\n\nexport const DeleteTeamMemberAction = ({\n isPending,\n onDelete,\n member,\n}: Props) => {\n const [isDeleting, setIsDeleting] = useState(false)\n\n const notifyError = useErrorToast()\n const intl = useIntl()\n\n const {\n mutateAsync,\n isPending: deleteIsPending,\n isSuccess,\n } = useMutation({\n mutationFn: deleteTeamMember,\n })\n\n const onDeleteTeamMember = async () => {\n if (!member?.id) {\n toast.error(\n intl.formatMessage({\n id: 'team.member.details.error.missingId',\n defaultMessage: 'Missing team member ID',\n }),\n )\n return\n }\n\n try {\n await mutateAsync({ id: member.id })\n\n await queryClient.invalidateQueries({\n queryKey: [queryKeys.getTeamMembers],\n })\n\n await queryClient.invalidateQueries({\n queryKey: [queryKeys.getTeamMember, member?.id],\n })\n\n setIsDeleting(false)\n\n toast.success(\n intl.formatMessage({\n id: 'team.member.details.terminated',\n defaultMessage: 'Team member terminated',\n }),\n )\n\n onDelete()\n } catch (error) {\n notifyError(error)\n }\n }\n\n return (\n <>\n setIsDeleting(true)}\n type=\"button\"\n variant=\"ghost\"\n className=\"text-primary-error\"\n >\n \n \n\n onDeleteTeamMember()}\n title={\n \n }\n description={\n \n }\n descriptionAdditional={\n \n }\n />\n \n )\n}\n","import { FormattedMessage } from 'react-intl'\n\nimport { useFeature } from '@/domains/Business/hooks'\nimport {\n MotionDiv,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Typography,\n} from '@/shared/ui'\n\nimport { Feature, Role } from '../../../types'\n\ntype Props = {\n disabled?: boolean\n value?: string\n onChange: (v: string) => void\n}\n\nexport const RoleSelectField = ({ disabled, onChange, value }: Props) => {\n const { isEnabled: hasCardsFeature } = useFeature(Feature.CARDS)\n\n const enabledRoles = hasCardsFeature\n ? Object.values(Role)\n : Object.values(Role).filter((role) => role !== Role.CARD_USER)\n\n return (\n \n )\n}\n","import { FormattedMessage } from 'react-intl'\n\nimport {\n MotionDiv,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Typography,\n} from '@/shared/ui'\n\nimport { MovementPermission } from '../../../features/Team/types'\n\ntype Props = {\n disabled?: boolean\n value?: string\n onChange: (v: string) => void\n}\n\nexport const MoneyMovementSelectField = ({\n disabled,\n onChange,\n value,\n}: Props) => {\n return (\n \n )\n}\n","import { useCallback } from 'react'\nimport { zodResolver } from '@hookform/resolvers/zod'\nimport { useMutation, useQuery } from '@tanstack/react-query'\nimport { Big } from 'big.js'\nimport { AnimatePresence } from 'framer-motion'\nimport { SubmitHandler, useForm } from 'react-hook-form'\nimport { FormattedMessage, useIntl } from 'react-intl'\nimport { toast } from 'sonner'\nimport { z } from 'zod'\n\nimport { queryKeys } from '@/constants/queryKeys'\nimport { useErrorToast } from '@/hooks/useErrorToast'\nimport { queryClient } from '@/lib/queryClient'\nimport { getFullName } from '@/lib/typography'\nimport { removeEmptyFormFields } from '@/lib/utils'\nimport { AmountInput, OptionalTag, Widget } from '@/shared/components'\nimport {\n AnimatedFormLabel,\n Breadcrumb,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbList,\n BreadcrumbSeparator,\n Button,\n Form,\n FormControl,\n FormField,\n FormItem,\n Input,\n MotionDiv,\n Skeleton,\n SlideInLeft,\n StickyContainer,\n Typography,\n} from '@/shared/ui'\n\nimport {\n editTeamMemberDetails,\n getTeamMemberPaymentLimit,\n} from '../../features/Team/api'\nimport {\n LimitPeriodType,\n MovementPermission,\n TeamMember,\n} from '../../features/Team/types'\nimport { Role } from '../../types'\nimport { LimitTypeSelect } from '../LimitTypeSelect'\n\nimport { DeleteTeamMemberAction } from './DeleteTeamMemberAction'\nimport {\n MoneyMovementSelectField,\n RoleSelectField,\n} from './EditTeamMemberFields'\n\nconst EDIT_TEAM_MEMBER_FORM = `edit-team-member-form`\n\nconst editTeamMemberSchema = z\n .object({\n role: z.nativeEnum(Role),\n limitTypePeriod: z.string().optional(),\n moneyMovementPermissions: z.string().optional(),\n periodTransferLimitAmount: z.string().optional(),\n singleTransferLimitAmount: z.string().optional(),\n firstName: z.string().min(1, { message: 'validation.firstName.required' }),\n lastName: z.string().min(1, { message: 'validation.lastName.required' }),\n secondLastName: z.string().optional(),\n userTitle: z.string().optional(),\n email: z.string().email({ message: 'validation.email.required' }),\n })\n .refine(\n (data) => {\n const {\n periodTransferLimitAmount = '0',\n role,\n singleTransferLimitAmount = '0',\n moneyMovementPermissions,\n } = data\n\n if (role !== Role.PAYMENT_OPS) {\n return true\n }\n\n if (\n role === Role.PAYMENT_OPS &&\n moneyMovementPermissions !==\n MovementPermission.REQUIRE_APPROVAL_ABOVE_THE_LIMIT\n ) {\n return true\n }\n\n if (\n singleTransferLimitAmount === '0' &&\n periodTransferLimitAmount === '0'\n ) {\n return false\n }\n\n if (\n Big(\n singleTransferLimitAmount === '' ? 0 : singleTransferLimitAmount,\n ).gt(periodTransferLimitAmount === '' ? 0 : periodTransferLimitAmount)\n ) {\n return false\n }\n\n return true\n },\n {\n message: 'validation.singleTransactionLimit.greaterThanCycleLimit',\n path: ['singleTransferLimitAmount'],\n },\n )\n .refine(\n (data) => {\n const {\n role,\n singleTransferLimitAmount = '0',\n moneyMovementPermissions,\n } = data\n\n if (role !== Role.PAYMENT_OPS) {\n return true\n }\n\n if (\n role === Role.PAYMENT_OPS &&\n moneyMovementPermissions !==\n MovementPermission.REQUIRE_APPROVAL_ABOVE_THE_LIMIT\n ) {\n return true\n }\n\n return Big(\n singleTransferLimitAmount === '' ? 0 : singleTransferLimitAmount,\n ).gt(0)\n },\n {\n message: 'validation.balance.minAmount',\n path: ['singleTransferLimitAmount'],\n },\n )\n .refine(\n (data) => {\n const {\n role,\n periodTransferLimitAmount = '0',\n moneyMovementPermissions,\n } = data\n\n if (role !== Role.PAYMENT_OPS) {\n return true\n }\n\n if (\n role === Role.PAYMENT_OPS &&\n moneyMovementPermissions !==\n MovementPermission.REQUIRE_APPROVAL_ABOVE_THE_LIMIT\n ) {\n return true\n }\n\n return Big(\n periodTransferLimitAmount === '' ? 0 : periodTransferLimitAmount,\n ).gt(0)\n },\n {\n message: 'validation.balance.minAmount',\n path: ['periodTransferLimitAmount'],\n },\n )\n .refine((data) => {\n const { role, moneyMovementPermissions } = data\n\n if (role !== Role.PAYMENT_OPS) {\n return true\n }\n\n return moneyMovementPermissions !== ''\n })\n .refine(\n (data) => {\n const { role, moneyMovementPermissions, limitTypePeriod } = data\n\n if (role !== Role.PAYMENT_OPS) {\n return true\n }\n\n if (\n moneyMovementPermissions ===\n MovementPermission.REQUIRE_APPROVAL_ABOVE_THE_LIMIT\n ) {\n return limitTypePeriod !== ''\n }\n\n return true\n },\n {\n message: 'validation.balance.minAmount',\n path: ['limitPeriodType'],\n },\n )\n\ntype EditTeamMemberSchema = z.infer\n\ntype Props = {\n member?: TeamMember\n setScreen: (screen: 'base' | 'edit') => void\n}\n\nexport const EditTeamDetails = ({ member, setScreen }: Props) => {\n const paymentLimitQuery = useQuery({\n queryKey: [queryKeys.getTeamMemberPaymentLimit, member?.id],\n queryFn: () => getTeamMemberPaymentLimit({ id: member?.id ?? '' }),\n select: (data) => data.data,\n })\n\n const intl = useIntl()\n const notifyError = useErrorToast()\n\n const {\n mutateAsync: editTeamMember,\n isPending: editPending,\n isSuccess: editSuccess,\n } = useMutation({\n mutationFn: editTeamMemberDetails,\n })\n\n const form = useForm({\n mode: 'onChange',\n resolver: zodResolver(editTeamMemberSchema),\n values: {\n role: member?.role ?? ('' as Role),\n email: member?.email ?? '',\n firstName: member?.firstName ?? '',\n lastName: member?.lastName ?? '',\n secondLastName: member?.secondLastName ?? '',\n userTitle: member?.userTitle ?? '',\n moneyMovementPermissions:\n paymentLimitQuery.data?.type === MovementPermission.NO_LIMIT\n ? ''\n : paymentLimitQuery.data?.type,\n limitTypePeriod:\n paymentLimitQuery.data?.periodTransferLimit?.limitType ?? '',\n periodTransferLimitAmount: paymentLimitQuery.data?.periodTransferLimit\n ?.limitAmount\n ? Big(\n paymentLimitQuery.data?.periodTransferLimit?.limitAmount,\n ).toString()\n : '',\n singleTransferLimitAmount: paymentLimitQuery.data?.singleTransferLimit\n ?.limitAmount\n ? Big(\n paymentLimitQuery.data?.singleTransferLimit?.limitAmount,\n ).toString()\n : '',\n },\n })\n\n const isPending = editPending || editSuccess\n\n const onEditTeamMember = useCallback(\n async (data: EditTeamMemberSchema) => {\n if (!member?.id) {\n toast.error(\n intl.formatMessage({\n id: 'team.member.details.error.missingId',\n defaultMessage: 'Missing team member ID',\n }),\n )\n return\n }\n\n removeEmptyFormFields(data)\n\n const {\n role,\n firstName,\n lastName,\n secondLastName,\n userTitle,\n ...moneyMovement\n } = data\n\n try {\n await editTeamMember({\n id: member?.id,\n role,\n firstName,\n lastName,\n secondLastName,\n userTitle,\n transferPermissions: moneyMovement.moneyMovementPermissions\n ? {\n type: moneyMovement.moneyMovementPermissions as MovementPermission,\n limitPeriodType:\n moneyMovement.limitTypePeriod as LimitPeriodType,\n periodTransferLimitAmount:\n moneyMovement.periodTransferLimitAmount,\n singleTransferLimitAmount:\n moneyMovement.singleTransferLimitAmount,\n }\n : undefined,\n })\n\n await queryClient.invalidateQueries({\n queryKey: [queryKeys.getTeamMembers],\n })\n\n await queryClient.invalidateQueries({\n queryKey: [queryKeys.getTeamMemberPaymentLimit, member?.id],\n })\n\n await queryClient.invalidateQueries({\n queryKey: [queryKeys.getTeamMember, member?.id],\n })\n\n toast.success(\n intl.formatMessage({\n id: 'team.member.details.updated',\n defaultMessage: 'Team member details updated',\n }),\n )\n\n setScreen('base')\n } catch (error) {\n notifyError(error)\n }\n },\n [member?.id, intl, editTeamMember, setScreen, notifyError],\n )\n\n const onSubmit: SubmitHandler = async (data) => {\n onEditTeamMember(data)\n }\n\n const showMoneyMovementFields = form.watch('role') === Role.PAYMENT_OPS\n\n const showPaymentOpsFields = !!(\n form.watch('role') === Role.PAYMENT_OPS &&\n form.watch('moneyMovementPermissions') ===\n MovementPermission.REQUIRE_APPROVAL_ABOVE_THE_LIMIT\n )\n\n return (\n \n \n \n \n setScreen('base')}\n variant=\"ghost\"\n size=\"inline\"\n >\n {member ? (\n {getFullName(member)}\n ) : (\n \n )}\n \n \n\n \n\n \n \n \n \n \n \n \n\n
\n\n
\n \n \n }\n variant=\"form\"\n >\n (\n \n {\n if (value !== Role.PAYMENT_OPS) {\n form.resetField('periodTransferLimitAmount', {\n defaultValue: '',\n keepError: false,\n })\n form.resetField('singleTransferLimitAmount', {\n defaultValue: '',\n keepError: false,\n })\n form.resetField('moneyMovementPermissions', {\n defaultValue: '',\n })\n form.resetField('limitTypePeriod', {\n defaultValue: '',\n })\n }\n\n field.onChange(value)\n }}\n value={field.value}\n />\n \n )}\n />\n\n \n {showMoneyMovementFields ? (\n \n (\n \n {\n if (\n v !==\n MovementPermission.REQUIRE_APPROVAL_ABOVE_THE_LIMIT\n ) {\n form.resetField('periodTransferLimitAmount', {\n defaultValue: '',\n keepError: false,\n })\n form.resetField('singleTransferLimitAmount', {\n defaultValue: '',\n keepError: false,\n })\n form.resetField('limitTypePeriod', {\n defaultValue: '',\n })\n }\n\n field.onChange(v)\n }}\n value={field.value}\n />\n \n )}\n />\n \n ) : null}\n \n\n \n {showPaymentOpsFields ? (\n \n (\n \n {\n field.onChange(v)\n }}\n />\n \n )}\n />\n\n (\n \n \n \n )}\n />\n\n (\n \n \n \n )}\n />\n \n ) : null}\n \n \n\n \n }\n variant=\"form\"\n >\n (\n \n \n \n \n \n \n \n \n )}\n />\n\n (\n \n \n \n \n \n \n \n \n )}\n />\n\n (\n \n \n \n \n \n \n \n\n {field.value === '' && }\n \n )}\n />\n\n (\n \n \n \n \n \n \n \n\n {field.value === '' && }\n \n )}\n />\n\n (\n \n \n \n \n \n \n \n \n )}\n />\n \n \n \n\n \n \n \n \n\n {\n setScreen('base')\n }}\n />\n \n \n )\n}\n","import { useEffect, useState } from 'react'\n\nimport { Sheet, SheetContent } from '@/shared/ui'\n\nimport { TeamMember } from '../../features/Team/types'\n\nimport { BaseTeamDetails } from './BaseTeamDetails'\nimport { EditTeamDetails } from './EditTeamDetails'\n\ntype ScreenType = 'base' | 'edit'\n\ntype Props = {\n isOpen: boolean\n onOpenChange: (isOpen: boolean) => void\n member?: TeamMember\n}\n\nexport const TeamDetailsSidebar = ({ isOpen, onOpenChange, member }: Props) => {\n const [screen, setScreen] = useState('base')\n\n useEffect(() => {\n if (!isOpen) {\n setScreen('base')\n }\n }, [isOpen])\n\n return (\n \n \n {(() => {\n switch (screen) {\n case 'base':\n return \n\n case 'edit':\n return \n\n default:\n return null\n }\n })()}\n \n \n )\n}\n","import { useEffect, useState } from 'react'\nimport { useQueries } from '@tanstack/react-query'\nimport { AxiosResponse } from 'axios'\nimport { AnimatePresence, motion } from 'framer-motion'\nimport { FormattedMessage } from 'react-intl'\n\nimport { navMessages } from '@/constants/paths'\nimport { queryKeys } from '@/constants/queryKeys'\nimport { getFirstLetter, getFullName } from '@/lib/typography'\nimport { cn } from '@/lib/utils'\nimport { SwitchLanguageTooltip } from '@/shared/components'\nimport {\n ChevronDown,\n Logout,\n SettingsAdjust,\n User,\n} from '@/shared/icons/outline'\nimport {\n Button,\n Popover,\n PopoverContent,\n PopoverTrigger,\n Skeleton,\n Typography,\n} from '@/shared/ui'\n\nimport {\n getBusinessIdentity,\n getBusinessPaymentLimits,\n getBusinessUser,\n getIdentity,\n} from '../api'\nimport { useBusinessRole, useLogout } from '../hooks'\nimport {\n BusinessIdentity,\n BusinessUser,\n Identity,\n PaymentLimit,\n} from '../types'\n\nimport { AccountLimitsSidebar } from './AccountLimitsSidebar'\nimport { TeamDetailsSidebar } from './TeamDetailsSidebar'\n\ntype Props = {\n type: 'active' | 'onboarding'\n onOpenChange: (open: boolean) => void\n open: boolean\n}\n\nexport const ProfileDropdown = ({\n onOpenChange,\n open,\n type = 'active',\n}: Props) => {\n const { logout } = useLogout()\n\n const [showSidebar, setShowSidebar] = useState<'profile' | 'settings'>()\n\n const { isAdmin } = useBusinessRole()\n\n const [openTooltip, setOpenTooltip] = useState(false)\n\n const [\n userQuery,\n businessQuery,\n businessUserQuery,\n businessPaymentLimitsQuery,\n ] = useQueries({\n queries: [\n {\n queryKey: [queryKeys.getIdentity],\n queryFn: getIdentity,\n select: (data: AxiosResponse) => data.data,\n },\n {\n queryKey: [queryKeys.getBusinessIdentity],\n queryFn: getBusinessIdentity,\n select: (data: AxiosResponse) => data.data,\n },\n {\n queryKey: [queryKeys.getBusinessUser],\n queryFn: getBusinessUser,\n select: (data: AxiosResponse) => data.data,\n enabled: !isAdmin,\n },\n {\n queryKey: [queryKeys.getBusinessPaymentLimits],\n queryFn: getBusinessPaymentLimits,\n select: (data: AxiosResponse) => data.data,\n enabled: isAdmin && type === 'active',\n },\n ],\n })\n\n useEffect(() => {\n setOpenTooltip(false)\n }, [open])\n\n return (\n <>\n \n \n \n
\n \n {getFirstLetter(businessQuery.data?.legalName)}\n \n\n \n \n \n {businessQuery.data?.legalName}\n \n {userQuery.data ? (\n \n {getFullName(userQuery.data)}\n \n ) : (\n \n )}\n \n \n
\n\n \n \n \n \n \n \n
\n \n {!isAdmin ? (\n {\n setShowSidebar('profile')\n setOpenTooltip(false)\n }}\n >\n \n \n \n ) : null}\n {businessPaymentLimitsQuery.data?.periodTransferLimit ? (\n {\n setShowSidebar('settings')\n setOpenTooltip(false)\n }}\n >\n \n \n \n ) : null}\n \n \n \n \n \n \n
\n\n {\n setShowSidebar(undefined)\n setOpenTooltip(false)\n }}\n />\n\n {businessPaymentLimitsQuery.data?.periodTransferLimit ? (\n {\n setShowSidebar(undefined)\n setOpenTooltip(false)\n }}\n limits={businessPaymentLimitsQuery.data}\n />\n ) : null}\n \n )\n}\n","import { CountryWithFlag } from '@/shared/components'\nimport { CountryCode } from '@/types/country'\n\nimport { PaymentRails } from '../constants'\n\nimport { DolarAppAvatar } from './DolarAppAvatar'\n\ntype Props = {\n paymentRails: PaymentRails\n className?: string\n}\n\nexport const RecipientAccountAvatar = ({ paymentRails, className }: Props) => {\n switch (paymentRails) {\n case PaymentRails.MEX:\n return \n\n case PaymentRails.USA:\n return \n\n case PaymentRails.DOLAR_APP:\n return \n\n default:\n return null\n }\n}\n","import { iconByRecipientType, PaymentRails } from '@/domains/Business/constants'\nimport { getFullName } from '@/lib/typography'\nimport { CountryCode } from '@/types/country'\n\nimport {\n ContractorEntityType,\n CreatedRecipient,\n CreatedRecipientWithId,\n DolarAppEntityType,\n EntityType,\n Recipient,\n} from './../types'\n\nexport function getRecipientName(recipient?: Recipient) {\n if (!recipient) {\n return undefined\n }\n\n if (\n recipient.entityType === EntityType.INDIVIDUAL &&\n recipient.firstName &&\n recipient.lastName\n ) {\n return getFullName(recipient)\n }\n\n if (recipient.email) {\n return recipient.email\n }\n\n return undefined\n}\n\nexport function getRecipientTitle(recipient?: Recipient) {\n if (!recipient) {\n return undefined\n }\n\n switch (recipient.entityType) {\n case EntityType.INDIVIDUAL:\n return getRecipientName(recipient)\n\n case EntityType.BUSINESS:\n return recipient.legalName\n ? recipient.legalName\n : getRecipientName(recipient)\n\n default:\n return undefined\n }\n}\n\nexport function getEntityType(\n entityType?: EntityType | DolarAppEntityType | ContractorEntityType,\n) {\n if (entityType === ContractorEntityType.CONTRACTOR) {\n return EntityType.INDIVIDUAL\n }\n\n return entityType\n}\n\nexport function getIconByEntityType(\n entityType?: EntityType | DolarAppEntityType | ContractorEntityType,\n) {\n if (!entityType || entityType === ContractorEntityType.CONTRACTOR) {\n return iconByRecipientType[EntityType.INDIVIDUAL]\n }\n\n if (entityType === DolarAppEntityType.RETAIL) {\n return iconByRecipientType[EntityType.INDIVIDUAL]\n }\n\n return iconByRecipientType[entityType]\n}\n\nexport function getCountryByRails(rails: PaymentRails) {\n switch (rails) {\n case PaymentRails.MEX:\n return CountryCode.MX\n\n case PaymentRails.USA:\n return CountryCode.US\n\n default:\n return CountryCode.MX\n }\n}\n\nexport function parseRecipient(\n recipient: Recipient,\n): CreatedRecipient | undefined {\n switch (recipient.paymentRails) {\n case PaymentRails.MEX: {\n switch (recipient.entityType) {\n case EntityType.INDIVIDUAL:\n return {\n nickname: recipient.nickname,\n recipient: {\n type: recipient.entityType,\n details: {\n firstName: recipient.firstName ?? '',\n lastName: recipient.lastName ?? '',\n secondLastName: recipient.secondLastName ?? '',\n },\n },\n contactDetails: {\n internationalPhonePrefix:\n recipient.internationalPhonePrefix ?? '',\n localPhoneNumber: recipient.localPhoneNumber ?? '',\n email: recipient.email ?? '',\n },\n paymentInformation: {\n rails: recipient.paymentRails,\n railsDetails: {\n clabe: recipient.localInformation.clabe,\n },\n },\n }\n\n case EntityType.BUSINESS:\n return {\n nickname: recipient.nickname,\n recipient: {\n type: recipient.entityType,\n details: {\n legalName: recipient.legalName ?? '',\n },\n },\n contactDetails: {\n internationalPhonePrefix:\n recipient.internationalPhonePrefix ?? '',\n localPhoneNumber: recipient.localPhoneNumber ?? '',\n email: recipient.email ?? '',\n },\n paymentInformation: {\n rails: recipient.paymentRails,\n railsDetails: {\n clabe: recipient.localInformation.clabe,\n },\n },\n }\n\n default:\n return undefined\n }\n }\n\n case PaymentRails.USA: {\n switch (recipient.entityType) {\n case EntityType.INDIVIDUAL:\n return {\n nickname: recipient.nickname,\n recipient: {\n type: recipient.entityType,\n details: {\n firstName: recipient.firstName ?? '',\n lastName: recipient.lastName ?? '',\n secondLastName: recipient.secondLastName ?? '',\n },\n address: {\n street: recipient.addressStreet ?? '',\n city: recipient.addressCity ?? '',\n postcode: recipient.addressZipCode ?? '',\n state: recipient.addressState ?? '',\n countryCode: getCountryByRails(recipient.paymentRails),\n },\n },\n contactDetails: {\n internationalPhonePrefix:\n recipient.internationalPhonePrefix ?? '',\n localPhoneNumber: recipient.localPhoneNumber ?? '',\n email: recipient.email ?? '',\n },\n paymentInformation: {\n rails: recipient.paymentRails,\n railsDetails: {\n accountNumber: recipient.localInformation.accountNumber,\n routingNumber: recipient.localInformation.routingNumber,\n paymentMethod: recipient.localInformation.paymentMethod,\n },\n },\n }\n\n case EntityType.BUSINESS:\n return {\n nickname: recipient.nickname,\n recipient: {\n type: recipient.entityType,\n details: {\n legalName: recipient.legalName ?? '',\n },\n address: {\n street: recipient.addressStreet ?? '',\n city: recipient.addressCity ?? '',\n postcode: recipient.addressZipCode ?? '',\n state: recipient.addressState ?? '',\n countryCode: getCountryByRails(recipient.paymentRails),\n },\n },\n contactDetails: {\n internationalPhonePrefix:\n recipient.internationalPhonePrefix ?? '',\n localPhoneNumber: recipient.localPhoneNumber ?? '',\n email: recipient.email ?? '',\n },\n paymentInformation: {\n rails: recipient.paymentRails,\n railsDetails: {\n accountNumber: recipient.localInformation.accountNumber,\n routingNumber: recipient.localInformation.routingNumber,\n paymentMethod: recipient.localInformation.paymentMethod,\n },\n },\n }\n\n default:\n return undefined\n }\n }\n\n default:\n return undefined\n }\n}\n\nexport function parseFormRecipient(\n recipient: CreatedRecipientWithId,\n): Partial & { id: string } {\n return {\n id: recipient.id,\n nickname: recipient.nickname,\n internationalPhonePrefix:\n recipient.contactDetails?.internationalPhonePrefix ?? null,\n localPhoneNumber: recipient.contactDetails?.localPhoneNumber ?? null,\n email: recipient.contactDetails?.email ?? null,\n addressCity: recipient.recipient?.address?.city ?? null,\n addressCountry: recipient.recipient?.address?.countryCode ?? null,\n addressState: recipient.recipient?.address?.state ?? null,\n addressStreet: recipient.recipient?.address?.street ?? null,\n addressZipCode: recipient.recipient?.address?.postcode ?? null,\n }\n}\n","import { cn } from '@/lib/utils'\nimport { Avatar, AvatarSize, AvatarVariant } from '@/shared/ui'\n\nimport { PaymentRails } from '../constants'\nimport { Recipient } from '../features/Recipients/types'\nimport { getIconByEntityType } from '../features/Recipients/utils'\n\ntype Props = {\n recipient?: Recipient\n size?: AvatarSize\n variant?: AvatarVariant\n}\n\nexport const RecipientAvatar = ({ recipient, size, variant }: Props) => {\n const isDolarAppRecipient = recipient?.paymentRails === PaymentRails.DOLAR_APP\n\n const Icon = getIconByEntityType(recipient?.entityType)\n\n const avatarVariant = isDolarAppRecipient ? 'primary' : variant\n\n return (\n \n }\n />\n )\n}\n","import { cn } from '@/lib/utils'\nimport {\n ArrowLeftRight,\n CircleCancel,\n Dolarapp,\n InfoCircle,\n} from '@/shared/icons/outline'\nimport { Avatar, AvatarSize, AvatarVariant } from '@/shared/ui'\n\nimport { getIconByEntityType } from '../features/Recipients/utils'\nimport {\n SingleTransaction,\n TransactionType,\n} from '../features/Transactions/types'\nimport {\n getIsTransactionFailed,\n getTransactionAdditionalDetails,\n} from '../features/Transactions/utils'\n\nimport { CardTransactionIcon } from './CardTransactionIcon'\n\nconst IconComponent = ({ transaction, size, variant }: Props) => {\n const isFailed = getIsTransactionFailed(transaction)\n const additionalDetails = getTransactionAdditionalDetails(transaction)\n\n const iconProps = {\n className: cn('text-neutral-gray-900 size-5', {\n 'size-8': size === 'xl',\n 'text-primary': variant === 'primary' && !isFailed,\n }),\n }\n\n if (isFailed) {\n return (\n <>\n \n \n \n )\n }\n\n switch (transaction?.transactionType) {\n case TransactionType.INTERNAL_SWAP_DEPOSIT:\n case TransactionType.INTERNAL_SWAP_WITHDRAW:\n return \n case TransactionType.REWARD:\n case TransactionType.FEE:\n case TransactionType.CASHBACK:\n return \n\n case TransactionType.CARD_PAYMENT: {\n return \n }\n\n default: {\n const Icon = getIconByEntityType(additionalDetails?.beneficiaryEntityType)\n\n return \n }\n }\n}\n\ntype Props = {\n variant?: AvatarVariant\n size?: AvatarSize\n transaction?: SingleTransaction\n}\n\nexport const TransactionIcon = ({ variant, size, transaction }: Props) => {\n return (\n \n }\n />\n )\n}\n","import { formatAmount } from '@/lib/money'\nimport { cn } from '@/lib/utils'\nimport { Typography } from '@/shared/ui'\n\nimport { SingleTransaction } from '../../features/Transactions/types'\nimport {\n getIsTransactionFailed,\n getTransactionAdditionalDetails,\n} from '../../features/Transactions/utils'\nimport { TransactionIcon } from '../TransactionIcon'\n\nexport const TransactionShortListRow = ({\n transaction,\n}: {\n transaction: SingleTransaction\n}) => {\n const isFailed = getIsTransactionFailed(transaction)\n const additionalDetails = getTransactionAdditionalDetails(transaction)\n\n return (\n
\n
\n \n {transaction.name}\n
\n
\n \n {formatAmount({\n amount: transaction.baseAmount,\n currency: transaction.baseCurrency,\n })}\n \n \n {formatAmount({\n amount: transaction.localAmount,\n currency: transaction.localCurrency,\n })}\n \n
\n
\n )\n}\n","import { Fragment } from 'react'\nimport { FormattedMessage } from 'react-intl'\nimport { Link, To } from 'react-router'\n\nimport { getImage } from '@/lib/images'\nimport { ChevronRight } from '@/shared/icons/outline'\nimport { Button, Card, Skeleton, Typography } from '@/shared/ui'\n\nimport { SingleTransaction } from '../../features/Transactions/types'\n\nimport { TransactionShortListRow } from './TransactionShortListRow'\n\ntype Props = {\n transactions: SingleTransaction[]\n limit?: number\n path: To\n isPending?: boolean\n}\n\nexport const TransactionsShortList = ({\n transactions,\n limit = 5,\n path,\n isPending,\n}: Props) => {\n const slicedTransactions = transactions.slice(0, limit)\n\n if (isPending) {\n return (\n <>\n
\n
\n
\n \n \n
\n\n
\n\n \n
\n \n \n
\n
\n \n \n
\n
\n
\n \n )\n }\n\n if (slicedTransactions.length === 0) {\n return (\n \n
\n \n \n \n \n \n \n
\n