diff --git a/app/src/app/order/[pk]/page.tsx b/app/src/app/order/[pk]/page.tsx index e9d917b..8746c92 100644 --- a/app/src/app/order/[pk]/page.tsx +++ b/app/src/app/order/[pk]/page.tsx @@ -1,12 +1,118 @@ 'use client' import { use } from 'react' -import { useWallet } from '@solana/connector/react' +import { useWallet, useKitTransactionSigner } from '@solana/connector/react' import { OrderDetail } from '@/components/OrderDetail' +import { useTx } from '@/hooks/useTx' +import { useOrder } from '@/hooks/useOrder' +import { + getAcceptOrderInstruction, + getRejectOrderInstructionAsync, + getCancelOrderInstructionAsync, + getCloseStaleOrderInstruction, +} from '@solisting/sdk' +import { + getCompleteInstructionAsync, + getDisputeInstruction, + DESCRO_PROGRAM_ADDRESS, + findResolverEntryPda, +} from '@descro/sdk' import type { Address } from '@solisting/sdk' export default function OrderPage({ params }: { params: Promise<{ pk: string }> }) { const { pk } = use(params) const { account } = useWallet() - return + const { signer } = useKitTransactionSigner() + const sendTx = useTx() + const { data } = useOrder(pk as Address) + + const invalidate = [['order', pk], ['listings']] + + async function handleAccept() { + if (!signer || !data) return + const od = data.order.data + const [resolverEntry] = await findResolverEntryPda({ authority: od.resolver }) + const ix = getAcceptOrderInstruction({ + seller: signer, + resolver: od.resolver, + listingAccount: od.listing, + orderAccount: pk as Address, + escrowAccount: od.escrowAccount, + resolverEntry, + descroProgram: DESCRO_PROGRAM_ADDRESS, + }) + await sendTx([ix as never], invalidate, 'accept_order') + } + + async function handleReject() { + if (!signer || !data) return + const od = data.order.data + const ix = await getRejectOrderInstructionAsync({ + seller: signer, + buyer: od.buyer, + listingAccount: od.listing, + orderAccount: pk as Address, + escrowAccount: od.escrowAccount, + descroProgram: DESCRO_PROGRAM_ADDRESS, + }) + await sendTx([ix as never], invalidate, 'reject_order') + } + + async function handleCancel() { + if (!signer || !data) return + const od = data.order.data + const ix = await getCancelOrderInstructionAsync({ + buyer: signer, + listingAccount: od.listing, + orderAccount: pk as Address, + escrowAccount: od.escrowAccount, + descroProgram: DESCRO_PROGRAM_ADDRESS, + }) + await sendTx([ix as never], invalidate, 'cancel_order') + } + + async function handleCloseStale() { + if (!signer || !data) return + const od = data.order.data + const ix = getCloseStaleOrderInstruction({ + caller: signer, + orderAccount: pk as Address, + escrowAccount: od.escrowAccount, + }) + await sendTx([ix as never], invalidate, 'close_stale_order') + } + + async function handleComplete() { + if (!signer || !data) return + const od = data.order.data + const ix = await getCompleteInstructionAsync({ + buyer: signer, + seller: od.seller, + escrowAccount: od.escrowAccount, + }) + await sendTx([ix as never], [['order', pk]], 'complete') + } + + async function handleDispute() { + if (!signer || !data) return + const od = data.order.data + const ix = getDisputeInstruction({ + initiator: signer, + escrowAccount: od.escrowAccount, + }) + await sendTx([ix as never], [['order', pk]], 'dispute') + } + + return ( + + ) }