@trustless-work/blocks 0.0.7 → 0.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/bin/index.js +485 -17
  2. package/package.json +1 -1
  3. package/templates/escrows/details/Actions.tsx +144 -149
  4. package/templates/escrows/details/Entities.tsx +1 -1
  5. package/templates/escrows/details/EntityCard.tsx +1 -3
  6. package/templates/escrows/details/EscrowDetailDialog.tsx +16 -16
  7. package/templates/escrows/details/GeneralInformation.tsx +19 -22
  8. package/templates/escrows/details/MilestoneCard.tsx +46 -47
  9. package/templates/escrows/details/MilestoneDetailDialog.tsx +1 -2
  10. package/templates/escrows/details/Milestones.tsx +0 -5
  11. package/templates/escrows/details/SuccessReleaseDialog.tsx +4 -6
  12. package/templates/escrows/escrows-by-role/cards/EscrowsCards.tsx +84 -49
  13. package/templates/escrows/escrows-by-role/cards/Filters.tsx +3 -5
  14. package/templates/escrows/escrows-by-role/table/EscrowsTable.tsx +8 -26
  15. package/templates/escrows/escrows-by-role/table/Filters.tsx +3 -5
  16. package/templates/escrows/escrows-by-signer/cards/EscrowsCards.tsx +89 -55
  17. package/templates/escrows/escrows-by-signer/cards/Filters.tsx +3 -5
  18. package/templates/escrows/escrows-by-signer/table/EscrowsTable.tsx +8 -24
  19. package/templates/escrows/escrows-by-signer/table/Filters.tsx +3 -5
  20. package/templates/escrows/multi-release/dispute-milestone/button/DisputeEscrow.tsx +98 -0
  21. package/templates/escrows/multi-release/initialize-escrow/dialog/InitializeEscrow.tsx +528 -0
  22. package/templates/escrows/multi-release/initialize-escrow/form/InitializeEscrow.tsx +506 -0
  23. package/templates/escrows/multi-release/initialize-escrow/shared/schema.ts +179 -0
  24. package/templates/escrows/multi-release/initialize-escrow/shared/useInitializeEscrow.ts +175 -0
  25. package/templates/escrows/multi-release/release-milestone/button/ReleaseEscrow.tsx +116 -0
  26. package/templates/escrows/multi-release/resolve-dispute/button/ResolveDispute.tsx +122 -0
  27. package/templates/escrows/multi-release/resolve-dispute/dialog/ResolveDispute.tsx +178 -0
  28. package/templates/escrows/multi-release/resolve-dispute/form/ResolveDispute.tsx +156 -0
  29. package/templates/escrows/multi-release/resolve-dispute/shared/schema.ts +85 -0
  30. package/templates/escrows/multi-release/resolve-dispute/shared/useResolveDispute.ts +105 -0
  31. package/templates/escrows/multi-release/update-escrow/dialog/UpdateEscrow.tsx +471 -0
  32. package/templates/escrows/multi-release/update-escrow/form/UpdateEscrow.tsx +449 -0
  33. package/templates/escrows/multi-release/update-escrow/shared/schema.ts +152 -0
  34. package/templates/escrows/multi-release/update-escrow/shared/useUpdateEscrow.ts +254 -0
  35. package/templates/escrows/{single-release → single-multi-release}/approve-milestone/button/ApproveMilestone.tsx +20 -7
  36. package/templates/escrows/{single-release → single-multi-release}/approve-milestone/dialog/ApproveMilestone.tsx +3 -3
  37. package/templates/escrows/{single-release → single-multi-release}/approve-milestone/form/ApproveMilestone.tsx +3 -3
  38. package/templates/escrows/{single-release/approve-milestone/shared → single-multi-release/approve-milestone}/useApproveMilestone.ts +16 -16
  39. package/templates/escrows/{single-release → single-multi-release}/change-milestone-status/button/ChangeMilestoneStatus.tsx +4 -4
  40. package/templates/escrows/{single-release → single-multi-release}/change-milestone-status/dialog/ChangeMilestoneStatus.tsx +4 -4
  41. package/templates/escrows/{single-release → single-multi-release}/change-milestone-status/form/ChangeMilestoneStatus.tsx +3 -3
  42. package/templates/escrows/{single-release/change-milestone-status/shared → single-multi-release/change-milestone-status}/useChangeMilestoneStatus.ts +1 -1
  43. package/templates/escrows/{single-release → single-multi-release}/fund-escrow/button/FundEscrow.tsx +3 -3
  44. package/templates/escrows/{single-release → single-multi-release}/fund-escrow/dialog/FundEscrow.tsx +3 -3
  45. package/templates/escrows/{single-release → single-multi-release}/fund-escrow/form/FundEscrow.tsx +3 -3
  46. package/templates/escrows/{single-release/fund-escrow/shared → single-multi-release/fund-escrow}/useFundEscrow.ts +1 -1
  47. package/templates/escrows/single-release/dispute-escrow/button/DisputeEscrow.tsx +2 -2
  48. package/templates/escrows/single-release/initialize-escrow/dialog/InitializeEscrow.tsx +14 -6
  49. package/templates/escrows/single-release/initialize-escrow/form/InitializeEscrow.tsx +14 -6
  50. package/templates/escrows/single-release/initialize-escrow/shared/schema.ts +0 -57
  51. package/templates/escrows/single-release/initialize-escrow/shared/useInitializeEscrow.ts +42 -1
  52. package/templates/escrows/single-release/release-escrow/button/ReleaseEscrow.tsx +2 -2
  53. package/templates/escrows/single-release/resolve-dispute/button/ResolveDispute.tsx +3 -3
  54. package/templates/escrows/single-release/resolve-dispute/dialog/ResolveDispute.tsx +3 -6
  55. package/templates/escrows/single-release/resolve-dispute/form/ResolveDispute.tsx +2 -2
  56. package/templates/escrows/single-release/resolve-dispute/shared/useResolveDispute.ts +14 -1
  57. package/templates/escrows/single-release/update-escrow/dialog/UpdateEscrow.tsx +2 -2
  58. package/templates/escrows/single-release/update-escrow/form/UpdateEscrow.tsx +2 -2
  59. package/templates/escrows/single-release/update-escrow/shared/useUpdateEscrow.ts +12 -7
  60. package/templates/providers/EscrowDialogsProvider.tsx +1 -3
  61. package/templates/providers/EscrowProvider.tsx +27 -4
  62. package/templates/providers/TrustlessWork.tsx +1 -1
  63. package/templates/escrows/details/ProgressEscrow.tsx +0 -191
  64. /package/templates/escrows/{single-release/approve-milestone/shared → single-multi-release/approve-milestone}/schema.ts +0 -0
  65. /package/templates/escrows/{single-release/change-milestone-status/shared → single-multi-release/change-milestone-status}/schema.ts +0 -0
  66. /package/templates/escrows/{single-release/fund-escrow/shared → single-multi-release/fund-escrow}/schema.ts +0 -0
