From 88e9723d4120698bae748c28fef4e10cfbb35ce1 Mon Sep 17 00:00:00 2001 From: paul launay Date: Fri, 28 Jun 2024 15:41:32 +0200 Subject: [PATCH 1/5] feat: integrate new token actions flow --- .../[token_id]/components/create-listing.tsx | 262 ++++++++-------- .../[token_id]/components/create-offer.tsx | 2 +- apps/arkmarket/src/app/layout.tsx | 2 +- .../token-actions-accept-best-offer.tsx | 82 +++++ .../components/token-actions-buttons.tsx | 92 ++++++ .../token-actions-cancel-listing.tsx | 55 ++++ .../token-actions-create-listing.tsx | 283 ++++++++++++++++++ .../components/token-actions-empty.tsx | 35 +++ .../components/token-actions-header.tsx | 39 +++ .../token-actions-listing-badge.tsx | 26 ++ .../components/token-actions-make-bid.tsx | 160 ++++++++++ .../components/token-actions-make-offer.tsx | 221 ++++++++++++++ .../components/token-actions-price.tsx | 59 ++++ .../token-actions-token-overview.tsx | 38 +++ .../[tokenId]/components/token-actions.tsx | 135 ++++----- .../[tokenId]/components/token-summary.tsx | 2 +- .../components/tokens-actions-buy-now.tsx | 120 ++++++++ .../[contractAddress]/[tokenId]/page.tsx | 24 +- apps/arkmarket/src/components/providers.tsx | 2 +- packages/ui/src/form.tsx | 6 +- packages/ui/src/input.tsx | 2 +- packages/ui/src/select.tsx | 2 +- 22 files changed, 1447 insertions(+), 202 deletions(-) create mode 100644 apps/arkmarket/src/app/token/[contractAddress]/[tokenId]/components/token-actions-accept-best-offer.tsx create mode 100644 apps/arkmarket/src/app/token/[contractAddress]/[tokenId]/components/token-actions-buttons.tsx create mode 100644 apps/arkmarket/src/app/token/[contractAddress]/[tokenId]/components/token-actions-cancel-listing.tsx create mode 100644 apps/arkmarket/src/app/token/[contractAddress]/[tokenId]/components/token-actions-create-listing.tsx create mode 100644 apps/arkmarket/src/app/token/[contractAddress]/[tokenId]/components/token-actions-empty.tsx create mode 100644 apps/arkmarket/src/app/token/[contractAddress]/[tokenId]/components/token-actions-header.tsx create mode 100644 apps/arkmarket/src/app/token/[contractAddress]/[tokenId]/components/token-actions-listing-badge.tsx create mode 100644 apps/arkmarket/src/app/token/[contractAddress]/[tokenId]/components/token-actions-make-bid.tsx create mode 100644 apps/arkmarket/src/app/token/[contractAddress]/[tokenId]/components/token-actions-make-offer.tsx create mode 100644 apps/arkmarket/src/app/token/[contractAddress]/[tokenId]/components/token-actions-price.tsx create mode 100644 apps/arkmarket/src/app/token/[contractAddress]/[tokenId]/components/token-actions-token-overview.tsx create mode 100644 apps/arkmarket/src/app/token/[contractAddress]/[tokenId]/components/tokens-actions-buy-now.tsx diff --git a/apps/arkmarket/src/app/assets/[contract_address]/[token_id]/components/create-listing.tsx b/apps/arkmarket/src/app/assets/[contract_address]/[token_id]/components/create-listing.tsx index ddd590ee..a1654c99 100644 --- a/apps/arkmarket/src/app/assets/[contract_address]/[token_id]/components/create-listing.tsx +++ b/apps/arkmarket/src/app/assets/[contract_address]/[token_id]/components/create-listing.tsx @@ -1,14 +1,23 @@ "use client"; +import { useState } from "react"; import { useCreateAuction, useCreateListing } from "@ark-project/react"; import { zodResolver } from "@hookform/resolvers/zod"; import { useAccount } from "@starknet-react/core"; +import { ShoppingBag } from "lucide-react"; import moment from "moment"; import { useForm } from "react-hook-form"; import { parseEther } from "viem"; import * as z from "zod"; import { Button } from "@ark-market/ui/button"; +import { + Dialog, + DialogContent, + DialogHeader, + DialogTitle, + DialogTrigger, +} from "@ark-market/ui/dialog"; import { Form, FormControl, @@ -29,9 +38,10 @@ import { import type { Token, TokenMarketData } from "~/types"; import { env } from "~/env"; +import TokenMedia from "./token-media"; interface CreateListingProps { - token?: Token; + token: Token; tokenMarketData?: TokenMarketData; } @@ -50,17 +60,10 @@ const formSchema = z.object({ duration: z.string(), type: z.enum([FIXED, AUCTION]), }); -// .refine( -// (data) => -// data.type === AUCTION ? data.endAmount > data.startAmount : true, -// { -// message: "Reserve price must be greater than starting price", -// path: ["endAmount"] -// } -// ); const CreateListing: React.FC = ({ token }) => { const { account } = useAccount(); + const [isOpen, setIsOpen] = useState(false); const { createListing, status } = useCreateListing(); const { create: createAuction, status: auctionStatus } = useCreateAuction(); @@ -75,15 +78,9 @@ const CreateListing: React.FC = ({ token }) => { }); async function onSubmit(values: z.infer) { - if (account === undefined || !token?.contract_address || !token.token_id) { - console.error("Account, token address, or token ID is missing"); - return; - } - - const tokenId = parseInt(token.token_id, 10); - - if (isNaN(tokenId)) { - console.error("Invalid tokenId"); + if (!account) { + // TODO: Handle error with toast + console.error("Account is missing"); return; } @@ -123,124 +120,147 @@ const CreateListing: React.FC = ({ token }) => { } const isAuction = form.getValues("type") === AUCTION; - const duration = form.watch("duration"); - const expiredAt = moment().add(duration, "hours").format("LLLL"); + // const duration = form.watch("duration"); + // const expiredAt = moment().add(duration, "hours").format("LLLL"); const isLoading = status === "loading" || auctionStatus === "loading"; return ( -
-
List for sale
-
- - ( - - Choose a type of sale - - - - - Fixed price - - The item is listed at the price you set. - - - - - - - - - - Sell to highest bidder - - - The item is listed for auction. - - - - - - - - - - - )} - /> - ( - - Starting Price - - - - - - )} - /> - {isAuction && ( + + + + + + + List for sale + +
+
+ +
+
+
Duo #{token.token_id}
+
Everai
+
+
+
+ + ( - - Reserve Price + + Choose a type of sale - + + + + Fixed price + + The item is listed at the price you set. + + + + + + + + + + Sell to highest bidder + + + The item is listed for auction. + + + + + + + )} /> - )} - ( - -
- Duration -
Expires {expiredAt}
-
- - - 1 hour - 3 hours - 6 hours - 1 day - 3 days - - - -
+ +
+ )} + /> + {isAuction && ( + ( + + Set reserve price + + + + + + )} + /> )} - /> - - - -
+ ( + +
+ Set expiration + {/*
Expires {expiredAt}
*/} +
+ + +
+ )} + /> + + + +
+
); }; diff --git a/apps/arkmarket/src/app/assets/[contract_address]/[token_id]/components/create-offer.tsx b/apps/arkmarket/src/app/assets/[contract_address]/[token_id]/components/create-offer.tsx index af6b3438..897ffad3 100644 --- a/apps/arkmarket/src/app/assets/[contract_address]/[token_id]/components/create-offer.tsx +++ b/apps/arkmarket/src/app/assets/[contract_address]/[token_id]/components/create-offer.tsx @@ -33,7 +33,7 @@ import TokenMedia from "./token-media"; interface CreateOfferProps { token: Token; - tokenMarketData: TokenMarketData | undefined; + tokenMarketData?: TokenMarketData; } export default function CreateOffer({ diff --git a/apps/arkmarket/src/app/layout.tsx b/apps/arkmarket/src/app/layout.tsx index a95dd5c0..3fbad26c 100644 --- a/apps/arkmarket/src/app/layout.tsx +++ b/apps/arkmarket/src/app/layout.tsx @@ -70,7 +70,7 @@ export default function RootLayout({ children }: PropsWithChildren) { {children}
- +