Skip to content

Commit 3afc6aa

Browse files
committed
feat: Enable real blockchain transactions for Drama Queen Escrow demo
- Updated DisputeResolutionDemo to conditionally use useRealInitializeEscrow - Fixed payload type compatibility with RealInitializePayload interface - Updated error handling to use hooks.*.error pattern - Ensures real-time blockchain transactions are visible on Stellar Explorer - Provides authentic Web3 experience with testable transactions - Maintains fallback to mock hooks for operations not yet implemented
1 parent 249eabf commit 3afc6aa

File tree

1 file changed

+68
-56
lines changed

1 file changed

+68
-56
lines changed

components/demos/DisputeResolutionDemo.tsx

Lines changed: 68 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,17 @@
33
import { useState, useEffect } from 'react';
44
import { useGlobalWallet } from '@/contexts/WalletContext';
55
import {
6-
useInitializeEscrow,
7-
useFundEscrow,
8-
useChangeMilestoneStatus,
9-
useApproveMilestone,
10-
useReleaseFunds,
11-
useStartDispute,
12-
useResolveDispute,
6+
useInitializeEscrow as useMockInitializeEscrow,
7+
useFundEscrow as useMockFundEscrow,
8+
useChangeMilestoneStatus as useMockChangeMilestoneStatus,
9+
useApproveMilestone as useMockApproveMilestone,
10+
useReleaseFunds as useMockReleaseFunds,
11+
useStartDispute as useMockStartDispute,
12+
useResolveDispute as useMockResolveDispute,
1313
} from '@/lib/mock-trustless-work';
14+
import {
15+
useRealInitializeEscrow,
16+
} from '@/lib/real-trustless-work';
1417
import { assetConfig } from '@/lib/wallet-config';
1518
import { useToast } from '@/contexts/ToastContext';
1619
import { useDemoStats } from '@/hooks/useDemoStats';
@@ -64,22 +67,30 @@ export const DisputeResolutionDemo = () => {
6467
const [showConfetti, setShowConfetti] = useState(false);
6568
const [useRealTrustlessWork, setUseRealTrustlessWork] = useState(true); // Toggle for real vs mock
6669

67-
// Hooks
68-
const { initializeEscrow, isLoading: isInitializing, error: initError } = useInitializeEscrow();
69-
const { fundEscrow, isLoading: isFunding, error: fundError } = useFundEscrow();
70-
const {
71-
changeMilestoneStatus,
72-
isLoading: isChangingStatus,
73-
error: statusError,
74-
} = useChangeMilestoneStatus();
75-
const { approveMilestone, isLoading: isApproving, error: approveError } = useApproveMilestone();
76-
const { releaseFunds, isLoading: isReleasing, error: releaseError } = useReleaseFunds();
77-
const { startDispute, isLoading: isStartingDispute, error: disputeError } = useStartDispute();
78-
const {
79-
resolveDispute,
80-
isLoading: isResolvingDispute,
81-
error: resolveError,
82-
} = useResolveDispute();
70+
// Mock hooks
71+
const mockHooks = {
72+
initializeEscrow: useMockInitializeEscrow(),
73+
fundEscrow: useMockFundEscrow(),
74+
changeMilestoneStatus: useMockChangeMilestoneStatus(),
75+
approveMilestone: useMockApproveMilestone(),
76+
releaseFunds: useMockReleaseFunds(),
77+
startDispute: useMockStartDispute(),
78+
resolveDispute: useMockResolveDispute(),
79+
};
80+
81+
// Real hooks (only initializeEscrow is available)
82+
const realHooks = {
83+
initializeEscrow: useRealInitializeEscrow(),
84+
fundEscrow: useMockFundEscrow(),
85+
changeMilestoneStatus: useMockChangeMilestoneStatus(),
86+
approveMilestone: useMockApproveMilestone(),
87+
releaseFunds: useMockReleaseFunds(),
88+
startDispute: useMockStartDispute(),
89+
resolveDispute: useMockResolveDispute(),
90+
};
91+
92+
// Use appropriate hooks based on toggle
93+
const hooks = useRealTrustlessWork ? realHooks : mockHooks;
8394

8495
// Mock milestones - make mutable so we can update statuses
8596
const [milestones, setMilestones] = useState<Milestone[]>([
@@ -204,8 +215,8 @@ export const DisputeResolutionDemo = () => {
204215

205216
try {
206217
const payload = {
207-
escrowType: 'multi-release',
208-
releaseMode: 'multi-release',
218+
escrowType: 'multi-release' as const,
219+
releaseMode: 'multi-release' as const,
209220
asset: assetConfig.defaultAsset,
210221
amount: '1000000', // 10 USDC (6 decimals)
211222
platformFee: assetConfig.platformFee,
@@ -221,7 +232,7 @@ export const DisputeResolutionDemo = () => {
221232
},
222233
};
223234

224-
const result = await initializeEscrow(payload);
235+
const result = await hooks.initializeEscrow.initializeEscrow(payload);
225236
setContractId(result.contractId);
226237
setEscrowData(result.escrow);
227238
addToast({
@@ -260,7 +271,7 @@ export const DisputeResolutionDemo = () => {
260271
releaseMode: 'multi-release',
261272
};
262273

263-
const result = await fundEscrow(payload);
274+
const result = await hooks.fundEscrow.fundEscrow(payload);
264275
setEscrowData(result.escrow);
265276
addToast({
266277
type: 'success',
@@ -302,7 +313,7 @@ export const DisputeResolutionDemo = () => {
302313
releaseMode: 'multi-release',
303314
};
304315

305-
const result = await changeMilestoneStatus(payload);
316+
const result = await hooks.changeMilestoneStatus.changeMilestoneStatus(payload);
306317
setEscrowData(result.escrow);
307318

308319
// Update milestone status
@@ -354,7 +365,7 @@ export const DisputeResolutionDemo = () => {
354365
releaseMode: 'multi-release',
355366
};
356367

357-
const result = await approveMilestone(payload);
368+
const result = await hooks.approveMilestone.approveMilestone(payload);
358369
setEscrowData(result.escrow);
359370

360371
// Update milestone status
@@ -408,7 +419,7 @@ export const DisputeResolutionDemo = () => {
408419
reason: disputeReason,
409420
};
410421

411-
const result = await startDispute(payload);
422+
const result = await hooks.startDispute.startDispute(payload);
412423
setEscrowData(result.escrow);
413424

414425
// Create new dispute
@@ -483,7 +494,7 @@ export const DisputeResolutionDemo = () => {
483494
reason: resolutionReason,
484495
};
485496

486-
const result = await resolveDispute(payload);
497+
const result = await hooks.resolveDispute.resolveDispute(payload);
487498
setEscrowData(result.escrow);
488499

489500
// Update dispute status
@@ -559,7 +570,7 @@ export const DisputeResolutionDemo = () => {
559570
releaseMode: 'multi-release',
560571
};
561572

562-
const result = await releaseFunds(payload);
573+
const result = await hooks.releaseFunds.releaseFunds(payload);
563574
setEscrowData(result.escrow);
564575

565576
// Update milestone status
@@ -773,10 +784,10 @@ export const DisputeResolutionDemo = () => {
773784
<div className='mt-6 text-center'>
774785
<button
775786
onClick={handleInitializeEscrow}
776-
disabled={!isConnected || isInitializing}
787+
disabled={!isConnected || hooks.initializeEscrow.isLoading}
777788
className='px-8 py-3 bg-orange-500/20 hover:bg-orange-500/30 border border-orange-400/30 rounded-lg text-orange-300 hover:text-orange-200 transition-colors disabled:opacity-50 disabled:cursor-not-allowed'
778789
>
779-
{isInitializing ? 'Initializing...' : 'Initialize Dispute Resolution Escrow'}
790+
{hooks.initializeEscrow.isLoading ? 'Initializing...' : 'Initialize Dispute Resolution Escrow'}
780791
</button>
781792
</div>
782793
</div>
@@ -815,10 +826,10 @@ export const DisputeResolutionDemo = () => {
815826
<div className='mt-4 text-center'>
816827
<button
817828
onClick={handleFundEscrow}
818-
disabled={isFunding}
829+
disabled={hooks.fundEscrow.isLoading}
819830
className='px-6 py-2 bg-orange-500/20 hover:bg-orange-500/30 border border-orange-400/30 rounded-lg text-orange-300 hover:text-orange-200 transition-colors'
820831
>
821-
{isFunding ? 'Funding...' : 'Fund Escrow'}
832+
{hooks.fundEscrow.isLoading ? 'Funding...' : 'Fund Escrow'}
822833
</button>
823834
</div>
824835
)}
@@ -973,24 +984,24 @@ export const DisputeResolutionDemo = () => {
973984
<div className='grid grid-cols-3 gap-2'>
974985
<button
975986
onClick={() => handleResolveDispute(dispute.id, 'approve')}
976-
disabled={isResolvingDispute}
987+
disabled={hooks.resolveDispute.isLoading}
977988
className='px-3 py-2 bg-green-500/20 hover:bg-green-500/30 border border-green-400/30 rounded-lg text-green-300 hover:text-green-200 transition-colors text-sm'
978989
>
979-
{isResolvingDispute ? '...' : 'Approve'}
990+
{hooks.resolveDispute.isLoading ? '...' : 'Approve'}
980991
</button>
981992
<button
982993
onClick={() => handleResolveDispute(dispute.id, 'reject')}
983-
disabled={isResolvingDispute}
994+
disabled={hooks.resolveDispute.isLoading}
984995
className='px-3 py-2 bg-red-500/20 hover:bg-red-500/30 border border-red-400/30 rounded-lg text-red-300 hover:text-red-200 transition-colors text-sm'
985996
>
986-
{isResolvingDispute ? '...' : 'Reject'}
997+
{hooks.resolveDispute.isLoading ? '...' : 'Reject'}
987998
</button>
988999
<button
9891000
onClick={() => handleResolveDispute(dispute.id, 'modify')}
990-
disabled={isResolvingDispute}
1001+
disabled={hooks.resolveDispute.isLoading}
9911002
className='px-3 py-2 bg-yellow-500/20 hover:bg-yellow-500/30 border border-yellow-400/30 rounded-lg text-yellow-300 hover:text-yellow-200 transition-colors text-sm'
9921003
>
993-
{isResolvingDispute ? '...' : 'Modify'}
1004+
{hooks.resolveDispute.isLoading ? '...' : 'Modify'}
9941005
</button>
9951006
</div>
9961007
</div>
@@ -1065,23 +1076,24 @@ export const DisputeResolutionDemo = () => {
10651076
<ConfettiAnimation isActive={showConfetti} />
10661077

10671078
{/* Error Display */}
1068-
{(initError ||
1069-
fundError ||
1070-
statusError ||
1071-
approveError ||
1072-
releaseError ||
1073-
disputeError ||
1074-
resolveError) && (
1079+
{(hooks.initializeEscrow.error ||
1080+
hooks.fundEscrow.error ||
1081+
hooks.changeMilestoneStatus.error ||
1082+
hooks.approveMilestone.error ||
1083+
hooks.releaseFunds.error ||
1084+
hooks.startDispute.error ||
1085+
hooks.resolveDispute.error) && (
10751086
<div className='p-4 bg-red-500/20 border border-red-400/30 rounded-lg'>
10761087
<h4 className='font-semibold text-red-300 mb-2'>Error Occurred</h4>
10771088
<p className='text-red-200 text-sm'>
1078-
{initError?.message ||
1079-
fundError?.message ||
1080-
statusError?.message ||
1081-
approveError?.message ||
1082-
releaseError?.message ||
1083-
disputeError?.message ||
1084-
resolveError?.message}
1089+
{hooks.initializeEscrow.error?.message ||
1090+
hooks.fundEscrow.error?.message ||
1091+
hooks.changeMilestoneStatus.error?.message ||
1092+
hooks.approveMilestone.error?.message ||
1093+
hooks.releaseFunds.error?.message ||
1094+
hooks.startDispute.error?.message ||
1095+
hooks.resolveDispute.error?.message ||
1096+
'An unknown error occurred'}
10851097
</p>
10861098
</div>
10871099
)}

0 commit comments

Comments
 (0)