11import { useCallback } from "react" ;
22import { useAccount , useConnect } from "@starknet-react/core" ;
3+ import { getContractByName } from "@dojoengine/core" ;
34import { DEFAULT_PRESET , DEFAULT_PROJECT } from "@/constants" ;
4- import { addAddressPadding } from "starknet" ;
5+ import { addAddressPadding , type Call , CallData } from "starknet" ;
56import { useAnalytics } from "@/hooks/useAnalytics" ;
67import type ControllerConnector from "@cartridge/connector/controller" ;
78import { useConnectionViewModel } from "@/features/connection" ;
89import { useTokenContracts } from "@/effect/hooks/tokens" ;
910import { CollectionType } from "@/effect/atoms/tokens" ;
1011import type { OrderModel } from "@cartridge/arcade" ;
11- import { useUsername } from "@/hooks/username" ;
12+ import { useControllerUsername } from "@/hooks/controller" ;
13+ import { useArcade } from "./arcade" ;
1214
1315export type ActionHandlerParams = {
1416 project ?: string ;
@@ -21,8 +23,6 @@ export function useHandlePurchaseCallback(
2123 collectionAddress : string ,
2224 tokenIds : string [ ] ,
2325 orders : OrderModel [ ] ,
24- preset ?: string ,
25- project ?: string ,
2626) => Promise < void > {
2727 const { address } = useAccount ( ) ;
2828 const { trackEvent, events } = useAnalytics ( ) ;
@@ -138,22 +138,47 @@ export function useHandleListViewCallback(
138138 ) ;
139139}
140140
141- export function useHandleUnlistCallback (
142- presetParams ?: ActionHandlerParams ,
143- ) : ( collectionAddress : string , tokenIds : string [ ] ) => Promise < void > {
144- const pathBuilder = useControllerPathBuilder ( presetParams ) ;
145- const openController = useOpenControllerAtPathCallback ( ) ;
141+ export function useHandleUnlistCallback ( ) : (
142+ collectionAddress : string ,
143+ tokenIds : string [ ] ,
144+ orders : OrderModel [ ] ,
145+ ) => Promise < void > {
146+ const { provider } = useArcade ( ) ;
147+ const openController = useOpenControllerExecuteCallback ( ) ;
146148 return useCallback (
147- async ( collectionAddress : string , tokenIds : string [ ] ) => {
148- const path = pathBuilder ( {
149- // viewType: "unlist", // TODO: /unlist is not implemented in the controller
150- viewType : "unlistView" ,
151- collectionAddress,
152- tokenIds,
153- } ) ;
154- return openController ( path ) ;
149+ async (
150+ collectionAddress : string ,
151+ tokenIds : string [ ] ,
152+ orders : OrderModel [ ] ,
153+ ) => {
154+ // TODO: /unlist is not implemented in the controller
155+ // const path = pathBuilder({
156+ // viewType: "unlist",
157+ // collectionAddress,
158+ // tokenIds,
159+ // });
160+
161+ // call the execute endpoint directly
162+ const contract = getContractByName (
163+ provider . manifest ,
164+ "ARCADE" ,
165+ "Marketplace" ,
166+ ) ;
167+ const contractAddress = contract ?. address ?? "0x0" ;
168+ const callData = new CallData ( provider . manifest . abis ) ;
169+ const calls : Call [ ] = orders . map ( ( order , index ) => ( {
170+ entrypoint : "cancel" ,
171+ contractAddress,
172+ calldata : callData . compile ( "cancel" , [
173+ order . id ,
174+ collectionAddress ,
175+ `0x${ tokenIds [ index ] } ` ,
176+ ] ) ,
177+ } ) ) ;
178+
179+ return openController ( calls ) ;
155180 } ,
156- [ pathBuilder , openController ] ,
181+ [ openController ] ,
157182 ) ;
158183}
159184
@@ -233,7 +258,7 @@ function useControllerPathBuilder(
233258) : ( params : MakeControllerViewPathParams ) => string | undefined {
234259 const { trackEvent, events } = useAnalytics ( ) ;
235260
236- const username = useUsername ( ) ;
261+ const username = useControllerUsername ( ) ;
237262
238263 const collections = useTokenContracts ( ) ;
239264
@@ -348,3 +373,35 @@ export function useOpenControllerAtPathCallback(): (
348373
349374 return callback ;
350375}
376+
377+ export function useOpenControllerExecuteCallback ( ) : (
378+ calls : Call [ ] ,
379+ ) => Promise < void > {
380+ const { connector } = useConnect ( ) ;
381+ const { isConnected } = useAccount ( ) ;
382+ const { onConnect, isConnectDisabled } = useConnectionViewModel ( ) ;
383+
384+ const callback = useCallback (
385+ async ( calls : Call [ ] ) => {
386+ if ( ! calls || calls . length === 0 ) return ;
387+
388+ if ( ! isConnected ) {
389+ if ( isConnectDisabled ) {
390+ return ;
391+ }
392+ await onConnect ( ) ;
393+ }
394+
395+ const controller = ( connector as ControllerConnector ) ?. controller ;
396+ if ( ! controller ) {
397+ console . error ( "Connector not initialized" ) ;
398+ return ;
399+ }
400+
401+ controller . openExecute ( calls ) ;
402+ } ,
403+ [ connector , isConnected , isConnectDisabled ] ,
404+ ) ;
405+
406+ return callback ;
407+ }
0 commit comments