From e2c49ea43c53a1599636d0906ea4d9521a57d2f0 Mon Sep 17 00:00:00 2001 From: padreug Date: Wed, 31 Dec 2025 19:04:13 +0100 Subject: [PATCH] v12.0.0 - initial commit --- .dockerignore | 5 + .github/workflows/build.yml | 51 + .github/workflows/docker-build.yml | 92 + .github/workflows/test.yml | 40 + .gitignore | 13 + .husky/pre-commit | 5 + .prettierrc | 8 + .tool-versions | 3 + .vscode/launch.json | 22 + .vscode/settings.json | 3 + CRYPTO_README.md | 54 + LICENSE | 121 + README.md | 62 + build/docker-compose.yaml | 55 + build/server.Dockerfile | 17 + eslint.config.mjs | 85 + package.json | 49 + packages/admin-ui/.gitignore | 23 + packages/admin-ui/README.md | 36 + packages/admin-ui/index.html | 20 + packages/admin-ui/package.json | 81 + .../assets/wizard/fullexample.commissions.png | Bin 0 -> 71597 bytes .../assets/wizard/fullexample.locale.png | Bin 0 -> 42159 bytes .../assets/wizard/fullexample.twilio.png | Bin 0 -> 163770 bytes .../assets/wizard/fullexample.wallet.png | Bin 0 -> 31033 bytes packages/admin-ui/public/favicon.ico | Bin 0 -> 1150 bytes .../admin-ui/public/fonts/BPmono/BPmono.ttf | Bin 0 -> 58648 bytes .../public/fonts/BPmono/BPmonoBold.ttf | Bin 0 -> 48488 bytes .../public/fonts/BPmono/BPmonoItalic.ttf | Bin 0 -> 58680 bytes .../fonts/MontHeavy/mont-bold-webfont.woff | Bin 0 -> 33244 bytes .../fonts/MontHeavy/mont-bold-webfont.woff2 | Bin 0 -> 25180 bytes .../fonts/MontHeavy/mont-heavy-webfont.woff | Bin 0 -> 58028 bytes .../fonts/MontHeavy/mont-heavy-webfont.woff2 | Bin 0 -> 42956 bytes .../MuseoSans/MuseoSans_500-webfont.woff | Bin 0 -> 32072 bytes .../MuseoSans/MuseoSans_500-webfont.woff2 | Bin 0 -> 23588 bytes .../MuseoSans/MuseoSans_700-webfont.woff | Bin 0 -> 31928 bytes .../MuseoSans/MuseoSans_700-webfont.woff2 | Bin 0 -> 24092 bytes .../public/fonts/Rubik/Rubik-Black.otf | Bin 0 -> 96336 bytes .../public/fonts/Rubik/Rubik-Bold.otf | Bin 0 -> 101792 bytes .../public/fonts/Rubik/Rubik-Medium.otf | Bin 0 -> 100476 bytes packages/admin-ui/public/manifest.json | 15 + packages/admin-ui/public/robots.txt | 2 + .../admin-ui/public/wizard-background.svg | 204 + packages/admin-ui/src/App.jsx | 54 + packages/admin-ui/src/AppContext.js | 3 + packages/admin-ui/src/Main.jsx | 104 + packages/admin-ui/src/components/Carousel.jsx | 48 + .../src/components/Carousel.module.css | 45 + .../src/components/CollapsibleCard.jsx | 21 + .../admin-ui/src/components/ConfirmDialog.jsx | 105 + .../src/components/CopyToClipboard.jsx | 80 + .../admin-ui/src/components/DeleteDialog.jsx | 65 + .../admin-ui/src/components/ErrorMessage.jsx | 18 + .../admin-ui/src/components/ImagePopper.jsx | 56 + .../src/components/InformativeDialog.jsx | 39 + .../src/components/LogsDownloaderPopper.jsx | 235 + packages/admin-ui/src/components/Modal.jsx | 96 + .../NotificationCenter/NotificationCenter.jsx | 160 + .../NotificationCenter.module.css | 147 + .../NotificationCenter/NotificationRow.jsx | 91 + .../components/NotificationCenter/index.js | 3 + packages/admin-ui/src/components/Popper.jsx | 77 + .../admin-ui/src/components/Popper.module.css | 33 + .../src/components/PromptWhenDirty.jsx | 19 + .../admin-ui/src/components/SearchBox.jsx | 83 + .../admin-ui/src/components/SearchFilter.jsx | 53 + packages/admin-ui/src/components/Status.jsx | 23 + packages/admin-ui/src/components/Stepper.jsx | 61 + .../src/components/Stepper.module.css | 12 + packages/admin-ui/src/components/Subtitle.jsx | 15 + .../admin-ui/src/components/TableFilters.jsx | 118 + packages/admin-ui/src/components/Title.jsx | 9 + packages/admin-ui/src/components/Tooltip.jsx | 97 + .../BooleanPropertiesTable.jsx | 123 + .../booleanPropertiesTable/index.js | 3 + .../src/components/buttons/ActionButton.jsx | 49 + .../buttons/ActionButton.module.css | 145 + .../src/components/buttons/AddButton.jsx | 16 + .../components/buttons/AddButton.module.css | 30 + .../components/buttons/BaseButton.styles.js | 70 + .../src/components/buttons/Button.jsx | 43 + .../src/components/buttons/Button.module.css | 49 + .../src/components/buttons/FeatureButton.jsx | 37 + .../buttons/FeatureButton.module.css | 87 + .../src/components/buttons/IDButton.jsx | 79 + .../components/buttons/IDButton.module.css | 58 + .../admin-ui/src/components/buttons/Link.jsx | 27 + .../src/components/buttons/Link.module.css | 47 + .../src/components/buttons/SubpageButton.jsx | 62 + .../buttons/SubpageButton.module.css | 51 + .../buttons/SubpageButton.styles.js | 46 + .../components/buttons/SupportLinkButton.jsx | 25 + .../admin-ui/src/components/buttons/index.js | 19 + .../components/date-range-picker/Calendar.jsx | 138 + .../date-range-picker/Calendar.module.css | 66 + .../date-range-picker/DateRangePicker.jsx | 59 + .../src/components/date-range-picker/Tile.jsx | 41 + .../date-range-picker/Tile.module.css | 53 + .../src/components/editableTable/Context.js | 3 + .../src/components/editableTable/Header.jsx | 127 + .../editableTable/NamespacedTable.jsx | 29 + .../src/components/editableTable/Row.jsx | 299 + .../components/editableTable/Row.module.css | 29 + .../src/components/editableTable/Table.jsx | 250 + .../components/editableTable/Table.module.css | 16 + .../src/components/editableTable/index.js | 4 + .../src/components/fake-table/Table.jsx | 145 + .../components/fake-table/Table.module.css | 106 + .../inputs/base/AsyncAutocomplete.jsx | 75 + .../components/inputs/base/Autocomplete.jsx | 127 + .../src/components/inputs/base/Checkbox.jsx | 46 + .../src/components/inputs/base/CodeInput.jsx | 37 + .../inputs/base/CodeInput.module.css | 14 + .../src/components/inputs/base/Dropdown.jsx | 29 + .../components/inputs/base/NumberInput.jsx | 53 + .../src/components/inputs/base/RadioGroup.jsx | 53 + .../components/inputs/base/SecretInput.jsx | 35 + .../src/components/inputs/base/Select.jsx | 52 + .../components/inputs/base/Select.module.css | 100 + .../src/components/inputs/base/TextInput.jsx | 74 + .../inputs/base/TextInput.module.css | 24 + .../inputs/base/ToggleButtonGroup.jsx | 45 + .../src/components/inputs/base/index.js | 21 + .../src/components/inputs/cashbox/Cashbox.jsx | 181 + .../inputs/cashbox/Cashbox.module.css | 53 + .../inputs/formik/AsyncAutocomplete.jsx | 29 + .../components/inputs/formik/Autocomplete.jsx | 51 + .../inputs/formik/CashCassetteInput.jsx | 39 + .../src/components/inputs/formik/Checkbox.jsx | 27 + .../src/components/inputs/formik/Dropdown.jsx | 25 + .../components/inputs/formik/NumberInput.jsx | 24 + .../components/inputs/formik/RadioGroup.jsx | 25 + .../components/inputs/formik/SecretInput.jsx | 24 + .../components/inputs/formik/TextInput.jsx | 23 + .../inputs/formik/ToggleButtonGroup.jsx | 27 + .../src/components/inputs/formik/index.js | 21 + .../admin-ui/src/components/inputs/index.js | 18 + .../admin-ui/src/components/layout/Header.jsx | 250 + .../src/components/layout/Header.module.css | 185 + .../src/components/layout/Section.jsx | 19 + .../src/components/layout/Sidebar.jsx | 75 + .../src/components/layout/Sidebar.module.css | 106 + .../src/components/layout/TitleSection.jsx | 66 + .../machineActions/DiagnosticsModal.jsx | 225 + .../components/machineActions/GroupModal.jsx | 112 + .../machineActions/MachineActions.jsx | 345 + .../single-row-table/SingleRowTable.jsx | 69 + .../src/components/table/EditCell.jsx | 17 + .../src/components/table/EmptyTable.jsx | 19 + .../admin-ui/src/components/table/Table.jsx | 17 + .../src/components/table/Table.module.css | 3 + .../src/components/table/TableBody.jsx | 7 + .../src/components/table/TableCell.jsx | 24 + .../src/components/table/TableHead.jsx | 7 + .../src/components/table/TableHeader.jsx | 19 + .../src/components/table/TableRow.jsx | 23 + .../admin-ui/src/components/table/index.js | 19 + .../src/components/tables/DataTable.jsx | 211 + .../src/components/typography/index.jsx | 119 + .../src/components/typography/styles.js | 136 + .../typography/typography.module.css | 140 + packages/admin-ui/src/index.jsx | 8 + .../src/pages/AddMachine/AddMachine.jsx | 276 + .../admin-ui/src/pages/AddMachine/index.js | 3 + .../src/pages/Analytics/Analytics.jsx | 377 + .../Analytics/components/LegendEntry.jsx | 14 + .../components/tooltips/GraphTooltip.jsx | 73 + .../components/wrappers/HourOfDayWrapper.jsx | 124 + .../components/wrappers/OverTimeWrapper.jsx | 89 + .../wrappers/TopMachinesWrapper.jsx | 62 + .../wrappers/VolumeOverTimeWrapper.jsx | 91 + .../components/wrappers/wrappers.module.css | 56 + .../src/pages/Analytics/graphs/Graph.jsx | 135 + .../Analytics/graphs/HourOfDayBarGraph.jsx | 436 + .../Analytics/graphs/OverTimeDotGraph.jsx | 570 + .../Analytics/graphs/OverTimeLineGraph.jsx | 646 + .../Analytics/graphs/TopMachinesBarGraph.jsx | 316 + .../admin-ui/src/pages/Analytics/index.js | 3 + .../Authentication/Authentication.module.css | 73 + .../pages/Authentication/Input2FAState.jsx | 125 + .../pages/Authentication/InputFIDOState.jsx | 207 + .../src/pages/Authentication/Login.jsx | 23 + .../src/pages/Authentication/LoginCard.jsx | 67 + .../src/pages/Authentication/LoginState.jsx | 231 + .../src/pages/Authentication/Register.jsx | 216 + .../src/pages/Authentication/Reset2FA.jsx | 204 + .../pages/Authentication/ResetPassword.jsx | 167 + .../pages/Authentication/Setup2FAState.jsx | 174 + .../src/pages/Authentication/states.js | 8 + .../src/pages/Blacklist/Blacklist.jsx | 314 + .../src/pages/Blacklist/BlacklistAdvanced.jsx | 172 + .../src/pages/Blacklist/BlacklistModal.jsx | 62 + .../src/pages/Blacklist/BlacklistTable.jsx | 78 + .../admin-ui/src/pages/Blacklist/index.js | 3 + .../admin-ui/src/pages/Cashout/Cashout.jsx | 123 + .../admin-ui/src/pages/Cashout/Wizard.jsx | 153 + .../src/pages/Cashout/WizardSplash.jsx | 34 + .../admin-ui/src/pages/Cashout/WizardStep.jsx | 153 + packages/admin-ui/src/pages/Cashout/helper.js | 196 + packages/admin-ui/src/pages/Cashout/index.js | 3 + .../src/pages/Commissions/Commissions.jsx | 159 + .../components/CommissionsDetails.jsx | 79 + .../components/CommissionsList.jsx | 162 + .../admin-ui/src/pages/Commissions/helper.jsx | 615 + .../admin-ui/src/pages/Commissions/index.js | 3 + .../src/pages/Customers/CustomerData.jsx | 546 + .../src/pages/Customers/CustomerNotes.jsx | 84 + .../src/pages/Customers/CustomerPhotos.jsx | 74 + .../src/pages/Customers/CustomerProfile.jsx | 677 + .../src/pages/Customers/Customers.jsx | 146 + .../src/pages/Customers/CustomersList.jsx | 145 + .../admin-ui/src/pages/Customers/Wizard.jsx | 130 + .../components/CreateCustomerModal.jsx | 107 + .../Customers/components/CustomerDetails.jsx | 83 + .../Customers/components/CustomerSidebar.jsx | 67 + .../Customers/components/EditableCard.jsx | 290 + .../pages/Customers/components/PhotosCard.jsx | 62 + .../Customers/components/PhotosCarousel.jsx | 62 + .../Customers/components/TransactionsList.jsx | 166 + .../src/pages/Customers/components/Upload.jsx | 65 + .../Customers/components/Upload.module.css | 14 + .../src/pages/Customers/components/consts.js | 5 + .../src/pages/Customers/components/index.js | 16 + .../components/notes/NewNoteCard.jsx | 17 + .../components/notes/NewNoteModal.jsx | 74 + .../Customers/components/notes/NoteCard.jsx | 48 + .../Customers/components/notes/NoteEdit.jsx | 98 + .../admin-ui/src/pages/Customers/helper.jsx | 533 + .../src/pages/Customers/helper.test.js | 323 + .../admin-ui/src/pages/Customers/index.js | 4 + .../src/pages/Dashboard/Alerts/Alerts.jsx | 90 + .../pages/Dashboard/Alerts/AlertsTable.jsx | 57 + .../src/pages/Dashboard/Alerts/index.js | 3 + .../src/pages/Dashboard/Dashboard.jsx | 103 + .../src/pages/Dashboard/Footer/Footer.jsx | 101 + .../pages/Dashboard/Footer/Footer.module.css | 28 + .../src/pages/Dashboard/Footer/index.js | 3 + .../src/pages/Dashboard/RightSide.jsx | 89 + .../Graphs/PercentageChart.jsx | 34 + .../SystemPerformance/Graphs/RefLineChart.jsx | 197 + .../Graphs/RefScatterplot.jsx | 348 + .../SystemPerformance/InfoWithLabel.jsx | 13 + .../pages/Dashboard/SystemPerformance/Nav.jsx | 42 + .../SystemPerformance/SystemPerformance.jsx | 285 + .../Dashboard/SystemPerformance/index.js | 3 + .../Dashboard/SystemStatus/MachinesTable.jsx | 163 + .../SystemStatus/MachinesTable.styles.js | 77 + .../Dashboard/SystemStatus/SystemStatus.jsx | 115 + .../src/pages/Dashboard/SystemStatus/index.js | 3 + .../admin-ui/src/pages/Dashboard/index.js | 3 + .../admin-ui/src/pages/Funding/Funding.jsx | 303 + .../src/pages/Funding/Funding.module.css | 107 + .../admin-ui/src/pages/Funding/TableLabel.jsx | 20 + .../admin-ui/src/pages/Locales/Locales.jsx | 255 + packages/admin-ui/src/pages/Locales/helper.js | 192 + packages/admin-ui/src/pages/Locales/index.js | 3 + .../admin-ui/src/pages/Logs/Logs.module.css | 74 + .../admin-ui/src/pages/Logs/MachineLogs.jsx | 168 + .../admin-ui/src/pages/Logs/ServerLogs.jsx | 197 + .../src/pages/Logs/ServerLogs.module.css | 20 + packages/admin-ui/src/pages/Logs/Uptime.jsx | 33 + .../LoyaltyPanel/IndividualDiscountModal.jsx | 162 + .../LoyaltyPanel/IndividualDiscounts.jsx | 195 + .../src/pages/LoyaltyPanel/PromoCodes.jsx | 177 + .../pages/LoyaltyPanel/PromoCodesModal.jsx | 107 + .../ComplianceTriggerSetModal.jsx | 122 + .../MachineGroups/CreateMachineGroupModal.jsx | 83 + .../src/pages/MachineGroups/MachineGroups.jsx | 227 + .../admin-ui/src/pages/MachineGroups/index.js | 1 + .../MachineComponents/Cassettes/Cassettes.jsx | 106 + .../MachineComponents/Cassettes/index.js | 3 + .../Commissions/Commissions.jsx | 97 + .../MachineComponents/Commissions/helper.jsx | 79 + .../MachineComponents/Commissions/index.js | 3 + .../Machines/MachineComponents/Details.jsx | 30 + .../Machines/MachineComponents/Overview.jsx | 79 + .../Transactions/Transactions.jsx | 168 + .../MachineComponents/Transactions/index.js | 3 + .../admin-ui/src/pages/Machines/Machines.jsx | 136 + packages/admin-ui/src/pages/Machines/index.js | 3 + .../src/pages/Maintenance/CashUnitDetails.jsx | 155 + .../src/pages/Maintenance/CashUnits.jsx | 347 + .../src/pages/Maintenance/CashUnitsFooter.jsx | 110 + .../src/pages/Maintenance/CashboxHistory.jsx | 138 + .../src/pages/Maintenance/MachineStatus.jsx | 290 + .../src/pages/Maintenance/Wizard/Wizard.jsx | 209 + .../pages/Maintenance/Wizard/WizardSplash.jsx | 39 + .../pages/Maintenance/Wizard/WizardStep.jsx | 272 + .../Maintenance/Wizard/WizardStep.module.css | 22 + .../admin-ui/src/pages/Maintenance/helper.jsx | 141 + .../src/pages/Notifications/Notifications.jsx | 266 + .../Notifications/NotificationsContext.js | 3 + .../Notifications/components/EditHeader.jsx | 38 + .../components/EditableNumber.jsx | 54 + .../components/SingleFieldEditableNumber.jsx | 80 + .../sections/CryptoBalanceAlerts.jsx | 49 + .../sections/CryptoBalanceOverrides.jsx | 156 + .../sections/FiatBalanceAlerts.jsx | 230 + .../sections/FiatBalanceOverrides.jsx | 209 + .../pages/Notifications/sections/Setup.jsx | 143 + .../sections/ThirdPartyProvider.jsx | 87 + .../sections/TransactionAlerts.jsx | 19 + .../src/pages/OperatorInfo/CoinATMRadar.jsx | 70 + .../src/pages/OperatorInfo/ContactInfo.jsx | 258 + .../src/pages/OperatorInfo/MachineScreens.jsx | 67 + .../pages/OperatorInfo/ReceiptPrinting.jsx | 116 + .../OperatorInfo/SMSNotices/SMSNotices.jsx | 278 + .../SMSNotices/SMSNoticesModal.jsx | 194 + .../pages/OperatorInfo/TermsConditions.jsx | 248 + .../pages/OperatorInfo/components/Header.jsx | 20 + .../OperatorInfo/components/InfoMessage.jsx | 12 + .../OperatorInfo/components/SwitchRow.jsx | 21 + .../src/pages/Services/FormRenderer.jsx | 85 + .../admin-ui/src/pages/Services/Services.jsx | 141 + .../src/pages/Services/schemas/binance.js | 57 + .../src/pages/Services/schemas/binanceus.js | 57 + .../src/pages/Services/schemas/bitfinex.js | 57 + .../src/pages/Services/schemas/bitgo.js | 149 + .../src/pages/Services/schemas/bitstamp.js | 67 + .../src/pages/Services/schemas/blockcypher.js | 54 + .../src/pages/Services/schemas/cex.js | 67 + .../src/pages/Services/schemas/elliptic.js | 63 + .../src/pages/Services/schemas/galoy.js | 62 + .../src/pages/Services/schemas/helper.js | 64 + .../src/pages/Services/schemas/index.js | 55 + .../src/pages/Services/schemas/inforu.js | 52 + .../src/pages/Services/schemas/infura.js | 23 + .../src/pages/Services/schemas/itbit.js | 75 + .../src/pages/Services/schemas/kraken.js | 57 + .../src/pages/Services/schemas/mailgun.js | 50 + .../src/pages/Services/schemas/scorechain.js | 55 + .../src/pages/Services/schemas/singlebitgo.js | 64 + .../src/pages/Services/schemas/sumsub.js | 44 + .../src/pages/Services/schemas/telnyx.js | 43 + .../src/pages/Services/schemas/trongrid.js | 24 + .../src/pages/Services/schemas/twilio.js | 51 + .../src/pages/Services/schemas/vonage.js | 51 + .../SessionManagement/SessionManagement.jsx | 123 + .../src/pages/Transactions/DetailsCard.jsx | 455 + .../src/pages/Transactions/Filters.jsx | 91 + .../src/pages/Transactions/Transactions.jsx | 477 + .../admin-ui/src/pages/Transactions/helper.js | 34 + .../CustomInfoRequests/CustomInfoRequests.jsx | 298 + .../CustomInfoRequests/DetailsCard.jsx | 84 + .../CustomInfoRequests/Forms/ChooseType.jsx | 76 + .../Forms/NameOfRequirement.jsx | 48 + .../Forms/Screen1Information.jsx | 69 + .../Forms/Screen2Information.jsx | 42 + .../Forms/TypeFields/ChoiceList.jsx | 96 + .../Forms/TypeFields/NumericalEntry.jsx | 56 + .../Forms/TypeFields/TextEntry.jsx | 73 + .../Forms/TypeFields/index.jsx | 78 + .../Triggers/CustomInfoRequests/Wizard.jsx | 224 + .../CustomInfoRequests/WizardSplash.jsx | 29 + .../Triggers/CustomInfoRequests/index.js | 3 + .../src/pages/Triggers/TriggerSets.jsx | 318 + .../src/pages/Triggers/TriggerSetsModal.jsx | 83 + .../admin-ui/src/pages/Triggers/Triggers.jsx | 307 + .../admin-ui/src/pages/Triggers/Wizard.jsx | 291 + .../Triggers/components/AdvancedTriggers.jsx | 133 + .../src/pages/Triggers/components/helper.js | 175 + .../admin-ui/src/pages/Triggers/helper.jsx | 597 + .../pages/UserManagement/UserManagement.jsx | 287 + .../UserManagement/UserManagement.module.css | 134 + .../UserManagement/modals/ChangeRoleModal.jsx | 88 + .../UserManagement/modals/CreateUserModal.jsx | 171 + .../UserManagement/modals/EnableUserModal.jsx | 124 + .../pages/UserManagement/modals/FIDOModal.jsx | 42 + .../UserManagement/modals/Input2FAModal.jsx | 93 + .../UserManagement/modals/Reset2FAModal.jsx | 106 + .../modals/ResetPasswordModal.jsx | 113 + .../src/pages/Wallet/AdvancedWallet.jsx | 129 + packages/admin-ui/src/pages/Wallet/Wallet.jsx | 205 + packages/admin-ui/src/pages/Wallet/Wizard.jsx | 151 + .../src/pages/Wallet/WizardSplash.jsx | 65 + .../admin-ui/src/pages/Wallet/WizardStep.jsx | 193 + packages/admin-ui/src/pages/Wallet/helper.jsx | 358 + .../src/pages/Wizard/Radio.module.css | 43 + packages/admin-ui/src/pages/Wizard/Wizard.jsx | 93 + .../pages/Wizard/components/Commissions.jsx | 58 + .../src/pages/Wizard/components/Footer.jsx | 104 + .../src/pages/Wizard/components/Locales.jsx | 94 + .../src/pages/Wizard/components/Mailgun.jsx | 125 + .../pages/Wizard/components/Notifications.jsx | 89 + .../pages/Wizard/components/OperatorInfo.jsx | 13 + .../src/pages/Wizard/components/Twilio.jsx | 137 + .../pages/Wizard/components/Twilio.module.css | 24 + .../pages/Wizard/components/Wallet/AllSet.jsx | 96 + .../Wizard/components/Wallet/Blockcypher.jsx | 96 + .../Wizard/components/Wallet/ChooseCoin.jsx | 74 + .../components/Wallet/ChooseExchange.jsx | 128 + .../Wizard/components/Wallet/ChooseTicker.jsx | 63 + .../Wizard/components/Wallet/ChooseWallet.jsx | 185 + .../components/Wallet/Shared.module.css | 45 + .../pages/Wizard/components/Wallet/Wallet.jsx | 72 + .../Wizard/components/Wallet/getItems.js | 23 + .../src/pages/Wizard/components/Welcome.jsx | 22 + packages/admin-ui/src/pages/Wizard/helper.jsx | 131 + packages/admin-ui/src/pages/Wizard/index.js | 3 + .../admin-ui/src/routing/PrivateRoute.jsx | 14 + packages/admin-ui/src/routing/PublicRoute.jsx | 18 + packages/admin-ui/src/routing/dirtyHandler.js | 8 + .../admin-ui/src/routing/lamassu.routes.jsx | 318 + packages/admin-ui/src/routing/routes.jsx | 127 + .../routing/useLocationWithConfirmation.js | 34 + packages/admin-ui/src/routing/utils.js | 11 + .../admin-ui/src/styling/global/fonts.css | 90 + .../admin-ui/src/styling/global/global.css | 142 + packages/admin-ui/src/styling/helpers.js | 26 + .../src/styling/icons/ID/card/comet.svg | 14 + .../src/styling/icons/ID/card/tomato.svg | 14 + .../src/styling/icons/ID/card/white.svg | 14 + .../src/styling/icons/ID/card/zodiac.svg | 16 + .../src/styling/icons/ID/phone/comet.svg | 10 + .../src/styling/icons/ID/phone/tomato.svg | 10 + .../src/styling/icons/ID/phone/white.svg | 10 + .../src/styling/icons/ID/phone/zodiac.svg | 10 + .../src/styling/icons/ID/photo/comet.svg | 10 + .../styling/icons/ID/photo/crossed-camera.svg | 18 + .../src/styling/icons/ID/photo/tomato.svg | 10 + .../src/styling/icons/ID/photo/white.svg | 10 + .../src/styling/icons/ID/photo/zodiac.svg | 10 + .../src/styling/icons/action/arrow/comet.svg | 16 + .../styling/icons/action/arrow/regular.svg | 18 + .../src/styling/icons/action/arrow/white.svg | 16 + .../src/styling/icons/action/arrow/zodiac.svg | 16 + .../src/styling/icons/action/close/comet.svg | 16 + .../src/styling/icons/action/close/white.svg | 16 + .../src/styling/icons/action/close/zodiac.svg | 18 + .../src/styling/icons/action/copy/comet.svg | 13 + .../src/styling/icons/action/copy/copy.svg | 16 + .../src/styling/icons/action/copy/white.svg | 13 + .../src/styling/icons/action/copy/zodiac.svg | 13 + .../styling/icons/action/delete/disabled.svg | 29 + .../styling/icons/action/delete/enabled.svg | 16 + .../src/styling/icons/action/delete/white.svg | 26 + .../src/styling/icons/action/edit/comet.svg | 11 + .../styling/icons/action/edit/disabled.svg | 12 + .../src/styling/icons/action/edit/enabled.svg | 12 + .../src/styling/icons/action/edit/white.svg | 12 + .../styling/icons/action/expand/closed.svg | 13 + .../src/styling/icons/action/expand/open.svg | 14 + .../icons/action/external link/white.svg | 13 + .../icons/action/external link/zodiac.svg | 14 + .../src/styling/icons/action/help/white.svg | 14 + .../src/styling/icons/action/help/zodiac.svg | 14 + .../styling/icons/action/wrench/zodiac.svg | 15 + .../icons/arrow/carousel-left-arrow.svg | 8 + .../icons/arrow/carousel-right-arrow.svg | 9 + .../src/styling/icons/arrow/download_logs.svg | 18 + .../src/styling/icons/arrow/month_change.svg | 23 + .../icons/arrow/month_change_right.svg | 23 + .../src/styling/icons/arrow/transaction.svg | 23 + .../src/styling/icons/arrow/triangle_down.svg | 7 + .../src/styling/icons/arrow/triangle_up.svg | 7 + .../styling/icons/button/add note/white.svg | 21 + .../styling/icons/button/add note/zodiac.svg | 23 + .../styling/icons/button/add-note/white.svg | 18 + .../styling/icons/button/add-note/zodiac.svg | 26 + .../src/styling/icons/button/add/white.svg | 13 + .../src/styling/icons/button/add/zodiac.svg | 13 + .../styling/icons/button/authorize/white.svg | 10 + .../styling/icons/button/authorize/zodiac.svg | 12 + .../styling/icons/button/blacklist/white.svg | 21 + .../styling/icons/button/blacklist/zodiac.svg | 23 + .../src/styling/icons/button/block/white.svg | 12 + .../src/styling/icons/button/block/zodiac.svg | 12 + .../src/styling/icons/button/cancel/white.svg | 13 + .../styling/icons/button/cancel/zodiac.svg | 13 + .../styling/icons/button/configure/white.svg | 13 + .../styling/icons/button/configure/zodiac.svg | 13 + .../src/styling/icons/button/data/white.svg | 18 + .../src/styling/icons/button/data/zodiac.svg | 18 + .../styling/icons/button/discount/comet.svg | 10 + .../styling/icons/button/discount/white.svg | 10 + .../styling/icons/button/discount/zodiac.svg | 10 + .../styling/icons/button/download/white.svg | 15 + .../styling/icons/button/download/zodiac.svg | 15 + .../src/styling/icons/button/edit/white.svg | 13 + .../src/styling/icons/button/edit/zodiac.svg | 13 + .../icons/button/export to PDF/white.svg | 23 + .../icons/button/export to PDF/zodiac.svg | 23 + .../styling/icons/button/export-pdf/white.svg | 15 + .../src/styling/icons/button/filter/white.svg | 9 + .../styling/icons/button/filter/zodiac.svg | 9 + .../src/styling/icons/button/ignore/white.svg | 11 + .../styling/icons/button/ignore/zodiac.svg | 11 + .../src/styling/icons/button/key/white.svg | 14 + .../src/styling/icons/button/key/zodiac.svg | 14 + .../src/styling/icons/button/link/export.svg | 23 + .../src/styling/icons/button/link/white.svg | 14 + .../src/styling/icons/button/link/zodiac.svg | 14 + .../src/styling/icons/button/lock/white.svg | 14 + .../src/styling/icons/button/lock/zodiac.svg | 14 + .../icons/button/photo/white-resized.svg | 31 + .../icons/button/photo/zodiac-resized.svg | 25 + .../src/styling/icons/button/reboot/white.svg | 25 + .../styling/icons/button/reboot/zodiac.svg | 25 + .../styling/icons/button/replace/white.svg | 21 + .../styling/icons/button/replace/zodiac.svg | 22 + .../src/styling/icons/button/retry/white.svg | 14 + .../src/styling/icons/button/retry/zodiac.svg | 14 + .../styling/icons/button/schedule/white.svg | 11 + .../styling/icons/button/schedule/zodiac.svg | 11 + .../styling/icons/button/shut down/white.svg | 14 + .../styling/icons/button/shut down/zodiac.svg | 14 + .../icons/button/stop-ignoring/white.svg | 12 + .../icons/button/stop-ignoring/zodiac.svg | 12 + .../src/styling/icons/button/unpair/white.svg | 21 + .../styling/icons/button/unpair/zodiac.svg | 21 + .../button/upload-file/white-resized.svg | 25 + .../icons/button/upload-file/white.svg | 23 + .../button/upload-file/zodiac-resized.svg | 24 + .../icons/button/upload-file/zodiac.svg | 23 + .../src/styling/icons/button/upload/white.svg | 18 + .../styling/icons/button/upload/zodiac.svg | 18 + .../styling/icons/button/user-role/white.svg | 13 + .../styling/icons/button/user-role/zodiac.svg | 13 + .../styling/icons/button/whitelist/white.svg | 22 + .../styling/icons/button/whitelist/zodiac.svg | 22 + .../icons/cassettes/acceptor-left-filled.svg | 63 + .../styling/icons/cassettes/acceptor-left.svg | 20 + .../styling/icons/cassettes/both-filled.svg | 89 + .../styling/icons/cassettes/cashbox-empty.svg | 17 + .../icons/cassettes/cashout-cassette-1.svg | 25 + .../icons/cassettes/cashout-cassette-2.svg | 25 + .../styling/icons/cassettes/dispenser-1.svg | 29 + .../styling/icons/cassettes/dispenser-2.svg | 29 + .../3-cassettes/3-cassettes-open-1-left.png | Bin 0 -> 10674 bytes .../3-cassettes/3-cassettes-open-1-left.svg | 88 + .../tejo/3-cassettes/3-cassettes-open-1.png | Bin 0 -> 11279 bytes .../tejo/3-cassettes/3-cassettes-open-1.svg | 88 + .../3-cassettes/3-cassettes-open-2-left.png | Bin 0 -> 10981 bytes .../3-cassettes/3-cassettes-open-2-left.svg | 92 + .../tejo/3-cassettes/3-cassettes-open-2.png | Bin 0 -> 11744 bytes .../tejo/3-cassettes/3-cassettes-open-2.svg | 96 + .../3-cassettes/3-cassettes-open-3-left.png | Bin 0 -> 10390 bytes .../3-cassettes/3-cassettes-open-3-left.svg | 94 + .../tejo/3-cassettes/3-cassettes-open-3.png | Bin 0 -> 11595 bytes .../tejo/3-cassettes/3-cassettes-open-3.svg | 94 + .../4-cassettes/4-cassettes-open-1-left.png | Bin 0 -> 12724 bytes .../4-cassettes/4-cassettes-open-1-left.svg | 99 + .../tejo/4-cassettes/4-cassettes-open-1.png | Bin 0 -> 13985 bytes .../tejo/4-cassettes/4-cassettes-open-1.svg | 99 + .../4-cassettes/4-cassettes-open-2-left.png | Bin 0 -> 13278 bytes .../4-cassettes/4-cassettes-open-2-left.svg | 101 + .../tejo/4-cassettes/4-cassettes-open-2.png | Bin 0 -> 14692 bytes .../tejo/4-cassettes/4-cassettes-open-2.svg | 105 + .../4-cassettes/4-cassettes-open-3-left.png | Bin 0 -> 13340 bytes .../4-cassettes/4-cassettes-open-3-left.svg | 101 + .../tejo/4-cassettes/4-cassettes-open-3.png | Bin 0 -> 14694 bytes .../tejo/4-cassettes/4-cassettes-open-3.svg | 103 + .../4-cassettes/4-cassettes-open-4-left.png | Bin 0 -> 12243 bytes .../4-cassettes/4-cassettes-open-4-left.svg | 106 + .../tejo/4-cassettes/4-cassettes-open-4.png | Bin 0 -> 14108 bytes .../tejo/4-cassettes/4-cassettes-open-4.svg | 108 + .../customer-list-view/white.svg | 11 + .../customer-list-view/zodiac.svg | 11 + .../circle buttons/exception-view/white.svg | 12 + .../circle buttons/exception-view/zodiac.svg | 12 + .../icons/circle buttons/filter/white.svg | 20 + .../icons/circle buttons/filter/zodiac.svg | 20 + .../icons/circle buttons/history/white.svg | 15 + .../icons/circle buttons/history/zodiac.svg | 15 + .../icons/circle buttons/law/white.svg | 13 + .../icons/circle buttons/law/zodiac.svg | 13 + .../circle buttons/listing-view/white.svg | 13 + .../circle buttons/listing-view/zodiac.svg | 13 + .../icons/circle buttons/overview/comet.svg | 10 + .../icons/circle buttons/overview/white.svg | 10 + .../icons/circle buttons/overview/zodiac.svg | 10 + .../icons/circle buttons/save/white.svg | 22 + .../icons/circle buttons/save/zodiac.svg | 27 + .../icons/circle buttons/search/white.svg | 12 + .../icons/circle buttons/search/zodiac.svg | 13 + .../icons/circle buttons/settings/white.svg | 11 + .../icons/circle buttons/settings/zodiac.svg | 11 + .../icons/circle buttons/share/white.svg | 13 + .../icons/circle buttons/share/zodiac.svg | 13 + .../icons/circle buttons/upload/white.svg | 17 + .../icons/circle buttons/upload/zodiac.svg | 17 + .../icons/circle buttons/wizard/white.svg | 12 + .../icons/circle buttons/wizard/zodiac.svg | 12 + .../icons/compliance/custom-requirement.svg | 889 + .../src/styling/icons/compliance/keyboard.svg | 26 + .../src/styling/icons/compliance/keypad.svg | 19 + .../src/styling/icons/compliance/list.svg | 17 + .../styling/icons/customer-nav/data/comet.svg | 11 + .../styling/icons/customer-nav/data/white.svg | 11 + .../icons/customer-nav/data/zodiac.svg | 11 + .../styling/icons/customer-nav/note/comet.svg | 12 + .../styling/icons/customer-nav/note/white.svg | 12 + .../icons/customer-nav/note/zodiac.svg | 12 + .../icons/customer-nav/overview/comet.svg | 10 + .../icons/customer-nav/overview/white.svg | 10 + .../icons/customer-nav/overview/zodiac.svg | 10 + .../icons/customer-nav/photos/comet.svg | 13 + .../icons/customer-nav/photos/white.svg | 13 + .../src/styling/icons/dashboard/down.svg | 16 + .../src/styling/icons/dashboard/equal.svg | 13 + .../src/styling/icons/dashboard/up.svg | 16 + .../src/styling/icons/direction/cash-in.png | Bin 0 -> 599 bytes .../src/styling/icons/direction/cash-in.svg | 12 + .../src/styling/icons/direction/cash-out.png | Bin 0 -> 625 bytes .../src/styling/icons/direction/cash-out.svg | 13 + .../admin-ui/src/styling/icons/file/comet.svg | 34 + .../src/styling/icons/file/spring.svg | 34 + .../src/styling/icons/file/tomato.svg | 34 + .../src/styling/icons/menu/logo-white.svg | 22 + .../admin-ui/src/styling/icons/menu/logo.svg | 22 + .../icons/menu/notification-zodiac.svg | 16 + .../src/styling/icons/menu/notification.svg | 16 + .../src/styling/icons/menu/search-zodiac.svg | 16 + .../src/styling/icons/menu/search.svg | 16 + .../src/styling/icons/month arrows/left.svg | 30 + .../src/styling/icons/month arrows/right.svg | 28 + .../icons/month arrows/right_white.svg | 28 + .../styling/icons/stage/spring/complete.svg | 13 + .../styling/icons/stage/spring/current.svg | 12 + .../src/styling/icons/stage/spring/empty.svg | 11 + .../styling/icons/stage/zodiac/complete.svg | 13 + .../styling/icons/stage/zodiac/current.svg | 12 + .../src/styling/icons/stage/zodiac/empty.svg | 11 + .../src/styling/icons/stage/zodiac/full.svg | 12 + .../src/styling/icons/status/pumpkin.svg | 5 + .../src/styling/icons/status/spring2.svg | 5 + .../src/styling/icons/status/tomato.svg | 5 + .../admin-ui/src/styling/icons/stripes.svg | 29 + .../src/styling/icons/table/empty-table.svg | 59 + .../src/styling/icons/table/false.svg | 16 + .../admin-ui/src/styling/icons/table/true.svg | 11 + .../src/styling/icons/warning-icon/comet.svg | 13 + .../src/styling/icons/warning-icon/tomato.svg | 13 + .../src/styling/icons/widgets/delete.png | Bin 0 -> 1027 bytes .../src/styling/icons/widgets/drag.png | Bin 0 -> 367 bytes .../src/styling/icons/widgets/expand.png | Bin 0 -> 316 bytes .../src/styling/icons/widgets/full screen.png | Bin 0 -> 399 bytes .../src/styling/logos/icon-bitcoin-colour.svg | 7 + .../styling/logos/icon-bitcoincash-colour.svg | 6 + .../src/styling/logos/icon-dash-colour.svg | 7 + .../styling/logos/icon-ethereum-colour.svg | 14 + .../styling/logos/icon-litecoin-colour.svg | 5 + .../src/styling/logos/icon-monero-colour.svg | 6 + .../src/styling/logos/icon-tether-colour.svg | 6 + .../src/styling/logos/icon-tron-colour.svg | 9 + .../src/styling/logos/icon-usdc-colour.svg | 8 + .../src/styling/logos/icon-zcash-colour.svg | 16 + packages/admin-ui/src/styling/theme.js | 349 + packages/admin-ui/src/styling/variables.js | 176 + packages/admin-ui/src/utils/apollo.jsx | 82 + .../admin-ui/src/utils/bill-denominations.js | 433 + packages/admin-ui/src/utils/bill-options.js | 12 + packages/admin-ui/src/utils/config.js | 42 + packages/admin-ui/src/utils/constants.js | 23 + packages/admin-ui/src/utils/customer.js | 37 + packages/admin-ui/src/utils/machine.js | 55 + .../src/utils/materialReactTableOpts.js | 52 + packages/admin-ui/src/utils/nullCheck.js | 7 + packages/admin-ui/src/utils/number.js | 21 + packages/admin-ui/src/utils/string.js | 59 + packages/admin-ui/src/utils/time.js | 7 + packages/admin-ui/src/utils/timezone-list.js | 148 + packages/admin-ui/src/utils/timezones.js | 25 + packages/admin-ui/src/utils/urlResolver.js | 9 + packages/admin-ui/vite.config.js | 28 + packages/server/.sample.env | 57 + packages/server/Lamassu_CA.pem | 33 + packages/server/bin/bip39 | 9 + packages/server/bin/hkdf | 17 + packages/server/bin/lamassu-admin-server | 5 + .../bin/lamassu-admin-server-entrypoint.sh | 26 + packages/server/bin/lamassu-backup-pg | 17 + packages/server/bin/lamassu-batch-diagnostics | 36 + packages/server/bin/lamassu-btc-bumpfee | 47 + packages/server/bin/lamassu-clean-parsed-id | 43 + packages/server/bin/lamassu-coinatmradar | 11 + packages/server/bin/lamassu-coins | 7 + .../server/bin/lamassu-configure-frontcamera | 11 + packages/server/bin/lamassu-devices | 7 + packages/server/bin/lamassu-eth-recovery | 67 + .../bin/lamassu-eth-sweep-to-new-wallet | 298 + packages/server/bin/lamassu-migrate | 46 + packages/server/bin/lamassu-mnemonic | 9 + packages/server/bin/lamassu-ofac-update | 11 + packages/server/bin/lamassu-operator | 14 + packages/server/bin/lamassu-register | 51 + packages/server/bin/lamassu-send-coins | 90 + packages/server/bin/lamassu-server | 12 + .../server/bin/lamassu-server-entrypoint.sh | 25 + packages/server/bin/lamassu-trx-recovery | 53 + packages/server/bin/lamassu-update-cassettes | 36 + packages/server/bin/lamassu-update-recyclers | 36 + .../server/bin/lamassu-update-to-mnemonic | 30 + .../server/bin/lamassu-update-wallet-nodes | 43 + packages/server/lib/app.js | 88 + packages/server/lib/auth-tokens.js | 15 + packages/server/lib/bill-math.js | 174 + packages/server/lib/blacklist.js | 59 + packages/server/lib/blockchain/bitcoin.js | 149 + packages/server/lib/blockchain/bitcoincash.js | 74 + packages/server/lib/blockchain/common.js | 222 + packages/server/lib/blockchain/dash.js | 105 + packages/server/lib/blockchain/do-volume.js | 76 + packages/server/lib/blockchain/ethereum.js | 40 + packages/server/lib/blockchain/install.js | 336 + packages/server/lib/blockchain/litecoin.js | 100 + packages/server/lib/blockchain/monero.js | 61 + packages/server/lib/blockchain/zcash.js | 94 + .../lib/blockexplorers/mempool.space.js | 18 + packages/server/lib/bn.js | 5 + packages/server/lib/cash-in/cash-in-atomic.js | 106 + packages/server/lib/cash-in/cash-in-low.js | 195 + packages/server/lib/cash-in/cash-in-tx.js | 272 + .../server/lib/cash-out/cash-out-actions.js | 63 + .../server/lib/cash-out/cash-out-atomic.js | 220 + .../server/lib/cash-out/cash-out-helper.js | 197 + packages/server/lib/cash-out/cash-out-low.js | 98 + packages/server/lib/cash-out/cash-out-tx.js | 242 + packages/server/lib/cashbox-batches.js | 223 + packages/server/lib/coin-change.js | 104 + .../server/lib/coinatmradar/coinatmradar.js | 179 + .../coinatmradar/test/coinatmradar.test.js | 265 + packages/server/lib/commission-math.js | 59 + packages/server/lib/compliance-external.js | 70 + packages/server/lib/compliance-triggers.js | 84 + packages/server/lib/compliance.js | 91 + packages/server/lib/compliance_overrides.js | 32 + packages/server/lib/constants.js | 100 + packages/server/lib/customer-notes.js | 33 + packages/server/lib/customers.js | 1060 ++ packages/server/lib/db-error-codes.js | 4 + packages/server/lib/db-migrate-store.js | 23 + packages/server/lib/db.js | 42 + packages/server/lib/email.js | 25 + packages/server/lib/environment-helper.js | 44 + packages/server/lib/error.js | 27 + packages/server/lib/event-bus.js | 32 + packages/server/lib/exchange.js | 95 + packages/server/lib/forex.js | 84 + packages/server/lib/graphql/resolvers.js | 473 + packages/server/lib/graphql/server.js | 29 + packages/server/lib/graphql/types.js | 250 + packages/server/lib/hardware-credentials.js | 36 + packages/server/lib/layer2.js | 62 + packages/server/lib/logger.js | 48 + packages/server/lib/logs.js | 164 + packages/server/lib/loyalty.js | 78 + packages/server/lib/machine-loader.js | 839 + packages/server/lib/machine-settings.js | 145 + packages/server/lib/middlewares/addRWBytes.js | 15 + packages/server/lib/middlewares/authorize.js | 21 + packages/server/lib/middlewares/ca.js | 16 + .../server/lib/middlewares/errorHandler.js | 14 + .../lib/middlewares/filterOldRequests.js | 31 + packages/server/lib/middlewares/operatorId.js | 15 + .../lib/middlewares/populateDeviceId.js | 29 + .../middlewares/populateMachineSettings.js | 25 + .../lib/middlewares/populateSettings.js | 89 + packages/server/lib/middlewares/recordPing.js | 14 + .../middlewares/rejectIncompatbleMachines.js | 35 + packages/server/lib/middlewares/state.js | 21 + packages/server/lib/migrate.js | 24 + packages/server/lib/mnemonic-helpers.js | 19 + packages/server/lib/new-admin/admin-server.js | 147 + .../server/lib/new-admin/config/accounts.js | 213 + .../lib/new-admin/config/data/countries.json | 250 + .../lib/new-admin/config/data/currencies.json | 2423 +++ .../lib/new-admin/config/data/languages.json | 266 + packages/server/lib/new-admin/config/index.js | 52 + packages/server/lib/new-admin/filters.js | 31 + .../lib/new-admin/graphql/directives/auth.js | 53 + .../lib/new-admin/graphql/directives/index.js | 3 + .../server/lib/new-admin/graphql/errors.js | 107 + .../modules/authentication/FIDO2FAStrategy.js | 199 + .../FIDOPasswordlessStrategy.js | 187 + .../FIDOUsernamelessStrategy.js | 193 + .../graphql/modules/authentication/index.js | 17 + .../graphql/modules/userManagement.js | 312 + .../graphql/resolvers/bill.resolver.js | 9 + .../graphql/resolvers/blacklist.resolver.js | 18 + .../graphql/resolvers/cashbox.resolver.js | 25 + .../graphql/resolvers/config.resolver.js | 15 + .../graphql/resolvers/currency.resolver.js | 10 + .../resolvers/customInfoRequests.resolver.js | 56 + .../graphql/resolvers/customer.resolver.js | 84 + .../graphql/resolvers/funding.resolver.js | 9 + .../lib/new-admin/graphql/resolvers/index.js | 57 + .../graphql/resolvers/log.resolver.js | 29 + .../graphql/resolvers/loyalty.resolver.js | 32 + .../graphql/resolvers/machine.resolver.js | 33 + .../resolvers/machineGroups.resolver.js | 39 + .../graphql/resolvers/market.resolver.js | 9 + .../resolvers/notification.resolver.js | 16 + .../graphql/resolvers/pairing.resolver.js | 9 + .../graphql/resolvers/rates.resolver.js | 21 + .../graphql/resolvers/sanctions.resolver.js | 13 + .../graphql/resolvers/scalar.resolver.js | 13 + .../graphql/resolvers/settings.resolver.js | 15 + .../graphql/resolvers/sms.resolver.js | 15 + .../graphql/resolvers/status.resolver.js | 13 + .../graphql/resolvers/transaction.resolver.js | 126 + .../graphql/resolvers/triggers.resolver.js | 48 + .../graphql/resolvers/users.resolver.js | 170 + .../graphql/resolvers/version.resolver.js | 9 + .../server/lib/new-admin/graphql/schema.js | 7 + .../lib/new-admin/graphql/types/bill.type.js | 18 + .../new-admin/graphql/types/blacklist.type.js | 28 + .../new-admin/graphql/types/cashbox.type.js | 30 + .../new-admin/graphql/types/config.type.js | 29 + .../new-admin/graphql/types/currency.type.js | 22 + .../graphql/types/customInfoRequests.type.js | 73 + .../new-admin/graphql/types/customer.type.js | 146 + .../new-admin/graphql/types/funding.type.js | 23 + .../lib/new-admin/graphql/types/index.js | 57 + .../lib/new-admin/graphql/types/log.type.js | 50 + .../new-admin/graphql/types/loyalty.type.js | 38 + .../new-admin/graphql/types/machine.type.js | 112 + .../graphql/types/machineGroups.type.js | 26 + .../new-admin/graphql/types/market.type.js | 9 + .../graphql/types/notification.type.js | 26 + .../new-admin/graphql/types/pairing.type.js | 9 + .../lib/new-admin/graphql/types/rates.type.js | 16 + .../new-admin/graphql/types/sanctions.type.js | 13 + .../new-admin/graphql/types/scalar.type.js | 10 + .../new-admin/graphql/types/settings.type.js | 15 + .../lib/new-admin/graphql/types/sms.type.js | 31 + .../new-admin/graphql/types/status.type.js | 16 + .../graphql/types/transaction.type.js | 111 + .../new-admin/graphql/types/triggers.type.js | 73 + .../lib/new-admin/graphql/types/users.type.js | 114 + .../new-admin/graphql/types/version.type.js | 9 + .../middlewares/cleanUserSessions.js | 25 + .../lib/new-admin/middlewares/context.js | 29 + .../server/lib/new-admin/middlewares/index.js | 9 + .../lib/new-admin/middlewares/session.js | 29 + .../server/lib/new-admin/services/bills.js | 60 + .../new-admin/services/customInfoRequests.js | 168 + .../server/lib/new-admin/services/funding.js | 88 + .../server/lib/new-admin/services/login.js | 23 + .../lib/new-admin/services/machineGroups.js | 56 + .../server/lib/new-admin/services/machines.js | 27 + .../server/lib/new-admin/services/pairing.js | 37 + .../new-admin/services/restriction-level.js | 18 + .../lib/new-admin/services/server-logs.js | 22 + .../lib/new-admin/services/supervisor.js | 64 + .../lib/new-admin/services/transactions.js | 232 + .../server/lib/new-admin/services/triggers.js | 48 + packages/server/lib/new-config-manager.js | 291 + packages/server/lib/new-settings-loader.js | 111 + packages/server/lib/notifier/codes.js | 52 + packages/server/lib/notifier/email.js | 107 + packages/server/lib/notifier/index.js | 380 + .../server/lib/notifier/notificationCenter.js | 298 + packages/server/lib/notifier/queries.js | 116 + packages/server/lib/notifier/sms.js | 58 + .../server/lib/notifier/test/email.test.js | 28 + .../server/lib/notifier/test/notifier.test.js | 348 + packages/server/lib/notifier/test/sms.test.js | 22 + .../server/lib/notifier/test/utils.test.js | 104 + packages/server/lib/notifier/utils.js | 223 + packages/server/lib/notifier/webhook.js | 21 + packages/server/lib/ofac/index.js | 78 + packages/server/lib/ofac/loading.js | 102 + packages/server/lib/ofac/matching.js | 123 + packages/server/lib/ofac/name-utils.js | 38 + packages/server/lib/ofac/parsing.js | 161 + packages/server/lib/ofac/update.js | 149 + packages/server/lib/operator.js | 14 + packages/server/lib/pairing.js | 84 + packages/server/lib/pg-transport.js | 43 + packages/server/lib/plugin-helper.js | 29 + packages/server/lib/plugins.js | 1067 ++ packages/server/lib/plugins/common/ccxt.js | 53 + .../server/lib/plugins/common/json-rpc.js | 151 + .../server/lib/plugins/compliance/consts.js | 6 + .../mock-compliance/mock-compliance.js | 31 + .../lib/plugins/compliance/sumsub/request.js | 37 + .../plugins/compliance/sumsub/sumsub.api.js | 102 + .../lib/plugins/compliance/sumsub/sumsub.js | 58 + .../lib/plugins/email/mailgun/mailgun.js | 37 + .../plugins/email/mock-email/mock-email.js | 15 + .../server/lib/plugins/exchange/binance.js | 28 + .../server/lib/plugins/exchange/binanceus.js | 28 + .../server/lib/plugins/exchange/bitfinex.js | 30 + .../server/lib/plugins/exchange/bitstamp.js | 31 + packages/server/lib/plugins/exchange/ccxt.js | 129 + packages/server/lib/plugins/exchange/cex.js | 28 + .../server/lib/plugins/exchange/consts.js | 6 + packages/server/lib/plugins/exchange/itbit.js | 42 + .../server/lib/plugins/exchange/kraken.js | 56 + .../lib/plugins/exchange/mock-exchange.js | 24 + .../server/lib/plugins/sms/inforu/inforu.js | 47 + .../lib/plugins/sms/mock-sms/mock-sms.js | 19 + .../server/lib/plugins/sms/telnyx/telnyx.js | 20 + .../server/lib/plugins/sms/twilio/twilio.js | 47 + .../server/lib/plugins/sms/vonage/vonage.js | 25 + .../lib/plugins/sms/whatsapp/whatsapp.js | 41 + packages/server/lib/plugins/ticker/bitpay.js | 30 + packages/server/lib/plugins/ticker/ccxt.js | 77 + .../server/lib/plugins/ticker/mock-ticker.js | 12 + .../ticker/pazuz-ticker/pazuz-ticker.js | 27 + .../server/lib/plugins/tokens/erc20.abi.json | 272 + packages/server/lib/plugins/tokens/index.js | 3 + .../wallet-scoring/elliptic/elliptic.js | 101 + .../mock-scoring/mock-scoring.js | 32 + .../wallet-scoring/scorechain/scorechain.js | 82 + .../wallet/bitcoincashd/bitcoincashd.js | 163 + .../lib/plugins/wallet/bitcoind/bitcoind.js | 252 + .../server/lib/plugins/wallet/bitgo/bitgo.js | 191 + .../server/lib/plugins/wallet/dashd/dashd.js | 157 + .../server/lib/plugins/wallet/galoy/galoy.js | 436 + .../server/lib/plugins/wallet/geth/base.js | 399 + .../server/lib/plugins/wallet/geth/geth.js | 15 + .../lib/plugins/wallet/infura/infura.js | 79 + .../lib/plugins/wallet/litecoind/litecoind.js | 147 + .../plugins/wallet/mock-wallet/mock-wallet.js | 175 + .../lib/plugins/wallet/monerod/monerod.js | 303 + .../server/lib/plugins/wallet/tron/base.js | 221 + .../lib/plugins/wallet/trongrid/trongrid.js | 12 + .../lib/plugins/wallet/zcashd/zcashd.js | 185 + .../zero-conf/blockcypher/blockcypher.js | 68 + .../mock-zero-conf/mock-zero-conf.js | 11 + packages/server/lib/poller.js | 336 + packages/server/lib/postgresql_interface.js | 100 + packages/server/lib/pp.js | 7 + packages/server/lib/respond.js | 20 + packages/server/lib/route-helpers.js | 107 + packages/server/lib/routes.js | 132 + packages/server/lib/routes/cashboxRoutes.js | 44 + packages/server/lib/routes/customerRoutes.js | 451 + .../server/lib/routes/diagnosticsRoutes.js | 14 + packages/server/lib/routes/failedQRScans.js | 14 + packages/server/lib/routes/logsRoutes.js | 37 + packages/server/lib/routes/pairingRoutes.js | 28 + .../server/lib/routes/performanceRoutes.js | 24 + packages/server/lib/routes/probeLnRoutes.js | 20 + packages/server/lib/routes/stateRoutes.js | 16 + .../lib/routes/termsAndConditionsRoutes.js | 32 + packages/server/lib/routes/txRoutes.js | 89 + packages/server/lib/routes/unitsRoutes.js | 26 + .../lib/routes/verifyPromoCodeRoutes.js | 46 + packages/server/lib/routes/verifyTxRoutes.js | 16 + .../server/lib/routes/verifyUserRoutes.js | 16 + packages/server/lib/sanctions.js | 58 + packages/server/lib/session-manager.js | 49 + packages/server/lib/sms-notices.js | 67 + packages/server/lib/sms.js | 121 + packages/server/lib/ticker.js | 73 + packages/server/lib/time.js | 27 + packages/server/lib/tx-batching-processing.js | 30 + packages/server/lib/tx-batching.js | 89 + packages/server/lib/tx.js | 104 + packages/server/lib/users.js | 216 + packages/server/lib/utils.js | 10 + packages/server/lib/wallet-scoring.js | 51 + packages/server/lib/wallet.js | 389 + packages/server/migrations/001-initial.js | 38 + packages/server/migrations/002-bills.js | 22 + .../server/migrations/003-device-events.js | 20 + .../migrations/004-transactions-reload.js | 88 + packages/server/migrations/005-addCrypto.js | 18 + .../migrations/006-add-machine-config.js | 19 + packages/server/migrations/007-add-phone.js | 13 + packages/server/migrations/008-add-two-way.js | 33 + .../migrations/009-update-timestamps.js | 17 + .../server/migrations/010-cached-requests.js | 25 + .../migrations/011-transactions-reload-2.js | 72 + .../migrations/012-add-hd-path-serial.js | 19 + .../server/migrations/013-add-last-checked.js | 14 + .../server/migrations/014-session-to-tx-id.js | 36 + .../server/migrations/015-paired_devices.js | 17 + .../016-new_cached_requests_table.js | 20 + packages/server/migrations/017-user_tokens.js | 22 + .../server/migrations/018-alter_devices.js | 24 + .../migrations/019-remove-dispense-counts.js | 14 + .../migrations/020-add-server-events.js | 17 + .../migrations/021-config-version-id.js | 16 + .../server/migrations/022-add_cash_in_sent.js | 18 + .../023-add-dispenses-to-cash-out.js | 20 + .../server/migrations/024-consolidate-hd.js | 23 + .../server/migrations/025-create_trades.js | 20 + .../migrations/026-add_send_confirmed.js | 20 + packages/server/migrations/027-tx_errors.js | 20 + .../server/migrations/028-cash_out_actions.js | 41 + .../029-add_valid_to_user_config.js | 10 + .../migrations/030-cash-out-provision.js | 15 + .../031-remove_name_from_devices.js | 10 + .../032-create_machine_pings_table.js | 29 + .../server/migrations/033-add_cash_in_fee.js | 17 + .../migrations/034-add_cash_out_error_code.js | 10 + .../server/migrations/035-log_bank_notes.js | 26 + .../migrations/036-add_customers_table.js | 33 + ...037-add_compliance_authorizations_table.js | 19 + .../1503907708756-drop-device-time.js | 14 + .../1503945570220-add-tx-version.js | 14 + ...044429557-add_cash_out_txs_published_at.js | 14 + .../1505296896905-manual-override.js | 55 + ...507639057362-compliance-override-naming.js | 42 + .../server/migrations/1508261875640-logs.js | 18 + .../migrations/1509091634946-support_logs.js | 17 + ...09439657189-add_machine_name_to_devices.js | 18 + .../1514981004673-add_serial_to_logs.js | 10 + .../1525671972351-add_sanctions_logs.js | 20 + .../1526034901860-crypto_atoms_to_numeric.js | 18 + .../1526038623129-add_device_location.js | 13 + .../1527814550220-add-tx-terms-accepted.js | 14 + .../1528017752387-add-layer2-address.js | 13 + ...47391-add-device-id-to-cash-out-actions.js | 12 + .../1542638179228-alter-machine-pings.js | 17 + .../1542811343367-add-error-to-trades.js | 13 + .../migrations/1542926067866-tx-commission.js | 16 + .../1543182139555-tx-ticker-price.js | 16 + .../1552064796155-tx-paper-wallet.js | 15 + .../1556157018569-truncate-server-events.js | 11 + .../migrations/1556582597515-blacklist.js | 17 + .../1557800959028-machine-pings-rename.js | 11 + .../1564485980102-alter-blacklist.js | 13 + .../1572524820075-server-support-logs.js | 23 + .../1581455088977-add-amount-received.js | 13 + .../1592317667188-machine-version-name.js | 14 + ...295132361-schema-version-on-user-config.js | 13 + .../1599523522436-migrate-config.js | 11 + .../migrations/1601649726488-user-suspend.js | 11 + .../server/migrations/1601908070568-us-ssn.js | 17 + .../1603438527057-add-browser-os-info.js | 14 + .../1603804834628-add-last-accessed-tokens.js | 11 + .../1603853985238-remove-support-log.js | 14 + .../migrations/1603886141913-coupon-codes.js | 18 + .../1604419505567-add-discount-to-txs.js | 14 + .../migrations/1604934042127-clean-bills.js | 15 + ...607009558538-create-notifications-table.js | 38 + ...70940-alter-blacklist-unique-constraint.js | 16 + .../migrations/1610716756175-id-card-raw.js | 11 + .../1616528363530-add_cashbox_batches.js | 26 + ...1616687417371-add_internal_tx_to_trades.js | 22 + .../1617742522808-zeroConfLimit-migrate.js | 50 + .../1617967601902-add-batches-type.js | 25 + ...5-add-default-advanced-trigger-settings.js | 19 + .../migrations/1618507684019-rename-0-conf.js | 21 + .../server/migrations/1618843631500-users.js | 97 + ...83-fiat-balance-notification-to-percent.js | 86 + .../1620165712260-custom-info-requests.js | 24 + .../migrations/1620319260238-timezones.js | 16 + .../1620335170327-hardware-credentials.js | 20 + ...620680439585-add-cashbox-reset-settings.js | 20 + .../1621430588944-notify-cashbox-removal.js | 21 + .../1621556014244-add-btc-tx-batching.js | 24 + .../1623413776161-create-operator-ids.js | 53 + ...623975493095-add-crypto-units-to-config.js | 32 + ...624214428956-txs-addresses-to-blacklist.js | 18 + ...-add-usssn-type-to-compliance-overrides.js | 11 + ...5844773-add-machine-network-performance.js | 26 + .../1626891847835-add-individual-discounts.js | 22 + .../migrations/1627518944902-custom-sms.js | 19 + ...627563019030-add-customer-tc-photo-path.js | 13 + .../1627868356883-customer-custom-notes.js | 21 + .../1628100660620-subscriber-info.js | 15 + ...1630432869178-add-more-cassette-support.js | 56 + .../1630624117042-customer-custom-fields.js | 23 + .../1635159374499-editable-customer-data.js | 33 + ...637877732001-add_unpaired_devices_table.js | 22 + .../1639577650032-wallet-scoring.js | 11 + .../1641394367865-testing-customer-toggle.js | 13 + ...376890-add-overrides-to-subscriber-info.js | 17 + .../1641486859782-wallet-scoring-cash-out.js | 11 + ...42518884925-manual-custom-info-requests.js | 16 + ...3996603839-change-custom-sms-to-notices.js | 37 + ...5010873828-add-advanced-wallet-settings.js | 20 + .../1645459054117-default-timezone.js | 19 + ...1649944954805-terms-and-conditions-hash.js | 9 + .../1655807727853-default_timezone_fix.js | 19 + ...716689-remove-coin-specific-cryptounits.js | 26 + .../1661125970289-eth-zero-conf-value.js | 24 + .../migrations/1665418064066-set-node-env.js | 24 + ...0425142650-deprecate-cash-in-fee-crypto.js | 11 + .../1681428616990-aveiro-recycler-settings.js | 117 + .../1691523881128-bills-using-text.js | 18 + .../1696845395350-recycler-rename-settings.js | 90 + .../1700123461281-customer-email.js | 14 + ...23461282-customer-auth-advanced-trigger.js | 18 + .../migrations/1700123461283-phone-on-tx.js | 14 + .../migrations/1716561996854-diagnostics.js | 15 + ...716969535424-customer-last-auth-attempt.js | 11 + .../1716974904249-ciphertrace-error-code.js | 13 + .../1718464437502-integrate-sumsub.js | 21 + ...721313145136-customer-last-used-machine.js | 14 + .../1724242113482-drop-last-used-fkey.js | 12 + ...0112740-add-cashout-fee-to-cash_out_txs.js | 11 + ...90112741-add-cashout-fee-to-user_config.js | 6 + .../1732874039534-market-currency.js | 36 + .../1732881489395-coin-agnostic-blacklist.js | 18 + .../1732881489396-advanced-blacklisting.js | 24 + .../migrations/1732881659436-rates-screen.js | 20 + .../1743526540370-deprecate-tables.js | 16 + .../1744294267662-bills-performance.js | 14 + .../1744294267663-blacklist-normalization.js | 15 + .../1744294267663-customer-id-index.js | 12 + .../1748423577379-add-last-used-address.js | 16 + ...51637988-relational-compliance-triggers.js | 131 + .../1751291688761-add-machine-groups.js | 18 + .../1752141860742-compliance-triggers-sets.js | 48 + .../1752599801402-add-coupon-fk-to-txs.js | 15 + ...ine-groups-with-compliance-trigger-sets.js | 18 + ...000000-add-restriction-level-to-devices.js | 10 + packages/server/migrations/db.js | 17 + packages/server/migrations/settings.js | 94 + packages/server/package.json | 137 + packages/server/tests/stress/cli.js | 72 + packages/server/tests/stress/consts.js | 10 + packages/server/tests/stress/db.js | 78 + packages/server/tests/stress/env.js | 93 + packages/server/tests/stress/index.js | 78 + packages/server/tests/stress/machines.js | 123 + .../tests/stress/scripts/create-machines.sh | 50 + packages/server/tests/stress/server.js | 56 + .../tests/stress/utils/default-config.json | 19 + .../server/tests/stress/utils/variables.js | 7 + packages/server/tools/build-dev-env.js | 38 + packages/server/tools/build-docker-certs.sh | 87 + packages/server/tools/build-prod-env.js | 58 + packages/server/tools/cert-gen.sh | 97 + .../tools/digitalocean/createblockstorage.sh | 74 + .../server/tools/digitalocean/migratedata.sh | 124 + .../tools/lamassu-server-stress-testing | 2 + packages/server/tools/migrate-env.js | 35 + packages/server/tools/set-env-var.js | 30 + packages/typesafe-db/package.json | 39 + .../typesafe-db/src/compliance-triggers.ts | 125 + packages/typesafe-db/src/customers.ts | 216 + packages/typesafe-db/src/db.ts | 42 + packages/typesafe-db/src/index.ts | 9 + .../src/interpolated-query-logger.ts | 30 + packages/typesafe-db/src/machine-groups.ts | 64 + packages/typesafe-db/src/machines.ts | 35 + packages/typesafe-db/src/notify.ts | 24 + packages/typesafe-db/src/pg-error-codes.ts | 4 + packages/typesafe-db/src/transactions.ts | 389 + .../typesafe-db/src/types/manual.types.d.ts | 35 + packages/typesafe-db/src/types/types.d.ts | 796 + packages/typesafe-db/src/user-config.ts | 114 + packages/typesafe-db/tsconfig.json | 23 + pnpm-lock.yaml | 15301 ++++++++++++++++ pnpm-workspace.yaml | 23 + shell.nix | 18 + turbo.json | 22 + 1145 files changed, 97211 insertions(+) create mode 100644 .dockerignore create mode 100644 .github/workflows/build.yml create mode 100644 .github/workflows/docker-build.yml create mode 100644 .github/workflows/test.yml create mode 100644 .gitignore create mode 100755 .husky/pre-commit create mode 100644 .prettierrc create mode 100644 .tool-versions create mode 100644 .vscode/launch.json create mode 100644 .vscode/settings.json create mode 100644 CRYPTO_README.md create mode 100644 LICENSE create mode 100644 README.md create mode 100644 build/docker-compose.yaml create mode 100644 build/server.Dockerfile create mode 100644 eslint.config.mjs create mode 100644 package.json create mode 100644 packages/admin-ui/.gitignore create mode 100644 packages/admin-ui/README.md create mode 100644 packages/admin-ui/index.html create mode 100644 packages/admin-ui/package.json create mode 100644 packages/admin-ui/public/assets/wizard/fullexample.commissions.png create mode 100644 packages/admin-ui/public/assets/wizard/fullexample.locale.png create mode 100644 packages/admin-ui/public/assets/wizard/fullexample.twilio.png create mode 100644 packages/admin-ui/public/assets/wizard/fullexample.wallet.png create mode 100644 packages/admin-ui/public/favicon.ico create mode 100644 packages/admin-ui/public/fonts/BPmono/BPmono.ttf create mode 100644 packages/admin-ui/public/fonts/BPmono/BPmonoBold.ttf create mode 100644 packages/admin-ui/public/fonts/BPmono/BPmonoItalic.ttf create mode 100644 packages/admin-ui/public/fonts/MontHeavy/mont-bold-webfont.woff create mode 100644 packages/admin-ui/public/fonts/MontHeavy/mont-bold-webfont.woff2 create mode 100644 packages/admin-ui/public/fonts/MontHeavy/mont-heavy-webfont.woff create mode 100644 packages/admin-ui/public/fonts/MontHeavy/mont-heavy-webfont.woff2 create mode 100644 packages/admin-ui/public/fonts/MuseoSans/MuseoSans_500-webfont.woff create mode 100644 packages/admin-ui/public/fonts/MuseoSans/MuseoSans_500-webfont.woff2 create mode 100644 packages/admin-ui/public/fonts/MuseoSans/MuseoSans_700-webfont.woff create mode 100644 packages/admin-ui/public/fonts/MuseoSans/MuseoSans_700-webfont.woff2 create mode 100644 packages/admin-ui/public/fonts/Rubik/Rubik-Black.otf create mode 100644 packages/admin-ui/public/fonts/Rubik/Rubik-Bold.otf create mode 100644 packages/admin-ui/public/fonts/Rubik/Rubik-Medium.otf create mode 100644 packages/admin-ui/public/manifest.json create mode 100644 packages/admin-ui/public/robots.txt create mode 100644 packages/admin-ui/public/wizard-background.svg create mode 100644 packages/admin-ui/src/App.jsx create mode 100644 packages/admin-ui/src/AppContext.js create mode 100644 packages/admin-ui/src/Main.jsx create mode 100644 packages/admin-ui/src/components/Carousel.jsx create mode 100644 packages/admin-ui/src/components/Carousel.module.css create mode 100644 packages/admin-ui/src/components/CollapsibleCard.jsx create mode 100644 packages/admin-ui/src/components/ConfirmDialog.jsx create mode 100644 packages/admin-ui/src/components/CopyToClipboard.jsx create mode 100644 packages/admin-ui/src/components/DeleteDialog.jsx create mode 100644 packages/admin-ui/src/components/ErrorMessage.jsx create mode 100644 packages/admin-ui/src/components/ImagePopper.jsx create mode 100644 packages/admin-ui/src/components/InformativeDialog.jsx create mode 100644 packages/admin-ui/src/components/LogsDownloaderPopper.jsx create mode 100644 packages/admin-ui/src/components/Modal.jsx create mode 100644 packages/admin-ui/src/components/NotificationCenter/NotificationCenter.jsx create mode 100644 packages/admin-ui/src/components/NotificationCenter/NotificationCenter.module.css create mode 100644 packages/admin-ui/src/components/NotificationCenter/NotificationRow.jsx create mode 100644 packages/admin-ui/src/components/NotificationCenter/index.js create mode 100644 packages/admin-ui/src/components/Popper.jsx create mode 100644 packages/admin-ui/src/components/Popper.module.css create mode 100644 packages/admin-ui/src/components/PromptWhenDirty.jsx create mode 100644 packages/admin-ui/src/components/SearchBox.jsx create mode 100644 packages/admin-ui/src/components/SearchFilter.jsx create mode 100644 packages/admin-ui/src/components/Status.jsx create mode 100644 packages/admin-ui/src/components/Stepper.jsx create mode 100644 packages/admin-ui/src/components/Stepper.module.css create mode 100644 packages/admin-ui/src/components/Subtitle.jsx create mode 100644 packages/admin-ui/src/components/TableFilters.jsx create mode 100644 packages/admin-ui/src/components/Title.jsx create mode 100644 packages/admin-ui/src/components/Tooltip.jsx create mode 100644 packages/admin-ui/src/components/booleanPropertiesTable/BooleanPropertiesTable.jsx create mode 100644 packages/admin-ui/src/components/booleanPropertiesTable/index.js create mode 100644 packages/admin-ui/src/components/buttons/ActionButton.jsx create mode 100644 packages/admin-ui/src/components/buttons/ActionButton.module.css create mode 100644 packages/admin-ui/src/components/buttons/AddButton.jsx create mode 100644 packages/admin-ui/src/components/buttons/AddButton.module.css create mode 100644 packages/admin-ui/src/components/buttons/BaseButton.styles.js create mode 100644 packages/admin-ui/src/components/buttons/Button.jsx create mode 100644 packages/admin-ui/src/components/buttons/Button.module.css create mode 100644 packages/admin-ui/src/components/buttons/FeatureButton.jsx create mode 100644 packages/admin-ui/src/components/buttons/FeatureButton.module.css create mode 100644 packages/admin-ui/src/components/buttons/IDButton.jsx create mode 100644 packages/admin-ui/src/components/buttons/IDButton.module.css create mode 100644 packages/admin-ui/src/components/buttons/Link.jsx create mode 100644 packages/admin-ui/src/components/buttons/Link.module.css create mode 100644 packages/admin-ui/src/components/buttons/SubpageButton.jsx create mode 100644 packages/admin-ui/src/components/buttons/SubpageButton.module.css create mode 100644 packages/admin-ui/src/components/buttons/SubpageButton.styles.js create mode 100644 packages/admin-ui/src/components/buttons/SupportLinkButton.jsx create mode 100644 packages/admin-ui/src/components/buttons/index.js create mode 100644 packages/admin-ui/src/components/date-range-picker/Calendar.jsx create mode 100644 packages/admin-ui/src/components/date-range-picker/Calendar.module.css create mode 100644 packages/admin-ui/src/components/date-range-picker/DateRangePicker.jsx create mode 100644 packages/admin-ui/src/components/date-range-picker/Tile.jsx create mode 100644 packages/admin-ui/src/components/date-range-picker/Tile.module.css create mode 100644 packages/admin-ui/src/components/editableTable/Context.js create mode 100644 packages/admin-ui/src/components/editableTable/Header.jsx create mode 100644 packages/admin-ui/src/components/editableTable/NamespacedTable.jsx create mode 100644 packages/admin-ui/src/components/editableTable/Row.jsx create mode 100644 packages/admin-ui/src/components/editableTable/Row.module.css create mode 100644 packages/admin-ui/src/components/editableTable/Table.jsx create mode 100644 packages/admin-ui/src/components/editableTable/Table.module.css create mode 100644 packages/admin-ui/src/components/editableTable/index.js create mode 100644 packages/admin-ui/src/components/fake-table/Table.jsx create mode 100644 packages/admin-ui/src/components/fake-table/Table.module.css create mode 100644 packages/admin-ui/src/components/inputs/base/AsyncAutocomplete.jsx create mode 100644 packages/admin-ui/src/components/inputs/base/Autocomplete.jsx create mode 100644 packages/admin-ui/src/components/inputs/base/Checkbox.jsx create mode 100644 packages/admin-ui/src/components/inputs/base/CodeInput.jsx create mode 100644 packages/admin-ui/src/components/inputs/base/CodeInput.module.css create mode 100644 packages/admin-ui/src/components/inputs/base/Dropdown.jsx create mode 100644 packages/admin-ui/src/components/inputs/base/NumberInput.jsx create mode 100644 packages/admin-ui/src/components/inputs/base/RadioGroup.jsx create mode 100644 packages/admin-ui/src/components/inputs/base/SecretInput.jsx create mode 100644 packages/admin-ui/src/components/inputs/base/Select.jsx create mode 100644 packages/admin-ui/src/components/inputs/base/Select.module.css create mode 100644 packages/admin-ui/src/components/inputs/base/TextInput.jsx create mode 100644 packages/admin-ui/src/components/inputs/base/TextInput.module.css create mode 100644 packages/admin-ui/src/components/inputs/base/ToggleButtonGroup.jsx create mode 100644 packages/admin-ui/src/components/inputs/base/index.js create mode 100644 packages/admin-ui/src/components/inputs/cashbox/Cashbox.jsx create mode 100644 packages/admin-ui/src/components/inputs/cashbox/Cashbox.module.css create mode 100644 packages/admin-ui/src/components/inputs/formik/AsyncAutocomplete.jsx create mode 100644 packages/admin-ui/src/components/inputs/formik/Autocomplete.jsx create mode 100644 packages/admin-ui/src/components/inputs/formik/CashCassetteInput.jsx create mode 100644 packages/admin-ui/src/components/inputs/formik/Checkbox.jsx create mode 100644 packages/admin-ui/src/components/inputs/formik/Dropdown.jsx create mode 100644 packages/admin-ui/src/components/inputs/formik/NumberInput.jsx create mode 100644 packages/admin-ui/src/components/inputs/formik/RadioGroup.jsx create mode 100644 packages/admin-ui/src/components/inputs/formik/SecretInput.jsx create mode 100644 packages/admin-ui/src/components/inputs/formik/TextInput.jsx create mode 100644 packages/admin-ui/src/components/inputs/formik/ToggleButtonGroup.jsx create mode 100644 packages/admin-ui/src/components/inputs/formik/index.js create mode 100644 packages/admin-ui/src/components/inputs/index.js create mode 100644 packages/admin-ui/src/components/layout/Header.jsx create mode 100644 packages/admin-ui/src/components/layout/Header.module.css create mode 100644 packages/admin-ui/src/components/layout/Section.jsx create mode 100644 packages/admin-ui/src/components/layout/Sidebar.jsx create mode 100644 packages/admin-ui/src/components/layout/Sidebar.module.css create mode 100644 packages/admin-ui/src/components/layout/TitleSection.jsx create mode 100644 packages/admin-ui/src/components/machineActions/DiagnosticsModal.jsx create mode 100644 packages/admin-ui/src/components/machineActions/GroupModal.jsx create mode 100644 packages/admin-ui/src/components/machineActions/MachineActions.jsx create mode 100644 packages/admin-ui/src/components/single-row-table/SingleRowTable.jsx create mode 100644 packages/admin-ui/src/components/table/EditCell.jsx create mode 100644 packages/admin-ui/src/components/table/EmptyTable.jsx create mode 100644 packages/admin-ui/src/components/table/Table.jsx create mode 100644 packages/admin-ui/src/components/table/Table.module.css create mode 100644 packages/admin-ui/src/components/table/TableBody.jsx create mode 100644 packages/admin-ui/src/components/table/TableCell.jsx create mode 100644 packages/admin-ui/src/components/table/TableHead.jsx create mode 100644 packages/admin-ui/src/components/table/TableHeader.jsx create mode 100644 packages/admin-ui/src/components/table/TableRow.jsx create mode 100644 packages/admin-ui/src/components/table/index.js create mode 100644 packages/admin-ui/src/components/tables/DataTable.jsx create mode 100644 packages/admin-ui/src/components/typography/index.jsx create mode 100644 packages/admin-ui/src/components/typography/styles.js create mode 100644 packages/admin-ui/src/components/typography/typography.module.css create mode 100644 packages/admin-ui/src/index.jsx create mode 100644 packages/admin-ui/src/pages/AddMachine/AddMachine.jsx create mode 100644 packages/admin-ui/src/pages/AddMachine/index.js create mode 100644 packages/admin-ui/src/pages/Analytics/Analytics.jsx create mode 100644 packages/admin-ui/src/pages/Analytics/components/LegendEntry.jsx create mode 100644 packages/admin-ui/src/pages/Analytics/components/tooltips/GraphTooltip.jsx create mode 100644 packages/admin-ui/src/pages/Analytics/components/wrappers/HourOfDayWrapper.jsx create mode 100644 packages/admin-ui/src/pages/Analytics/components/wrappers/OverTimeWrapper.jsx create mode 100644 packages/admin-ui/src/pages/Analytics/components/wrappers/TopMachinesWrapper.jsx create mode 100644 packages/admin-ui/src/pages/Analytics/components/wrappers/VolumeOverTimeWrapper.jsx create mode 100644 packages/admin-ui/src/pages/Analytics/components/wrappers/wrappers.module.css create mode 100644 packages/admin-ui/src/pages/Analytics/graphs/Graph.jsx create mode 100644 packages/admin-ui/src/pages/Analytics/graphs/HourOfDayBarGraph.jsx create mode 100644 packages/admin-ui/src/pages/Analytics/graphs/OverTimeDotGraph.jsx create mode 100644 packages/admin-ui/src/pages/Analytics/graphs/OverTimeLineGraph.jsx create mode 100644 packages/admin-ui/src/pages/Analytics/graphs/TopMachinesBarGraph.jsx create mode 100644 packages/admin-ui/src/pages/Analytics/index.js create mode 100644 packages/admin-ui/src/pages/Authentication/Authentication.module.css create mode 100644 packages/admin-ui/src/pages/Authentication/Input2FAState.jsx create mode 100644 packages/admin-ui/src/pages/Authentication/InputFIDOState.jsx create mode 100644 packages/admin-ui/src/pages/Authentication/Login.jsx create mode 100644 packages/admin-ui/src/pages/Authentication/LoginCard.jsx create mode 100644 packages/admin-ui/src/pages/Authentication/LoginState.jsx create mode 100644 packages/admin-ui/src/pages/Authentication/Register.jsx create mode 100644 packages/admin-ui/src/pages/Authentication/Reset2FA.jsx create mode 100644 packages/admin-ui/src/pages/Authentication/ResetPassword.jsx create mode 100644 packages/admin-ui/src/pages/Authentication/Setup2FAState.jsx create mode 100644 packages/admin-ui/src/pages/Authentication/states.js create mode 100644 packages/admin-ui/src/pages/Blacklist/Blacklist.jsx create mode 100644 packages/admin-ui/src/pages/Blacklist/BlacklistAdvanced.jsx create mode 100644 packages/admin-ui/src/pages/Blacklist/BlacklistModal.jsx create mode 100644 packages/admin-ui/src/pages/Blacklist/BlacklistTable.jsx create mode 100644 packages/admin-ui/src/pages/Blacklist/index.js create mode 100644 packages/admin-ui/src/pages/Cashout/Cashout.jsx create mode 100644 packages/admin-ui/src/pages/Cashout/Wizard.jsx create mode 100644 packages/admin-ui/src/pages/Cashout/WizardSplash.jsx create mode 100644 packages/admin-ui/src/pages/Cashout/WizardStep.jsx create mode 100644 packages/admin-ui/src/pages/Cashout/helper.js create mode 100644 packages/admin-ui/src/pages/Cashout/index.js create mode 100644 packages/admin-ui/src/pages/Commissions/Commissions.jsx create mode 100644 packages/admin-ui/src/pages/Commissions/components/CommissionsDetails.jsx create mode 100644 packages/admin-ui/src/pages/Commissions/components/CommissionsList.jsx create mode 100644 packages/admin-ui/src/pages/Commissions/helper.jsx create mode 100644 packages/admin-ui/src/pages/Commissions/index.js create mode 100644 packages/admin-ui/src/pages/Customers/CustomerData.jsx create mode 100644 packages/admin-ui/src/pages/Customers/CustomerNotes.jsx create mode 100644 packages/admin-ui/src/pages/Customers/CustomerPhotos.jsx create mode 100644 packages/admin-ui/src/pages/Customers/CustomerProfile.jsx create mode 100644 packages/admin-ui/src/pages/Customers/Customers.jsx create mode 100644 packages/admin-ui/src/pages/Customers/CustomersList.jsx create mode 100644 packages/admin-ui/src/pages/Customers/Wizard.jsx create mode 100644 packages/admin-ui/src/pages/Customers/components/CreateCustomerModal.jsx create mode 100644 packages/admin-ui/src/pages/Customers/components/CustomerDetails.jsx create mode 100644 packages/admin-ui/src/pages/Customers/components/CustomerSidebar.jsx create mode 100644 packages/admin-ui/src/pages/Customers/components/EditableCard.jsx create mode 100644 packages/admin-ui/src/pages/Customers/components/PhotosCard.jsx create mode 100644 packages/admin-ui/src/pages/Customers/components/PhotosCarousel.jsx create mode 100644 packages/admin-ui/src/pages/Customers/components/TransactionsList.jsx create mode 100644 packages/admin-ui/src/pages/Customers/components/Upload.jsx create mode 100644 packages/admin-ui/src/pages/Customers/components/Upload.module.css create mode 100644 packages/admin-ui/src/pages/Customers/components/consts.js create mode 100644 packages/admin-ui/src/pages/Customers/components/index.js create mode 100644 packages/admin-ui/src/pages/Customers/components/notes/NewNoteCard.jsx create mode 100644 packages/admin-ui/src/pages/Customers/components/notes/NewNoteModal.jsx create mode 100644 packages/admin-ui/src/pages/Customers/components/notes/NoteCard.jsx create mode 100644 packages/admin-ui/src/pages/Customers/components/notes/NoteEdit.jsx create mode 100644 packages/admin-ui/src/pages/Customers/helper.jsx create mode 100644 packages/admin-ui/src/pages/Customers/helper.test.js create mode 100644 packages/admin-ui/src/pages/Customers/index.js create mode 100644 packages/admin-ui/src/pages/Dashboard/Alerts/Alerts.jsx create mode 100644 packages/admin-ui/src/pages/Dashboard/Alerts/AlertsTable.jsx create mode 100644 packages/admin-ui/src/pages/Dashboard/Alerts/index.js create mode 100644 packages/admin-ui/src/pages/Dashboard/Dashboard.jsx create mode 100644 packages/admin-ui/src/pages/Dashboard/Footer/Footer.jsx create mode 100644 packages/admin-ui/src/pages/Dashboard/Footer/Footer.module.css create mode 100644 packages/admin-ui/src/pages/Dashboard/Footer/index.js create mode 100644 packages/admin-ui/src/pages/Dashboard/RightSide.jsx create mode 100644 packages/admin-ui/src/pages/Dashboard/SystemPerformance/Graphs/PercentageChart.jsx create mode 100644 packages/admin-ui/src/pages/Dashboard/SystemPerformance/Graphs/RefLineChart.jsx create mode 100644 packages/admin-ui/src/pages/Dashboard/SystemPerformance/Graphs/RefScatterplot.jsx create mode 100644 packages/admin-ui/src/pages/Dashboard/SystemPerformance/InfoWithLabel.jsx create mode 100644 packages/admin-ui/src/pages/Dashboard/SystemPerformance/Nav.jsx create mode 100644 packages/admin-ui/src/pages/Dashboard/SystemPerformance/SystemPerformance.jsx create mode 100644 packages/admin-ui/src/pages/Dashboard/SystemPerformance/index.js create mode 100644 packages/admin-ui/src/pages/Dashboard/SystemStatus/MachinesTable.jsx create mode 100644 packages/admin-ui/src/pages/Dashboard/SystemStatus/MachinesTable.styles.js create mode 100644 packages/admin-ui/src/pages/Dashboard/SystemStatus/SystemStatus.jsx create mode 100644 packages/admin-ui/src/pages/Dashboard/SystemStatus/index.js create mode 100644 packages/admin-ui/src/pages/Dashboard/index.js create mode 100644 packages/admin-ui/src/pages/Funding/Funding.jsx create mode 100644 packages/admin-ui/src/pages/Funding/Funding.module.css create mode 100644 packages/admin-ui/src/pages/Funding/TableLabel.jsx create mode 100644 packages/admin-ui/src/pages/Locales/Locales.jsx create mode 100644 packages/admin-ui/src/pages/Locales/helper.js create mode 100644 packages/admin-ui/src/pages/Locales/index.js create mode 100644 packages/admin-ui/src/pages/Logs/Logs.module.css create mode 100644 packages/admin-ui/src/pages/Logs/MachineLogs.jsx create mode 100644 packages/admin-ui/src/pages/Logs/ServerLogs.jsx create mode 100644 packages/admin-ui/src/pages/Logs/ServerLogs.module.css create mode 100644 packages/admin-ui/src/pages/Logs/Uptime.jsx create mode 100644 packages/admin-ui/src/pages/LoyaltyPanel/IndividualDiscountModal.jsx create mode 100644 packages/admin-ui/src/pages/LoyaltyPanel/IndividualDiscounts.jsx create mode 100644 packages/admin-ui/src/pages/LoyaltyPanel/PromoCodes.jsx create mode 100644 packages/admin-ui/src/pages/LoyaltyPanel/PromoCodesModal.jsx create mode 100644 packages/admin-ui/src/pages/MachineGroups/ComplianceTriggerSetModal.jsx create mode 100644 packages/admin-ui/src/pages/MachineGroups/CreateMachineGroupModal.jsx create mode 100644 packages/admin-ui/src/pages/MachineGroups/MachineGroups.jsx create mode 100644 packages/admin-ui/src/pages/MachineGroups/index.js create mode 100644 packages/admin-ui/src/pages/Machines/MachineComponents/Cassettes/Cassettes.jsx create mode 100644 packages/admin-ui/src/pages/Machines/MachineComponents/Cassettes/index.js create mode 100644 packages/admin-ui/src/pages/Machines/MachineComponents/Commissions/Commissions.jsx create mode 100644 packages/admin-ui/src/pages/Machines/MachineComponents/Commissions/helper.jsx create mode 100644 packages/admin-ui/src/pages/Machines/MachineComponents/Commissions/index.js create mode 100644 packages/admin-ui/src/pages/Machines/MachineComponents/Details.jsx create mode 100644 packages/admin-ui/src/pages/Machines/MachineComponents/Overview.jsx create mode 100644 packages/admin-ui/src/pages/Machines/MachineComponents/Transactions/Transactions.jsx create mode 100644 packages/admin-ui/src/pages/Machines/MachineComponents/Transactions/index.js create mode 100644 packages/admin-ui/src/pages/Machines/Machines.jsx create mode 100644 packages/admin-ui/src/pages/Machines/index.js create mode 100644 packages/admin-ui/src/pages/Maintenance/CashUnitDetails.jsx create mode 100644 packages/admin-ui/src/pages/Maintenance/CashUnits.jsx create mode 100644 packages/admin-ui/src/pages/Maintenance/CashUnitsFooter.jsx create mode 100644 packages/admin-ui/src/pages/Maintenance/CashboxHistory.jsx create mode 100644 packages/admin-ui/src/pages/Maintenance/MachineStatus.jsx create mode 100644 packages/admin-ui/src/pages/Maintenance/Wizard/Wizard.jsx create mode 100644 packages/admin-ui/src/pages/Maintenance/Wizard/WizardSplash.jsx create mode 100644 packages/admin-ui/src/pages/Maintenance/Wizard/WizardStep.jsx create mode 100644 packages/admin-ui/src/pages/Maintenance/Wizard/WizardStep.module.css create mode 100644 packages/admin-ui/src/pages/Maintenance/helper.jsx create mode 100644 packages/admin-ui/src/pages/Notifications/Notifications.jsx create mode 100644 packages/admin-ui/src/pages/Notifications/NotificationsContext.js create mode 100644 packages/admin-ui/src/pages/Notifications/components/EditHeader.jsx create mode 100644 packages/admin-ui/src/pages/Notifications/components/EditableNumber.jsx create mode 100644 packages/admin-ui/src/pages/Notifications/components/SingleFieldEditableNumber.jsx create mode 100644 packages/admin-ui/src/pages/Notifications/sections/CryptoBalanceAlerts.jsx create mode 100644 packages/admin-ui/src/pages/Notifications/sections/CryptoBalanceOverrides.jsx create mode 100644 packages/admin-ui/src/pages/Notifications/sections/FiatBalanceAlerts.jsx create mode 100644 packages/admin-ui/src/pages/Notifications/sections/FiatBalanceOverrides.jsx create mode 100644 packages/admin-ui/src/pages/Notifications/sections/Setup.jsx create mode 100644 packages/admin-ui/src/pages/Notifications/sections/ThirdPartyProvider.jsx create mode 100644 packages/admin-ui/src/pages/Notifications/sections/TransactionAlerts.jsx create mode 100644 packages/admin-ui/src/pages/OperatorInfo/CoinATMRadar.jsx create mode 100644 packages/admin-ui/src/pages/OperatorInfo/ContactInfo.jsx create mode 100644 packages/admin-ui/src/pages/OperatorInfo/MachineScreens.jsx create mode 100644 packages/admin-ui/src/pages/OperatorInfo/ReceiptPrinting.jsx create mode 100644 packages/admin-ui/src/pages/OperatorInfo/SMSNotices/SMSNotices.jsx create mode 100644 packages/admin-ui/src/pages/OperatorInfo/SMSNotices/SMSNoticesModal.jsx create mode 100644 packages/admin-ui/src/pages/OperatorInfo/TermsConditions.jsx create mode 100644 packages/admin-ui/src/pages/OperatorInfo/components/Header.jsx create mode 100644 packages/admin-ui/src/pages/OperatorInfo/components/InfoMessage.jsx create mode 100644 packages/admin-ui/src/pages/OperatorInfo/components/SwitchRow.jsx create mode 100644 packages/admin-ui/src/pages/Services/FormRenderer.jsx create mode 100644 packages/admin-ui/src/pages/Services/Services.jsx create mode 100644 packages/admin-ui/src/pages/Services/schemas/binance.js create mode 100644 packages/admin-ui/src/pages/Services/schemas/binanceus.js create mode 100644 packages/admin-ui/src/pages/Services/schemas/bitfinex.js create mode 100644 packages/admin-ui/src/pages/Services/schemas/bitgo.js create mode 100644 packages/admin-ui/src/pages/Services/schemas/bitstamp.js create mode 100644 packages/admin-ui/src/pages/Services/schemas/blockcypher.js create mode 100644 packages/admin-ui/src/pages/Services/schemas/cex.js create mode 100644 packages/admin-ui/src/pages/Services/schemas/elliptic.js create mode 100644 packages/admin-ui/src/pages/Services/schemas/galoy.js create mode 100644 packages/admin-ui/src/pages/Services/schemas/helper.js create mode 100644 packages/admin-ui/src/pages/Services/schemas/index.js create mode 100644 packages/admin-ui/src/pages/Services/schemas/inforu.js create mode 100644 packages/admin-ui/src/pages/Services/schemas/infura.js create mode 100644 packages/admin-ui/src/pages/Services/schemas/itbit.js create mode 100644 packages/admin-ui/src/pages/Services/schemas/kraken.js create mode 100644 packages/admin-ui/src/pages/Services/schemas/mailgun.js create mode 100644 packages/admin-ui/src/pages/Services/schemas/scorechain.js create mode 100644 packages/admin-ui/src/pages/Services/schemas/singlebitgo.js create mode 100644 packages/admin-ui/src/pages/Services/schemas/sumsub.js create mode 100644 packages/admin-ui/src/pages/Services/schemas/telnyx.js create mode 100644 packages/admin-ui/src/pages/Services/schemas/trongrid.js create mode 100644 packages/admin-ui/src/pages/Services/schemas/twilio.js create mode 100644 packages/admin-ui/src/pages/Services/schemas/vonage.js create mode 100644 packages/admin-ui/src/pages/SessionManagement/SessionManagement.jsx create mode 100644 packages/admin-ui/src/pages/Transactions/DetailsCard.jsx create mode 100644 packages/admin-ui/src/pages/Transactions/Filters.jsx create mode 100644 packages/admin-ui/src/pages/Transactions/Transactions.jsx create mode 100644 packages/admin-ui/src/pages/Transactions/helper.js create mode 100644 packages/admin-ui/src/pages/Triggers/CustomInfoRequests/CustomInfoRequests.jsx create mode 100644 packages/admin-ui/src/pages/Triggers/CustomInfoRequests/DetailsCard.jsx create mode 100644 packages/admin-ui/src/pages/Triggers/CustomInfoRequests/Forms/ChooseType.jsx create mode 100644 packages/admin-ui/src/pages/Triggers/CustomInfoRequests/Forms/NameOfRequirement.jsx create mode 100644 packages/admin-ui/src/pages/Triggers/CustomInfoRequests/Forms/Screen1Information.jsx create mode 100644 packages/admin-ui/src/pages/Triggers/CustomInfoRequests/Forms/Screen2Information.jsx create mode 100644 packages/admin-ui/src/pages/Triggers/CustomInfoRequests/Forms/TypeFields/ChoiceList.jsx create mode 100644 packages/admin-ui/src/pages/Triggers/CustomInfoRequests/Forms/TypeFields/NumericalEntry.jsx create mode 100644 packages/admin-ui/src/pages/Triggers/CustomInfoRequests/Forms/TypeFields/TextEntry.jsx create mode 100644 packages/admin-ui/src/pages/Triggers/CustomInfoRequests/Forms/TypeFields/index.jsx create mode 100644 packages/admin-ui/src/pages/Triggers/CustomInfoRequests/Wizard.jsx create mode 100644 packages/admin-ui/src/pages/Triggers/CustomInfoRequests/WizardSplash.jsx create mode 100644 packages/admin-ui/src/pages/Triggers/CustomInfoRequests/index.js create mode 100644 packages/admin-ui/src/pages/Triggers/TriggerSets.jsx create mode 100644 packages/admin-ui/src/pages/Triggers/TriggerSetsModal.jsx create mode 100644 packages/admin-ui/src/pages/Triggers/Triggers.jsx create mode 100644 packages/admin-ui/src/pages/Triggers/Wizard.jsx create mode 100644 packages/admin-ui/src/pages/Triggers/components/AdvancedTriggers.jsx create mode 100644 packages/admin-ui/src/pages/Triggers/components/helper.js create mode 100644 packages/admin-ui/src/pages/Triggers/helper.jsx create mode 100644 packages/admin-ui/src/pages/UserManagement/UserManagement.jsx create mode 100644 packages/admin-ui/src/pages/UserManagement/UserManagement.module.css create mode 100644 packages/admin-ui/src/pages/UserManagement/modals/ChangeRoleModal.jsx create mode 100644 packages/admin-ui/src/pages/UserManagement/modals/CreateUserModal.jsx create mode 100644 packages/admin-ui/src/pages/UserManagement/modals/EnableUserModal.jsx create mode 100644 packages/admin-ui/src/pages/UserManagement/modals/FIDOModal.jsx create mode 100644 packages/admin-ui/src/pages/UserManagement/modals/Input2FAModal.jsx create mode 100644 packages/admin-ui/src/pages/UserManagement/modals/Reset2FAModal.jsx create mode 100644 packages/admin-ui/src/pages/UserManagement/modals/ResetPasswordModal.jsx create mode 100644 packages/admin-ui/src/pages/Wallet/AdvancedWallet.jsx create mode 100644 packages/admin-ui/src/pages/Wallet/Wallet.jsx create mode 100644 packages/admin-ui/src/pages/Wallet/Wizard.jsx create mode 100644 packages/admin-ui/src/pages/Wallet/WizardSplash.jsx create mode 100644 packages/admin-ui/src/pages/Wallet/WizardStep.jsx create mode 100644 packages/admin-ui/src/pages/Wallet/helper.jsx create mode 100644 packages/admin-ui/src/pages/Wizard/Radio.module.css create mode 100644 packages/admin-ui/src/pages/Wizard/Wizard.jsx create mode 100644 packages/admin-ui/src/pages/Wizard/components/Commissions.jsx create mode 100644 packages/admin-ui/src/pages/Wizard/components/Footer.jsx create mode 100644 packages/admin-ui/src/pages/Wizard/components/Locales.jsx create mode 100644 packages/admin-ui/src/pages/Wizard/components/Mailgun.jsx create mode 100644 packages/admin-ui/src/pages/Wizard/components/Notifications.jsx create mode 100644 packages/admin-ui/src/pages/Wizard/components/OperatorInfo.jsx create mode 100644 packages/admin-ui/src/pages/Wizard/components/Twilio.jsx create mode 100644 packages/admin-ui/src/pages/Wizard/components/Twilio.module.css create mode 100644 packages/admin-ui/src/pages/Wizard/components/Wallet/AllSet.jsx create mode 100644 packages/admin-ui/src/pages/Wizard/components/Wallet/Blockcypher.jsx create mode 100644 packages/admin-ui/src/pages/Wizard/components/Wallet/ChooseCoin.jsx create mode 100644 packages/admin-ui/src/pages/Wizard/components/Wallet/ChooseExchange.jsx create mode 100644 packages/admin-ui/src/pages/Wizard/components/Wallet/ChooseTicker.jsx create mode 100644 packages/admin-ui/src/pages/Wizard/components/Wallet/ChooseWallet.jsx create mode 100644 packages/admin-ui/src/pages/Wizard/components/Wallet/Shared.module.css create mode 100644 packages/admin-ui/src/pages/Wizard/components/Wallet/Wallet.jsx create mode 100644 packages/admin-ui/src/pages/Wizard/components/Wallet/getItems.js create mode 100644 packages/admin-ui/src/pages/Wizard/components/Welcome.jsx create mode 100644 packages/admin-ui/src/pages/Wizard/helper.jsx create mode 100644 packages/admin-ui/src/pages/Wizard/index.js create mode 100644 packages/admin-ui/src/routing/PrivateRoute.jsx create mode 100644 packages/admin-ui/src/routing/PublicRoute.jsx create mode 100644 packages/admin-ui/src/routing/dirtyHandler.js create mode 100644 packages/admin-ui/src/routing/lamassu.routes.jsx create mode 100644 packages/admin-ui/src/routing/routes.jsx create mode 100644 packages/admin-ui/src/routing/useLocationWithConfirmation.js create mode 100644 packages/admin-ui/src/routing/utils.js create mode 100644 packages/admin-ui/src/styling/global/fonts.css create mode 100644 packages/admin-ui/src/styling/global/global.css create mode 100644 packages/admin-ui/src/styling/helpers.js create mode 100644 packages/admin-ui/src/styling/icons/ID/card/comet.svg create mode 100644 packages/admin-ui/src/styling/icons/ID/card/tomato.svg create mode 100644 packages/admin-ui/src/styling/icons/ID/card/white.svg create mode 100644 packages/admin-ui/src/styling/icons/ID/card/zodiac.svg create mode 100644 packages/admin-ui/src/styling/icons/ID/phone/comet.svg create mode 100644 packages/admin-ui/src/styling/icons/ID/phone/tomato.svg create mode 100644 packages/admin-ui/src/styling/icons/ID/phone/white.svg create mode 100644 packages/admin-ui/src/styling/icons/ID/phone/zodiac.svg create mode 100644 packages/admin-ui/src/styling/icons/ID/photo/comet.svg create mode 100644 packages/admin-ui/src/styling/icons/ID/photo/crossed-camera.svg create mode 100644 packages/admin-ui/src/styling/icons/ID/photo/tomato.svg create mode 100644 packages/admin-ui/src/styling/icons/ID/photo/white.svg create mode 100644 packages/admin-ui/src/styling/icons/ID/photo/zodiac.svg create mode 100644 packages/admin-ui/src/styling/icons/action/arrow/comet.svg create mode 100644 packages/admin-ui/src/styling/icons/action/arrow/regular.svg create mode 100644 packages/admin-ui/src/styling/icons/action/arrow/white.svg create mode 100644 packages/admin-ui/src/styling/icons/action/arrow/zodiac.svg create mode 100644 packages/admin-ui/src/styling/icons/action/close/comet.svg create mode 100644 packages/admin-ui/src/styling/icons/action/close/white.svg create mode 100644 packages/admin-ui/src/styling/icons/action/close/zodiac.svg create mode 100644 packages/admin-ui/src/styling/icons/action/copy/comet.svg create mode 100644 packages/admin-ui/src/styling/icons/action/copy/copy.svg create mode 100644 packages/admin-ui/src/styling/icons/action/copy/white.svg create mode 100644 packages/admin-ui/src/styling/icons/action/copy/zodiac.svg create mode 100644 packages/admin-ui/src/styling/icons/action/delete/disabled.svg create mode 100644 packages/admin-ui/src/styling/icons/action/delete/enabled.svg create mode 100644 packages/admin-ui/src/styling/icons/action/delete/white.svg create mode 100644 packages/admin-ui/src/styling/icons/action/edit/comet.svg create mode 100644 packages/admin-ui/src/styling/icons/action/edit/disabled.svg create mode 100644 packages/admin-ui/src/styling/icons/action/edit/enabled.svg create mode 100644 packages/admin-ui/src/styling/icons/action/edit/white.svg create mode 100644 packages/admin-ui/src/styling/icons/action/expand/closed.svg create mode 100644 packages/admin-ui/src/styling/icons/action/expand/open.svg create mode 100644 packages/admin-ui/src/styling/icons/action/external link/white.svg create mode 100644 packages/admin-ui/src/styling/icons/action/external link/zodiac.svg create mode 100644 packages/admin-ui/src/styling/icons/action/help/white.svg create mode 100644 packages/admin-ui/src/styling/icons/action/help/zodiac.svg create mode 100644 packages/admin-ui/src/styling/icons/action/wrench/zodiac.svg create mode 100644 packages/admin-ui/src/styling/icons/arrow/carousel-left-arrow.svg create mode 100644 packages/admin-ui/src/styling/icons/arrow/carousel-right-arrow.svg create mode 100644 packages/admin-ui/src/styling/icons/arrow/download_logs.svg create mode 100644 packages/admin-ui/src/styling/icons/arrow/month_change.svg create mode 100644 packages/admin-ui/src/styling/icons/arrow/month_change_right.svg create mode 100644 packages/admin-ui/src/styling/icons/arrow/transaction.svg create mode 100644 packages/admin-ui/src/styling/icons/arrow/triangle_down.svg create mode 100644 packages/admin-ui/src/styling/icons/arrow/triangle_up.svg create mode 100644 packages/admin-ui/src/styling/icons/button/add note/white.svg create mode 100644 packages/admin-ui/src/styling/icons/button/add note/zodiac.svg create mode 100644 packages/admin-ui/src/styling/icons/button/add-note/white.svg create mode 100644 packages/admin-ui/src/styling/icons/button/add-note/zodiac.svg create mode 100644 packages/admin-ui/src/styling/icons/button/add/white.svg create mode 100644 packages/admin-ui/src/styling/icons/button/add/zodiac.svg create mode 100644 packages/admin-ui/src/styling/icons/button/authorize/white.svg create mode 100644 packages/admin-ui/src/styling/icons/button/authorize/zodiac.svg create mode 100644 packages/admin-ui/src/styling/icons/button/blacklist/white.svg create mode 100644 packages/admin-ui/src/styling/icons/button/blacklist/zodiac.svg create mode 100644 packages/admin-ui/src/styling/icons/button/block/white.svg create mode 100644 packages/admin-ui/src/styling/icons/button/block/zodiac.svg create mode 100644 packages/admin-ui/src/styling/icons/button/cancel/white.svg create mode 100644 packages/admin-ui/src/styling/icons/button/cancel/zodiac.svg create mode 100644 packages/admin-ui/src/styling/icons/button/configure/white.svg create mode 100644 packages/admin-ui/src/styling/icons/button/configure/zodiac.svg create mode 100644 packages/admin-ui/src/styling/icons/button/data/white.svg create mode 100644 packages/admin-ui/src/styling/icons/button/data/zodiac.svg create mode 100644 packages/admin-ui/src/styling/icons/button/discount/comet.svg create mode 100644 packages/admin-ui/src/styling/icons/button/discount/white.svg create mode 100644 packages/admin-ui/src/styling/icons/button/discount/zodiac.svg create mode 100644 packages/admin-ui/src/styling/icons/button/download/white.svg create mode 100644 packages/admin-ui/src/styling/icons/button/download/zodiac.svg create mode 100644 packages/admin-ui/src/styling/icons/button/edit/white.svg create mode 100644 packages/admin-ui/src/styling/icons/button/edit/zodiac.svg create mode 100644 packages/admin-ui/src/styling/icons/button/export to PDF/white.svg create mode 100644 packages/admin-ui/src/styling/icons/button/export to PDF/zodiac.svg create mode 100644 packages/admin-ui/src/styling/icons/button/export-pdf/white.svg create mode 100644 packages/admin-ui/src/styling/icons/button/filter/white.svg create mode 100644 packages/admin-ui/src/styling/icons/button/filter/zodiac.svg create mode 100644 packages/admin-ui/src/styling/icons/button/ignore/white.svg create mode 100644 packages/admin-ui/src/styling/icons/button/ignore/zodiac.svg create mode 100644 packages/admin-ui/src/styling/icons/button/key/white.svg create mode 100644 packages/admin-ui/src/styling/icons/button/key/zodiac.svg create mode 100644 packages/admin-ui/src/styling/icons/button/link/export.svg create mode 100644 packages/admin-ui/src/styling/icons/button/link/white.svg create mode 100644 packages/admin-ui/src/styling/icons/button/link/zodiac.svg create mode 100644 packages/admin-ui/src/styling/icons/button/lock/white.svg create mode 100644 packages/admin-ui/src/styling/icons/button/lock/zodiac.svg create mode 100644 packages/admin-ui/src/styling/icons/button/photo/white-resized.svg create mode 100644 packages/admin-ui/src/styling/icons/button/photo/zodiac-resized.svg create mode 100644 packages/admin-ui/src/styling/icons/button/reboot/white.svg create mode 100644 packages/admin-ui/src/styling/icons/button/reboot/zodiac.svg create mode 100644 packages/admin-ui/src/styling/icons/button/replace/white.svg create mode 100644 packages/admin-ui/src/styling/icons/button/replace/zodiac.svg create mode 100644 packages/admin-ui/src/styling/icons/button/retry/white.svg create mode 100644 packages/admin-ui/src/styling/icons/button/retry/zodiac.svg create mode 100644 packages/admin-ui/src/styling/icons/button/schedule/white.svg create mode 100644 packages/admin-ui/src/styling/icons/button/schedule/zodiac.svg create mode 100644 packages/admin-ui/src/styling/icons/button/shut down/white.svg create mode 100644 packages/admin-ui/src/styling/icons/button/shut down/zodiac.svg create mode 100644 packages/admin-ui/src/styling/icons/button/stop-ignoring/white.svg create mode 100644 packages/admin-ui/src/styling/icons/button/stop-ignoring/zodiac.svg create mode 100644 packages/admin-ui/src/styling/icons/button/unpair/white.svg create mode 100644 packages/admin-ui/src/styling/icons/button/unpair/zodiac.svg create mode 100644 packages/admin-ui/src/styling/icons/button/upload-file/white-resized.svg create mode 100644 packages/admin-ui/src/styling/icons/button/upload-file/white.svg create mode 100644 packages/admin-ui/src/styling/icons/button/upload-file/zodiac-resized.svg create mode 100644 packages/admin-ui/src/styling/icons/button/upload-file/zodiac.svg create mode 100644 packages/admin-ui/src/styling/icons/button/upload/white.svg create mode 100644 packages/admin-ui/src/styling/icons/button/upload/zodiac.svg create mode 100644 packages/admin-ui/src/styling/icons/button/user-role/white.svg create mode 100644 packages/admin-ui/src/styling/icons/button/user-role/zodiac.svg create mode 100644 packages/admin-ui/src/styling/icons/button/whitelist/white.svg create mode 100644 packages/admin-ui/src/styling/icons/button/whitelist/zodiac.svg create mode 100644 packages/admin-ui/src/styling/icons/cassettes/acceptor-left-filled.svg create mode 100644 packages/admin-ui/src/styling/icons/cassettes/acceptor-left.svg create mode 100644 packages/admin-ui/src/styling/icons/cassettes/both-filled.svg create mode 100644 packages/admin-ui/src/styling/icons/cassettes/cashbox-empty.svg create mode 100644 packages/admin-ui/src/styling/icons/cassettes/cashout-cassette-1.svg create mode 100644 packages/admin-ui/src/styling/icons/cassettes/cashout-cassette-2.svg create mode 100644 packages/admin-ui/src/styling/icons/cassettes/dispenser-1.svg create mode 100644 packages/admin-ui/src/styling/icons/cassettes/dispenser-2.svg create mode 100644 packages/admin-ui/src/styling/icons/cassettes/tejo/3-cassettes/3-cassettes-open-1-left.png create mode 100644 packages/admin-ui/src/styling/icons/cassettes/tejo/3-cassettes/3-cassettes-open-1-left.svg create mode 100644 packages/admin-ui/src/styling/icons/cassettes/tejo/3-cassettes/3-cassettes-open-1.png create mode 100644 packages/admin-ui/src/styling/icons/cassettes/tejo/3-cassettes/3-cassettes-open-1.svg create mode 100644 packages/admin-ui/src/styling/icons/cassettes/tejo/3-cassettes/3-cassettes-open-2-left.png create mode 100644 packages/admin-ui/src/styling/icons/cassettes/tejo/3-cassettes/3-cassettes-open-2-left.svg create mode 100644 packages/admin-ui/src/styling/icons/cassettes/tejo/3-cassettes/3-cassettes-open-2.png create mode 100644 packages/admin-ui/src/styling/icons/cassettes/tejo/3-cassettes/3-cassettes-open-2.svg create mode 100644 packages/admin-ui/src/styling/icons/cassettes/tejo/3-cassettes/3-cassettes-open-3-left.png create mode 100644 packages/admin-ui/src/styling/icons/cassettes/tejo/3-cassettes/3-cassettes-open-3-left.svg create mode 100644 packages/admin-ui/src/styling/icons/cassettes/tejo/3-cassettes/3-cassettes-open-3.png create mode 100644 packages/admin-ui/src/styling/icons/cassettes/tejo/3-cassettes/3-cassettes-open-3.svg create mode 100644 packages/admin-ui/src/styling/icons/cassettes/tejo/4-cassettes/4-cassettes-open-1-left.png create mode 100644 packages/admin-ui/src/styling/icons/cassettes/tejo/4-cassettes/4-cassettes-open-1-left.svg create mode 100644 packages/admin-ui/src/styling/icons/cassettes/tejo/4-cassettes/4-cassettes-open-1.png create mode 100644 packages/admin-ui/src/styling/icons/cassettes/tejo/4-cassettes/4-cassettes-open-1.svg create mode 100644 packages/admin-ui/src/styling/icons/cassettes/tejo/4-cassettes/4-cassettes-open-2-left.png create mode 100644 packages/admin-ui/src/styling/icons/cassettes/tejo/4-cassettes/4-cassettes-open-2-left.svg create mode 100644 packages/admin-ui/src/styling/icons/cassettes/tejo/4-cassettes/4-cassettes-open-2.png create mode 100644 packages/admin-ui/src/styling/icons/cassettes/tejo/4-cassettes/4-cassettes-open-2.svg create mode 100644 packages/admin-ui/src/styling/icons/cassettes/tejo/4-cassettes/4-cassettes-open-3-left.png create mode 100644 packages/admin-ui/src/styling/icons/cassettes/tejo/4-cassettes/4-cassettes-open-3-left.svg create mode 100644 packages/admin-ui/src/styling/icons/cassettes/tejo/4-cassettes/4-cassettes-open-3.png create mode 100644 packages/admin-ui/src/styling/icons/cassettes/tejo/4-cassettes/4-cassettes-open-3.svg create mode 100644 packages/admin-ui/src/styling/icons/cassettes/tejo/4-cassettes/4-cassettes-open-4-left.png create mode 100644 packages/admin-ui/src/styling/icons/cassettes/tejo/4-cassettes/4-cassettes-open-4-left.svg create mode 100644 packages/admin-ui/src/styling/icons/cassettes/tejo/4-cassettes/4-cassettes-open-4.png create mode 100644 packages/admin-ui/src/styling/icons/cassettes/tejo/4-cassettes/4-cassettes-open-4.svg create mode 100644 packages/admin-ui/src/styling/icons/circle buttons/customer-list-view/white.svg create mode 100644 packages/admin-ui/src/styling/icons/circle buttons/customer-list-view/zodiac.svg create mode 100644 packages/admin-ui/src/styling/icons/circle buttons/exception-view/white.svg create mode 100644 packages/admin-ui/src/styling/icons/circle buttons/exception-view/zodiac.svg create mode 100644 packages/admin-ui/src/styling/icons/circle buttons/filter/white.svg create mode 100644 packages/admin-ui/src/styling/icons/circle buttons/filter/zodiac.svg create mode 100644 packages/admin-ui/src/styling/icons/circle buttons/history/white.svg create mode 100644 packages/admin-ui/src/styling/icons/circle buttons/history/zodiac.svg create mode 100644 packages/admin-ui/src/styling/icons/circle buttons/law/white.svg create mode 100644 packages/admin-ui/src/styling/icons/circle buttons/law/zodiac.svg create mode 100644 packages/admin-ui/src/styling/icons/circle buttons/listing-view/white.svg create mode 100644 packages/admin-ui/src/styling/icons/circle buttons/listing-view/zodiac.svg create mode 100644 packages/admin-ui/src/styling/icons/circle buttons/overview/comet.svg create mode 100644 packages/admin-ui/src/styling/icons/circle buttons/overview/white.svg create mode 100644 packages/admin-ui/src/styling/icons/circle buttons/overview/zodiac.svg create mode 100644 packages/admin-ui/src/styling/icons/circle buttons/save/white.svg create mode 100644 packages/admin-ui/src/styling/icons/circle buttons/save/zodiac.svg create mode 100644 packages/admin-ui/src/styling/icons/circle buttons/search/white.svg create mode 100644 packages/admin-ui/src/styling/icons/circle buttons/search/zodiac.svg create mode 100644 packages/admin-ui/src/styling/icons/circle buttons/settings/white.svg create mode 100644 packages/admin-ui/src/styling/icons/circle buttons/settings/zodiac.svg create mode 100644 packages/admin-ui/src/styling/icons/circle buttons/share/white.svg create mode 100644 packages/admin-ui/src/styling/icons/circle buttons/share/zodiac.svg create mode 100644 packages/admin-ui/src/styling/icons/circle buttons/upload/white.svg create mode 100644 packages/admin-ui/src/styling/icons/circle buttons/upload/zodiac.svg create mode 100644 packages/admin-ui/src/styling/icons/circle buttons/wizard/white.svg create mode 100644 packages/admin-ui/src/styling/icons/circle buttons/wizard/zodiac.svg create mode 100644 packages/admin-ui/src/styling/icons/compliance/custom-requirement.svg create mode 100644 packages/admin-ui/src/styling/icons/compliance/keyboard.svg create mode 100644 packages/admin-ui/src/styling/icons/compliance/keypad.svg create mode 100644 packages/admin-ui/src/styling/icons/compliance/list.svg create mode 100644 packages/admin-ui/src/styling/icons/customer-nav/data/comet.svg create mode 100644 packages/admin-ui/src/styling/icons/customer-nav/data/white.svg create mode 100644 packages/admin-ui/src/styling/icons/customer-nav/data/zodiac.svg create mode 100644 packages/admin-ui/src/styling/icons/customer-nav/note/comet.svg create mode 100644 packages/admin-ui/src/styling/icons/customer-nav/note/white.svg create mode 100644 packages/admin-ui/src/styling/icons/customer-nav/note/zodiac.svg create mode 100644 packages/admin-ui/src/styling/icons/customer-nav/overview/comet.svg create mode 100644 packages/admin-ui/src/styling/icons/customer-nav/overview/white.svg create mode 100644 packages/admin-ui/src/styling/icons/customer-nav/overview/zodiac.svg create mode 100644 packages/admin-ui/src/styling/icons/customer-nav/photos/comet.svg create mode 100644 packages/admin-ui/src/styling/icons/customer-nav/photos/white.svg create mode 100644 packages/admin-ui/src/styling/icons/dashboard/down.svg create mode 100644 packages/admin-ui/src/styling/icons/dashboard/equal.svg create mode 100644 packages/admin-ui/src/styling/icons/dashboard/up.svg create mode 100644 packages/admin-ui/src/styling/icons/direction/cash-in.png create mode 100644 packages/admin-ui/src/styling/icons/direction/cash-in.svg create mode 100644 packages/admin-ui/src/styling/icons/direction/cash-out.png create mode 100644 packages/admin-ui/src/styling/icons/direction/cash-out.svg create mode 100644 packages/admin-ui/src/styling/icons/file/comet.svg create mode 100644 packages/admin-ui/src/styling/icons/file/spring.svg create mode 100644 packages/admin-ui/src/styling/icons/file/tomato.svg create mode 100644 packages/admin-ui/src/styling/icons/menu/logo-white.svg create mode 100644 packages/admin-ui/src/styling/icons/menu/logo.svg create mode 100644 packages/admin-ui/src/styling/icons/menu/notification-zodiac.svg create mode 100644 packages/admin-ui/src/styling/icons/menu/notification.svg create mode 100644 packages/admin-ui/src/styling/icons/menu/search-zodiac.svg create mode 100644 packages/admin-ui/src/styling/icons/menu/search.svg create mode 100644 packages/admin-ui/src/styling/icons/month arrows/left.svg create mode 100644 packages/admin-ui/src/styling/icons/month arrows/right.svg create mode 100644 packages/admin-ui/src/styling/icons/month arrows/right_white.svg create mode 100644 packages/admin-ui/src/styling/icons/stage/spring/complete.svg create mode 100644 packages/admin-ui/src/styling/icons/stage/spring/current.svg create mode 100644 packages/admin-ui/src/styling/icons/stage/spring/empty.svg create mode 100644 packages/admin-ui/src/styling/icons/stage/zodiac/complete.svg create mode 100644 packages/admin-ui/src/styling/icons/stage/zodiac/current.svg create mode 100644 packages/admin-ui/src/styling/icons/stage/zodiac/empty.svg create mode 100644 packages/admin-ui/src/styling/icons/stage/zodiac/full.svg create mode 100644 packages/admin-ui/src/styling/icons/status/pumpkin.svg create mode 100644 packages/admin-ui/src/styling/icons/status/spring2.svg create mode 100644 packages/admin-ui/src/styling/icons/status/tomato.svg create mode 100644 packages/admin-ui/src/styling/icons/stripes.svg create mode 100644 packages/admin-ui/src/styling/icons/table/empty-table.svg create mode 100644 packages/admin-ui/src/styling/icons/table/false.svg create mode 100644 packages/admin-ui/src/styling/icons/table/true.svg create mode 100644 packages/admin-ui/src/styling/icons/warning-icon/comet.svg create mode 100644 packages/admin-ui/src/styling/icons/warning-icon/tomato.svg create mode 100644 packages/admin-ui/src/styling/icons/widgets/delete.png create mode 100644 packages/admin-ui/src/styling/icons/widgets/drag.png create mode 100644 packages/admin-ui/src/styling/icons/widgets/expand.png create mode 100644 packages/admin-ui/src/styling/icons/widgets/full screen.png create mode 100644 packages/admin-ui/src/styling/logos/icon-bitcoin-colour.svg create mode 100644 packages/admin-ui/src/styling/logos/icon-bitcoincash-colour.svg create mode 100644 packages/admin-ui/src/styling/logos/icon-dash-colour.svg create mode 100644 packages/admin-ui/src/styling/logos/icon-ethereum-colour.svg create mode 100644 packages/admin-ui/src/styling/logos/icon-litecoin-colour.svg create mode 100644 packages/admin-ui/src/styling/logos/icon-monero-colour.svg create mode 100644 packages/admin-ui/src/styling/logos/icon-tether-colour.svg create mode 100644 packages/admin-ui/src/styling/logos/icon-tron-colour.svg create mode 100644 packages/admin-ui/src/styling/logos/icon-usdc-colour.svg create mode 100644 packages/admin-ui/src/styling/logos/icon-zcash-colour.svg create mode 100644 packages/admin-ui/src/styling/theme.js create mode 100644 packages/admin-ui/src/styling/variables.js create mode 100644 packages/admin-ui/src/utils/apollo.jsx create mode 100644 packages/admin-ui/src/utils/bill-denominations.js create mode 100644 packages/admin-ui/src/utils/bill-options.js create mode 100644 packages/admin-ui/src/utils/config.js create mode 100644 packages/admin-ui/src/utils/constants.js create mode 100644 packages/admin-ui/src/utils/customer.js create mode 100644 packages/admin-ui/src/utils/machine.js create mode 100644 packages/admin-ui/src/utils/materialReactTableOpts.js create mode 100644 packages/admin-ui/src/utils/nullCheck.js create mode 100644 packages/admin-ui/src/utils/number.js create mode 100644 packages/admin-ui/src/utils/string.js create mode 100644 packages/admin-ui/src/utils/time.js create mode 100644 packages/admin-ui/src/utils/timezone-list.js create mode 100644 packages/admin-ui/src/utils/timezones.js create mode 100644 packages/admin-ui/src/utils/urlResolver.js create mode 100644 packages/admin-ui/vite.config.js create mode 100644 packages/server/.sample.env create mode 100644 packages/server/Lamassu_CA.pem create mode 100755 packages/server/bin/bip39 create mode 100755 packages/server/bin/hkdf create mode 100755 packages/server/bin/lamassu-admin-server create mode 100644 packages/server/bin/lamassu-admin-server-entrypoint.sh create mode 100755 packages/server/bin/lamassu-backup-pg create mode 100755 packages/server/bin/lamassu-batch-diagnostics create mode 100755 packages/server/bin/lamassu-btc-bumpfee create mode 100755 packages/server/bin/lamassu-clean-parsed-id create mode 100755 packages/server/bin/lamassu-coinatmradar create mode 100755 packages/server/bin/lamassu-coins create mode 100755 packages/server/bin/lamassu-configure-frontcamera create mode 100755 packages/server/bin/lamassu-devices create mode 100755 packages/server/bin/lamassu-eth-recovery create mode 100644 packages/server/bin/lamassu-eth-sweep-to-new-wallet create mode 100755 packages/server/bin/lamassu-migrate create mode 100755 packages/server/bin/lamassu-mnemonic create mode 100755 packages/server/bin/lamassu-ofac-update create mode 100755 packages/server/bin/lamassu-operator create mode 100755 packages/server/bin/lamassu-register create mode 100755 packages/server/bin/lamassu-send-coins create mode 100755 packages/server/bin/lamassu-server create mode 100644 packages/server/bin/lamassu-server-entrypoint.sh create mode 100755 packages/server/bin/lamassu-trx-recovery create mode 100755 packages/server/bin/lamassu-update-cassettes create mode 100644 packages/server/bin/lamassu-update-recyclers create mode 100755 packages/server/bin/lamassu-update-to-mnemonic create mode 100755 packages/server/bin/lamassu-update-wallet-nodes create mode 100644 packages/server/lib/app.js create mode 100644 packages/server/lib/auth-tokens.js create mode 100644 packages/server/lib/bill-math.js create mode 100644 packages/server/lib/blacklist.js create mode 100644 packages/server/lib/blockchain/bitcoin.js create mode 100644 packages/server/lib/blockchain/bitcoincash.js create mode 100644 packages/server/lib/blockchain/common.js create mode 100644 packages/server/lib/blockchain/dash.js create mode 100644 packages/server/lib/blockchain/do-volume.js create mode 100644 packages/server/lib/blockchain/ethereum.js create mode 100644 packages/server/lib/blockchain/install.js create mode 100644 packages/server/lib/blockchain/litecoin.js create mode 100644 packages/server/lib/blockchain/monero.js create mode 100644 packages/server/lib/blockchain/zcash.js create mode 100644 packages/server/lib/blockexplorers/mempool.space.js create mode 100644 packages/server/lib/bn.js create mode 100644 packages/server/lib/cash-in/cash-in-atomic.js create mode 100644 packages/server/lib/cash-in/cash-in-low.js create mode 100644 packages/server/lib/cash-in/cash-in-tx.js create mode 100644 packages/server/lib/cash-out/cash-out-actions.js create mode 100644 packages/server/lib/cash-out/cash-out-atomic.js create mode 100644 packages/server/lib/cash-out/cash-out-helper.js create mode 100644 packages/server/lib/cash-out/cash-out-low.js create mode 100644 packages/server/lib/cash-out/cash-out-tx.js create mode 100644 packages/server/lib/cashbox-batches.js create mode 100644 packages/server/lib/coin-change.js create mode 100644 packages/server/lib/coinatmradar/coinatmradar.js create mode 100644 packages/server/lib/coinatmradar/test/coinatmradar.test.js create mode 100644 packages/server/lib/commission-math.js create mode 100644 packages/server/lib/compliance-external.js create mode 100644 packages/server/lib/compliance-triggers.js create mode 100644 packages/server/lib/compliance.js create mode 100644 packages/server/lib/compliance_overrides.js create mode 100644 packages/server/lib/constants.js create mode 100644 packages/server/lib/customer-notes.js create mode 100644 packages/server/lib/customers.js create mode 100644 packages/server/lib/db-error-codes.js create mode 100644 packages/server/lib/db-migrate-store.js create mode 100644 packages/server/lib/db.js create mode 100644 packages/server/lib/email.js create mode 100644 packages/server/lib/environment-helper.js create mode 100644 packages/server/lib/error.js create mode 100644 packages/server/lib/event-bus.js create mode 100644 packages/server/lib/exchange.js create mode 100644 packages/server/lib/forex.js create mode 100644 packages/server/lib/graphql/resolvers.js create mode 100644 packages/server/lib/graphql/server.js create mode 100644 packages/server/lib/graphql/types.js create mode 100644 packages/server/lib/hardware-credentials.js create mode 100644 packages/server/lib/layer2.js create mode 100644 packages/server/lib/logger.js create mode 100644 packages/server/lib/logs.js create mode 100644 packages/server/lib/loyalty.js create mode 100644 packages/server/lib/machine-loader.js create mode 100644 packages/server/lib/machine-settings.js create mode 100644 packages/server/lib/middlewares/addRWBytes.js create mode 100644 packages/server/lib/middlewares/authorize.js create mode 100644 packages/server/lib/middlewares/ca.js create mode 100644 packages/server/lib/middlewares/errorHandler.js create mode 100644 packages/server/lib/middlewares/filterOldRequests.js create mode 100644 packages/server/lib/middlewares/operatorId.js create mode 100644 packages/server/lib/middlewares/populateDeviceId.js create mode 100644 packages/server/lib/middlewares/populateMachineSettings.js create mode 100644 packages/server/lib/middlewares/populateSettings.js create mode 100644 packages/server/lib/middlewares/recordPing.js create mode 100644 packages/server/lib/middlewares/rejectIncompatbleMachines.js create mode 100644 packages/server/lib/middlewares/state.js create mode 100644 packages/server/lib/migrate.js create mode 100644 packages/server/lib/mnemonic-helpers.js create mode 100644 packages/server/lib/new-admin/admin-server.js create mode 100644 packages/server/lib/new-admin/config/accounts.js create mode 100644 packages/server/lib/new-admin/config/data/countries.json create mode 100644 packages/server/lib/new-admin/config/data/currencies.json create mode 100644 packages/server/lib/new-admin/config/data/languages.json create mode 100644 packages/server/lib/new-admin/config/index.js create mode 100644 packages/server/lib/new-admin/filters.js create mode 100644 packages/server/lib/new-admin/graphql/directives/auth.js create mode 100644 packages/server/lib/new-admin/graphql/directives/index.js create mode 100644 packages/server/lib/new-admin/graphql/errors.js create mode 100644 packages/server/lib/new-admin/graphql/modules/authentication/FIDO2FAStrategy.js create mode 100644 packages/server/lib/new-admin/graphql/modules/authentication/FIDOPasswordlessStrategy.js create mode 100644 packages/server/lib/new-admin/graphql/modules/authentication/FIDOUsernamelessStrategy.js create mode 100644 packages/server/lib/new-admin/graphql/modules/authentication/index.js create mode 100644 packages/server/lib/new-admin/graphql/modules/userManagement.js create mode 100644 packages/server/lib/new-admin/graphql/resolvers/bill.resolver.js create mode 100644 packages/server/lib/new-admin/graphql/resolvers/blacklist.resolver.js create mode 100644 packages/server/lib/new-admin/graphql/resolvers/cashbox.resolver.js create mode 100644 packages/server/lib/new-admin/graphql/resolvers/config.resolver.js create mode 100644 packages/server/lib/new-admin/graphql/resolvers/currency.resolver.js create mode 100644 packages/server/lib/new-admin/graphql/resolvers/customInfoRequests.resolver.js create mode 100644 packages/server/lib/new-admin/graphql/resolvers/customer.resolver.js create mode 100644 packages/server/lib/new-admin/graphql/resolvers/funding.resolver.js create mode 100644 packages/server/lib/new-admin/graphql/resolvers/index.js create mode 100644 packages/server/lib/new-admin/graphql/resolvers/log.resolver.js create mode 100644 packages/server/lib/new-admin/graphql/resolvers/loyalty.resolver.js create mode 100644 packages/server/lib/new-admin/graphql/resolvers/machine.resolver.js create mode 100644 packages/server/lib/new-admin/graphql/resolvers/machineGroups.resolver.js create mode 100644 packages/server/lib/new-admin/graphql/resolvers/market.resolver.js create mode 100644 packages/server/lib/new-admin/graphql/resolvers/notification.resolver.js create mode 100644 packages/server/lib/new-admin/graphql/resolvers/pairing.resolver.js create mode 100644 packages/server/lib/new-admin/graphql/resolvers/rates.resolver.js create mode 100644 packages/server/lib/new-admin/graphql/resolvers/sanctions.resolver.js create mode 100644 packages/server/lib/new-admin/graphql/resolvers/scalar.resolver.js create mode 100644 packages/server/lib/new-admin/graphql/resolvers/settings.resolver.js create mode 100644 packages/server/lib/new-admin/graphql/resolvers/sms.resolver.js create mode 100644 packages/server/lib/new-admin/graphql/resolvers/status.resolver.js create mode 100644 packages/server/lib/new-admin/graphql/resolvers/transaction.resolver.js create mode 100644 packages/server/lib/new-admin/graphql/resolvers/triggers.resolver.js create mode 100644 packages/server/lib/new-admin/graphql/resolvers/users.resolver.js create mode 100644 packages/server/lib/new-admin/graphql/resolvers/version.resolver.js create mode 100644 packages/server/lib/new-admin/graphql/schema.js create mode 100644 packages/server/lib/new-admin/graphql/types/bill.type.js create mode 100644 packages/server/lib/new-admin/graphql/types/blacklist.type.js create mode 100644 packages/server/lib/new-admin/graphql/types/cashbox.type.js create mode 100644 packages/server/lib/new-admin/graphql/types/config.type.js create mode 100644 packages/server/lib/new-admin/graphql/types/currency.type.js create mode 100644 packages/server/lib/new-admin/graphql/types/customInfoRequests.type.js create mode 100644 packages/server/lib/new-admin/graphql/types/customer.type.js create mode 100644 packages/server/lib/new-admin/graphql/types/funding.type.js create mode 100644 packages/server/lib/new-admin/graphql/types/index.js create mode 100644 packages/server/lib/new-admin/graphql/types/log.type.js create mode 100644 packages/server/lib/new-admin/graphql/types/loyalty.type.js create mode 100644 packages/server/lib/new-admin/graphql/types/machine.type.js create mode 100644 packages/server/lib/new-admin/graphql/types/machineGroups.type.js create mode 100644 packages/server/lib/new-admin/graphql/types/market.type.js create mode 100644 packages/server/lib/new-admin/graphql/types/notification.type.js create mode 100644 packages/server/lib/new-admin/graphql/types/pairing.type.js create mode 100644 packages/server/lib/new-admin/graphql/types/rates.type.js create mode 100644 packages/server/lib/new-admin/graphql/types/sanctions.type.js create mode 100644 packages/server/lib/new-admin/graphql/types/scalar.type.js create mode 100644 packages/server/lib/new-admin/graphql/types/settings.type.js create mode 100644 packages/server/lib/new-admin/graphql/types/sms.type.js create mode 100644 packages/server/lib/new-admin/graphql/types/status.type.js create mode 100644 packages/server/lib/new-admin/graphql/types/transaction.type.js create mode 100644 packages/server/lib/new-admin/graphql/types/triggers.type.js create mode 100644 packages/server/lib/new-admin/graphql/types/users.type.js create mode 100644 packages/server/lib/new-admin/graphql/types/version.type.js create mode 100644 packages/server/lib/new-admin/middlewares/cleanUserSessions.js create mode 100644 packages/server/lib/new-admin/middlewares/context.js create mode 100644 packages/server/lib/new-admin/middlewares/index.js create mode 100644 packages/server/lib/new-admin/middlewares/session.js create mode 100644 packages/server/lib/new-admin/services/bills.js create mode 100644 packages/server/lib/new-admin/services/customInfoRequests.js create mode 100644 packages/server/lib/new-admin/services/funding.js create mode 100644 packages/server/lib/new-admin/services/login.js create mode 100644 packages/server/lib/new-admin/services/machineGroups.js create mode 100644 packages/server/lib/new-admin/services/machines.js create mode 100644 packages/server/lib/new-admin/services/pairing.js create mode 100644 packages/server/lib/new-admin/services/restriction-level.js create mode 100644 packages/server/lib/new-admin/services/server-logs.js create mode 100644 packages/server/lib/new-admin/services/supervisor.js create mode 100644 packages/server/lib/new-admin/services/transactions.js create mode 100644 packages/server/lib/new-admin/services/triggers.js create mode 100644 packages/server/lib/new-config-manager.js create mode 100644 packages/server/lib/new-settings-loader.js create mode 100644 packages/server/lib/notifier/codes.js create mode 100644 packages/server/lib/notifier/email.js create mode 100644 packages/server/lib/notifier/index.js create mode 100644 packages/server/lib/notifier/notificationCenter.js create mode 100644 packages/server/lib/notifier/queries.js create mode 100644 packages/server/lib/notifier/sms.js create mode 100644 packages/server/lib/notifier/test/email.test.js create mode 100644 packages/server/lib/notifier/test/notifier.test.js create mode 100644 packages/server/lib/notifier/test/sms.test.js create mode 100644 packages/server/lib/notifier/test/utils.test.js create mode 100644 packages/server/lib/notifier/utils.js create mode 100644 packages/server/lib/notifier/webhook.js create mode 100644 packages/server/lib/ofac/index.js create mode 100644 packages/server/lib/ofac/loading.js create mode 100644 packages/server/lib/ofac/matching.js create mode 100644 packages/server/lib/ofac/name-utils.js create mode 100644 packages/server/lib/ofac/parsing.js create mode 100644 packages/server/lib/ofac/update.js create mode 100644 packages/server/lib/operator.js create mode 100644 packages/server/lib/pairing.js create mode 100644 packages/server/lib/pg-transport.js create mode 100644 packages/server/lib/plugin-helper.js create mode 100644 packages/server/lib/plugins.js create mode 100644 packages/server/lib/plugins/common/ccxt.js create mode 100644 packages/server/lib/plugins/common/json-rpc.js create mode 100644 packages/server/lib/plugins/compliance/consts.js create mode 100644 packages/server/lib/plugins/compliance/mock-compliance/mock-compliance.js create mode 100644 packages/server/lib/plugins/compliance/sumsub/request.js create mode 100644 packages/server/lib/plugins/compliance/sumsub/sumsub.api.js create mode 100644 packages/server/lib/plugins/compliance/sumsub/sumsub.js create mode 100644 packages/server/lib/plugins/email/mailgun/mailgun.js create mode 100644 packages/server/lib/plugins/email/mock-email/mock-email.js create mode 100644 packages/server/lib/plugins/exchange/binance.js create mode 100644 packages/server/lib/plugins/exchange/binanceus.js create mode 100644 packages/server/lib/plugins/exchange/bitfinex.js create mode 100644 packages/server/lib/plugins/exchange/bitstamp.js create mode 100644 packages/server/lib/plugins/exchange/ccxt.js create mode 100644 packages/server/lib/plugins/exchange/cex.js create mode 100644 packages/server/lib/plugins/exchange/consts.js create mode 100644 packages/server/lib/plugins/exchange/itbit.js create mode 100644 packages/server/lib/plugins/exchange/kraken.js create mode 100644 packages/server/lib/plugins/exchange/mock-exchange.js create mode 100644 packages/server/lib/plugins/sms/inforu/inforu.js create mode 100644 packages/server/lib/plugins/sms/mock-sms/mock-sms.js create mode 100644 packages/server/lib/plugins/sms/telnyx/telnyx.js create mode 100644 packages/server/lib/plugins/sms/twilio/twilio.js create mode 100644 packages/server/lib/plugins/sms/vonage/vonage.js create mode 100644 packages/server/lib/plugins/sms/whatsapp/whatsapp.js create mode 100644 packages/server/lib/plugins/ticker/bitpay.js create mode 100644 packages/server/lib/plugins/ticker/ccxt.js create mode 100644 packages/server/lib/plugins/ticker/mock-ticker.js create mode 100644 packages/server/lib/plugins/ticker/pazuz-ticker/pazuz-ticker.js create mode 100644 packages/server/lib/plugins/tokens/erc20.abi.json create mode 100644 packages/server/lib/plugins/tokens/index.js create mode 100644 packages/server/lib/plugins/wallet-scoring/elliptic/elliptic.js create mode 100644 packages/server/lib/plugins/wallet-scoring/mock-scoring/mock-scoring.js create mode 100644 packages/server/lib/plugins/wallet-scoring/scorechain/scorechain.js create mode 100644 packages/server/lib/plugins/wallet/bitcoincashd/bitcoincashd.js create mode 100644 packages/server/lib/plugins/wallet/bitcoind/bitcoind.js create mode 100644 packages/server/lib/plugins/wallet/bitgo/bitgo.js create mode 100644 packages/server/lib/plugins/wallet/dashd/dashd.js create mode 100644 packages/server/lib/plugins/wallet/galoy/galoy.js create mode 100644 packages/server/lib/plugins/wallet/geth/base.js create mode 100644 packages/server/lib/plugins/wallet/geth/geth.js create mode 100644 packages/server/lib/plugins/wallet/infura/infura.js create mode 100644 packages/server/lib/plugins/wallet/litecoind/litecoind.js create mode 100644 packages/server/lib/plugins/wallet/mock-wallet/mock-wallet.js create mode 100644 packages/server/lib/plugins/wallet/monerod/monerod.js create mode 100644 packages/server/lib/plugins/wallet/tron/base.js create mode 100644 packages/server/lib/plugins/wallet/trongrid/trongrid.js create mode 100644 packages/server/lib/plugins/wallet/zcashd/zcashd.js create mode 100644 packages/server/lib/plugins/zero-conf/blockcypher/blockcypher.js create mode 100644 packages/server/lib/plugins/zero-conf/mock-zero-conf/mock-zero-conf.js create mode 100644 packages/server/lib/poller.js create mode 100644 packages/server/lib/postgresql_interface.js create mode 100644 packages/server/lib/pp.js create mode 100644 packages/server/lib/respond.js create mode 100644 packages/server/lib/route-helpers.js create mode 100644 packages/server/lib/routes.js create mode 100644 packages/server/lib/routes/cashboxRoutes.js create mode 100644 packages/server/lib/routes/customerRoutes.js create mode 100644 packages/server/lib/routes/diagnosticsRoutes.js create mode 100644 packages/server/lib/routes/failedQRScans.js create mode 100644 packages/server/lib/routes/logsRoutes.js create mode 100644 packages/server/lib/routes/pairingRoutes.js create mode 100644 packages/server/lib/routes/performanceRoutes.js create mode 100644 packages/server/lib/routes/probeLnRoutes.js create mode 100644 packages/server/lib/routes/stateRoutes.js create mode 100644 packages/server/lib/routes/termsAndConditionsRoutes.js create mode 100644 packages/server/lib/routes/txRoutes.js create mode 100644 packages/server/lib/routes/unitsRoutes.js create mode 100644 packages/server/lib/routes/verifyPromoCodeRoutes.js create mode 100644 packages/server/lib/routes/verifyTxRoutes.js create mode 100644 packages/server/lib/routes/verifyUserRoutes.js create mode 100644 packages/server/lib/sanctions.js create mode 100644 packages/server/lib/session-manager.js create mode 100644 packages/server/lib/sms-notices.js create mode 100644 packages/server/lib/sms.js create mode 100644 packages/server/lib/ticker.js create mode 100644 packages/server/lib/time.js create mode 100644 packages/server/lib/tx-batching-processing.js create mode 100644 packages/server/lib/tx-batching.js create mode 100644 packages/server/lib/tx.js create mode 100644 packages/server/lib/users.js create mode 100644 packages/server/lib/utils.js create mode 100644 packages/server/lib/wallet-scoring.js create mode 100644 packages/server/lib/wallet.js create mode 100644 packages/server/migrations/001-initial.js create mode 100644 packages/server/migrations/002-bills.js create mode 100644 packages/server/migrations/003-device-events.js create mode 100644 packages/server/migrations/004-transactions-reload.js create mode 100644 packages/server/migrations/005-addCrypto.js create mode 100644 packages/server/migrations/006-add-machine-config.js create mode 100644 packages/server/migrations/007-add-phone.js create mode 100644 packages/server/migrations/008-add-two-way.js create mode 100644 packages/server/migrations/009-update-timestamps.js create mode 100644 packages/server/migrations/010-cached-requests.js create mode 100644 packages/server/migrations/011-transactions-reload-2.js create mode 100644 packages/server/migrations/012-add-hd-path-serial.js create mode 100644 packages/server/migrations/013-add-last-checked.js create mode 100644 packages/server/migrations/014-session-to-tx-id.js create mode 100644 packages/server/migrations/015-paired_devices.js create mode 100644 packages/server/migrations/016-new_cached_requests_table.js create mode 100644 packages/server/migrations/017-user_tokens.js create mode 100644 packages/server/migrations/018-alter_devices.js create mode 100644 packages/server/migrations/019-remove-dispense-counts.js create mode 100644 packages/server/migrations/020-add-server-events.js create mode 100644 packages/server/migrations/021-config-version-id.js create mode 100644 packages/server/migrations/022-add_cash_in_sent.js create mode 100644 packages/server/migrations/023-add-dispenses-to-cash-out.js create mode 100644 packages/server/migrations/024-consolidate-hd.js create mode 100644 packages/server/migrations/025-create_trades.js create mode 100644 packages/server/migrations/026-add_send_confirmed.js create mode 100644 packages/server/migrations/027-tx_errors.js create mode 100644 packages/server/migrations/028-cash_out_actions.js create mode 100644 packages/server/migrations/029-add_valid_to_user_config.js create mode 100644 packages/server/migrations/030-cash-out-provision.js create mode 100644 packages/server/migrations/031-remove_name_from_devices.js create mode 100644 packages/server/migrations/032-create_machine_pings_table.js create mode 100644 packages/server/migrations/033-add_cash_in_fee.js create mode 100644 packages/server/migrations/034-add_cash_out_error_code.js create mode 100644 packages/server/migrations/035-log_bank_notes.js create mode 100644 packages/server/migrations/036-add_customers_table.js create mode 100644 packages/server/migrations/037-add_compliance_authorizations_table.js create mode 100644 packages/server/migrations/1503907708756-drop-device-time.js create mode 100644 packages/server/migrations/1503945570220-add-tx-version.js create mode 100644 packages/server/migrations/1505044429557-add_cash_out_txs_published_at.js create mode 100644 packages/server/migrations/1505296896905-manual-override.js create mode 100644 packages/server/migrations/1507639057362-compliance-override-naming.js create mode 100644 packages/server/migrations/1508261875640-logs.js create mode 100644 packages/server/migrations/1509091634946-support_logs.js create mode 100644 packages/server/migrations/1509439657189-add_machine_name_to_devices.js create mode 100644 packages/server/migrations/1514981004673-add_serial_to_logs.js create mode 100644 packages/server/migrations/1525671972351-add_sanctions_logs.js create mode 100644 packages/server/migrations/1526034901860-crypto_atoms_to_numeric.js create mode 100644 packages/server/migrations/1526038623129-add_device_location.js create mode 100644 packages/server/migrations/1527814550220-add-tx-terms-accepted.js create mode 100644 packages/server/migrations/1528017752387-add-layer2-address.js create mode 100644 packages/server/migrations/1536651947391-add-device-id-to-cash-out-actions.js create mode 100644 packages/server/migrations/1542638179228-alter-machine-pings.js create mode 100644 packages/server/migrations/1542811343367-add-error-to-trades.js create mode 100644 packages/server/migrations/1542926067866-tx-commission.js create mode 100644 packages/server/migrations/1543182139555-tx-ticker-price.js create mode 100644 packages/server/migrations/1552064796155-tx-paper-wallet.js create mode 100644 packages/server/migrations/1556157018569-truncate-server-events.js create mode 100644 packages/server/migrations/1556582597515-blacklist.js create mode 100644 packages/server/migrations/1557800959028-machine-pings-rename.js create mode 100644 packages/server/migrations/1564485980102-alter-blacklist.js create mode 100644 packages/server/migrations/1572524820075-server-support-logs.js create mode 100644 packages/server/migrations/1581455088977-add-amount-received.js create mode 100644 packages/server/migrations/1592317667188-machine-version-name.js create mode 100644 packages/server/migrations/1595295132361-schema-version-on-user-config.js create mode 100644 packages/server/migrations/1599523522436-migrate-config.js create mode 100644 packages/server/migrations/1601649726488-user-suspend.js create mode 100644 packages/server/migrations/1601908070568-us-ssn.js create mode 100644 packages/server/migrations/1603438527057-add-browser-os-info.js create mode 100644 packages/server/migrations/1603804834628-add-last-accessed-tokens.js create mode 100644 packages/server/migrations/1603853985238-remove-support-log.js create mode 100644 packages/server/migrations/1603886141913-coupon-codes.js create mode 100644 packages/server/migrations/1604419505567-add-discount-to-txs.js create mode 100644 packages/server/migrations/1604934042127-clean-bills.js create mode 100644 packages/server/migrations/1607009558538-create-notifications-table.js create mode 100644 packages/server/migrations/1609346970940-alter-blacklist-unique-constraint.js create mode 100644 packages/server/migrations/1610716756175-id-card-raw.js create mode 100644 packages/server/migrations/1616528363530-add_cashbox_batches.js create mode 100644 packages/server/migrations/1616687417371-add_internal_tx_to_trades.js create mode 100644 packages/server/migrations/1617742522808-zeroConfLimit-migrate.js create mode 100644 packages/server/migrations/1617967601902-add-batches-type.js create mode 100644 packages/server/migrations/1617983833835-add-default-advanced-trigger-settings.js create mode 100644 packages/server/migrations/1618507684019-rename-0-conf.js create mode 100644 packages/server/migrations/1618843631500-users.js create mode 100644 packages/server/migrations/1619968992683-fiat-balance-notification-to-percent.js create mode 100644 packages/server/migrations/1620165712260-custom-info-requests.js create mode 100644 packages/server/migrations/1620319260238-timezones.js create mode 100644 packages/server/migrations/1620335170327-hardware-credentials.js create mode 100644 packages/server/migrations/1620680439585-add-cashbox-reset-settings.js create mode 100644 packages/server/migrations/1621430588944-notify-cashbox-removal.js create mode 100644 packages/server/migrations/1621556014244-add-btc-tx-batching.js create mode 100644 packages/server/migrations/1623413776161-create-operator-ids.js create mode 100644 packages/server/migrations/1623975493095-add-crypto-units-to-config.js create mode 100644 packages/server/migrations/1624214428956-txs-addresses-to-blacklist.js create mode 100644 packages/server/migrations/1625082212614-add-usssn-type-to-compliance-overrides.js create mode 100644 packages/server/migrations/1626275844773-add-machine-network-performance.js create mode 100644 packages/server/migrations/1626891847835-add-individual-discounts.js create mode 100644 packages/server/migrations/1627518944902-custom-sms.js create mode 100644 packages/server/migrations/1627563019030-add-customer-tc-photo-path.js create mode 100644 packages/server/migrations/1627868356883-customer-custom-notes.js create mode 100644 packages/server/migrations/1628100660620-subscriber-info.js create mode 100644 packages/server/migrations/1630432869178-add-more-cassette-support.js create mode 100644 packages/server/migrations/1630624117042-customer-custom-fields.js create mode 100644 packages/server/migrations/1635159374499-editable-customer-data.js create mode 100644 packages/server/migrations/1637877732001-add_unpaired_devices_table.js create mode 100644 packages/server/migrations/1639577650032-wallet-scoring.js create mode 100644 packages/server/migrations/1641394367865-testing-customer-toggle.js create mode 100644 packages/server/migrations/1641482376890-add-overrides-to-subscriber-info.js create mode 100644 packages/server/migrations/1641486859782-wallet-scoring-cash-out.js create mode 100644 packages/server/migrations/1642518884925-manual-custom-info-requests.js create mode 100644 packages/server/migrations/1643996603839-change-custom-sms-to-notices.js create mode 100644 packages/server/migrations/1645010873828-add-advanced-wallet-settings.js create mode 100644 packages/server/migrations/1645459054117-default-timezone.js create mode 100644 packages/server/migrations/1649944954805-terms-and-conditions-hash.js create mode 100644 packages/server/migrations/1655807727853-default_timezone_fix.js create mode 100644 packages/server/migrations/1658940716689-remove-coin-specific-cryptounits.js create mode 100644 packages/server/migrations/1661125970289-eth-zero-conf-value.js create mode 100644 packages/server/migrations/1665418064066-set-node-env.js create mode 100644 packages/server/migrations/1670425142650-deprecate-cash-in-fee-crypto.js create mode 100644 packages/server/migrations/1681428616990-aveiro-recycler-settings.js create mode 100644 packages/server/migrations/1691523881128-bills-using-text.js create mode 100644 packages/server/migrations/1696845395350-recycler-rename-settings.js create mode 100644 packages/server/migrations/1700123461281-customer-email.js create mode 100644 packages/server/migrations/1700123461282-customer-auth-advanced-trigger.js create mode 100644 packages/server/migrations/1700123461283-phone-on-tx.js create mode 100644 packages/server/migrations/1716561996854-diagnostics.js create mode 100644 packages/server/migrations/1716969535424-customer-last-auth-attempt.js create mode 100644 packages/server/migrations/1716974904249-ciphertrace-error-code.js create mode 100644 packages/server/migrations/1718464437502-integrate-sumsub.js create mode 100644 packages/server/migrations/1721313145136-customer-last-used-machine.js create mode 100644 packages/server/migrations/1724242113482-drop-last-used-fkey.js create mode 100644 packages/server/migrations/1732790112740-add-cashout-fee-to-cash_out_txs.js create mode 100644 packages/server/migrations/1732790112741-add-cashout-fee-to-user_config.js create mode 100644 packages/server/migrations/1732874039534-market-currency.js create mode 100644 packages/server/migrations/1732881489395-coin-agnostic-blacklist.js create mode 100644 packages/server/migrations/1732881489396-advanced-blacklisting.js create mode 100644 packages/server/migrations/1732881659436-rates-screen.js create mode 100644 packages/server/migrations/1743526540370-deprecate-tables.js create mode 100644 packages/server/migrations/1744294267662-bills-performance.js create mode 100644 packages/server/migrations/1744294267663-blacklist-normalization.js create mode 100644 packages/server/migrations/1744294267663-customer-id-index.js create mode 100644 packages/server/migrations/1748423577379-add-last-used-address.js create mode 100644 packages/server/migrations/1749551637988-relational-compliance-triggers.js create mode 100644 packages/server/migrations/1751291688761-add-machine-groups.js create mode 100644 packages/server/migrations/1752141860742-compliance-triggers-sets.js create mode 100644 packages/server/migrations/1752599801402-add-coupon-fk-to-txs.js create mode 100644 packages/server/migrations/1753351586476-machine-groups-with-compliance-trigger-sets.js create mode 100644 packages/server/migrations/1753500000000-add-restriction-level-to-devices.js create mode 100644 packages/server/migrations/db.js create mode 100644 packages/server/migrations/settings.js create mode 100644 packages/server/package.json create mode 100644 packages/server/tests/stress/cli.js create mode 100644 packages/server/tests/stress/consts.js create mode 100644 packages/server/tests/stress/db.js create mode 100644 packages/server/tests/stress/env.js create mode 100644 packages/server/tests/stress/index.js create mode 100644 packages/server/tests/stress/machines.js create mode 100644 packages/server/tests/stress/scripts/create-machines.sh create mode 100644 packages/server/tests/stress/server.js create mode 100644 packages/server/tests/stress/utils/default-config.json create mode 100644 packages/server/tests/stress/utils/variables.js create mode 100644 packages/server/tools/build-dev-env.js create mode 100644 packages/server/tools/build-docker-certs.sh create mode 100644 packages/server/tools/build-prod-env.js create mode 100755 packages/server/tools/cert-gen.sh create mode 100644 packages/server/tools/digitalocean/createblockstorage.sh create mode 100644 packages/server/tools/digitalocean/migratedata.sh create mode 100755 packages/server/tools/lamassu-server-stress-testing create mode 100644 packages/server/tools/migrate-env.js create mode 100644 packages/server/tools/set-env-var.js create mode 100644 packages/typesafe-db/package.json create mode 100644 packages/typesafe-db/src/compliance-triggers.ts create mode 100644 packages/typesafe-db/src/customers.ts create mode 100644 packages/typesafe-db/src/db.ts create mode 100644 packages/typesafe-db/src/index.ts create mode 100644 packages/typesafe-db/src/interpolated-query-logger.ts create mode 100644 packages/typesafe-db/src/machine-groups.ts create mode 100644 packages/typesafe-db/src/machines.ts create mode 100644 packages/typesafe-db/src/notify.ts create mode 100644 packages/typesafe-db/src/pg-error-codes.ts create mode 100644 packages/typesafe-db/src/transactions.ts create mode 100644 packages/typesafe-db/src/types/manual.types.d.ts create mode 100644 packages/typesafe-db/src/types/types.d.ts create mode 100644 packages/typesafe-db/src/user-config.ts create mode 100644 packages/typesafe-db/tsconfig.json create mode 100644 pnpm-lock.yaml create mode 100644 pnpm-workspace.yaml create mode 100644 shell.nix create mode 100644 turbo.json diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..1ef410a --- /dev/null +++ b/.dockerignore @@ -0,0 +1,5 @@ +node_modules +packages/*/node_modules +.git +.direnv +.envrc \ No newline at end of file diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..ed343d7 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,51 @@ +name: build + +on: [ workflow_dispatch ] + +jobs: + everything: + runs-on: ubuntu-22.04 + steps: + - uses: actions/checkout@v4 + + - name: Setup Turbo cache + uses: actions/cache@v4 + with: + path: .turbo + key: ${{ runner.os }}-turbo-${{ github.sha }} + restore-keys: | + ${{ runner.os }}-turbo- + + - name: Setup pnpm + uses: pnpm/action-setup@v4 + with: + version: 10.11.0 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '22' + cache: 'pnpm' + + - name: Install dependencies + run: pnpm install + + - name: Build packages with Turbo + run: pnpm run build + + - name: Package production build + run: | + # Create production-ready server package using pnpm deploy + pnpm deploy --filter=./packages/server --prod lamassu-server --legacy + + # Copy built admin UI to public directory + cp -r packages/admin-ui/build lamassu-server/public + + # Create tarball + tar -zcf lamassu-server.tar.gz lamassu-server/ + + - name: Upload artifact + uses: actions/upload-artifact@v4 + with: + name: lamassu-server.tar.gz + path: lamassu-server.tar.gz diff --git a/.github/workflows/docker-build.yml b/.github/workflows/docker-build.yml new file mode 100644 index 0000000..dbbef74 --- /dev/null +++ b/.github/workflows/docker-build.yml @@ -0,0 +1,92 @@ +name: Docker Build and Publish + +on: + push: + branches: + - dev + +env: + DOCKERHUB_SERVER_REPO: lamassu/lamassu-server + DOCKERHUB_ADMIN_REPO: lamassu/lamassu-admin-server + +jobs: + build-and-publish: + runs-on: ubuntu-22.04 + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup Turbo cache + uses: actions/cache@v4 + with: + path: .turbo + key: ${{ runner.os }}-turbo-${{ github.sha }} + restore-keys: | + ${{ runner.os }}-turbo- + + - name: Setup pnpm + uses: pnpm/action-setup@v4 + with: + version: 10.11.0 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '22' + cache: 'pnpm' + + - name: Install dependencies + run: pnpm install + + - name: Build packages with Turbo + run: pnpm run build + + - name: Verify build artifacts + run: | + echo "=== Verifying typesafe-db build ===" + ls -la packages/typesafe-db/lib/ + echo "=== Verifying admin-ui build ===" + ls -la packages/admin-ui/build/ + + - name: Package production build + run: | + # Create production-ready server package using pnpm deploy + pnpm deploy --filter=./packages/server --prod lamassu-server --legacy + + # Copy built admin UI to public directory + cp -r packages/admin-ui/build lamassu-server/public + + # Copy Dockerfile to lamassu-server context + cp build/server.Dockerfile lamassu-server/ + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to DockerHub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKER_HUB_USERNAME }} + password: ${{ secrets.DOCKER_HUB_TOKEN }} + + - name: Build and push server image + uses: docker/build-push-action@v5 + with: + context: lamassu-server + push: true + target: l-s + file: lamassu-server/server.Dockerfile + tags: ${{ env.DOCKERHUB_SERVER_REPO }}:latest + cache-from: type=gha + cache-to: type=gha,mode=max + + - name: Build and push admin server image + uses: docker/build-push-action@v5 + with: + context: lamassu-server + push: true + target: l-a-s + file: lamassu-server/server.Dockerfile + tags: ${{ env.DOCKERHUB_ADMIN_REPO }}:latest + cache-from: type=gha + cache-to: type=gha,mode=max diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..6a0cb4a --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,40 @@ +name: Tests + +on: + pull_request: + branches: [ dev ] + push: + branches: [ dev ] + +jobs: + test: + runs-on: ubuntu-22.04 + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup Turbo cache + uses: actions/cache@v4 + with: + path: .turbo + key: ${{ runner.os }}-turbo-${{ github.sha }} + restore-keys: | + ${{ runner.os }}-turbo- + + - name: Setup pnpm + uses: pnpm/action-setup@v4 + with: + version: 10.11.0 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '22' + cache: 'pnpm' + + - name: Install dependencies + run: pnpm install + + - name: Run tests + run: pnpm run test \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..227a35c --- /dev/null +++ b/.gitignore @@ -0,0 +1,13 @@ +**/node_modules +**/.env +.pnpm-store/ + +.idea/ +.settings/ +.turbo/ + +packages/server/.lamassu +packages/server/certs/ +packages/server/tests/stress/machines +packages/server/tests/stress/config.json +packages/typesafe-db/lib/ diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100755 index 0000000..2135df9 --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,5 @@ +#!/usr/bin/env sh +. "$(dirname -- "$0")/_/husky.sh" + +# Run linting +npx lint-staged diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..bf93fdb --- /dev/null +++ b/.prettierrc @@ -0,0 +1,8 @@ +{ + "trailingComma": "all", + "tabWidth": 2, + "semi": false, + "singleQuote": true, + "arrowParens": "avoid", + "bracketSameLine": true +} \ No newline at end of file diff --git a/.tool-versions b/.tool-versions new file mode 100644 index 0000000..478a821 --- /dev/null +++ b/.tool-versions @@ -0,0 +1,3 @@ +nodejs 22 +pnpm 10 +python 3 diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..c975923 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,22 @@ +{ + // Use IntelliSense to learn about possible Node.js debug attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "type": "node", + "request": "launch", + "name": "Launch Program", + "program": "${workspaceRoot}/bin/lamassu-server", + "cwd": "${workspaceRoot}", + "args": [""] + }, + { + "type": "node", + "request": "attach", + "name": "Attach by Process ID", + "processId": "${command:PickProcess}" + } + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..48d232f --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "vsicons.presets.angular": false +} diff --git a/CRYPTO_README.md b/CRYPTO_README.md new file mode 100644 index 0000000..d912bba --- /dev/null +++ b/CRYPTO_README.md @@ -0,0 +1,54 @@ +## Adding a new cryptocurrency to a Lamassu ATM + +### Structure + +In order to install new coins onto a Lamassu system, there are three points to pay attention: + - **The blockchain daemon:** This is a file which will need to be running on the lamassu-server and communicates with the blockchain network. This generally has an integrated wallet, but it may occur for the daemon and the wallet to be completely seperate processes (e.g. XMR). This manager is currently built into the lamassu-server project, but in the future, it will be moved to either lamassu-coins or a new library; + - **The wallet plugin:** This uses the capabilities of the RPC (Remote Procedure Call) API built into the blockchain daemon and wallet to create a linking API to standardize with the Lamassu ecosystem. It is built into the lamassu-server project; + - **The coin constants:** This has all the information about an implemented coin, including its code, unit scale, daemon RPC ports and all other information to make lamassu-server, lamassu-admin-server and lamassu-machine know about the supported coins. It is built into the lamassu-coins package; + +I'll be using XMR as example for all the steps in this guide. + +#### Blockchain + +Steps to implement a daemon: + - Create a file in `lamassu-server/lib/blockchain/.js`; + - Go to `lamassu-server/lib/blockchain/common.js` and add a new entry to the `BINARIES` object. Each entry has two mandatory fields (`url` and `dir`), and an optional one (`files`). + - To get the `url` needed to download the blockchain daemon, you need to access the releases of the daemon of the coin you're working with. For example, for XMR, the daemon can be found in their GitHub releases (https://github.com/monero-project/monero-gui/releases). Get the URL for the Linux 64-bit distribution and note the extension of the file, which will most likely be `.tar.gz` or `.tar.bz2`. For `.tar.bz2`, the coin you're working with needs to be added to the following snippet of code, responsible for the extraction of the downloaded file (`common.js`): + ``` + coinRec.cryptoCode === 'XMR' + ? es(`tar -xf ${downloadFile}`) + : es(`tar -xzf ${downloadFile}`) + ``` + - To get the `dir`, simply download the file, extract it, and take note of the folder inside the zipped file and the path towards the actual files you want. In XMR's case, `dir` = `monero-x86_64-linux-gnu-v0.17.2.0`, but for BTC it is `bitcoin-0.20.1/bin` + - Inside the directory specified in the `dir` field, there can be multiple files inside. In that case, you want to specity the `files` field. This is a multi-dimensional array, where each entry contains a pair of [, ]. + ``` + [ + ['monerod', 'monerod'], + ['monero-wallet-rpc', 'monero-wallet-rpc'] + ] + ``` + This means that the `monerod` found inside the distribution folder will be saved as `monerod` on the server. Same for the `monero-wallet-rpc`. + - Go to `lamassu-server/lib/blockchain/install.js` and add a new entry on the `PLUGINS` object. This entry must import the file created in step 1. + - Go to the file created in step one and import the object (which isn't created right now) containing all the information needed of a coin `const coinRec = utils.getCryptoCurrency('')`. + - The coin blockchain plugin contains two functions: `setup` and `buildConfig`. + - The build config has all the required flags to operate the downloaded daemon, and each coin has their particular set of flags and options, so that specification won't be covered here. + - The setup function has a similar structure in any coin, and the differences between them is generally related to how a daemon is ran. + +#### Wallet plugin + +Steps to implement a wallet plugin: + - Create a file in `lamassu-server/lib/plugins/wallet//.js` + - The wallet plugin serves as a middleware between the RPC calls supported by each daemon, and the processes ran inside the lamassu-server ecosystem. This includes address creation, balance lookup, making transactions, etc. As such, this file needs to export the following functions: + - `balance`: Responds with the amount of usable balance the operator wallet has; + - `sendCoins`: Responsible for creating a transaction and responds with an object containing the fee of the transaction and the transactionID; + - `newAddress`: Generates a new address for the operator wallet. Used for machine transactions and funding page; + - `getStatus`: Responsible for getting the status of a cash-out transaction (transaction from an operator address to a client address). + - `newFunding`: Creates the response to the funding page, with the amount of balance the operator has, the pending balance and a new funding address; + - `cryptoNetwork`: Responds with the crypto network the wallet is operating in, based on the port of the RPC calls used. + +#### Coin utils + +Steps to work on lamassu-coins: + - Create a new object on `lamassu-coins/config/consts.js` containing all the information relative to a coin. If you're using a wallet built into the daemon, use BTC as template. Otherwise, if the wallet process is separated from the daemon, use XMR as template; + - Create a new file on `lamassu-coins/plugins/.js`. This file should handle URL parsing and address validation. Despite most coins in lamassu-coins operating on base58 or bech32 validation, this validation can implemented on some variation of the existing algorithms, as is the case with XMR. When this happens, the implementation of this variation needs to be created from scratch. With the validator created, the machine should be able to recognize a valid address. To test this out, simply edit the `lamassu-machine/device-config.json` file with the new coin address to validate. diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..78c1fcb --- /dev/null +++ b/LICENSE @@ -0,0 +1,121 @@ +APPENDIX A SOFTWARE LICENSE AGREEMENT + +This Appendix A Software License Agreement (hereinafter referred to as the "Agreement") is made between Lamassu Industries AG, a Swiss corporation, (hereinafter referred to as "Lamassu") and Lamassu’s customer to whom Lamassu’s proprietary software or products containing embedded or pre-loaded proprietary software, or both is made available (hereinafter referred to as "Licensee"). Licensee and Lamassu enter into an agreement to which this appendix is attached (hereinafter referred to as the "Primary Agreement"). + +WHEREAS, Lamassu has developed and is the owner of the Lamassu software program that runs Lamassu Crypto ATMs (hereinafter referred to as the "Software"). Crypto ATMs means automated teller machines that allow a person to purchase or sell Bitcoin and other cryptocurrencies by using cash or debit card (hereinafter referred to as the "Crypto ATMs"). Software (i) means proprietary software in source code or object code format, and adaptations, translations, de-compilations, disassemblies, emulations, or derivative works of such software; (ii) means any modifications, enhancements, new versions and new releases of the software provided by Lamassu; and (iii) may contain one or more items of software owned by a third party supplier. The term "Software" does not include any third party software provided under separate license or third party software not licensable under the terms of this Agreement. + +WHEREAS, Lamassu desires to grant to Licensee, and Licensee desires to obtain from Lamassu, a limited, non-exclusive license to use the Software subject to terms and conditions set forth in this Agreement. + +NOW, THEREFORE, in consideration of the mutual promises set forth herein, Lamassu and Licensee (hereinafter referred to as the "Parties") agree as follows: + +1. Scope + +1.1. Lamassu and Licensee enter into this Agreement in connection with Lamassu's delivery of certain proprietary Software or products containing embedded or pre-loaded proprietary Software, or both. This Agreement contains the terms and conditions of the license Lamassu is providing to Licensee, and Licensee’s use of the Software and documentation. + +1.2. The license granted in this Agreement is on a per Lamassu product basis and/or per non Lamassu Crypto ATM basis according to the Primary Agreement. For example, if Licensee intends to use the Software on 10 Lamassu Crypto ATMs, Licensee must obtain and pay for 10 license seats in accordance with the Primary Agreement. If Licensee purchases only one Lamassu Crypto ATM, Licensee obtains only one license seat for the Software, Licensee is permitted to use the Software on the purchased Lamassu Crypto ATM but not on other Lamassu and/or non Lamassu Crypto ATMs owned by Licensee, unless additional license seats are obtained and paid by Licensee. The same applies if Licensee intends to use the Software on non Lamassu Crypto ATMs. Licensee must obtain and pay a separate license seat for each non Lamassu Crypto ATM in accordance with the Primary Agreement. + +2. Granting of License + +2.1. Subject to the provisions of this Agreement and the payment of applicable fees outlined in the Primary Agreement, Lamassu grants to Licensee a personal, limited, non-transferable, non-sublicensable and non-exclusive license under Lamassu copyrights embodied in the Software to use the Software, in original source code or object code form, and the documentation solely in connection with Licensee's use of the Lamassu products or to modify, adapt, create derivative works of the Software for the purpose of running it on non Lamassu Crypto ATMs (hereinafter referred to as the "Contractual Use"). + +2.2. If the Software licensed under this Agreement contains or is derived from Open Source Software, the terms and conditions governing the use of such Open Source Software are in the Open Source Software Licenses of the copyright owner and not this Agreement. If there is a conflict between the terms and conditions of this Agreement and the terms and conditions of the Open Source Software Licenses governing Licensee's use of the Open Source Software, the terms and conditions of the license grant of the applicable Open Source Software Licenses will take precedence over the license grants in this Agreement. + +2.3. Licensee may copy the Software, so far as a copy is necessary for the Contractual Use of the Software. Necessary copies are for example, the installation of the Software on a storage medium and loading the Software into the working memory. Licensee are also entitled to make a reasonable number of copies of the Software for backup purposes only. This right also includes the regular production of backup copies for the purpose of quickly restoring data stocks after a system failure and the temporary use of the Software on an alternative system. Copies of the Software made for backup purposes must be marked accordingly and may not be used for other purposes. Licensee is entitled to edit and modify the Software (including error corrections) but is not permitted to publish any version of the Software with modifications with regard to the Source Code, the attributions and/ or any other part of the Software. + +2.4. Lamassu reserves for itself all other rights and interest not explicitly granted under this Agreement. The right of Licensee to decrypt according to Art. 21 URG is reserved. + +3. Limitations on Use + +3.1. Licensee may use the Software only for (i) Licensee's internal business purposes, (ii) the Contractual Use and (iii) only in accordance with the documentation. Any other use of the Software is strictly prohibited. Without limiting the general nature of these restrictions, Licensee will not make the Software available for use by third parties on a "time sharing," "application service provider," or "service bureau" basis or for any other similar commercial rental or sharing arrangement. + +3.2. Licensee will not, and will not allow or enable any third party to: (i) reverse engineer, disassemble, peel components, decompile, reprogram or otherwise reduce the Software or any portion to a human perceptible form or otherwise attempt to recreate the source code; (ii) modify, adapt, create derivative works of, or merge the Software outside of the Contractual Use; (iii) copy, reproduce, distribute, lend, or lease the Software or documentation to any third party, grant any sublicense or other rights in the Software or documentation to any third party, or take any action that would cause the Software or documentation to be placed in the public domain; (iv) remove, or in any way alter or obscure, any copyright notice or other notice of Lamassu's proprietary rights; or (v) provide, copy, transmit, disclose, divulge or make the Software or documentation available to any third party. + +4. Delivery of the Software + +4.1. The delivery of the Software takes place with consultation between the Parties. Lamassu shall register Licensee within its system and provide it with an access code. + +4.2. Licensee shall download the Software through their own access code and install it on their own server or Crypto ATM. Licensee shall not alter the Software's functionality or provide its access code to third parties. Licensee is responsible for maintaining the confidentiality of their access data, their account information and all activities resulting from accessing the Software using their username and access data. + +4.3. Licensee is responsible for the installation and the launch of the Software. + +5. Updates & upgrades & bug fixes + +5.1. Licensee agrees and acknowledges that malfunctions of the Software cannot be completely excluded, even with the greatest care, and that the uninterrupted functionality of the Software cannot be guaranteed. + +5.2. Lamassu shall provide Licensee free of charge with all updates, upgrades, bug fixes and code corrections to correct Software malfunctions and defects in order to bring the Software into substantial conformity with its operating specifications. + +5.3. Lamassu may, but will not be required to, provide these services if Licensee has modified the Software or is in default. + +5.4. The ownership and any intellectual property rights to the work results continuously created by providing updates, upgrades and bug fixes belong fully and exclusively to Lamassu. + +5.5. If Licensee provides Lamassu with any feedback, ideas or suggestions regarding the Software, Lamassu may use all such feedback without restriction and shall not be subject to any non-disclosure or non-use obligations in respect of such feedback, and Licensee hereby grants Lamassu a worldwide, non-exclusive, perpetual, irrevocable, royalty-free, fully paid, sub-licensable and transferable license to use, edit, aggregate, reproduce, distribute, prepare derivative works of, display, perform, and otherwise fully exploit such feedback, ideas or suggestions regarding the Software, for any use or purpose whatsoever. + +6. Warranty of Title and Functionality + +6.1. Lamassu hereby represents and warrants to Licensee that Lamassu is the owner of the Software and has the right to grant to Licensee the rights set forth in this Agreement. + +6.2. If Licensee is not in breach of any of its obligations under this Agreement and the Primary Agreement, Lamassu warrants that the Software will perform the functions described in this Agreement if used in accordance with the Agreement. Failure to do so shall constitute a defect in the Software that is subject to warranty (hereinafter referred to as the "Defect"). This warranty shall not apply to the Software if modified by anyone, even if such modification is allowed under the terms of this Agreement, or if used improperly or in an operating environment not approved by Lamassu. + +6.3. Lamassu does not warrant that Licensee's use of the Software or the Lamassu products will be uninterrupted, error-free, completely free of security vulnerabilities, or that the Software or the Lamassu products will meet Licensee's particular requirements. Lamassu makes no representations or warranties with respect to any third party software included in the Software. Licensee explicitly agrees and acknowledges that Lamassu does not warrant that the Software will satisfy or fulfill any regulators, customers and/or other authorities' requirements and expectations. It's in the sole responsibility of Licensee to clarify with the competent regulators whether the Software and other implemented measures fulfil the applicable requirements. + +6.4. Licensee acknowledges, however, that malfunctions of the Software cannot be completely ruled out, even with the greatest care, and that the uninterrupted functionality of the Software cannot be guaranteed. + +6.5. Lamassu's sole obligation to Licensee and Licensee's exclusive remedy under this warranty is to use reasonable efforts to remedy any material Software defect covered by this warranty. These efforts will involve either replacing the media or attempting to correct significant, demonstrable program or documentation errors or security vulnerabilities. If Lamassu cannot correct the defect within a reasonable time, then at Lamassu's option, Lamassu will replace the defective Software with functionally-equivalent Software, license to Licensee substitute Software which will accomplish the same objective, or terminate the license and refund Licensee's paid license fee. + +6.6. Licensee must give Lamassu sufficient notice of any defect within 5 calendar days of its discovery. + +6.7. The express warranties set forth in this Section 6 are in lieu of, and Lamassu disclaims, any and all other warranties (express or implied, oral or written) with respect to the Software or documentation, including, without limitation, any and all implied warranties of condition, title, non-infringement, merchantability, or fitness for a particular purpose or use by Licensee (whether or not Lamassu knows, has reason to know, has been advised, or is otherwise aware of any such purpose or use), whether arising by law, by reason of custom or usage of trade, or by course of dealing. In addition, Lamassu disclaims any warranty to any person other than Licensee with respect to the Software or documentation. Any further warranty claims of Licensee are expressly excluded. + +7. Limitation of Liability + +7.1. Lamassu shall not be responsible for, and shall not pay, any amount of incidental, consequential or other indirect damages, whether based on lost revenue or otherwise, regardless of whether Licensee was advised of the possibility of such losses in advance by Lamassu. + +7.2. In no event shall Lamassu's liability hereunder exceed the amount paid by Licensee under the Primary Agreement, regardless of whether Licensee’s claim is based on contract, tort, strict liability, product liability or otherwise. + +7.3. This limitation of liability provision survives the expiration or termination of this Agreement and applies notwithstanding any contrary provision in this Agreement. + +8. Term and termination + +8.1. Licensee's right to use the Software and documentation will begin when the Primary Agreement is signed by both Parties and will continue (i) for the life of the Lamassu Products with which or for which the Software and documentation have been provided by Lamassu, unless Licensee breaches this Agreement, in which case this Agreement and Licensee's right to use the Software and documentation may be terminated immediately upon notice by Lamassu or (ii) for the duration of the Primary Agreement, unless Licensee breaches this Agreement or the Primary Agreement, in which case this Agreement and Licensee's right to use the Software and documentation may be terminated immediately upon notice by Lamassu. + +8.2. After termination of this Agreement, Licensee shall no longer use the Software. Upon first request by Lamassu, Licensee shall remove or delete and destroy all copies of the Software and documentation. + +8.3. Licensee acknowledges that Lamassu made a considerable investment of resources in the development, marketing, and distribution of the Software and documentation and that Licensee's breach of this Agreement will result in irreparable harm to Lamassu for which solely monetary damages would be inadequate. If Licensee breaches this Agreement, Lamassu may terminate this Agreement and be entitled to all available remedies at law or in equity (including immediate injunctive relief and repossession of all non-embedded Software and associated documentation). + +8.4. Sections 3, 6, 7, 9, 10, 11, 12, 13, 14, and 15 survive the termination of this Agreement. + +9. Intellectual Property Rights + +9.1. The Software is and includes intellectual property of Lamassu. All associated intellectual property rights, including, without limitation, worldwide patent, trademark, copyright and trade secret rights, are reserved by Lamassu. Lamassu retains all right, title and interest in and copyrights to the Software, regardless of form or media in or on which the original or other copies may subsequently exist. This Agreement does not constitute a sale of the Software and no title or proprietary rights to the Software are transferred to Licensee hereby. Licensee acknowledges that the Software is a unique, confidential and valuable asset of Lamassu. + +9.2. All intellectual property developed, originated, or prepared by Lamassu in connection with providing the Software, Lamassu products, documentation or related services, remains vested exclusively in Lamassu, and Licensee will not have any shared development or other intellectual property rights. + +10. Confidentiality + +10.1. Licensee acknowledges that the Software contains proprietary trade secrets of Lamassu and Licensee hereby agrees to maintain the confidentiality of the Software using at least as great a degree of care as it uses to maintain the confidentiality of its own confidential information. Licensee agrees to promptly communicate the terms and conditions of this Agreement to those persons employed by Licensee who come into contact with the Software. Licensee is responsible in the event of a breach of confidentiality by any of its employees or agents. Licensee shall use reasonable efforts to ensure its compliance with its confidentiality obligations under this Agreement, including, without limitation, preventing the use of any portion of the Software for the purpose of deriving the source code of the Software. + +11. Successors + +11.1. This Agreement will be binding upon and will inure to the benefit of the Parties hereto and their respective representatives, successors and assigns except as otherwise provided herein. + +12. Severability + +12.1. In the event any provision of this Agreement is determined to be invalid or unenforceable, the remainder of this Agreement shall remain in force as if such provision were not a part of it. + +13. Non-assignment + +13.1. This Agreement, any claims and the licenses granted by it may not be assigned, sublicensed, or otherwise transferred by Licensee without the prior written consent of Lamassu. + +13.2. This Agreement and any claims hereunder may not be assigned by Lamassu to any third party without the prior written consent of Licensee. + +14. Agreement + +14.1. This Agreement sets forth the entire understanding between the Parties with respect to the subject matter hereof, and merges and supersedes all prior agreements, discussions and understandings, express or implied, concerning such matters. This Agreement shall take precedence over any additional or conflicting term, which may be contained in Licensees' purchase order or Lamassu‘s order acknowledgment forms. + +15. Governing law / place of jurisdiction + +15.1. This Agreement shall be governed by and construed in accordance with the substantive laws of Switzerland under exclusion of its conflict of laws rules. The United Nations Convention on Contracts on the International Sale of Goods is expressly excluded. + +15.2. The Parties hereby irrevocably and unconditionally agree to the exclusive jurisdiction of the courts of Lucerne, Switzerland. + +IN WITNESS WHEREOF, the Parties have caused this Agreement to be executed. diff --git a/README.md b/README.md new file mode 100644 index 0000000..47ea16b --- /dev/null +++ b/README.md @@ -0,0 +1,62 @@ +# lamassu-server + +Lamassu remote server. + +## Pull Requests + +We do not generally accept outside pull requests for new features. Please consult with us before putting a lot of work into a pull request. + +## Development + +### Requirements + +- Nodejs 22 +- PNPM 10+ +- Postgres Database +- Python 3 (to be deprecated, required by a single dependency installation) +- OpenSSL (for cert-gen.sh, it will set up the server self-signed certificates) + +There's a shell.nix file that you can use to set up your env in case you're a nix user. (most reliable way of installing native deps) +There's also a .tool-versions for asdf and mise users. + +This project uses Turbo for monorepo management. Install dependencies: + +```bash +pnpm install +``` + +Prepare environment files: + +```bash +bash packages/server/tools/cert-gen.sh +``` + +On packages/server/.env you can alter variables such as the postgres connection info. + +After configuring the postgres connection, run: + +```bash +node packages/server/bin/lamassu-migrate +``` + +### Start development environment: + +If you've already done the setup, you can run: + +```bash +pnpm run dev +``` + +### Creating a user + +```bash +node packages/server/bin/lamassu-register admin@example.com superuser +``` + +### Pairing a machine + +To get the pairing token from the QRCode open the browser console before picking the name of the machine, the token should appear on the terminal. +It's also possible to inspect the qrCode, the token is on the data-cy="" attr. +Lastly, you can always scan it with a phone and copy the contents over. + +Now continue with lamassu-machine instructions from the `INSTALL.md` file in [lamassu-machine repository](https://github.com/lamassu/lamassu-machine) diff --git a/build/docker-compose.yaml b/build/docker-compose.yaml new file mode 100644 index 0000000..0a5a56a --- /dev/null +++ b/build/docker-compose.yaml @@ -0,0 +1,55 @@ +version: "3.8" + +services: + lamassu-server: + image: lamassu/lamassu-server:latest + restart: on-failure + network_mode: host + volumes: + - ./lamassu-data:/lamassu-data + environment: + - NODE_ENV=production + - POSTGRES_USER=postgres + - POSTGRES_PASSWORD=postgres123 + - POSTGRES_HOST=localhost + - POSTGRES_PORT=5432 + - POSTGRES_DB=lamassu + - CA_PATH=/lamassu-data/certs/Lamassu_OP_Root_CA.pem + - CERT_PATH=/lamassu-data/certs/Lamassu_OP.pem + - KEY_PATH=/lamassu-data/private/Lamassu_OP.key + - MNEMONIC_PATH=/lamassu-data/mnemonics/mnemonic.txt + - OFAC_DATA_DIR=/lamassu-data/ofac + - ID_PHOTO_CARD_DIR=/lamassu-data/idphotocard + - FRONT_CAMERA_DIR=/lamassu-data/frontcamera + - OPERATOR_DATA_DIR=/lamassu-data/operatordata + - COIN_ATM_RADAR_URL=https://coinatmradar.info/api/lamassu/ + - HOSTNAME=localhost + - LOG_LEVEL=info + + lamassu-admin-server: + image: lamassu/lamassu-admin-server:latest + restart: on-failure + network_mode: host + volumes: + - ./lamassu-data:/lamassu-data + environment: + - NODE_ENV=production + - POSTGRES_USER=postgres + - POSTGRES_PASSWORD=postgres123 + - POSTGRES_HOST=localhost + - POSTGRES_PORT=5432 + - POSTGRES_DB=lamassu + - CA_PATH=/lamassu-data/certs/Lamassu_OP_Root_CA.pem + - CERT_PATH=/lamassu-data/certs/Lamassu_OP.pem + - KEY_PATH=/lamassu-data/private/Lamassu_OP.key + - MNEMONIC_PATH=/lamassu-data/mnemonics/mnemonic.txt + - OFAC_DATA_DIR=/lamassu-data/ofac + - ID_PHOTO_CARD_DIR=/lamassu-data/idphotocard + - FRONT_CAMERA_DIR=/lamassu-data/frontcamera + - OPERATOR_DATA_DIR=/lamassu-data/operatordata + - COIN_ATM_RADAR_URL=https://coinatmradar.info/api/lamassu/ + - HOSTNAME=172.29.0.3 + - LOG_LEVEL=info + depends_on: + lamassu-server: + condition: service_started \ No newline at end of file diff --git a/build/server.Dockerfile b/build/server.Dockerfile new file mode 100644 index 0000000..2348ed7 --- /dev/null +++ b/build/server.Dockerfile @@ -0,0 +1,17 @@ +FROM node:22-bullseye AS base +RUN apt install openssl ca-certificates + +WORKDIR /lamassu-server + +# Copy the pre-built production package from CI (with node_modules) +COPY . ./ + +FROM base AS l-s +RUN chmod +x /lamassu-server/bin/lamassu-server-entrypoint.sh +EXPOSE 3000 +ENTRYPOINT [ "/lamassu-server/bin/lamassu-server-entrypoint.sh" ] + +FROM base AS l-a-s +RUN chmod +x /lamassu-server/bin/lamassu-admin-server-entrypoint.sh +EXPOSE 443 +ENTRYPOINT [ "/lamassu-server/bin/lamassu-admin-server-entrypoint.sh" ] \ No newline at end of file diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 0000000..b48d46d --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,85 @@ +import js from '@eslint/js' +import globals from 'globals' +import pluginReact from 'eslint-plugin-react' +import json from '@eslint/json' +import { defineConfig, globalIgnores } from 'eslint/config' +import ts from 'typescript-eslint' +import reactCompiler from 'eslint-plugin-react-compiler' +import eslintConfigPrettier from 'eslint-config-prettier/flat' +import vitest from 'eslint-plugin-vitest' + +const jsConfig = defineConfig([ + globalIgnores([ + '**/.lamassu', + '**/build', + '**/package.json', + '**/package-lock.json', + '**/currencies.json', + '**/countries.json', + '**/languages.json', + 'packages/typesafe-db/lib/**/*.js' + ]), + { + files: ['**/*.{js,mjs,cjs,jsx}'], + plugins: { js }, + extends: ['js/recommended'], + }, + { + files: ['packages/admin-ui/**/*.{js,mjs,jsx}'], + languageOptions: { + sourceType: 'module', + globals: { + ...globals.browser, + process: 'readonly', + }, + }, + }, + { + files: ['packages/server/**/*.{js,cjs}'], + languageOptions: { sourceType: 'commonjs', globals: globals.node }, + }, + { + ...pluginReact.configs.flat.recommended, + settings: { react: { version: 'detect' } }, + files: ['packages/admin-ui/**/*.{jsx,js}'], + }, + { ...reactCompiler.configs.recommended }, + eslintConfigPrettier, + { + files: ['**/*.json'], + plugins: { json }, + language: 'json/json', + extends: ['json/recommended'], + }, + { + rules: { + 'react/prop-types': 'off', + 'react/display-name': 'off', + 'react/no-unescaped-entities': 'off', + 'react-compiler/react-compiler': 'warn', + }, + }, + { + // update this to match your test files + files: ['**/*.spec.js', '**/*.test.js'], + plugins: { + vitest, + }, + rules: { + ...vitest.configs.recommended.rules, // you can also use vitest.configs.all.rules to enable all rules + 'vitest/max-nested-describe': ['error', { max: 3 }], // you can also modify rules' behavior using option like this + }, + }, +]) + +export default ts.config( + jsConfig, + { + files: ['packages/typesafe-db/src/**/*.ts'], + extends: [ts.configs.recommended], + rules: { + "@typescript-eslint/no-explicit-any": "warn", // TODO: remove this line + "@typescript-eslint/consistent-type-imports": "error", + }, + }, +) diff --git a/package.json b/package.json new file mode 100644 index 0000000..fd7167e --- /dev/null +++ b/package.json @@ -0,0 +1,49 @@ +{ + "name": "lamassu-server", + "description": "bitcoin atm client server protocol module", + "version": "12.0.0", + "license": "./LICENSE", + "author": "Lamassu (https://lamassu.is)", + "packageManager": "pnpm@10.11.0", + "repository": { + "type": "git", + "url": "https://github.com/lamassu/lamassu-server.git" + }, + "engines": { + "node": ">=22.0.0" + }, + "devDependencies": { + "@eslint/css": "^0.7.0", + "@eslint/js": "^9.26.0", + "@eslint/json": "^0.12.0", + "eslint": "^9.26.0", + "eslint-config-prettier": "^10.1.5", + "eslint-plugin-react": "^7.37.5", + "eslint-plugin-react-compiler": "^19.1.0-rc.1", + "eslint-plugin-vitest": "^0.5.4", + "globals": "^16.1.0", + "husky": "^8.0.0", + "lint-staged": "^16.0.0", + "prettier": "^3.5.3", + "turbo": "^2.5.3", + "typescript": "^5.8.3", + "typescript-eslint": "^8.38.0" + }, + "scripts": { + "prepare": "husky install", + "build": "turbo build", + "dev": "turbo dev", + "test": "turbo test" + }, + "husky": { + "hooks": { + "pre-commit": "lint-staged" + } + }, + "lint-staged": { + "*.{js,jsx,ts,tsx,json,css,scss,md}": [ + "prettier --write", + "eslint --fix" + ] + } +} diff --git a/packages/admin-ui/.gitignore b/packages/admin-ui/.gitignore new file mode 100644 index 0000000..e802167 --- /dev/null +++ b/packages/admin-ui/.gitignore @@ -0,0 +1,23 @@ +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# production +/build + +# misc +.DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local + +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +.eslintcache diff --git a/packages/admin-ui/README.md b/packages/admin-ui/README.md new file mode 100644 index 0000000..1db995e --- /dev/null +++ b/packages/admin-ui/README.md @@ -0,0 +1,36 @@ +## Dev Environment + +### formatting + +You can configure a eslint plugin to format code on save. +The configuration for vscode is already on the repo, all you need to do is install the eslint plugin. + +This project has a husky pre commit hook to format the staged changes using our styleguide. +To take advantage of that make sure to run `git commit` from within this folder. + +## Available Scripts + +From the root directory (recommended with Turbo): + +- `pnpm run dev` - Start development environment +- `pnpm run build` - Build for production +- `pnpm run admin:dev` - Start only admin UI development + +In the admin-ui package directory, you can run: + +### `pnpm start` or `pnpm run dev` + +Runs the app in development mode with Vite. +Open [http://localhost:5173](http://localhost:5173) to view it in the browser. + +The page will reload if you make edits. +You will also see any lint errors in the console. + +### `pnpm test` + +Launches the test runner with vitest. + +### `pnpm run build` + +Builds the app for production to the `build` folder. +It correctly bundles React in production mode and optimizes the build for the best performance. diff --git a/packages/admin-ui/index.html b/packages/admin-ui/index.html new file mode 100644 index 0000000..c920f86 --- /dev/null +++ b/packages/admin-ui/index.html @@ -0,0 +1,20 @@ + + + + + + + + + + Lamassu Admin + + + +
+ + + diff --git a/packages/admin-ui/package.json b/packages/admin-ui/package.json new file mode 100644 index 0000000..8a2744b --- /dev/null +++ b/packages/admin-ui/package.json @@ -0,0 +1,81 @@ +{ + "name": "lamassu-admin", + "version": "12.0.0", + "license": "../LICENSE", + "type": "module", + "dependencies": { + "@apollo/client": "^3.13.8", + "@emotion/react": "^11.14.0", + "@emotion/styled": "^11.14.0", + "@lamassu/coins": "v1.6.1", + "@mui/icons-material": "^7.1.0", + "@mui/material": "^7.1.0", + "@mui/x-date-pickers": "^8.3.1", + "@simplewebauthn/browser": "^3.0.0", + "apollo-upload-client": "^18.0.0", + "bignumber.js": "9.0.0", + "classnames": "2.2.6", + "countries-and-timezones": "^2.4.0", + "d3": "^6.2.0", + "date-fns": "^2.26.0", + "date-fns-tz": "^1.1.6", + "downshift": "9.0.9", + "file-saver": "2.0.2", + "formik": "2.2.0", + "immer": "^10.1.1", + "jss-plugin-extend": "^10.0.0", + "jszip": "^3.6.0", + "libphonenumber-js": "^1.11.15", + "match-sorter": "^4.2.0", + "material-react-table": "^3.2.1", + "pretty-ms": "^2.1.0", + "qrcode.react": "4.2.0", + "ramda": "^0.30.1", + "react": "18.3.1", + "react-copy-to-clipboard": "^5.0.2", + "react-dom": "18.3.1", + "react-dropzone": "^11.4.2", + "react-number-format": "^4.4.1", + "react-otp-input": "3.1.1", + "react-virtualized": "^9.21.2", + "ua-parser-js": "1.0.40", + "uuid": "11.1.0", + "wouter": "^3.7.0", + "yup": "1.6.1", + "zustand": "^4.5.7" + }, + "devDependencies": { + "@tailwindcss/vite": "^4.1.4", + "@vitejs/plugin-react-swc": "^3.7.2", + "esbuild-plugin-react-virtualized": "^1.0.4", + "globals": "^15.13.0", + "prettier": "3.4.1", + "tailwindcss": "^4.1.4", + "vite": "^6.0.1", + "vite-plugin-svgr": "^4.3.0", + "vitest": "^3.1.4" + }, + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview", + "test": "vitest", + "test:run": "vitest run" + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + }, + "lint-staged": { + "*.{js,jsx,md,json}": "eslint --cache --fix", + "*.{js,jsx,css,md,json}": "prettier --write" + } +} diff --git a/packages/admin-ui/public/assets/wizard/fullexample.commissions.png b/packages/admin-ui/public/assets/wizard/fullexample.commissions.png new file mode 100644 index 0000000000000000000000000000000000000000..92fbf325d3b4b6354350c850bbb076c2e8bdf795 GIT binary patch literal 71597 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 b#HAdu#R@+g&#@mq0P?-3tDnm{r-UW|M6yIS literal 0 HcmV?d00001 diff --git a/packages/admin-ui/public/assets/wizard/fullexample.twilio.png b/packages/admin-ui/public/assets/wizard/fullexample.twilio.png new file mode 100644 index 0000000000000000000000000000000000000000..a8d44125af1872bac38c2adccdf9b6f7efe53c6a GIT binary patch literal 163770 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

tQ-SKwLj(N)4BxdU{Dz`@I>Dx@47C+>V>_d!vA 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

RgtPKe%m)b6B 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 A>;M1& literal 0 HcmV?d00001 diff --git a/packages/admin-ui/public/assets/wizard/fullexample.wallet.png b/packages/admin-ui/public/assets/wizard/fullexample.wallet.png new file mode 100644 index 0000000000000000000000000000000000000000..328e7917a9426bd7214472c20080c2a3d841d685 GIT binary patch literal 31033 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 literal 0 HcmV?d00001 diff --git a/packages/admin-ui/public/favicon.ico b/packages/admin-ui/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..762aa9c18be3eb9de5cb254443672303d7c75540 GIT binary patch literal 1150 zcmZQzU}Ruq5D);-3Je)63=Con3=A3!3=9Gc3=9ek5OD?&U}0bo=7wMp7a3oDW_jr9 zGxIc%*wt625?7yD&OGzXnCsee%hIdQEWTcQZW(v=nZ=K5&n%2UYS8i3rxt!!pIJV; z`pja@)#sLVSD#s&y!y;W?%Gp}@T<=(Ufq0VEOPak#oz1CEkI5}*AC`ieQp_g^_j*0 ztIsU9UVUaU9c0dx=T@drv7)QbEU#RBYTgJ|jD@)R)Y1^D7GwrGeth+r#k;G|EWVt- z?*IxK3={tU4`sgk%;Gg3GazO@H!sG}3>CQc*jyD9PI%3DZm|)n986t%W|4CBxy7Vw z&n)_`KC|e#`pjYu0sSk$8llA9cgFlzpIIEf`pn|Y)#v8Nu0FFk0;QkhFy{5I4c}{=f3nG7?D}oC!&H=I_zX zxbobh^XfB;e^BvvS07sn!8M^Vu01u6fU1Mp_wVWp3-hbbEUrVvFQaL};9h-ZQFQg0 z#b=QEE6*$nK?<%uv-o)RnZ?Vi&nzc^_=ND|$CjKR3{!XYnZ;$0c~_rV?1PDsLSKDm zaUZ1r+B3@lQuM*pg2M3HGmE3>`R@cf1H%D!28IV9%*?>>fSG~e12Y3d0~8;Cih;%1 R85n-JGcf!)&cN^=iUCrRrvCr{ literal 0 HcmV?d00001 diff --git a/packages/admin-ui/public/fonts/BPmono/BPmono.ttf b/packages/admin-ui/public/fonts/BPmono/BPmono.ttf new file mode 100644 index 0000000000000000000000000000000000000000..8b2ada923fb1b6138f882e51ca41554b401a0a91 GIT binary patch literal 58648 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

@C|jPbM4O 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 z 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

-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

0hR*xIcRN^mN4LtdkPL9&7E^Ph2Rq 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 literal 0 HcmV?d00001 diff --git a/packages/admin-ui/public/fonts/MuseoSans/MuseoSans_500-webfont.woff2 b/packages/admin-ui/public/fonts/MuseoSans/MuseoSans_500-webfont.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..c83e38a0a55f97a8fada4981f733f4c3b4b74a8b GIT binary patch literal 23588 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 h!+^zR2cW2&( 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 literal 0 HcmV?d00001 diff --git a/packages/admin-ui/public/fonts/MuseoSans/MuseoSans_700-webfont.woff b/packages/admin-ui/public/fonts/MuseoSans/MuseoSans_700-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..e4d2440693ddcbf9b2ab0677e09e937bedb16e2e GIT binary patch literal 31928 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 WaTWb!^A``YVPIg4X^`8>zyJW%qd>6$ literal 0 HcmV?d00001 diff --git a/packages/admin-ui/public/fonts/MuseoSans/MuseoSans_700-webfont.woff2 b/packages/admin-ui/public/fonts/MuseoSans/MuseoSans_700-webfont.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..1fda725348c43de9224657485689aa0406db5861 GIT binary patch literal 24092 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 literal 0 HcmV?d00001 diff --git a/packages/admin-ui/public/fonts/Rubik/Rubik-Bold.otf b/packages/admin-ui/public/fonts/Rubik/Rubik-Bold.otf new file mode 100644 index 0000000000000000000000000000000000000000..4d7fc6370121dc67905f2e24de12cd608cf9dc1a GIT binary patch literal 101792 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

pBn(!mPU>Y}Ny;XIL+>9%HRzy}^2qJ%#lNNEU)w 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 + + welcome-page-background + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/admin-ui/src/App.jsx b/packages/admin-ui/src/App.jsx new file mode 100644 index 0000000..985e61f --- /dev/null +++ b/packages/admin-ui/src/App.jsx @@ -0,0 +1,54 @@ +import CssBaseline from '@mui/material/CssBaseline' +import { ThemeProvider, StyledEngineProvider } from '@mui/material/styles' +import React, { useState } from 'react' +import { Router } from 'wouter' +import ApolloProvider from './utils/apollo' +import { LocalizationProvider } from '@mui/x-date-pickers' +import { AdapterDateFns } from '@mui/x-date-pickers/AdapterDateFnsV2' + +import AppContext from './AppContext' +import theme from './styling/theme' + +import Main from './Main' +import './styling/global/global.css' +import useLocationWithConfirmation from './routing/useLocationWithConfirmation.js' + +const App = () => { + const [wizardTested, setWizardTested] = useState(false) + const [userData, setUserData] = useState(null) + const [isDirtyForm, setDirtyForm] = useState(false) + + const setRole = role => { + if (userData && role && userData.role !== role) { + setUserData({ ...userData, role }) + } + } + + return ( + + + + + + + +

+ + + + + + + ) +} + +export default App diff --git a/packages/admin-ui/src/AppContext.js b/packages/admin-ui/src/AppContext.js new file mode 100644 index 0000000..f54c8c4 --- /dev/null +++ b/packages/admin-ui/src/AppContext.js @@ -0,0 +1,3 @@ +import React from 'react' + +export default React.createContext() diff --git a/packages/admin-ui/src/Main.jsx b/packages/admin-ui/src/Main.jsx new file mode 100644 index 0000000..e162b96 --- /dev/null +++ b/packages/admin-ui/src/Main.jsx @@ -0,0 +1,104 @@ +import { useLocation } from 'wouter' +import React, { useContext, useState } from 'react' +import { gql, useQuery } from '@apollo/client' +import Slide from '@mui/material/Slide' +import Grid from '@mui/material/Grid' + +import Header from './components/layout/Header.jsx' +import Sidebar from './components/layout/Sidebar.jsx' +import TitleSection from './components/layout/TitleSection.jsx' +import { getParent, hasSidebar, Routes, tree } from './routing/routes.jsx' +import Wizard from './pages/Wizard/Wizard.jsx' + +import AppContext from './AppContext.js' + +const GET_USER_DATA = gql` + query userData { + userData { + id + username + role + enabled + last_accessed + last_accessed_from + last_accessed_address + } + restrictionLevel + } +` + +const Main = () => { + const [location, navigate] = useLocation() + const { wizardTested, userData, setUserData } = useContext(AppContext) + const [loading, setLoading] = useState(true) + const [restrictionLevel, setRestrictionLevel] = useState(null) + + useQuery(GET_USER_DATA, { + onCompleted: userResponse => { + if (!userData && userResponse?.userData) { + setUserData(userResponse.userData) + } + if (userResponse?.restrictionLevel !== undefined) { + setRestrictionLevel(userResponse.restrictionLevel) + } + setLoading(false) + }, + }) + + const sidebar = hasSidebar(location) + const parent = sidebar ? getParent(location) : {} + + const is404 = location === '/404' + + const isSelected = it => location === it.route + + const onClick = it => navigate(it.route) + + const contentClassName = sidebar ? 'flex-1 ml-12 pt-4' : 'w-[1200px]' + + // Show loading state until userData is fetched + if (loading) { + return <> + } + + if (!wizardTested && !is404 && userData) { + return + } + + return ( +
+ {!is404 && wizardTested && ( +
+ )} +
+ {sidebar && !is404 && wizardTested && ( + +
+ +
+
+ )} + + + {sidebar && !is404 && wizardTested && ( + it.label} + onClick={onClick} + /> + )} +
+ +
+
+
+
+ ) +} + +export default Main diff --git a/packages/admin-ui/src/components/Carousel.jsx b/packages/admin-ui/src/components/Carousel.jsx new file mode 100644 index 0000000..4f1547b --- /dev/null +++ b/packages/admin-ui/src/components/Carousel.jsx @@ -0,0 +1,48 @@ +import React, { memo, useState } from 'react' +import styles from './Carousel.module.css' +import LeftArrow from '../styling/icons/arrow/carousel-left-arrow.svg?react' +import RightArrow from '../styling/icons/arrow/carousel-right-arrow.svg?react' + +export const Carousel = memo(({ photosData, slidePhoto }) => { + const [activeIndex, setActiveIndex] = useState(0) + + const handlePrev = () => { + const newIndex = activeIndex === 0 ? photosData.length - 1 : activeIndex - 1 + setActiveIndex(newIndex) + slidePhoto(newIndex) + } + + const handleNext = () => { + const newIndex = activeIndex === photosData.length - 1 ? 0 : activeIndex + 1 + setActiveIndex(newIndex) + slidePhoto(newIndex) + } + + if (!photosData || photosData.length === 0) { + return null + } + + return ( +
+ {photosData.length > 1 && ( + + )} + +
+ +
+ + {photosData.length > 1 && ( + + )} +
+ ) +}) diff --git a/packages/admin-ui/src/components/Carousel.module.css b/packages/admin-ui/src/components/Carousel.module.css new file mode 100644 index 0000000..3239bde --- /dev/null +++ b/packages/admin-ui/src/components/Carousel.module.css @@ -0,0 +1,45 @@ +.carouselContainer { + display: flex; + align-items: center; + justify-content: space-between; + width: 100%; + height: 100%; + box-sizing: border-box; +} + +.imageContainer { + display: flex; + align-items: center; + justify-content: center; + flex: 1; + height: 100%; + overflow: hidden; + max-width: 80%; +} + +.image { + object-fit: contain; + object-position: center; + width: 100%; + height: 100%; + margin-bottom: 40px; +} + +.navButton { + background-color: transparent; + border: none; + border-radius: 0; + color: transparent; + opacity: 1; + cursor: pointer; + padding: 8px; + min-width: 44px; + min-height: 44px; + display: flex; + align-items: center; + justify-content: center; +} + +.navButton:hover { + background-color: rgba(0, 0, 0, 0.04); +} diff --git a/packages/admin-ui/src/components/CollapsibleCard.jsx b/packages/admin-ui/src/components/CollapsibleCard.jsx new file mode 100644 index 0000000..9fc095a --- /dev/null +++ b/packages/admin-ui/src/components/CollapsibleCard.jsx @@ -0,0 +1,21 @@ +import React from 'react' + +import Paper from '@mui/material/Paper' +import classnames from 'classnames' + +const cardState = Object.freeze({ + DEFAULT: 'default', + SHRUNK: 'shrunk', + EXPANDED: 'expanded', +}) + +const CollapsibleCard = ({ className, state, shrunkComponent, children }) => { + return ( + + {state === cardState.SHRUNK ? shrunkComponent : children} + + ) +} + +export default CollapsibleCard +export { cardState } diff --git a/packages/admin-ui/src/components/ConfirmDialog.jsx b/packages/admin-ui/src/components/ConfirmDialog.jsx new file mode 100644 index 0000000..62e4b11 --- /dev/null +++ b/packages/admin-ui/src/components/ConfirmDialog.jsx @@ -0,0 +1,105 @@ +import Dialog from '@mui/material/Dialog' +import DialogActions from '@mui/material/DialogActions' +import DialogContent from '@mui/material/DialogContent' +import IconButton from '@mui/material/IconButton' +import InputLabel from '@mui/material/InputLabel' +import React, { memo, useState } from 'react' +import { H4, P } from './typography' +import CloseIcon from '../styling/icons/action/close/zodiac.svg?react' + +import { Button } from './buttons' +import { TextInput } from './inputs' + +import ErrorMessage from './ErrorMessage' +import SvgIcon from '@mui/material/SvgIcon' + +export const DialogTitle = ({ children, onClose }) => { + return ( +
+ {children} + {onClose && ( + + + + + + )} +
+ ) +} + +export const ConfirmDialog = memo( + ({ + title = 'Confirm action', + errorMessage = 'This action requires confirmation', + open, + toBeConfirmed, + saveButtonAlwaysEnabled = false, + message, + confirmationMessage = `Write '${toBeConfirmed}' to confirm this action`, + onConfirmed, + onDismissed, + initialValue = '', + disabled = false, + ...props + }) => { + const [value, setValue] = useState(initialValue) + const [error, setError] = useState(false) + const handleChange = event => setValue(event.target.value) + + const innerOnClose = () => { + setValue('') + setError(false) + onDismissed() + } + + const isOnErrorState = + (!saveButtonAlwaysEnabled && toBeConfirmed !== value) || value === '' + + return ( + + +

{title}

+
+ {errorMessage && ( + + + {errorMessage.split(':').map(error => ( + <> + {error} +
+ + ))} +
+
+ )} + + {message &&

{message}

} + {confirmationMessage} + +
+ + + +
+ ) + }, +) diff --git a/packages/admin-ui/src/components/CopyToClipboard.jsx b/packages/admin-ui/src/components/CopyToClipboard.jsx new file mode 100644 index 0000000..a46b719 --- /dev/null +++ b/packages/admin-ui/src/components/CopyToClipboard.jsx @@ -0,0 +1,80 @@ +import classnames from 'classnames' +import * as R from 'ramda' +import React, { useState, useEffect } from 'react' +import { CopyToClipboard as ReactCopyToClipboard } from 'react-copy-to-clipboard' +import Popover from './Popper.jsx' +import CopyIcon from '../styling/icons/action/copy/copy.svg?react' + +import { comet } from '../styling/variables.js' + +import { Label1, Mono } from './typography/index.jsx' + +const CopyToClipboard = ({ + className, + buttonClassname, + children, + value, + wrapperClassname, + removeSpace = true, +}) => { + const [anchorEl, setAnchorEl] = useState(null) + + useEffect(() => { + if (anchorEl) setTimeout(() => setAnchorEl(null), 3000) + }, [anchorEl]) + + const handleClick = event => { + setAnchorEl(anchorEl ? null : event.currentTarget) + } + + const handleClose = () => { + setAnchorEl(null) + } + + const open = Boolean(anchorEl) + const id = open ? 'simple-popper' : undefined + + const text = value + ? value + : removeSpace + ? R.replace(/\s/g, '')(children ?? '') + : children + + return ( +
+ {children && ( + <> + + {children} + +
+ + + +
+ + + Copied to clipboard! + + + + )} +
+ ) +} + +export default CopyToClipboard diff --git a/packages/admin-ui/src/components/DeleteDialog.jsx b/packages/admin-ui/src/components/DeleteDialog.jsx new file mode 100644 index 0000000..a6a7cb9 --- /dev/null +++ b/packages/admin-ui/src/components/DeleteDialog.jsx @@ -0,0 +1,65 @@ +import Dialog from '@mui/material/Dialog' +import DialogActions from '@mui/material/DialogActions' +import DialogContent from '@mui/material/DialogContent' +import IconButton from '@mui/material/IconButton' +import React from 'react' +import { H4, P } from './typography' +import CloseIcon from '../styling/icons/action/close/zodiac.svg?react' + +import { Button } from './buttons' + +import ErrorMessage from './ErrorMessage' +import SvgIcon from '@mui/material/SvgIcon' + +export const DialogTitle = ({ children, close }) => { + return ( +
+ {children} + {close && ( + + + + + + )} +
+ ) +} + +export const DeleteDialog = ({ + title = 'Confirm Delete', + open = false, + onConfirmed, + onDismissed, + item = 'item', + confirmationMessage = `Are you sure you want to delete this ${item}?`, + extraMessage, + errorMessage = '', +}) => { + return ( + + onDismissed()}> +

{title}

+
+ {errorMessage && ( + + + {errorMessage.split(':').map(error => ( + <> + {error} +
+ + ))} +
+
+ )} + + {confirmationMessage &&

{confirmationMessage}

} + {extraMessage} +
+ + + +
+ ) +} diff --git a/packages/admin-ui/src/components/ErrorMessage.jsx b/packages/admin-ui/src/components/ErrorMessage.jsx new file mode 100644 index 0000000..09cb35d --- /dev/null +++ b/packages/admin-ui/src/components/ErrorMessage.jsx @@ -0,0 +1,18 @@ +import classnames from 'classnames' +import React from 'react' +import ErrorIcon from '../styling/icons/warning-icon/tomato.svg?react' + +import { Info3 } from './typography' + +const ErrorMessage = ({ className, children }) => { + return ( +
+ + + {children} + +
+ ) +} + +export default ErrorMessage diff --git a/packages/admin-ui/src/components/ImagePopper.jsx b/packages/admin-ui/src/components/ImagePopper.jsx new file mode 100644 index 0000000..b243920 --- /dev/null +++ b/packages/admin-ui/src/components/ImagePopper.jsx @@ -0,0 +1,56 @@ +import ClickAwayListener from '@mui/material/ClickAwayListener' +import classnames from 'classnames' +import React, { memo, useState } from 'react' +import Popper from './Popper' +import ZoomIconInverse from '../styling/icons/circle buttons/search/white.svg?react' +import ZoomIcon from '../styling/icons/circle buttons/search/zodiac.svg?react' + +import { FeatureButton } from './buttons' + +const ImagePopper = memo( + ({ className, width, height, popupWidth, popupHeight, src }) => { + const [popperAnchorEl, setPopperAnchorEl] = useState(null) + + const handleOpenPopper = event => { + setPopperAnchorEl(popperAnchorEl ? null : event.currentTarget) + } + + const handleClosePopper = () => { + setPopperAnchorEl(null) + } + + const popperOpen = Boolean(popperAnchorEl) + + const Image = ({ className, style }) => ( + + ) + + return ( + +
+ + + +
+ +
+
+
+
+ ) + }, +) + +export default ImagePopper diff --git a/packages/admin-ui/src/components/InformativeDialog.jsx b/packages/admin-ui/src/components/InformativeDialog.jsx new file mode 100644 index 0000000..09a1be8 --- /dev/null +++ b/packages/admin-ui/src/components/InformativeDialog.jsx @@ -0,0 +1,39 @@ +import Dialog from '@mui/material/Dialog' +import DialogContent from '@mui/material/DialogContent' +import SvgIcon from '@mui/material/SvgIcon' +import IconButton from '@mui/material/IconButton' +import React, { memo } from 'react' +import { H1 } from './typography' +import CloseIcon from '../styling/icons/action/close/zodiac.svg?react' + +export const InformativeDialog = memo( + ({ title = '', open, onDissmised, data, ...props }) => { + const innerOnClose = () => { + onDissmised() + } + + return ( + +
+ + + + + + +
+

{title}

+ {data} +
+ ) + }, +) diff --git a/packages/admin-ui/src/components/LogsDownloaderPopper.jsx b/packages/admin-ui/src/components/LogsDownloaderPopper.jsx new file mode 100644 index 0000000..87ce953 --- /dev/null +++ b/packages/admin-ui/src/components/LogsDownloaderPopper.jsx @@ -0,0 +1,235 @@ +import { useLazyQuery } from '@apollo/client' +import ClickAwayListener from '@mui/material/ClickAwayListener' +import classnames from 'classnames' +import { format, set } from 'date-fns/fp' +import FileSaver from 'file-saver' +import * as R from 'ramda' +import React, { useState, useCallback } from 'react' +import Arrow from '../styling/icons/arrow/download_logs.svg?react' +import DownloadInverseIcon from '../styling/icons/button/download/white.svg?react' +import Download from '../styling/icons/button/download/zodiac.svg?react' + +import { FeatureButton, Link } from './buttons' +import { formatDate } from '../utils/timezones' + +import Popper from './Popper' +import DateRangePicker from './date-range-picker/DateRangePicker' +import { RadioGroup } from './inputs' +import { H4, Info1, Label1, Label2 } from './typography/index.jsx' + +const DateContainer = ({ date, children }) => { + return ( +
+ {children} + {date && ( + <> +
+ + {format('d', date)} + +
+ {`${format( + 'MMM', + date, + )} ${format('yyyy', date)}`} + + {format('EEEE', date)} + +
+
+ + )} +
+ ) +} + +const ALL = 'all' +const RANGE = 'range' +const ADVANCED = 'advanced' +const SIMPLIFIED = 'simplified' + +const LogsDownloaderPopover = ({ + name, + query, + args, + title, + getLogs, + timezone, + simplified, + className, +}) => { + const [selectedRadio, setSelectedRadio] = useState(ALL) + const [selectedAdvancedRadio, setSelectedAdvancedRadio] = useState(ADVANCED) + + const [range, setRange] = useState({ from: null, until: null }) + const [anchorEl, setAnchorEl] = useState(null) + const [fetchLogs] = useLazyQuery(query, { + onCompleted: data => createLogsFile(getLogs(data), range), + }) + + const dateRangePickerClasses = { + 'block h-full': selectedRadio === RANGE, + hidden: selectedRadio === ALL, + } + + const handleRadioButtons = evt => { + const selectedRadio = R.path(['target', 'value'])(evt) + setSelectedRadio(selectedRadio) + if (selectedRadio === ALL) setRange({ from: null, until: null }) + } + + const handleAdvancedRadioButtons = evt => { + const selectedAdvancedRadio = R.path(['target', 'value'])(evt) + setSelectedAdvancedRadio(selectedAdvancedRadio) + } + + const handleRangeChange = useCallback( + (from, until) => { + setRange({ from, until }) + }, + [setRange], + ) + + const downloadLogs = (range, args) => { + if (selectedRadio === ALL) { + fetchLogs({ + variables: { + ...args, + simplified: selectedAdvancedRadio === SIMPLIFIED, + excludeTestingCustomers: true, + }, + }) + } + + if (!range || !range.from) return + if (range.from && !range.until) range.until = new Date() + + if (selectedRadio === RANGE) { + fetchLogs({ + variables: { + ...args, + from: range.from, + until: range.until, + simplified: selectedAdvancedRadio === SIMPLIFIED, + excludeTestingCustomers: true, + }, + }) + } + } + + const createLogsFile = (logs, range) => { + const formatDateFile = date => { + return formatDate(date, timezone, 'yyyy-MM-dd_HH-mm') + } + + const blob = new window.Blob([logs], { + type: 'text/plain;charset=utf-8', + }) + + FileSaver.saveAs( + blob, + selectedRadio === ALL + ? `${formatDateFile(new Date())}_${name}.csv` + : `${formatDateFile(range.from)}_${formatDateFile( + range.until, + )}_${name}.csv`, + ) + } + + const handleOpenRangePicker = event => { + setAnchorEl(anchorEl ? null : event.currentTarget) + } + + const handleClickAway = () => { + setAnchorEl(null) + } + + const radioButtonOptions = [ + { display: 'All logs', code: ALL }, + { display: 'Date range', code: RANGE }, + ] + + const advancedRadioButtonOptions = [ + { display: 'Advanced logs', code: ADVANCED }, + { display: 'Simplified logs', code: SIMPLIFIED }, + ] + + const open = Boolean(anchorEl) + const id = open ? 'date-range-popover' : undefined + + return ( + +
+ + +
+

+ {title} +

+
+ +
+ {selectedRadio === RANGE && ( +
+
+ {range && ( + <> + From +
+ +
+ To + + )} +
+ +
+ )} + {simplified && ( +
+ +
+ )} +
+ downloadLogs(range, args)}> + Download + +
+
+
+
+
+ ) +} + +export default LogsDownloaderPopover diff --git a/packages/admin-ui/src/components/Modal.jsx b/packages/admin-ui/src/components/Modal.jsx new file mode 100644 index 0000000..67278d9 --- /dev/null +++ b/packages/admin-ui/src/components/Modal.jsx @@ -0,0 +1,96 @@ +import MaterialModal from '@mui/material/Modal' +import IconButton from '@mui/material/IconButton' +import SvgIcon from '@mui/material/SvgIcon' +import Paper from '@mui/material/Paper' +import classnames from 'classnames' +import React from 'react' +import { H1, H4 } from './typography' +import CloseIcon from '../styling/icons/action/close/zodiac.svg?react' + +const Modal = ({ + width, + height, + minHeight = 400, + infoPanelHeight, + title, + small, + xl, + infoPanel, + handleClose, + children, + className, + closeOnEscape, + closeOnBackdropClick, + ...props +}) => { + const TitleCase = small ? H4 : H1 + + const innerClose = (evt, reason) => { + if (!closeOnBackdropClick && reason === 'backdropClick') return + if (!closeOnEscape && reason === 'escapeKeyDown') return + handleClose() + } + + const marginBySize = xl ? 0 : small ? 12 : 16 + const paddingBySize = xl ? 88 : small ? 16 : 32 + return ( + + <> + +
+ {title && ( + + {title} + + )} +
+ handleClose()}> + + + + +
+
+
+ {children} +
+
+ {infoPanel && ( + +
+ {infoPanel} +
+
+ )} + +
+ ) +} + +export default Modal diff --git a/packages/admin-ui/src/components/NotificationCenter/NotificationCenter.jsx b/packages/admin-ui/src/components/NotificationCenter/NotificationCenter.jsx new file mode 100644 index 0000000..a7b751c --- /dev/null +++ b/packages/admin-ui/src/components/NotificationCenter/NotificationCenter.jsx @@ -0,0 +1,160 @@ +import { useQuery, useMutation, gql } from '@apollo/client' +import * as R from 'ramda' +import React, { useState, useEffect } from 'react' +import ActionButton from '../buttons/ActionButton' +import { H5 } from '../typography' +import NotificationIconZodiac from '../../styling/icons/menu/notification-zodiac.svg?react' +import ClearAllIconInverse from '../../styling/icons/stage/spring/empty.svg?react' +import ClearAllIcon from '../../styling/icons/stage/zodiac/empty.svg?react' +import ShowUnreadIcon from '../../styling/icons/stage/zodiac/full.svg?react' + +import NotificationRow from './NotificationRow' +import classes from './NotificationCenter.module.css' + +const GET_NOTIFICATIONS = gql` + query getNotifications { + notifications { + id + type + detail + message + created + read + valid + } + hasUnreadNotifications + machines { + deviceId + name + } + } +` + +const TOGGLE_CLEAR_NOTIFICATION = gql` + mutation toggleClearNotification($id: ID!, $read: Boolean!) { + toggleClearNotification(id: $id, read: $read) { + id + read + } + } +` + +const CLEAR_ALL_NOTIFICATIONS = gql` + mutation clearAllNotifications { + clearAllNotifications { + id + } + } +` + +const NotificationCenter = ({ + close, + hasUnreadProp, + buttonCoords, + popperRef, + refetchHasUnreadHeader, +}) => { + const { data, loading } = useQuery(GET_NOTIFICATIONS, { + pollInterval: 60000, + }) + const [xOffset, setXoffset] = useState(300) + + const [showingUnread, setShowingUnread] = useState(false) + const machines = R.compose( + R.map(R.prop('name')), + R.indexBy(R.prop('deviceId')), + )(R.path(['machines'])(data) ?? []) + const notifications = R.path(['notifications'])(data) ?? [] + const [hasUnread, setHasUnread] = useState(hasUnreadProp) + + const [toggleClearNotification] = useMutation(TOGGLE_CLEAR_NOTIFICATION, { + onError: () => console.error('Error while clearing notification'), + refetchQueries: () => ['getNotifications'], + }) + const [clearAllNotifications] = useMutation(CLEAR_ALL_NOTIFICATIONS, { + onError: () => console.error('Error while clearing all notifications'), + refetchQueries: () => ['getNotifications'], + }) + + useEffect(() => { + setXoffset(popperRef.current.getBoundingClientRect().x) + if (data && data.hasUnreadNotifications !== hasUnread) { + refetchHasUnreadHeader() + setHasUnread(!hasUnread) + } + }, [popperRef, data, hasUnread, refetchHasUnreadHeader]) + + const buildNotifications = () => { + const notificationsToShow = + !showingUnread || !hasUnread + ? notifications + : R.filter(R.propEq(false, 'read'))(notifications) + return notificationsToShow.map(n => { + return ( + + toggleClearNotification({ + variables: { id: n.id, read: !n.read }, + }) + } + /> + ) + }) + } + + return ( + <> +
+
+
Notifications
+ +
+
+ {hasUnread && ( + setShowingUnread(!showingUnread)}> + {showingUnread ? 'Show all' : 'Show unread'} + + )} + {hasUnread && ( + + Mark all as read + + )} +
+
+ {!loading && buildNotifications()} +
+
+ + ) +} + +export default NotificationCenter diff --git a/packages/admin-ui/src/components/NotificationCenter/NotificationCenter.module.css b/packages/admin-ui/src/components/NotificationCenter/NotificationCenter.module.css new file mode 100644 index 0000000..b10a914 --- /dev/null +++ b/packages/admin-ui/src/components/NotificationCenter/NotificationCenter.module.css @@ -0,0 +1,147 @@ +.container { + width: 40vw; + height: 110vh; + right: 0; + background-color: white; + box-shadow: 0 0 14px 0 rgba(0, 0, 0, 0.24); +} + +@media only screen and (max-width: 1920px) { + .container { + width: 30vw; + } +} + +.header { + display: flex; + justify-content: space-between; +} + +.headerText { + margin-top: 20px; + margin-left: 12px; +} + +.actionButtons { + display: flex; + margin-left: 16px; + height: 0; +} + +.notificationIcon { + position: absolute; + cursor: pointer; + background: transparent; + box-shadow: 0 0 0 transparent; + border: 0 solid transparent; + text-shadow: 0 0 0 transparent; + outline: none; +} + +.clearAllButton { + margin-top: -16px; + margin-left: 8px; + background-color: var(--zircon); +} + +.notificationsList { + height: 90vh; + max-height: 100vh; + margin-top: 24px; + margin-left: 0; + overflow-y: auto; + overflow-x: hidden; + background-color: white; + z-index: 10; +} + +.notificationRow { + display: flex; + flex-direction: row; + justify-content: flex-start; + position: relative; + margin-bottom: 16px; + padding-top: 12px; + gap: 10px; +} + +.notificationRow > *:first-child { + margin-right: 24px; +} + +.notificationContent { + display: flex; + flex-direction: column; + justify-content: center; + width: 300px; +} + +.unread { + background-color: var(--spring3); +} + +.notificationRowIcon { + align-self: center; +} + +.notificationRowIcon > * { + margin-left: 24px; +} + +.readIconWrapper { + flex-grow: 1; +} + +.unreadIcon { + margin-top: 5px; + margin-left: 8px; + width: 12px; + height: 12px; + background-color: var(--spring); + border-radius: 50%; + cursor: pointer; + z-index: 1; +} + +.readIcon { + margin-left: 8px; + margin-top: 5px; + width: 12px; + height: 12px; + border: 1px solid var(--comet); + border-radius: 50%; + cursor: pointer; + z-index: 1; +} + +.notificationTitle { + margin: 0; + color: var(--comet); +} + +.notificationBody { + margin: 0; +} + +.notificationSubtitle { + margin: 0; + margin-bottom: 8px; + color: var(--comet); +} + +.stripes { + position: absolute; + height: 100%; + top: 0; + opacity: 60%; +} + +.hasUnread { + position: absolute; + top: 0; + left: 16px; + width: 9px; + height: 9px; + background-color: var(--spring); + border-radius: 50%; +} diff --git a/packages/admin-ui/src/components/NotificationCenter/NotificationRow.jsx b/packages/admin-ui/src/components/NotificationCenter/NotificationRow.jsx new file mode 100644 index 0000000..ceb4652 --- /dev/null +++ b/packages/admin-ui/src/components/NotificationCenter/NotificationRow.jsx @@ -0,0 +1,91 @@ +import classnames from 'classnames' +import prettyMs from 'pretty-ms' +import * as R from 'ramda' +import React from 'react' +import { Label1, Label2, TL2 } from '../typography' +import Wrench from '../../styling/icons/action/wrench/zodiac.svg?react' +import Transaction from '../../styling/icons/arrow/transaction.svg?react' +import WarningIcon from '../../styling/icons/warning-icon/tomato.svg?react' + +import classes from './NotificationCenter.module.css' + +const types = { + transaction: { + display: 'Transactions', + icon: , + }, + highValueTransaction: { + display: 'Transactions', + icon: , + }, + fiatBalance: { + display: 'Maintenance', + icon: , + }, + cryptoBalance: { + display: 'Maintenance', + icon: , + }, + compliance: { + display: 'Compliance', + icon: , + }, + error: { display: 'Error', icon: }, +} + +const NotificationRow = ({ + id, + type, + message, + deviceName, + created, + read, + valid, + toggleClear, +}) => { + const typeDisplay = R.path([type, 'display'])(types) ?? null + const icon = R.path([type, 'icon'])(types) ?? ( + + ) + const age = prettyMs(new Date().getTime() - new Date(created).getTime(), { + compact: true, + verbose: true, + }) + const notificationTitle = + typeDisplay && deviceName + ? `${typeDisplay} - ${deviceName}` + : !typeDisplay && deviceName + ? `${deviceName}` + : `${typeDisplay}` + + const iconClass = { + [classes.readIcon]: read, + [classes.unreadIcon]: !read, + } + return ( +
+
+
{icon}
+
+
+ + {notificationTitle} + + {message} + {age} +
+
+
toggleClear(id)} + className={classnames(iconClass)} + /> +
+
+ ) +} + +export default NotificationRow diff --git a/packages/admin-ui/src/components/NotificationCenter/index.js b/packages/admin-ui/src/components/NotificationCenter/index.js new file mode 100644 index 0000000..fd2be25 --- /dev/null +++ b/packages/admin-ui/src/components/NotificationCenter/index.js @@ -0,0 +1,3 @@ +import NotificationCenter from './NotificationCenter' + +export default NotificationCenter diff --git a/packages/admin-ui/src/components/Popper.jsx b/packages/admin-ui/src/components/Popper.jsx new file mode 100644 index 0000000..5726b07 --- /dev/null +++ b/packages/admin-ui/src/components/Popper.jsx @@ -0,0 +1,77 @@ +import MaterialPopper from '@mui/material/Popper' +import Paper from '@mui/material/Paper' +import classnames from 'classnames' +import * as R from 'ramda' +import React, { useState } from 'react' + +import { white } from '../styling/variables' +import classes from './Popper.module.css' + +const Popover = ({ children, bgColor = white, className, ...props }) => { + const [arrowRef, setArrowRef] = useState(null) + + const flipPlacements = { + top: ['bottom'], + bottom: ['top'], + left: ['right'], + right: ['left'], + } + + const modifiers = [ + { + name: 'flip', + enabled: R.defaultTo(false, props.flip), + options: { + allowedAutoPlacements: flipPlacements[props.placement], + }, + }, + { + name: 'preventOverflow', + enabled: true, + options: { + rootBoundary: 'scrollParent', + }, + }, + { + name: 'offset', + enabled: true, + options: { + offset: [0, 10], + }, + }, + { + name: 'arrow', + enabled: R.defaultTo(true, props.showArrow), + options: { + element: arrowRef, + }, + }, + { + name: 'computeStyles', + options: { + gpuAcceleration: false, + }, + }, + ] + + return ( + <> + + + + {children} + + + + ) +} + +export default Popover diff --git a/packages/admin-ui/src/components/Popper.module.css b/packages/admin-ui/src/components/Popper.module.css new file mode 100644 index 0000000..1beb7c5 --- /dev/null +++ b/packages/admin-ui/src/components/Popper.module.css @@ -0,0 +1,33 @@ +.newArrow, +.newArrow::before { + position: absolute; + width: 8px; + height: 8px; + background: inherit; +} + +.newArrow { + visibility: hidden; +} + +.newArrow::before { + visibility: visible; + content: ''; + transform: rotate(45deg); +} + +.tooltip[data-popper-placement^='top'] > div > span { + bottom: -4px; +} + +.tooltip[data-popper-placement^='bottom'] > div > span { + top: -4px; +} + +.tooltip[data-popper-placement^='left'] > div > span { + right: -4px; +} + +.tooltip[data-popper-placement^='right'] > div > span { + left: -4px; +} diff --git a/packages/admin-ui/src/components/PromptWhenDirty.jsx b/packages/admin-ui/src/components/PromptWhenDirty.jsx new file mode 100644 index 0000000..16fc2cb --- /dev/null +++ b/packages/admin-ui/src/components/PromptWhenDirty.jsx @@ -0,0 +1,19 @@ +import { useFormikContext } from 'formik' +import React, { useEffect } from 'react' + +import useDirtyHandler from '../routing/dirtyHandler.js' + +const PromptWhenDirty = () => { + const setIsDirty = useDirtyHandler(state => state.setIsDirty) + const formik = useFormikContext() + + const hasChanges = formik.dirty && formik.submitCount === 0 + + useEffect(() => { + setIsDirty(hasChanges) + }, [hasChanges]) + + return <> +} + +export default PromptWhenDirty diff --git a/packages/admin-ui/src/components/SearchBox.jsx b/packages/admin-ui/src/components/SearchBox.jsx new file mode 100644 index 0000000..7760111 --- /dev/null +++ b/packages/admin-ui/src/components/SearchBox.jsx @@ -0,0 +1,83 @@ +import InputBase from '@mui/material/InputBase' +import Paper from '@mui/material/Paper' +import MAutocomplete from '@mui/material/Autocomplete' +import classnames from 'classnames' +import React, { memo, useState } from 'react' +import { P } from './typography' +import SearchIcon from '../styling/icons/circle buttons/search/zodiac.svg?react' + +const SearchBox = memo( + ({ + loading = false, + filters = [], + options = [], + inputPlaceholder = '', + onChange, + ...props + }) => { + const [popupOpen, setPopupOpen] = useState(false) + + const inputClasses = { + 'flex flex-1 h-8 px-2 py-2 font-md items-center rounded-2xl bg-zircon text-comet': true, + 'rounded-b-none': popupOpen, + } + + const innerOnChange = filters => onChange(filters) + + return ( + it.label || it.value} + renderOption={(props, it) => ( +
  • +
    +

    + {it.label || it.value} +

    +

    {it.type}

    +
    +
  • + )} + autoHighlight + disableClearable + clearOnEscape + multiple + filterSelectedOptions + isOptionEqualToValue={(option, value) => option.type === value.type} + renderInput={params => { + return ( + } + placeholder={inputPlaceholder} + inputProps={{ + className: 'font-bold', + ...params.inputProps, + }} + /> + ) + }} + onOpen={() => setPopupOpen(true)} + onClose={() => setPopupOpen(false)} + onChange={(_, filters) => innerOnChange(filters)} + {...props} + slots={{ + paper: ({ children }) => ( + +
    + {children} + + ), + }} + /> + ) + }, +) + +export default SearchBox diff --git a/packages/admin-ui/src/components/SearchFilter.jsx b/packages/admin-ui/src/components/SearchFilter.jsx new file mode 100644 index 0000000..bfb3b18 --- /dev/null +++ b/packages/admin-ui/src/components/SearchFilter.jsx @@ -0,0 +1,53 @@ +import Chip from '@mui/material/Chip' +import React from 'react' +import { P, Label3 } from './typography' +import CloseIcon from '../styling/icons/action/close/zodiac.svg?react' +import FilterIcon from '../styling/icons/button/filter/white.svg?react' +import ReverseFilterIcon from '../styling/icons/button/filter/zodiac.svg?react' + +import { ActionButton } from './buttons' +import { onlyFirstToUpper, singularOrPlural } from '../utils/string' + +const SearchFilter = ({ + filters, + onFilterDelete, + deleteAllFilters, + entries = 0, +}) => { + return ( + <> +

    {'Filters:'}

    +
    +
    + {filters.map((f, idx) => ( + onFilterDelete(f)} + deleteIcon={} + /> + ))} +
    +
    + { + {`${entries} ${singularOrPlural( + entries, + `entry`, + `entries`, + )}`} + } + + Delete filters + +
    +
    + + ) +} + +export default SearchFilter diff --git a/packages/admin-ui/src/components/Status.jsx b/packages/admin-ui/src/components/Status.jsx new file mode 100644 index 0000000..710cffd --- /dev/null +++ b/packages/admin-ui/src/components/Status.jsx @@ -0,0 +1,23 @@ +import Chip from '@mui/material/Chip' +import React from 'react' + +const Status = ({ status }) => { + return +} + +const MainStatus = ({ statuses }) => { + const mainStatus = + statuses.find(s => s.type === 'error') || + statuses.find(s => s.type === 'warning') || + statuses[0] + const plus = { label: `+${statuses.length - 1}`, type: mainStatus.type } + + return ( +
    + + {statuses.length > 1 && } +
    + ) +} + +export { Status, MainStatus } diff --git a/packages/admin-ui/src/components/Stepper.jsx b/packages/admin-ui/src/components/Stepper.jsx new file mode 100644 index 0000000..1e67d21 --- /dev/null +++ b/packages/admin-ui/src/components/Stepper.jsx @@ -0,0 +1,61 @@ +import classnames from 'classnames' +import * as R from 'ramda' +import React, { memo } from 'react' +import CompleteStageIconSpring from '../styling/icons/stage/spring/complete.svg?react' +import CurrentStageIconSpring from '../styling/icons/stage/spring/current.svg?react' +import EmptyStageIconSpring from '../styling/icons/stage/spring/empty.svg?react' +import CompleteStageIconZodiac from '../styling/icons/stage/zodiac/complete.svg?react' +import CurrentStageIconZodiac from '../styling/icons/stage/zodiac/current.svg?react' +import EmptyStageIconZodiac from '../styling/icons/stage/zodiac/empty.svg?react' + +import classes from './Stepper.module.css' + +const Stepper = memo(({ steps, currentStep, color = 'spring', className }) => { + if (currentStep < 1 || currentStep > steps) + throw Error('Value of currentStage is invalid') + if (steps < 1) throw Error('Value of stages is invalid') + + const separatorClasses = { + 'w-7 h-[2px] border-2 z-1': true, + 'border-spring': color === 'spring', + 'border-zodiac': color === 'zodiac', + } + + const separatorEmptyClasses = { + 'w-7 h-[2px] border-2 z-1': true, + 'border-dust': color === 'spring', + 'border-comet': color === 'zodiac', + } + + return ( +
    + {R.range(1, currentStep).map(idx => ( +
    + {idx > 1 &&
    } +
    + {color === 'spring' && } + {color === 'zodiac' && } +
    +
    + ))} +
    + {currentStep > 1 &&
    } +
    + {color === 'spring' && } + {color === 'zodiac' && } +
    +
    + {R.range(currentStep + 1, steps + 1).map(idx => ( +
    +
    +
    + {color === 'spring' && } + {color === 'zodiac' && } +
    +
    + ))} +
    + ) +}) + +export default Stepper diff --git a/packages/admin-ui/src/components/Stepper.module.css b/packages/admin-ui/src/components/Stepper.module.css new file mode 100644 index 0000000..9dccb96 --- /dev/null +++ b/packages/admin-ui/src/components/Stepper.module.css @@ -0,0 +1,12 @@ +.stage { + display: flex; + height: 28px; + width: 28px; + z-index: 2; +} + +.stage > svg { + height: 100%; + width: 100%; + overflow: visible; +} diff --git a/packages/admin-ui/src/components/Subtitle.jsx b/packages/admin-ui/src/components/Subtitle.jsx new file mode 100644 index 0000000..31f24fb --- /dev/null +++ b/packages/admin-ui/src/components/Subtitle.jsx @@ -0,0 +1,15 @@ +import classnames from 'classnames' +import React, { memo } from 'react' + +import { TL1 } from './typography' + +const Subtitle = memo(({ children, className, extraMarginTop }) => { + const classNames = { + 'text-comet my-4': true, + 'mt-18': extraMarginTop, + } + + return {children} +}) + +export default Subtitle diff --git a/packages/admin-ui/src/components/TableFilters.jsx b/packages/admin-ui/src/components/TableFilters.jsx new file mode 100644 index 0000000..697788a --- /dev/null +++ b/packages/admin-ui/src/components/TableFilters.jsx @@ -0,0 +1,118 @@ +import React, { useState, useEffect } from 'react' +import { + Autocomplete, + TextField, + Select, + MenuItem, + FormControl, +} from '@mui/material' +import { AsyncAutocomplete } from './inputs/base/AsyncAutocomplete.jsx' + +export const SelectFilter = ({ column, options = [] }) => { + const columnFilterValue = column.getFilterValue() + + return ( + + + + ) +} + +export const AutocompleteFilter = ({ + column, + options = [], + placeholder = 'Filter...', + renderOption, + getOptionLabel = option => option.label || '', +}) => { + const columnFilterValue = column.getFilterValue() + const selectedOption = + options.find(option => option.value === columnFilterValue) || null + + return ( + { + column.setFilterValue(newValue?.value || '') + }} + getOptionLabel={getOptionLabel} + isOptionEqualToValue={(option, value) => option?.value === value?.value} + renderOption={renderOption} + renderInput={params => ( + + )} + size="small" + fullWidth + slotProps={{ + listbox: { + style: { maxHeight: 200 }, + }, + popper: { + style: { width: 'auto' }, + }, + }} + /> + ) +} + +export const TextFilter = ({ column, placeholder = 'Filter...' }) => { + const columnFilterValue = column.getFilterValue() + + return ( + { + column.setFilterValue(event.target.value || undefined) + }} + placeholder={placeholder} + variant="standard" + size="small" + fullWidth + /> + ) +} + +export const AsyncAutocompleteFilter = ({ column, ...props }) => { + const [selectedOption, setSelectedOption] = useState(null) + const columnFilterValue = column.getFilterValue() + const getOptionId = props.getOptionId || (option => option.id) + + useEffect(() => { + if (!columnFilterValue) { + setSelectedOption(null) + } + }, [columnFilterValue]) + + const handleChange = (event, newValue) => { + column.setFilterValue(newValue ? getOptionId(newValue) : '') + setSelectedOption(newValue) + } + + return ( + + ) +} diff --git a/packages/admin-ui/src/components/Title.jsx b/packages/admin-ui/src/components/Title.jsx new file mode 100644 index 0000000..25c68b2 --- /dev/null +++ b/packages/admin-ui/src/components/Title.jsx @@ -0,0 +1,9 @@ +import React, { memo } from 'react' + +import { H1 } from './typography' + +const Title = memo(({ children }) => { + return

    {children}

    +}) + +export default Title diff --git a/packages/admin-ui/src/components/Tooltip.jsx b/packages/admin-ui/src/components/Tooltip.jsx new file mode 100644 index 0000000..feb85b9 --- /dev/null +++ b/packages/admin-ui/src/components/Tooltip.jsx @@ -0,0 +1,97 @@ +import ClickAwayListener from '@mui/material/ClickAwayListener' +import * as R from 'ramda' +import React, { useState, memo } from 'react' +import Popper from './Popper' +import HelpIcon from '../styling/icons/action/help/zodiac.svg?react' + +const usePopperHandler = () => { + const [helpPopperAnchorEl, setHelpPopperAnchorEl] = useState(null) + + const handleOpenHelpPopper = event => { + setHelpPopperAnchorEl(helpPopperAnchorEl ? null : event.currentTarget) + } + + const openHelpPopper = event => { + setHelpPopperAnchorEl(event.currentTarget) + } + + const handleCloseHelpPopper = () => { + setHelpPopperAnchorEl(null) + } + + const helpPopperOpen = Boolean(helpPopperAnchorEl) + + return { + helpPopperAnchorEl, + helpPopperOpen, + handleOpenHelpPopper, + openHelpPopper, + handleCloseHelpPopper, + } +} + +const HelpTooltip = memo(({ children, width }) => { + const handler = usePopperHandler(width) + + return ( + +
    + {handler.helpPopperOpen && ( +
    + )} + + +
    + {children} +
    +
    +
    +
    + ) +}) + +const HoverableTooltip = memo(({ parentElements, children, width }) => { + const handler = usePopperHandler(width) + + return ( + +
    + {!R.isNil(parentElements) && ( +
    + {parentElements} +
    + )} + {R.isNil(parentElements) && ( + + )} + +
    + {children} +
    +
    +
    +
    + ) +}) + +export { HoverableTooltip, HelpTooltip } diff --git a/packages/admin-ui/src/components/booleanPropertiesTable/BooleanPropertiesTable.jsx b/packages/admin-ui/src/components/booleanPropertiesTable/BooleanPropertiesTable.jsx new file mode 100644 index 0000000..82b2da7 --- /dev/null +++ b/packages/admin-ui/src/components/booleanPropertiesTable/BooleanPropertiesTable.jsx @@ -0,0 +1,123 @@ +import IconButton from '@mui/material/IconButton' +import { useFormikContext, Form, Formik, Field as FormikField } from 'formik' +import * as R from 'ramda' +import React, { useState, memo } from 'react' +import PromptWhenDirty from '../PromptWhenDirty' +import { H4 } from '../typography' +import EditIconDisabled from '../../styling/icons/action/edit/disabled.svg?react' +import EditIcon from '../../styling/icons/action/edit/enabled.svg?react' +import FalseIcon from '../../styling/icons/table/false.svg?react' +import TrueIcon from '../../styling/icons/table/true.svg?react' +import * as Yup from 'yup' + +import { Link } from '../buttons' +import { RadioGroup } from '../inputs/formik' +import { Table, TableBody, TableRow, TableCell } from '../table' +import SvgIcon from '@mui/material/SvgIcon' + +const BooleanCell = ({ name }) => { + const { values } = useFormikContext() + return values[name] === 'true' ? : +} + +const BooleanPropertiesTable = memo( + ({ title, disabled, data, elements, save, forcedEditing = false }) => { + const [editing, setEditing] = useState(forcedEditing) + + const initialValues = R.fromPairs( + elements.map(it => [it.name, data[it.name]?.toString() ?? 'false']), + ) + + const validationSchema = Yup.object().shape( + R.fromPairs( + elements.map(it => [ + it.name, + Yup.mixed().oneOf(['true', 'false', true, false]).required(), + ]), + ), + ) + + const innerSave = async values => { + const toBoolean = num => R.equals(num, 'true') + save(R.mapObjIndexed(toBoolean, R.filter(R.complement(R.isNil))(values))) + setEditing(false) + } + + const radioButtonOptions = [ + { display: 'Yes', code: 'true' }, + { display: 'No', code: 'false' }, + ] + return ( +
    + + {({ resetForm }) => { + return ( +
    +
    +

    {title}

    + {editing ? ( +
    + + Save + + { + resetForm() + setEditing(false) + }} + color="secondary"> + Cancel + +
    + ) : ( + setEditing(true)}> + + {disabled ? : } + + + )} +
    + + + + {elements.map((it, idx) => ( + + {it.display} + + {editing && ( + + )} + {!editing && } + + + ))} + +
    + + ) + }} +
    +
    + ) + }, +) + +export default BooleanPropertiesTable diff --git a/packages/admin-ui/src/components/booleanPropertiesTable/index.js b/packages/admin-ui/src/components/booleanPropertiesTable/index.js new file mode 100644 index 0000000..3112ae6 --- /dev/null +++ b/packages/admin-ui/src/components/booleanPropertiesTable/index.js @@ -0,0 +1,3 @@ +import BooleanPropertiesTable from './BooleanPropertiesTable' + +export { BooleanPropertiesTable } diff --git a/packages/admin-ui/src/components/buttons/ActionButton.jsx b/packages/admin-ui/src/components/buttons/ActionButton.jsx new file mode 100644 index 0000000..6c0ca25 --- /dev/null +++ b/packages/admin-ui/src/components/buttons/ActionButton.jsx @@ -0,0 +1,49 @@ +import classnames from 'classnames' +import React, { memo } from 'react' + +import moduleStyles from './ActionButton.module.css' + +const ActionButton = memo( + ({ + className, + altTextColor, + Icon, + InverseIcon, + color, + center, + children, + ...props + }) => { + const classNames = { + [moduleStyles.actionButton]: true, + [moduleStyles.altText]: altTextColor || color !== 'primary', + [moduleStyles.primary]: color === 'primary', + [moduleStyles.secondary]: color === 'secondary', + [moduleStyles.spring]: color === 'spring', + [moduleStyles.tomato]: color === 'tomato', + [moduleStyles.center]: center, + } + + return ( + + ) + }, +) + +export default ActionButton diff --git a/packages/admin-ui/src/components/buttons/ActionButton.module.css b/packages/admin-ui/src/components/buttons/ActionButton.module.css new file mode 100644 index 0000000..22f310b --- /dev/null +++ b/packages/admin-ui/src/components/buttons/ActionButton.module.css @@ -0,0 +1,145 @@ +.actionButton { + composes: p from '../typography/typography.module.css'; + cursor: pointer; + border: none; + height: 28px; + outline: 0; + border-radius: 6px; + padding: 0 8px; + display: flex; + align-items: center; +} + +.actionButton.altText { + color: white; +} + +.primary { + background-color: var(--zircon); +} + +.primary:hover { + background-color: var(--zircon2); +} + +.primary:active { + background-color: var(--comet); + color: white; +} + +.primary .actionButtonIconActive { + display: none; +} + +.primary:active .actionButtonIcon { + display: none; +} + +.primary:active .actionButtonIconActive { + display: flex; +} + +.secondary { + background-color: var(--comet); + color: white; +} + +.secondary:hover { + background-color: var(--comet2); +} + +.secondary:active { + background-color: var(--comet3); +} + +.secondary .actionButtonIcon { + display: none; +} + +.secondary .actionButtonIconActive { + display: flex; +} + +.secondary:active .actionButtonIcon { + display: flex; +} + +.secondary:active .actionButtonIconActive { + display: none; +} + +.spring { + background-color: var(--spring2); + color: white; +} + +.spring:hover { + background-color: var(--spring); +} + +.spring:active { + background-color: var(--spring4); +} + +.spring .actionButtonIcon { + display: none; +} + +.spring .actionButtonIconActive { + display: flex; +} + +.spring:active .actionButtonIcon { + display: flex; +} + +.spring:active .actionButtonIconActive { + display: none; +} + +.tomato { + background-color: var(--tomato); + color: white; +} + +.tomato:hover { + background-color: var(--tomato); +} + +.tomato:active { + background-color: var(--tomato); +} + +.tomato .actionButtonIcon { + display: none; +} + +.tomato .actionButtonIconActive { + display: flex; +} + +.tomato:active .actionButtonIcon { + display: flex; +} + +.tomato:active .actionButtonIconActive { + display: none; +} + +.actionButtonIcon { + display: flex; + padding-right: 7px; +} + +.actionButtonIcon svg { + width: 14px; + height: 14px; +} + +.center { + align-items: center; + justify-content: center; +} + +.actionButtonIconActive { +} diff --git a/packages/admin-ui/src/components/buttons/AddButton.jsx b/packages/admin-ui/src/components/buttons/AddButton.jsx new file mode 100644 index 0000000..e6cecdc --- /dev/null +++ b/packages/admin-ui/src/components/buttons/AddButton.jsx @@ -0,0 +1,16 @@ +import classnames from 'classnames' +import React, { memo } from 'react' +import AddIcon from '../../styling/icons/button/add/zodiac.svg?react' + +import classes from './AddButton.module.css' + +const SimpleButton = memo(({ className, children, ...props }) => { + return ( + + ) +}) + +export default SimpleButton diff --git a/packages/admin-ui/src/components/buttons/AddButton.module.css b/packages/admin-ui/src/components/buttons/AddButton.module.css new file mode 100644 index 0000000..a92609f --- /dev/null +++ b/packages/admin-ui/src/components/buttons/AddButton.module.css @@ -0,0 +1,30 @@ +.button { + composes: p from '../typography/typography.module.css'; + border: none; + background-color: var(--zircon); + cursor: pointer; + outline: 0; + display: flex; + justify-content: center; + align-items: center; + width: 167px; + height: 48px; + color: var(--zodiac); +} + +.button:hover { + background-color: var(--zircon2); +} + +.button:active { + background-color: var(--comet); + color: white; +} + +.button:active svg g * { + stroke: white; +} + +.button svg { + margin-right: 8px; +} diff --git a/packages/admin-ui/src/components/buttons/BaseButton.styles.js b/packages/admin-ui/src/components/buttons/BaseButton.styles.js new file mode 100644 index 0000000..e3cd451 --- /dev/null +++ b/packages/admin-ui/src/components/buttons/BaseButton.styles.js @@ -0,0 +1,70 @@ +import { + white, + fontColor, + subheaderColor, + subheaderDarkColor, + offColor, + offDarkColor, +} from '../../styling/variables' + +const colors = (color1, color2, color3) => { + return { + backgroundColor: color1, + '&:hover': { + backgroundColor: color2, + }, + '&:active': { + backgroundColor: color3, + }, + } +} + +const buttonHeight = 32 + +export default { + baseButton: { + extend: colors(subheaderColor, subheaderDarkColor, offColor), + cursor: 'pointer', + border: 'none', + outline: 0, + height: buttonHeight, + color: fontColor, + '&:active': { + color: white, + }, + }, + primary: { + extend: colors(subheaderColor, subheaderDarkColor, offColor), + '&:active': { + color: white, + '& $buttonIcon': { + display: 'none', + }, + '& $buttonIconActive': { + display: 'block', + }, + }, + '& $buttonIconActive': { + display: 'none', + }, + }, + secondary: { + extend: colors(offColor, offDarkColor, white), + color: white, + '&:active': { + color: fontColor, + '& $buttonIcon': { + display: 'flex', + }, + '& $buttonIconActive': { + display: 'none', + }, + }, + '& $buttonIcon': { + display: 'none', + }, + '& $buttonIconActive': { + display: 'flex', + }, + }, +} diff --git a/packages/admin-ui/src/components/buttons/Button.jsx b/packages/admin-ui/src/components/buttons/Button.jsx new file mode 100644 index 0000000..95342ac --- /dev/null +++ b/packages/admin-ui/src/components/buttons/Button.jsx @@ -0,0 +1,43 @@ +import classnames from 'classnames' +import React, { memo } from 'react' + +import moduleStyles from './Button.module.css' +import { spacer } from '../../styling/variables.js' + +const pickSize = size => { + switch (size) { + case 'xl': + return spacer * 7.625 + case 'sm': + return spacer * 4 + case 'lg': + default: + return spacer * 5 + } +} + +const ActionButton = memo( + ({ size = 'lg', children, className, buttonClassName, ...props }) => { + const height = pickSize(size) + + return ( +
    + +
    + ) + }, +) + +export default ActionButton diff --git a/packages/admin-ui/src/components/buttons/Button.module.css b/packages/admin-ui/src/components/buttons/Button.module.css new file mode 100644 index 0000000..c5c5c43 --- /dev/null +++ b/packages/admin-ui/src/components/buttons/Button.module.css @@ -0,0 +1,49 @@ +.button { + composes: h3 from '../typography/typography.module.css'; + border: none; + cursor: pointer; + outline: 0; + font-weight: 900; + background-color: var(--spring); + height: 40px; + padding: 0 20px; + border-radius: 10px; + box-shadow: 0 3px var(--spring4); +} + +.buttonXl { + composes: h1 from '../typography/typography.module.css'; + height: 61px; + border-radius: 15px; +} + +.buttonSm { + height: 32px; + padding: 0 16px; + border-radius: 8px; +} + +.button:disabled { + background-color: var(--dust); + box-shadow: none; +} + +.button:disabled:hover { + background-color: var(--dust); + box-shadow: none; +} + +.button:disabled:active { + margin-top: 0; +} + +.button:hover { + background-color: var(--spring2); + box-shadow: 0 3px var(--spring4); +} + +.button:active { + margin-top: 2px; + background-color: var(--spring2); + box-shadow: 0 2px var(--spring4); +} diff --git a/packages/admin-ui/src/components/buttons/FeatureButton.jsx b/packages/admin-ui/src/components/buttons/FeatureButton.jsx new file mode 100644 index 0000000..da65a2d --- /dev/null +++ b/packages/admin-ui/src/components/buttons/FeatureButton.jsx @@ -0,0 +1,37 @@ +import classnames from 'classnames' +import React, { memo } from 'react' + +import classes from './FeatureButton.module.css' + +const FeatureButton = memo( + ({ className, Icon, InverseIcon, children, ...props }) => { + return ( + + ) + }, +) + +export default FeatureButton diff --git a/packages/admin-ui/src/components/buttons/FeatureButton.module.css b/packages/admin-ui/src/components/buttons/FeatureButton.module.css new file mode 100644 index 0000000..1c3d7ba --- /dev/null +++ b/packages/admin-ui/src/components/buttons/FeatureButton.module.css @@ -0,0 +1,87 @@ +.baseButton { + cursor: pointer; + border: none; + outline: 0; + height: 32px; + color: var(--zodiac); +} + +.roundButton { + width: 32px; + border-radius: 16px; + display: flex; + padding: 0; +} + +.roundButton .buttonIcon { + margin: auto; +} + +.roundButton .buttonIcon svg { + width: 16px; + height: 16px; + overflow: visible; +} + +.roundButton .buttonIcon svg g { + stroke-width: 2px; +} + +.baseButton:active { + color: white; +} + +.primary { + background-color: var(--zircon); +} + +.primary:hover { + background-color: var(--zircon2); +} + +.primary:active { + background-color: var(--comet); + color: white; +} + +.primary .buttonIconActive { + display: none; +} + +.primary:active .buttonIcon { + display: none; +} + +.primary:active .buttonIconActive { + display: block; +} + +.secondary { + background-color: var(--comet); + color: white; +} + +.secondary:hover { + background-color: var(--comet2); +} + +.secondary:active { + background-color: white; + color: var(--zodiac); +} + +.secondary .buttonIcon { + display: none; +} + +.secondary .buttonIconActive { + display: flex; +} + +.secondary:active .buttonIcon { + display: flex; +} + +.secondary:active .buttonIconActive { + display: none; +} diff --git a/packages/admin-ui/src/components/buttons/IDButton.jsx b/packages/admin-ui/src/components/buttons/IDButton.jsx new file mode 100644 index 0000000..55f459c --- /dev/null +++ b/packages/admin-ui/src/components/buttons/IDButton.jsx @@ -0,0 +1,79 @@ +import ClickAwayListener from '@mui/material/ClickAwayListener' +import classnames from 'classnames' +import React, { useState, memo } from 'react' +import Popover from '../Popper' + +import classes from './IDButton.module.css' + +const IDButton = memo( + ({ + name, + className, + Icon, + InverseIcon, + children, + popoverClassname, + ...props + }) => { + const [anchorEl, setAnchorEl] = useState(null) + + const open = Boolean(anchorEl) + const id = open ? `simple-popper-${name}` : undefined + + const classNames = { + [classes.idButton]: true, + [classes.primary]: true, + [classes.open]: open, + [classes.closed]: !open, + } + + const iconClassNames = { + [classes.buttonIcon]: true, + } + + const handleClick = event => { + setAnchorEl(anchorEl ? null : event.currentTarget) + } + + const handleClose = () => { + setAnchorEl(null) + } + + return ( + <> + + + + +
    +
    {children}
    +
    +
    + + ) + }, +) + +export default IDButton diff --git a/packages/admin-ui/src/components/buttons/IDButton.module.css b/packages/admin-ui/src/components/buttons/IDButton.module.css new file mode 100644 index 0000000..109d588 --- /dev/null +++ b/packages/admin-ui/src/components/buttons/IDButton.module.css @@ -0,0 +1,58 @@ +.idButton { + width: 34px; + height: 28px; + display: flex; + border-radius: 4px; + padding: 0; + border: none; + cursor: pointer; +} + +.buttonIcon { + margin: auto; + line-height: 1px; +} + +.buttonIcon svg { + overflow: visible; +} + +.closed { + background-color: var(--zircon); +} + +.closed:hover { + background-color: var(--zircon2); +} + +.closed:active { + background-color: var(--comet); + color: white; +} + +.open { + background-color: var(--comet); + color: white; +} + +.open:hover { + background-color: var(--comet2); +} + +.open:active { + background-color: var(--comet3); +} + +.popoverContent { + composes: info2 from '../typography/typography.module.css'; + padding: 8px; + display: flex; + justify-content: center; + align-items: center; + border-radius: 4px; +} + +.popoverContent img { + height: 145px; + min-width: 200px; +} diff --git a/packages/admin-ui/src/components/buttons/Link.jsx b/packages/admin-ui/src/components/buttons/Link.jsx new file mode 100644 index 0000000..39a721d --- /dev/null +++ b/packages/admin-ui/src/components/buttons/Link.jsx @@ -0,0 +1,27 @@ +import classnames from 'classnames' +import React, { memo } from 'react' + +import classes from './Link.module.css' + +const Link = memo( + ({ submit, className, children, color = 'primary', ...props }) => { + const classNames = { + [classes.link]: true, + [classes.primary]: color === 'primary', + [classes.secondary]: color === 'secondary', + [classes.noColor]: color === 'noColor', + [classes.action]: color === 'action', + } + + return ( + + ) + }, +) + +export default Link diff --git a/packages/admin-ui/src/components/buttons/Link.module.css b/packages/admin-ui/src/components/buttons/Link.module.css new file mode 100644 index 0000000..ee8244f --- /dev/null +++ b/packages/admin-ui/src/components/buttons/Link.module.css @@ -0,0 +1,47 @@ +.link { + composes: h4 from '../typography/typography.module.css'; + text-decoration: none; + border: none; + background-color: transparent; + cursor: pointer; + padding: 0; + height: 100%; +} + +.primary { + box-shadow: inset 0 -4px 0 0 rgba(72, 246, 148, 0.8); +} + +.primary:hover { + box-shadow: none; + background-color: rgba(72, 246, 148, 0.8); +} + +.secondary { + box-shadow: inset 0 -4px 0 0 rgba(255, 88, 74, 0.8); +} + +.secondary:hover { + box-shadow: none; + background-color: rgba(255, 88, 74, 0.8); + color: white; +} + +.noColor { + box-shadow: inset 0 -4px 0 0 rgba(255, 255, 255, 0.8); +} + +.noColor:hover { + box-shadow: none; + background-color: rgba(255, 255, 255, 0.8); +} + +.action { + box-shadow: inset 0 -4px 0 0 rgba(72, 246, 148, 0.8); + color: var(--zircon); +} + +.action:hover { + box-shadow: none; + background-color: rgba(72, 246, 148, 0.8); +} diff --git a/packages/admin-ui/src/components/buttons/SubpageButton.jsx b/packages/admin-ui/src/components/buttons/SubpageButton.jsx new file mode 100644 index 0000000..73e38f4 --- /dev/null +++ b/packages/admin-ui/src/components/buttons/SubpageButton.jsx @@ -0,0 +1,62 @@ +import classnames from 'classnames' +import React, { memo, useState } from 'react' +import { H4 } from '../typography' +import CancelIconInverse from '../../styling/icons/button/cancel/white.svg?react' + +import classes from './SubpageButton.module.css' + +const SubpageButton = memo( + ({ + className, + Icon, + InverseIcon, + toggle, + forceDisable = false, + children, + }) => { + const [active, setActive] = useState(false) + const isActive = forceDisable ? false : active + const classNames = { + [classes.button]: true, + [classes.normal]: !isActive, + [classes.active]: isActive, + } + + const normalButton = + + const activeButton = ( + <> + +

    {children}

    + + + ) + + const innerToggle = () => { + forceDisable = false + const newActiveState = !isActive + toggle(newActiveState) + setActive(newActiveState) + } + + return ( + + ) + }, +) + +export default SubpageButton diff --git a/packages/admin-ui/src/components/buttons/SubpageButton.module.css b/packages/admin-ui/src/components/buttons/SubpageButton.module.css new file mode 100644 index 0000000..84babdb --- /dev/null +++ b/packages/admin-ui/src/components/buttons/SubpageButton.module.css @@ -0,0 +1,51 @@ +.button { + cursor: pointer; + border: none; + outline: 0; + height: 32px; + padding: 0; + color: white; + border-radius: 16px; + background-color: var(--zircon); +} + +.button:hover { + background-color: var(--zircon2); +} + +.normal { + width: 32px; +} + +.active { + display: flex; + flex-direction: row; + align-items: center; + background-color: var(--comet); + font-weight: bold; + padding: 0 5px; +} + +.active:hover { + background-color: var(--comet); +} + +.buttonIcon { + width: 16px; + height: 16px; + overflow: visible; +} + +.buttonIcon g { + stroke-width: 1.8px; +} + +.buttonIconActiveLeft { + margin-right: 12px; + margin-left: 4px; +} + +.buttonIconActiveRight { + margin-right: 5px; + margin-left: 20px; +} diff --git a/packages/admin-ui/src/components/buttons/SubpageButton.styles.js b/packages/admin-ui/src/components/buttons/SubpageButton.styles.js new file mode 100644 index 0000000..5f51454 --- /dev/null +++ b/packages/admin-ui/src/components/buttons/SubpageButton.styles.js @@ -0,0 +1,46 @@ +import baseButtonStyles from './BaseButton.styles' +import { offColor, white } from '../../styling/variables' + +const { baseButton } = baseButtonStyles + +export default { + button: { + extend: baseButton, + padding: 0, + color: white, + borderRadius: baseButton.height / 2, + }, + normalButton: { + width: baseButton.height, + }, + activeButton: { + display: 'flex', + flexDirection: 'row', + alignItems: 'center', + backgroundColor: offColor, + fontWeight: 'bold', + padding: '0 5px', + '&:hover': { + backgroundColor: offColor, + }, + }, + buttonIcon: { + width: 16, + height: 16, + overflow: 'visible', + '& g': { + strokeWidth: 1.8, + }, + }, + buttonIconActiveLeft: { + marginRight: 12, + marginLeft: 4, + }, + buttonIconActiveRight: { + marginRight: 5, + marginLeft: 20, + }, + white: { + color: white, + }, +} diff --git a/packages/admin-ui/src/components/buttons/SupportLinkButton.jsx b/packages/admin-ui/src/components/buttons/SupportLinkButton.jsx new file mode 100644 index 0000000..630868f --- /dev/null +++ b/packages/admin-ui/src/components/buttons/SupportLinkButton.jsx @@ -0,0 +1,25 @@ +import React from 'react' +import InverseLinkIcon from '../../styling/icons/action/external link/white.svg?react' +import LinkIcon from '../../styling/icons/action/external link/zodiac.svg?react' + +import { ActionButton } from './' + +const SupportLinkButton = ({ link, label }) => { + return ( +
    + + {label} + + + ) +} + +export default SupportLinkButton diff --git a/packages/admin-ui/src/components/buttons/index.js b/packages/admin-ui/src/components/buttons/index.js new file mode 100644 index 0000000..10cbe94 --- /dev/null +++ b/packages/admin-ui/src/components/buttons/index.js @@ -0,0 +1,19 @@ +import ActionButton from './ActionButton' +import AddButton from './AddButton' +import Button from './Button' +import FeatureButton from './FeatureButton' +import IDButton from './IDButton' +import Link from './Link' +import SubpageButton from './SubpageButton' +import SupportLinkButton from './SupportLinkButton' + +export { + Button, + Link, + ActionButton, + FeatureButton, + IDButton, + AddButton, + SupportLinkButton, + SubpageButton, +} diff --git a/packages/admin-ui/src/components/date-range-picker/Calendar.jsx b/packages/admin-ui/src/components/date-range-picker/Calendar.jsx new file mode 100644 index 0000000..7499670 --- /dev/null +++ b/packages/admin-ui/src/components/date-range-picker/Calendar.jsx @@ -0,0 +1,138 @@ +import { + add, + differenceInMonths, + format, + getDay, + getDaysInMonth, + isAfter, + isSameDay, + isSameMonth, + lastDayOfMonth, + startOfMonth, + startOfWeek, + sub, +} from 'date-fns/fp' +import * as R from 'ramda' +import React, { useState } from 'react' +import Arrow from '../../styling/icons/arrow/month_change.svg?react' +import RightArrow from '../../styling/icons/arrow/month_change_right.svg?react' + +import Tile from './Tile' +import classes from './Calendar.module.css' + +const Calendar = ({ minDate, maxDate, handleSelect, ...props }) => { + const [currentDisplayedMonth, setCurrentDisplayedMonth] = useState(new Date()) + + const weekdays = Array.from(Array(7)).map((_, i) => + format('EEEEE', add({ days: i }, startOfWeek(new Date()))), + ) + + const monthLength = month => getDaysInMonth(month) + + const monthdays = month => { + const lastMonth = sub({ months: 1 }, month) + const lastMonthRange = R.range(0, getDay(startOfMonth(month))).reverse() + const lastMonthDays = R.map(i => + sub({ days: i }, lastDayOfMonth(lastMonth)), + )(lastMonthRange) + + const thisMonthRange = R.range(0, monthLength(month)) + const thisMonthDays = R.map(i => add({ days: i }, startOfMonth(month)))( + thisMonthRange, + ) + + const nextMonth = add({ months: 1 }, month) + const nextMonthRange = R.range( + 0, + 42 - lastMonthDays.length - thisMonthDays.length, + ) + const nextMonthDays = R.map(i => add({ days: i }, startOfMonth(nextMonth)))( + nextMonthRange, + ) + + return R.concat(R.concat(lastMonthDays, thisMonthDays), nextMonthDays) + } + + const getRow = (month, row) => monthdays(month).slice(row * 7 - 7, row * 7) + + const handleNavPrev = currentMonth => { + const prevMonth = sub({ months: 1 }, currentMonth) + if (!minDate) setCurrentDisplayedMonth(prevMonth) + else { + setCurrentDisplayedMonth( + isSameMonth(minDate, prevMonth) || + differenceInMonths(minDate, prevMonth) > 0 + ? prevMonth + : currentDisplayedMonth, + ) + } + } + const handleNavNext = currentMonth => { + const nextMonth = add({ months: 1 }, currentMonth) + if (!maxDate) setCurrentDisplayedMonth(nextMonth) + else { + setCurrentDisplayedMonth( + isSameMonth(maxDate, nextMonth) || + differenceInMonths(nextMonth, maxDate) > 0 + ? nextMonth + : currentDisplayedMonth, + ) + } + } + + return ( +
    +
    + + + {`${format('MMMM', currentDisplayedMonth)} ${format( + 'yyyy', + currentDisplayedMonth, + )}`} + + +
    + + + + {weekdays.map((day, key) => ( + + ))} + + + + {R.range(1, 8).map((row, key) => ( + + {getRow(currentDisplayedMonth, row).map((day, key) => ( + + ))} + + ))} + +
    {day}
    handleSelect(day)}> + + {format('d', day)} + +
    +
    + ) +} + +export default Calendar diff --git a/packages/admin-ui/src/components/date-range-picker/Calendar.module.css b/packages/admin-ui/src/components/date-range-picker/Calendar.module.css new file mode 100644 index 0000000..afc5950 --- /dev/null +++ b/packages/admin-ui/src/components/date-range-picker/Calendar.module.css @@ -0,0 +1,66 @@ +.wrapper { + display: flex; + flex-direction: column; + align-items: center; +} + +.button { + outline: none; +} + +.navbar { + font-size: 14px; + font-family: var(--museo); + font-weight: 500; + display: flex; + justify-content: space-between; + align-items: center; + width: 100%; + padding: 15px 15px; + color: var(--zodiac); +} + +.navbar button { + display: flex; + align-items: center; + padding: 0; + border: none; + background-color: var(--zircon); + cursor: pointer; + border-radius: 50%; + width: 20px; + height: 20px; + position: relative; + overflow: hidden; +} + +.navbar button svg { + position: absolute; + left: 0; +} + +.table { + border-collapse: collapse; + width: 100%; + color: var(--zodiac); +} + +.table tr:first-child { + padding-left: 5px; +} + +.table tr:last-child { + padding-right: 5px; +} + +.table th, +.table td { + margin: 0; + padding: 3px 0 3px 0; +} + +.table th { + font-size: 13px; + font-family: var(--museo); + font-weight: 700; +} diff --git a/packages/admin-ui/src/components/date-range-picker/DateRangePicker.jsx b/packages/admin-ui/src/components/date-range-picker/DateRangePicker.jsx new file mode 100644 index 0000000..f90086f --- /dev/null +++ b/packages/admin-ui/src/components/date-range-picker/DateRangePicker.jsx @@ -0,0 +1,59 @@ +import classnames from 'classnames' +import { compareAsc, differenceInDays, set } from 'date-fns/fp' +import * as R from 'ramda' +import React, { useState, useEffect } from 'react' + +import Calendar from './Calendar' + +const DateRangePicker = ({ minDate, maxDate, className, onRangeChange }) => { + const [from, setFrom] = useState(null) + const [to, setTo] = useState(null) + + useEffect(() => { + onRangeChange(from, to) + }, [from, onRangeChange, to]) + + const handleSelect = day => { + if ( + (maxDate && compareAsc(maxDate, day) > 0) || + (minDate && differenceInDays(day, minDate) > 0) + ) + return + + if (from && !to) { + if (differenceInDays(from, day) >= 0) { + setTo( + set({ hours: 23, minutes: 59, seconds: 59, milliseconds: 999 }, day), + ) + } else { + setTo( + set( + { hours: 23, minutes: 59, seconds: 59, milliseconds: 999 }, + R.clone(from), + ), + ) + setFrom(day) + } + return + } + + setFrom(day) + setTo(null) + } + + return ( + <> +
    + +
    + + ) +} + +export default DateRangePicker diff --git a/packages/admin-ui/src/components/date-range-picker/Tile.jsx b/packages/admin-ui/src/components/date-range-picker/Tile.jsx new file mode 100644 index 0000000..71f52db --- /dev/null +++ b/packages/admin-ui/src/components/date-range-picker/Tile.jsx @@ -0,0 +1,41 @@ +import classnames from 'classnames' +import React from 'react' + +import classes from './Tile.module.css' + +const Tile = ({ + isLowerBound, + isUpperBound, + isBetween, + isDisabled, + children, +}) => { + const selected = isLowerBound || isUpperBound + + const rangeClasses = { + [classes.between]: isBetween && !(isLowerBound && isUpperBound), + [classes.lowerBound]: isLowerBound && !isUpperBound, + [classes.upperBound]: isUpperBound && !isLowerBound, + } + + const buttonWrapperClasses = { + [classes.wrapper]: true, + [classes.selected]: selected, + } + + const buttonClasses = { + [classes.button]: true, + [classes.disabled]: isDisabled, + } + + return ( +
    +
    +
    + +
    +
    + ) +} + +export default Tile diff --git a/packages/admin-ui/src/components/date-range-picker/Tile.module.css b/packages/admin-ui/src/components/date-range-picker/Tile.module.css new file mode 100644 index 0000000..557c7e6 --- /dev/null +++ b/packages/admin-ui/src/components/date-range-picker/Tile.module.css @@ -0,0 +1,53 @@ +.wrapper { + height: 26px; + display: flex; + align-items: center; + justify-content: center; + position: relative; + overflow: hidden; +} + +.button { + outline: none; + font-size: 13px; + font-family: var(--museo); + font-weight: 500; + border: none; + cursor: pointer; + background-color: transparent; + color: var(--zodiac); + z-index: 2; +} + +.lowerBound { + left: 50%; +} + +.upperBound { + right: 50%; +} + +.selected { + width: 26px; + height: 26px; + display: flex; + align-items: center; + justify-content: center; + background-color: var(--spring2); + border-radius: 50%; + position: absolute; + z-index: 1; +} + +.between { + position: absolute; + width: 100%; + height: 100%; + z-index: 0; + background-color: var(--spring3); +} + +.disabled { + color: var(--dust); + cursor: default; +} diff --git a/packages/admin-ui/src/components/editableTable/Context.js b/packages/admin-ui/src/components/editableTable/Context.js new file mode 100644 index 0000000..f54c8c4 --- /dev/null +++ b/packages/admin-ui/src/components/editableTable/Context.js @@ -0,0 +1,3 @@ +import React from 'react' + +export default React.createContext() diff --git a/packages/admin-ui/src/components/editableTable/Header.jsx b/packages/admin-ui/src/components/editableTable/Header.jsx new file mode 100644 index 0000000..58f9f48 --- /dev/null +++ b/packages/admin-ui/src/components/editableTable/Header.jsx @@ -0,0 +1,127 @@ +import classnames from 'classnames' +import * as R from 'ramda' +import React, { useContext } from 'react' +import { Td, THead, TDoubleLevelHead, ThDoubleLevel } from '../fake-table/Table' + +import { sentenceCase } from '../../utils/string' + +import TableCtx from './Context' + +const groupSecondHeader = elements => { + const doubleHeader = R.prop('doubleHeader') + const sameDoubleHeader = (a, b) => doubleHeader(a) === doubleHeader(b) + const group = R.pipe( + R.groupWith(sameDoubleHeader), + R.map(group => + R.isNil(doubleHeader(group[0])) // No doubleHeader + ? group + : [ + { + width: R.sum(R.map(R.prop('width'), group)), + elements: group, + name: doubleHeader(group[0]), + }, + ], + ), + R.reduce(R.concat, []), + ) + + return R.all(R.pipe(doubleHeader, R.isNil), elements) + ? [elements, THead] + : [group(elements), TDoubleLevelHead] +} + +const Header = () => { + const { + elements, + enableEdit, + enableEditText, + editWidth, + enableDelete, + deleteWidth, + enableToggle, + toggleWidth, + orderedBy, + DEFAULT_COL_SIZE, + } = useContext(TableCtx) + + const mapElement2 = (it, idx) => { + const { width, elements, name } = it + + if (elements && elements.length) { + return ( + + {elements.map(mapElement)} + + ) + } + + return mapElement(it, idx) + } + + const mapElement = ( + { name, display, width = DEFAULT_COL_SIZE, header, textAlign }, + idx, + ) => { + const orderClasses = classnames({ + 'whitespace-nowrap': + R.isNil(header) && + !R.isNil(orderedBy) && + R.equals(name, orderedBy.code), + }) + + const attachOrderedByToComplexHeader = header => { + if (!R.isNil(orderedBy) && R.equals(name, orderedBy.code)) { + try { + const cloneHeader = R.clone(header) + const children = R.path(['props', 'children'], cloneHeader) + const spanChild = R.find(it => R.equals(it.type, 'span'), children) + spanChild.props.children = R.append(' -', spanChild.props.children) + return cloneHeader + } catch (e) { + console.error(e) + return header + } + } + return header + } + + return ( + + {!R.isNil(header) ? ( + <>{attachOrderedByToComplexHeader(header) ?? header} + ) : ( + + {!R.isNil(display) ? display : sentenceCase(name)}{' '} + {!R.isNil(orderedBy) && R.equals(name, orderedBy.code) && '-'} + + )} + + ) + } + + const [innerElements, HeaderElement] = groupSecondHeader(elements) + + return ( + + {innerElements.map(mapElement2)} + {enableEdit && ( + + {enableEditText ?? `Edit`} + + )} + {enableDelete && ( + + Delete + + )} + {enableToggle && ( + + Enable + + )} + + ) +} + +export default Header diff --git a/packages/admin-ui/src/components/editableTable/NamespacedTable.jsx b/packages/admin-ui/src/components/editableTable/NamespacedTable.jsx new file mode 100644 index 0000000..8313f7c --- /dev/null +++ b/packages/admin-ui/src/components/editableTable/NamespacedTable.jsx @@ -0,0 +1,29 @@ +import * as R from 'ramda' +import React from 'react' + +import { fromNamespace, toNamespace } from '../../utils/config' + +import EditableTable from './Table' + +const NamespacedTable = ({ + name, + save, + data = {}, + namespaces = [], + ...props +}) => { + const innerSave = (...[, it]) => { + return save(toNamespace(it.id)(R.omit(['id2'], it))) + } + + const innerData = R.map(it => ({ + id: it, + ...fromNamespace(it)(data), + }))(namespaces) + + return ( + + ) +} + +export default NamespacedTable diff --git a/packages/admin-ui/src/components/editableTable/Row.jsx b/packages/admin-ui/src/components/editableTable/Row.jsx new file mode 100644 index 0000000..6f58c55 --- /dev/null +++ b/packages/admin-ui/src/components/editableTable/Row.jsx @@ -0,0 +1,299 @@ +import Switch from '@mui/material/Switch' +import IconButton from '@mui/material/IconButton' +import SvgIcon from '@mui/material/SvgIcon' +import classnames from 'classnames' +import { Field, useFormikContext } from 'formik' +import * as R from 'ramda' +import React, { useContext, useState } from 'react' +import { DeleteDialog } from '../DeleteDialog' +import { Td, Tr } from '../fake-table/Table' +import { Label2 } from '../typography' +import DisabledDeleteIcon from '../../styling/icons/action/delete/disabled.svg?react' +import DeleteIcon from '../../styling/icons/action/delete/enabled.svg?react' +import DisabledEditIcon from '../../styling/icons/action/edit/disabled.svg?react' +import EditIcon from '../../styling/icons/action/edit/enabled.svg?react' +import StripesSvg from '../../styling/icons/stripes.svg?react' + +import { Link } from '../buttons' + +import TableCtx from './Context' +import moduleStyles from './Row.module.css' + +const ActionCol = ({ disabled, editing }) => { + const { values, submitForm, resetForm } = useFormikContext() + const { + editWidth, + onEdit, + enableEdit, + enableDelete, + disableRowEdit, + onDelete, + deleteWidth, + enableToggle, + onToggle, + toggleWidth, + forceAdd, + clearError, + actionColSize, + error, + } = useContext(TableCtx) + + const disableEdit = disabled || (disableRowEdit && disableRowEdit(values)) + const cancel = () => { + clearError() + resetForm() + } + + const [deleteDialog, setDeleteDialog] = useState(false) + + const onConfirmed = () => { + onDelete(values.id).then(res => { + if (!R.isNil(res)) setDeleteDialog(false) + }) + } + + return ( + <> + {editing && ( + + + Save + + {!forceAdd && ( + + Cancel + + )} + + )} + {!editing && enableEdit && ( + + onEdit && onEdit(values.id)} + size="small"> + + {disableEdit ? : } + + + + )} + {!editing && enableDelete && ( + + { + setDeleteDialog(true) + }} + size="small"> + + {disabled ? : } + + + { + setDeleteDialog(false) + clearError() + }} + errorMessage={error} + /> + + )} + {!editing && enableToggle && ( + + onToggle(values.id)} + /> + + )} + + ) +} + +const ECol = ({ editing, focus, config, extraPaddingRight, extraPadding }) => { + const { + name, + names, + bypassField, + input, + editable = true, + size, + bold, + width, + textAlign, + editingAlign = textAlign, + prefix, + PrefixComponent = Label2, + suffix, + SuffixComponent = Label2, + textStyle = () => {}, + isHidden = () => false, + view = it => it?.toString(), + inputProps = {}, + } = config + + const fields = names ?? [name] + + const { values } = useFormikContext() + const isEditable = editable => { + if (typeof editable === 'function') return editable(values) + return editable + } + const isEditing = editing && isEditable(editable) + const isField = !bypassField + + const innerProps = { + fullWidth: true, + autoFocus: focus, + size, + bold, + textAlign: isEditing ? editingAlign : textAlign, + ...inputProps, + } + + const newAlign = isEditing ? editingAlign : textAlign + const justifyContent = newAlign === 'right' ? 'flex-end' : newAlign + const style = suffix || prefix ? { justifyContent } : {} + + return ( +
    + {fields.map((f, idx) => ( + + {prefix && !isHidden(values) && ( + + {typeof prefix === 'function' ? prefix(f) : prefix} + + )} + {isEditing && isField && !isHidden(values) && ( + + )} + {isEditing && !isField && !isHidden(values) && ( + + )} + {!isEditing && values && !isHidden(values) && ( +
    + {view(values[f], values)} +
    + )} + {suffix && !isHidden(values) && ( + + {suffix} + + )} + {isHidden(values) && } + + ))} +
    + ) +} + +const groupStriped = elements => { + const [toStripe, noStripe] = R.partition(R.propEq(true, 'stripe'))(elements) + + if (!toStripe.length) { + return elements + } + + const index = R.indexOf(toStripe[0], elements) + const width = R.compose(R.sum, R.map(R.path(['width'])))(toStripe) + + return R.insert( + index, + { width, editable: false, view: () => }, + noStripe, + ) +} + +const ERow = ({ editing, disabled, lastOfGroup, newRow }) => { + const { touched, errors, values } = useFormikContext() + const { + elements, + enableEdit, + enableDelete, + error, + enableToggle, + rowSize, + stripeWhen, + } = useContext(TableCtx) + + const shouldStripe = !editing && stripeWhen && stripeWhen(values) + + const innerElements = shouldStripe ? groupStriped(elements) : elements + const [toSHeader] = R.partition(R.has('doubleHeader'))(elements) + + const extraPaddingIndex = toSHeader?.length + ? R.indexOf(toSHeader[0], elements) + : -1 + + const extraPaddingRightIndex = toSHeader?.length + ? R.indexOf(toSHeader[toSHeader.length - 1], elements) + : -1 + + const elementToFocusIndex = innerElements.findIndex( + it => it.editable === undefined || it.editable, + ) + + const classNames = { + [moduleStyles.lastOfGroup]: lastOfGroup, + } + + const touchedErrors = R.pick(R.keys(touched), errors) + const hasTouchedErrors = touchedErrors && R.keys(touchedErrors).length > 0 + const hasErrors = hasTouchedErrors || !!error + + const errorMessage = + error || (touchedErrors && R.values(touchedErrors).join(', ')) + + return ( + + {innerElements.map((it, idx) => { + return ( + + ) + })} + {(enableEdit || enableDelete || enableToggle) && ( + + )} + + ) +} + +export default ERow diff --git a/packages/admin-ui/src/components/editableTable/Row.module.css b/packages/admin-ui/src/components/editableTable/Row.module.css new file mode 100644 index 0000000..319a895 --- /dev/null +++ b/packages/admin-ui/src/components/editableTable/Row.module.css @@ -0,0 +1,29 @@ +.saveButton { + margin-right: 20px; +} + +.lastOfGroup { + margin-bottom: 24px; +} + +.extraPadding { + padding-left: 35px; + padding-right: 30px; +} + +.extraPaddingRight { + padding-right: 39px; +} + +.suffix { + margin: 0 0 0 7px; +} + +.prefix { + margin: 0 7px 0 0; +} + +.fields { + display: flex; + flex-direction: column; +} diff --git a/packages/admin-ui/src/components/editableTable/Table.jsx b/packages/admin-ui/src/components/editableTable/Table.jsx new file mode 100644 index 0000000..0a63fec --- /dev/null +++ b/packages/admin-ui/src/components/editableTable/Table.jsx @@ -0,0 +1,250 @@ +import { Form, Formik } from 'formik' +import * as R from 'ramda' +import React, { useState, useEffect } from 'react' +import PromptWhenDirty from '../PromptWhenDirty' +import Link from '../buttons/Link' +import { TBody, Table } from '../fake-table/Table' +import { Info2, TL1 } from '../typography' +import { v4 as uuidv4 } from 'uuid' + +import { AddButton } from '../buttons/index' + +import TableCtx from './Context' +import Header from './Header' +import ERow from './Row' +import classes from './Table.module.css' + +const ACTION_COL_SIZE = 87 +const DEFAULT_COL_SIZE = 100 + +const getWidth = R.compose( + R.reduce(R.add)(0), + R.map(it => it.width ?? DEFAULT_COL_SIZE), +) + +const ETable = ({ + name, + title, + titleLg, + elements = [], + data = [], + save, + error: externalError, + rowSize = 'md', + validationSchema, + enableCreate, + enableEdit, + enableEditText, + editWidth: outerEditWidth, + enableDelete, + deleteWidth = ACTION_COL_SIZE, + enableToggle, + toggleWidth = ACTION_COL_SIZE, + onToggle, + forceDisable, + disableAdd, + initialValues, + setEditing, + shouldOverrideEdit, + editOverride, + stripeWhen, + disableRowEdit, + groupBy, + sortBy, + createText = 'Add override', + forceAdd = false, + tbodyWrapperClass, + orderedBy = null, +}) => { + const [editingId, setEditingId] = useState(null) + const [adding, setAdding] = useState(false) + const [saving, setSaving] = useState(false) + const [error, setError] = useState(null) + + useEffect(() => setError(externalError), [externalError]) + useEffect(() => { + setError(null) + setAdding(forceAdd) + }, [forceAdd]) + + const innerSave = async value => { + if (saving) return + + setSaving(true) + + const it = validationSchema.cast(value, { assert: 'ignore-optionality' }) + const index = R.findIndex(R.propEq(it.id, 'id'))(data) + const list = index !== -1 ? R.update(index, it, data) : R.prepend(it, data) + + if (!R.equals(data[index], it)) { + try { + await save({ [name]: list }, it) + } catch (err) { + console.error(err) + setSaving(false) + return + } + } + + setAdding(false) + setEditing && setEditing(false) + setSaving(false) + } + + const onDelete = id => { + const list = R.reject(it => it.id === id, data) + return save({ [name]: list }) + } + + const onReset = () => { + setAdding(false) + setEditingId(null) + setEditing && setEditing(false) + } + + const onEdit = it => { + if (shouldOverrideEdit && shouldOverrideEdit(it)) return editOverride(it) + setEditingId(it) + setError(null) + setEditing && setEditing(it, true) + } + + const addField = () => { + setAdding(true) + setError(null) + setEditing && setEditing(true, true) + } + + const widthIfEditNull = + enableDelete || enableToggle ? ACTION_COL_SIZE : ACTION_COL_SIZE * 2 + + const editWidth = R.defaultTo(widthIfEditNull)(outerEditWidth) + + const actionColSize = + ((enableDelete && deleteWidth) ?? 0) + + ((enableEdit && editWidth) ?? 0) + + ((enableToggle && toggleWidth) ?? 0) + + const width = getWidth(elements) + actionColSize + + const showButtonOnEmpty = !data.length && enableCreate && !adding + const canAdd = !forceDisable && !editingId && !disableAdd && !adding + const showTable = adding || data.length !== 0 + + const innerData = sortBy ? R.sortWith(sortBy)(data) : data + + const ctxValue = { + elements, + enableEdit, + enableEditText, + onEdit, + clearError: () => setError(null), + error: error, + disableRowEdit, + editWidth, + enableDelete, + onDelete, + deleteWidth, + enableToggle, + rowSize, + onToggle, + toggleWidth, + actionColSize, + stripeWhen, + forceAdd, + orderedBy, + DEFAULT_COL_SIZE, + } + + return ( + +
    + {showButtonOnEmpty && canAdd && ( + {createText} + )} + {showTable && ( + <> + {(title || enableCreate) && ( +
    + {title && titleLg && ( + {title} + )} + {title && !titleLg && ( + {title} + )} + {enableCreate && canAdd && ( + + {createText} + + )} +
    + )} + +
    +
    +
    + {adding && ( + +
    + + + +
    + )} + {innerData.map((it, idx) => { + const nextElement = innerData[idx + 1] + + const canGroup = !!groupBy && nextElement + const isFunction = R.type(groupBy) === 'Function' + const groupFunction = isFunction ? groupBy : R.prop(groupBy) + + const isLastOfGroup = + canGroup && + groupFunction(it) !== groupFunction(nextElement) + + return ( + +
    + + + +
    + ) + })} + + +
    + + )} +
    +
    + ) +} + +export default ETable diff --git a/packages/admin-ui/src/components/editableTable/Table.module.css b/packages/admin-ui/src/components/editableTable/Table.module.css new file mode 100644 index 0000000..9808ccd --- /dev/null +++ b/packages/admin-ui/src/components/editableTable/Table.module.css @@ -0,0 +1,16 @@ +.addLink { + margin-left: auto; +} + +.title { + margin: 0; + color: var(--comet); +} + +.outerHeader { + min-height: 16px; + margin-bottom: 24px; + display: flex; + justify-content: space-between; + align-items: center; +} diff --git a/packages/admin-ui/src/components/editableTable/index.js b/packages/admin-ui/src/components/editableTable/index.js new file mode 100644 index 0000000..b9ca2dd --- /dev/null +++ b/packages/admin-ui/src/components/editableTable/index.js @@ -0,0 +1,4 @@ +import NamespacedTable from './NamespacedTable' +import Table from './Table' + +export { Table, NamespacedTable } diff --git a/packages/admin-ui/src/components/fake-table/Table.jsx b/packages/admin-ui/src/components/fake-table/Table.jsx new file mode 100644 index 0000000..29c7904 --- /dev/null +++ b/packages/admin-ui/src/components/fake-table/Table.jsx @@ -0,0 +1,145 @@ +import Card from '@mui/material/Card' +import CardContent from '@mui/material/CardContent' +import classnames from 'classnames' +import React from 'react' + +import { Link } from '../buttons' +import styles from './Table.module.css' + +const Table = ({ children, className, ...props }) => ( +
    + {children} +
    +) + +const THead = ({ children, className }) => { + return
    {children}
    +} + +const TDoubleLevelHead = ({ children, className }) => { + return ( +
    {children}
    + ) +} + +const TBody = ({ children, className }) => { + return
    {children}
    +} + +const Td = ({ + style = {}, + children, + header, + className, + width = 100, + size, + bold, + textAlign, + action, +}) => { + const inlineStyle = { + ...style, + width, + textAlign, + fontSize: size === 'sm' ? '14px' : size === 'lg' ? '24px' : '', + } + + const cssClasses = { + [styles.td]: !header, + [styles.tdHeader]: header, + 'font-bold': !header && (bold || size === 'lg'), + [styles.actionCol]: action, + } + + return ( +
    + {children} +
    + ) +} + +const Th = ({ children, ...props }) => { + return ( + + {children} + + ) +} + +const ThDoubleLevel = ({ title, children, className, width }) => { + return ( +
    +
    {title}
    +
    {children}
    +
    + ) +} + +const Tr = ({ + onClick, + error, + errorMessage, + shouldShowError, + children, + className, + size, + newRow, +}) => { + const inlineStyle = { + minHeight: size === 'sm' ? '34px' : size === 'lg' ? '68px' : '48px', + } + const cardClasses = { + [styles.card]: true, + [styles.trError]: error, + [styles.trAdding]: newRow, + } + + const mainContentClasses = { + [styles.mainContent]: true, + [styles.sizeSm]: size === 'sm', + [styles.sizeLg]: size === 'lg', + } + + return ( + <> + + +
    + {children} +
    + {error && shouldShowError && ( +
    {errorMessage}
    + )} +
    +
    + + ) +} + +const EditCell = ({ save, cancel }) => ( + + + Cancel + + + Save + + +) + +export { + Table, + THead, + TDoubleLevelHead, + TBody, + Tr, + Td, + Th, + ThDoubleLevel, + EditCell, +} diff --git a/packages/admin-ui/src/components/fake-table/Table.module.css b/packages/admin-ui/src/components/fake-table/Table.module.css new file mode 100644 index 0000000..ea3277a --- /dev/null +++ b/packages/admin-ui/src/components/fake-table/Table.module.css @@ -0,0 +1,106 @@ +.header { + composes: tl2 from '../typography/typography.module.css'; + background-color: var(--zodiac); + height: 32px; + text-align: left; + color: white; + display: flex; + align-items: center; +} + +.doubleHeader { + composes: tl2 from '../typography/typography.module.css'; + background-color: var(--zodiac); + height: 64px; + color: white; + display: table-row; +} + +.thDoubleLevel { + display: table-cell; +} + +.thDoubleLevelFirst { + composes: label1 from '../typography/typography.module.css'; + margin: 0 10px; + font-weight: 700; + display: flex; + justify-content: center; + align-items: center; + background-color: var(--comet); + color: white; + border-radius: 0 0 8px 8px; + height: 28px; +} + +.thDoubleLevel > :last-child { + padding: 0 11px; + display: table-cell; + vertical-align: middle; + height: 36px; +} + +.cellDoubleLevel { + display: flex; + padding: 0 16px; +} + +.td { + padding: 1px 24px 0 24px; +} + +.tdHeader { + vertical-align: middle; + display: table-cell; + padding: 0 24px; +} + +.trError { + background-color: var(--misty-rose); +} + +.trAdding { + background-color: var(--spring3); +} + +.mainContent { + display: flex; + align-items: center; +} + +.cardContentRoot { + margin: 0; + padding: 0; +} + +.cardContentRoot:last-child { + padding: 0; +} + +.card { + composes: p from '../typography/typography.module.css'; + margin: 4px 0 0 0; + width: 100%; + box-shadow: 0 0 4px 0 rgba(0, 0, 0, 0.08); +} + +.card:before { + height: 0; +} + +.actionCol { + margin-left: auto; +} + +.errorContent { + padding: 12px 0 12px 24px; + color: var(--tomato); +} + +.sizeSm { + min-height: 34px; +} + +.sizeLg { + min-height: 68px; +} diff --git a/packages/admin-ui/src/components/inputs/base/AsyncAutocomplete.jsx b/packages/admin-ui/src/components/inputs/base/AsyncAutocomplete.jsx new file mode 100644 index 0000000..4c37d3a --- /dev/null +++ b/packages/admin-ui/src/components/inputs/base/AsyncAutocomplete.jsx @@ -0,0 +1,75 @@ +import React, { useState, useRef } from 'react' +import { Autocomplete, TextField } from '@mui/material' + +export const AsyncAutocomplete = ({ + value, + onChange, + onSearch, + getOptionLabel, + getOptionId = option => option.id, + placeholder = 'Search...', + noOptionsText = 'Type to start searching...', + minSearchLength = 2, + debounceMs = 300, + variant = 'standard', + size = 'small', + fullWidth = true, + ...textFieldProps +}) => { + const [options, setOptions] = useState([]) + const timeoutRef = useRef(null) + + // Simple debounce using timeout + const debouncedSearch = searchTerm => { + if (timeoutRef.current) { + clearTimeout(timeoutRef.current) + } + timeoutRef.current = setTimeout(() => { + onSearch(searchTerm).then(results => { + setOptions(results) + }) + }, debounceMs) + } + + const handleInputChange = (event, newInputValue, reason) => { + // Only search when user is typing, not when selecting an option + if ( + reason === 'input' && + newInputValue && + newInputValue.length > minSearchLength + ) { + debouncedSearch(newInputValue) + } + } + + const handleBlur = () => { + setOptions([]) + } + + return ( + + getOptionId(option) === getOptionId(value) + } + noOptionsText={noOptionsText} + renderInput={params => ( + + )} + size={size} + fullWidth={fullWidth} + /> + ) +} diff --git a/packages/admin-ui/src/components/inputs/base/Autocomplete.jsx b/packages/admin-ui/src/components/inputs/base/Autocomplete.jsx new file mode 100644 index 0000000..33d1aa9 --- /dev/null +++ b/packages/admin-ui/src/components/inputs/base/Autocomplete.jsx @@ -0,0 +1,127 @@ +import MAutocomplete from '@mui/material/Autocomplete' +import classnames from 'classnames' +import sort from 'match-sorter' +import * as R from 'ramda' +import React from 'react' +import { HoverableTooltip } from '../../Tooltip' +import { P } from '../../typography' + +import TextInput from './TextInput' + +const Autocomplete = ({ + limit, + options, + label, + valueProp, + multiple, + onChange, + labelProp, + value: outsideValue, + error, + fullWidth, + textAlign, + size, + autoFocus, + ...props +}) => { + const mapFromValue = options => it => R.find(R.propEq(it, valueProp))(options) + const mapToValue = R.prop(valueProp) + + const getValue = () => { + if (!valueProp) return outsideValue + + const transform = multiple + ? R.map(mapFromValue(options)) + : mapFromValue(options) + + return transform(outsideValue) + } + + const value = getValue() + + const innerOnChange = (evt, value) => { + if (!valueProp) return onChange(evt, value) + + const rValue = multiple ? R.map(mapToValue)(value) : mapToValue(value) + onChange(evt, rValue) + } + + const valueArray = () => { + if (R.isNil(value)) return [] + return multiple ? value : [value] + } + + const filter = (array, input) => { + if (!input) return array + return sort(array, input, { keys: [valueProp, labelProp] }) + } + + const filterOptions = (array, { inputValue }) => + R.union( + R.isEmpty(inputValue) ? valueArray() : [], + filter(array, inputValue), + ).slice( + 0, + R.defaultTo(undefined)(limit) && + Math.max(limit, R.isEmpty(inputValue) ? valueArray().length : 0), + ) + + return ( + ( + + )} + renderOption={(iprops, props) => { + if (!props.warning && !props.warningMessage) + return
  • {R.path([labelProp])(props)}
  • + + const className = { + 'flex w-4 h-4 rounded-md': true, + 'bg-spring4': props.warning === 'clean', + 'bg-orange-yellow': props.warning === 'partial', + 'bg-tomato': props.warning === 'important', + } + + const hoverableElement =
    + + return ( +
  • +
    +
    {R.path([labelProp])(props)}
    + +

    {props.warningMessage}

    +
    +
    +
  • + ) + }} + slotProps={{ + chip: { onDelete: null }, + }} + /> + ) +} + +export default Autocomplete diff --git a/packages/admin-ui/src/components/inputs/base/Checkbox.jsx b/packages/admin-ui/src/components/inputs/base/Checkbox.jsx new file mode 100644 index 0000000..37be94b --- /dev/null +++ b/packages/admin-ui/src/components/inputs/base/Checkbox.jsx @@ -0,0 +1,46 @@ +import Checkbox from '@mui/material/Checkbox' +import CheckBoxIcon from '@mui/icons-material/CheckBox' +import CheckBoxOutlineBlankIcon from '@mui/icons-material/CheckBoxOutlineBlank' +import React from 'react' +import { Label2, Info3 } from '../../typography' +import WarningIcon from '../../../styling/icons/warning-icon/comet.svg?react' + +import { fontSize2, fontSize3 } from '../../../styling/variables' + +const CheckboxInput = ({ name, onChange, value, settings, ...props }) => { + const { enabled, label, disabledMessage, rightSideLabel } = settings + + return ( + <> + {enabled ? ( +
    + {!rightSideLabel && {label}} + + } + checkedIcon={} + disableRipple + {...props} + /> + {rightSideLabel && {label}} +
    + ) : ( +
    + + + {disabledMessage} + +
    + )} + + ) +} + +export default CheckboxInput diff --git a/packages/admin-ui/src/components/inputs/base/CodeInput.jsx b/packages/admin-ui/src/components/inputs/base/CodeInput.jsx new file mode 100644 index 0000000..af78dc0 --- /dev/null +++ b/packages/admin-ui/src/components/inputs/base/CodeInput.jsx @@ -0,0 +1,37 @@ +import classnames from 'classnames' +import React from 'react' +import OtpInput from 'react-otp-input' + +import classes from './CodeInput.module.css' + +const CodeInput = ({ + name, + value, + onChange, + numInputs, + error, + inputStyle, + containerStyle, +}) => { + return ( + } + shouldAutoFocus + containerStyle={classnames(containerStyle, 'justify-evenly')} + inputStyle={classnames( + inputStyle, + classes.input, + 'font-museo font-black text-4xl', + error && 'border-tomato', + )} + inputType={'tel'} + renderInput={props => } + /> + ) +} + +export default CodeInput diff --git a/packages/admin-ui/src/components/inputs/base/CodeInput.module.css b/packages/admin-ui/src/components/inputs/base/CodeInput.module.css new file mode 100644 index 0000000..5d76df7 --- /dev/null +++ b/packages/admin-ui/src/components/inputs/base/CodeInput.module.css @@ -0,0 +1,14 @@ +.input { + width: 3.5rem !important; + height: 5rem; + border: 2px solid; + border-color: var(--zircon); + border-radius: 4px; +} + +.input:focus { + border: 2px solid; + border-color: var(--zodiac); + border-radius: 4px; + outline: none; +} diff --git a/packages/admin-ui/src/components/inputs/base/Dropdown.jsx b/packages/admin-ui/src/components/inputs/base/Dropdown.jsx new file mode 100644 index 0000000..20acfef --- /dev/null +++ b/packages/admin-ui/src/components/inputs/base/Dropdown.jsx @@ -0,0 +1,29 @@ +import FormControl from '@mui/material/FormControl' +import InputLabel from '@mui/material/InputLabel' +import MenuItem from '@mui/material/MenuItem' +import Select from '@mui/material/Select' +import classnames from 'classnames' +import React from 'react' + +const Dropdown = ({ label, name, options, onChange, value, className }) => { + return ( + + {label} + + + ) +} + +export default Dropdown diff --git a/packages/admin-ui/src/components/inputs/base/NumberInput.jsx b/packages/admin-ui/src/components/inputs/base/NumberInput.jsx new file mode 100644 index 0000000..16cf2b3 --- /dev/null +++ b/packages/admin-ui/src/components/inputs/base/NumberInput.jsx @@ -0,0 +1,53 @@ +import React, { memo } from 'react' +import NumberFormat from 'react-number-format' + +import TextInput from './TextInput' + +const NumberInput = memo( + ({ + name, + onChange, + onBlur, + value, + error, + suffix, + textAlign, + width, + // lg or sm + size, + bold, + className, + decimalPlaces, + ...props + }) => { + return ( + { + onChange({ + target: { + id: name, + value: values.floatValue, + }, + }) + }} + {...props} + /> + ) + }, +) + +export default NumberInput diff --git a/packages/admin-ui/src/components/inputs/base/RadioGroup.jsx b/packages/admin-ui/src/components/inputs/base/RadioGroup.jsx new file mode 100644 index 0000000..d6d6bfd --- /dev/null +++ b/packages/admin-ui/src/components/inputs/base/RadioGroup.jsx @@ -0,0 +1,53 @@ +import Radio from '@mui/material/Radio' +import MRadioGroup from '@mui/material/RadioGroup' +import FormControlLabel from '@mui/material/FormControlLabel' +import classnames from 'classnames' +import React from 'react' +import { Label1 } from '../../typography' + +const RadioGroup = ({ + name, + label, + value, + options, + onChange, + className, + labelClassName, + radioClassName, +}) => { + return ( + <> + {label && ( + {label} + )} + + {options.map((option, idx) => ( + +
    + + } + label={option.display} + className={classnames(labelClassName)} + /> + {option.subtitle && ( + {option.subtitle} + )} +
    +
    + ))} +
    + + ) +} + +export default RadioGroup diff --git a/packages/admin-ui/src/components/inputs/base/SecretInput.jsx b/packages/admin-ui/src/components/inputs/base/SecretInput.jsx new file mode 100644 index 0000000..5bdb26d --- /dev/null +++ b/packages/admin-ui/src/components/inputs/base/SecretInput.jsx @@ -0,0 +1,35 @@ +import React, { memo, useState } from 'react' + +import { TextInput } from '../base' + +const SecretInput = memo( + ({ value, onFocus, isPasswordFilled, onBlur, ...props }) => { + const [focused, setFocused] = useState(false) + const placeholder = '⚬ ⚬ ⚬ This field is set ⚬ ⚬ ⚬' + const innerOnFocus = event => { + setFocused(true) + onFocus && onFocus(event) + } + + const innerOnBlur = event => { + setFocused(false) + onBlur && onBlur(event) + } + + return ( + + ) + }, +) + +export default SecretInput diff --git a/packages/admin-ui/src/components/inputs/base/Select.jsx b/packages/admin-ui/src/components/inputs/base/Select.jsx new file mode 100644 index 0000000..c78ef92 --- /dev/null +++ b/packages/admin-ui/src/components/inputs/base/Select.jsx @@ -0,0 +1,52 @@ +import classnames from 'classnames' +import { useSelect } from 'downshift' +import * as R from 'ramda' +import React from 'react' +import Arrowdown from '../../../styling/icons/action/arrow/regular.svg?react' + +import styles from './Select.module.css' + +function Select({ className, label, items, ...props }) { + const { + isOpen, + selectedItem, + getToggleButtonProps, + getLabelProps, + getMenuProps, + getItemProps, + } = useSelect({ + items, + selectedItem: props.selectedItem, + onSelectedItemChange: item => { + props.onSelectedItemChange(item.selectedItem) + }, + }) + + const selectClassNames = { + [styles.select]: true, + [styles.selectFiltered]: props.defaultAsFilter + ? true + : !R.equals(selectedItem, props.default), + [styles.open]: isOpen, + } + + return ( +
    + + +
      + {isOpen && + items.map(({ code, display }, index) => ( +
    • + {display} +
    • + ))} +
    +
    + ) +} + +export default Select diff --git a/packages/admin-ui/src/components/inputs/base/Select.module.css b/packages/admin-ui/src/components/inputs/base/Select.module.css new file mode 100644 index 0000000..102fe2c --- /dev/null +++ b/packages/admin-ui/src/components/inputs/base/Select.module.css @@ -0,0 +1,100 @@ +.selectedItem { + width: 111px; + display: block; + white-space: nowrap; + overflow: hidden; +} + +.select { + width: 152px; + z-index: 1; +} + +.select label { + font-size: 13px; + font-family: var(--museo); + font-weight: 500; + color: var(--comet); + padding-left: 10px; +} + +.select button { + font-size: 14px; + font-family: var(--museo); + font-weight: 500; + position: relative; + border: 0; + background-color: var(--zircon); + width: 152px; + padding: 6px 0 6px 12px; + border-radius: 20px; + line-height: 1.14; + text-align: left; + color: var(--comet); + cursor: pointer; + outline: 0 none; +} + +.select ul { + max-height: 200px; + width: 152px; + overflow-y: auto; + position: absolute; + margin: 0; + border-top: 0; + padding: 0; + border-radius: 0 0 8px 8px; + background-color: var(--zircon); + outline: 0 none; +} + +.select ul li { + font-size: 14px; + font-family: var(--museo); + font-weight: 500; + list-style-type: none; + padding: 6px 12px; + cursor: pointer; +} + +.select ul li span { + width: 100%; + display: block; + overflow: hidden; + white-space: nowrap; +} + +.select ul li:hover { + background-color: var(--comet); + color: white; +} + +.select svg { + position: absolute; + top: 12px; + right: 14px; + fill: var(--comet); +} + +.selectFiltered button { + background-color: var(--comet); + color: white; +} + +.selectFiltered ul li { + background-color: var(--comet); + color: white; +} + +.selectFiltered ul li:hover { + background-color: var(--zircon); + color: var(--comet); +} + +.selectFiltered svg { + fill: white !important; +} + +.open button { + border-radius: 8px 8px 0 0; +} diff --git a/packages/admin-ui/src/components/inputs/base/TextInput.jsx b/packages/admin-ui/src/components/inputs/base/TextInput.jsx new file mode 100644 index 0000000..c468023 --- /dev/null +++ b/packages/admin-ui/src/components/inputs/base/TextInput.jsx @@ -0,0 +1,74 @@ +import TextField from '@mui/material/TextField' +import classnames from 'classnames' +import * as R from 'ramda' +import React, { memo } from 'react' + +import styles from './TextInput.module.css' + +const TextInput = memo( + ({ + name, + isPasswordFilled, + onChange, + onBlur, + value, + error, + textAlign, + width, + inputClasses, + // lg or sm + size, + bold, + className, + inputProps, + InputProps, + ...props + }) => { + const isTextFilled = !error && !R.isNil(value) && !R.isEmpty(value) + const filled = isPasswordFilled || isTextFilled + + const style = { + width: width, + textAlign: textAlign, + } + + const sizeClass = + size === 'sm' + ? styles.sizeSm + : size === 'lg' + ? styles.sizeLg + : styles.size + + const divClass = { + [styles.bold]: bold, + } + + return ( + + ) + }, +) + +export default TextInput diff --git a/packages/admin-ui/src/components/inputs/base/TextInput.module.css b/packages/admin-ui/src/components/inputs/base/TextInput.module.css new file mode 100644 index 0000000..12172b0 --- /dev/null +++ b/packages/admin-ui/src/components/inputs/base/TextInput.module.css @@ -0,0 +1,24 @@ +.size { + font-size: 16px; +} + +.sizeSm { + font-size: 14px; +} + +.sizeLg { + font-size: 24px; + font-weight: 700; +} + +.bold { + font-weight: 700; +} + +.underline:before { + border-bottom-color: var(--spring); +} + +.underline:hover:not(.Mui-disabled)::before { + border-bottom-color: var(--spring); +} diff --git a/packages/admin-ui/src/components/inputs/base/ToggleButtonGroup.jsx b/packages/admin-ui/src/components/inputs/base/ToggleButtonGroup.jsx new file mode 100644 index 0000000..ee9a3b8 --- /dev/null +++ b/packages/admin-ui/src/components/inputs/base/ToggleButtonGroup.jsx @@ -0,0 +1,45 @@ +import MUIToggleButtonGroup from '@mui/material/ToggleButtonGroup' +import ToggleButton from '@mui/material/ToggleButton' +import React from 'react' +import { H4, P } from '../../typography' + +const ToggleButtonGroup = ({ + name, + orientation = 'vertical', + value, + exclusive = true, + onChange, + size = 'small', + ...props +}) => { + return ( + + {props.options.map(option => { + return ( + +
    + +
    +

    {option.title}

    +

    {option.description}

    +
    +
    +
    + ) + })} +
    + ) +} + +export default ToggleButtonGroup diff --git a/packages/admin-ui/src/components/inputs/base/index.js b/packages/admin-ui/src/components/inputs/base/index.js new file mode 100644 index 0000000..cad7bff --- /dev/null +++ b/packages/admin-ui/src/components/inputs/base/index.js @@ -0,0 +1,21 @@ +import Autocomplete from './Autocomplete' +import Checkbox from './Checkbox' +import CodeInput from './CodeInput' +import Dropdown from './Dropdown' +import NumberInput from './NumberInput' +import RadioGroup from './RadioGroup' +import SecretInput from './SecretInput' +import TextInput from './TextInput' +import ToggleButtonGroup from './ToggleButtonGroup' + +export { + Checkbox, + CodeInput, + TextInput, + NumberInput, + SecretInput, + RadioGroup, + Autocomplete, + ToggleButtonGroup, + Dropdown, +} diff --git a/packages/admin-ui/src/components/inputs/cashbox/Cashbox.jsx b/packages/admin-ui/src/components/inputs/cashbox/Cashbox.jsx new file mode 100644 index 0000000..cfa69ec --- /dev/null +++ b/packages/admin-ui/src/components/inputs/cashbox/Cashbox.jsx @@ -0,0 +1,181 @@ +import Chip from '@mui/material/Chip' +import classnames from 'classnames' +import React from 'react' +import { Info2, Label1, Label2 } from '../../typography' + +import { numberToFiatAmount } from '../../../utils/number' + +import classes from './Cashbox.module.css' +import { primaryColor as zodiac, tomato } from '../../../styling/variables.js' + +const colors = { + cashOut: { + empty: tomato, + full: zodiac, + }, + cashIn: { + empty: zodiac, + full: tomato, + }, +} + +const Cashbox = ({ + percent = 0, + cashOut = false, + width = 80, + height = 118, + className, + emptyPartClassName, + labelClassName, + omitInnerPercentage, + isLow, +}) => { + const ltHalf = percent <= 51 + const color = + colors[cashOut ? 'cashOut' : 'cashIn'][!isLow ? 'full' : 'empty'] + + return ( +
    +
    + {!omitInnerPercentage && ltHalf && ( + + {percent.toFixed(0)}% + + )} +
    +
    + {!omitInnerPercentage && !ltHalf && ( + + {percent.toFixed(0)}% + + )} +
    +
    + ) +} + +// https://support.lamassu.is/hc/en-us/articles/360025595552-Installing-the-Sintra-Forte +// Sintra and Sintra Forte can have up to 500 notes per cashOut box and up to 1000 per cashIn box +const CashIn = ({ + capacity = 500, + currency, + notes, + className, + editingMode = false, + threshold, + width, + height, + total, + omitInnerPercentage, +}) => { + const percent = (100 * notes) / capacity + const isLow = percent < threshold + return ( + <> +
    +
    + +
    + {!editingMode && ( +
    +
    + {notes} notes +
    +
    + + {total} {currency.code} + +
    +
    + )} +
    + + ) +} + +const CashOut = ({ + capacity = 500, + denomination = 0, + currency, + notes, + className, + editingMode = false, + threshold, + width, + height, + omitInnerPercentage, +}) => { + const percent = (100 * notes) / capacity + const isLow = percent < threshold + return ( + <> +
    +
    + +
    + {!editingMode && ( +
    +
    + {notes} + +
    +
    + + {numberToFiatAmount(notes * denomination)} {currency.code} + +
    +
    + )} +
    + + ) +} + +const CashOutLite = ({ + capacity = 500, + denomination = 0, + currency, + notes, + threshold, + width, +}) => { + const percent = (100 * notes) / capacity + const isLow = percent < threshold + return ( +
    + + +
    + ) +} + +export { Cashbox, CashIn, CashOut, CashOutLite } diff --git a/packages/admin-ui/src/components/inputs/cashbox/Cashbox.module.css b/packages/admin-ui/src/components/inputs/cashbox/Cashbox.module.css new file mode 100644 index 0000000..9a05d32 --- /dev/null +++ b/packages/admin-ui/src/components/inputs/cashbox/Cashbox.module.css @@ -0,0 +1,53 @@ +.row { + display: flex; + align-items: center; +} + +.col { + display: flex; + flex-direction: column; + align-items: center; +} + +.innerRow { + display: flex; + justify-content: flex-start; +} + +.col2 { + margin-left: 14px; +} + +.noMarginText { + margin-top: 0; + margin-bottom: 0; +} + +.link { + margin-top: 8px; +} + +/*TODO important because of tailwind integration with MUI*/ +.fullPartP { + color: white !important; + display: inline; +} + +.emptyPart { + background-color: var(--ghost); + position: relative; +} + +.emptyPartP { + display: inline-block; + position: absolute; + margin: 0; + bottom: 0; + right: 0; +} + +.cashbox { + border: 2px solid; + text-align: end; + display: inline-block; +} diff --git a/packages/admin-ui/src/components/inputs/formik/AsyncAutocomplete.jsx b/packages/admin-ui/src/components/inputs/formik/AsyncAutocomplete.jsx new file mode 100644 index 0000000..06fefac --- /dev/null +++ b/packages/admin-ui/src/components/inputs/formik/AsyncAutocomplete.jsx @@ -0,0 +1,29 @@ +import React, { useState } from 'react' +import { AsyncAutocomplete as BaseAsyncAutocomplete } from '../base/AsyncAutocomplete' + +const AsyncAutocompleteFormik = ({ field, form, ...props }) => { + const { name } = field + const { touched, errors, setFieldValue } = form + const [selectedOption, setSelectedOption] = useState(null) + + const error = touched[name] && errors[name] + const getOptionId = props.getOptionId || (opt => opt.id) + + const handleChange = (event, newValue) => { + setSelectedOption(newValue) + setFieldValue(name, newValue ? getOptionId(newValue) : '') + } + + return ( + + ) +} + +export const AsyncAutocomplete = AsyncAutocompleteFormik diff --git a/packages/admin-ui/src/components/inputs/formik/Autocomplete.jsx b/packages/admin-ui/src/components/inputs/formik/Autocomplete.jsx new file mode 100644 index 0000000..6355e10 --- /dev/null +++ b/packages/admin-ui/src/components/inputs/formik/Autocomplete.jsx @@ -0,0 +1,51 @@ +import { useFormikContext } from 'formik' +import * as R from 'ramda' +import React, { useState } from 'react' + +import { Autocomplete } from '../base' + +const AutocompleteFormik = ({ options, onChange, ...props }) => { + const [open, setOpen] = useState(false) + + const { name, onBlur, value } = props.field + const { touched, errors, setFieldValue, setFieldTouched } = props.form + const error = !!(touched[name] && errors[name]) + const { initialValues, values } = useFormikContext() + + const innerOptions = + R.type(options) === 'Function' ? options(initialValues, values) : options + + const innerOnBlur = event => { + name && setFieldTouched(name, true) + onBlur && onBlur(event) + } + + const onChangeHandler = value => setFieldValue(name, value) + const shouldStayOpen = !!props.shouldStayOpen + + return ( + { + if (onChange) return onChange(value, item, onChangeHandler) + setFieldValue(name, item) + }} + onBlur={innerOnBlur} + value={value} + error={error} + open={open} + options={innerOptions} + onOpen={() => { + if (!props.multiple) return setOpen(true) + setOpen(value?.length !== props.limit) + }} + onClose={(event, reason) => { + if (shouldStayOpen && reason !== 'blur') setOpen(true) + else setOpen(false) + }} + {...props} + /> + ) +} + +export default AutocompleteFormik diff --git a/packages/admin-ui/src/components/inputs/formik/CashCassetteInput.jsx b/packages/admin-ui/src/components/inputs/formik/CashCassetteInput.jsx new file mode 100644 index 0000000..543917e --- /dev/null +++ b/packages/admin-ui/src/components/inputs/formik/CashCassetteInput.jsx @@ -0,0 +1,39 @@ +import classNames from 'classnames' +import React, { memo, useState } from 'react' +import { CashOut } from '../cashbox/Cashbox' + +import { NumberInput } from '../base' + +const CashCassetteInput = memo( + ({ decimalPlaces, width, threshold, inputClassName, ...props }) => { + const { name, onChange, onBlur, value } = props.field + const { touched, errors } = props.form + const [notes, setNotes] = useState(value) + const error = !!(touched[name] && errors[name]) + return ( +
    + + { + setNotes(e.target.value) + return onChange(e) + }} + onBlur={onBlur} + value={value} + error={error} + decimalPlaces={decimalPlaces} + {...props} + /> +
    + ) + }, +) + +export default CashCassetteInput diff --git a/packages/admin-ui/src/components/inputs/formik/Checkbox.jsx b/packages/admin-ui/src/components/inputs/formik/Checkbox.jsx new file mode 100644 index 0000000..0ef940a --- /dev/null +++ b/packages/admin-ui/src/components/inputs/formik/Checkbox.jsx @@ -0,0 +1,27 @@ +import React, { memo } from 'react' + +import { Checkbox } from '../base' + +const CheckboxInput = memo( + ({ label, enabled = true, disabledMessage = '', ...props }) => { + const { name, onChange, value } = props.field + + const settings = { + enabled: enabled, + label: label, + disabledMessage: disabledMessage, + } + + return ( + + ) + }, +) + +export default CheckboxInput diff --git a/packages/admin-ui/src/components/inputs/formik/Dropdown.jsx b/packages/admin-ui/src/components/inputs/formik/Dropdown.jsx new file mode 100644 index 0000000..e640da2 --- /dev/null +++ b/packages/admin-ui/src/components/inputs/formik/Dropdown.jsx @@ -0,0 +1,25 @@ +import React, { memo } from 'react' + +import { Dropdown } from '../base' + +const RadioGroupFormik = memo(({ label, ...props }) => { + const { name, value } = props.field + const { setFieldValue } = props.form + return ( + { + setFieldValue(name, e.target.value) + props.resetError && props.resetError() + }} + className={props.className} + {...props} + /> + ) +}) + +export default RadioGroupFormik diff --git a/packages/admin-ui/src/components/inputs/formik/NumberInput.jsx b/packages/admin-ui/src/components/inputs/formik/NumberInput.jsx new file mode 100644 index 0000000..caca139 --- /dev/null +++ b/packages/admin-ui/src/components/inputs/formik/NumberInput.jsx @@ -0,0 +1,24 @@ +import React, { memo } from 'react' + +import { NumberInput } from '../base' + +const NumberInputFormik = memo(({ decimalPlaces, ...props }) => { + const { name, onChange, onBlur, value } = props.field + const { touched, errors } = props.form + + const error = !!(touched[name] && errors[name]) + + return ( + + ) +}) + +export default NumberInputFormik diff --git a/packages/admin-ui/src/components/inputs/formik/RadioGroup.jsx b/packages/admin-ui/src/components/inputs/formik/RadioGroup.jsx new file mode 100644 index 0000000..130f528 --- /dev/null +++ b/packages/admin-ui/src/components/inputs/formik/RadioGroup.jsx @@ -0,0 +1,25 @@ +import React, { memo } from 'react' + +import { RadioGroup } from '../base' + +const RadioGroupFormik = memo(({ label, ...props }) => { + const { name, onChange, value } = props.field + + return ( + { + onChange(e) + props.resetError && props.resetError() + }} + className={props.className} + {...props} + /> + ) +}) + +export default RadioGroupFormik diff --git a/packages/admin-ui/src/components/inputs/formik/SecretInput.jsx b/packages/admin-ui/src/components/inputs/formik/SecretInput.jsx new file mode 100644 index 0000000..a647d10 --- /dev/null +++ b/packages/admin-ui/src/components/inputs/formik/SecretInput.jsx @@ -0,0 +1,24 @@ +import React, { memo } from 'react' + +import { SecretInput } from '../base' + +const SecretInputFormik = memo(({ isPasswordFilled, ...props }) => { + const { name, onChange, onBlur, value } = props.field + const { touched, errors } = props.form + + const error = !isPasswordFilled && !!(touched[name] && errors[name]) + + return ( + + ) +}) + +export default SecretInputFormik diff --git a/packages/admin-ui/src/components/inputs/formik/TextInput.jsx b/packages/admin-ui/src/components/inputs/formik/TextInput.jsx new file mode 100644 index 0000000..cdbb16a --- /dev/null +++ b/packages/admin-ui/src/components/inputs/formik/TextInput.jsx @@ -0,0 +1,23 @@ +import React, { memo } from 'react' + +import { TextInput } from '../base' + +const TextInputFormik = memo(({ ...props }) => { + const { name, onChange, onBlur, value } = props.field + const { touched, errors } = props.form + + const error = !!(touched[name] && errors[name]) + + return ( + + ) +}) + +export default TextInputFormik diff --git a/packages/admin-ui/src/components/inputs/formik/ToggleButtonGroup.jsx b/packages/admin-ui/src/components/inputs/formik/ToggleButtonGroup.jsx new file mode 100644 index 0000000..51d5f74 --- /dev/null +++ b/packages/admin-ui/src/components/inputs/formik/ToggleButtonGroup.jsx @@ -0,0 +1,27 @@ +import React, { memo } from 'react' + +import { ToggleButtonGroup } from '../base' + +const ToggleButtonGroupFormik = memo(({ enforceValueSet = true, ...props }) => { + const { name, value } = props.field + const { setFieldValue } = props.form + return ( + { + // enforceValueSet prevents you from not having any button selected + // after selecting one the first time + if (enforceValueSet && !value) return null + setFieldValue(name, value) + props.resetError && props.resetError() + }} + className={props.className} + {...props} + /> + ) +}) + +export default ToggleButtonGroupFormik diff --git a/packages/admin-ui/src/components/inputs/formik/index.js b/packages/admin-ui/src/components/inputs/formik/index.js new file mode 100644 index 0000000..303b4c3 --- /dev/null +++ b/packages/admin-ui/src/components/inputs/formik/index.js @@ -0,0 +1,21 @@ +import Autocomplete from './Autocomplete' +import { AsyncAutocomplete } from './AsyncAutocomplete' +import CashCassetteInput from './CashCassetteInput' +import Checkbox from './Checkbox' +import Dropdown from './Dropdown' +import NumberInput from './NumberInput' +import RadioGroup from './RadioGroup' +import SecretInput from './SecretInput' +import TextInput from './TextInput' + +export { + Autocomplete, + AsyncAutocomplete, + Checkbox, + TextInput, + NumberInput, + SecretInput, + RadioGroup, + CashCassetteInput, + Dropdown, +} diff --git a/packages/admin-ui/src/components/inputs/index.js b/packages/admin-ui/src/components/inputs/index.js new file mode 100644 index 0000000..6298d8c --- /dev/null +++ b/packages/admin-ui/src/components/inputs/index.js @@ -0,0 +1,18 @@ +import Autocomplete from './base/Autocomplete' +import Checkbox from './base/Checkbox' +import CodeInput from './base/CodeInput' +import RadioGroup from './base/RadioGroup' +import Select from './base/Select' +import TextInput from './base/TextInput' +import { CashIn, CashOut } from './cashbox/Cashbox' + +export { + Autocomplete, + TextInput, + Checkbox, + CodeInput, + Select, + RadioGroup, + CashIn, + CashOut, +} diff --git a/packages/admin-ui/src/components/layout/Header.jsx b/packages/admin-ui/src/components/layout/Header.jsx new file mode 100644 index 0000000..31f2a49 --- /dev/null +++ b/packages/admin-ui/src/components/layout/Header.jsx @@ -0,0 +1,250 @@ +import { useQuery, gql } from '@apollo/client' +import ClickAwayListener from '@mui/material/ClickAwayListener' +import Popper from '@mui/material/Popper' +import classnames from 'classnames' +import * as R from 'ramda' +import React, { memo, useState, useEffect, useRef } from 'react' +import { Link as WLink, useRoute, useLocation } from 'wouter' +import ActionButton from '../buttons/ActionButton' +import { H4 } from '../typography' +import AddIconReverse from '../../styling/icons/button/add/white.svg?react' +import AddIcon from '../../styling/icons/button/add/zodiac.svg?react' +import Logo from '../../styling/icons/menu/logo.svg?react' +import NotificationIcon from '../../styling/icons/menu/notification.svg?react' + +import NotificationCenter from '../NotificationCenter' +import AddMachine from '../../pages/AddMachine' + +import styles from './Header.module.css' + +const HAS_UNREAD = gql` + query getUnread { + hasUnreadNotifications + } +` + +const Link = ({ + setActive, + isParent, + className, + activeClassName, + item, + ...props +}) => { + const [location] = useLocation() + const [isActive] = useRoute(props.to) + const isParentActive = isParent && location.startsWith(props.to) + if (isActive || isParentActive) setActive(item) + + const classNames = classnames({ + [className]: true, + [activeClassName]: isActive || isParentActive, + }) + + return ( + + {props.children} + + ) +} + +const Subheader = ({ item, user }) => { + const [prev, setPrev] = useState(null) + + return ( +
    +
    + +
    +
    + ) +} + +const notNil = R.compose(R.not, R.isNil) + +const Header = memo(({ tree, user, restrictionLevel }) => { + const [open, setOpen] = useState(false) + const [anchorEl, setAnchorEl] = useState(null) + const [notifButtonCoords, setNotifButtonCoords] = useState({ x: 0, y: 0 }) + const [active, setActive] = useState() + const [hasUnread, setHasUnread] = useState(false) + + const { data, refetch, startPolling, stopPolling } = useQuery(HAS_UNREAD) + const notifCenterButtonRef = useRef() + const popperRef = useRef() + const [, navigate] = useLocation() + + useEffect(() => { + if (data?.hasUnreadNotifications) return setHasUnread(true) + // if not true, make sure it's false and not undefined + if (notNil(data?.hasUnreadNotifications)) return setHasUnread(false) + }, [data]) + + useEffect(() => { + startPolling(60000) + return stopPolling + }) + + const bannerClassnames = classnames({ + [styles.smallBanner]: restrictionLevel === 1, + [styles.bigBanner]: restrictionLevel === 2, + ['bg-orange-400 w-full flex flex-col justify-center items-center text-white font-bold text-md']: true, + }) + + const onPaired = machine => { + setOpen(false) + navigate('/maintenance/machine-status', { state: { id: machine.deviceId } }) + } + + // these inline styles prevent scroll bubbling: when the user reaches the bottom of the notifications list and keeps scrolling, + // the body scrolls, stealing the focus from the notification center, preventing the admin from scrolling the notifications back up + // on the first scroll, needing to move the mouse to recapture the focus on the notification center + // it also disables the scrollbars caused by the notification center's background to the right of the page, but keeps the scrolling on the body enabled + const onClickAway = () => { + setAnchorEl(null) + document.querySelector('#root').classList.remove('root-notifcenter-open') + document.querySelector('body').classList.remove('body-notifcenter-open') + } + + const handleClick = event => { + const coords = notifCenterButtonRef.current.getBoundingClientRect() + setNotifButtonCoords({ x: coords.x, y: coords.y + 5 }) + + setAnchorEl(anchorEl ? null : event.currentTarget) + document.querySelector('#root').classList.add('root-notifcenter-open') + document.querySelector('body').classList.add('body-notifcenter-open') + } + + const popperOpen = Boolean(anchorEl) + const id = popperOpen ? 'notifications-popper' : undefined + return ( +
    +
    +
    +
    { + setActive(false) + navigate('/dashboard') + }} + className={classnames(styles.logo, styles.logoLink)}> + +

    Lamassu Admin

    +
    + +
    + setOpen(true)}> + Add machine + + +
    + + + + +
    +
    +
    +
    +
    + {active && active.children && } + {restrictionLevel > 0 && ( +
    +

    + The software you're running is out of license. Please contact us to + ensure your OSA payments are current. +

    +

    + Future restrictions may be applied. If this is in error, please get + in touch with support@lamassu.is. +

    +
    + )} + {open && setOpen(false)} onPaired={onPaired} />} +
    + ) +}) + +export default Header diff --git a/packages/admin-ui/src/components/layout/Header.module.css b/packages/admin-ui/src/components/layout/Header.module.css new file mode 100644 index 0000000..691e9b6 --- /dev/null +++ b/packages/admin-ui/src/components/layout/Header.module.css @@ -0,0 +1,185 @@ +.headerContainer { + position: relative; +} + +.header { + background-color: var(--zodiac); + color: white; + height: 56px; + display: flex; +} + +.content { + max-width: 1200px; + flex: 1; + display: flex; + align-items: center; + margin: 0 auto; +} + +.nav { + flex: 1; + display: flex; + align-items: center; + justify-content: space-between; +} + +.ul { + display: flex; + padding-left: 36px; + height: 56px; + margin: 0; +} + +.li { + list-style: none; + color: white; + margin: 20px 20px 0 20px; + position: relative; + line-height: 17px; +} + +.li:hover { + color: white; +} + +.li:hover::after { + width: 50%; + margin-left: -25%; +} + +.li::after { + content: ''; + display: block; + background: white; + width: 0; + height: 4px; + left: 50%; + margin-left: 0; + position: absolute; + border-radius: 1000px; + transition: all 0.2s cubic-bezier(0.95, 0.1, 0.45, 0.94); +} + +.link { + text-decoration: none; + border: none; + color: white; + background-color: transparent; +} + +.forceSize { + display: inline-block; + text-align: center; +} + +.forceSize::after { + display: block; + content: attr(data-forcesize); + font-weight: 700; + height: 0; + overflow: hidden; + visibility: hidden; +} + +.activeLink { + color: white; +} + +.activeLink li::after { + width: 50%; + margin-left: -25%; +} + +.addMachine { + margin-left: auto; +} + +.subheader { + background-color: var(--zircon); + color: white; + height: 40px; + display: flex; +} + +.subheaderUl { + display: flex; + padding-left: 0; + margin: 0; +} + +.subheaderLi { + list-style: none; + padding: 0 20px; +} + +.subheaderLi:first-child { + padding-left: 0; +} + +.subheaderLink { + text-decoration: none; + border: none; + color: var(--comet); +} + +.activeSubheaderLink { + text-shadow: 0.2px 0 0 currentColor; + color: var(--zodiac); +} + +.logo { + display: flex; + align-items: center; +} + +.logo > svg { + margin-right: 16px; +} + +.logoLink { + cursor: pointer; +} + +.actionButtonsContainer { + z-index: 1; + position: relative; + display: flex; + justify-content: space-between; + min-width: 200px; + transform: translateZ(0); +} + +.notificationIcon { + margin-top: 4px; + cursor: pointer; + background: transparent; + box-shadow: 0px 0px 0px transparent; + border: 0px solid transparent; + text-shadow: 0px 0px 0px transparent; + outline: none; +} + +.hasUnread { + position: absolute; + top: 4px; + left: 186px; + width: 9px; + height: 9px; + background-color: var(--spring); + border-radius: 50%; +} + +.popper { + z-index: 1; +} + +.smallBanner { + font-size: 14px; + height: 5vh; +} + +.bigBanner { + font-size: 24px; + height: 40vh; +} diff --git a/packages/admin-ui/src/components/layout/Section.jsx b/packages/admin-ui/src/components/layout/Section.jsx new file mode 100644 index 0000000..d83a0b0 --- /dev/null +++ b/packages/admin-ui/src/components/layout/Section.jsx @@ -0,0 +1,19 @@ +import React from 'react' +import ErrorMessage from '../ErrorMessage' +import Subtitle from '../Subtitle' + +const Section = ({ error, children, title }) => { + return ( +
    + {(title || error) && ( +
    + {title} + {error && Failed to save changes} +
    + )} + {children} +
    + ) +} + +export default Section diff --git a/packages/admin-ui/src/components/layout/Sidebar.jsx b/packages/admin-ui/src/components/layout/Sidebar.jsx new file mode 100644 index 0000000..18376bb --- /dev/null +++ b/packages/admin-ui/src/components/layout/Sidebar.jsx @@ -0,0 +1,75 @@ +import classnames from 'classnames' +import React from 'react' +import { P } from '../typography' +import CompleteStageIconZodiac from '../../styling/icons/stage/zodiac/complete.svg?react' +import CurrentStageIconZodiac from '../../styling/icons/stage/zodiac/current.svg?react' +import EmptyStageIconZodiac from '../../styling/icons/stage/zodiac/empty.svg?react' + +import styles from './Sidebar.module.css' + +const Sidebar = ({ + data, + displayName, + isSelected, + onClick, + children, + itemRender, + loading = false, +}) => { + return ( +
    + {loading &&

    Loading...

    } + {!loading && + data?.map((it, idx) => ( +
    onClick(it)}> +
    + {itemRender ? itemRender(it, isSelected(it)) : displayName(it)} +
    +
    + ))} + {!loading && children} +
    + ) +} + +export default Sidebar + +const Stepper = ({ step, it, idx, steps }) => { + const active = step === idx + const past = idx < step + const future = idx > step + + return ( +
    + + {it.label} + + {active && } + {past && } + {future && } + {idx < steps.length - 1 && ( +
    + )} +
    + ) +} + +export { Stepper } diff --git a/packages/admin-ui/src/components/layout/Sidebar.module.css b/packages/admin-ui/src/components/layout/Sidebar.module.css new file mode 100644 index 0000000..0f0f8df --- /dev/null +++ b/packages/admin-ui/src/components/layout/Sidebar.module.css @@ -0,0 +1,106 @@ +:root { + --sidebar-color: var(--zircon); +} + +.sidebar { + display: flex; + background-color: var(--sidebar-color); + width: 520px; + margin-left: -300px; + box-shadow: -500px 0px 0px 0px var(--sidebar-color); + border-radius: 0 20px 0 0; + align-items: flex-end; + padding: 24px; + flex-direction: column; +} + +@media (max-width: 1440px) { + .sidebar { + width: auto; + margin-left: 0; + min-width: 250px; + box-shadow: -200px 0px 0px 0px var(--sidebar-color); + } +} + +.linkWrapper { + cursor: pointer; +} + +.link { + position: relative; + color: var(--comet); + margin: 12px 24px 12px 0; + cursor: pointer; +} + +.link:hover::after { + height: 140%; +} + +.link::after { + content: ''; + display: block; + background: var(--zodiac); + width: 4px; + height: 0; + left: 100%; + margin-left: 20px; + bottom: -2px; + position: absolute; + border-radius: 1000px; + transition: all 0.2s cubic-bezier(0.95, 0.1, 0.45, 0.94); +} + +.activeLink { + font-weight: 700; + color: var(--zodiac); +} + +.activeLink::after { + height: 140%; +} + +.customRenderLink:hover::after { + height: 100%; +} + +.customRenderLink::after { + bottom: 0; +} + +.customRenderActiveLink::after { + height: 100%; +} + +.item { + position: relative; + margin: 12px 0 12px 0; + display: flex; +} + +.itemText { + color: var(--comet); + margin-right: 24px; +} + +.itemTextActive { + color: var(--zodiac); +} + +.itemTextPast { + color: var(--zodiac); +} + +.stepperPath { + position: absolute; + height: 25px; + width: 1px; + border: 1px solid var(--comet); + right: 8px; + top: 18px; +} + +.stepperPast { + border: 1px solid var(--zodiac); +} diff --git a/packages/admin-ui/src/components/layout/TitleSection.jsx b/packages/admin-ui/src/components/layout/TitleSection.jsx new file mode 100644 index 0000000..319965a --- /dev/null +++ b/packages/admin-ui/src/components/layout/TitleSection.jsx @@ -0,0 +1,66 @@ +import classnames from 'classnames' +import * as R from 'ramda' +import React from 'react' +import ErrorMessage from '../ErrorMessage' +import Title from '../Title' +import { Info1, Label1 } from '../typography' + +import { SubpageButton } from '../buttons' + +const TitleSection = ({ + className, + title, + error, + labels, + buttons = [], + children, + appendix, + appendixRight, +}) => { + return ( +
    +
    + {title} + {!!appendix && appendix} + {error && Failed to save} + {buttons.length > 0 && ( + <> + {buttons.map((button, idx) => + !R.isNil(button.component) ? ( + button.component + ) : ( + + + {button.text} + + + ), + )} + + )} +
    +
    + {(labels ?? []).map(({ icon, label }, idx) => ( +
    +
    {icon}
    + {label} +
    + ))} + {appendixRight} +
    + {children} +
    + ) +} + +export default TitleSection diff --git a/packages/admin-ui/src/components/machineActions/DiagnosticsModal.jsx b/packages/admin-ui/src/components/machineActions/DiagnosticsModal.jsx new file mode 100644 index 0000000..4397c27 --- /dev/null +++ b/packages/admin-ui/src/components/machineActions/DiagnosticsModal.jsx @@ -0,0 +1,225 @@ +import { useLazyQuery, useQuery, gql } from '@apollo/client' +import { subMinutes } from 'date-fns' +import FileSaver from 'file-saver' +import React, { useState, useEffect, useRef } from 'react' +import Modal from '../Modal' +import { H3, P } from '../typography' + +import { Button } from '../buttons' + +const STATES = { + INITIAL: 'INITIAL', + EMPTY: 'EMPTY', + RUNNING: 'RUNNING', + FAILURE: 'FAILURE', + FILLED: 'FILLED', +} + +const MACHINE = gql` + query getMachine($deviceId: ID!) { + machine(deviceId: $deviceId) { + diagnostics { + timestamp + frontTimestamp + scanTimestamp + } + } + } +` + +const MACHINE_LOGS = gql` + query machineLogsCsv( + $deviceId: ID! + $limit: Int + $from: DateTimeISO + $until: DateTimeISO + $timezone: String + ) { + machineLogsCsv( + deviceId: $deviceId + limit: $limit + from: $from + until: $until + timezone: $timezone + ) + } +` + +const createCsv = async ({ machineLogsCsv }) => { + const machineLogs = new Blob([machineLogsCsv], { + type: 'text/plain;charset=utf-8', + }) + + FileSaver.saveAs(machineLogs, 'machineLogs.csv') +} + +const DiagnosticsModal = ({ onClose, deviceId, sendAction }) => { + const [state, setState] = useState(STATES.INITIAL) + const [timestamp, setTimestamp] = useState(null) + const [diagnosticTimestamps, setDiagnosticTimestamps] = useState({}) + const timeoutRef = useRef(null) + + const [fetchSummary, { loading }] = useLazyQuery(MACHINE_LOGS, { + onCompleted: data => createCsv(data), + }) + + const { data, stopPolling, startPolling } = useQuery(MACHINE, { + variables: { deviceId }, + }) + + useEffect(() => { + if (!data) return + if (!timestamp && !data.machine.diagnostics.timestamp) { + stopPolling() + setState(STATES.EMPTY) + } + if ( + data.machine.diagnostics.timestamp && + data.machine.diagnostics.timestamp !== timestamp + ) { + if (timeoutRef.current) { + clearTimeout(timeoutRef.current) + timeoutRef.current = null + } + setTimestamp(data.machine.diagnostics.timestamp) + setDiagnosticTimestamps({ + front: data.machine.diagnostics.frontTimestamp, + scan: data.machine.diagnostics.scanTimestamp, + }) + setState(STATES.FILLED) + stopPolling() + } + }, [data, stopPolling, timestamp]) + + useEffect(() => { + return () => { + if (timeoutRef.current) { + clearTimeout(timeoutRef.current) + timeoutRef.current = null + } + } + }, []) + + const runDiagnostics = () => { + setState(STATES.RUNNING) + startPolling(2000) + + if (timeoutRef.current) { + clearTimeout(timeoutRef.current) + } + + timeoutRef.current = setTimeout(() => { + setState(STATES.FAILURE) + stopPolling() + timeoutRef.current = null + }, 60 * 1000) + + sendAction() + } + + const messageClass = 'm-auto flex flex-col items-center justify-center' + + const showPhoto = diagnosticName => { + console.log(diagnosticName, diagnosticTimestamps) + return diagnosticTimestamps[diagnosticName] ? ( + + ) : ( + <>Failed getting photo + ) + } + + const date = new Date(timestamp) + const dateString = date.toLocaleString('en-US', { + weekday: 'short', + year: 'numeric', + month: 'short', + day: 'numeric', + hour: '2-digit', + minute: '2-digit', + second: '2-digit', + hour12: false, + }) + + return ( + + {state === STATES.INITIAL && ( +
    +

    Loading...

    +
    + )} + + {state === STATES.EMPTY && ( +
    +

    No diagnostics available

    +

    Run diagnostics to generate a report

    +
    + )} + + {state === STATES.RUNNING && ( +
    +

    Running Diagnostics...

    +

    This page should refresh automatically

    +
    + )} + + {state === STATES.FAILURE && ( +
    +

    Failed to run diagnostics

    +

    Please try again. If the problem persists, contact support.

    +
    + )} + + {state === STATES.FILLED && ( +
    +
    +
    +

    Scan

    + {showPhoto('scan')} +
    +
    +

    Front

    + {showPhoto('front')} +
    +
    +
    +

    Diagnostics executed at: {dateString}

    +
    +
    + )} +
    + + +
    +
    + ) +} + +export default DiagnosticsModal diff --git a/packages/admin-ui/src/components/machineActions/GroupModal.jsx b/packages/admin-ui/src/components/machineActions/GroupModal.jsx new file mode 100644 index 0000000..6fc5db2 --- /dev/null +++ b/packages/admin-ui/src/components/machineActions/GroupModal.jsx @@ -0,0 +1,112 @@ +import { useQuery, useMutation, gql } from '@apollo/client' +import React, { useState } from 'react' +import { Autocomplete, TextField } from '@mui/material' +import Modal from '../Modal' +import { H3 } from '../typography' +import ErrorMessage from '../ErrorMessage' + +import { Button } from '../buttons' + +const MACHINE_GROUPS = gql` + query getMachineGroups { + machineGroups { + id + name + } + } +` + +const CHANGE_GROUP = gql` + mutation ChangeGroup($deviceIds: [ID!]!, $groupId: ID!) { + assignMachinesToGroup(deviceIds: $deviceIds, groupId: $groupId) + } +` + +const GroupModal = ({ onClose, deviceIds, onSuccess }) => { + const { data, loading } = useQuery(MACHINE_GROUPS) + const [selectedGroup, setSelectedGroup] = useState(null) + + const [changeGroup, { loading: mutationLoading, error }] = useMutation( + CHANGE_GROUP, + { + onCompleted: () => { + onSuccess && onSuccess() + onClose() + }, + refetchQueries: ['getMachines', 'getMachineGroups'], + }, + ) + + const handleSubmit = () => { + if (selectedGroup) { + changeGroup({ + variables: { + deviceIds: deviceIds, + groupId: selectedGroup.id, + }, + }) + } + } + + const messageClass = 'm-auto flex flex-col items-center justify-center' + + return ( + + {loading && ( +
    +

    Loading...

    +
    + )} + + {!loading && data && ( +
    +
    + { + setSelectedGroup(newValue) + }} + getOptionLabel={option => option.name || ''} + isOptionEqualToValue={(option, value) => option?.id === value?.id} + renderInput={params => ( + + )} + fullWidth + /> +
    +
    + {error && ( + + {error.graphQLErrors?.[0]?.extensions?.code === + 'RESOURCE_NOT_FOUND' + ? 'The selected group no longer exists' + : 'Failed to move machine to group'} + + )} + +
    +
    + )} +
    + ) +} + +export default GroupModal diff --git a/packages/admin-ui/src/components/machineActions/MachineActions.jsx b/packages/admin-ui/src/components/machineActions/MachineActions.jsx new file mode 100644 index 0000000..ebf97ee --- /dev/null +++ b/packages/admin-ui/src/components/machineActions/MachineActions.jsx @@ -0,0 +1,345 @@ +import { useMutation, useLazyQuery, gql } from '@apollo/client' +import GroupAddIcon from '@mui/icons-material/GroupAdd' +import EditIcon from '@mui/icons-material/Edit' +import RestartAltIcon from '@mui/icons-material/RestartAlt' +import PowerSettingsNewIcon from '@mui/icons-material/PowerSettingsNew' +import LinkOffIcon from '@mui/icons-material/LinkOff' +import BugReportIcon from '@mui/icons-material/BugReport' +import EmptyIcon from '@mui/icons-material/Remove' +import RefillIcon from '@mui/icons-material/Add' +import Visibility from '@mui/icons-material/Visibility' +import { + Menu, + MenuItem, + ListItemIcon, + ListItemText, + Divider, +} from '@mui/material' +import React, { memo, useState } from 'react' +import { useLocation } from 'wouter' +import { ConfirmDialog } from '../ConfirmDialog' + +import DiagnosticsModal from './DiagnosticsModal' +import GroupModal from './GroupModal' + +const MACHINE_ACTION = gql` + mutation MachineAction( + $deviceId: ID! + $action: MachineAction! + $newName: String + ) { + machineAction(deviceId: $deviceId, action: $action, newName: $newName) { + deviceId + } + } +` + +const MACHINE = gql` + query getMachine($deviceId: ID!) { + machine(deviceId: $deviceId) { + latestEvent { + note + } + } + } +` + +const isStaticState = machineState => { + if (!machineState) { + return true + } + const staticStates = [ + 'chooseCoin', + 'idle', + 'pendingIdle', + 'dualIdle', + 'networkDown', + 'unpaired', + 'maintenance', + 'virgin', + 'wifiList', + ] + return staticStates.includes(machineState) +} + +const getState = machineEventsLazy => + JSON.parse(machineEventsLazy.machine.latestEvent?.note ?? '{"state": null}') + .state + +const MachineActions = memo( + ({ machine, onActionSuccess, anchorEl, open, onClose, showViewAction }) => { + const [, navigate] = useLocation() + const [action, setAction] = useState({ command: null }) + const [showModal, setShowModal] = useState(false) + const [showGroupModal, setShowGroupModal] = useState(false) + const [errorMessage, setErrorMessage] = useState(null) + + const warningMessage = ( + + A user may be in the middle of a transaction and they could lose their + funds if you continue. + + ) + + const [fetchMachineEvents, { loading: loadingEvents }] = + useLazyQuery(MACHINE) + + const [simpleMachineAction] = useMutation(MACHINE_ACTION) + + const [machineAction, { loading }] = useMutation(MACHINE_ACTION, { + onError: ({ message }) => { + const errorMessage = message ?? 'An error ocurred' + setErrorMessage(errorMessage) + }, + onCompleted: () => { + onActionSuccess && onActionSuccess() + setAction({ display: action.display, command: null }) + }, + }) + + const confirmDialogOpen = Boolean(action.command) + const disabled = !!(action?.command === 'restartServices' && loadingEvents) + + const machineStatusPreflight = actionToDo => { + fetchMachineEvents({ + variables: { deviceId: machine.deviceId }, + onCompleted: machineEventsLazy => { + const message = !isStaticState(getState(machineEventsLazy)) + ? warningMessage + : null + setAction({ ...actionToDo, message }) + }, + }) + } + + const handleMenuItemClick = actionFn => { + actionFn() + onClose() + } + + return ( + <> + + {showViewAction && ( + { + navigate(`/machines/${machine.deviceId}`) + onClose() + }}> + + + + View + + )} + {showViewAction && } + + + handleMenuItemClick(() => + setAction({ + command: 'rename', + display: 'Rename', + confirmationMessage: 'Write the new name for this machine', + }), + ) + }> + + + + Rename + + + + handleMenuItemClick(() => + setAction({ + command: 'unpair', + display: 'Unpair', + }), + ) + }> + + + + Unpair + + + + + + handleMenuItemClick(() => + setAction({ + command: 'reboot', + display: 'Reboot', + }), + ) + }> + + + + Reboot + + + + handleMenuItemClick(() => + setAction({ + command: 'shutdown', + display: 'Shutdown', + message: + 'In order to bring it back online, the machine will need to be visited and its power reset.', + }), + ) + }> + + + + Shutdown + + + + handleMenuItemClick(() => { + machineStatusPreflight({ + command: 'restartServices', + display: 'Restart services for', + }) + }) + }> + + + + Restart services + + + {machine.model === 'aveiro' && [ + , + + handleMenuItemClick(() => { + setAction({ + command: 'emptyUnit', + display: 'Empty', + message: + "Triggering this action will move all cash inside the machine towards its cashbox (if possible), allowing for the collection of cash from the machine via only its cashbox. Depending on how full the cash units are, it's possible that this action will need to be used more than once to ensure that the unit is left completely empty.", + }) + }) + }> + + + + Empty Unit + , + + handleMenuItemClick(() => { + setAction({ + command: 'refillUnit', + display: 'Refill', + message: + 'Triggering this action will refill the recyclers in this machine, by using bills present in its cassettes. This action may require manual operation of the cassettes and close attention to make sure that the denominations in the cassettes match the denominations in the recyclers.', + }) + }) + }> + + + + Refill Unit + , + ]} + + + + + handleMenuItemClick(() => { + setShowModal(true) + }) + }> + + + + Diagnostics + + + + handleMenuItemClick(() => { + setShowGroupModal(true) + }) + }> + + + + Change Group + + + {showGroupModal && ( + { + setShowGroupModal(false) + }} + onSuccess={onActionSuccess} + /> + )} + {showModal && ( + + simpleMachineAction({ + variables: { + deviceId: machine.deviceId, + action: 'diagnostics', + }, + }) + } + deviceId={machine.deviceId} + onClose={() => { + setShowModal(false) + }} + /> + )} + { + setErrorMessage(null) + machineAction({ + variables: { + deviceId: machine.deviceId, + action: `${action?.command}`, + ...(action?.command === 'rename' && { newName: value }), + }, + }) + }} + onDismissed={() => { + setAction({ display: action.display, command: null }) + setErrorMessage(null) + }} + /> + + ) + }, +) + +export default MachineActions diff --git a/packages/admin-ui/src/components/single-row-table/SingleRowTable.jsx b/packages/admin-ui/src/components/single-row-table/SingleRowTable.jsx new file mode 100644 index 0000000..e2d2561 --- /dev/null +++ b/packages/admin-ui/src/components/single-row-table/SingleRowTable.jsx @@ -0,0 +1,69 @@ +import IconButton from '@mui/material/IconButton' +import SvgIcon from '@mui/material/SvgIcon' +import React from 'react' +import { Table, THead, TBody, Td, Th, Tr } from '../fake-table/Table' +import EditIcon from '../../styling/icons/action/edit/white.svg?react' + +import { Label1, P } from '../typography/index.jsx' + +const SingleRowTable = ({ + width = 378, + height = 128, + title, + items, + onEdit, + className, +}) => { + return ( + <> + + + + + + + + + +
    + {title} + + + + + +
    + {items && ( + <> + {items[0] && ( +
    + + {items[0].label} + +

    + {items[0].value} +

    +
    + )} + {items[1] && ( +
    + + {items[1].label} + +

    + {items[1].value} +

    +
    + )} + + )} +
    + + ) +} + +export default SingleRowTable diff --git a/packages/admin-ui/src/components/table/EditCell.jsx b/packages/admin-ui/src/components/table/EditCell.jsx new file mode 100644 index 0000000..a5ef831 --- /dev/null +++ b/packages/admin-ui/src/components/table/EditCell.jsx @@ -0,0 +1,17 @@ +import React, { memo } from 'react' + +import { Link } from '../buttons' +import { TableCell as Td } from './' + +const EditCell = memo(({ save, cancel }) => ( + + + Cancel + + + Save + + +)) + +export default EditCell diff --git a/packages/admin-ui/src/components/table/EmptyTable.jsx b/packages/admin-ui/src/components/table/EmptyTable.jsx new file mode 100644 index 0000000..f559c26 --- /dev/null +++ b/packages/admin-ui/src/components/table/EmptyTable.jsx @@ -0,0 +1,19 @@ +import classNames from 'classnames' +import React, { memo } from 'react' +import { H4 } from '../typography' +import EmptyTableIcon from '../../styling/icons/table/empty-table.svg?react' + +const EmptyTable = memo(({ message, className }) => { + return ( +
    + +

    {message}

    +
    + ) +}) + +export default EmptyTable diff --git a/packages/admin-ui/src/components/table/Table.jsx b/packages/admin-ui/src/components/table/Table.jsx new file mode 100644 index 0000000..c54bedd --- /dev/null +++ b/packages/admin-ui/src/components/table/Table.jsx @@ -0,0 +1,17 @@ +import classnames from 'classnames' +import React, { memo } from 'react' + +const Table = memo(({ className, children, ...props }) => { + return ( + + {children} +
    + ) +}) + +export default Table diff --git a/packages/admin-ui/src/components/table/Table.module.css b/packages/admin-ui/src/components/table/Table.module.css new file mode 100644 index 0000000..4ba9e91 --- /dev/null +++ b/packages/admin-ui/src/components/table/Table.module.css @@ -0,0 +1,3 @@ +.tableCell { + padding: 0 6px; +} diff --git a/packages/admin-ui/src/components/table/TableBody.jsx b/packages/admin-ui/src/components/table/TableBody.jsx new file mode 100644 index 0000000..ecfcb78 --- /dev/null +++ b/packages/admin-ui/src/components/table/TableBody.jsx @@ -0,0 +1,7 @@ +import React, { memo } from 'react' + +const TableBody = memo(({ children, ...props }) => ( + {children} +)) + +export default TableBody diff --git a/packages/admin-ui/src/components/table/TableCell.jsx b/packages/admin-ui/src/components/table/TableCell.jsx new file mode 100644 index 0000000..36e8501 --- /dev/null +++ b/packages/admin-ui/src/components/table/TableCell.jsx @@ -0,0 +1,24 @@ +import classnames from 'classnames' +import React, { memo } from 'react' + +import classes from './Table.module.css' + +const TableCell = memo( + ({ colspan, rightAlign, className, children, ...props }) => { + const styles = { + [classes.tableCell]: true, + 'text-right': rightAlign, + } + + return ( + + {children} + + ) + }, +) + +export default TableCell diff --git a/packages/admin-ui/src/components/table/TableHead.jsx b/packages/admin-ui/src/components/table/TableHead.jsx new file mode 100644 index 0000000..4cdb837 --- /dev/null +++ b/packages/admin-ui/src/components/table/TableHead.jsx @@ -0,0 +1,7 @@ +import React, { memo } from 'react' + +const TableHead = memo(({ children, ...props }) => ( + {children} +)) + +export default TableHead diff --git a/packages/admin-ui/src/components/table/TableHeader.jsx b/packages/admin-ui/src/components/table/TableHeader.jsx new file mode 100644 index 0000000..9653d1b --- /dev/null +++ b/packages/admin-ui/src/components/table/TableHeader.jsx @@ -0,0 +1,19 @@ +import classnames from 'classnames' +import React, { memo } from 'react' + +const TableHeaderCell = memo( + ({ rightAlign, children, className, ...props }) => { + const styles = { + 'bg-zodiac text-white py-0 px-6 h-8 text-sm text-left': true, + 'text-right': rightAlign, + } + + return ( + + {children} + + ) + }, +) + +export default TableHeaderCell diff --git a/packages/admin-ui/src/components/table/TableRow.jsx b/packages/admin-ui/src/components/table/TableRow.jsx new file mode 100644 index 0000000..a34da45 --- /dev/null +++ b/packages/admin-ui/src/components/table/TableRow.jsx @@ -0,0 +1,23 @@ +import classnames from 'classnames' +import React, { memo } from 'react' + +const TableRow = memo( + ({ className, children, header, error, success, size = 'sm', ...props }) => { + const classnamesObj = { + 'p-1 bg-white': !header, + 'h-12': !header && size !== 'sm' && size !== 'lg', + 'h-8': !header && size === 'sm', + 'h-9 font-bold text-base ': !header && size === 'lg', + 'bg-misty-rose': error, + 'bg-spring3': success, + } + + return ( + + {children} + + ) + }, +) + +export default TableRow diff --git a/packages/admin-ui/src/components/table/index.js b/packages/admin-ui/src/components/table/index.js new file mode 100644 index 0000000..85ccc33 --- /dev/null +++ b/packages/admin-ui/src/components/table/index.js @@ -0,0 +1,19 @@ +import EditCell from './EditCell' +import EmptyTable from './EmptyTable' +import Table from './Table' +import TableBody from './TableBody' +import TableCell from './TableCell' +import TableHead from './TableHead' +import TableHeader from './TableHeader' +import TableRow from './TableRow' + +export { + EditCell, + EmptyTable, + Table, + TableCell, + TableHead, + TableHeader, + TableRow, + TableBody, +} diff --git a/packages/admin-ui/src/components/tables/DataTable.jsx b/packages/admin-ui/src/components/tables/DataTable.jsx new file mode 100644 index 0000000..bb23752 --- /dev/null +++ b/packages/admin-ui/src/components/tables/DataTable.jsx @@ -0,0 +1,211 @@ +import classnames from 'classnames' +import * as R from 'ramda' +import React, { useState, useEffect } from 'react' +import { + AutoSizer, + List, + CellMeasurer, + CellMeasurerCache, +} from 'react-virtualized' +import { Table, TBody, THead, Tr, Td, Th } from '../fake-table/Table' +import { H4 } from '../typography' +import ExpandClosedIcon from '../../styling/icons/action/expand/closed.svg?react' +import ExpandOpenIcon from '../../styling/icons/action/expand/open.svg?react' + +import { EmptyTable } from '../table' + +const Row = ({ + id, + index, + elements, + data, + width, + Details, + expanded, + expandRow, + expWidth, + expandable, + onClick, + size, + ...props +}) => { + const hasPointer = onClick || expandable + const trClasses = { + 'cursor-pointer': hasPointer, + 'border-2 border-transparent': true, + 'border-2 border-zircon shadow-md': expanded, + } + + return ( +
    +
    + { + expandable && expandRow(id, data) + onClick && onClick(data) + }} + error={data.error || data.hasError || data.batchError} + shouldShowError={false} + errorMessage={data.errorMessage || data.hasError || data.batchError}> + {elements.map(({ view = it => it?.toString(), ...props }, idx) => ( + + {view(data)} + + ))} + {expandable && ( + + + + )} + +
    + {expanded && ( +
    + + +
    + + +
    + )} +
    + ) +} + +const DataTable = ({ + elements = [], + data = [], + Details, + className, + tableClassName, + expandable, + initialExpanded, + onClick, + loading, + maxWidth = 1200, + emptyText, + rowSize, + ...props +}) => { + const [expanded, setExpanded] = useState(initialExpanded) + + useEffect(() => setExpanded(initialExpanded), [initialExpanded]) + + const coreWidth = R.compose(R.sum, R.map(R.prop('width')))(elements) + const expWidth = maxWidth - coreWidth + const width = coreWidth + (expandable ? expWidth : 0) + + const expandRow = (id, data) => { + if (data.id) { + cache.clear(data.id) + setExpanded(data.id === expanded ? null : data.id) + } else { + cache.clear(id) + setExpanded(id === expanded ? null : id) + } + } + + const cache = new CellMeasurerCache({ + defaultHeight: 58, + fixedWidth: true, + }) + + function rowRenderer({ index, key, parent, style }) { + return ( + + {({ registerChild }) => ( +
    + +
    + )} +
    + ) + } + + return ( +
    + + + {elements.map(({ width, className, textAlign, header }, idx) => ( + + ))} + {expandable && } + + + {loading &&

    Loading...

    } + {!loading && R.isEmpty(data) && } + {!loading && !R.isEmpty(data) && ( + + {({ height }) => ( + + )} + + )} + +
    + {header} +
    +
    + ) +} + +export default DataTable diff --git a/packages/admin-ui/src/components/typography/index.jsx b/packages/admin-ui/src/components/typography/index.jsx new file mode 100644 index 0000000..a0776a6 --- /dev/null +++ b/packages/admin-ui/src/components/typography/index.jsx @@ -0,0 +1,119 @@ +import classnames from 'classnames' +import React from 'react' + +import styles from './typography.module.css' + +function H1({ children, noMargin, className, ...props }) { + const classNames = { + [styles.h1]: true, + [styles.noMargin]: noMargin, + [className]: !!className, + } + + return ( +

    + {children} +

    + ) +} + +function H2({ children, noMargin, className, ...props }) { + const classNames = { + [styles.h2]: true, + [styles.noMargin]: noMargin, + [className]: !!className, + } + + return ( +

    + {children} +

    + ) +} + +function H3({ children, noMargin, className, ...props }) { + const classNames = { + [styles.h3]: true, + [styles.noMargin]: noMargin, + [className]: !!className, + } + + return ( +

    + {children} +

    + ) +} + +function H4({ children, noMargin, className, ...props }) { + const classNames = { + [styles.h4]: true, + [styles.noMargin]: noMargin, + [className]: !!className, + } + + return ( +

    + {children} +

    + ) +} + +function H5({ children, noMargin, className, ...props }) { + const classNames = { + [styles.h5]: true, + [styles.noMargin]: noMargin, + [className]: !!className, + } + + return ( +
    + {children} +
    + ) +} + +const P = pBuilder('p') +const Info1 = pBuilder('info1') +const Info2 = pBuilder('info2') +const Info3 = pBuilder('info3') +const Mono = pBuilder('mono') +const TL1 = pBuilder('tl1') +const TL2 = pBuilder('tl2') +const Label1 = pBuilder('label1') +const Label2 = pBuilder('label2') +const Label3 = pBuilder('label3') + +function pBuilder(elementClass) { + return ({ inline, noMargin, className, children, ...props }) => { + const classNames = { + [className]: !!className, + [styles[elementClass]]: elementClass, + [styles.inline]: inline, + [styles.noMargin]: noMargin, + } + return ( +

    + {children} +

    + ) + } +} + +export { + H1, + H2, + H3, + H4, + H5, + TL1, + TL2, + P, + Info1, + Info2, + Info3, + Mono, + Label1, + Label2, + Label3, +} diff --git a/packages/admin-ui/src/components/typography/styles.js b/packages/admin-ui/src/components/typography/styles.js new file mode 100644 index 0000000..dc60889 --- /dev/null +++ b/packages/admin-ui/src/components/typography/styles.js @@ -0,0 +1,136 @@ +import { + fontColor, + fontSize1, + fontSize2, + fontSize3, + fontSize4, + fontSize5, + fontPrimary, + fontSecondary, + fontMonospaced, +} from '../../styling/variables' + +const base = { + color: fontColor, +} + +export default { + base: { + color: fontColor, + }, + h1: { + extend: base, + fontSize: fontSize1, + fontFamily: fontPrimary, + fontWeight: 900, + }, + h2: { + extend: base, + fontSize: fontSize2, + fontFamily: fontPrimary, + fontWeight: 900, + }, + h3: { + extend: base, + fontSize: fontSize4, + fontFamily: fontPrimary, + fontWeight: 900, + }, + h4: { + extend: base, + fontSize: fontSize4, + fontFamily: fontPrimary, + fontWeight: 700, + }, + h5: { + extend: base, + fontSize: fontSize3, + fontFamily: fontPrimary, + fontWeight: 700, + }, + p: { + ...base, + fontSize: fontSize4, + fontFamily: fontSecondary, + fontWeight: 500, + }, + tl1: { + extend: base, + fontSize: fontSize2, + fontFamily: fontSecondary, + fontWeight: 700, + }, + tl2: { + extend: base, + fontSize: fontSize4, + fontFamily: fontSecondary, + fontWeight: 700, + }, + info1: { + extend: base, + fontSize: fontSize1, + fontFamily: fontSecondary, + fontWeight: 700, + }, + info2: { + extend: base, + fontSize: fontSize3, + fontFamily: fontSecondary, + fontWeight: 700, + }, + info3: { + extend: base, + fontSize: fontSize3, + fontFamily: fontSecondary, + fontWeight: 500, + }, + mono: { + extend: base, + fontSize: fontSize4, + fontFamily: fontMonospaced, + fontWeight: 500, + }, + monoBold: { + fontWeight: 700, + }, + monoSmall: { + fontSize: fontSize5, + }, + inputFont: { + fontSize: fontSize2, + fontFamily: fontSecondary, + fontWeight: 500, + lineHeight: '110%', + color: fontColor, + }, + regularLabel: { + fontSize: fontSize4, + fontFamily: fontSecondary, + fontWeight: 500, + lineHeight: '110%', + }, + label1: { + fontSize: fontSize5, + fontFamily: fontSecondary, + fontWeight: 500, + color: fontColor, + }, + label2: { + fontSize: fontSize5, + fontFamily: fontSecondary, + fontWeight: 700, + color: fontColor, + }, + label3: { + fontSize: fontSize4, + fontFamily: fontSecondary, + fontWeight: 500, + color: fontColor, + }, + inline: { + display: 'inline', + }, + noMargin: { + margin: 0, + }, +} diff --git a/packages/admin-ui/src/components/typography/typography.module.css b/packages/admin-ui/src/components/typography/typography.module.css new file mode 100644 index 0000000..b08fa5d --- /dev/null +++ b/packages/admin-ui/src/components/typography/typography.module.css @@ -0,0 +1,140 @@ +.base { + line-height: 120%; + color: var(--zodiac); +} + +.h1 { + composes: base; + font-size: 24px; + font-family: var(--mont); + font-weight: 900; +} + +.h2 { + composes: base; + font-size: 20px; + font-family: var(--mont); + font-weight: 900; +} + +.h3 { + composes: base; + font-size: 14px; + font-family: var(--mont); + font-weight: 900; +} + +.h4 { + composes: base; + font-size: 14px; + font-family: var(--mont); + font-weight: 700; +} + +.h5 { + composes: base; + font-size: 16px; + font-family: var(--mont); + font-weight: 700; +} + +.p { + composes: base; + font-size: 14px; + font-family: var(--museo); + font-weight: 500; +} + +.tl1 { + composes: base; + font-size: 20px; + font-family: var(--museo); + font-weight: 700; +} + +.tl2 { + composes: base; + font-size: 14px; + font-family: var(--museo); + font-weight: 700; +} + +.info1 { + composes: base; + font-size: 24px; + font-family: var(--museo); + font-weight: 700; +} + +.info2 { + composes: base; + font-size: 16px; + font-family: var(--museo); + font-weight: 700; +} + +.info3 { + composes: base; + font-size: 16px; + font-family: var(--museo); + font-weight: 500; +} + +.mono { + composes: base; + font-size: 14px; + font-family: var(--bpmono); + font-weight: 500; +} + +.monoBold { + font-weight: 700; +} + +.monoSmall { + font-size: 13px; +} + +.inputFont { + font-size: 20px; + font-family: var(--museo); + font-weight: 500; + line-height: 110%; + color: var(--zodiac); +} + +.regularLabel { + font-size: 14px; + font-family: var(--museo); + font-weight: 500; + line-height: 110%; +} + +.label1 { + font-size: 13px; + font-family: var(--museo); + font-weight: 500; + color: var(--zodiac); +} + +.label2 { + font-size: 13px; + font-family: var(--museo); + font-weight: 700; + color: var(--zodiac); +} + +.label3 { + font-size: 14px; + font-family: var(--museo); + font-weight: 500; + color: var(--zodiac); +} + +.inline { + display: inline; +} + +.noMargin { + margin: 0; +} diff --git a/packages/admin-ui/src/index.jsx b/packages/admin-ui/src/index.jsx new file mode 100644 index 0000000..a035c56 --- /dev/null +++ b/packages/admin-ui/src/index.jsx @@ -0,0 +1,8 @@ +import React from 'react' +import { createRoot } from 'react-dom/client' + +import App from './App' + +const container = document.getElementById('root') +const root = createRoot(container) +root.render() diff --git a/packages/admin-ui/src/pages/AddMachine/AddMachine.jsx b/packages/admin-ui/src/pages/AddMachine/AddMachine.jsx new file mode 100644 index 0000000..b6c674a --- /dev/null +++ b/packages/admin-ui/src/pages/AddMachine/AddMachine.jsx @@ -0,0 +1,276 @@ +import { useMutation, useQuery, gql } from '@apollo/client' +import Dialog from '@mui/material/Dialog' +import DialogContent from '@mui/material/DialogContent' +import SvgIcon from '@mui/material/SvgIcon' +import IconButton from '@mui/material/IconButton' +import classnames from 'classnames' +import { Form, Formik, FastField } from 'formik' +import { QRCodeSVG as QRCode } from 'qrcode.react' +import * as R from 'ramda' +import React, { memo, useState, useEffect, useRef } from 'react' +import Title from '../../components/Title' +import Sidebar from '../../components/layout/Sidebar' +import { Info2, P } from '../../components/typography' +import CameraIcon from '../../styling/icons/ID/photo/zodiac.svg?react' +import CloseIcon from '../../styling/icons/action/close/zodiac.svg?react' +import CompleteStageIconSpring from '../../styling/icons/stage/spring/complete.svg?react' +import CompleteStageIconZodiac from '../../styling/icons/stage/zodiac/complete.svg?react' +import CurrentStageIconZodiac from '../../styling/icons/stage/zodiac/current.svg?react' +import EmptyStageIconZodiac from '../../styling/icons/stage/zodiac/empty.svg?react' +import WarningIcon from '../../styling/icons/warning-icon/comet.svg?react' +import * as Yup from 'yup' + +import { Button } from '../../components/buttons' +import { TextInput } from '../../components/inputs/formik' +import { primaryColor } from '../../styling/variables' + +const SAVE_CONFIG = gql` + mutation createPairingTotem($name: String!) { + createPairingTotem(name: $name) + } +` +const GET_MACHINES = gql` + { + machines { + name + deviceId + } + } +` + +const getSize = R.compose(R.length, R.pathOr([], ['machines'])) + +const QrCodeComponent = ({ qrCode, name, count, onPaired }) => { + const timeout = useRef(null) + const CLOSE_SCREEN_TIMEOUT = 2000 + const { data } = useQuery(GET_MACHINES, { pollInterval: 10000 }) + + useEffect(() => { + return () => { + if (timeout.current) { + clearTimeout(timeout.current) + } + } + }, []) + + const addedMachine = data?.machines?.find(m => m.name === name) + const hasNewMachine = getSize(data) > count && addedMachine + if (hasNewMachine) { + timeout.current = setTimeout( + () => onPaired(addedMachine), + CLOSE_SCREEN_TIMEOUT, + ) + } + + return ( + <> + Scan QR code with your new cryptomat +
    +
    + +
    + +

    + Snap a picture and scan +

    +
    +
    +
    +
    +
    + +
    +

    + To pair the machine you need scan the QR code with your machine. + To do this either snap a picture of this QR code or download it + through the button above and scan it with the scanning bay on your + machine. +

    +
    + {hasNewMachine && ( +
    +
    + +
    + + Machine has been successfully paired! + +
    + )} +
    +
    + + ) +} + +const initialValues = { + name: '', +} + +const validationSchema = Yup.object().shape({ + name: Yup.string() + .required('Machine name is required.') + .max(50) + .test( + 'unique-name', + 'Machine name is already in use.', + (value, context) => + !R.includes( + R.toLower(value), + R.map(R.toLower, context.options.context.machineNames), + ), + ), +}) + +const MachineNameComponent = ({ nextStep, setQrCode, setName }) => { + const [register] = useMutation(SAVE_CONFIG, { + onCompleted: ({ createPairingTotem }) => { + if (process.env.NODE_ENV === 'development') { + console.log(`totem: "${createPairingTotem}" `) + } + setQrCode(createPairingTotem) + nextStep() + }, + onError: e => console.log(e), + }) + + const { data } = useQuery(GET_MACHINES) + const machineNames = R.map(R.prop('name'), data?.machines || {}) + + const uniqueNameValidator = value => { + try { + validationSchema.validateSync(value, { + context: { machineNames: machineNames }, + }) + } catch (error) { + return error + } + } + + return ( + <> + Machine Name (ex: Coffee shop 01) + { + setName(name) + register({ variables: { name } }) + }}> + {({ errors }) => ( +
    +
    + +
    + {errors &&

    {errors.message}

    } +
    + +
    +
    + )} +
    + + ) +} + +const steps = [ + { + label: 'Machine name', + component: MachineNameComponent, + }, + { + label: 'Scan QR code', + component: QrCodeComponent, + }, +] + +const renderStepper = (step, it, idx) => { + const active = step === idx + const past = idx < step + const future = idx > step + + return ( +
    + + {it.label} + + {active && } + {past && } + {future && } + {idx < steps.length - 1 && ( +
    + )} +
    + ) +} + +const AddMachine = memo(({ close, onPaired }) => { + const { data } = useQuery(GET_MACHINES) + const [qrCode, setQrCode] = useState('') + const [name, setName] = useState('') + const [step, setStep] = useState(0) + const count = getSize(data) + + const Component = steps[step].component + + return ( +
    + + +
    +
    + Add Machine + + + + + +
    +
    + + {steps.map((it, idx) => renderStepper(step, it, idx))} + +
    + setStep(1)} + count={count} + onPaired={onPaired} + qrCode={qrCode} + setQrCode={setQrCode} + name={name} + setName={setName} + /> +
    +
    +
    +
    +
    +
    + ) +}) + +export default AddMachine diff --git a/packages/admin-ui/src/pages/AddMachine/index.js b/packages/admin-ui/src/pages/AddMachine/index.js new file mode 100644 index 0000000..aae56dd --- /dev/null +++ b/packages/admin-ui/src/pages/AddMachine/index.js @@ -0,0 +1,3 @@ +import AddMachine from './AddMachine' + +export default AddMachine diff --git a/packages/admin-ui/src/pages/Analytics/Analytics.jsx b/packages/admin-ui/src/pages/Analytics/Analytics.jsx new file mode 100644 index 0000000..13bb4de --- /dev/null +++ b/packages/admin-ui/src/pages/Analytics/Analytics.jsx @@ -0,0 +1,377 @@ +import { useQuery, gql } from '@apollo/client' +import classnames from 'classnames' +import { endOfToday } from 'date-fns' +import { subDays, format, add, startOfWeek } from 'date-fns/fp' +import * as R from 'ramda' +import React, { useState } from 'react' +import TitleSection from '../../components/layout/TitleSection' +import { Info2, P } from '../../components/typography' +import DownIcon from '../../styling/icons/dashboard/down.svg?react' +import EqualIcon from '../../styling/icons/dashboard/equal.svg?react' +import UpIcon from '../../styling/icons/dashboard/up.svg?react' + +import { Select } from '../../components/inputs' +import { fromNamespace } from '../../utils/config' +import { numberToFiatAmount } from '../../utils/number' +import { DAY, WEEK, MONTH } from '../../utils/time' + +import LegendEntry from './components/LegendEntry' +import HourOfDayWrapper from './components/wrappers/HourOfDayWrapper' +import OverTimeWrapper from './components/wrappers/OverTimeWrapper' +import TopMachinesWrapper from './components/wrappers/TopMachinesWrapper' +import VolumeOverTimeWrapper from './components/wrappers/VolumeOverTimeWrapper' + +const MACHINE_OPTIONS = [{ code: 'all', display: 'All machines' }] +const REPRESENTING_OPTIONS = [ + { code: 'overTime', display: 'Over time' }, + { code: 'volumeOverTime', display: 'Volume' }, + { code: 'topMachines', display: 'Top machines' }, + { code: 'hourOfTheDay', display: 'Hour of the day' }, +] +const PERIOD_OPTIONS = [ + { code: 'day', display: 'Last 24 hours' }, + { code: 'threeDays', display: 'Last 3 days' }, + { code: 'week', display: 'Last 7 days' }, + { code: 'month', display: 'Last 30 days' }, +] +const TIME_OPTIONS = { + day: DAY, + threeDays: 3 * DAY, + week: WEEK, + month: MONTH, +} + +const DAY_OPTIONS = R.map( + it => ({ + code: R.toLower(it), + display: it, + }), + Array.from(Array(7)).map((_, i) => + format('EEEE', add({ days: i }, startOfWeek(new Date()))), + ), +) + +const GET_TRANSACTIONS = gql` + query transactions( + $from: DateTimeISO + $until: DateTimeISO + $excludeTestingCustomers: Boolean + ) { + transactions( + from: $from + until: $until + excludeTestingCustomers: $excludeTestingCustomers + ) { + txClass + expired + sendConfirmed + dispense + hasError: error + deviceId + fiat + fiatCode + created + profit + } + } +` + +const GET_DATA = gql` + query getData { + config + machines { + name + deviceId + } + fiatRates { + code + name + rate + } + } +` + +const VerticalLine = () => ( +
    +) + +const OverviewEntry = ({ label, value, oldValue, currency }) => { + const _oldValue = !oldValue || R.equals(oldValue, 0) ? 1 : oldValue + const growthRate = ((value - oldValue) * 100) / _oldValue + + const growthClasses = { + 'font-bold': true, + 'text-malachite': R.gt(value, oldValue), + 'text-tomato': R.gt(oldValue, value), + } + + return ( +
    +

    {label}

    + + {numberToFiatAmount(value)} + {!!currency && ` ${currency}`} + + + {R.gt(growthRate, 0) && } + {R.lt(growthRate, 0) && } + {R.equals(growthRate, 0) && } +

    + {numberToFiatAmount(growthRate)}% +

    +
    +
    + ) +} + +const Analytics = () => { + const { data: txResponse, loading: txLoading } = useQuery(GET_TRANSACTIONS, { + variables: { + from: subDays(65, endOfToday()), + until: endOfToday(), + excludeTestingCustomers: true, + }, + }) + const { data: configResponse, loading: configLoading } = useQuery(GET_DATA) + + const [representing, setRepresenting] = useState(REPRESENTING_OPTIONS[0]) + const [period, setPeriod] = useState(PERIOD_OPTIONS[0]) + const [machine, setMachine] = useState(MACHINE_OPTIONS[0]) + const [selectedDay, setSelectedDay] = useState( + R.equals(representing.code, 'hourOfTheDay') ? DAY_OPTIONS[0] : null, + ) + + const loading = txLoading || configLoading + + const transactions = R.path(['transactions'])(txResponse) ?? [] + const machines = R.path(['machines'])(configResponse) ?? [] + const config = R.path(['config'])(configResponse) ?? [] + const rates = R.path(['fiatRates'])(configResponse) ?? [] + const fiatLocale = fromNamespace('locale')(config).fiatCurrency + + const timezone = config?.locale_timezone + + const convertFiatToLocale = item => { + if (item.fiatCode === fiatLocale) return item + const itemRate = R.find(R.propEq(item.fiatCode, 'code'))(rates) + const localeRate = R.find(R.propEq('code', fiatLocale))(rates) + const multiplier = localeRate?.rate / itemRate?.rate + return { ...item, fiat: parseFloat(item.fiat) * multiplier } + } + + const data = + R.map(convertFiatToLocale)( + transactions?.filter( + tx => + (!tx.dispensed || !tx.expired) && + (tx.sendConfirmed || tx.dispense) && + !tx.hasError, + ), + ) ?? [] + + const machineOptions = R.clone(MACHINE_OPTIONS) + + R.forEach( + m => machineOptions.push({ code: m.deviceId, display: m.name }), + machines, + ) + + const machineTxs = R.filter( + tx => (machine.code === 'all' ? true : tx.deviceId === machine.code), + data, + ) + + const filteredData = timeInterval => ({ + current: + machineTxs.filter(d => { + const txDay = new Date(d.created) + const isSameWeekday = !R.isNil(selectedDay) + ? R.equals(R.toLower(format('EEEE', txDay)), selectedDay.code) + : true + + return isSameWeekday && txDay >= Date.now() - TIME_OPTIONS[timeInterval] + }) ?? [], + previous: + machineTxs.filter(d => { + const txDay = new Date(d.created) + const isSameWeekday = !R.isNil(selectedDay) + ? R.equals(R.toLower(format('EEEE', txDay)), selectedDay.code) + : true + + return ( + isSameWeekday && + txDay < Date.now() - TIME_OPTIONS[timeInterval] && + txDay >= Date.now() - 2 * TIME_OPTIONS[timeInterval] + ) + }) ?? [], + }) + + const txs = { + current: filteredData(period.code).current.length, + previous: filteredData(period.code).previous.length, + } + + const median = values => (values.length === 0 ? 0 : R.median(values)) + + const medianAmount = { + current: median(R.map(d => d.fiat, filteredData(period.code).current)), + previous: median(R.map(d => d.fiat, filteredData(period.code).previous)), + } + + const txVolume = { + current: R.sum(R.map(d => d.fiat, filteredData(period.code).current)), + previous: R.sum(R.map(d => d.fiat, filteredData(period.code).previous)), + } + + const commissions = { + current: R.sum(R.map(d => d.profit, filteredData(period.code).current)), + previous: R.sum(R.map(d => d.profit, filteredData(period.code).previous)), + } + + const handleRepresentationChange = newRepresentation => { + setRepresenting(newRepresentation) + setSelectedDay( + R.equals(newRepresentation.code, 'hourOfTheDay') ? DAY_OPTIONS[0] : null, + ) + } + + const getGraphInfo = representing => { + switch (representing.code) { + case 'overTime': + return ( + + ) + case 'volumeOverTime': + return ( + + ) + case 'topMachines': + return ( + + ) + case 'hourOfTheDay': + return ( + + ) + default: + throw new Error(`There's no graph info to represent ${representing}`) + } + } + + return ( + !loading && ( + <> + +
    + + + +
    +
    +
    +
    + +
    +
    + + + + + + + +
    +
    + {getGraphInfo(representing)} + + ) + ) +} + +export default Analytics diff --git a/packages/admin-ui/src/pages/Analytics/components/LegendEntry.jsx b/packages/admin-ui/src/pages/Analytics/components/LegendEntry.jsx new file mode 100644 index 0000000..009ca4d --- /dev/null +++ b/packages/admin-ui/src/pages/Analytics/components/LegendEntry.jsx @@ -0,0 +1,14 @@ +import React from 'react' +import { P } from '../../../components/typography' + +const LegendEntry = ({ IconElement, IconComponent, label }) => { + return ( + + {!!IconComponent && } + {!!IconElement && IconElement} +

    {label}

    +
    + ) +} + +export default LegendEntry diff --git a/packages/admin-ui/src/pages/Analytics/components/tooltips/GraphTooltip.jsx b/packages/admin-ui/src/pages/Analytics/components/tooltips/GraphTooltip.jsx new file mode 100644 index 0000000..1349fcb --- /dev/null +++ b/packages/admin-ui/src/pages/Analytics/components/tooltips/GraphTooltip.jsx @@ -0,0 +1,73 @@ +import Paper from '@mui/material/Paper' +import * as R from 'ramda' +import React, { memo } from 'react' +import { Info2, Label3, P } from '../../../../components/typography' +import TxInIcon from '../../../../styling/icons/direction/cash-in.svg?react' +import TxOutIcon from '../../../../styling/icons/direction/cash-out.svg?react' + +import { numberToFiatAmount } from '../../../../utils/number' +import { singularOrPlural } from '../../../../utils/string' +import { formatDate, formatDateNonUtc } from '../../../../utils/timezones' + +const GraphTooltip = ({ + coords, + data, + dateInterval, + currency, + representing, +}) => { + const formattedDateInterval = !R.includes('hourOfDay', representing.code) + ? [ + formatDate(dateInterval[1], null, 'MMM d'), + formatDate(dateInterval[1], null, 'HH:mm'), + formatDate(dateInterval[0], null, 'HH:mm'), + ] + : [ + formatDate(dateInterval[1], null, 'MMM d'), + formatDateNonUtc(dateInterval[1], 'HH:mm'), + formatDateNonUtc(dateInterval[0], 'HH:mm'), + ] + + const transactions = R.reduce( + (acc, value) => { + acc.volume += parseInt(value.fiat) + if (value.txClass === 'cashIn') acc.cashIn++ + if (value.txClass === 'cashOut') acc.cashOut++ + return acc + }, + { volume: 0, cashIn: 0, cashOut: 0 }, + data, + ) + + return ( + + {!R.includes('hourOfDay', representing.code) && ( + {`${formattedDateInterval[0]}`} + )} + + {`${formattedDateInterval[1]} - ${formattedDateInterval[2]}`} + +

    + {R.length(data)}{' '} + {singularOrPlural(R.length(data), 'transaction', 'transactions')} +

    +

    + {numberToFiatAmount(transactions.volume)} {currency} in volume +

    +
    + + + {transactions.cashIn} cash-in + + + + {transactions.cashOut} cash-out + +
    +
    + ) +} + +export default memo(GraphTooltip, (prev, next) => prev.coords === next.coords) diff --git a/packages/admin-ui/src/pages/Analytics/components/wrappers/HourOfDayWrapper.jsx b/packages/admin-ui/src/pages/Analytics/components/wrappers/HourOfDayWrapper.jsx new file mode 100644 index 0000000..b0aa962 --- /dev/null +++ b/packages/admin-ui/src/pages/Analytics/components/wrappers/HourOfDayWrapper.jsx @@ -0,0 +1,124 @@ +import { getTimezoneOffset } from 'date-fns-tz' +import * as R from 'ramda' +import React, { useState } from 'react' +import { H2 } from '../../../../components/typography' + +import { Select } from '../../../../components/inputs' +import { MINUTE } from '../../../../utils/time' + +import Graph from '../../graphs/Graph' +import LegendEntry from '../LegendEntry' +import classes from './wrappers.module.css' + +const options = [ + { code: 'hourOfDayTransactions', display: 'Transactions' }, + { code: 'hourOfDayVolume', display: 'Volume' }, +] + +const HourOfDayBarGraphHeader = ({ + title, + period, + data, + machines, + selectedMachine, + handleMachineChange, + selectedDay, + dayOptions, + handleDayChange, + timezone, + currency, +}) => { + const [graphType /*, setGraphType */] = useState(options[0].code) + + const legend = { + cashIn:
    , + cashOut:
    , + } + + const offset = getTimezoneOffset(timezone) + + const txsPerWeekday = R.reduce( + (acc, value) => { + const created = new Date(value.created) + created.setTime( + created.getTime() + created.getTimezoneOffset() * MINUTE + offset, + ) + switch (created.getDay()) { + case 0: + acc.sunday.push(value) + break + case 1: + acc.monday.push(value) + break + case 2: + acc.tuesday.push(value) + break + case 3: + acc.wednesday.push(value) + break + case 4: + acc.thursday.push(value) + break + case 5: + acc.friday.push(value) + break + case 6: + acc.saturday.push(value) + break + default: + throw new Error('Day of week not recognized') + } + return acc + }, + R.fromPairs(R.map(it => [it.code, []], dayOptions)), + data, + ) + + return ( + <> +
    +
    +

    {title}

    +
    + + +
    +
    +
    + {/* setGraphType(e.target.value)} + /> */} + +
    +
    + it.code === graphType)(options)} + period={period} + data={txsPerWeekday[selectedDay.code]} + timezone={timezone} + currency={currency} + selectedMachine={selectedMachine} + machines={machines} + selectedDay={selectedDay} + /> + + ) +} + +export default HourOfDayBarGraphHeader diff --git a/packages/admin-ui/src/pages/Analytics/components/wrappers/OverTimeWrapper.jsx b/packages/admin-ui/src/pages/Analytics/components/wrappers/OverTimeWrapper.jsx new file mode 100644 index 0000000..2174f7b --- /dev/null +++ b/packages/admin-ui/src/pages/Analytics/components/wrappers/OverTimeWrapper.jsx @@ -0,0 +1,89 @@ +import Switch from '@mui/material/Switch' +import React, { useState } from 'react' +import { H2, Label1 } from '../../../../components/typography' + +import { Select } from '../../../../components/inputs' +import { primaryColor } from '../../../../styling/variables' + +import Graph from '../../graphs/Graph' +import LegendEntry from '../LegendEntry' +import classes from './wrappers.module.css' + +const OverTimeDotGraphHeader = ({ + title, + representing, + period, + data, + machines, + selectedMachine, + handleMachineChange, + timezone, + currency, +}) => { + const [logarithmic, setLogarithmic] = useState() + + const legend = { + cashIn:
    , + cashOut:
    , + transaction:
    , + median: ( + + + + ), + } + + return ( + <> +
    +
    +

    {title}

    +
    + + + + +
    +
    +
    +
    + + Log. scale + + setLogarithmic(event.target.checked)} + /> +
    + +
    +
    + + + ) +} + +export default VolumeOverTimeGraphHeader diff --git a/packages/admin-ui/src/pages/Analytics/components/wrappers/wrappers.module.css b/packages/admin-ui/src/pages/Analytics/components/wrappers/wrappers.module.css new file mode 100644 index 0000000..7cd5319 --- /dev/null +++ b/packages/admin-ui/src/pages/Analytics/components/wrappers/wrappers.module.css @@ -0,0 +1,56 @@ +.graphHeaderWrapper { + display: flex; + justify-content: space-between; + margin-bottom: 40px; +} + +.graphHeaderLeft { + display: flex; + flex-direction: column; +} + +.graphHeaderRight { + margin-top: 15px; + display: flex; + gap: 30px; +} + +.cashInIcon { + width: 12px; + height: 12px; + border-radius: 12px; + background-color: var(--java); +} + +.cashOutIcon { + width: 12px; + height: 12px; + border-radius: 12px; + background-color: var(--neon); +} + +.graphLegend { + display: flex; + align-items: center; + gap: 24px; +} + +.txIcon { + width: 12px; + height: 12px; + border-radius: 12px; + background-color: #000; +} + +.graphHeaderSwitchBox { + display: flex; + flex-direction: column; + /*'& > *': {*/ + /* margin: 0*/ + /*},*/ + /*'& > :first-child': {*/ + /* marginBottom: 2,*/ + /* extend: label1,*/ + /* color: offColor*/ + /*}*/ +} diff --git a/packages/admin-ui/src/pages/Analytics/graphs/Graph.jsx b/packages/admin-ui/src/pages/Analytics/graphs/Graph.jsx new file mode 100644 index 0000000..d6c85f3 --- /dev/null +++ b/packages/admin-ui/src/pages/Analytics/graphs/Graph.jsx @@ -0,0 +1,135 @@ +import * as R from 'ramda' +import React, { memo, useState } from 'react' + +import GraphTooltip from '../components/tooltips/GraphTooltip' + +import HourOfDayBarGraph from './HourOfDayBarGraph' +import OverTimeDotGraph from './OverTimeDotGraph' +import OverTimeLineGraph from './OverTimeLineGraph' +import TopMachinesBarGraph from './TopMachinesBarGraph' + +const GraphWrapper = ({ + data, + representing, + period, + timezone, + currency, + selectedMachine, + machines, + selectedDay, + log, +}) => { + const [selectionCoords, setSelectionCoords] = useState(null) + const [selectionDateInterval, setSelectionDateInterval] = useState(null) + const [selectionData, setSelectionData] = useState(null) + + const getGraph = representing => { + switch (representing.code) { + case 'overTime': + return ( + + ) + case 'volumeOverTime': + return ( + + ) + case 'topMachinesVolume': + return ( + it.code !== 'all', machines)} + currency={currency} + /> + ) + case 'topMachinesTransactions': + return ( + it.code !== 'all', machines)} + currency={currency} + /> + ) + case 'hourOfDayVolume': + return ( + it.code !== 'all', machines)} + currency={currency} + selectedDay={selectedDay} + /> + ) + case 'hourOfDayTransactions': + return ( + it.code !== 'all', machines)} + currency={currency} + selectedDay={selectedDay} + /> + ) + default: + throw new Error(`There's no graph to represent ${representing}`) + } + } + + return ( +
    + {!R.isNil(selectionCoords) && ( + + )} + {getGraph(representing)} +
    + ) +} + +export default memo(GraphWrapper) diff --git a/packages/admin-ui/src/pages/Analytics/graphs/HourOfDayBarGraph.jsx b/packages/admin-ui/src/pages/Analytics/graphs/HourOfDayBarGraph.jsx new file mode 100644 index 0000000..0394e41 --- /dev/null +++ b/packages/admin-ui/src/pages/Analytics/graphs/HourOfDayBarGraph.jsx @@ -0,0 +1,436 @@ +import BigNumber from 'bignumber.js' +import * as d3 from 'd3' +import { getTimezoneOffset } from 'date-fns-tz' +import { add, startOfDay } from 'date-fns/fp' +import * as R from 'ramda' +import React, { memo, useCallback, useEffect, useMemo, useRef } from 'react' + +import { + java, + neon, + subheaderDarkColor, + fontColor, + fontSecondary, + subheaderColor, +} from '../../../styling/variables' +import { MINUTE } from '../../../utils/time' +import { toUtc } from '../../../utils/timezones' + +const Graph = ({ + data, + timezone, + setSelectionCoords, + setSelectionData, + setSelectionDateInterval, +}) => { + const ref = useRef(null) + + const GRAPH_POPOVER_WIDTH = 150 + const GRAPH_POPOVER_MARGIN = 25 + const BAR_MARGIN = 10 + const GRAPH_HEIGHT = 401 + const GRAPH_WIDTH = 1163 + const GRAPH_MARGIN = useMemo( + () => ({ + top: 25, + right: 0.5, + bottom: 27, + left: 36.5, + }), + [], + ) + + const offset = getTimezoneOffset(timezone) + + const getTickIntervals = (domain, interval) => { + const ticks = [] + const start = new Date(domain[0]) + const end = new Date(domain[1]) + + const step = R.clone(start) + + while (step <= end) { + ticks.push(R.clone(step)) + step.setUTCHours(step.getUTCHours() + interval) + } + + return ticks + } + + const filterByHourInterval = useCallback( + (lowerBound, upperBound) => + R.filter(it => { + const tzCreated = new Date(it.created).setTime( + new Date(it.created).getTime() + + new Date(it.created).getTimezoneOffset() * MINUTE + + offset, + ) + const created = new Date(tzCreated) + + return ( + (lowerBound.getUTCHours() < upperBound.getUTCHours() && + created.getUTCHours() >= new Date(lowerBound).getUTCHours() && + created.getUTCHours() < new Date(upperBound).getUTCHours()) || + (lowerBound.getUTCHours() > upperBound.getUTCHours() && + created.getUTCHours() <= new Date(lowerBound).getUTCHours() && + created.getUTCHours() < new Date(upperBound).getUTCHours()) + ) + }, data), + [data, offset], + ) + + const txClassByHourInterval = useCallback( + (lowerBound, upperBound) => + R.reduce( + (acc, value) => { + if (value.txClass === 'cashIn') + acc.cashIn += BigNumber(value.fiat).toNumber() + if (value.txClass === 'cashOut') + acc.cashOut += BigNumber(value.fiat).toNumber() + return acc + }, + { cashIn: 0, cashOut: 0 }, + filterByHourInterval(lowerBound, upperBound), + ), + [filterByHourInterval], + ) + + const x = d3 + .scaleUtc() + .domain([ + toUtc(startOfDay(new Date())), + toUtc(add({ days: 1 }, startOfDay(new Date()))), + ]) + .rangeRound([GRAPH_MARGIN.left, GRAPH_WIDTH - GRAPH_MARGIN.right]) + + const groupedByDateInterval = R.map( + it => { + const lowerBound = R.clone(it) + it.setUTCHours(it.getUTCHours() + 2) + const upperBound = R.clone(it) + return [lowerBound, filterByHourInterval(lowerBound, upperBound)] + }, + R.init(getTickIntervals(x.domain(), 2)), + ) + + const groupedByTxClass = R.map( + it => { + const lowerBound = R.clone(it) + it.setUTCHours(it.getUTCHours() + 2) + const upperBound = R.clone(it) + return [lowerBound, txClassByHourInterval(lowerBound, upperBound)] + }, + R.init(getTickIntervals(x.domain(), 2)), + ) + + const y = d3 + .scaleLinear() + .domain([ + 0, + d3.max( + groupedByTxClass.map(it => it[1]), + d => d.cashIn + d.cashOut, + ) !== 0 + ? d3.max( + groupedByTxClass.map(it => it[1]), + d => d.cashIn + d.cashOut, + ) + : 50, + ]) + .range([GRAPH_HEIGHT - GRAPH_MARGIN.bottom, GRAPH_MARGIN.top]) + + const buildXAxis = useCallback( + g => + g + .attr( + 'transform', + `translate(0, ${GRAPH_HEIGHT - GRAPH_MARGIN.bottom})`, + ) + .call( + d3 + .axisBottom(x) + .ticks(d3.timeHour.every(2)) + .tickFormat(d3.timeFormat('%H:%M')), + ), + [GRAPH_MARGIN, x], + ) + + const buildYAxis = useCallback( + g => + g + .attr('transform', `translate(${GRAPH_MARGIN.left}, 0)`) + .call( + d3 + .axisLeft(y) + .ticks(GRAPH_HEIGHT / 100) + .tickSize(0) + .tickFormat(``), + ) + .call(g => g.select('.domain').remove()), + [GRAPH_MARGIN, y], + ) + + const buildVerticalLines = useCallback( + g => + g + .attr('stroke', subheaderDarkColor) + .append('g') + .selectAll('line') + .data(getTickIntervals(x.domain(), 2)) + .join('line') + .attr('x1', d => { + const xValue = x(d) + const intervals = getTickIntervals(x.domain(), 2) + return xValue === x(intervals[R.length(intervals) - 1]) + ? xValue - 1 + : 0.5 + xValue + }) + .attr('x2', d => { + const xValue = x(d) + const intervals = getTickIntervals(x.domain(), 2) + return xValue === x(intervals[R.length(intervals) - 1]) + ? xValue - 1 + : 0.5 + xValue + }) + .attr('y1', GRAPH_MARGIN.top) + .attr('y2', GRAPH_HEIGHT - GRAPH_MARGIN.bottom), + [GRAPH_MARGIN, x], + ) + + const buildHoverableEventRects = useCallback( + g => + g + .append('g') + .selectAll('line') + .data(getTickIntervals(x.domain(), 2)) + .join('rect') + .attr('x', d => x(d)) + .attr('y', GRAPH_MARGIN.top) + .attr('width', d => { + const xValue = Math.round(x(d) * 100) / 100 + const ticks = getTickIntervals(x.domain(), 2).map(it => x(it)) + + const index = R.findIndex(it => it === xValue, ticks) + const width = + index + 1 === R.length(ticks) ? 0 : ticks[index + 1] - ticks[index] + + return Math.round(width * 100) / 100 + }) + .attr('height', GRAPH_HEIGHT - GRAPH_MARGIN.bottom - GRAPH_MARGIN.top) + .attr('stroke', 'transparent') + .attr('fill', 'transparent') + .on('mouseover', d => { + const date = R.clone(new Date(d.target.__data__)) + const startDate = R.clone(date) + date.setUTCHours(date.getUTCHours() + 2) + const endDate = R.clone(date) + + const filteredData = groupedByDateInterval.find(it => + R.equals(startDate, it[0]), + )[1] + + const rectXCoords = { + left: R.clone(d.target.getBoundingClientRect().x), + right: R.clone( + d.target.getBoundingClientRect().x + + d.target.getBoundingClientRect().width, + ), + } + + const xCoord = + d.target.x.baseVal.value < 0.75 * GRAPH_WIDTH + ? rectXCoords.right + GRAPH_POPOVER_MARGIN + : rectXCoords.left - GRAPH_POPOVER_WIDTH - GRAPH_POPOVER_MARGIN + const yCoord = R.clone(d.target.getBoundingClientRect().y) + + setSelectionDateInterval([endDate, startDate]) + setSelectionData(filteredData) + setSelectionCoords({ + x: Math.round(xCoord), + y: Math.round(yCoord), + }) + + d3.select(`#event-rect-${x(d.target.__data__)}`).attr( + 'fill', + subheaderColor, + ) + }) + .on('mouseleave', d => { + d3.select(`#event-rect-${x(d.target.__data__)}`).attr( + 'fill', + 'transparent', + ) + setSelectionDateInterval(null) + setSelectionData(null) + setSelectionCoords(null) + }), + [ + GRAPH_MARGIN, + groupedByDateInterval, + setSelectionCoords, + setSelectionData, + setSelectionDateInterval, + x, + ], + ) + + const buildEventRects = useCallback( + g => + g + .append('g') + .selectAll('line') + .data(getTickIntervals(x.domain(), 2)) + .join('rect') + .attr('id', d => `event-rect-${x(d)}`) + .attr('x', d => x(d)) + .attr('y', GRAPH_MARGIN.top) + .attr('width', d => { + const xValue = Math.round(x(d) * 100) / 100 + const ticks = getTickIntervals(x.domain(), 2).map(it => x(it)) + + const index = R.findIndex(it => it === xValue, ticks) + const width = + index + 1 === R.length(ticks) ? 0 : ticks[index + 1] - ticks[index] + + return Math.round(width * 100) / 100 + }) + .attr('height', GRAPH_HEIGHT - GRAPH_MARGIN.bottom - GRAPH_MARGIN.top) + .attr('stroke', 'transparent') + .attr('fill', 'transparent'), + [GRAPH_MARGIN, x], + ) + + const formatTicksText = useCallback( + () => + d3 + .selectAll('.tick text') + .style('stroke', fontColor) + .style('fill', fontColor) + .style('stroke-width', 0.5) + .style('font-family', fontSecondary), + [], + ) + + const drawCashIn = useCallback( + g => { + g.selectAll('rect') + .data(R.init(getTickIntervals(x.domain(), 2))) + .join('rect') + .attr('stroke', java) + .attr('fill', java) + .attr('x', d => { + return x(d) + BAR_MARGIN / 2 + }) + .attr('y', d => { + const interval = R.find(it => R.equals(it[0], d), groupedByTxClass) + return y(interval[1].cashIn) - GRAPH_MARGIN.top + GRAPH_MARGIN.bottom + }) + .attr('height', d => { + const interval = R.find(it => R.equals(it[0], d), groupedByTxClass) + return R.clamp( + 0, + GRAPH_HEIGHT, + GRAPH_HEIGHT - + y(interval[1].cashIn) - + GRAPH_MARGIN.bottom - + BAR_MARGIN / 2, + ) + }) + .attr('width', d => { + const xValue = Math.round(x(d) * 100) / 100 + const ticks = getTickIntervals(x.domain(), 2).map(it => x(it)) + + const index = R.findIndex(it => it === xValue, ticks) + const width = + index === R.length(ticks) ? 0 : ticks[index + 1] - ticks[index] + return Math.round((width - BAR_MARGIN) * 100) / 100 + }) + .attr('rx', 2.5) + }, + [x, y, GRAPH_MARGIN, groupedByTxClass], + ) + + const drawCashOut = useCallback( + g => { + g.selectAll('rect') + .data(R.init(getTickIntervals(x.domain(), 2))) + .join('rect') + .attr('stroke', neon) + .attr('fill', neon) + .attr('x', d => { + return x(d) + BAR_MARGIN / 2 + }) + .attr('y', d => { + const interval = R.find(it => R.equals(it[0], d), groupedByTxClass) + return ( + y(interval[1].cashIn + interval[1].cashOut) - + GRAPH_MARGIN.top + + GRAPH_MARGIN.bottom + ) + }) + .attr('height', d => { + const interval = R.find(it => R.equals(it[0], d), groupedByTxClass) + return R.clamp( + 0, + GRAPH_HEIGHT, + GRAPH_HEIGHT - + y(interval[1].cashOut) - + GRAPH_MARGIN.bottom - + BAR_MARGIN / 2, + ) + }) + .attr('width', d => { + const xValue = Math.round(x(d) * 100) / 100 + const ticks = getTickIntervals(x.domain(), 2).map(it => x(it)) + + const index = R.findIndex(it => it === xValue, ticks) + const width = + index === R.length(ticks) ? 0 : ticks[index + 1] - ticks[index] + return Math.round((width - BAR_MARGIN) * 100) / 100 + }) + .attr('rx', 2.5) + }, + [x, y, GRAPH_MARGIN, groupedByTxClass], + ) + + const drawChart = useCallback(() => { + const svg = d3 + .select(ref.current) + .attr('viewBox', [0, 0, GRAPH_WIDTH, GRAPH_HEIGHT]) + + svg.append('g').call(buildXAxis) + svg.append('g').call(buildYAxis) + svg.append('g').call(buildVerticalLines) + svg.append('g').call(buildEventRects) + svg.append('g').call(formatTicksText) + svg.append('g').call(drawCashIn) + svg.append('g').call(drawCashOut) + svg.append('g').call(buildHoverableEventRects) + + return svg.node() + }, [ + buildXAxis, + buildYAxis, + buildEventRects, + buildHoverableEventRects, + buildVerticalLines, + drawCashIn, + formatTicksText, + drawCashOut, + ]) + + useEffect(() => { + d3.select(ref.current).selectAll('*').remove() + drawChart() + }, [drawChart]) + + return +} + +export default memo( + Graph, + (prev, next) => + R.equals(prev.period, next.period) && + R.equals(prev.selectedDay, next.selectedDay) && + R.equals(prev.selectedMachine, next.selectedMachine), +) diff --git a/packages/admin-ui/src/pages/Analytics/graphs/OverTimeDotGraph.jsx b/packages/admin-ui/src/pages/Analytics/graphs/OverTimeDotGraph.jsx new file mode 100644 index 0000000..168c80b --- /dev/null +++ b/packages/admin-ui/src/pages/Analytics/graphs/OverTimeDotGraph.jsx @@ -0,0 +1,570 @@ +import BigNumber from 'bignumber.js' +import * as d3 from 'd3' +import { getTimezoneOffset } from 'date-fns-tz' +import { add, format, startOfWeek, startOfYear } from 'date-fns/fp' +import * as R from 'ramda' +import React, { memo, useCallback, useEffect, useMemo, useRef } from 'react' + +import { + java, + neon, + subheaderDarkColor, + offColor, + fontColor, + primaryColor, + fontSecondary, + subheaderColor, +} from '../../../styling/variables' +import { numberToFiatAmount } from '../../../utils/number' +import { MINUTE, DAY, WEEK, MONTH } from '../../../utils/time' + +const Graph = ({ + data, + period, + timezone, + setSelectionCoords, + setSelectionData, + setSelectionDateInterval, + log = false, +}) => { + const ref = useRef(null) + + const GRAPH_POPOVER_WIDTH = 150 + const GRAPH_POPOVER_MARGIN = 25 + const GRAPH_HEIGHT = 401 + const GRAPH_WIDTH = 1163 + const GRAPH_MARGIN = useMemo( + () => ({ + top: 25, + right: 3.5, + bottom: 27, + left: 38, + }), + [], + ) + + const offset = getTimezoneOffset(timezone) + const NOW = Date.now() + offset + + const periodDomains = { + day: [NOW - DAY, NOW], + threeDays: [NOW - 3 * DAY, NOW], + week: [NOW - WEEK, NOW], + month: [NOW - MONTH, NOW], + } + + const dataPoints = useMemo( + () => ({ + day: { + freq: 24, + step: 60 * 60 * 1000, + tick: d3.utcHour.every(1), + labelFormat: '%H:%M', + }, + threeDays: { + freq: 12, + step: 6 * 60 * 60 * 1000, + tick: d3.utcDay.every(1), + labelFormat: '%a %d', + }, + week: { + freq: 7, + step: 24 * 60 * 60 * 1000, + tick: d3.utcDay.every(1), + labelFormat: '%a %d', + }, + month: { + freq: 30, + step: 24 * 60 * 60 * 1000, + tick: d3.utcDay.every(1), + labelFormat: '%d', + }, + }), + [], + ) + + const getPastAndCurrentDayLabels = useCallback(d => { + const currentDate = new Date(d) + const currentDateDay = currentDate.getUTCDate() + const currentDateWeekday = currentDate.getUTCDay() + const currentDateMonth = currentDate.getUTCMonth() + + const previousDate = new Date(currentDate.getTime()) + previousDate.setUTCDate(currentDateDay - 1) + + const previousDateDay = previousDate.getUTCDate() + const previousDateWeekday = previousDate.getUTCDay() + const previousDateMonth = previousDate.getUTCMonth() + + const daysOfWeek = Array.from(Array(7)).map((_, i) => + format('EEE', add({ days: i }, startOfWeek(new Date()))), + ) + + const months = Array.from(Array(12)).map((_, i) => + format('LLL', add({ months: i }, startOfYear(new Date()))), + ) + + return { + previous: + currentDateMonth !== previousDateMonth + ? months[previousDateMonth] + : `${daysOfWeek[previousDateWeekday]} ${previousDateDay}`, + current: + currentDateMonth !== previousDateMonth + ? months[currentDateMonth] + : `${daysOfWeek[currentDateWeekday]} ${currentDateDay}`, + } + }, []) + + const buildTicks = useCallback( + domain => { + const points = [] + + const roundDate = d => { + const step = dataPoints[period.code].step + return new Date(Math.ceil(d.valueOf() / step) * step) + } + + for (let i = 0; i <= dataPoints[period.code].freq; i++) { + const stepDate = new Date(NOW - i * dataPoints[period.code].step) + if (roundDate(stepDate) > domain[1]) continue + if (stepDate < domain[0]) continue + points.push(roundDate(stepDate)) + } + + return points + }, + [NOW, dataPoints, period.code], + ) + + const buildAreas = useCallback( + domain => { + const points = [] + + points.push(domain[1]) + + const roundDate = d => { + const step = dataPoints[period.code].step + return new Date(Math.ceil(d.valueOf() / step) * step) + } + + for (let i = 0; i <= dataPoints[period.code].freq; i++) { + const stepDate = new Date(NOW - i * dataPoints[period.code].step) + if (roundDate(stepDate) > new Date(domain[1])) continue + if (stepDate < new Date(domain[0])) continue + points.push(roundDate(stepDate)) + } + + points.push(domain[0]) + + return points + }, + [NOW, dataPoints, period.code], + ) + + const x = d3 + .scaleUtc() + .domain(periodDomains[period.code]) + .range([GRAPH_MARGIN.left, GRAPH_WIDTH - GRAPH_MARGIN.right]) + + // Create a second X axis for mouseover events to be placed correctly across the entire graph width and not limited by X's domain + const x2 = d3 + .scaleUtc() + .domain(periodDomains[period.code]) + .range([GRAPH_MARGIN.left, GRAPH_WIDTH]) + + const yLin = d3 + .scaleLinear() + .domain([ + 0, + (d3.max(data, d => new BigNumber(d.fiat).toNumber()) ?? 1000) * 1.03, + ]) + .nice() + .range([GRAPH_HEIGHT - GRAPH_MARGIN.bottom, GRAPH_MARGIN.top]) + + const yLog = d3 + .scaleLog() + .domain([ + (d3.min(data, d => new BigNumber(d.fiat).toNumber()) ?? 1) * 0.9, + (d3.max(data, d => new BigNumber(d.fiat).toNumber()) ?? 1000) * 1.1, + ]) + .range([GRAPH_HEIGHT - GRAPH_MARGIN.bottom, GRAPH_MARGIN.top]) + + const y = log ? yLog : yLin + + const getAreaInterval = (breakpoints, dataLimits, graphLimits) => { + const fullBreakpoints = [ + graphLimits[1], + ...R.filter(it => it > dataLimits[0] && it < dataLimits[1], breakpoints), + dataLimits[0], + ] + + const intervals = [] + for (let i = 0; i < fullBreakpoints.length - 1; i++) { + intervals.push([fullBreakpoints[i], fullBreakpoints[i + 1]]) + } + + return intervals + } + + const getAreaIntervalByX = (intervals, xValue) => { + return R.find(it => xValue <= it[0] && xValue >= it[1], intervals) ?? [0, 0] + } + + const getDateIntervalByX = (areas, intervals, xValue) => { + const flattenIntervals = R.uniq(R.flatten(intervals)) + + // flattenIntervals and areas should have the same number of elements + for (let i = intervals.length - 1; i >= 0; i--) { + if (xValue < flattenIntervals[i]) { + return [areas[i], areas[i + 1]] + } + } + } + + const buildXAxis = useCallback( + g => + g + .attr( + 'transform', + `translate(0, ${GRAPH_HEIGHT - GRAPH_MARGIN.bottom})`, + ) + .call( + d3 + .axisBottom(x) + .ticks(dataPoints[period.code].tick) + .tickFormat(d => { + return d3.timeFormat(dataPoints[period.code].labelFormat)( + d.getTime() + d.getTimezoneOffset() * MINUTE, + ) + }) + .tickSizeOuter(0), + ) + .call(g => + g + .select('.domain') + .attr('stroke', primaryColor) + .attr('stroke-width', 1), + ), + [GRAPH_MARGIN, dataPoints, period.code, x], + ) + + const buildYAxis = useCallback( + g => + g + .attr('transform', `translate(${GRAPH_MARGIN.left}, 0)`) + .call( + d3 + .axisLeft(y) + .ticks(GRAPH_HEIGHT / 100) + .tickSizeOuter(0) + .tickFormat(d => { + if (log && !['1', '2', '5'].includes(d.toString()[0])) return '' + + if (d >= 1000) return numberToFiatAmount(d / 1000) + 'k' + + return numberToFiatAmount(d) + }), + ) + .select('.domain') + .attr('stroke', primaryColor) + .attr('stroke-width', 1), + [GRAPH_MARGIN, y, log], + ) + + const buildGrid = useCallback( + g => { + g.attr('stroke', subheaderDarkColor) + .attr('fill', subheaderDarkColor) + // Vertical lines + .call(g => + g + .append('g') + .selectAll('line') + .data(buildTicks(x.domain())) + .join('line') + .attr('x1', d => 0.5 + x(d)) + .attr('x2', d => 0.5 + x(d)) + .attr('y1', GRAPH_MARGIN.top) + .attr('y2', GRAPH_HEIGHT - GRAPH_MARGIN.bottom), + ) + // Horizontal lines + .call(g => + g + .append('g') + .selectAll('line') + .data( + d3 + .axisLeft(y) + .scale() + .ticks(GRAPH_HEIGHT / 100), + ) + .join('line') + .attr('y1', d => 0.5 + y(d)) + .attr('y2', d => 0.5 + y(d)) + .attr('x1', GRAPH_MARGIN.left) + .attr('x2', GRAPH_WIDTH), + ) + // Vertical transparent rectangles for events + .call(g => + g + .append('g') + .selectAll('line') + .data(buildAreas(x.domain())) + .join('rect') + .attr('x', d => x(d)) + .attr('y', GRAPH_MARGIN.top) + .attr('width', d => { + const xValue = Math.round(x(d) * 100) / 100 + const intervals = getAreaInterval( + buildAreas(x.domain()).map(it => Math.round(x(it) * 100) / 100), + x.range(), + x2.range(), + ) + const interval = getAreaIntervalByX(intervals, xValue) + return Math.round((interval[0] - interval[1]) * 100) / 100 + }) + .attr( + 'height', + GRAPH_HEIGHT - GRAPH_MARGIN.bottom - GRAPH_MARGIN.top, + ) + .attr('stroke', 'transparent') + .attr('fill', 'transparent') + .on('mouseover', d => { + const xValue = Math.round(d.target.x.baseVal.value * 100) / 100 + const areas = buildAreas(x.domain()) + const intervals = getAreaInterval( + buildAreas(x.domain()).map(it => Math.round(x(it) * 100) / 100), + x.range(), + x2.range(), + ) + + const dateInterval = getDateIntervalByX(areas, intervals, xValue) + if (!dateInterval) return + const filteredData = data.filter(it => { + const created = new Date(it.created) + const tzCreated = created.setTime(created.getTime() + offset) + return ( + tzCreated > new Date(dateInterval[1]) && + tzCreated <= new Date(dateInterval[0]) + ) + }) + + const rectXCoords = { + left: R.clone(d.target.getBoundingClientRect().x), + right: R.clone( + d.target.getBoundingClientRect().x + + d.target.getBoundingClientRect().width, + ), + } + + const xCoord = + d.target.x.baseVal.value < 0.75 * GRAPH_WIDTH + ? rectXCoords.right + GRAPH_POPOVER_MARGIN + : rectXCoords.left - + GRAPH_POPOVER_WIDTH - + GRAPH_POPOVER_MARGIN + const yCoord = R.clone(d.target.getBoundingClientRect().y) + + setSelectionDateInterval(dateInterval) + setSelectionData(filteredData) + setSelectionCoords({ + x: Math.round(xCoord), + y: Math.round(yCoord), + }) + + d3.select(d.target).attr('fill', subheaderColor) + }) + .on('mouseleave', d => { + d3.select(d.target).attr('fill', 'transparent') + setSelectionDateInterval(null) + setSelectionData(null) + setSelectionCoords(null) + }), + ) + // Thick vertical lines + .call(g => + g + .append('g') + .selectAll('line') + .data( + buildTicks(x.domain()).filter(x => { + if (period.code === 'day') return x.getUTCHours() === 0 + return x.getUTCDate() === 1 + }), + ) + .join('line') + .attr('class', 'dateSeparator') + .attr('x1', d => 0.5 + x(d)) + .attr('x2', d => 0.5 + x(d)) + .attr('y1', GRAPH_MARGIN.top - 50) + .attr('y2', GRAPH_HEIGHT - GRAPH_MARGIN.bottom) + .attr('stroke-width', 5) + .join('text'), + ) + // Left side breakpoint label + .call(g => { + const separator = d3?.select('.dateSeparator')?.node()?.getBBox() + + if (!separator) return + + const breakpoint = buildTicks(x.domain()).filter(x => { + if (period.code === 'day') return x.getUTCHours() === 0 + return x.getUTCDate() === 1 + }) + + const labels = getPastAndCurrentDayLabels(breakpoint) + + return g + .append('text') + .attr('x', separator.x - 10) + .attr('y', separator.y + 33) + .attr('text-anchor', 'end') + .attr('dy', '.25em') + .text(labels.previous) + }) + // Right side breakpoint label + .call(g => { + const separator = d3?.select('.dateSeparator')?.node()?.getBBox() + + if (!separator) return + + const breakpoint = buildTicks(x.domain()).filter(x => { + if (period.code === 'day') return x.getUTCHours() === 0 + return x.getUTCDate() === 1 + }) + + const labels = getPastAndCurrentDayLabels(breakpoint) + + return g + .append('text') + .attr('x', separator.x + 10) + .attr('y', separator.y + 33) + .attr('text-anchor', 'start') + .attr('dy', '.25em') + .text(labels.current) + }) + }, + [ + GRAPH_MARGIN, + buildTicks, + getPastAndCurrentDayLabels, + x, + x2, + y, + period, + buildAreas, + data, + offset, + setSelectionCoords, + setSelectionData, + setSelectionDateInterval, + ], + ) + + const formatTicksText = useCallback( + () => + d3 + .selectAll('.tick text') + .style('stroke', fontColor) + .style('fill', fontColor) + .style('stroke-width', 0.5) + .style('font-family', fontSecondary), + [], + ) + + const formatText = useCallback( + () => + d3 + .selectAll('text') + .style('stroke', offColor) + .style('fill', offColor) + .style('stroke-width', 0.5) + .style('font-family', fontSecondary), + [], + ) + + const formatTicks = useCallback(() => { + d3.selectAll('.tick line') + .style('stroke', primaryColor) + .style('fill', primaryColor) + }, []) + + const buildAvg = useCallback( + g => { + const median = d3.median(data, d => new BigNumber(d.fiat).toNumber()) ?? 0 + + if (log && median === 0) return + + g.attr('stroke', primaryColor) + .attr('stroke-width', 3) + .attr('stroke-dasharray', '10, 5') + .call(g => + g + .append('line') + .attr('y1', 0.5 + y(median)) + .attr('y2', 0.5 + y(median)) + .attr('x1', GRAPH_MARGIN.left) + .attr('x2', GRAPH_WIDTH), + ) + }, + [GRAPH_MARGIN, y, data, log], + ) + + const drawData = useCallback( + g => { + g.selectAll('circle') + .data(data) + .join('circle') + .attr('cx', d => { + const created = new Date(d.created) + return x(created.setTime(created.getTime() + offset)) + }) + .attr('cy', d => y(new BigNumber(d.fiat).toNumber())) + .attr('fill', d => (d.txClass === 'cashIn' ? java : neon)) + .attr('r', 3.5) + }, + [data, offset, x, y], + ) + + const drawChart = useCallback(() => { + const svg = d3 + .select(ref.current) + .attr('viewBox', [0, 0, GRAPH_WIDTH, GRAPH_HEIGHT]) + + svg.append('g').call(buildGrid) + svg.append('g').call(buildAvg) + svg.append('g').call(buildXAxis) + svg.append('g').call(buildYAxis) + svg.append('g').call(formatTicksText) + svg.append('g').call(formatText) + svg.append('g').call(formatTicks) + svg.append('g').call(drawData) + + return svg.node() + }, [ + buildAvg, + buildGrid, + buildXAxis, + buildYAxis, + drawData, + formatText, + formatTicks, + formatTicksText, + ]) + + useEffect(() => { + d3.select(ref.current).selectAll('*').remove() + drawChart() + }, [drawChart]) + + return +} + +export default memo( + Graph, + (prev, next) => + R.equals(prev.period, next.period) && + R.equals(prev.selectedMachine, next.selectedMachine) && + R.equals(prev.log, next.log), +) diff --git a/packages/admin-ui/src/pages/Analytics/graphs/OverTimeLineGraph.jsx b/packages/admin-ui/src/pages/Analytics/graphs/OverTimeLineGraph.jsx new file mode 100644 index 0000000..988e5ac --- /dev/null +++ b/packages/admin-ui/src/pages/Analytics/graphs/OverTimeLineGraph.jsx @@ -0,0 +1,646 @@ +import BigNumber from 'bignumber.js' +import * as d3 from 'd3' +import { getTimezoneOffset } from 'date-fns-tz' +import { + add, + addMilliseconds, + compareDesc, + differenceInMilliseconds, + format, + startOfWeek, + startOfYear, +} from 'date-fns/fp' +import * as R from 'ramda' +import React, { memo, useCallback, useEffect, useMemo, useRef } from 'react' + +import { + java, + neon, + subheaderDarkColor, + offColor, + fontColor, + primaryColor, + fontSecondary, + subheaderColor, +} from '../../../styling/variables' +import { numberToFiatAmount } from '../../../utils/number' +import { MINUTE, DAY, WEEK, MONTH } from '../../../utils/time' + +const Graph = ({ + data, + period, + timezone, + setSelectionCoords, + setSelectionData, + setSelectionDateInterval, + log = false, +}) => { + const ref = useRef(null) + + const GRAPH_POPOVER_WIDTH = 150 + const GRAPH_POPOVER_MARGIN = 25 + const GRAPH_HEIGHT = 401 + const GRAPH_WIDTH = 1163 + const GRAPH_MARGIN = useMemo( + () => ({ + top: 25, + right: 3.5, + bottom: 27, + left: 38, + }), + [], + ) + + const offset = getTimezoneOffset(timezone) + const NOW = Date.now() + offset + + const periodDomains = { + day: [NOW - DAY, NOW], + threeDays: [NOW - 3 * DAY, NOW], + week: [NOW - WEEK, NOW], + month: [NOW - MONTH, NOW], + } + + const dataPoints = useMemo( + () => ({ + day: { + freq: 24, + step: 60 * 60 * 1000, + tick: d3.utcHour.every(1), + labelFormat: '%H:%M', + }, + threeDays: { + freq: 12, + step: 6 * 60 * 60 * 1000, + tick: d3.utcDay.every(1), + labelFormat: '%a %d', + }, + week: { + freq: 7, + step: 24 * 60 * 60 * 1000, + tick: d3.utcDay.every(1), + labelFormat: '%a %d', + }, + month: { + freq: 30, + step: 24 * 60 * 60 * 1000, + tick: d3.utcDay.every(1), + labelFormat: '%d', + }, + }), + [], + ) + + const getPastAndCurrentDayLabels = useCallback(d => { + const currentDate = new Date(d) + const currentDateDay = currentDate.getUTCDate() + const currentDateWeekday = currentDate.getUTCDay() + const currentDateMonth = currentDate.getUTCMonth() + + const previousDate = new Date(currentDate.getTime()) + previousDate.setUTCDate(currentDateDay - 1) + + const previousDateDay = previousDate.getUTCDate() + const previousDateWeekday = previousDate.getUTCDay() + const previousDateMonth = previousDate.getUTCMonth() + + const daysOfWeek = Array.from(Array(7)).map((_, i) => + format('EEE', add({ days: i }, startOfWeek(new Date()))), + ) + + const months = Array.from(Array(12)).map((_, i) => + format('LLL', add({ months: i }, startOfYear(new Date()))), + ) + + return { + previous: + currentDateMonth !== previousDateMonth + ? months[previousDateMonth] + : `${daysOfWeek[previousDateWeekday]} ${previousDateDay}`, + current: + currentDateMonth !== previousDateMonth + ? months[currentDateMonth] + : `${daysOfWeek[currentDateWeekday]} ${currentDateDay}`, + } + }, []) + + const buildTicks = useCallback( + domain => { + const points = [] + + const roundDate = d => { + const step = dataPoints[period.code].step + return new Date(Math.ceil(d.valueOf() / step) * step) + } + + for (let i = 0; i <= dataPoints[period.code].freq; i++) { + const stepDate = new Date(NOW - i * dataPoints[period.code].step) + if (roundDate(stepDate) > domain[1]) continue + if (stepDate < domain[0]) continue + points.push(roundDate(stepDate)) + } + + return points + }, + [NOW, dataPoints, period.code], + ) + + const buildAreas = useCallback( + domain => { + const points = [] + + points.push(domain[1]) + + const roundDate = d => { + const step = dataPoints[period.code].step + return new Date(Math.ceil(d.valueOf() / step) * step) + } + + for (let i = 0; i <= dataPoints[period.code].freq; i++) { + const stepDate = new Date(NOW - i * dataPoints[period.code].step) + if (roundDate(stepDate) > new Date(domain[1])) continue + if (stepDate < new Date(domain[0])) continue + points.push(roundDate(stepDate)) + } + + points.push(domain[0]) + + return points + }, + [NOW, dataPoints, period.code], + ) + + const x = d3 + .scaleUtc() + .domain(periodDomains[period.code]) + .range([GRAPH_MARGIN.left, GRAPH_WIDTH - GRAPH_MARGIN.right]) + + // Create a second X axis for mouseover events to be placed correctly across the entire graph width and not limited by X's domain + const x2 = d3 + .scaleUtc() + .domain(periodDomains[period.code]) + .range([GRAPH_MARGIN.left, GRAPH_WIDTH]) + + const bins = buildAreas(x.domain()) + .sort((a, b) => compareDesc(a.date, b.date)) + .map(addMilliseconds(-dataPoints[period.code].step)) + .map((date, i, dates) => { + // move first and last bin in such way + // that all bin have uniform width + if (i === 0) + return addMilliseconds(dataPoints[period.code].step, dates[1]) + else if (i === dates.length - 1) + return addMilliseconds( + -dataPoints[period.code].step, + dates[dates.length - 2], + ) + else return date + }) + .map(date => { + const middleOfBin = addMilliseconds( + dataPoints[period.code].step / 2, + date, + ) + + const txs = data.filter(tx => { + const txCreated = new Date(tx.created) + const shift = new Date(txCreated.getTime() + offset) + + return ( + Math.abs(differenceInMilliseconds(shift, middleOfBin)) < + dataPoints[period.code].step / 2 + ) + }) + + const cashIn = txs + .filter(tx => tx.txClass === 'cashIn') + .reduce((sum, tx) => sum + new BigNumber(tx.fiat).toNumber(), 0) + + const cashOut = txs + .filter(tx => tx.txClass === 'cashOut') + .reduce((sum, tx) => sum + new BigNumber(tx.fiat).toNumber(), 0) + + return { date: middleOfBin, cashIn, cashOut } + }) + + const min = d3.min(bins, d => Math.min(d.cashIn, d.cashOut)) ?? 0 + const max = d3.max(bins, d => Math.max(d.cashIn, d.cashOut)) ?? 1000 + + const yLin = d3 + .scaleLinear() + .domain([0, (max === min ? min + 1000 : max) * 1.03]) + .nice() + .range([GRAPH_HEIGHT - GRAPH_MARGIN.bottom, GRAPH_MARGIN.top]) + + const yLog = d3 + .scaleLog() + .domain([ + min === 0 ? 0.9 : min * 0.9, + (max === min ? min + Math.pow(10, 2 * min + 1) : max) * 2, + ]) + .clamp(true) + .range([GRAPH_HEIGHT - GRAPH_MARGIN.bottom, GRAPH_MARGIN.top]) + + const y = log ? yLog : yLin + + const getAreaInterval = (breakpoints, dataLimits, graphLimits) => { + const fullBreakpoints = [ + graphLimits[1], + ...R.filter(it => it > dataLimits[0] && it < dataLimits[1], breakpoints), + dataLimits[0], + ] + + const intervals = [] + for (let i = 0; i < fullBreakpoints.length - 1; i++) { + intervals.push([fullBreakpoints[i], fullBreakpoints[i + 1]]) + } + + return intervals + } + + const getAreaIntervalByX = (intervals, xValue) => { + return R.find(it => xValue <= it[0] && xValue >= it[1], intervals) ?? [0, 0] + } + + const getDateIntervalByX = (areas, intervals, xValue) => { + const flattenIntervals = R.uniq(R.flatten(intervals)) + + // flattenIntervals and areas should have the same number of elements + for (let i = intervals.length - 1; i >= 0; i--) { + if (xValue < flattenIntervals[i]) { + return [areas[i], areas[i + 1]] + } + } + } + + const buildXAxis = useCallback( + g => + g + .attr( + 'transform', + `translate(0, ${GRAPH_HEIGHT - GRAPH_MARGIN.bottom})`, + ) + .call( + d3 + .axisBottom(x) + .ticks(dataPoints[period.code].tick) + .tickFormat(d => { + return d3.timeFormat(dataPoints[period.code].labelFormat)( + d.getTime() + d.getTimezoneOffset() * MINUTE, + ) + }) + .tickSizeOuter(0), + ) + .call(g => + g + .select('.domain') + .attr('stroke', primaryColor) + .attr('stroke-width', 1), + ), + [GRAPH_MARGIN, dataPoints, period.code, x], + ) + + const buildYAxis = useCallback( + g => + g + .attr('transform', `translate(${GRAPH_MARGIN.left}, 0)`) + .call( + d3 + .axisLeft(y) + .ticks(GRAPH_HEIGHT / 100) + .tickSizeOuter(0) + .tickFormat(d => { + if (log && !['1', '2', '5'].includes(d.toString()[0])) return '' + + if (d >= 1000) return numberToFiatAmount(d / 1000) + 'k' + + return numberToFiatAmount(d) + }), + ) + .select('.domain') + .attr('stroke', primaryColor) + .attr('stroke-width', 1), + [GRAPH_MARGIN, y, log], + ) + + const buildGrid = useCallback( + g => { + g.attr('stroke', subheaderDarkColor) + .attr('fill', subheaderDarkColor) + // Vertical lines + .call(g => + g + .append('g') + .selectAll('line') + .data(buildTicks(x.domain())) + .join('line') + .attr('x1', d => 0.5 + x(d)) + .attr('x2', d => 0.5 + x(d)) + .attr('y1', GRAPH_MARGIN.top) + .attr('y2', GRAPH_HEIGHT - GRAPH_MARGIN.bottom), + ) + // Horizontal lines + .call(g => + g + .append('g') + .selectAll('line') + .data( + d3 + .axisLeft(y) + .scale() + .ticks(GRAPH_HEIGHT / 100), + ) + .join('line') + .attr('y1', d => 0.5 + y(d)) + .attr('y2', d => 0.5 + y(d)) + .attr('x1', GRAPH_MARGIN.left) + .attr('x2', GRAPH_WIDTH), + ) + // Vertical transparent rectangles for events + .call(g => + g + .append('g') + .selectAll('line') + .data(buildAreas(x.domain())) + .join('rect') + .attr('x', d => x(d)) + .attr('y', GRAPH_MARGIN.top) + .attr('width', d => { + const xValue = Math.round(x(d) * 100) / 100 + const intervals = getAreaInterval( + buildAreas(x.domain()).map(it => Math.round(x(it) * 100) / 100), + x.range(), + x2.range(), + ) + const interval = getAreaIntervalByX(intervals, xValue) + return Math.round((interval[0] - interval[1]) * 100) / 100 + }) + .attr( + 'height', + GRAPH_HEIGHT - GRAPH_MARGIN.bottom - GRAPH_MARGIN.top, + ) + .attr('stroke', 'transparent') + .attr('fill', 'transparent') + .on('mouseover', d => { + const xValue = Math.round(d.target.x.baseVal.value * 100) / 100 + const areas = buildAreas(x.domain()) + const intervals = getAreaInterval( + buildAreas(x.domain()).map(it => Math.round(x(it) * 100) / 100), + x.range(), + x2.range(), + ) + + const dateInterval = getDateIntervalByX(areas, intervals, xValue) + if (!dateInterval) return + const filteredData = data.filter(it => { + const created = new Date(it.created) + const tzCreated = created.setTime(created.getTime() + offset) + return ( + tzCreated > new Date(dateInterval[1]) && + tzCreated <= new Date(dateInterval[0]) + ) + }) + + const rectXCoords = { + left: R.clone(d.target.getBoundingClientRect().x), + right: R.clone( + d.target.getBoundingClientRect().x + + d.target.getBoundingClientRect().width, + ), + } + + const xCoord = + d.target.x.baseVal.value < 0.75 * GRAPH_WIDTH + ? rectXCoords.right + GRAPH_POPOVER_MARGIN + : rectXCoords.left - + GRAPH_POPOVER_WIDTH - + GRAPH_POPOVER_MARGIN + const yCoord = R.clone(d.target.getBoundingClientRect().y) + + setSelectionDateInterval(dateInterval) + setSelectionData(filteredData) + setSelectionCoords({ + x: Math.round(xCoord), + y: Math.round(yCoord), + }) + + d3.select(d.target).attr('fill', subheaderColor) + }) + .on('mouseleave', d => { + d3.select(d.target).attr('fill', 'transparent') + setSelectionDateInterval(null) + setSelectionData(null) + setSelectionCoords(null) + }), + ) + // Thick vertical lines + .call(g => + g + .append('g') + .selectAll('line') + .data( + buildTicks(x.domain()).filter(x => { + if (period.code === 'day') return x.getUTCHours() === 0 + return x.getUTCDate() === 1 + }), + ) + .join('line') + .attr('class', 'dateSeparator') + .attr('x1', d => 0.5 + x(d)) + .attr('x2', d => 0.5 + x(d)) + .attr('y1', GRAPH_MARGIN.top - 50) + .attr('y2', GRAPH_HEIGHT - GRAPH_MARGIN.bottom) + .attr('stroke-width', 5) + .join('text'), + ) + // Left side breakpoint label + .call(g => { + const separator = d3?.select('.dateSeparator')?.node()?.getBBox() + + if (!separator) return + + const breakpoint = buildTicks(x.domain()).filter(x => { + if (period.code === 'day') return x.getUTCHours() === 0 + return x.getUTCDate() === 1 + }) + + const labels = getPastAndCurrentDayLabels(breakpoint) + + return g + .append('text') + .attr('x', separator.x - 10) + .attr('y', separator.y + 33) + .attr('text-anchor', 'end') + .attr('dy', '.25em') + .text(labels.previous) + }) + // Right side breakpoint label + .call(g => { + const separator = d3?.select('.dateSeparator')?.node()?.getBBox() + + if (!separator) return + + const breakpoint = buildTicks(x.domain()).filter(x => { + if (period.code === 'day') return x.getUTCHours() === 0 + return x.getUTCDate() === 1 + }) + + const labels = getPastAndCurrentDayLabels(breakpoint) + + return g + .append('text') + .attr('x', separator.x + 10) + .attr('y', separator.y + 33) + .attr('text-anchor', 'start') + .attr('dy', '.25em') + .text(labels.current) + }) + }, + [ + GRAPH_MARGIN, + buildTicks, + getPastAndCurrentDayLabels, + x, + x2, + y, + period, + buildAreas, + data, + offset, + setSelectionCoords, + setSelectionData, + setSelectionDateInterval, + ], + ) + + const formatTicksText = useCallback( + () => + d3 + .selectAll('.tick text') + .style('stroke', fontColor) + .style('fill', fontColor) + .style('stroke-width', 0.5) + .style('font-family', fontSecondary), + [], + ) + + const formatText = useCallback( + () => + d3 + .selectAll('text') + .style('stroke', offColor) + .style('fill', offColor) + .style('stroke-width', 0.5) + .style('font-family', fontSecondary), + [], + ) + + const formatTicks = useCallback(() => { + d3.selectAll('.tick line') + .style('stroke', primaryColor) + .style('fill', primaryColor) + }, []) + + const drawData = useCallback( + g => { + g.append('clipPath') + .attr('id', 'clip-path') + .append('rect') + .attr('x', GRAPH_MARGIN.left) + .attr('y', GRAPH_MARGIN.top) + .attr('width', GRAPH_WIDTH) + .attr('height', GRAPH_HEIGHT - GRAPH_MARGIN.bottom - GRAPH_MARGIN.top) + .attr('fill', java) + + g.append('g') + .attr('clip-path', 'url(#clip-path)') + .selectAll('circle .cashIn') + .data(bins) + .join('circle') + .attr('cx', d => x(d.date)) + .attr('cy', d => y(d.cashIn)) + .attr('fill', java) + .attr('r', d => (d.cashIn === 0 ? 0 : 3.5)) + + g.append('path') + .datum(bins) + .attr('fill', 'none') + .attr('stroke', java) + .attr('stroke-width', 3) + .attr('clip-path', 'url(#clip-path)') + .attr( + 'd', + d3 + .line() + .curve(d3.curveMonotoneX) + .x(d => x(d.date)) + .y(d => y(d.cashIn)), + ) + + g.append('g') + .attr('clip-path', 'url(#clip-path)') + .selectAll('circle .cashIn') + .data(bins) + .join('circle') + .attr('cx', d => x(d.date)) + .attr('cy', d => y(d.cashOut)) + .attr('fill', neon) + .attr('r', d => (d.cashOut === 0 ? 0 : 3.5)) + + g.append('path') + .datum(bins) + .attr('fill', 'none') + .attr('stroke', neon) + .attr('stroke-width', 3) + .attr('clip-path', 'url(#clip-path)') + .attr( + 'd', + d3 + .line() + .curve(d3.curveMonotoneX) + .x(d => x(d.date)) + .y(d => y(d.cashOut)), + ) + }, + [x, y, bins, GRAPH_MARGIN], + ) + + const drawChart = useCallback(() => { + const svg = d3 + .select(ref.current) + .attr('viewBox', [0, 0, GRAPH_WIDTH, GRAPH_HEIGHT]) + + svg.append('g').call(buildGrid) + svg.append('g').call(drawData) + svg.append('g').call(buildXAxis) + svg.append('g').call(buildYAxis) + svg.append('g').call(formatTicksText) + svg.append('g').call(formatText) + svg.append('g').call(formatTicks) + + return svg.node() + }, [ + buildGrid, + buildXAxis, + buildYAxis, + drawData, + formatText, + formatTicks, + formatTicksText, + ]) + + useEffect(() => { + d3.select(ref.current).selectAll('*').remove() + drawChart() + }, [drawChart]) + + return +} + +export default memo( + Graph, + (prev, next) => + R.equals(prev.period, next.period) && + R.equals(prev.selectedMachine, next.selectedMachine) && + R.equals(prev.log, next.log), +) diff --git a/packages/admin-ui/src/pages/Analytics/graphs/TopMachinesBarGraph.jsx b/packages/admin-ui/src/pages/Analytics/graphs/TopMachinesBarGraph.jsx new file mode 100644 index 0000000..dc580c0 --- /dev/null +++ b/packages/admin-ui/src/pages/Analytics/graphs/TopMachinesBarGraph.jsx @@ -0,0 +1,316 @@ +import BigNumber from 'bignumber.js' +import * as d3 from 'd3' +import * as R from 'ramda' +import React, { memo, useCallback, useEffect, useMemo, useRef } from 'react' + +import { + java, + neon, + subheaderDarkColor, + fontColor, + fontSecondary, +} from '../../../styling/variables' + +const Graph = ({ data, machines, currency }) => { + const ref = useRef(null) + + const AMOUNT_OF_MACHINES = 5 + const BAR_PADDING = 0.15 + const BAR_MARGIN = 10 + const GRAPH_HEIGHT = 401 + const GRAPH_WIDTH = 1163 + const GRAPH_MARGIN = useMemo( + () => ({ + top: 25, + right: 0.5, + bottom: 27, + left: 36.5, + }), + [], + ) + + const machinesClone = R.clone(machines) + + // This ensures that the graph renders a minimum amount of machines + // and avoids having a single bar for cases with one machine + const filledMachines = + R.length(machines) >= AMOUNT_OF_MACHINES + ? machinesClone + : R.map( + it => { + if (!R.isNil(machinesClone[it])) return machinesClone[it] + return { code: `ghostMachine${it}`, display: `` } + }, + R.times(R.identity, AMOUNT_OF_MACHINES), + ) + + const txByDevice = R.reduce( + (acc, value) => { + acc[value.code] = R.filter(it => it.deviceId === value.code, data) + return acc + }, + {}, + filledMachines, + ) + + const getDeviceVolume = deviceId => + R.reduce( + (acc, value) => acc + BigNumber(value.fiat).toNumber(), + 0, + txByDevice[deviceId], + ) + + const getDeviceVolumeByTxClass = deviceId => + R.reduce( + (acc, value) => { + if (value.txClass === 'cashIn') + acc.cashIn += BigNumber(value.fiat).toNumber() + if (value.txClass === 'cashOut') + acc.cashOut += BigNumber(value.fiat).toNumber() + return acc + }, + { cashIn: 0, cashOut: 0 }, + txByDevice[deviceId], + ) + + const devicesByVolume = R.sort( + (a, b) => b[1] - a[1], + R.map(m => [m.code, getDeviceVolume(m.code)], filledMachines), + ) + + const topMachines = R.take(AMOUNT_OF_MACHINES, devicesByVolume) + + const txClassVolumeByDevice = R.fromPairs( + R.map(v => [v[0], getDeviceVolumeByTxClass(v[0])], topMachines), + ) + + const x = d3 + .scaleBand() + .domain(topMachines) + .range([GRAPH_MARGIN.left, GRAPH_WIDTH - GRAPH_MARGIN.right]) + .paddingInner(BAR_PADDING) + + const y = d3 + .scaleLinear() + .domain([ + 0, + d3.max(topMachines, d => d[1]) !== 0 + ? d3.max(topMachines, d => d[1]) + : 50, + ]) + .range([GRAPH_HEIGHT - GRAPH_MARGIN.bottom, GRAPH_MARGIN.top]) + + const buildXAxis = useCallback( + g => + g + .attr('class', 'x-axis-1') + .attr( + 'transform', + `translate(0, ${GRAPH_HEIGHT - GRAPH_MARGIN.bottom})`, + ) + .call( + d3 + .axisBottom(x) + .tickFormat( + d => + `${ + R.find(it => it.code === d[0], filledMachines).display ?? '' + }`, + ) + .tickSize(0) + .tickPadding(10), + ), + [GRAPH_MARGIN, x, filledMachines], + ) + + const buildXAxis2 = useCallback( + g => { + g.attr('class', 'x-axis-2') + .attr( + 'transform', + `translate(0, ${GRAPH_HEIGHT - GRAPH_MARGIN.bottom})`, + ) + .call( + d3 + .axisBottom(x) + .tickFormat(d => + R.includes(`ghostMachine`, d[0]) + ? `` + : `${d[1].toFixed(2)} ${currency}`, + ) + .tickSize(0) + .tickPadding(10), + ) + }, + [GRAPH_MARGIN, x, currency], + ) + + const positionXAxisLabels = useCallback(() => { + d3.selectAll('.x-axis-1 .tick text').attr('transform', function () { + const widthPerEntry = (x.range()[1] - x.range()[0]) / AMOUNT_OF_MACHINES + return `translate(${-widthPerEntry / 2.25 + this.getBBox().width / 2}, 0)` + }) + }, [x]) + + const positionXAxis2Labels = useCallback(() => { + d3.selectAll('.x-axis-2 .tick text').attr('transform', function () { + const widthPerEntry = (x.range()[1] - x.range()[0]) / AMOUNT_OF_MACHINES + return `translate(${widthPerEntry / 2.25 - this.getBBox().width / 2}, 0)` + }) + }, [x]) + + const buildYAxis = useCallback( + g => + g + .attr('transform', `translate(${GRAPH_MARGIN.left}, 0)`) + .call( + d3 + .axisLeft(y) + .ticks(GRAPH_HEIGHT / 100) + .tickSize(0) + .tickFormat(``), + ) + .call(g => g.select('.domain').remove()), + [GRAPH_MARGIN, y], + ) + + const formatTicksText = useCallback( + () => + d3 + .selectAll('.tick text') + .style('stroke', fontColor) + .style('fill', fontColor) + .style('stroke-width', 0.5) + .style('font-family', fontSecondary), + [], + ) + + const buildGrid = useCallback( + g => { + g.attr('stroke', subheaderDarkColor) + .attr('fill', subheaderDarkColor) + // Vertical lines + .call(g => + g + .append('g') + .selectAll('line') + .data(R.tail(x.domain())) + .join('line') + .attr('x1', d => { + const domainIndex = R.findIndex(it => R.equals(it, d), x.domain()) + + const xValue = + x(x.domain()[domainIndex]) - x(x.domain()[domainIndex - 1]) + + const paddedXValue = xValue * (BAR_PADDING / 2) + return 0.5 + x(d) - paddedXValue + }) + .attr('x2', d => { + const domainIndex = R.findIndex(it => R.equals(it, d), x.domain()) + + const xValue = + x(x.domain()[domainIndex]) - x(x.domain()[domainIndex - 1]) + + const paddedXValue = xValue * (BAR_PADDING / 2) + return 0.5 + x(d) - paddedXValue + }) + .attr('y1', GRAPH_MARGIN.top) + .attr('y2', GRAPH_HEIGHT - GRAPH_MARGIN.bottom), + ) + }, + [GRAPH_MARGIN, x], + ) + + const drawCashIn = useCallback( + g => { + g.selectAll('rect') + .data(R.toPairs(txClassVolumeByDevice)) + .join('rect') + .attr('fill', java) + .attr('x', d => x([d[0], d[1].cashIn + d[1].cashOut])) + .attr('y', d => y(d[1].cashIn) - GRAPH_MARGIN.top + GRAPH_MARGIN.bottom) + .attr('height', d => + R.clamp( + 0, + GRAPH_HEIGHT, + GRAPH_HEIGHT - y(d[1].cashIn) - GRAPH_MARGIN.bottom - BAR_MARGIN, + ), + ) + .attr('width', x.bandwidth()) + .attr('rx', 2.5) + }, + [txClassVolumeByDevice, x, y, GRAPH_MARGIN], + ) + + const drawCashOut = useCallback( + g => { + g.selectAll('rect') + .data(R.toPairs(txClassVolumeByDevice)) + .join('rect') + .attr('fill', neon) + .attr('x', d => x([d[0], d[1].cashIn + d[1].cashOut])) + .attr( + 'y', + d => + y(d[1].cashIn + d[1].cashOut) - + GRAPH_MARGIN.top + + GRAPH_MARGIN.bottom, + ) + .attr('height', d => { + return R.clamp( + 0, + GRAPH_HEIGHT, + GRAPH_HEIGHT - + y(d[1].cashOut) - + GRAPH_MARGIN.bottom - + BAR_MARGIN / 2, + ) + }) + .attr('width', x.bandwidth()) + .attr('rx', 2.5) + }, + [txClassVolumeByDevice, x, y, GRAPH_MARGIN], + ) + + const drawChart = useCallback(() => { + const svg = d3 + .select(ref.current) + .attr('viewBox', [0, 0, GRAPH_WIDTH, GRAPH_HEIGHT]) + + svg.append('g').call(buildXAxis) + svg.append('g').call(buildXAxis2) + svg.append('g').call(buildYAxis) + svg.append('g').call(formatTicksText) + svg.append('g').call(buildGrid) + svg.append('g').call(drawCashIn) + svg.append('g').call(drawCashOut) + svg.append('g').call(positionXAxisLabels) + svg.append('g').call(positionXAxis2Labels) + + return svg.node() + }, [ + buildXAxis, + buildXAxis2, + positionXAxisLabels, + positionXAxis2Labels, + buildYAxis, + formatTicksText, + buildGrid, + drawCashIn, + drawCashOut, + ]) + + useEffect(() => { + d3.select(ref.current).selectAll('*').remove() + drawChart() + }, [drawChart]) + + return +} + +export default memo( + Graph, + (prev, next) => + R.equals(prev.period, next.period) && + R.equals(prev.selectedMachine, next.selectedMachine), +) diff --git a/packages/admin-ui/src/pages/Analytics/index.js b/packages/admin-ui/src/pages/Analytics/index.js new file mode 100644 index 0000000..64db146 --- /dev/null +++ b/packages/admin-ui/src/pages/Analytics/index.js @@ -0,0 +1,3 @@ +import Analytics from './Analytics' + +export default Analytics diff --git a/packages/admin-ui/src/pages/Authentication/Authentication.module.css b/packages/admin-ui/src/pages/Authentication/Authentication.module.css new file mode 100644 index 0000000..57fedb4 --- /dev/null +++ b/packages/admin-ui/src/pages/Authentication/Authentication.module.css @@ -0,0 +1,73 @@ +.welcomeBackground { + background: var(--ghost) url(/wizard-background.svg) no-repeat fixed center + center; + background-size: cover; + height: 100vh; + width: 100vw; + position: relative; + left: 50%; + right: 50%; + margin-left: -50vw; + margin-right: -50vw; + min-height: 100vh; +} + +.wrapper { + padding: 2.5em 4em; + width: 575px; + display: flex; + flex-direction: column; +} + +.titleWrapper { + display: flex; + flex-direction: row; + align-items: center; + margin-bottom: 30px; +} + +.icon { + transform: scale(1.5); + margin-right: 25px; +} + +.title { + padding-top: 8px; +} + +.infoWrapper { + margin-bottom: 3vh; +} + +.info2 { + text-align: justify; +} + +.qrCodeWrapper { + display: flex; + justify-content: center; + margin-bottom: 3vh; +} + +.secretWrapper { + display: flex; + justify-content: center; + align-items: center; +} + +.secretLabel { + margin-right: 15px; +} + +.secret { + margin-right: 35px; +} + +.hiddenSecret { + margin-right: 35px; + filter: blur(8px); +} + +.confirm2FAInput { + margin-top: 25px; +} diff --git a/packages/admin-ui/src/pages/Authentication/Input2FAState.jsx b/packages/admin-ui/src/pages/Authentication/Input2FAState.jsx new file mode 100644 index 0000000..1782e0f --- /dev/null +++ b/packages/admin-ui/src/pages/Authentication/Input2FAState.jsx @@ -0,0 +1,125 @@ +import { useMutation, useLazyQuery, gql } from '@apollo/client' +import { Form, Formik } from 'formik' +import React, { useContext, useState } from 'react' +import { useLocation } from 'wouter' +import { TL1, P } from '../../components/typography' + +import AppContext from '../../AppContext' +import { Button } from '../../components/buttons' +import { CodeInput } from '../../components/inputs/base' + +import { STATES } from './states' + +const INPUT_2FA = gql` + mutation input2FA( + $username: String! + $password: String! + $code: String! + $rememberMe: Boolean! + ) { + input2FA( + username: $username + password: $password + code: $code + rememberMe: $rememberMe + ) + } +` + +const GET_USER_DATA = gql` + { + userData { + id + username + role + } + } +` + +const Input2FAState = ({ state, dispatch }) => { + const [, navigate] = useLocation() + const { setUserData } = useContext(AppContext) + + const [invalidToken, setInvalidToken] = useState(false) + + const [getUserData, { error: queryError }] = useLazyQuery(GET_USER_DATA, { + onCompleted: ({ userData }) => { + setUserData(userData) + navigate('/') + }, + }) + + const [input2FA, { error: mutationError }] = useMutation(INPUT_2FA, { + onCompleted: ({ input2FA: success }) => { + if (success) { + return getUserData() + } + return setInvalidToken(true) + }, + }) + + const handle2FAChange = value => { + dispatch({ + type: STATES.INPUT_2FA, + payload: { + twoFAField: value, + }, + }) + setInvalidToken(false) + } + + const handleSubmit = () => { + if (state.twoFAField.length !== 6) { + setInvalidToken(true) + return + } + + const options = { + variables: { + username: state.clientField, + password: state.passwordField, + code: state.twoFAField, + rememberMe: state.rememberMeField, + }, + } + + input2FA(options) + } + + const getErrorMsg = () => { + if (queryError) return 'Internal server error' + if (state.twoFAField.length !== 6 && invalidToken) + return 'The code should have 6 characters!' + if (mutationError || invalidToken) + return 'Code is invalid. Please try again.' + return null + } + + const errorMessage = getErrorMsg() + + return ( + <> + Enter your two-factor authentication code + {/* TODO: refactor the 2FA CodeInput to properly use Formik */} + {}} initialValues={{}}> +
    + +
    + {errorMessage &&

    {errorMessage}

    } + +
    + +
    + + ) +} + +export default Input2FAState diff --git a/packages/admin-ui/src/pages/Authentication/InputFIDOState.jsx b/packages/admin-ui/src/pages/Authentication/InputFIDOState.jsx new file mode 100644 index 0000000..136c43a --- /dev/null +++ b/packages/admin-ui/src/pages/Authentication/InputFIDOState.jsx @@ -0,0 +1,207 @@ +import { useMutation, useLazyQuery, gql } from '@apollo/client' +import { startAssertion } from '@simplewebauthn/browser' +import { Field, Form, Formik } from 'formik' +import React, { useState, useContext } from 'react' +import { useLocation } from 'wouter' +import { H2, Label2, P } from '../../components/typography' +import * as Yup from 'yup' + +import AppContext from '../../AppContext' +import { Button } from '../../components/buttons' +import { Checkbox, TextInput } from '../../components/inputs/formik' + +const GET_USER_DATA = gql` + { + userData { + id + username + role + } + } +` + +const validationSchema = Yup.object().shape({ + localClient: Yup.string() + .required('Client field is required!') + .email('Username field should be in an email format!'), + localRememberMe: Yup.boolean(), +}) + +const initialValues = { + localClient: '', + localRememberMe: false, +} + +const InputFIDOState = ({ state, strategy }) => { + const GENERATE_ASSERTION = gql` + query generateAssertionOptions($username: String!${ + strategy === 'FIDO2FA' ? `, $password: String!` : `` + }, $domain: String!) { + generateAssertionOptions(username: $username${ + strategy === 'FIDO2FA' ? `, password: $password` : `` + }, domain: $domain) + } + ` + + const VALIDATE_ASSERTION = gql` + mutation validateAssertion( + $username: String! + ${strategy === 'FIDO2FA' ? `, $password: String!` : ``} + $rememberMe: Boolean! + $assertionResponse: JSONObject! + $domain: String! + ) { + validateAssertion( + username: $username + ${strategy === 'FIDO2FA' ? `password: $password` : ``} + rememberMe: $rememberMe + assertionResponse: $assertionResponse + domain: $domain + ) + } + ` + + const [, navigate] = useLocation() + const { setUserData } = useContext(AppContext) + + const [localClientField, setLocalClientField] = useState('') + const [localRememberMeField, setLocalRememberMeField] = useState(false) + const [invalidUsername, setInvalidUsername] = useState(false) + const [invalidToken, setInvalidToken] = useState(false) + + const [validateAssertion, { error: mutationError }] = useMutation( + VALIDATE_ASSERTION, + { + onCompleted: ({ validateAssertion: success }) => { + success ? getUserData() : setInvalidToken(true) + }, + }, + ) + + const [assertionOptions, { error: assertionQueryError }] = useLazyQuery( + GENERATE_ASSERTION, + { + variables: + strategy === 'FIDO2FA' + ? { + username: state.clientField, + password: state.passwordField, + domain: window.location.hostname, + } + : { + username: localClientField, + domain: window.location.hostname, + }, + onCompleted: ({ generateAssertionOptions: options }) => { + startAssertion(options) + .then(res => { + const variables = + strategy === 'FIDO2FA' + ? { + username: state.clientField, + password: state.passwordField, + rememberMe: state.rememberMeField, + assertionResponse: res, + domain: window.location.hostname, + } + : { + username: localClientField, + rememberMe: localRememberMeField, + assertionResponse: res, + domain: window.location.hostname, + } + validateAssertion({ + variables, + }) + }) + .catch(err => { + console.error(err) + setInvalidToken(true) + }) + }, + }, + ) + + const [getUserData, { error: queryError }] = useLazyQuery(GET_USER_DATA, { + onCompleted: ({ userData }) => { + setUserData(userData) + navigate('/') + }, + }) + + const getErrorMsg = (formikErrors, formikTouched) => { + if (!formikErrors || !formikTouched) return null + if (assertionQueryError || queryError || mutationError) + return 'Internal server error' + if (formikErrors.client && formikTouched.client) return formikErrors.client + if (invalidUsername) return 'Invalid login.' + if (invalidToken) return 'Code is invalid. Please try again.' + return null + } + + return ( + <> + {strategy === 'FIDOPasswordless' && ( + { + setInvalidUsername(false) + setLocalClientField(values.localClient) + setLocalRememberMeField(values.localRememberMe) + assertionOptions() + }}> + {({ errors, touched }) => ( +
    + { + if (invalidUsername) setInvalidUsername(false) + }} + /> +
    + + Keep me logged in +
    +
    + {getErrorMsg(errors, touched) && ( +

    {getErrorMsg(errors, touched)}

    + )} + +
    + + )} +
    + )} + {strategy === 'FIDO2FA' && ( + <> +

    + Insert your hardware key and follow the instructions +

    + + + )} + + ) +} + +export default InputFIDOState diff --git a/packages/admin-ui/src/pages/Authentication/Login.jsx b/packages/admin-ui/src/pages/Authentication/Login.jsx new file mode 100644 index 0000000..0ea27cb --- /dev/null +++ b/packages/admin-ui/src/pages/Authentication/Login.jsx @@ -0,0 +1,23 @@ +import Grid from '@mui/material/Grid' +import React from 'react' + +import LoginCard from './LoginCard' +import classes from './Authentication.module.css' + +const Login = () => { + return ( + + + + + + ) +} + +export default Login diff --git a/packages/admin-ui/src/pages/Authentication/LoginCard.jsx b/packages/admin-ui/src/pages/Authentication/LoginCard.jsx new file mode 100644 index 0000000..5d15686 --- /dev/null +++ b/packages/admin-ui/src/pages/Authentication/LoginCard.jsx @@ -0,0 +1,67 @@ +import Paper from '@mui/material/Paper' +import React, { useReducer } from 'react' +import Logo from '../../styling/icons/menu/logo.svg?react' + +import Input2FAState from './Input2FAState' +import InputFIDOState from './InputFIDOState' +import LoginState from './LoginState' +import Setup2FAState from './Setup2FAState' +import { STATES } from './states' +import classes from './Authentication.module.css' + +// FIDO2FA, FIDOPasswordless or FIDOUsernameless +const AUTHENTICATION_STRATEGY = 'FIDO2FA' + +const initialState = { + twoFAField: '', + clientField: '', + passwordField: '', + rememberMeField: false, + loginState: STATES.LOGIN, +} + +const reducer = (state, action) => { + const { type, payload } = action + return { ...state, ...payload, loginState: type } +} + +const LoginCard = () => { + const [state, dispatch] = useReducer(reducer, initialState) + + const renderState = () => { + switch (state.loginState) { + case STATES.LOGIN: + return ( + + ) + case STATES.INPUT_2FA: + return + case STATES.SETUP_2FA: + return + case STATES.FIDO: + return ( + + ) + default: + break + } + } + + return ( + +
    +
    + +

    Lamassu Admin

    +
    + {renderState()} +
    +
    + ) +} + +export default LoginCard diff --git a/packages/admin-ui/src/pages/Authentication/LoginState.jsx b/packages/admin-ui/src/pages/Authentication/LoginState.jsx new file mode 100644 index 0000000..ef7541c --- /dev/null +++ b/packages/admin-ui/src/pages/Authentication/LoginState.jsx @@ -0,0 +1,231 @@ +import { useMutation, useLazyQuery, gql } from '@apollo/client' +import { startAssertion } from '@simplewebauthn/browser' +import { Field, Form, Formik } from 'formik' +import React, { useContext } from 'react' +import { useLocation } from 'wouter' +import { Label3, P } from '../../components/typography' +import * as Yup from 'yup' + +import AppContext from '../../AppContext' +import { Button } from '../../components/buttons' +import { + Checkbox, + SecretInput, + TextInput, +} from '../../components/inputs/formik' + +const LOGIN = gql` + mutation login($username: String!, $password: String!) { + login(username: $username, password: $password) + } +` + +const GENERATE_ASSERTION = gql` + query generateAssertionOptions($domain: String!) { + generateAssertionOptions(domain: $domain) + } +` + +const VALIDATE_ASSERTION = gql` + mutation validateAssertion( + $assertionResponse: JSONObject! + $domain: String! + ) { + validateAssertion(assertionResponse: $assertionResponse, domain: $domain) + } +` + +const GET_USER_DATA = gql` + { + userData { + id + username + role + } + } +` + +const validationSchema = Yup.object().shape({ + email: Yup.string().label('Email').required().email(), + password: Yup.string().required('Password field is required'), + rememberMe: Yup.boolean(), +}) + +const initialValues = { + email: '', + password: '', + rememberMe: false, +} + +const getErrorMsg = (formikErrors, formikTouched, mutationError) => { + if (!formikErrors || !formikTouched) return null + if (mutationError) return 'Invalid email/password combination' + if (formikErrors.email && formikTouched.email) return formikErrors.email + if (formikErrors.password && formikTouched.password) + return formikErrors.password + return null +} + +const LoginState = ({ dispatch, strategy }) => { + const [, navigate] = useLocation() + const { setUserData } = useContext(AppContext) + + const [login, { error: loginMutationError }] = useMutation(LOGIN) + + const submitLogin = async (username, password, rememberMe) => { + const options = { + variables: { + username, + password, + }, + } + const { data: loginResponse } = await login(options) + + if (!loginResponse.login) return + + return dispatch({ + type: loginResponse.login, + payload: { + clientField: username, + passwordField: password, + rememberMeField: rememberMe, + }, + }) + } + + const [validateAssertion, { error: FIDOMutationError }] = useMutation( + VALIDATE_ASSERTION, + { + onCompleted: ({ validateAssertion: success }) => success && getUserData(), + }, + ) + + const [assertionOptions, { error: assertionQueryError }] = useLazyQuery( + GENERATE_ASSERTION, + { + onCompleted: ({ generateAssertionOptions: options }) => { + startAssertion(options) + .then(res => { + validateAssertion({ + variables: { + assertionResponse: res, + domain: window.location.hostname, + }, + }) + }) + .catch(err => { + console.error(err) + }) + }, + }, + ) + + const [getUserData, { error: userDataQueryError }] = useLazyQuery( + GET_USER_DATA, + { + onCompleted: ({ userData }) => { + setUserData(userData) + navigate('/') + }, + }, + ) + + return ( + + submitLogin(values.email, values.password, values.rememberMe) + }> + {({ errors, touched }) => ( +
    + + +
    + + Keep me logged in +
    +
    + {getErrorMsg( + errors, + touched, + loginMutationError || + FIDOMutationError || + assertionQueryError || + userDataQueryError, + ) && ( +

    + {getErrorMsg( + errors, + touched, + loginMutationError || + FIDOMutationError || + assertionQueryError || + userDataQueryError, + )} +

    + )} + {strategy !== 'FIDO2FA' && ( + + )} + +
    + + )} +
    + ) +} + +export default LoginState diff --git a/packages/admin-ui/src/pages/Authentication/Register.jsx b/packages/admin-ui/src/pages/Authentication/Register.jsx new file mode 100644 index 0000000..dedd30f --- /dev/null +++ b/packages/admin-ui/src/pages/Authentication/Register.jsx @@ -0,0 +1,216 @@ +import { useQuery, useMutation, gql } from '@apollo/client' +import Grid from '@mui/material/Grid' +import Paper from '@mui/material/Paper' +import { Field, Form, Formik } from 'formik' +import React, { useReducer } from 'react' +import { useLocation, useSearchParams } from 'wouter' +import { H2, Label3, P } from '../../components/typography' +import Logo from '../../styling/icons/menu/logo.svg?react' +import * as Yup from 'yup' + +import { Button } from '../../components/buttons' +import { SecretInput } from '../../components/inputs/formik' +import classes from './Authentication.module.css' + +const VALIDATE_REGISTER_LINK = gql` + query validateRegisterLink($token: String!) { + validateRegisterLink(token: $token) { + username + role + } + } +` + +const REGISTER = gql` + mutation register( + $token: String! + $username: String! + $password: String! + $role: String! + ) { + register( + token: $token + username: $username + password: $password + role: $role + ) + } +` + +const PASSWORD_MIN_LENGTH = 8 +const validationSchema = Yup.object({ + password: Yup.string() + .required('A password is required') + .min( + PASSWORD_MIN_LENGTH, + `Your password must contain at least ${PASSWORD_MIN_LENGTH} characters`, + ), + confirmPassword: Yup.string() + .required('Please confirm the password') + .oneOf([Yup.ref('password')], 'Passwords must match'), +}) + +const initialValues = { + password: '', + confirmPassword: '', +} + +const initialState = { + username: null, + role: null, + result: '', +} + +const reducer = (state, action) => { + const { type, payload } = action + return { ...state, ...payload, result: type } +} + +const getErrorMsg = ( + formikErrors, + formikTouched, + queryError, + mutationError, +) => { + if (!formikErrors || !formikTouched) return null + if (queryError || mutationError) return 'Internal server error' + if (formikErrors.password && formikTouched.password) + return formikErrors.password + if (formikErrors.confirmPassword && formikTouched.confirmPassword) + return formikErrors.confirmPassword + return null +} + +const Register = () => { + const [, navigate] = useLocation() + const [searchParams] = useSearchParams() + const token = searchParams.get('t') + + const [state, dispatch] = useReducer(reducer, initialState) + + const queryOptions = { + variables: { token: token }, + onCompleted: ({ validateRegisterLink: info }) => { + if (!info) { + return dispatch({ + type: 'failure', + }) + } + dispatch({ + type: 'success', + payload: { + username: info.username, + role: info.role, + }, + }) + }, + onError: () => + dispatch({ + type: 'failure', + }), + } + + const { error: queryError, loading } = useQuery( + VALIDATE_REGISTER_LINK, + queryOptions, + ) + + const [register, { error: mutationError }] = useMutation(REGISTER, { + onCompleted: ({ register: success }) => { + if (success) navigate('/') + }, + }) + + return ( + + +
    + +
    +
    + +

    Lamassu Admin

    +
    + {!loading && state.result === 'success' && ( + { + register({ + variables: { + token: token, + username: state.username, + password: values.password, + role: state.role, + }, + }) + }}> + {({ errors, touched }) => ( +
    + + +
    + {getErrorMsg( + errors, + touched, + queryError, + mutationError, + ) && ( +

    + {getErrorMsg( + errors, + touched, + queryError, + mutationError, + )} +

    + )} + +
    + + )} +
    + )} + {!loading && state.result === 'failure' && ( + <> + Link has expired + + To obtain a new link, run the command{' '} + lamassu-register in your server’s terminal. + + + )} +
    +
    +
    +
    +
    + ) +} + +export default Register diff --git a/packages/admin-ui/src/pages/Authentication/Reset2FA.jsx b/packages/admin-ui/src/pages/Authentication/Reset2FA.jsx new file mode 100644 index 0000000..3f2652d --- /dev/null +++ b/packages/admin-ui/src/pages/Authentication/Reset2FA.jsx @@ -0,0 +1,204 @@ +import { useQuery, useMutation, gql } from '@apollo/client' +import Grid from '@mui/material/Grid' +import Paper from '@mui/material/Paper' +import { Form, Formik } from 'formik' +import { QRCodeSVG as QRCode } from 'qrcode.react' +import React, { useReducer, useState } from 'react' +import { useLocation, useSearchParams } from 'wouter' +import { H2, Label2, Label3, P } from '../../components/typography' +import Logo from '../../styling/icons/menu/logo.svg?react' + +import { ActionButton, Button } from '../../components/buttons' +import { CodeInput } from '../../components/inputs/base' +import { primaryColor } from '../../styling/variables' + +import classes from './Authentication.module.css' + +const VALIDATE_RESET_2FA_LINK = gql` + query validateReset2FALink($token: String!) { + validateReset2FALink(token: $token) { + user_id + secret + otpauth + } + } +` + +const RESET_2FA = gql` + mutation reset2FA($token: String!, $userID: ID!, $code: String!) { + reset2FA(token: $token, userID: $userID, code: $code) + } +` + +const initialState = { + userID: null, + secret: null, + otpauth: null, + result: null, +} + +const reducer = (state, action) => { + const { type, payload } = action + return { ...state, ...payload, result: type } +} + +const Reset2FA = () => { + const [, navigate] = useLocation() + const [searchParams] = useSearchParams() + const token = searchParams.get('t') + + const [isShowing, setShowing] = useState(false) + const [invalidToken, setInvalidToken] = useState(false) + const [twoFAConfirmation, setTwoFAConfirmation] = useState('') + + const [state, dispatch] = useReducer(reducer, initialState) + + const handle2FAChange = value => { + setTwoFAConfirmation(value) + setInvalidToken(false) + } + + const { error: queryError, loading } = useQuery(VALIDATE_RESET_2FA_LINK, { + variables: { token: token }, + onCompleted: ({ validateReset2FALink: info }) => { + if (!info) { + dispatch({ + type: 'failure', + }) + } else { + dispatch({ + type: 'success', + payload: { + userID: info.user_id, + secret: info.secret, + otpauth: info.otpauth, + }, + }) + } + }, + onError: () => { + dispatch({ + type: 'failure', + }) + }, + }) + + const [reset2FA, { error: mutationError }] = useMutation(RESET_2FA, { + onCompleted: ({ reset2FA: success }) => { + success ? navigate('/') : setInvalidToken(true) + }, + }) + + const getErrorMsg = () => { + if (queryError) return 'Internal server error' + if (twoFAConfirmation.length !== 6 && invalidToken) + return 'The code should have 6 characters!' + if (mutationError || invalidToken) + return 'Code is invalid. Please try again.' + return null + } + + const handleSubmit = () => { + if (twoFAConfirmation.length !== 6) { + setInvalidToken(true) + return + } + reset2FA({ + variables: { + token: token, + userID: state.userID, + code: twoFAConfirmation, + }, + }) + } + + return ( + + +
    + +
    +
    + +

    Lamassu Admin

    +
    + {!loading && state.result === 'success' && ( + <> +
    + + To finish this process, please scan the following QR code + or insert the secret further below on an authentication + app of your choice, such Google Authenticator or Authy. + +
    +
    + +
    +
    + + Your secret: + + + {state.secret} + + { + setShowing(!isShowing) + }}> + {isShowing ? 'Hide' : 'Show'} + +
    +
    + {/* TODO: refactor the 2FA CodeInput to properly use Formik */} + {}} initialValues={{}}> +
    + +
    + {getErrorMsg() && ( +

    {getErrorMsg()}

    + )} + +
    + +
    +
    + + )} + {!loading && state.result === 'failure' && ( + <> + Link has expired + + )} +
    +
    +
    +
    +
    + ) +} + +export default Reset2FA diff --git a/packages/admin-ui/src/pages/Authentication/ResetPassword.jsx b/packages/admin-ui/src/pages/Authentication/ResetPassword.jsx new file mode 100644 index 0000000..c32412f --- /dev/null +++ b/packages/admin-ui/src/pages/Authentication/ResetPassword.jsx @@ -0,0 +1,167 @@ +import { useQuery, useMutation, gql } from '@apollo/client' +import Grid from '@mui/material/Grid' +import Paper from '@mui/material/Paper' +import { Field, Form, Formik } from 'formik' +import React, { useState } from 'react' +import { useLocation, useSearchParams } from 'wouter' +import { H2, Label3, P } from '../../components/typography' +import Logo from '../../styling/icons/menu/logo.svg?react' +import * as Yup from 'yup' + +import { Button } from '../../components/buttons' +import { SecretInput } from '../../components/inputs/formik' + +import classes from './Authentication.module.css' + +const VALIDATE_RESET_PASSWORD_LINK = gql` + query validateResetPasswordLink($token: String!) { + validateResetPasswordLink(token: $token) { + id + } + } +` + +const RESET_PASSWORD = gql` + mutation resetPassword($token: String!, $userID: ID!, $newPassword: String!) { + resetPassword(token: $token, userID: $userID, newPassword: $newPassword) + } +` + +const validationSchema = Yup.object().shape({ + password: Yup.string() + .required('A new password is required') + .test( + 'len', + 'New password must contain more than 8 characters', + val => val.length >= 8, + ), + confirmPassword: Yup.string().oneOf( + [Yup.ref('password'), null], + 'Passwords must match', + ), +}) + +const initialValues = { + password: '', + confirmPassword: '', +} + +const getErrorMsg = (formikErrors, formikTouched, mutationError) => { + if (!formikErrors || !formikTouched) return null + if (mutationError) return 'Internal server error' + if (formikErrors.password && formikTouched.password) + return formikErrors.password + if (formikErrors.confirmPassword && formikTouched.confirmPassword) + return formikErrors.confirmPassword + return null +} + +const ResetPassword = () => { + const [, navigate] = useLocation() + const [searchParams] = useSearchParams() + const token = searchParams.get('t') + const [userID, setUserID] = useState(null) + const [isLoading, setLoading] = useState(true) + const [wasSuccessful, setSuccess] = useState(false) + + useQuery(VALIDATE_RESET_PASSWORD_LINK, { + variables: { token: token }, + onCompleted: ({ validateResetPasswordLink: info }) => { + setLoading(false) + if (!info) { + setSuccess(false) + } else { + setSuccess(true) + setUserID(info.id) + } + }, + onError: () => { + setLoading(false) + setSuccess(false) + }, + }) + + const [resetPassword, { error }] = useMutation(RESET_PASSWORD, { + onCompleted: ({ resetPassword: success }) => { + if (success) navigate('/') + }, + }) + + return ( + + +
    + +
    +
    + +

    Lamassu Admin

    +
    + {!isLoading && wasSuccessful && ( + { + resetPassword({ + variables: { + token: token, + userID: userID, + newPassword: values.confirmPassword, + }, + }) + }}> + {({ errors, touched }) => ( +
    + + +
    + {getErrorMsg(errors, touched, error) && ( +

    + {getErrorMsg(errors, touched, error)} +

    + )} + +
    + + )} +
    + )} + {!isLoading && !wasSuccessful && ( + <> + Link has expired + + )} +
    +
    +
    +
    +
    + ) +} + +export default ResetPassword diff --git a/packages/admin-ui/src/pages/Authentication/Setup2FAState.jsx b/packages/admin-ui/src/pages/Authentication/Setup2FAState.jsx new file mode 100644 index 0000000..80f6741 --- /dev/null +++ b/packages/admin-ui/src/pages/Authentication/Setup2FAState.jsx @@ -0,0 +1,174 @@ +import { useMutation, useQuery, useLazyQuery, gql } from '@apollo/client' +import { Form, Formik } from 'formik' +import { QRCodeSVG as QRCode } from 'qrcode.react' +import React, { useContext, useState } from 'react' +import { useLocation } from 'wouter' +import { Label3, P } from '../../components/typography' + +import AppContext from '../../AppContext' +import { ActionButton, Button } from '../../components/buttons' +import { CodeInput } from '../../components/inputs/base' +import { primaryColor } from '../../styling/variables' + +import classes from './Authentication.module.css' + +const SETUP_2FA = gql` + mutation setup2FA( + $username: String! + $password: String! + $rememberMe: Boolean! + $codeConfirmation: String! + ) { + setup2FA( + username: $username + password: $password + rememberMe: $rememberMe + codeConfirmation: $codeConfirmation + ) + } +` + +const GET_2FA_SECRET = gql` + query get2FASecret($username: String!, $password: String!) { + get2FASecret(username: $username, password: $password) { + secret + otpauth + } + } +` + +const GET_USER_DATA = gql` + { + userData { + id + username + role + } + } +` + +const Setup2FAState = ({ state }) => { + const [, navigate] = useLocation() + const { setUserData } = useContext(AppContext) + + const [secret, setSecret] = useState(null) + const [otpauth, setOtpauth] = useState(null) + const [isShowing, setShowing] = useState(false) + + const [invalidToken, setInvalidToken] = useState(false) + const [twoFAConfirmation, setTwoFAConfirmation] = useState('') + + const handle2FAChange = value => { + setTwoFAConfirmation(value) + setInvalidToken(false) + } + + const queryOptions = { + variables: { username: state.clientField, password: state.passwordField }, + onCompleted: ({ get2FASecret }) => { + setSecret(get2FASecret.secret) + setOtpauth(get2FASecret.otpauth) + }, + } + + const mutationOptions = { + variables: { + username: state.clientField, + password: state.passwordField, + rememberMe: state.rememberMeField, + codeConfirmation: twoFAConfirmation, + }, + } + + const { error: queryError } = useQuery(GET_2FA_SECRET, queryOptions) + + const [getUserData] = useLazyQuery(GET_USER_DATA, { + onCompleted: ({ userData }) => { + setUserData(userData) + navigate('/') + }, + }) + + const [setup2FA, { error: mutationError }] = useMutation(SETUP_2FA, { + onCompleted: ({ setup2FA: success }) => { + success ? getUserData() : setInvalidToken(true) + }, + }) + + const getErrorMsg = () => { + if (mutationError || queryError) return 'Internal server error.' + if (twoFAConfirmation.length !== 6 && invalidToken) + return 'The code should have 6 characters!' + if (invalidToken) return 'Code is invalid. Please try again.' + return null + } + + const handleSubmit = () => { + if (twoFAConfirmation.length !== 6) { + setInvalidToken(true) + return + } + setup2FA(mutationOptions) + } + + return ( + secret && + otpauth && ( + <> +
    + + This account does not yet have two-factor authentication enabled. To + secure the admin, two-factor authentication is required. + + + To complete the registration process, scan the following QR code or + insert the secret below on a 2FA app, such as Google Authenticator + or AndOTP. + +
    +
    + +
    +
    + Your secret: + + {secret} + + { + setShowing(!isShowing) + }}> + {isShowing ? 'Hide' : 'Show'} + +
    +
    + {/* TODO: refactor the 2FA CodeInput to properly use Formik */} + {}} initialValues={{}}> +
    + +
    + {getErrorMsg() && ( +

    {getErrorMsg()}

    + )} + +
    + +
    +
    + + ) + ) +} + +export default Setup2FAState diff --git a/packages/admin-ui/src/pages/Authentication/states.js b/packages/admin-ui/src/pages/Authentication/states.js new file mode 100644 index 0000000..180ccf2 --- /dev/null +++ b/packages/admin-ui/src/pages/Authentication/states.js @@ -0,0 +1,8 @@ +const STATES = { + LOGIN: 'LOGIN', + SETUP_2FA: 'SETUP2FA', + INPUT_2FA: 'INPUT2FA', + FIDO: 'FIDO', +} + +export { STATES } diff --git a/packages/admin-ui/src/pages/Blacklist/Blacklist.jsx b/packages/admin-ui/src/pages/Blacklist/Blacklist.jsx new file mode 100644 index 0000000..06477f3 --- /dev/null +++ b/packages/admin-ui/src/pages/Blacklist/Blacklist.jsx @@ -0,0 +1,314 @@ +import { useQuery, useMutation, gql } from '@apollo/client' +import Dialog from '@mui/material/Dialog' +import DialogTitle from '@mui/material/DialogTitle' +import DialogContent from '@mui/material/DialogContent' +import Switch from '@mui/material/Switch' +import SvgIcon from '@mui/material/SvgIcon' +import IconButton from '@mui/material/IconButton' +import * as R from 'ramda' +import React, { useState } from 'react' +import { HelpTooltip } from '../../components/Tooltip' +import TitleSection from '../../components/layout/TitleSection' +import { H2, Label2, P, Info3, Info2 } from '../../components/typography' +import CloseIcon from '../../styling/icons/action/close/zodiac.svg?react' +import ReverseSettingsIcon from '../../styling/icons/circle buttons/settings/white.svg?react' +import SettingsIcon from '../../styling/icons/circle buttons/settings/zodiac.svg?react' + +import { Link, Button, SupportLinkButton } from '../../components/buttons' +import { fromNamespace, toNamespace } from '../../utils/config' + +import BlackListAdvanced from './BlacklistAdvanced' +import BlackListModal from './BlacklistModal' +import BlacklistTable from './BlacklistTable' + +const DELETE_ROW = gql` + mutation DeleteBlacklistRow($address: String!) { + deleteBlacklistRow(address: $address) { + address + } + } +` + +const GET_BLACKLIST = gql` + query getBlacklistData { + blacklist { + address + } + cryptoCurrencies { + display + code + } + } +` + +const SAVE_CONFIG = gql` + mutation Save($config: JSONObject) { + saveConfig(config: $config) + } +` + +const GET_INFO = gql` + query getData { + config + } +` + +const ADD_ROW = gql` + mutation InsertBlacklistRow($address: String!) { + insertBlacklistRow(address: $address) { + address + } + } +` + +const GET_BLACKLIST_MESSAGES = gql` + query getBlacklistMessages { + blacklistMessages { + id + label + content + allowToggle + } + } +` + +const EDIT_BLACKLIST_MESSAGE = gql` + mutation editBlacklistMessage($id: ID, $content: String) { + editBlacklistMessage(id: $id, content: $content) { + id + } + } +` + +const PaperWalletDialog = ({ onConfirmed, onDissmised, open, props }) => { + return ( + +
    + + + + + + +

    {'Are you sure you want to enable this?'}

    +
    + + {`This mode means that only paper wallets will be printed for users, and they won't be permitted to scan an address from their own wallet.`} + {`This mode is only useful for countries like Switzerland which mandates such a feature.\n`} + {`Don't enable this if you want users to be able to scan an address of their choosing.`} +
    + +
    +
    +
    +
    + ) +} + +const Blacklist = () => { + const { data: blacklistResponse } = useQuery(GET_BLACKLIST) + const { data: configData } = useQuery(GET_INFO) + const { data: messagesResponse, refetch } = useQuery(GET_BLACKLIST_MESSAGES) + const [showModal, setShowModal] = useState(false) + const [errorMsg, setErrorMsg] = useState(null) + const [editMessageError, setEditMessageError] = useState(null) + const [deleteDialog, setDeleteDialog] = useState(false) + const [confirmDialog, setConfirmDialog] = useState(false) + const [advancedSettings, setAdvancedSettings] = useState(false) + + const [deleteEntry] = useMutation(DELETE_ROW, { + onError: ({ message }) => { + const errorMessage = message ?? 'Error while deleting row' + setErrorMsg(errorMessage) + }, + onCompleted: () => setDeleteDialog(false), + refetchQueries: () => ['getBlacklistData'], + }) + + const [addEntry] = useMutation(ADD_ROW, { + refetchQueries: () => ['getBlacklistData'], + }) + + const [saveConfig] = useMutation(SAVE_CONFIG, { + refetchQueries: () => ['getData'], + }) + + const [editMessage] = useMutation(EDIT_BLACKLIST_MESSAGE, { + onError: e => setEditMessageError(e), + refetchQueries: () => ['getBlacklistData'], + }) + + const blacklistData = R.path(['blacklist'])(blacklistResponse) ?? [] + + const complianceConfig = + configData?.config && fromNamespace('compliance')(configData.config) + + const rejectAddressReuse = !!complianceConfig?.rejectAddressReuse + + const enablePaperWalletOnly = !!complianceConfig?.enablePaperWalletOnly + + const addressReuseSave = rawConfig => { + const config = toNamespace('compliance')(rawConfig) + return saveConfig({ variables: { config } }) + } + + const handleDeleteEntry = address => { + deleteEntry({ variables: { address } }) + } + + const handleConfirmDialog = confirm => { + addressReuseSave({ + enablePaperWalletOnly: confirm, + }) + setConfirmDialog(false) + } + + const addToBlacklist = async address => { + setErrorMsg(null) + try { + const res = await addEntry({ variables: { address } }) + if (!res?.errors) { + return setShowModal(false) + } + const duplicateKeyError = res?.errors?.some(e => { + return e.message.includes('duplicate') + }) + if (duplicateKeyError) { + setErrorMsg('This address is already being blocked') + } else { + setErrorMsg(`Server error${': ' + res?.errors[0]?.message}`) + } + } catch (e) { + console.error(e) + setErrorMsg('Server error') + } + } + + const editBlacklistMessage = r => { + editMessage({ + variables: { + id: r.id, + content: r.content, + }, + }) + } + + return ( + <> + { + setConfirmDialog(false) + }} + /> + + {!advancedSettings && ( +
    +
    +

    Enable paper wallet (only)

    + + enablePaperWalletOnly + ? addressReuseSave({ + enablePaperWalletOnly: e.target.checked, + }) + : setConfirmDialog(true) + } + value={enablePaperWalletOnly} + /> + {enablePaperWalletOnly ? 'On' : 'Off'} + +

    + The "Enable paper wallet (only)" option means that only paper + wallets will be printed for users, and they won't be permitted + to scan an address from their own wallet. +

    +
    +
    +
    +

    Reject reused addresses

    + { + addressReuseSave({ rejectAddressReuse: event.target.checked }) + }} + value={rejectAddressReuse} + /> + {rejectAddressReuse ? 'On' : 'Off'} + +

    + For details about rejecting address reuse, please read the + relevant knowledgebase article: +

    + +
    +
    + setShowModal(true)}> + Blacklist new addresses + +
    + )} +
    + {!advancedSettings && ( +
    + +
    + )} + {advancedSettings && ( + refetch()} + /> + )} + {showModal && ( + { + setErrorMsg(null) + setShowModal(false) + }} + errorMsg={errorMsg} + addToBlacklist={addToBlacklist} + /> + )} + + ) +} + +export default Blacklist diff --git a/packages/admin-ui/src/pages/Blacklist/BlacklistAdvanced.jsx b/packages/admin-ui/src/pages/Blacklist/BlacklistAdvanced.jsx new file mode 100644 index 0000000..306dc31 --- /dev/null +++ b/packages/admin-ui/src/pages/Blacklist/BlacklistAdvanced.jsx @@ -0,0 +1,172 @@ +import IconButton from '@mui/material/IconButton' +import SvgIcon from '@mui/material/SvgIcon' +import { Form, Formik, Field } from 'formik' +import * as R from 'ramda' +import React, { useState } from 'react' +import ErrorMessage from '../../components/ErrorMessage' +import Modal from '../../components/Modal' +import DataTable from '../../components/tables/DataTable' +import DisabledDeleteIcon from '../../styling/icons/action/delete/disabled.svg?react' +import DeleteIcon from '../../styling/icons/action/delete/enabled.svg?react' +import EditIcon from '../../styling/icons/action/edit/enabled.svg?react' +import DefaultIconReverse from '../../styling/icons/button/retry/white.svg?react' +import DefaultIcon from '../../styling/icons/button/retry/zodiac.svg?react' +import * as Yup from 'yup' + +import { ActionButton, Button } from '../../components/buttons' +import { TextInput } from '../../components/inputs/formik' + +const DEFAULT_MESSAGE = `This address may be associated with a deceptive offer or a prohibited group. Please make sure you're using an address from your own wallet.` + +const getErrorMsg = (formikErrors, formikTouched, mutationError) => { + if (mutationError) return 'Internal server error' + if (!formikErrors || !formikTouched) return null + if (formikErrors.event && formikTouched.event) return formikErrors.event + if (formikErrors.message && formikTouched.message) return formikErrors.message + return null +} + +const BlacklistAdvanced = ({ + data, + editBlacklistMessage, + onClose, + mutationError, +}) => { + const [selectedMessage, setSelectedMessage] = useState(null) + + const elements = [ + { + name: 'label', + header: 'Label', + width: 250, + textAlign: 'left', + size: 'sm', + view: it => R.path(['label'], it), + }, + { + name: 'content', + header: 'Content', + width: 690, + textAlign: 'left', + size: 'sm', + view: it => R.path(['content'], it), + }, + { + name: 'edit', + header: 'Edit', + width: 130, + textAlign: 'center', + size: 'sm', + view: it => ( + setSelectedMessage(it)}> + + + + + ), + }, + { + name: 'deleteButton', + header: 'Delete', + width: 130, + textAlign: 'center', + size: 'sm', + view: it => ( + + + {R.path(['allowToggle'], it) ? ( + + ) : ( + + )} + + + ), + }, + ] + + const handleModalClose = () => { + setSelectedMessage(null) + } + + const handleSubmit = values => { + editBlacklistMessage(values) + handleModalClose() + !R.isNil(onClose) && onClose() + } + + const initialValues = { + label: !R.isNil(selectedMessage) ? selectedMessage.label : '', + content: !R.isNil(selectedMessage) ? selectedMessage.content : '', + } + + const validationSchema = Yup.object().shape({ + label: Yup.string().required('A label is required!'), + content: Yup.string().required('The message content is required!').trim(), + }) + + return ( + <> + + {selectedMessage && ( + + + handleSubmit({ id: selectedMessage.id, ...values }) + }> + {({ errors, touched, setFieldValue }) => ( +
    + setFieldValue('content', DEFAULT_MESSAGE)}> + Reset to default + + +
    + {getErrorMsg(errors, touched, mutationError) && ( + + {getErrorMsg(errors, touched, mutationError)} + + )} + +
    + + )} +
    +
    + )} + + ) +} + +export default BlacklistAdvanced diff --git a/packages/admin-ui/src/pages/Blacklist/BlacklistModal.jsx b/packages/admin-ui/src/pages/Blacklist/BlacklistModal.jsx new file mode 100644 index 0000000..5bb5c8e --- /dev/null +++ b/packages/admin-ui/src/pages/Blacklist/BlacklistModal.jsx @@ -0,0 +1,62 @@ +import { Formik, Form, Field } from 'formik' +import * as R from 'ramda' +import React from 'react' +import ErrorMessage from '../../components/ErrorMessage' +import Modal from '../../components/Modal' +import { H3 } from '../../components/typography' +import * as Yup from 'yup' + +import { Link } from '../../components/buttons' +import { TextInput } from '../../components/inputs/formik' + +const BlackListModal = ({ onClose, addToBlacklist, errorMsg }) => { + const handleAddToBlacklist = address => { + addToBlacklist(address) + } + + const placeholderAddress = '1ADwinnimZKGgQ3dpyfoUZvJh4p1UWSSpD' + + return ( + + { + handleAddToBlacklist(address.trim()) + }}> +
    +

    Blacklist new address

    + +
    + {!R.isNil(errorMsg) && {errorMsg}} +
    + + Blacklist address + +
    +
    + +
    +
    + ) +} + +export default BlackListModal diff --git a/packages/admin-ui/src/pages/Blacklist/BlacklistTable.jsx b/packages/admin-ui/src/pages/Blacklist/BlacklistTable.jsx new file mode 100644 index 0000000..4946a27 --- /dev/null +++ b/packages/admin-ui/src/pages/Blacklist/BlacklistTable.jsx @@ -0,0 +1,78 @@ +import IconButton from '@mui/material/IconButton' +import SvgIcon from '@mui/material/SvgIcon' +import * as R from 'ramda' +import React, { useState } from 'react' +import { DeleteDialog } from '../../components/DeleteDialog' +import DataTable from '../../components/tables/DataTable' +import CopyToClipboard from '../../components/CopyToClipboard.jsx' +import DeleteIcon from '../../styling/icons/action/delete/enabled.svg?react' + +const BlacklistTable = ({ + data, + handleDeleteEntry, + errorMessage, + setErrorMessage, + deleteDialog, + setDeleteDialog, +}) => { + const [toBeDeleted, setToBeDeleted] = useState() + + const elements = [ + { + name: 'address', + header: 'Address', + width: 1070, + textAlign: 'left', + size: 'sm', + view: it => ( +
    + {R.path(['address'], it)} +
    + ), + }, + { + name: 'deleteButton', + header: 'Delete', + width: 130, + textAlign: 'center', + size: 'sm', + view: it => ( + { + setDeleteDialog(true) + setToBeDeleted(it) + }}> + + + + + ), + }, + ] + + return ( + <> + + { + setDeleteDialog(false) + setErrorMessage(null) + }} + onConfirmed={() => { + setErrorMessage(null) + handleDeleteEntry(R.path(['address'], toBeDeleted)) + }} + errorMessage={errorMessage} + /> + + ) +} + +export default BlacklistTable diff --git a/packages/admin-ui/src/pages/Blacklist/index.js b/packages/admin-ui/src/pages/Blacklist/index.js new file mode 100644 index 0000000..4a7e8ce --- /dev/null +++ b/packages/admin-ui/src/pages/Blacklist/index.js @@ -0,0 +1,3 @@ +import Blacklist from './Blacklist' + +export default Blacklist diff --git a/packages/admin-ui/src/pages/Cashout/Cashout.jsx b/packages/admin-ui/src/pages/Cashout/Cashout.jsx new file mode 100644 index 0000000..8ee74e9 --- /dev/null +++ b/packages/admin-ui/src/pages/Cashout/Cashout.jsx @@ -0,0 +1,123 @@ +import { useQuery, useMutation, gql } from '@apollo/client' +import * as R from 'ramda' +import React, { useState } from 'react' +import { HelpTooltip } from '../../components/Tooltip' +import TitleSection from '../../components/layout/TitleSection' +import { P } from '../../components/typography' + +import { SupportLinkButton } from '../../components/buttons' +import { NamespacedTable as EditableTable } from '../../components/editableTable' +import { EmptyTable } from '../../components/table' +import { fromNamespace, toNamespace } from '../../utils/config' + +import Wizard from './Wizard' +import { DenominationsSchema, getElements } from './helper' + +const SAVE_CONFIG = gql` + mutation Save($config: JSONObject) { + saveConfig(config: $config) + } +` + +const GET_INFO = gql` + query getData { + machines { + name + deviceId + cashUnits { + cashbox + cassette1 + cassette2 + cassette3 + cassette4 + recycler1 + recycler2 + recycler3 + recycler4 + recycler5 + recycler6 + } + numberOfCassettes + numberOfRecyclers + } + config + } +` + +const CashOut = ({ name: SCREEN_KEY }) => { + const [wizard, setWizard] = useState(false) + const { data, loading } = useQuery(GET_INFO) + + const [saveConfig, { error }] = useMutation(SAVE_CONFIG, { + onCompleted: () => setWizard(false), + refetchQueries: () => ['getData'], + }) + + const save = rawConfig => { + const config = toNamespace(SCREEN_KEY)(rawConfig) + return saveConfig({ variables: { config } }) + } + + const config = data?.config && fromNamespace(SCREEN_KEY)(data.config) + + const locale = data?.config && fromNamespace('locale')(data.config) + const machines = data?.machines ?? [] + + const onToggle = id => { + const namespaced = fromNamespace(id)(config) + if (!DenominationsSchema.isValidSync(namespaced)) return setWizard(id) + save(toNamespace(id, { active: !namespaced?.active })) + } + + const wasNeverEnabled = it => R.compose(R.length, R.keys)(it) === 1 + + return ( + !loading && ( + <> + +

    + For details on configuring cash-out, please read the relevant + knowledgebase article: +

    + + + } + /> + + {R.isEmpty(machines) && } + {wizard && ( + setWizard(false)} + save={save} + error={error?.message} + locale={locale} + /> + )} + + ) + ) +} + +export default CashOut diff --git a/packages/admin-ui/src/pages/Cashout/Wizard.jsx b/packages/admin-ui/src/pages/Cashout/Wizard.jsx new file mode 100644 index 0000000..67a20e3 --- /dev/null +++ b/packages/admin-ui/src/pages/Cashout/Wizard.jsx @@ -0,0 +1,153 @@ +import * as R from 'ramda' +import React, { useState } from 'react' +import Modal from '../../components/Modal' +import * as Yup from 'yup' + +import { Autocomplete } from '../../components/inputs/formik' +import denominations from '../../utils/bill-denominations' +import { getBillOptions } from '../../utils/bill-options' +import { toNamespace } from '../../utils/config' +import { transformNumber } from '../../utils/number' + +import WizardSplash from './WizardSplash' +import WizardStep from './WizardStep' +import { DenominationsSchema } from './helper' + +const MODAL_WIDTH = 554 +const MODAL_HEIGHT = 520 + +const Wizard = ({ machine, locale, onClose, save, error }) => { + // Each stacker counts as two steps, one for front and another for rear + const LAST_STEP = machine.numberOfCassettes + machine.numberOfRecyclers + 1 + const [{ step, config }, setState] = useState({ + step: 0, + config: { active: true }, + }) + + const options = getBillOptions(locale, denominations) + + const title = `Enable cash-out` + const isLastStep = step === LAST_STEP + + const onContinue = async it => { + if (isLastStep) { + return save( + toNamespace( + machine.deviceId, + DenominationsSchema.cast(config, { assert: false }), + ), + ) + } + + const newConfig = R.mergeRight(config, it) + + setState({ + step: step + 1, + config: newConfig, + }) + } + + const steps = R.concat( + R.map( + it => ({ + model: 'cassette', + type: `cassette${it}`, + display: `Cassette ${it}`, + component: Autocomplete, + inputProps: { + options: options, + labelProp: 'display', + valueProp: 'code', + }, + }), + R.range(1, machine.numberOfCassettes + 1), + ), + R.map( + it => ({ + type: `recycler${it}`, + model: 'recycler', + display: `Recycler ${it}`, + component: Autocomplete, + inputProps: { + options: options, + labelProp: 'display', + valueProp: 'code', + }, + }), + R.range(1, machine.numberOfRecyclers + 1), + ), + ) + + const schema = () => + Yup.object().shape({ + cassette1: + machine.numberOfCassettes >= 1 && step >= 1 + ? Yup.number().required() + : Yup.number().transform(transformNumber).nullable(), + cassette2: + machine.numberOfCassettes >= 2 && step >= 2 + ? Yup.number().required() + : Yup.number().transform(transformNumber).nullable(), + cassette3: + machine.numberOfCassettes >= 3 && step >= 3 + ? Yup.number().required() + : Yup.number().transform(transformNumber).nullable(), + cassette4: + machine.numberOfCassettes >= 4 && step >= 4 + ? Yup.number().required() + : Yup.number().transform(transformNumber).nullable(), + recycler1: + machine.numberOfRecyclers >= 1 && step >= machine.numberOfCassettes + 1 + ? Yup.number().required() + : Yup.number().transform(transformNumber).nullable(), + recycler2: + machine.numberOfRecyclers >= 2 && step >= machine.numberOfCassettes + 2 + ? Yup.number().required() + : Yup.number().transform(transformNumber).nullable(), + recycler3: + machine.numberOfRecyclers >= 3 && step >= machine.numberOfCassettes + 3 + ? Yup.number().required() + : Yup.number().transform(transformNumber).nullable(), + recycler4: + machine.numberOfRecyclers >= 4 && step >= machine.numberOfCassettes + 4 + ? Yup.number().required() + : Yup.number().transform(transformNumber).nullable(), + recycler5: + machine.numberOfRecyclers >= 5 && step >= machine.numberOfCassettes + 5 + ? Yup.number().required() + : Yup.number().transform(transformNumber).nullable(), + recycler6: + machine.numberOfRecyclers >= 6 && step >= machine.numberOfCassettes + 6 + ? Yup.number().required() + : Yup.number().transform(transformNumber).nullable(), + }) + + return ( + + {step === 0 && ( + onContinue()} /> + )} + {step !== 0 && ( + + )} + + ) +} + +export default Wizard diff --git a/packages/admin-ui/src/pages/Cashout/WizardSplash.jsx b/packages/admin-ui/src/pages/Cashout/WizardSplash.jsx new file mode 100644 index 0000000..546a75c --- /dev/null +++ b/packages/admin-ui/src/pages/Cashout/WizardSplash.jsx @@ -0,0 +1,34 @@ +import React from 'react' +import { H1, P, Info2 } from '../../components/typography' +import TxOutIcon from '../../styling/icons/direction/cash-out.svg?react' + +import { Button } from '../../components/buttons' + +const WizardSplash = ({ name, onContinue }) => { + return ( +
    +
    +

    + + Enable cash-out +

    + + {name} + +

    + You are about to activate cash-out functionality on your {name}{' '} + machine which will allow your customers to sell crypto to you. +

    +

    + In order to activate cash-out for this machine, please enter the + denominations for the machine. +

    +
    + +
    + ) +} + +export default WizardSplash diff --git a/packages/admin-ui/src/pages/Cashout/WizardStep.jsx b/packages/admin-ui/src/pages/Cashout/WizardStep.jsx new file mode 100644 index 0000000..c4757f7 --- /dev/null +++ b/packages/admin-ui/src/pages/Cashout/WizardStep.jsx @@ -0,0 +1,153 @@ +import { Formik, Form, Field } from 'formik' +import React from 'react' +import ErrorMessage from '../../components/ErrorMessage' +import Stepper from '../../components/Stepper' +import { Info2, H4, P, Info1, Label1 } from '../../components/typography' +import WarningIcon from '../../styling/icons/warning-icon/comet.svg?react' + +import { Button } from '../../components/buttons' +import { NumberInput } from '../../components/inputs/formik' +import cassetteOne from '../../styling/icons/cassettes/cashout-cassette-1.svg' +import cassetteTwo from '../../styling/icons/cassettes/cashout-cassette-2.svg' +import tejo3CassetteOne from '../../styling/icons/cassettes/tejo/3-cassettes/3-cassettes-open-1-left.svg' +import tejo3CassetteTwo from '../../styling/icons/cassettes/tejo/3-cassettes/3-cassettes-open-2-left.svg' +import tejo3CassetteThree from '../../styling/icons/cassettes/tejo/3-cassettes/3-cassettes-open-3-left.svg' +import tejo4CassetteOne from '../../styling/icons/cassettes/tejo/4-cassettes/4-cassettes-open-1-left.svg' +import tejo4CassetteTwo from '../../styling/icons/cassettes/tejo/4-cassettes/4-cassettes-open-2-left.svg' +import tejo4CassetteThree from '../../styling/icons/cassettes/tejo/4-cassettes/4-cassettes-open-3-left.svg' +import tejo4CassetteFour from '../../styling/icons/cassettes/tejo/4-cassettes/4-cassettes-open-4-left.svg' + +const getCassetesArtworks = () => ({ + 1: { + 1: cassetteOne, + }, + 2: { + 1: cassetteOne, + 2: cassetteTwo, + }, + 3: { + 1: tejo3CassetteOne, + 2: tejo3CassetteTwo, + 3: tejo3CassetteThree, + }, + 4: { + 1: tejo4CassetteOne, + 2: tejo4CassetteTwo, + 3: tejo4CassetteThree, + 4: tejo4CassetteFour, + }, +}) + +const WizardStep = ({ + name, + step, + schema, + error, + isLastStep, + onContinue, + steps, + fiatCurrency, + options, + numberOfCassettes, +}) => { + const label = isLastStep ? 'Finish' : 'Next' + const cassetteIcon = getCassetesArtworks()[numberOfCassettes] + return ( + <> +
    + {name} + +
    + + {!isLastStep && ( + +
    +
    + {steps.map( + ({ type, display, component }, idx) => + 1 + idx === step && ( +
    +

    Edit {display}

    + + Choose bill denomination +
    + 0 ? component : NumberInput + } + fullWidth + decimalPlaces={0} + name={type} + options={options} + valueProp={'code'} + labelProp={'display'}> + + {fiatCurrency} + +
    +
    + ), + )} + cassette +
    + + +
    +
    + )} + + {isLastStep && ( +
    +
    + Cash Cassette Bill Count +

    + + When enabling cash-out, your bill count will be automatically set + to zero. Make sure you physically put cash inside the cash + cassettes to allow the machine to dispense it to your users. If + you already did, make sure you set the correct cash cassette bill + count for this machine on your Cash boxes & cassettes tab under + Maintenance. +

    + Default Commissions +

    + + When enabling cash-out, default commissions will be set. To change + commissions for this machine, please go to the Commissions tab + under Settings where you can set exceptions for each of the + available cryptocurrencies. +

    +
    + {error && Failed to save} + +
    + )} + + ) +} + +export default WizardStep diff --git a/packages/admin-ui/src/pages/Cashout/helper.js b/packages/admin-ui/src/pages/Cashout/helper.js new file mode 100644 index 0000000..510f896 --- /dev/null +++ b/packages/admin-ui/src/pages/Cashout/helper.js @@ -0,0 +1,196 @@ +import * as R from 'ramda' +import * as Yup from 'yup' + +import { Autocomplete, NumberInput } from '../../components/inputs/formik' +import { bold } from '../../styling/helpers' +import denominations from '../../utils/bill-denominations' +import { getBillOptions } from '../../utils/bill-options' +import { CURRENCY_MAX } from '../../utils/constants' +import { transformNumber } from '../../utils/number' + +const widthsByNumberOfUnits = { + 2: { machine: 325, cassette: 340 }, + 3: { machine: 300, cassette: 235 }, + 4: { machine: 205, cassette: 200 }, + 5: { machine: 180, cassette: 165 }, + 6: { machine: 165, cassette: 140 }, + 7: { machine: 130, cassette: 125 }, +} + +const denominationKeys = [ + 'cassette1', + 'cassette2', + 'cassette3', + 'cassette4', + 'recycler1', + 'recycler2', + 'recycler3', + 'recycler4', + 'recycler5', + 'recycler6', +] + +const DenominationsSchema = Yup.object() + .shape({ + cassette1: Yup.number() + .label('Cassette 1') + .min(1) + .nullable() + .max(CURRENCY_MAX), + cassette2: Yup.number() + .label('Cassette 2') + .min(1) + .max(CURRENCY_MAX) + .nullable() + .transform(transformNumber), + cassette3: Yup.number() + .label('Cassette 3') + .min(1) + .max(CURRENCY_MAX) + .nullable() + .transform(transformNumber), + cassette4: Yup.number() + .label('Cassette 4') + .min(1) + .max(CURRENCY_MAX) + .nullable() + .transform(transformNumber), + recycler1: Yup.number() + .label('Recycler 1') + .min(1) + .max(CURRENCY_MAX) + .nullable() + .transform(transformNumber), + recycler2: Yup.number() + .label('Recycler 2') + .min(1) + .max(CURRENCY_MAX) + .nullable() + .transform(transformNumber), + recycler3: Yup.number() + .label('Recycler 3') + .min(1) + .max(CURRENCY_MAX) + .nullable() + .transform(transformNumber), + recycler4: Yup.number() + .label('Recycler 4') + .min(1) + .max(CURRENCY_MAX) + .nullable() + .transform(transformNumber), + recycler5: Yup.number() + .label('Recycler 5') + .min(1) + .max(CURRENCY_MAX) + .nullable() + .transform(transformNumber), + recycler6: Yup.number() + .label('Recycler 6') + .min(1) + .max(CURRENCY_MAX) + .nullable() + .transform(transformNumber), + }) + .test((values, context) => + R.any(key => !R.isNil(values[key]), denominationKeys) + ? true + : context.createError({ + path: '', + message: + 'The recyclers or at least one of the cassettes must have a value', + }), + ) + +const getElements = (machines, locale = {}) => { + const fiatCurrency = R.prop('fiatCurrency')(locale) + const maxNumberOfCassettes = Math.max( + ...R.map(it => it.numberOfCassettes, machines), + 0, + ) + const maxNumberOfRecyclers = Math.max( + ...R.map(it => it.numberOfRecyclers, machines), + 0, + ) + const numberOfCashUnits = + maxNumberOfCassettes + Math.ceil(maxNumberOfRecyclers / 2) + + const options = getBillOptions(locale, denominations) + const cassetteProps = + options?.length > 0 + ? { + options: options, + labelProp: 'display', + valueProp: 'code', + className: 'w-full', + } + : { decimalPlaces: 0 } + + const elements = [ + { + name: 'id', + header: 'Machine', + width: widthsByNumberOfUnits[numberOfCashUnits]?.machine, + view: it => machines.find(({ deviceId }) => deviceId === it).name, + size: 'sm', + editable: false, + }, + ] + + R.until( + R.gt(R.__, maxNumberOfCassettes), + it => { + elements.push({ + name: `cassette${it}`, + header: `Cassette ${it}`, + size: 'sm', + stripe: true, + textAlign: 'right', + width: widthsByNumberOfUnits[numberOfCashUnits]?.cassette, + suffix: fiatCurrency, + bold: bold, + view: it => it, + input: options?.length > 0 ? Autocomplete : NumberInput, + inputProps: cassetteProps, + doubleHeader: 'Denominations of Cassettes & Recyclers', + isHidden: machine => + it > + machines.find(({ deviceId }) => deviceId === machine.id) + .numberOfCassettes, + }) + return R.add(1, it) + }, + 1, + ) + + R.until( + R.gt(R.__, Math.ceil(maxNumberOfRecyclers / 2)), + it => { + elements.push({ + names: [`recycler${it * 2 - 1}`, `recycler${it * 2}`], + header: `Recyclers ${it * 2 - 1} - ${it * 2}`, + size: 'sm', + stripe: true, + textAlign: 'right', + width: widthsByNumberOfUnits[numberOfCashUnits]?.cassette, + suffix: fiatCurrency, + bold: bold, + input: options?.length > 0 ? Autocomplete : NumberInput, + inputProps: cassetteProps, + doubleHeader: 'Denominations of Cassettes & Recyclers', + isHidden: machine => + it > + Math.ceil( + machines.find(({ deviceId }) => deviceId === machine.id) + .numberOfRecyclers / 2, + ), + }) + return R.add(1, it) + }, + 1, + ) + + return elements +} + +export { DenominationsSchema, getElements } diff --git a/packages/admin-ui/src/pages/Cashout/index.js b/packages/admin-ui/src/pages/Cashout/index.js new file mode 100644 index 0000000..e625c74 --- /dev/null +++ b/packages/admin-ui/src/pages/Cashout/index.js @@ -0,0 +1,3 @@ +import Cashout from './Cashout' + +export default Cashout diff --git a/packages/admin-ui/src/pages/Commissions/Commissions.jsx b/packages/admin-ui/src/pages/Commissions/Commissions.jsx new file mode 100644 index 0000000..3537ece --- /dev/null +++ b/packages/admin-ui/src/pages/Commissions/Commissions.jsx @@ -0,0 +1,159 @@ +import { useQuery, useMutation, gql } from '@apollo/client' +import * as R from 'ramda' +import React, { useState } from 'react' +import { HelpTooltip } from '../../components/Tooltip' +import TitleSection from '../../components/layout/TitleSection' +import ReverseListingViewIcon from '../../styling/icons/circle buttons/listing-view/white.svg?react' +import ListingViewIcon from '../../styling/icons/circle buttons/listing-view/zodiac.svg?react' +import OverrideLabelIcon from '../../styling/icons/status/spring2.svg?react' + +import { SupportLinkButton } from '../../components/buttons' +import { fromNamespace, toNamespace, namespaces } from '../../utils/config' + +import { P } from '../../components/typography' + +import CommissionsDetails from './components/CommissionsDetails' +import CommissionsList from './components/CommissionsList' + +const GET_DATA = gql` + query getData { + config + cryptoCurrencies { + code + display + } + machines { + name + deviceId + } + } +` + +const SAVE_CONFIG = gql` + mutation Save($config: JSONObject) { + saveConfig(config: $config) + } +` +const removeCoinFromOverride = crypto => override => + R.mergeRight(override, { + cryptoCurrencies: R.without([crypto], override.cryptoCurrencies), + }) + +const Commissions = ({ name: SCREEN_KEY }) => { + const [showMachines, setShowMachines] = useState(false) + const [error, setError] = useState(null) + const { data, loading } = useQuery(GET_DATA) + const [saveConfig] = useMutation(SAVE_CONFIG, { + refetchQueries: () => ['getData'], + onError: error => setError(error), + }) + + const config = data?.config && fromNamespace(SCREEN_KEY)(data.config) + const localeConfig = + data?.config && fromNamespace(namespaces.LOCALE)(data.config) + + const currency = R.prop('fiatCurrency')(localeConfig) + const overrides = R.prop('overrides')(config) + + const save = it => { + const config = toNamespace(SCREEN_KEY)(it.commissions[0]) + return saveConfig({ variables: { config } }) + } + + const saveOverrides = it => { + const config = toNamespace(SCREEN_KEY)(it) + setError(null) + return saveConfig({ variables: { config } }) + } + + const saveOverridesFromList = it => (_, override) => { + const cryptoOverridden = R.path(['cryptoCurrencies', 0], override) + + const sameMachine = R.eqProps('machine', override) + const notSameOverride = it => !R.eqProps('cryptoCurrencies', override, it) + + const filterMachine = R.filter(R.both(sameMachine, notSameOverride)) + const removeCoin = removeCoinFromOverride(cryptoOverridden) + + const machineOverrides = R.map(removeCoin)(filterMachine(it)) + + const overrides = machineOverrides.concat( + R.filter(it => !sameMachine(it), it), + ) + + const config = { + commissions_overrides: R.prepend(override, overrides), + } + + return saveConfig({ variables: { config } }) + } + + const labels = showMachines + ? [ + { + label: 'Override value', + icon: , + }, + ] + : [] + + return ( + <> + +

    + For details about commissions, please read the relevant + knowledgebase articles: +

    + + + + } + /> + + {!showMachines && !loading && ( + + )} + {showMachines && !loading && ( + + )} + + ) +} + +export default Commissions diff --git a/packages/admin-ui/src/pages/Commissions/components/CommissionsDetails.jsx b/packages/admin-ui/src/pages/Commissions/components/CommissionsDetails.jsx new file mode 100644 index 0000000..9f414f4 --- /dev/null +++ b/packages/admin-ui/src/pages/Commissions/components/CommissionsDetails.jsx @@ -0,0 +1,79 @@ +import * as R from 'ramda' +import React, { useState, memo } from 'react' +import Section from '../../../components/layout/Section' +import { + mainFields, + overrides, + getSchema, + getOverridesSchema, + defaults, + overridesDefaults, + getOrder, +} from '../helper' + +import { Table as EditableTable } from '../../../components/editableTable' + +const CommissionsDetails = memo( + ({ config, locale, currency, data, error, save, saveOverrides }) => { + const [isEditingDefault, setEditingDefault] = useState(false) + const [isEditingOverrides, setEditingOverrides] = useState(false) + + const commission = config && !R.isEmpty(config) ? config : defaults + const commissionOverrides = commission?.overrides ?? [] + + const orderedCommissionsOverrides = R.sortWith([ + R.ascend(getOrder), + R.ascend(R.prop('machine')), + ])(commissionOverrides) + + const onEditingDefault = (it, editing) => setEditingDefault(editing) + const onEditingOverrides = (it, editing) => setEditingOverrides(editing) + + return ( + <> +
    + +
    +
    + +
    + + ) + }, +) + +export default CommissionsDetails diff --git a/packages/admin-ui/src/pages/Commissions/components/CommissionsList.jsx b/packages/admin-ui/src/pages/Commissions/components/CommissionsList.jsx new file mode 100644 index 0000000..55deb1b --- /dev/null +++ b/packages/admin-ui/src/pages/Commissions/components/CommissionsList.jsx @@ -0,0 +1,162 @@ +import * as R from 'ramda' +import React, { memo, useState } from 'react' +import { + overridesDefaults, + getCommissions, + getListCommissionsSchema, + commissionsList, +} from '../helper' + +import { Table as EditableTable } from '../../../components/editableTable' +import { Select } from '../../../components/inputs' + +const SHOW_ALL = { + code: 'SHOW_ALL', + display: 'Show all', +} + +const ORDER_OPTIONS = [ + { + code: 'machine', + display: 'Machine name', + }, + { + code: 'cryptoCurrencies', + display: 'Cryptocurrency', + }, + { + code: 'cashIn', + display: 'Cash-in', + }, + { + code: 'cashOut', + display: 'Cash-out', + }, + { + code: 'fixedFee', + display: 'Fixed fee', + }, + { + code: 'minimumTx', + display: 'Minimum Tx', + }, +] + +const getElement = (code, display) => ({ + code: code, + display: display || code, +}) + +const sortCommissionsBy = prop => { + switch (prop) { + case ORDER_OPTIONS[0]: + return R.sortBy(R.find(R.propEq(R.prop('machine'), 'code'))) + case ORDER_OPTIONS[1]: + return R.sortBy(R.path(['cryptoCurrencies', 0])) + default: + return R.sortBy(R.prop(prop.code)) + } +} + +const filterCommissions = (coinFilter, machineFilter) => + R.compose( + R.filter( + it => (machineFilter === SHOW_ALL) | (machineFilter.code === it.machine), + ), + R.filter( + it => + (coinFilter === SHOW_ALL) | + (coinFilter.code === it.cryptoCurrencies[0]), + ), + ) + +const CommissionsList = memo( + ({ config, localeConfig, currency, data, error, saveOverrides }) => { + const [machineFilter, setMachineFilter] = useState(SHOW_ALL) + const [coinFilter, setCoinFilter] = useState(SHOW_ALL) + const [orderProp, setOrderProp] = useState(ORDER_OPTIONS[0]) + + const coins = R.prop('cryptoCurrencies', localeConfig) ?? [] + + const getMachineCoins = deviceId => { + const override = R.prop('overrides', localeConfig)?.find( + R.propEq(deviceId, 'machine'), + ) + + const machineCoins = override + ? R.prop('cryptoCurrencies', override) + : coins + + return R.xprod([deviceId], machineCoins) + } + + const getMachineElement = it => + getElement(R.prop('deviceId', it), R.prop('name', it)) + + const cryptoData = R.map(getElement)(coins) + + const machineData = R.sortBy( + R.prop('display'), + R.map(getMachineElement)(R.prop('machines', data)), + ) + + const machinesCoinsTuples = R.unnest( + R.map(getMachineCoins)(machineData.map(R.prop('code'))), + ) + + const commissions = R.map(([deviceId, cryptoCode]) => + getCommissions(cryptoCode, deviceId, config), + )(machinesCoinsTuples) + + const tableData = R.compose( + sortCommissionsBy(orderProp), + filterCommissions(coinFilter, machineFilter), + )(commissions) + + return ( +
    +
    + + setInput(fileInput)} + onChange={event => { + // need to store it locally if we want to display it even after saving to db + const file = R.head(event.target.files) + if (!file) return + setFieldValue(R.head(fields).name, file) + }} + /> + Replace +
    + } + + )} + {fields && ( + + Save + + )} + cancel()} + type="reset"> + Cancel + + {authorize && authorized.label !== 'Accepted' && ( + authorize()}> + Authorize + + )} + {authorize && authorized.label !== 'Rejected' && ( + reject()}> + Reject + + )} + {error && ( + Failed to save changes + )} + + )} +
    + + )} + + + + ) +} + +export default EditableCard diff --git a/packages/admin-ui/src/pages/Customers/components/PhotosCard.jsx b/packages/admin-ui/src/pages/Customers/components/PhotosCard.jsx new file mode 100644 index 0000000..d513109 --- /dev/null +++ b/packages/admin-ui/src/pages/Customers/components/PhotosCard.jsx @@ -0,0 +1,62 @@ +import ButtonBase from '@mui/material/ButtonBase' +import Paper from '@mui/material/Card' +import * as R from 'ramda' +import React, { memo, useState } from 'react' +import { InformativeDialog } from '../../../components/InformativeDialog' +import { Info2 } from '../../../components/typography' +import CrossedCameraIcon from '../../../styling/icons/ID/photo/crossed-camera.svg?react' + +import PhotosCarousel from './PhotosCarousel' + +const PhotosCard = memo(({ photosData, timezone }) => { + const [photosDialog, setPhotosDialog] = useState(false) + + const sortedPhotosData = R.sortWith( + [(a, b) => R.has('id', a) - R.has('id', b), R.descend(R.prop('date'))], + photosData, + ) + + const singlePhoto = R.head(sortedPhotosData) + + return ( + <> + + { + setPhotosDialog(true) + }}> + {singlePhoto ? ( +
    + +
    + + {sortedPhotosData.length} + +
    + ) : ( + + )} +
    +
    + + } + onDissmised={() => { + setPhotosDialog(false) + }} + /> + + ) +}) + +export default PhotosCard diff --git a/packages/admin-ui/src/pages/Customers/components/PhotosCarousel.jsx b/packages/admin-ui/src/pages/Customers/components/PhotosCarousel.jsx new file mode 100644 index 0000000..3cae828 --- /dev/null +++ b/packages/admin-ui/src/pages/Customers/components/PhotosCarousel.jsx @@ -0,0 +1,62 @@ +import * as R from 'ramda' +import React, { memo, useState } from 'react' +import { Carousel } from '../../../components/Carousel' +import { Label1 } from '../../../components/typography' + +import { formatDate } from '../../../utils/timezones' + +import CopyToClipboard from '../../../components/CopyToClipboard.jsx' + +const PhotosCarousel = memo(({ photosData, timezone }) => { + const [currentIndex, setCurrentIndex] = useState(0) + + const Label = ({ children }) => { + return ( + + {children} + + ) + } + + const isFaceCustomerPhoto = !R.has('id')(photosData[currentIndex]) + + const slidePhoto = index => setCurrentIndex(index) + + // TODO hide copy to clipboard shit + return ( + <> + + {!isFaceCustomerPhoto && ( +
    + + + {photosData && photosData[currentIndex]?.id} + +
    + )} +
    +
    + <> + +
    + {photosData && + formatDate( + photosData[currentIndex]?.date, + timezone, + 'yyyy-MM-dd HH:mm', + )} +
    + +
    +
    + +
    + {!isFaceCustomerPhoto ? 'Acceptance of T&C' : 'Compliance scan'} +
    +
    +
    + + ) +}) + +export default PhotosCarousel diff --git a/packages/admin-ui/src/pages/Customers/components/TransactionsList.jsx b/packages/admin-ui/src/pages/Customers/components/TransactionsList.jsx new file mode 100644 index 0000000..25969e5 --- /dev/null +++ b/packages/admin-ui/src/pages/Customers/components/TransactionsList.jsx @@ -0,0 +1,166 @@ +import { toUnit } from '@lamassu/coins/lightUtils' +import BigNumber from 'bignumber.js' +import * as R from 'ramda' +import React from 'react' +import DataTable from '../../../components/tables/DataTable' +import { H3, H4, Label1, Label2, P } from '../../../components/typography' +import TxInIcon from '../../../styling/icons/direction/cash-in.svg?react' +import TxOutIcon from '../../../styling/icons/direction/cash-out.svg?react' + +import { ifNotNull } from '../../../utils/nullCheck' +import { formatDate } from '../../../utils/timezones' + +import CopyToClipboard from '../../../components/CopyToClipboard.jsx' + +const TransactionsList = ({ customer, data, loading }) => { + const LastTxIcon = customer.lastTxClass === 'cashOut' ? TxOutIcon : TxInIcon + const hasData = !(R.isEmpty(data) || R.isNil(data)) + const { lastUsedMachineName } = customer + + const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone + + const summaryElements = [ + { + header: 'Transactions', + size: 127, + value: ifNotNull( + customer.totalTxs, + `${Number.parseInt(customer.totalTxs)}`, + ), + }, + { + header: 'Transaction volume', + size: 167, + value: ifNotNull( + customer.totalSpent, + `${Number.parseFloat(customer.totalSpent)} ${customer.lastTxFiatCode}`, + ), + }, + { + header: 'Last active', + size: 142, + value: + !R.isNil(timezone) && + ((customer.lastActive && + formatDate(customer.lastActive, timezone, 'yyyy-MM-dd')) ?? + ''), + }, + { + header: 'Last transaction', + size: 198, + value: ifNotNull( + customer.lastTxFiat, + <> + + {`${Number.parseFloat(customer.lastTxFiat)} + ${customer.lastTxFiatCode}`} + , + ), + }, + { + header: 'Last used machine', + size: 198, + value: ifNotNull(lastUsedMachineName, <>{lastUsedMachineName}), + }, + ] + + const tableElements = [ + { + width: 40, + view: it => ( + <> + {it.txClass === 'cashOut' ? ( + + ) : ( + + )} + + ), + }, + { + header: 'Machine', + width: 160, + view: R.path(['machineName']), + }, + { + header: 'Transaction ID', + width: 145, + view: it => ( + + {it.id} + + ), + }, + { + header: 'Cash', + width: 155, + textAlign: 'right', + view: it => ( + <> + {`${Number.parseFloat(it.fiat)} `} + {it.fiatCode} + + ), + }, + { + header: 'Crypto', + width: 145, + textAlign: 'right', + view: it => ( + <> + {`${toUnit(new BigNumber(it.cryptoAtoms), it.cryptoCode).toFormat( + 5, + )} `} + {it.cryptoCode} + + ), + }, + { + header: 'Date', + width: 100, + view: it => formatDate(it.created, timezone, 'yyyy‑MM‑dd'), + }, + { + header: 'Time (h:m:s)', + width: 130, + view: it => formatDate(it.created, timezone, 'HH:mm:ss'), + }, + ] + + return ( + <> +

    Transactions

    +
    +
    + {summaryElements.map(({ size, header }, idx) => ( + + {header} + + ))} +
    +
    + {summaryElements.map(({ size, value }, idx) => ( +

    + {value} +

    + ))} +
    +
    +
    + {loading ? ( +

    Loading

    + ) : hasData ? ( + + ) : ( +

    No transactions so far

    + )} +
    + + ) +} + +export default TransactionsList diff --git a/packages/admin-ui/src/pages/Customers/components/Upload.jsx b/packages/admin-ui/src/pages/Customers/components/Upload.jsx new file mode 100644 index 0000000..7434742 --- /dev/null +++ b/packages/admin-ui/src/pages/Customers/components/Upload.jsx @@ -0,0 +1,65 @@ +import { useFormikContext } from 'formik' +import * as R from 'ramda' +import React, { useState, useCallback } from 'react' +import { useDropzone } from 'react-dropzone' +import { Label3, H3 } from '../../../components/typography' +import UploadPhotoIcon from '../../../styling/icons/button/photo/zodiac-resized.svg?react' +import UploadFileIcon from '../../../styling/icons/button/upload-file/zodiac-resized.svg?react' + +import classes from './Upload.module.css' + +const Upload = ({ type }) => { + const [data, setData] = useState({}) + + const { setFieldValue } = useFormikContext() + + const IMAGE = 'image' + const ID_CARD_PHOTO = 'idCardPhoto' + const FRONT_CAMERA = 'frontCamera' + + const isImage = + type === IMAGE || type === FRONT_CAMERA || type === ID_CARD_PHOTO + + const onDrop = useCallback( + acceptedData => { + setFieldValue(type, R.head(acceptedData)) + + setData({ + preview: isImage + ? URL.createObjectURL(R.head(acceptedData)) + : R.head(acceptedData).name, + }) + }, + [isImage, type, setFieldValue], + ) + + const { getRootProps, getInputProps } = useDropzone({ onDrop }) + + return ( + <> +
    + {R.isEmpty(data) && ( +
    + + {isImage ? : } + {`Drag and drop ${ + isImage ? 'an image' : 'a file' + } or click to open the explorer`} +
    + )} + {!R.isEmpty(data) && isImage && ( +
    + +
    + )} + {!R.isEmpty(data) && !isImage && ( +
    +

    {data.preview}

    +
    + )} +
    + + ) +} + +export default Upload diff --git a/packages/admin-ui/src/pages/Customers/components/Upload.module.css b/packages/admin-ui/src/pages/Customers/components/Upload.module.css new file mode 100644 index 0000000..3f7955d --- /dev/null +++ b/packages/admin-ui/src/pages/Customers/components/Upload.module.css @@ -0,0 +1,14 @@ +.box { + box-sizing: border-box; + width: 450px; + height: 120px; + border-style: dashed; + border-color: var(--comet); + border-radius: 4px; + border-width: 1px; + background-color: var(--zircon); + display: flex; + justify-content: center; + align-items: center; + gap: 20px; +} diff --git a/packages/admin-ui/src/pages/Customers/components/consts.js b/packages/admin-ui/src/pages/Customers/components/consts.js new file mode 100644 index 0000000..5cec0f8 --- /dev/null +++ b/packages/admin-ui/src/pages/Customers/components/consts.js @@ -0,0 +1,5 @@ +const OVERRIDE_PENDING = 'automatic' +const OVERRIDE_AUTHORIZED = 'verified' +const OVERRIDE_REJECTED = 'blocked' + +export { OVERRIDE_PENDING, OVERRIDE_AUTHORIZED, OVERRIDE_REJECTED } diff --git a/packages/admin-ui/src/pages/Customers/components/index.js b/packages/admin-ui/src/pages/Customers/components/index.js new file mode 100644 index 0000000..41020d3 --- /dev/null +++ b/packages/admin-ui/src/pages/Customers/components/index.js @@ -0,0 +1,16 @@ +import Wizard from '../Wizard' + +import CustomerDetails from './CustomerDetails' +import CustomerSidebar from './CustomerSidebar' +import EditableCard from './EditableCard' +import TransactionsList from './TransactionsList' +import Upload from './Upload' + +export { + CustomerDetails, + TransactionsList, + CustomerSidebar, + EditableCard, + Wizard, + Upload, +} diff --git a/packages/admin-ui/src/pages/Customers/components/notes/NewNoteCard.jsx b/packages/admin-ui/src/pages/Customers/components/notes/NewNoteCard.jsx new file mode 100644 index 0000000..3cffcd7 --- /dev/null +++ b/packages/admin-ui/src/pages/Customers/components/notes/NewNoteCard.jsx @@ -0,0 +1,17 @@ +import Paper from '@mui/material/Paper' +import { React } from 'react' +import { P } from '../../../../components/typography' +import AddIcon from '../../../../styling/icons/button/add/zodiac.svg?react' + +const NewNoteCard = ({ setOpenModal }) => { + return ( + setOpenModal(true)}> + +

    Add new

    +
    + ) +} + +export default NewNoteCard diff --git a/packages/admin-ui/src/pages/Customers/components/notes/NewNoteModal.jsx b/packages/admin-ui/src/pages/Customers/components/notes/NewNoteModal.jsx new file mode 100644 index 0000000..e1536d6 --- /dev/null +++ b/packages/admin-ui/src/pages/Customers/components/notes/NewNoteModal.jsx @@ -0,0 +1,74 @@ +import { Form, Formik, Field } from 'formik' +import { React } from 'react' +import ErrorMessage from '../../../../components/ErrorMessage' +import Modal from '../../../../components/Modal' +import * as Yup from 'yup' + +import { Button } from '../../../../components/buttons' +import { TextInput } from '../../../../components/inputs/formik' + +const initialValues = { + title: '', + content: '', +} + +const validationSchema = Yup.object().shape({ + title: Yup.string().required().trim().max(25), + content: Yup.string().required(), +}) + +const NewNoteModal = ({ showModal, onClose, onSubmit, errorMsg }) => { + return ( + <> + + { + onSubmit({ title, content }) + }}> +
    + + +
    + {errorMsg && {errorMsg}} + +
    + +
    +
    + + ) +} + +export default NewNoteModal diff --git a/packages/admin-ui/src/pages/Customers/components/notes/NoteCard.jsx b/packages/admin-ui/src/pages/Customers/components/notes/NoteCard.jsx new file mode 100644 index 0000000..b2c2aab --- /dev/null +++ b/packages/admin-ui/src/pages/Customers/components/notes/NoteCard.jsx @@ -0,0 +1,48 @@ +import Paper from '@mui/material/Paper' +import * as R from 'ramda' +import { React } from 'react' +import { H3, P } from '../../../../components/typography' +import DeleteIcon from '../../../../styling/icons/action/delete/enabled.svg?react' + +import { formatDate } from '../../../../utils/timezones' + +const formatContent = content => { + const fragments = R.split(/\n/)(content) + return R.map((it, idx) => { + if (idx === fragments.length) return <>{it} + return ( + <> + {it} +
    + + ) + }, fragments) +} + +const NoteCard = ({ note, deleteNote, handleClick, timezone }) => { + return ( + handleClick(note)}> +
    +
    +

    {note?.title}

    +

    {formatDate(note?.created, timezone, 'yyyy-MM-dd')}

    +
    +
    + { + e.stopPropagation() + deleteNote({ noteId: note.id }) + }} + /> +
    +
    +

    + {formatContent(note?.content)} +

    +
    + ) +} + +export default NoteCard diff --git a/packages/admin-ui/src/pages/Customers/components/notes/NoteEdit.jsx b/packages/admin-ui/src/pages/Customers/components/notes/NoteEdit.jsx new file mode 100644 index 0000000..80e352b --- /dev/null +++ b/packages/admin-ui/src/pages/Customers/components/notes/NoteEdit.jsx @@ -0,0 +1,98 @@ +import Paper from '@mui/material/Paper' +import { formatDurationWithOptions, intervalToDuration } from 'date-fns/fp' +import { Form, Formik, Field } from 'formik' +import { React, useRef } from 'react' +import { P } from '../../../../components/typography' +import CancelIconInverse from '../../../../styling/icons/button/cancel/white.svg?react' +import CancelIcon from '../../../../styling/icons/button/cancel/zodiac.svg?react' +import SaveIconInverse from '../../../../styling/icons/circle buttons/save/white.svg?react' +import SaveIcon from '../../../../styling/icons/circle buttons/save/zodiac.svg?react' +import * as Yup from 'yup' + +import { ActionButton } from '../../../../components/buttons' +import { TextInput } from '../../../../components/inputs/formik' +import { toTimezone } from '../../../../utils/timezones' + +const NoteEdit = ({ note, cancel, edit, timezone }) => { + const formRef = useRef() + + const validationSchema = Yup.object().shape({ + content: Yup.string(), + }) + + const initialValues = { + content: note.content, + } + + return ( + +
    +

    + {`Last edited `} + {formatDurationWithOptions( + { delimited: ', ' }, + intervalToDuration({ + start: toTimezone(new Date(note.lastEditedAt), timezone), + end: toTimezone(new Date(), timezone), + }), + )} + {` ago`} +

    +
    + + {`Cancel`} + + + {`Save changes`} + + formRef.current.setFieldValue('content', '')}> + {`Clear content`} + +
    +
    + + edit({ + noteId: note.id, + newContent: content, + oldContent: note.content, + }) + } + innerRef={formRef}> +
    + + +
    +
    + ) +} + +export default NoteEdit diff --git a/packages/admin-ui/src/pages/Customers/helper.jsx b/packages/admin-ui/src/pages/Customers/helper.jsx new file mode 100644 index 0000000..f30561d --- /dev/null +++ b/packages/admin-ui/src/pages/Customers/helper.jsx @@ -0,0 +1,533 @@ +import React from 'react' +import { parse, isValid, format } from 'date-fns/fp' +import { Field, useFormikContext } from 'formik' +import { parsePhoneNumberFromString } from 'libphonenumber-js' +import * as R from 'ramda' +import { H4 } from '../../components/typography' +import { validate as uuidValidate } from 'uuid' +import * as Yup from 'yup' + +import { + RadioGroup, + TextInput, + Autocomplete, +} from '../../components/inputs/formik' +import { MANUAL } from '../../utils/constants' + +import { Upload } from './components' + +const CUSTOMER_BLOCKED = 'blocked' +const CUSTOM = 'custom' +const REQUIREMENT = 'requirement' +const ID_CARD_DATA = 'idCardData' + +const getAuthorizedStatus = (it, triggers, customRequests) => { + const fields = R.concat( + ['frontCamera', 'idCardData', 'idCardPhoto', 'email', 'usSsn', 'sanctions'], + R.map(ite => ite.id, customRequests), + ) + const fieldsWithPathSuffix = ['frontCamera', 'idCardPhoto'] + + const isManualField = fieldName => { + const triggerName = R.equals(fieldName, 'frontCamera') + ? 'facephoto' + : fieldName + const manualOverrides = R.filter( + ite => R.equals(R.toLower(ite.automation), MANUAL), + triggers?.overrides ?? [], + ) + + return ( + !!R.find( + ite => R.equals(ite.requirement, triggerName), + manualOverrides, + ) || R.equals(R.toLower(triggers.automation ?? ''), MANUAL) + ) + } + + const getFieldsByStatus = status => + R.map(ite => { + if (isManualField(ite)) { + if (uuidValidate(ite)) { + const request = R.find( + iter => iter.infoRequestId === ite, + it.customInfoRequests, + ) + return !R.isNil(request) && R.equals(request.override, status) + } + + const regularFieldValue = R.includes(ite, fieldsWithPathSuffix) + ? it[`${ite}Path`] + : it[`${ite}`] + if (R.isNil(regularFieldValue)) return false + return R.equals(it[`${ite}Override`], status) + } + return false + }, fields) + + const pendingFieldStatus = getFieldsByStatus('automatic') + const rejectedFieldStatus = getFieldsByStatus('blocked') + + if (it.authorizedOverride === CUSTOMER_BLOCKED) + return { label: 'Blocked', type: 'error' } + if (it.isSuspended) + return it.daysSuspended > 0 + ? { label: `${it.daysSuspended} day suspension`, type: 'warning' } + : { label: `< 1 day suspension`, type: 'warning' } + if (R.any(ite => ite === true, rejectedFieldStatus)) + return { label: 'Rejected', type: 'error' } + if (R.any(ite => ite === true, pendingFieldStatus)) + return { label: 'Pending', type: 'warning' } + return { label: 'Authorized', type: 'success' } +} + +const getFormattedPhone = (phone, country) => { + const phoneNumber = + phone && country ? parsePhoneNumberFromString(phone, country) : null + + return phoneNumber ? phoneNumber.formatInternational() : phone +} + +const getName = it => { + const idData = R.path(['idCardData'])(it) + + return `${R.path(['firstName'])(idData) ?? ''} ${ + R.path(['lastName'])(idData) ?? '' + }`.trim() +} + +// Manual Entry Wizard + +const entryOptions = [ + { display: 'Custom entry', code: 'custom' }, + { display: 'Populate existing requirement', code: 'requirement' }, +] + +const dataOptions = [ + { display: 'Text', code: 'text' }, + // TODO: Requires backend modifications to support File and Image + // { display: 'File', code: 'file' }, + // { display: 'Image', code: 'image' } +] + +const requirementOptions = [ + { display: 'ID card image', code: 'idCardPhoto' }, + { display: 'ID data', code: 'idCardData' }, + { display: 'US SSN', code: 'usSsn' }, + { display: 'Email', code: 'email' }, + { display: 'Customer camera', code: 'frontCamera' }, +] + +const customTextOptions = [ + { label: 'Data entry title', name: 'title' }, + { label: 'Data entry', name: 'data' }, +] + +const customUploadOptions = [{ label: 'Data entry title', name: 'title' }] + +const entryTypeSchema = Yup.lazy(values => { + if (values.entryType === 'custom') { + return Yup.object().shape({ + entryType: Yup.string().required(), + dataType: Yup.string().required(), + }) + } else if (values.entryType === 'requirement') { + return Yup.object().shape({ + entryType: Yup.string().required(), + requirement: Yup.string().required(), + }) + } +}) + +const customFileSchema = Yup.object().shape({ + title: Yup.string().required(), + file: Yup.mixed().required(), +}) + +const customImageSchema = Yup.object().shape({ + title: Yup.string().required(), + image: Yup.mixed().required(), +}) + +const customTextSchema = Yup.object().shape({ + title: Yup.string().required(), + data: Yup.string().required(), +}) + +const updateRequirementOptions = it => [ + { + display: 'Custom information requirement', + code: 'custom', + }, + ...it, +] + +const EntryType = () => { + const { values } = useFormikContext() + + const displayCustomOptions = values.entryType === CUSTOM + const displayRequirementOptions = values.entryType === REQUIREMENT + + const Entry = ({ title, name, options, className }) => ( +
    +
    +

    {title}

    +
    + +
    + ) + + return ( + <> + + {displayCustomOptions && ( + + )} + {displayRequirementOptions && ( + + )} + + ) +} + +const ManualDataEntry = ({ selectedValues, customInfoRequirementOptions }) => { + const typeOfEntrySelected = selectedValues?.entryType + const dataTypeSelected = selectedValues?.dataType + const requirementSelected = selectedValues?.requirement + + const displayRequirements = typeOfEntrySelected === 'requirement' + + const isCustomInfoRequirement = requirementSelected === CUSTOM + + const updatedRequirementOptions = !R.isEmpty(customInfoRequirementOptions) + ? updateRequirementOptions(requirementOptions) + : requirementOptions + + const requirementName = displayRequirements + ? R.find(R.propEq(requirementSelected, 'code'))(updatedRequirementOptions) + .display + : '' + + const title = displayRequirements + ? `Requirement ${requirementName}` + : `Custom ${dataTypeSelected} entry` + + const elements = displayRequirements + ? requirementElements[requirementSelected] + : customElements[dataTypeSelected] + + const upload = displayRequirements + ? requirementSelected === 'idCardPhoto' || + requirementSelected === 'frontCamera' + : dataTypeSelected === 'file' || dataTypeSelected === 'image' + + return ( + <> +
    +

    {title}

    +
    + {isCustomInfoRequirement && ( + {}} + /> + )} +
    + {!upload && + !isCustomInfoRequirement && + elements.options.map(({ label, name }, idx) => ( + + ))} +
    + {upload && ( + + )} + + ) +} + +const customElements = { + text: { + schema: customTextSchema, + options: customTextOptions, + Component: ManualDataEntry, + initialValues: { data: '', title: '' }, + saveType: 'customEntry', + }, + file: { + schema: customFileSchema, + options: customUploadOptions, + Component: ManualDataEntry, + initialValues: { file: null, title: '' }, + saveType: 'customEntryUpload', + }, + image: { + schema: customImageSchema, + options: customUploadOptions, + Component: ManualDataEntry, + initialValues: { image: null, title: '' }, + saveType: 'customEntryUpload', + }, +} + +const entryType = { + schema: entryTypeSchema, + options: entryOptions, + Component: EntryType, + initialValues: { entryType: '' }, +} + +// Customer data + +const customerDataElements = { + idCardData: [ + { + name: 'firstName', + label: 'First name', + component: TextInput, + editable: true, + }, + { + name: 'documentNumber', + label: 'ID number', + component: TextInput, + editable: true, + }, + { + name: 'dateOfBirth', + label: 'Birthdate', + component: TextInput, + editable: true, + }, + { + name: 'gender', + label: 'Gender', + component: TextInput, + editable: true, + }, + { + name: 'lastName', + label: 'Last name', + component: TextInput, + editable: true, + }, + { + name: 'expirationDate', + label: 'Expiration date', + component: TextInput, + editable: true, + }, + { + name: 'country', + label: 'Country', + component: TextInput, + editable: true, + }, + ], + usSsn: [ + { + name: 'usSsn', + label: 'US SSN', + component: TextInput, + size: 190, + editable: true, + }, + ], + email: [ + { + name: 'email', + label: 'Email', + component: TextInput, + size: 190, + editable: false, + }, + ], + idCardPhoto: [{ name: 'idCardPhoto' }], + frontCamera: [{ name: 'frontCamera' }], +} + +const customerDataSchemas = { + idCardData: Yup.object().shape({ + firstName: Yup.string().required(), + lastName: Yup.string().required(), + documentNumber: Yup.string().required(), + dateOfBirth: Yup.string() + .test({ + test: val => isValid(parse(new Date(), 'yyyy-MM-dd', val)), + message: 'Date must be in format YYYY-MM-DD', + }) + .required(), + gender: Yup.string().required(), + country: Yup.string().required(), + expirationDate: Yup.string() + .test({ + test: val => isValid(parse(new Date(), 'yyyy-MM-dd', val)), + message: 'Date must be in format YYYY-MM-DD', + }) + .required(), + }), + usSsn: Yup.object().shape({ + usSsn: Yup.string().required(), + }), + idCardPhoto: Yup.object().shape({ + idCardPhoto: Yup.mixed().required(), + }), + frontCamera: Yup.object().shape({ + frontCamera: Yup.mixed().required(), + }), + email: Yup.object().shape({ + email: Yup.string().required(), + }), +} + +const requirementElements = { + idCardData: { + schema: customerDataSchemas.idCardData, + options: customerDataElements.idCardData, + Component: ManualDataEntry, + initialValues: { + firstName: '', + lastName: '', + documentNumber: '', + dateOfBirth: '', + gender: '', + country: '', + expirationDate: '', + }, + saveType: 'customerData', + }, + usSsn: { + schema: customerDataSchemas.usSsn, + options: customerDataElements.usSsn, + Component: ManualDataEntry, + initialValues: { usSsn: '' }, + saveType: 'customerData', + }, + email: { + schema: customerDataSchemas.email, + options: customerDataElements.email, + Component: ManualDataEntry, + initialValues: { email: '' }, + saveType: 'customerData', + }, + idCardPhoto: { + schema: customerDataSchemas.idCardPhoto, + options: customerDataElements.idCardPhoto, + Component: ManualDataEntry, + initialValues: { idCardPhoto: null }, + saveType: 'customerDataUpload', + }, + frontCamera: { + schema: customerDataSchemas.frontCamera, + options: customerDataElements.frontCamera, + Component: ManualDataEntry, + initialValues: { frontCamera: null }, + saveType: 'customerDataUpload', + }, + custom: { + // schema: customerDataSchemas.customInfoRequirement, + Component: ManualDataEntry, + initialValues: { customInfoRequirement: null }, + saveType: 'customInfoRequirement', + }, +} + +const tryFormatDate = rawDate => { + try { + return ( + (rawDate && + format('yyyy-MM-dd')(parse(new Date(), 'yyyyMMdd', rawDate))) ?? + '' + ) + } catch (err) { + console.error(err) + return '' + } +} + +const formatDates = values => { + R.map( + elem => + (values[elem] = format('yyyyMMdd')( + parse(new Date(), 'yyyy-MM-dd', values[elem]), + )), + )(['dateOfBirth', 'expirationDate']) + return values +} + +const mapKeys = pair => { + const [key, value] = pair + if (key === 'txCustomerPhotoPath' || key === 'frontCameraPath') { + return ['path', value] + } + if (key === 'txCustomerPhotoAt' || key === 'frontCameraAt') { + return ['date', value] + } + return pair +} + +const addPhotoDir = R.map(it => { + const hasFrontCameraData = R.has('id')(it) + return hasFrontCameraData + ? { ...it, photoDir: 'operator-data/customersphotos' } + : { ...it, photoDir: 'front-camera-photo' } +}) + +const standardizeKeys = R.map(R.compose(R.fromPairs, R.map(mapKeys), R.toPairs)) + +const filterByPhotoAvailable = R.filter( + tx => !R.isNil(tx.date) && !R.isNil(tx.path), +) + +const formatPhotosData = R.compose( + filterByPhotoAvailable, + addPhotoDir, + standardizeKeys, +) + +export { + getAuthorizedStatus, + getFormattedPhone, + getName, + entryType, + customElements, + requirementElements, + formatPhotosData, + customerDataElements, + customerDataSchemas, + formatDates, + tryFormatDate, + REQUIREMENT, + CUSTOM, + ID_CARD_DATA, +} diff --git a/packages/admin-ui/src/pages/Customers/helper.test.js b/packages/admin-ui/src/pages/Customers/helper.test.js new file mode 100644 index 0000000..b8836d7 --- /dev/null +++ b/packages/admin-ui/src/pages/Customers/helper.test.js @@ -0,0 +1,323 @@ +import { describe, it, expect } from 'vitest' +import { getAuthorizedStatus } from './helper' + +describe('getAuthorizedStatus', () => { + const mockTriggers = { + automation: 'automatic', + overrides: [], + } + + const mockCustomRequests = [{ id: 'custom-req-1' }, { id: 'custom-req-2' }] + + it('should return blocked status when authorizedOverride is blocked', () => { + const customer = { + authorizedOverride: 'blocked', + } + + const result = getAuthorizedStatus( + customer, + mockTriggers, + mockCustomRequests, + ) + + expect(result).toEqual({ + label: 'Blocked', + type: 'error', + }) + }) + + it('should return suspension status when customer is suspended with days > 0', () => { + const customer = { + authorizedOverride: null, + isSuspended: true, + daysSuspended: 5, + } + + const result = getAuthorizedStatus( + customer, + mockTriggers, + mockCustomRequests, + ) + + expect(result).toEqual({ + label: '5 day suspension', + type: 'warning', + }) + }) + + it('should return short suspension status when customer is suspended with days <= 0', () => { + const customer = { + authorizedOverride: null, + isSuspended: true, + daysSuspended: 0, + } + + const result = getAuthorizedStatus( + customer, + mockTriggers, + mockCustomRequests, + ) + + expect(result).toEqual({ + label: '< 1 day suspension', + type: 'warning', + }) + }) + + it('should return rejected status when any field has blocked override', () => { + const customer = { + authorizedOverride: null, + isSuspended: false, + emailOverride: 'blocked', + email: 'test@example.com', + } + + const triggers = { + automation: 'manual', + overrides: [], + } + + const result = getAuthorizedStatus(customer, triggers, mockCustomRequests) + + expect(result).toEqual({ + label: 'Rejected', + type: 'error', + }) + }) + + it('should return pending status when any field has automatic override', () => { + const customer = { + authorizedOverride: null, + isSuspended: false, + emailOverride: 'automatic', + email: 'test@example.com', + } + + const triggers = { + automation: 'manual', + overrides: [], + } + + const result = getAuthorizedStatus(customer, triggers, mockCustomRequests) + + expect(result).toEqual({ + label: 'Pending', + type: 'warning', + }) + }) + + it('should return authorized status when no blocking conditions exist', () => { + const customer = { + authorizedOverride: null, + isSuspended: false, + } + + const result = getAuthorizedStatus( + customer, + mockTriggers, + mockCustomRequests, + ) + + expect(result).toEqual({ + label: 'Authorized', + type: 'success', + }) + }) + + it('should handle customers with idCardData', () => { + const customer = { + authorizedOverride: null, + isSuspended: false, + idCardData: { firstName: 'John', lastName: 'Doe' }, + idCardDataOverride: 'automatic', + } + + const triggers = { + automation: 'manual', + overrides: [], + } + + const result = getAuthorizedStatus(customer, triggers, mockCustomRequests) + + expect(result).toEqual({ + label: 'Pending', + type: 'warning', + }) + }) + + it('should handle customers with photo fields using path suffix', () => { + const customer = { + authorizedOverride: null, + isSuspended: false, + frontCameraPath: '/path/to/photo.jpg', + frontCameraOverride: 'blocked', + } + + const triggers = { + automation: 'manual', + overrides: [], + } + + const result = getAuthorizedStatus(customer, triggers, mockCustomRequests) + + expect(result).toEqual({ + label: 'Rejected', + type: 'error', + }) + }) + + it('should handle custom info requests with UUID validation', () => { + const customer = { + authorizedOverride: null, + isSuspended: false, + customInfoRequests: [ + { + infoRequestId: '550e8400-e29b-41d4-a716-446655440000', + override: 'automatic', + }, + ], + } + + const triggers = { + automation: 'manual', + overrides: [], + } + + const customRequests = [{ id: '550e8400-e29b-41d4-a716-446655440000' }] + + const result = getAuthorizedStatus(customer, triggers, customRequests) + + expect(result).toEqual({ + label: 'Pending', + type: 'warning', + }) + }) + + it('should handle manual overrides for specific requirements', () => { + const customer = { + authorizedOverride: null, + isSuspended: false, + frontCameraPath: '/path/to/photo.jpg', + frontCameraOverride: 'automatic', + } + + const triggers = { + automation: 'automatic', + overrides: [ + { + requirement: 'facephoto', + automation: 'manual', + }, + ], + } + + const result = getAuthorizedStatus(customer, triggers, mockCustomRequests) + + expect(result).toEqual({ + label: 'Pending', + type: 'warning', + }) + }) + + it('should handle null or undefined triggers gracefully', () => { + const customer = { + authorizedOverride: null, + isSuspended: false, + } + + const triggers = { + automation: 'automatic', + overrides: [], + } + + const result = getAuthorizedStatus(customer, triggers, mockCustomRequests) + + expect(result).toEqual({ + label: 'Authorized', + type: 'success', + }) + }) + + it('should handle empty custom requests array', () => { + const customer = { + authorizedOverride: null, + isSuspended: false, + } + + const result = getAuthorizedStatus(customer, mockTriggers, []) + + expect(result).toEqual({ + label: 'Authorized', + type: 'success', + }) + }) + + it('should prioritize blocked status over suspension', () => { + const customer = { + authorizedOverride: 'blocked', + isSuspended: true, + daysSuspended: 5, + } + + const result = getAuthorizedStatus( + customer, + mockTriggers, + mockCustomRequests, + ) + + expect(result).toEqual({ + label: 'Blocked', + type: 'error', + }) + }) + + it('should prioritize rejection over pending status', () => { + const customer = { + authorizedOverride: null, + isSuspended: false, + emailOverride: 'blocked', + email: 'test@example.com', + usSsnOverride: 'automatic', + usSsn: '123-45-6789', + } + + const triggers = { + automation: 'manual', + overrides: [], + } + + const result = getAuthorizedStatus(customer, triggers, mockCustomRequests) + + expect(result).toEqual({ + label: 'Rejected', + type: 'error', + }) + }) + + it('should return rejected status for blocked custom info request', () => { + const customer = { + authorizedOverride: null, + isSuspended: false, + customInfoRequests: [ + { + infoRequestId: '550e8400-e29b-41d4-a716-446655440000', + override: 'blocked', + }, + ], + } + + const triggers = { + automation: 'manual', + overrides: [], + } + + const customRequests = [{ id: '550e8400-e29b-41d4-a716-446655440000' }] + + const result = getAuthorizedStatus(customer, triggers, customRequests) + + expect(result).toEqual({ + label: 'Rejected', + type: 'error', + }) + }) +}) diff --git a/packages/admin-ui/src/pages/Customers/index.js b/packages/admin-ui/src/pages/Customers/index.js new file mode 100644 index 0000000..0ef3b32 --- /dev/null +++ b/packages/admin-ui/src/pages/Customers/index.js @@ -0,0 +1,4 @@ +import CustomerProfile from './CustomerProfile' +import Customers from './Customers' + +export { Customers, CustomerProfile } diff --git a/packages/admin-ui/src/pages/Dashboard/Alerts/Alerts.jsx b/packages/admin-ui/src/pages/Dashboard/Alerts/Alerts.jsx new file mode 100644 index 0000000..d252a8c --- /dev/null +++ b/packages/admin-ui/src/pages/Dashboard/Alerts/Alerts.jsx @@ -0,0 +1,90 @@ +import { useQuery, gql } from '@apollo/client' +import Button from '@mui/material/Button' +import classnames from 'classnames' +import * as R from 'ramda' +import React from 'react' +import { cardState } from '../../../components/CollapsibleCard' +import { Label1, H4 } from '../../../components/typography' + +import AlertsTable from './AlertsTable' + +const NUM_TO_RENDER = 3 + +const GET_ALERTS = gql` + query getAlerts { + alerts { + id + type + detail + message + created + read + valid + } + machines { + deviceId + name + } + } +` + +const Alerts = ({ onReset, onExpand, size }) => { + const showAllItems = size === cardState.EXPANDED + const { data } = useQuery(GET_ALERTS) + const alerts = R.path(['alerts'])(data) ?? [] + const machines = R.compose( + R.map(R.prop('name')), + R.indexBy(R.prop('deviceId')), + )(data?.machines ?? []) + const alertsLength = alerts.length + + return ( + <> +
    +

    {`Alerts (${alertsLength})`}

    + {showAllItems && ( + + + + )} +
    +
    +
    + {!alerts.length && ( + + No new alerts. Your system is running smoothly. + + )} + +
    +
    + {!showAllItems && alertsLength > NUM_TO_RENDER && ( +
    + + + +
    + )} + + ) +} +export default Alerts diff --git a/packages/admin-ui/src/pages/Dashboard/Alerts/AlertsTable.jsx b/packages/admin-ui/src/pages/Dashboard/Alerts/AlertsTable.jsx new file mode 100644 index 0000000..504a044 --- /dev/null +++ b/packages/admin-ui/src/pages/Dashboard/Alerts/AlertsTable.jsx @@ -0,0 +1,57 @@ +import List from '@mui/material/List' +import ListItem from '@mui/material/ListItem' +import * as R from 'ramda' +import React from 'react' +import { useLocation } from 'wouter' +import { P } from '../../../components/typography/index' +import Wrench from '../../../styling/icons/action/wrench/zodiac.svg?react' +import CashBoxEmpty from '../../../styling/icons/cassettes/cashbox-empty.svg?react' +import AlertLinkIcon from '../../../styling/icons/month arrows/right.svg?react' +import WarningIcon from '../../../styling/icons/warning-icon/tomato.svg?react' + +const icons = { + error: , + fiatBalance: ( + + ), +} + +const links = { + error: '/maintenance/machine-status', + fiatBalance: '/maintenance/cash-units', + cryptoBalance: '/maintenance/funding', +} + +const AlertsTable = ({ numToRender, alerts, machines }) => { + const [, navigate] = useLocation() + const alertsToRender = R.slice(0, numToRender, alerts) + + const alertMessage = alert => { + const deviceId = alert.detail.deviceId + if (!deviceId) return `${alert.message}` + + const deviceName = R.defaultTo('Unpaired device', machines[deviceId]) + return `${alert.message} - ${deviceName}` + } + + return ( + + {alertsToRender.map((alert, idx) => { + return ( + + {icons[alert.type] || ( + + )} +

    {alertMessage(alert)}

    + navigate(links[alert.type] || '/dashboard')} + /> +
    + ) + })} +
    + ) +} + +export default AlertsTable diff --git a/packages/admin-ui/src/pages/Dashboard/Alerts/index.js b/packages/admin-ui/src/pages/Dashboard/Alerts/index.js new file mode 100644 index 0000000..6284408 --- /dev/null +++ b/packages/admin-ui/src/pages/Dashboard/Alerts/index.js @@ -0,0 +1,3 @@ +import Alerts from './Alerts' + +export default Alerts diff --git a/packages/admin-ui/src/pages/Dashboard/Dashboard.jsx b/packages/admin-ui/src/pages/Dashboard/Dashboard.jsx new file mode 100644 index 0000000..f27f3b0 --- /dev/null +++ b/packages/admin-ui/src/pages/Dashboard/Dashboard.jsx @@ -0,0 +1,103 @@ +import { useQuery, gql } from '@apollo/client' +import * as R from 'ramda' +import React, { useState } from 'react' +import { useLocation } from 'wouter' +import TitleSection from '../../components/layout/TitleSection' +import { H1, Info2, TL2, Label1 } from '../../components/typography' +import TxInIcon from '../../styling/icons/direction/cash-in.svg?react' +import TxOutIcon from '../../styling/icons/direction/cash-out.svg?react' + +import { Button } from '../../components/buttons' +import AddMachine from '../AddMachine' +import { errorColor } from '../../styling/variables' + +import Footer from './Footer' +import RightSide from './RightSide' +import Paper from '@mui/material/Paper' +import SystemPerformance from './SystemPerformance/index.js' + +const GET_DATA = gql` + query getData { + machines { + name + } + serverVersion + } +` + +const Dashboard = () => { + const [, navigate] = useLocation() + const [open, setOpen] = useState(false) + + const { data, loading } = useQuery(GET_DATA) + + const onPaired = machine => { + setOpen(false) + navigate('/maintenance/machine-status', { state: { id: machine.deviceId } }) + } + + return !loading ? ( + !R.isEmpty(data.machines) ? ( + <> + +
    +
    + + Cash-in +
    +
    + + Cash-out +
    +
    + + + + Action Required +
    +
    +
    +
    +
    + + + +
    +
    + +
    +
    +
    + + ) : ( + <> + {open && ( + setOpen(false)} onPaired={onPaired} /> + )} + +
    + + {data?.serverVersion}{' '} + server version + +
    +
    +
    +
    +

    No machines on your system yet

    + + To fully take advantage of Lamassu Admin, add a new machine to + your system + + +
    +
    +
    + + ) + ) : ( + <> + ) +} + +export default Dashboard diff --git a/packages/admin-ui/src/pages/Dashboard/Footer/Footer.jsx b/packages/admin-ui/src/pages/Dashboard/Footer/Footer.jsx new file mode 100644 index 0000000..0dbacfc --- /dev/null +++ b/packages/admin-ui/src/pages/Dashboard/Footer/Footer.jsx @@ -0,0 +1,101 @@ +import { useQuery, gql } from '@apollo/client' +import BigNumber from 'bignumber.js' +import * as R from 'ramda' +import React from 'react' +import { Label2 } from '../../../components/typography' +import TxInIcon from '../../../styling/icons/direction/cash-in.svg?react' +import TxOutIcon from '../../../styling/icons/direction/cash-out.svg?react' + +import { fromNamespace } from '../../../utils/config' + +import classes from './Footer.module.css' + +const GET_DATA = gql` + query getData { + cryptoRates + cryptoCurrencies { + code + display + } + config + accountsConfig { + code + display + } + } +` + +BigNumber.config({ ROUNDING_MODE: BigNumber.ROUND_HALF_UP }) + +const Footer = () => { + const { data } = useQuery(GET_DATA) + + const withCommissions = R.path(['cryptoRates', 'withCommissions'])(data) ?? {} + const config = R.path(['config'])(data) ?? {} + // const canExpand = R.keys(withCommissions).length > 4 + + const wallets = fromNamespace('wallets')(config) + const cryptoCurrencies = R.path(['cryptoCurrencies'])(data) ?? [] + const accountsConfig = R.path(['accountsConfig'])(data) ?? [] + const localeFiatCurrency = R.path(['locale_fiatCurrency'])(config) ?? '' + + const renderFooterItem = key => { + const idx = R.findIndex(R.propEq(key, 'code'))(cryptoCurrencies) + const tickerCode = wallets[`${key}_ticker`] + const tickerIdx = R.findIndex(R.propEq(tickerCode, 'code'))(accountsConfig) + + const tickerName = tickerIdx > -1 ? accountsConfig[tickerIdx].display : '' + + const cashInNoCommission = parseFloat( + R.path(['cryptoRates', 'withoutCommissions', key, 'cashIn'])(data), + ) + const cashOutNoCommission = parseFloat( + R.path(['cryptoRates', 'withoutCommissions', key, 'cashOut'])(data), + ) + + const avgOfAskBid = new BigNumber( + (cashInNoCommission + cashOutNoCommission) / 2, + ).toFormat(2) + const cashIn = new BigNumber( + parseFloat( + R.path(['cryptoRates', 'withCommissions', key, 'cashIn'])(data), + ), + ).toFormat(2) + const cashOut = new BigNumber( + parseFloat( + R.path(['cryptoRates', 'withCommissions', key, 'cashOut'])(data), + ), + ).toFormat(2) + + return ( +
    + + {cryptoCurrencies[idx].display} + +
    +
    + + {`${cashIn} ${localeFiatCurrency}`} +
    +
    + + {`${cashOut} ${localeFiatCurrency}`} +
    +
    + + {`${tickerName}: ${avgOfAskBid} ${localeFiatCurrency}`} + +
    + ) + } + + return ( +
    +
    + {R.keys(withCommissions).map(key => renderFooterItem(key))} +
    +
    + ) +} + +export default Footer diff --git a/packages/admin-ui/src/pages/Dashboard/Footer/Footer.module.css b/packages/admin-ui/src/pages/Dashboard/Footer/Footer.module.css new file mode 100644 index 0000000..c3c89bf --- /dev/null +++ b/packages/admin-ui/src/pages/Dashboard/Footer/Footer.module.css @@ -0,0 +1,28 @@ +.footer1 { + left: 0; + bottom: 0; + position: fixed; + width: 100vw; + background-color: white; + text-align: left; + z-index: 1; + box-shadow: 0 -1px 10px 0 rgba(50, 50, 50, 0.1); + min-height: 48px; + transition: min-height 0.5s ease-out; +} + +.footer1:hover { + transition: min-height 0.5s ease-in; + min-height: 200px; +} + +.content1 { + width: 1200px; + max-height: 100px; + background-color: white; + z-index: 2; + bottom: -8px; + margin: 0 auto; + display: flex; + flex-wrap: wrap; +} diff --git a/packages/admin-ui/src/pages/Dashboard/Footer/index.js b/packages/admin-ui/src/pages/Dashboard/Footer/index.js new file mode 100644 index 0000000..9c7e831 --- /dev/null +++ b/packages/admin-ui/src/pages/Dashboard/Footer/index.js @@ -0,0 +1,3 @@ +import Footer from './Footer' + +export default Footer diff --git a/packages/admin-ui/src/pages/Dashboard/RightSide.jsx b/packages/admin-ui/src/pages/Dashboard/RightSide.jsx new file mode 100644 index 0000000..b5f70bc --- /dev/null +++ b/packages/admin-ui/src/pages/Dashboard/RightSide.jsx @@ -0,0 +1,89 @@ +import Button from '@mui/material/Button' +import classnames from 'classnames' +import React, { useState } from 'react' +import CollapsibleCard, { cardState } from '../../components/CollapsibleCard' +import { H4, Label1 } from '../../components/typography' + +import Alerts from './Alerts' +import SystemStatus from './SystemStatus' + +const ShrunkCard = ({ title, buttonName, onUnshrink }) => { + return ( +
    +

    {title}

    + + + +
    + ) +} + +const RightSide = () => { + const [systemStatusSize, setSystemStatusSize] = useState(cardState.DEFAULT) + const [alertsSize, setAlertsSize] = useState(cardState.DEFAULT) + + const onReset = () => { + setAlertsSize(cardState.DEFAULT) + setSystemStatusSize(cardState.DEFAULT) + } + return ( +
    +
    + + }> + { + setAlertsSize(cardState.EXPANDED) + setSystemStatusSize(cardState.SHRUNK) + }} + onReset={onReset} + size={alertsSize} + /> + + + }> + { + setSystemStatusSize(cardState.EXPANDED) + setAlertsSize(cardState.SHRUNK) + }} + onReset={onReset} + size={systemStatusSize} + /> + +
    +
    + ) +} + +export default RightSide diff --git a/packages/admin-ui/src/pages/Dashboard/SystemPerformance/Graphs/PercentageChart.jsx b/packages/admin-ui/src/pages/Dashboard/SystemPerformance/Graphs/PercentageChart.jsx new file mode 100644 index 0000000..30bba11 --- /dev/null +++ b/packages/admin-ui/src/pages/Dashboard/SystemPerformance/Graphs/PercentageChart.jsx @@ -0,0 +1,34 @@ +import classnames from 'classnames' +import React from 'react' +import { Label1 } from '../../../../components/typography/index' + +const PercentageChart = ({ cashIn, cashOut }) => { + const value = cashIn || cashOut !== 0 ? cashIn : 50 + + const buildPercentageView = value => { + if (value <= 15) return + return {value}% + } + + const percentageClasses = { + 'h-35 rounded-sm flex items-center justify-center': true, + 'min-w-2 rounded-xs': value < 5 && value > 0, + } + + return ( +
    +
    + {buildPercentageView(value, 'cashIn')} +
    +
    + {buildPercentageView(100 - value, 'cashOut')} +
    +
    + ) +} + +export default PercentageChart diff --git a/packages/admin-ui/src/pages/Dashboard/SystemPerformance/Graphs/RefLineChart.jsx b/packages/admin-ui/src/pages/Dashboard/SystemPerformance/Graphs/RefLineChart.jsx new file mode 100644 index 0000000..b3790db --- /dev/null +++ b/packages/admin-ui/src/pages/Dashboard/SystemPerformance/Graphs/RefLineChart.jsx @@ -0,0 +1,197 @@ +import * as d3 from 'd3' +import * as R from 'ramda' +import React, { useEffect, useRef, useCallback } from 'react' + +const transactionProfit = tx => tx.profit.toNumber() + +const mockPoint = (tx, offsetMs, profit) => { + const date = new Date(new Date(tx.created).getTime() + offsetMs).toISOString() + return { created: date, profit } +} + +// if we're viewing transactions for the past day, then we group by hour. If not, we group by day +const formatDay = ({ created }) => + new Date(created).toISOString().substring(0, 10) +const formatHour = ({ created }) => + new Date(created).toISOString().substring(0, 13) + +const reducer = (acc, tx) => { + const currentProfit = acc.profit || 0 + return { ...tx, profit: currentProfit + transactionProfit(tx) } +} + +const timeFrameMS = { + Day: 24 * 3600 * 1000, + Week: 7 * 24 * 3600 * 1000, + Month: 30 * 24 * 3600 * 1000, +} + +const RefLineChart = ({ + data: realData, + previousTimeData, + previousProfit, + timeFrame, +}) => { + const svgRef = useRef() + + const drawGraph = useCallback(() => { + const svg = d3.select(svgRef.current) + const margin = { top: 0, right: 0, bottom: 0, left: 0 } + const width = 336 - margin.left - margin.right + const height = 140 - margin.top - margin.bottom + + const massageData = () => { + // if we're viewing transactions for the past day, then we group by hour. If not, we group by day + const method = timeFrame === 'Day' ? formatHour : formatDay + + const aggregatedTX = R.values(R.reduceBy(reducer, [], method, realData)) + // if no point exists, then return 2 points at y = 0 + if (!aggregatedTX.length && !previousTimeData.length) { + const mockPoint1 = { created: new Date().toISOString(), profit: 0 } + const mockPoint2 = mockPoint(mockPoint1, -3600000, 0) + return [[mockPoint1, mockPoint2], true] + } + // if this time period has no txs, but previous time period has, then % change is -100% + if (!aggregatedTX.length && previousTimeData.length) { + const mockPoint1 = { + created: new Date().toISOString(), + profit: 0, + } + const mockPoint2 = mockPoint(mockPoint1, -timeFrameMS[timeFrame], 1) + return [[mockPoint1, mockPoint2], false] + } + // if this time period has txs, but previous doesn't, then % change is +100% + if (aggregatedTX.length && !previousTimeData.length) { + const mockPoint1 = { + created: new Date().toISOString(), + profit: 1, + } + const mockPoint2 = mockPoint(mockPoint1, -timeFrameMS[timeFrame], 0) + return [[mockPoint1, mockPoint2], false] + } + // if only one point exists, create point on the left - otherwise the line won't be drawn + if (aggregatedTX.length === 1) { + return [ + R.append( + { + created: new Date( + Date.now() - timeFrameMS[timeFrame], + ).toISOString(), + profit: previousProfit, + }, + aggregatedTX, + ), + false, + ] + } + // the boolean value is for zeroProfit. It makes the line render at y = 0 instead of y = 50% of container height + return [aggregatedTX, false] + } + + /* Important step to make the graph look good! + This function groups transactions by either day or hour depending on the time frame + This makes the line look smooth and not all wonky when there are many transactions in a given time + */ + const [data, zeroProfit] = massageData() + + // sets width of the graph + svg.attr('width', width) + + // background color for the graph + svg + .append('rect') + .attr('x', 0) + .attr('y', -margin.top) + .attr('width', width + margin.left + margin.right) + .attr('height', height + margin.top) + .attr('fill', 'var(--ghost)') + .attr('transform', `translate(${0},${margin.top})`) + + // gradient color for the graph (creates the "url", the color is applied by calling the url, in the area color fill ) + svg + .append('linearGradient') + .attr('id', 'area-gradient') + .attr('gradientUnits', 'userSpaceOnUse') + .attr('x1', 0) + .attr('y1', 0) + .attr('x2', 0) + .attr('y2', '100%') + .selectAll('stop') + .data([ + { offset: '0%', color: 'var(--zircon)' }, + { offset: '25%', color: 'var(--zircon)' }, + { offset: '100%', color: 'var(--ghost)' }, + ]) + .enter() + .append('stop') + .attr('offset', function (d) { + return d.offset + }) + .attr('stop-color', function (d) { + return d.color + }) + + const g = svg + .append('g') + .attr('transform', `translate(${margin.left},${margin.top})`) + + const xDomain = d3.extent(data, t => t.created) + const yDomain = zeroProfit ? [0, 0.1] : [0, d3.max(data, t => t.profit)] + + const y = d3 + .scaleLinear() + // 30 is a margin so that the labels and the percentage change label can fit and not overlay the line path + .range([height, 40]) + .domain([0, yDomain[1]]) + const x = d3 + .scaleTime() + .domain([new Date(xDomain[0]), new Date(xDomain[1])]) + .range([0, width]) + + const line = d3 + .line() + .x(function (d) { + return x(new Date(d.created)) + }) + .y(function (d) { + return y(d.profit) + }) + + const area = d3 + .area() + .x(function (d) { + return x(new Date(d.created)) + }) + .y0(height) + .y1(function (d) { + return y(d.profit) + }) + + // area color fill + g.append('path') + .datum(data) + .attr('d', area) + .attr('fill', 'url(#area-gradient)') + // draw the line + g.append('path') + .datum(data) + .attr('d', line) + .attr('fill', 'none') + .attr('stroke-width', '2') + .attr('stroke-linejoin', 'round') + .attr('stroke', 'var(--zodiac)') + }, [realData, timeFrame, previousTimeData, previousProfit]) + + useEffect(() => { + // first we clear old chart DOM elements on component update + d3.select(svgRef.current).selectAll('*').remove() + drawGraph() + }, [drawGraph, realData]) + + return ( + <> + + + ) +} +export default RefLineChart diff --git a/packages/admin-ui/src/pages/Dashboard/SystemPerformance/Graphs/RefScatterplot.jsx b/packages/admin-ui/src/pages/Dashboard/SystemPerformance/Graphs/RefScatterplot.jsx new file mode 100644 index 0000000..653588b --- /dev/null +++ b/packages/admin-ui/src/pages/Dashboard/SystemPerformance/Graphs/RefScatterplot.jsx @@ -0,0 +1,348 @@ +import BigNumber from 'bignumber.js' +import * as d3 from 'd3' +import { getTimezoneOffset } from 'date-fns-tz' +import { add, format, startOfWeek, startOfYear } from 'date-fns/fp' +import React, { useCallback, useEffect, useMemo, useRef } from 'react' + +import { numberToFiatAmount } from '../../../../utils/number' +import { MINUTE, DAY, WEEK, MONTH } from '../../../../utils/time' + +const Graph = ({ data, timeFrame, timezone }) => { + const ref = useRef(null) + + const GRAPH_HEIGHT = 250 + const GRAPH_WIDTH = 555 + const GRAPH_MARGIN = useMemo( + () => ({ + top: 20, + right: 3.5, + bottom: 27, + left: 33.5, + }), + [], + ) + + const offset = getTimezoneOffset(timezone) + const NOW = Date.now() + offset + + const periodDomains = { + Day: [NOW - DAY, NOW], + Week: [NOW - WEEK, NOW], + Month: [NOW - MONTH, NOW], + } + + const dataPoints = useMemo( + () => ({ + Day: { + freq: 24, + step: 60 * 60 * 1000, + tick: d3.utcHour.every(4), + labelFormat: '%H:%M', + }, + Week: { + freq: 7, + step: 24 * 60 * 60 * 1000, + tick: d3.utcDay.every(1), + labelFormat: '%a %d', + }, + Month: { + freq: 30, + step: 24 * 60 * 60 * 1000, + tick: d3.utcDay.every(2), + labelFormat: '%d', + }, + }), + [], + ) + + const filterDay = useCallback( + x => (timeFrame === 'Day' ? x.getUTCHours() === 0 : x.getUTCDate() === 1), + [timeFrame], + ) + + const getPastAndCurrentDayLabels = useCallback(d => { + const currentDate = new Date(d) + const currentDateDay = currentDate.getUTCDate() + const currentDateWeekday = currentDate.getUTCDay() + const currentDateMonth = currentDate.getUTCMonth() + + const previousDate = new Date(currentDate.getTime()) + previousDate.setUTCDate(currentDateDay - 1) + + const previousDateDay = previousDate.getUTCDate() + const previousDateWeekday = previousDate.getUTCDay() + const previousDateMonth = previousDate.getUTCMonth() + + const daysOfWeek = Array.from(Array(7)).map((_, i) => + format('EEE', add({ days: i }, startOfWeek(new Date()))), + ) + + const months = Array.from(Array(12)).map((_, i) => + format('LLL', add({ months: i }, startOfYear(new Date()))), + ) + + return { + previous: + currentDateMonth !== previousDateMonth + ? months[previousDateMonth] + : `${daysOfWeek[previousDateWeekday]} ${previousDateDay}`, + current: + currentDateMonth !== previousDateMonth + ? months[currentDateMonth] + : `${daysOfWeek[currentDateWeekday]} ${currentDateDay}`, + } + }, []) + + const buildTicks = useCallback( + domain => { + const points = [] + + const roundDate = d => { + const step = dataPoints[timeFrame].step + return new Date(Math.ceil(d.valueOf() / step) * step) + } + + for (let i = 0; i <= dataPoints[timeFrame].freq; i++) { + const stepDate = new Date(NOW - i * dataPoints[timeFrame].step) + if (roundDate(stepDate) > domain[1]) continue + if (stepDate < domain[0]) continue + points.push(roundDate(stepDate)) + } + + return points + }, + [NOW, dataPoints, timeFrame], + ) + + const x = d3 + .scaleUtc() + .domain(periodDomains[timeFrame]) + .range([GRAPH_MARGIN.left, GRAPH_WIDTH - GRAPH_MARGIN.right]) + + const y = d3 + .scaleLinear() + .domain([ + 0, + (d3.max(data, d => new BigNumber(d.fiat).toNumber()) ?? 1000) * 1.05, + ]) + .nice() + .range([GRAPH_HEIGHT - GRAPH_MARGIN.bottom, GRAPH_MARGIN.top]) + + const buildBackground = useCallback( + g => { + g.append('rect') + .attr('x', 0) + .attr('y', GRAPH_MARGIN.top) + .attr('width', GRAPH_WIDTH) + .attr('height', GRAPH_HEIGHT - GRAPH_MARGIN.top - GRAPH_MARGIN.bottom) + .attr('fill', 'var(--ghost)') + }, + [GRAPH_MARGIN], + ) + + const buildXAxis = useCallback( + g => + g + .attr( + 'transform', + `translate(0, ${GRAPH_HEIGHT - GRAPH_MARGIN.bottom})`, + ) + .call( + d3 + .axisBottom(x) + .ticks(dataPoints[timeFrame].tick) + .tickFormat(d => { + return d3.timeFormat(dataPoints[timeFrame].labelFormat)( + d.getTime() + d.getTimezoneOffset() * MINUTE, + ) + }), + ) + .call(g => g.select('.domain').remove()), + [GRAPH_MARGIN, dataPoints, timeFrame, x], + ) + + const buildYAxis = useCallback( + g => + g + .attr('transform', `translate(${GRAPH_MARGIN.left}, 0)`) + .call( + d3 + .axisLeft(y) + .ticks(5) + .tickFormat(d => { + if (d >= 1000) return numberToFiatAmount(d / 1000) + 'k' + + return numberToFiatAmount(d) + }), + ) + .call(g => g.select('.domain').remove()) + .selectAll('text') + .attr('dy', '-0.25rem'), + [GRAPH_MARGIN, y], + ) + + const buildGrid = useCallback( + g => { + g.attr('stroke', 'var(--zircon2)') + .attr('fill', 'var(--zircon2)') + // Vertical lines + .call(g => + g + .append('g') + .selectAll('line') + .data(buildTicks(x.domain())) + .join('line') + .attr('x1', d => 0.5 + x(d)) + .attr('x2', d => 0.5 + x(d)) + .attr('y1', GRAPH_MARGIN.top) + .attr('y2', GRAPH_HEIGHT - GRAPH_MARGIN.bottom) + .attr('stroke-width', 1), + ) + // Horizontal lines + .call(g => + g + .append('g') + .selectAll('line') + .data(d3.axisLeft(y).scale().ticks(5)) + .join('line') + .attr('y1', d => 0.5 + y(d)) + .attr('y2', d => 0.5 + y(d)) + .attr('x1', GRAPH_MARGIN.left) + .attr('x2', GRAPH_WIDTH), + ) + // Thick vertical lines + .call(g => + g + .append('g') + .selectAll('line') + .data(buildTicks(x.domain()).filter(filterDay)) + .join('line') + .attr('class', 'dateSeparator') + .attr('x1', d => 0.5 + x(d)) + .attr('x2', d => 0.5 + x(d)) + .attr('y1', GRAPH_MARGIN.top - 10) + .attr('y2', GRAPH_HEIGHT - GRAPH_MARGIN.bottom) + .attr('stroke-width', 2) + .join('text'), + ) + // Left side breakpoint label + .call(g => { + const separator = d3?.select('.dateSeparator')?.node()?.getBBox() + + if (!separator) return + + const breakpoint = buildTicks(x.domain()).filter(filterDay) + + const labels = getPastAndCurrentDayLabels(breakpoint) + + return g + .append('text') + .attr('x', separator.x - 7) + .attr('y', separator.y) + .attr('text-anchor', 'end') + .attr('dy', '.25em') + .text(labels.previous) + }) + // Right side breakpoint label + .call(g => { + const separator = d3?.select('.dateSeparator')?.node()?.getBBox() + + if (!separator) return + + const breakpoint = buildTicks(x.domain()).filter(filterDay) + + const labels = getPastAndCurrentDayLabels(breakpoint) + + return g + .append('text') + .attr('x', separator.x + 7) + .attr('y', separator.y) + .attr('text-anchor', 'start') + .attr('dy', '.25em') + .text(labels.current) + }) + }, + [GRAPH_MARGIN, buildTicks, getPastAndCurrentDayLabels, x, y, filterDay], + ) + + const formatTicksText = useCallback( + () => + d3 + .selectAll('.tick text') + .style('stroke', 'var(--comet)') + .style('fill', 'var(--comet)') + .style('stroke-width', 0) + .style('font-family', 'var(--museo)'), + [], + ) + + const formatText = useCallback( + () => + d3 + .selectAll('text') + .style('stroke', 'var(--comet)') + .style('fill', 'var(--comet)') + .style('stroke-width', 0) + .style('font-family', 'var(--museo)'), + [], + ) + + const formatTicks = useCallback(() => { + d3.selectAll('.tick line') + .style('stroke', 'transparent') + .style('fill', 'transparent') + }, []) + + const drawData = useCallback( + g => { + g.selectAll('circle') + .data(data) + .join('circle') + .attr('cx', d => { + const created = new Date(d.created) + return x(created.setTime(created.getTime() + offset)) + }) + .attr('cy', d => y(new BigNumber(d.fiat).toNumber())) + .attr('fill', d => + d.txClass === 'cashIn' ? 'var(--java)' : 'var(--neon)', + ) + .attr('r', 3.5) + }, + [data, offset, x, y], + ) + + const drawChart = useCallback(() => { + const svg = d3 + .select(ref.current) + .attr('viewBox', [0, 0, GRAPH_WIDTH, GRAPH_HEIGHT]) + + svg.append('g').call(buildBackground) + svg.append('g').call(buildGrid) + svg.append('g').call(buildXAxis) + svg.append('g').call(buildYAxis) + svg.append('g').call(formatTicksText) + svg.append('g').call(formatText) + svg.append('g').call(formatTicks) + svg.append('g').call(drawData) + + return svg.node() + }, [ + buildBackground, + buildGrid, + buildXAxis, + buildYAxis, + drawData, + formatText, + formatTicks, + formatTicksText, + ]) + + useEffect(() => { + d3.select(ref.current).selectAll('*').remove() + drawChart() + }, [drawChart]) + + return +} + +export default Graph diff --git a/packages/admin-ui/src/pages/Dashboard/SystemPerformance/InfoWithLabel.jsx b/packages/admin-ui/src/pages/Dashboard/SystemPerformance/InfoWithLabel.jsx new file mode 100644 index 0000000..6ac164c --- /dev/null +++ b/packages/admin-ui/src/pages/Dashboard/SystemPerformance/InfoWithLabel.jsx @@ -0,0 +1,13 @@ +import React from 'react' +import { Info1, Label1 } from '../../../components/typography/index' + +const InfoWithLabel = ({ info, label }) => { + return ( +
    + {info} + {label} +
    + ) +} + +export default InfoWithLabel diff --git a/packages/admin-ui/src/pages/Dashboard/SystemPerformance/Nav.jsx b/packages/admin-ui/src/pages/Dashboard/SystemPerformance/Nav.jsx new file mode 100644 index 0000000..1511f8b --- /dev/null +++ b/packages/admin-ui/src/pages/Dashboard/SystemPerformance/Nav.jsx @@ -0,0 +1,42 @@ +import classnames from 'classnames' +import * as R from 'ramda' +import React, { useState } from 'react' +import { H4 } from '../../../components/typography' + +const ranges = ['Month', 'Week', 'Day'] + +const Nav = ({ handleSetRange, showPicker }) => { + const [clickedItem, setClickedItem] = useState('Day') + + const isSelected = R.equals(clickedItem) + const handleClick = range => { + setClickedItem(range) + handleSetRange(range) + } + + return ( +
    +

    {'System performance'}

    + {showPicker && ( +
    + {ranges.map((it, idx) => { + return ( +
    handleClick(e.target.innerText)} + className={classnames({ + 'cursor-pointer text-comet': true, + 'font-bold text-zodiac border-b-zodiac border-b-2': + isSelected(it), + })}> + {it} +
    + ) + })} +
    + )} +
    + ) +} + +export default Nav diff --git a/packages/admin-ui/src/pages/Dashboard/SystemPerformance/SystemPerformance.jsx b/packages/admin-ui/src/pages/Dashboard/SystemPerformance/SystemPerformance.jsx new file mode 100644 index 0000000..0d259a8 --- /dev/null +++ b/packages/admin-ui/src/pages/Dashboard/SystemPerformance/SystemPerformance.jsx @@ -0,0 +1,285 @@ +import { useQuery, gql } from '@apollo/client' +import BigNumber from 'bignumber.js' +import classnames from 'classnames' +import * as R from 'ramda' +import React, { useState } from 'react' +import { Info2, Label1, Label2, P } from '../../../components/typography/index' +import PercentDownIcon from '../../../styling/icons/dashboard/down.svg?react' +import PercentNeutralIcon from '../../../styling/icons/dashboard/equal.svg?react' +import PercentUpIcon from '../../../styling/icons/dashboard/up.svg?react' + +import { EmptyTable } from '../../../components/table' +import { java, neon } from '../../../styling/variables' +import { fromNamespace } from '../../../utils/config' +import { DAY, WEEK, MONTH } from '../../../utils/time' +import { timezones } from '../../../utils/timezone-list' + +import PercentageChart from './Graphs/PercentageChart' +import LineChart from './Graphs/RefLineChart' +import Scatterplot from './Graphs/RefScatterplot' +import InfoWithLabel from './InfoWithLabel' +import Nav from './Nav' + +BigNumber.config({ ROUNDING_MODE: BigNumber.ROUND_HALF_UP }) + +const sumBNBy = by => + R.reduce((acc, value) => acc.plus(by(value)), new BigNumber(0)) + +const getProfit = sumBNBy(tx => tx.profit) + +const GET_DATA = gql` + query getData($excludeTestingCustomers: Boolean, $from: DateTimeISO) { + transactions( + excludeTestingCustomers: $excludeTestingCustomers + from: $from + ) { + fiatCode + fiat + created + txClass + error + profit + dispense + sendConfirmed + } + fiatRates { + code + name + rate + } + config + } +` + +const twoMonthsAgo = new Date() +twoMonthsAgo.setMonth(twoMonthsAgo.getMonth() - 2) + +const SystemPerformance = () => { + const [selectedRange, setSelectedRange] = useState('Day') + + const { data, loading } = useQuery(GET_DATA, { + variables: { + excludeTestingCustomers: true, + from: twoMonthsAgo.toISOString(), + }, + }) + const { fiatCurrency, timezone } = fromNamespace('locale')(data?.config) + const allTransactions = data?.transactions ?? [] + + const NOW = Date.now() + + const periodDomains = { + Day: [NOW - DAY, NOW], + Week: [NOW - WEEK, NOW], + Month: [NOW - MONTH, NOW], + } + + const isInRangeAndNoError = getLastTimePeriod => t => { + if (t.error !== null) return false + if (t.txClass === 'cashOut' && !t.dispense) return false + if (t.txClass === 'cashIn' && !t.sendConfirmed) return false + + const createdTimestamp = new Date(t.created).getTime() + const [rangeStart, rangeEnd] = periodDomains[selectedRange] + + if (getLastTimePeriod) { + const duration = rangeEnd - rangeStart + return ( + createdTimestamp >= rangeStart - duration && + createdTimestamp < rangeStart + ) + } + + return createdTimestamp >= rangeStart && createdTimestamp <= rangeEnd + } + + const convertFiatToLocale = item => { + if (item.fiatCode === fiatCurrency) + return { + ...item, + fiat: new BigNumber(item.fiat), + profit: new BigNumber(item.profit), + } + const itemRate = R.find(R.propEq(item.fiatCode, 'code'))(data.fiatRates) + const localeRate = R.find(R.propEq(fiatCurrency, 'code'))(data.fiatRates) + const multiplier = localeRate.rate / itemRate.rate + return { + ...item, + fiat: new BigNumber(item.fiat).times(multiplier), + profit: new BigNumber(item.profit).times(multiplier), + } + } + + const prepareTransactions = getLastTimePeriod => + allTransactions + .filter(isInRangeAndNoError(getLastTimePeriod)) + .map(convertFiatToLocale) + + const transactionsToShow = prepareTransactions(false) + const transactionsLastTimePeriod = prepareTransactions(true) + + const getNumTransactions = () => { + return R.length(transactionsToShow) + } + + const getFiatVolume = () => + sumBNBy(tx => tx.fiat)(transactionsToShow).toFormat(2) + + const getPercentChange = () => { + const thisTimePeriodProfit = getProfit(transactionsToShow) + const previousTimePeriodProfit = getProfit(transactionsLastTimePeriod) + + if (thisTimePeriodProfit.eq(previousTimePeriodProfit)) return 0 + if (previousTimePeriodProfit.eq(0)) return 100 + + return thisTimePeriodProfit + .minus(previousTimePeriodProfit) + .times(100) + .div(previousTimePeriodProfit) + .toNumber() + } + + const getDirectionPercent = () => { + const [cashIn, cashOut] = R.partition(R.propEq('cashIn', 'txClass'))( + transactionsToShow, + ) + const totalLength = cashIn.length + cashOut.length + if (totalLength === 0) { + return { cashIn: 0, cashOut: 0 } + } + + return { + cashIn: Math.round((cashIn.length / totalLength) * 100), + cashOut: Math.round((cashOut.length / totalLength) * 100), + } + } + + const percentChange = getPercentChange() + + const percentageClasses = { + 'text-tomato': percentChange < 0, + 'text-spring4': percentChange > 0, + 'text-comet': percentChange === 0, + 'flex items-center justify-center gap-1': true, + } + + const getPercentageIcon = () => { + const className = 'w-4 h-4' + if (percentChange === 0) return + if (percentChange > 0) return + return + } + + return ( + <> +

    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 literal 0 HcmV?d00001 diff --git a/packages/admin-ui/public/fonts/MontHeavy/mont-bold-webfont.woff b/packages/admin-ui/public/fonts/MontHeavy/mont-bold-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..85e11fa74021164183804f55b5cc0037b06ccf99 GIT binary patch literal 33244 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 literal 0 HcmV?d00001 diff --git a/packages/admin-ui/public/fonts/MontHeavy/mont-bold-webfont.woff2 b/packages/admin-ui/public/fonts/MontHeavy/mont-bold-webfont.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..ddf8442d908641b6e8936a50cbe8f210b0ad13bd GIT binary patch literal 25180 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 z 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 N=j>A#omdzc7ywC9yBPog literal 0 HcmV?d00001 diff --git a/packages/admin-ui/public/fonts/MontHeavy/mont-heavy-webfont.woff b/packages/admin-ui/public/fonts/MontHeavy/mont-heavy-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..f76db64684f97bc7f5efa845a06d9b86ceb1a64f GIT binary patch literal 58028 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