diff --git a/packages/renderer/src/components/molecules/MarketOffersSelectPaymentMethods/MarketOffersSelectPaymentMethods.stories.tsx b/packages/renderer/src/components/molecules/MarketOffersSelectPaymentMethods/MarketOffersSelectPaymentMethods.stories.tsx new file mode 100644 index 0000000..a15dafc --- /dev/null +++ b/packages/renderer/src/components/molecules/MarketOffersSelectPaymentMethods/MarketOffersSelectPaymentMethods.stories.tsx @@ -0,0 +1,42 @@ +// ============================================================================= +// Copyright 2022 Haveno +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ============================================================================= + +import type { ComponentStory, ComponentMeta } from "@storybook/react"; +import { MarketoffersSelectPaymentMethods } from "."; + +export default { + title: "molecules/MarketoffersSelectPaymentMethods", + component: MarketoffersSelectPaymentMethods, +} as ComponentMeta; + +const Template: ComponentStory< + typeof MarketoffersSelectPaymentMethods +> = () => { + return ; +}; + +export const Default = Template.bind({}); + +Default.args = {}; + +const data = [ + { + method: "Celpay", + rateTradeLimit: 20, + rateTradeLimitCurrency: "XMR", + info: "Global", + }, +]; diff --git a/packages/renderer/src/components/molecules/MarketOffersSelectPaymentMethods/MarketOffersSelectPaymentMethods.test.tsx b/packages/renderer/src/components/molecules/MarketOffersSelectPaymentMethods/MarketOffersSelectPaymentMethods.test.tsx new file mode 100644 index 0000000..e69de29 diff --git a/packages/renderer/src/components/molecules/MarketOffersSelectPaymentMethods/MarketOffersSelectPaymentMethods.tsx b/packages/renderer/src/components/molecules/MarketOffersSelectPaymentMethods/MarketOffersSelectPaymentMethods.tsx new file mode 100644 index 0000000..4abec78 --- /dev/null +++ b/packages/renderer/src/components/molecules/MarketOffersSelectPaymentMethods/MarketOffersSelectPaymentMethods.tsx @@ -0,0 +1,54 @@ +import { createTable } from "@tanstack/react-table"; +import { createStyles } from "@mantine/core"; +import { Table } from "@molecules/Table"; + +const table = createTable().setRowType(); + +interface MarketoffersSelectPaymentMethods { + data: TMarketOfferPaymentMethod[]; +} + +export function MarketoffersSelectPaymentMethods({ + data, +}: MarketoffersSelectPaymentMethods) { + const { classes } = useStyles(); + + return ( + + ); +} + +const columns = [ + table.createDataColumn("method", { + id: "method", + header: "Method", + }), + table.createDataColumn("rateTradeLimit", { + id: "rateTradeLimit", + header: "Per Trade Limit", + size: 400, + }), + table.createDataColumn("info", { + id: "info", + header: "Info", + size: 400, + }) +]; + +export interface TMarketOfferPaymentMethod { + method: string; + rateTradeLimit: number; + rateTradeLimitCurrency: string; + info: string; +} + +const useStyles = createStyles((theme) => ({ + root: {}, +})); diff --git a/packages/renderer/src/components/molecules/MarketOffersSelectPaymentMethods/index.ts b/packages/renderer/src/components/molecules/MarketOffersSelectPaymentMethods/index.ts new file mode 100644 index 0000000..0ca6773 --- /dev/null +++ b/packages/renderer/src/components/molecules/MarketOffersSelectPaymentMethods/index.ts @@ -0,0 +1 @@ +export * from "./MarketOffersSelectPaymentMethods"; diff --git a/packages/renderer/src/components/molecules/MarketOffersTradingPairTable/MarketOffersTradingPairTable.stories.tsx b/packages/renderer/src/components/molecules/MarketOffersTradingPairTable/MarketOffersTradingPairTable.stories.tsx new file mode 100644 index 0000000..676d659 --- /dev/null +++ b/packages/renderer/src/components/molecules/MarketOffersTradingPairTable/MarketOffersTradingPairTable.stories.tsx @@ -0,0 +1,45 @@ +// ============================================================================= +// Copyright 2022 Haveno +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ============================================================================= + +import type { ComponentStory, ComponentMeta } from "@storybook/react"; +import { + MarketOffersTradingPairTable, + TMarketOffersTradingPair, +} from "./MarketOffersTradingPairTable"; + +export default { + title: "molecules/MarketOffersTradingPairTable", + component: MarketOffersTradingPairTable, +} as ComponentMeta; + +const Template: ComponentStory = () => { + return ; +}; + +export const Default = Template.bind({}); + +Default.args = {}; + +const data = [ + { + fromPair: "EUR", + toPair: "XMR", + lastPrice: 101.122, + lastPriceCurrency: "EUR", + dayChangeRate: 12.12, + dayChangeVolume: 1222.123, + }, +] as TMarketOffersTradingPair; diff --git a/packages/renderer/src/components/molecules/MarketOffersTradingPairTable/MarketOffersTradingPairTable.tsx b/packages/renderer/src/components/molecules/MarketOffersTradingPairTable/MarketOffersTradingPairTable.tsx new file mode 100644 index 0000000..3a41e8c --- /dev/null +++ b/packages/renderer/src/components/molecules/MarketOffersTradingPairTable/MarketOffersTradingPairTable.tsx @@ -0,0 +1,61 @@ +import { createTable } from "@tanstack/react-table"; +import { createStyles } from "@mantine/core"; +import { Table } from "@molecules/Table"; + +const table = createTable().setRowType(); + +interface MarketOffersTradingPairTableProps { + data: TMarketOffersTradingPair[]; +} + +export function MarketOffersTradingPairTable({ + data, +}: MarketOffersTradingPairTableProps) { + const { classes } = useStyles(); + + return ( +
+ ); +} + +const columns = [ + table.createDataColumn("fromPair", { + id: "pair", + header: "Pair", + }), + table.createDataColumn("lastPrice", { + id: "lastPrice", + header: "Last Price", + size: 400, + }), + table.createDataColumn("dayChangeRate", { + id: "lastPrice", + header: "24th Change", + size: 400, + }), + table.createDataColumn("dayChangeVolume", { + id: "lastPrice", + header: "24h Vol", + size: 400, + }), +]; + +export interface TMarketOffersTradingPair { + fromPair: string; + toPair: string; + lastPrice: number; + lastPriceCurrency: number; + dayChangeRate: number; + dayChangeVolume: number; +} + +const useStyles = createStyles((theme) => ({ + root: {}, +})); diff --git a/packages/renderer/src/components/organisms/MarketOffersFilterAmountForm/MarketOffersFilterAmountForm.stories.tsx b/packages/renderer/src/components/organisms/MarketOffersFilterAmountForm/MarketOffersFilterAmountForm.stories.tsx new file mode 100644 index 0000000..5bde3d3 --- /dev/null +++ b/packages/renderer/src/components/organisms/MarketOffersFilterAmountForm/MarketOffersFilterAmountForm.stories.tsx @@ -0,0 +1,30 @@ +// ============================================================================= +// Copyright 2022 Haveno +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ============================================================================= + +import type { ComponentStory, ComponentMeta } from "@storybook/react"; +import { MarketOffersFilterAmountForm } from "./MarketOffersFilterAmountForm"; + +export default { + title: "organisms/MarketOffersFilterAmountForm", + component: MarketOffersFilterAmountForm, +} as ComponentMeta; + +const Template: ComponentStory = () => { + return ; +}; + +export const Default = Template.bind({}); +Default.args = {}; diff --git a/packages/renderer/src/components/organisms/MarketOffersFilterAmountForm/MarketOffersFilterAmountForm.tsx b/packages/renderer/src/components/organisms/MarketOffersFilterAmountForm/MarketOffersFilterAmountForm.tsx new file mode 100644 index 0000000..9f23b5f --- /dev/null +++ b/packages/renderer/src/components/organisms/MarketOffersFilterAmountForm/MarketOffersFilterAmountForm.tsx @@ -0,0 +1,87 @@ +import { TextInput } from "@atoms/TextInput"; +import { Box, Grid, Text } from "@mantine/core"; +import { useForm } from "@mantine/hooks"; + +export function MarketOffersFilterAmountForm() { + const form = useForm({ + initialValues: { + minAmountFrom: null, + minAmountTo: null, + maxAmountFrom: null, + maxAmountTo: null, + }, + }); + + return ( +
+ console.log(values) + )} + > + + + Minimum amount + Set the minimum amount you want to buy. + + + + + EUR + + } + mb="lg" + /> + + XMR + + } + /> + + + + + + Maximum amount + Set the maximum amount you want to buy. + + + + + XMR + + } + mb="lg" + /> + + EUR + + } + /> + + + + ); +} + +interface MarketOffersFilterAmountFormValues { + maxAmountTo: string; + maxAmountFrom: string; + minAmountTo: string; + minAmountFrom: string; +} diff --git a/packages/renderer/src/components/organisms/MarketOffersFilterAmountForm/index.ts b/packages/renderer/src/components/organisms/MarketOffersFilterAmountForm/index.ts new file mode 100644 index 0000000..e69de29 diff --git a/packages/renderer/src/components/organisms/MarketOffersFilterBar/MarketOffersFilterBar.stories.tsx b/packages/renderer/src/components/organisms/MarketOffersFilterBar/MarketOffersFilterBar.stories.tsx new file mode 100644 index 0000000..492234e --- /dev/null +++ b/packages/renderer/src/components/organisms/MarketOffersFilterBar/MarketOffersFilterBar.stories.tsx @@ -0,0 +1,30 @@ +// ============================================================================= +// Copyright 2022 Haveno +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ============================================================================= + +import type { ComponentStory, ComponentMeta } from "@storybook/react"; +import { MarketOffersFilterBar } from "."; + +export default { + title: "organisms/MarketOffersFilterBar", + component: MarketOffersFilterBar, +} as ComponentMeta; + +const Template: ComponentStory = () => { + return ; +}; + +export const Default = Template.bind({}); +Default.args = {}; diff --git a/packages/renderer/src/components/organisms/MarketOffersFilterBar/MarketOffersFilterBar.test.tsx b/packages/renderer/src/components/organisms/MarketOffersFilterBar/MarketOffersFilterBar.test.tsx new file mode 100644 index 0000000..e69de29 diff --git a/packages/renderer/src/components/organisms/MarketOffersFilterBar/MarketOffersFilterBar.tsx b/packages/renderer/src/components/organisms/MarketOffersFilterBar/MarketOffersFilterBar.tsx new file mode 100644 index 0000000..7707b01 --- /dev/null +++ b/packages/renderer/src/components/organisms/MarketOffersFilterBar/MarketOffersFilterBar.tsx @@ -0,0 +1,123 @@ +import { LangKeys } from "@constants/lang"; +import { Divider, Group, Button, createStyles } from "@mantine/core"; +import { useModals } from "@mantine/modals"; +import { MarketOffersTradingPair } from "@organisms/MarketOffersTradingPair"; +import { FormattedMessage } from "react-intl"; + +export function MarketOffersFilterBar() { + const { classes } = useStyles(); + const modals = useModals(); + + const handlePairsBtnClick = () => { + modals.openConfirmModal({ + title: "Select trading pair", + children: , + size: 570, + }); + }; + + return ( + + + + + + + + + + + + + + + + + + + + + ); +} + +const useStyles = createStyles((theme) => ({ + root: { + minHeight: 84, + padding: 15, + borderBottom: `1px solid ${theme.colors.gray[3]}`, + }, + button: { + borderColor: "#E8E7EC", + }, + buttonLabel: { + color: "#111", + }, + buttonBold: { + borderWidth: 2, + borderColor: "#111", + }, + divider: { + marginTop: "auto", + marginBottom: "auto", + height: 28, + }, +})); diff --git a/packages/renderer/src/components/organisms/MarketOffersFilterBar/index.ts b/packages/renderer/src/components/organisms/MarketOffersFilterBar/index.ts new file mode 100644 index 0000000..13a025f --- /dev/null +++ b/packages/renderer/src/components/organisms/MarketOffersFilterBar/index.ts @@ -0,0 +1 @@ +export * from "./MarketoffersFilterBar"; diff --git a/packages/renderer/src/components/organisms/MarketOffersTradingPair/MarketOffersTradingPair.tsx b/packages/renderer/src/components/organisms/MarketOffersTradingPair/MarketOffersTradingPair.tsx new file mode 100644 index 0000000..ccdf5b1 --- /dev/null +++ b/packages/renderer/src/components/organisms/MarketOffersTradingPair/MarketOffersTradingPair.tsx @@ -0,0 +1,17 @@ +import { FC } from "react"; + +export function MarketOffersTradingPair() { + return ( + + + + ); +} + +const MarketOffersTradingPairLoaded: FC = ({ children }) => { + return <>{children}; +}; + +const MarketOffersTradingPairBoot: FC = ({ children }) => { + return <>{children}; +}; diff --git a/packages/renderer/src/components/organisms/MarketOffersTradingPair/index.ts b/packages/renderer/src/components/organisms/MarketOffersTradingPair/index.ts new file mode 100644 index 0000000..8d766ee --- /dev/null +++ b/packages/renderer/src/components/organisms/MarketOffersTradingPair/index.ts @@ -0,0 +1 @@ +export * from "./MarketOffersTradingPair"; diff --git a/packages/renderer/src/constants/lang/LangKeys.ts b/packages/renderer/src/constants/lang/LangKeys.ts index 1c49a78..ea59b5e 100644 --- a/packages/renderer/src/constants/lang/LangKeys.ts +++ b/packages/renderer/src/constants/lang/LangKeys.ts @@ -99,4 +99,10 @@ export enum LangKeys { AccountBackupRestoreBtn = "account.backup.restore.btn", AccountBackupDownloadSuccessNotif = "account.backup.download.successNotification", AccountBackupRestoreSuccessNotif = "account.backup.restore.successNotification", + MarketOffersAmount = "marketOffers.filter.amount", + MarketOffersPaymentMethod = "marketOffers.filter.amount", + MarketOffersAccountDetails = "marketOffers.filter.accountDetails", + MarketOffersShowMarketDepth = "marketOffers.filter.showMarketDepth", + MarketOffersHideMarketDepth = "marketOffers.filter.hideMarketDepth", + MarketOffersCreateOffer = "marketOffers.filter.createOffer", } diff --git a/packages/renderer/src/constants/lang/en.ts b/packages/renderer/src/constants/lang/en.ts index 433afcd..f680907 100644 --- a/packages/renderer/src/constants/lang/en.ts +++ b/packages/renderer/src/constants/lang/en.ts @@ -116,6 +116,13 @@ const LangPackEN: { [key in LangKeys]: string } = { "The backup has been downloaded successfully.", [LangKeys.AccountBackupRestoreSuccessNotif]: "The backup has been restored successfully.", -}; + + [LangKeys.MarketOffersAmount]: 'Amount', + [LangKeys.MarketOffersPaymentMethod]: 'Payment method', + [LangKeys.MarketOffersAccountDetails]: 'Account details', + [LangKeys.MarketOffersShowMarketDepth]: 'Show market depth', + [LangKeys.MarketOffersHideMarketDepth]: 'Hide market depth', + [LangKeys.MarketOffersCreateOffer]: 'Create offer', + }; export default LangPackEN; diff --git a/packages/renderer/src/constants/query-keys.ts b/packages/renderer/src/constants/query-keys.ts index 668f43f..8966689 100644 --- a/packages/renderer/src/constants/query-keys.ts +++ b/packages/renderer/src/constants/query-keys.ts @@ -29,6 +29,7 @@ export enum QueryKeys { XmrSeed = "Haveno.XmrSeed", XmrPrimaryAddress = "Haveno.XmrPrimaryAddress", XmrTxs = "Haveno.XmrTransactions", + PaymentMethods = "Haveno.PaymentMethods", // Storage StorageAccountInfo = "Storage.AccountInfo", diff --git a/packages/renderer/src/hooks/haveno/usePaymentMethods.ts b/packages/renderer/src/hooks/haveno/usePaymentMethods.ts new file mode 100644 index 0000000..5a5ba96 --- /dev/null +++ b/packages/renderer/src/hooks/haveno/usePaymentMethods.ts @@ -0,0 +1,32 @@ +// ============================================================================= +// Copyright 2022 Haveno +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ============================================================================= + +import { useQuery } from "react-query"; +import type { PaymentMethod } from "haveno-ts"; +import { useHavenoClient } from "./useHavenoClient"; +import { QueryKeys } from "@constants/query-keys"; + +interface PaymentMethodsQuery { + assetCode: string; +} + +export function usePaymentMethods(query: PaymentMethodsQuery) { + const client = useHavenoClient(); + + return useQuery, Error>(QueryKeys.PaymentAccounts, () => + client.getPaymentMethods(query.assetCode) + ); +}