@@ -11,20 +11,14 @@ import {
11
11
  CheckCheck,
12
12
  Layers,
13
13
  } from "lucide-react";
14
- import {
15
- GetEscrowsFromIndexerResponse as Escrow,
16
- Role,
17
- } from "@trustless-work/escrow/types";
14
+ import { GetEscrowsFromIndexerResponse as Escrow } from "@trustless-work/escrow/types";
18
15
  import {
19
16
  MultiReleaseMilestone,
20
17
  SingleReleaseMilestone,
21
18
  } from "@trustless-work/escrow";
22
19
  import { Badge } from "__UI_BASE__/badge";
23
- import ApproveMilestoneButton from "../../single-release/approve-milestone/button/ApproveMilestone";
24
- import ResolveDisputeDialog from "../../single-release/resolve-dispute/dialog/ResolveDispute";
25
- import DisputeEscrowButton from "../../single-release/dispute-escrow/button/DisputeEscrow";
26
- import ReleaseEscrowButton from "../../single-release/release-escrow/button/ReleaseEscrow";
27
- import ChangeMilestoneStatusDialog from "../../single-release/change-milestone-status/dialog/ChangeMilestoneStatus";
20
+ import { ChangeMilestoneStatusDialog } from "../../single-multi-release/change-milestone-status/dialog/ChangeMilestoneStatus";
21
+ import { ApproveMilestoneButton } from "../../single-multi-release/approve-milestone/button/ApproveMilestone";
28
22
  import { formatCurrency } from "@/components/tw-blocks/helpers/format.helper";
29
23
 
30
24
  interface MilestoneCardProps {
@@ -32,7 +26,6 @@ interface MilestoneCardProps {
32
26
  milestoneIndex: number;
33
27
  selectedEscrow: Escrow;
34
28
  userRolesInEscrow: string[];
35
- activeRole: Role[];
36
29
  onViewDetails: (
37
30
  milestone: SingleReleaseMilestone | MultiReleaseMilestone,
38
31
  index: number
@@ -44,7 +37,6 @@ const MilestoneCardComponent = ({
44
37
  milestoneIndex,
45
38
  selectedEscrow,
46
39
  userRolesInEscrow,
47
- activeRole,
48
40
  onViewDetails,
49
41
  }: MilestoneCardProps) => {
50
42
  const getMilestoneStatusBadge = (
@@ -106,13 +98,11 @@ const MilestoneCardComponent = ({
106
98
  const getActionButtons = (
107
99
  milestone: SingleReleaseMilestone | MultiReleaseMilestone,
108
100
  milestoneIndex: number,
109
- userRolesInEscrow: string[],
110
- activeRole: Role[]
101
+ userRolesInEscrow: string[]
111
102
  ) => {
112
103
  const buttons = [] as React.ReactNode[];
113
104
  if (
114
105
  userRolesInEscrow.includes("serviceProvider") &&
115
- activeRole.includes("serviceProvider") &&
116
106
  milestone.status !== "completed" &&
117
107
  !("flags" in milestone && milestone.flags?.approved)
118
108
  ) {
@@ -124,55 +114,71 @@ const MilestoneCardComponent = ({
124
114
  );
125
115
  }
126
116
 
117
+ if (
118
+ userRolesInEscrow.includes("approver") &&
119
+ (("approved" in milestone && !milestone.approved) ||
120
+ ("flags" in milestone &&
121
+ !milestone.flags?.approved &&
122
+ !milestone.flags?.disputed &&
123
+ !milestone.flags?.released &&
124
+ !milestone.flags?.resolved))
125
+ ) {
126
+ buttons.push(
127
+ <ApproveMilestoneButton
128
+ key={`approve-${milestoneIndex}`}
129
+ milestoneIndex={milestoneIndex}
130
+ />
131
+ );
132
+ }
133
+
127
134
  if (
128
135
  userRolesInEscrow.includes("releaseSigner") &&
129
- activeRole.includes("releaseSigner") &&
130
136
  "flags" in milestone &&
131
137
  !milestone.flags?.disputed &&
132
138
  milestone.flags?.approved &&
133
139
  !milestone.flags?.released
134
140
  ) {
135
- buttons.push(<ReleaseEscrowButton key={`release-${milestoneIndex}`} />);
141
+ buttons
142
+ .push
143
+ // You can add the button here, using the button from the blocks. This button is conditional based on the milestone status and the user roles. Works only with multi-release escrows.
144
+ // <ReleaseEscrowButton
145
+ // key={`release-${milestoneIndex}`}
146
+ // milestoneIndex={milestoneIndex}
147
+ // />
148
+ ();
136
149
  }
137
150
 
138
151
  if (
139
152
  (userRolesInEscrow.includes("serviceProvider") ||
140
153
  userRolesInEscrow.includes("approver")) &&
141
- (activeRole.includes("serviceProvider") ||
142
- activeRole.includes("approver")) &&
143
154
  "flags" in milestone &&
144
155
  !milestone.flags?.disputed &&
145
156
  !milestone.flags?.released &&
146
157
  !milestone.flags?.resolved
147
158
  ) {
148
- buttons.push(<DisputeEscrowButton key={`dispute-${milestoneIndex}`} />);
159
+ buttons
160
+ .push
161
+ // You can add the button here, using the button from the blocks. This button is conditional based on the milestone status and the user roles. Works only with multi-release escrows.
162
+ // <DisputeEscrowButton
163
+ // key={`dispute-${milestoneIndex}`}
164
+ // milestoneIndex={milestoneIndex}
165
+ // />
166
+ ();
149
167
  }
150
168
 
151
169
  if (
152
170
  userRolesInEscrow.includes("disputeResolver") &&
153
- activeRole.includes("disputeResolver") &&
154
171
  "flags" in milestone &&
155
172
  milestone.flags?.disputed
156
173
  ) {
157
- buttons.push(<ResolveDisputeDialog key={`resolve-${milestoneIndex}`} />);
158
- }
159
-
160
- if (
161
- userRolesInEscrow.includes("approver") &&
162
- activeRole.includes("approver") &&
163
- (("approved" in milestone && !milestone.approved) ||
164
- ("flags" in milestone &&
165
- !milestone.flags?.approved &&
166
- !milestone.flags?.disputed &&
167
- !milestone.flags?.released &&
168
- !milestone.flags?.resolved))
169
- ) {
170
- buttons.push(
171
- <ApproveMilestoneButton
172
- key={`approve-${milestoneIndex}`}
173
- milestoneIndex={milestoneIndex}
174
- />
175
- );
174
+ buttons
175
+ .push
176
+ // You can add the button here, using the button from the blocks. This button is conditional based on the milestone status and the user roles. Works only with multi-release escrows.
177
+ // <ResolveDisputeDialog
178
+ // key={`resolve-${milestoneIndex}`}
179
+ // milestoneIndex={milestoneIndex}
180
+ // />
181
+ ();
176
182
  }
177
183
 
178
184
  return buttons;
@@ -210,12 +216,7 @@ const MilestoneCardComponent = ({
210
216
  </div>
211
217
  )}
212
218
 
213
- {getActionButtons(
214
- milestone,
215
- milestoneIndex,
216
- userRolesInEscrow,
217
- activeRole
218
- )}
219
+ {getActionButtons(milestone, milestoneIndex, userRolesInEscrow)}
219
220
 
220
221
  <Button
221
222
  size="sm"
@@ -242,9 +243,7 @@ export const MilestoneCard = React.memo(
242
243
  prev.milestoneIndex === next.milestoneIndex &&
243
244
  prev.selectedEscrow?.contractId === next.selectedEscrow?.contractId &&
244
245
  prev.onViewDetails === next.onViewDetails &&
245
- prev.activeRole.length === next.activeRole.length &&
246
246
  prev.userRolesInEscrow.length === next.userRolesInEscrow.length &&
247
- prev.activeRole.every((r, i) => r === next.activeRole[i]) &&
248
247
  prev.userRolesInEscrow.every((r, i) => r === next.userRolesInEscrow[i])
249
248
  ) {
250
249
  return true;
@@ -25,7 +25,6 @@ import {
25
25
  import {
26
26
  GetEscrowsFromIndexerResponse,
27
27
  MultiReleaseMilestone,
28
- Role,
29
28
  SingleReleaseMilestone,
30
29
  } from "@trustless-work/escrow";
31
30
  import Link from "next/link";
@@ -39,7 +38,6 @@ interface MilestoneDetailDialogProps {
39
38
  } | null;
40
39
  selectedEscrow: GetEscrowsFromIndexerResponse;
41
40
  userRolesInEscrow: string[];
42
- activeRole: Role[];
43
41
  evidenceVisibleMap: Record<number, boolean>;
44
42
  setEvidenceVisibleMap: React.Dispatch<
45
43
  React.SetStateAction<Record<number, boolean>>
@@ -112,6 +110,7 @@ export const MilestoneDetailDialog = ({
112
110
  new URL(url);
113
111
  return true;
114
112
  } catch (error) {
113
+ console.error(error);
115
114
  return false;
116
115
  }
117
116
  };
@@ -4,7 +4,6 @@ import { useCallback, useState } from "react";
4
4
  import { GetEscrowsFromIndexerResponse as Escrow } from "@trustless-work/escrow/types";
5
5
  import {
6
6
  MultiReleaseMilestone,
7
- Role,
8
7
  SingleReleaseMilestone,
9
8
  } from "@trustless-work/escrow";
10
9
  import { MilestoneCard } from "./MilestoneCard";
@@ -17,7 +16,6 @@ interface MilestonesProps {
17
16
  React.SetStateAction<Record<number, boolean>>
18
17
  >;
19
18
  evidenceVisibleMap: Record<number, boolean>;
20
- activeRole: Role[];
21
19
  }
22
20
 
23
21
  export const Milestones = ({
@@ -25,7 +23,6 @@ export const Milestones = ({
25
23
  userRolesInEscrow,
26
24
  setEvidenceVisibleMap,
27
25
  evidenceVisibleMap,
28
- activeRole,
29
26
  }: MilestonesProps) => {
30
27
  const [selectedMilestoneForDetail, setSelectedMilestoneForDetail] = useState<{
31
28
  milestone: SingleReleaseMilestone | MultiReleaseMilestone;
@@ -65,7 +62,6 @@ export const Milestones = ({
65
62
  milestoneIndex={milestoneIndex}
66
63
  selectedEscrow={selectedEscrow}
67
64
  userRolesInEscrow={userRolesInEscrow}
68
- activeRole={activeRole}
69
65
  onViewDetails={handleViewDetails}
70
66
  />
71
67
  ))}
@@ -77,7 +73,6 @@ export const Milestones = ({
77
73
  selectedMilestone={selectedMilestoneForDetail}
78
74
  selectedEscrow={selectedEscrow}
79
75
  userRolesInEscrow={userRolesInEscrow}
80
- activeRole={activeRole}
81
76
  evidenceVisibleMap={evidenceVisibleMap}
82
77
  setEvidenceVisibleMap={setEvidenceVisibleMap}
83
78
  />
@@ -8,7 +8,7 @@ import {
8
8
  DialogHeader,
9
9
  DialogTitle,
10
10
  } from "__UI_BASE__/dialog";
11
- import EntityCard from "./EntityCard";
11
+ import { EntityCard } from "./EntityCard";
12
12
  import { useEscrowContext } from "@/components/tw-blocks/providers/EscrowProvider";
13
13
  import { useEscrowAmountContext } from "@/components/tw-blocks/providers/EscrowAmountProvider";
14
14
  import { CircleCheckBig } from "lucide-react";
@@ -18,10 +18,10 @@ interface SuccessReleaseDialogProps {
18
18
  onOpenChange: (open: boolean) => void;
19
19
  }
20
20
 
21
- export function SuccessReleaseDialog({
21
+ export const SuccessReleaseDialog = ({
22
22
  isOpen,
23
23
  onOpenChange,
24
- }: SuccessReleaseDialogProps) {
24
+ }: SuccessReleaseDialogProps) => {
25
25
  const { selectedEscrow } = useEscrowContext();
26
26
  const { receiverAmount, platformFeeAmount, trustlessWorkAmount } =
27
27
  useEscrowAmountContext();
@@ -95,6 +95,4 @@ export function SuccessReleaseDialog({
95
95
  </DialogContent>
96
96
  </Dialog>
97
97
  );
98
- }
99
-
100
- export default SuccessReleaseDialog;
98
+ };
@@ -11,6 +11,7 @@ import type {
11
11
  import { Card, CardContent, CardHeader, CardTitle } from "__UI_BASE__/card";
12
12
  import { Badge } from "__UI_BASE__/badge";
13
13
  import { Separator } from "__UI_BASE__/separator";
14
+ import { Tooltip, TooltipContent, TooltipTrigger } from "__UI_BASE__/tooltip";
14
15
  import {
15
16
  Goal,
16
17
  Wallet,
@@ -20,16 +21,16 @@ import {
20
21
  FileX,
21
22
  } from "lucide-react";
22
23
  import { useEscrowsByRole } from "../useEscrowsByRole.shared";
23
- import Filters from "./Filters";
24
- import EscrowDetailDialog from "../details/EscrowDetailDialog";
24
+ import { Filters } from "./Filters";
25
25
  import { useEscrowContext } from "@/components/tw-blocks/providers/EscrowProvider";
26
26
  import { useEscrowDialogs } from "@/components/tw-blocks/providers/EscrowDialogsProvider";
27
27
  import {
28
28
  formatCurrency,
29
29
  formatTimestamp,
30
30
  } from "../../../helpers/format.helper";
31
+ import { EscrowDetailDialog } from "../details/EscrowDetailDialog";
31
32
 
32
- export function EscrowsByRoleCards() {
33
+ export const EscrowsByRoleCards = () => {
33
34
  const {
34
35
  walletAddress,
35
36
  data,
@@ -130,21 +131,6 @@ export function EscrowsByRoleCards() {
130
131
  dialogStates.second.setIsOpen(true);
131
132
  };
132
133
 
133
- /**
134
- * Based on the provided roles -> https://docs.trustlesswork.com/trustless-work/technology-overview/roles-in-trustless-work
135
- *
136
- * You must pass one or more roles according to requirements. Acctually it's coming from the select filter.
137
- *
138
- * For example:
139
- * - If the user is a freelancer, you must pass the "serviceProvider" and "receiver" role
140
- *
141
- * Depending of the role, you'll have different actions buttons
142
- */
143
- const activeRole: Role[] = React.useMemo(
144
- () => role.split(",") as Role[],
145
- [role]
146
- );
147
-
148
134
  return (
149
135
  <>
150
136
  <div className="w-full flex flex-col gap-4">
@@ -360,9 +346,9 @@ export function EscrowsByRoleCards() {
360
346
  <ul className="list-disc list-inside flex flex-col gap-1">
361
347
  {escrow.milestones
362
348
  .slice(0, 3)
363
- .map((milestone) => (
349
+ .map((milestone, index) => (
364
350
  <li
365
- key={`milestone-${milestone.description}-${milestone.status}`}
351
+ key={`milestone-${milestone.description}-${milestone.status}-${index}`}
366
352
  className="text-xs flex justify-between"
367
353
  >
368
354
  {milestone.description}
@@ -378,33 +364,83 @@ export function EscrowsByRoleCards() {
378
364
  )}
379
365
  </span>
380
366
 
381
- <span
382
- className={`bg-red-800 rounded-full h-2 w-2 ml-1 ${
383
- milestone.flags?.disputed
384
- ? "block"
385
- : "hidden"
386
- }`}
387
- />
388
-
389
- <span
390
- className={`bg-green-800 rounded-full h-2 w-2 ml-1 ${
391
- milestone.flags?.resolved ||
392
- milestone.flags?.released
393
- ? "block"
394
- : "hidden"
395
- }`}
396
- />
397
-
398
- <span
399
- className={`bg-yellow-800 rounded-full h-2 w-2 ml-1 ${
400
- milestone.flags?.approved &&
401
- !milestone.flags?.disputed &&
402
- !milestone.flags?.resolved &&
403
- !milestone.flags?.released
404
- ? "block"
405
- : "hidden"
406
- }`}
407
- />
367
+ {milestone.flags?.disputed && (
368
+ <Tooltip>
369
+ <TooltipTrigger>
370
+ <span
371
+ className={`bg-red-800 rounded-full h-2 w-2 ml-1 ${
372
+ milestone.flags?.disputed
373
+ ? "block"
374
+ : "hidden"
375
+ }`}
376
+ />
377
+ </TooltipTrigger>
378
+ <TooltipContent>
379
+ Disputed
380
+ </TooltipContent>
381
+ </Tooltip>
382
+ )}
383
+
384
+ {milestone.flags?.resolved && (
385
+ <Tooltip>
386
+ <TooltipTrigger>
387
+ <span
388
+ className={`bg-green-800 rounded-full h-2 w-2 ml-1 ${
389
+ milestone.flags?.resolved
390
+ ? "block"
391
+ : "hidden"
392
+ }`}
393
+ />
394
+ </TooltipTrigger>
395
+ <TooltipContent>
396
+ Resolved
397
+ </TooltipContent>
398
+ </Tooltip>
399
+ )}
400
+
401
+ {milestone.flags?.released && (
402
+ <Tooltip>
403
+ <TooltipTrigger>
404
+ <span
405
+ className={`bg-green-800 rounded-full h-2 w-2 ml-1 ${
406
+ milestone.flags?.released
407
+ ? "block"
408
+ : "hidden"
409
+ }`}
410
+ />
411
+ </TooltipTrigger>
412
+ <TooltipContent>
413
+ Released
414
+ </TooltipContent>
415
+ </Tooltip>
416
+ )}
417
+
418
+ {milestone.flags?.approved &&
419
+ !milestone.flags?.disputed &&
420
+ !milestone.flags?.resolved &&
421
+ !milestone.flags?.released && (
422
+ <Tooltip>
423
+ <TooltipTrigger>
424
+ <span
425
+ className={`bg-yellow-600 rounded-full h-2 w-2 ml-1 ${
426
+ milestone.flags
427
+ ?.approved &&
428
+ !milestone.flags
429
+ ?.disputed &&
430
+ !milestone.flags
431
+ ?.resolved &&
432
+ !milestone.flags
433
+ ?.released
434
+ ? "block"
435
+ : "hidden"
436
+ }`}
437
+ />
438
+ </TooltipTrigger>
439
+ <TooltipContent>
440
+ Pending Release
441
+ </TooltipContent>
442
+ </Tooltip>
443
+ )}
408
444
  </div>
409
445
  </>
410
446
  )}
@@ -518,7 +554,6 @@ export function EscrowsByRoleCards() {
518
554
  {/* Dialog */}
519
555
  {dialogStates.second.isOpen ? (
520
556
  <EscrowDetailDialog
521
- activeRole={activeRole}
522
557
  isDialogOpen={dialogStates.second.isOpen}
523
558
  setIsDialogOpen={dialogStates.second.setIsOpen}
524
559
  setSelectedEscrow={setSelectedEscrow}
@@ -526,6 +561,6 @@ export function EscrowsByRoleCards() {
526
561
  ) : null}
527
562
  </>
528
563
  );
529
- }
564
+ };
530
565
 
531
566
  export default React.memo(EscrowsByRoleCards);
@@ -84,7 +84,7 @@ type FiltersProps = {
84
84
  setOrderDirection: (v: "asc" | "desc") => void;
85
85
  };
86
86
 
87
- function Filters({
87
+ export const Filters = ({
88
88
  title,
89
89
  engagementId,
90
90
  isActive,
@@ -113,7 +113,7 @@ function Filters({
113
113
  onRefresh,
114
114
  setOrderBy,
115
115
  setOrderDirection,
116
- }: FiltersProps) {
116
+ }: FiltersProps) => {
117
117
  return (
118
118
  <div className="w-full bg-card/50 backdrop-blur-sm border border-border/50 rounded-lg p-4 shadow-sm">
119
119
  {/* Header Section */}
@@ -416,6 +416,4 @@ function Filters({
416
416
  </div>
417
417
  </div>
418
418
  );
419
- }
420
-
421
- export default React.memo(Filters);
419
+ };
@@ -23,14 +23,14 @@ import {
23
23
  TableRow,
24
24
  } from "__UI_BASE__/table";
25
25
  import { FileX, Loader2, Wallet, RefreshCw, AlertTriangle } from "lucide-react";
26
- import Filters from "./Filters";
27
- import EscrowDetailDialog from "../details/EscrowDetailDialog";
26
+ import { Filters } from "./Filters";
27
+ import { EscrowDetailDialog } from "../details/EscrowDetailDialog";
28
28
  import { useEscrowDialogs } from "@/components/tw-blocks/providers/EscrowDialogsProvider";
29
29
  import { useEscrowContext } from "@/components/tw-blocks/providers/EscrowProvider";
30
30
  import { useEscrowsByRole } from "../useEscrowsByRole.shared";
31
31
  import { formatTimestamp } from "../../../helpers/format.helper";
32
32
 
33
- export function EscrowsByRoleTable() {
33
+ export const EscrowsByRoleTable = () => {
34
34
  const {
35
35
  walletAddress,
36
36
  data,
@@ -213,21 +213,6 @@ export function EscrowsByRoleTable() {
213
213
  enableSortingRemoval: true,
214
214
  });
215
215
 
216
- /**
217
- * Based on the provided roles -> https://docs.trustlesswork.com/trustless-work/technology-overview/roles-in-trustless-work
218
- *
219
- * You must pass one or more roles according to requirements. Acctually it's coming from the select filter.
220
- *
221
- * For example:
222
- * - If the user is a freelancer, you must pass the "serviceProvider" and "receiver" role
223
- *
224
- * Depending of the role, you'll have different actions buttons
225
- */
226
- const activeRole: Role[] = React.useMemo(
227
- () => role.split(",") as Role[],
228
- [role]
229
- );
230
-
231
216
  const escrows = data ?? [];
232
217
 
233
218
  return (
@@ -276,8 +261,8 @@ export function EscrowsByRoleTable() {
276
261
  const className =
277
262
  typeof header.column.columnDef.meta === "object" &&
278
263
  header.column.columnDef.meta &&
279
- "className" in (header.column.columnDef.meta as any)
280
- ? (header.column.columnDef.meta as any).className
264
+ "className" in header.column.columnDef.meta
265
+ ? header.column.columnDef.meta.className
281
266
  : "";
282
267
  return (
283
268
  <TableHead
@@ -390,8 +375,8 @@ export function EscrowsByRoleTable() {
390
375
  const className =
391
376
  typeof cell.column.columnDef.meta === "object" &&
392
377
  cell.column.columnDef.meta &&
393
- "className" in (cell.column.columnDef.meta as any)
394
- ? (cell.column.columnDef.meta as any).className
378
+ "className" in cell.column.columnDef.meta
379
+ ? (cell.column.columnDef.meta.className as string)
395
380
  : "";
396
381
  return (
397
382
  <TableCell key={cell.id} className={className}>
@@ -441,7 +426,6 @@ export function EscrowsByRoleTable() {
441
426
  {/* Dialog */}
442
427
  {dialogStates.second.isOpen ? (
443
428
  <EscrowDetailDialog
444
- activeRole={activeRole}
445
429
  isDialogOpen={dialogStates.second.isOpen}
446
430
  setIsDialogOpen={dialogStates.second.setIsOpen}
447
431
  setSelectedEscrow={setSelectedEscrow}
@@ -449,6 +433,4 @@ export function EscrowsByRoleTable() {
449
433
  ) : null}
450
434
  </>
451
435
  );
452
- }
453
-
454
- export default React.memo(EscrowsByRoleTable);
436
+ };
@@ -84,7 +84,7 @@ type FiltersProps = {
84
84
  setOrderDirection: (v: "asc" | "desc") => void;
85
85
  };
86
86
 
87
- function Filters({
87
+ export const Filters = ({
88
88
  title,
89
89
  engagementId,
90
90
  isActive,
@@ -113,7 +113,7 @@ function Filters({
113
113
  onRefresh,
114
114
  setOrderBy,
115
115
  setOrderDirection,
116
- }: FiltersProps) {
116
+ }: FiltersProps) => {
117
117
  return (
118
118
  <div className="w-full bg-card/50 backdrop-blur-sm border border-border/50 rounded-lg p-4 shadow-sm">
119
119
  {/* Header Section */}
@@ -416,6 +416,4 @@ function Filters({
416
416
  </div>
417
417
  </div>
418
418
  );
419
- }
420
-
421
- export default React.memo(Filters);
419
+ };