@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.
- package/bin/index.js +485 -17
- package/package.json +1 -1
- package/templates/escrows/details/Actions.tsx +144 -149
- package/templates/escrows/details/Entities.tsx +1 -1
- package/templates/escrows/details/EntityCard.tsx +1 -3
- package/templates/escrows/details/EscrowDetailDialog.tsx +16 -16
- package/templates/escrows/details/GeneralInformation.tsx +19 -22
- package/templates/escrows/details/MilestoneCard.tsx +46 -47
- package/templates/escrows/details/MilestoneDetailDialog.tsx +1 -2
- package/templates/escrows/details/Milestones.tsx +0 -5
- package/templates/escrows/details/SuccessReleaseDialog.tsx +4 -6
- package/templates/escrows/escrows-by-role/cards/EscrowsCards.tsx +84 -49
- package/templates/escrows/escrows-by-role/cards/Filters.tsx +3 -5
- package/templates/escrows/escrows-by-role/table/EscrowsTable.tsx +8 -26
- package/templates/escrows/escrows-by-role/table/Filters.tsx +3 -5
- package/templates/escrows/escrows-by-signer/cards/EscrowsCards.tsx +89 -55
- package/templates/escrows/escrows-by-signer/cards/Filters.tsx +3 -5
- package/templates/escrows/escrows-by-signer/table/EscrowsTable.tsx +8 -24
- package/templates/escrows/escrows-by-signer/table/Filters.tsx +3 -5
- package/templates/escrows/multi-release/dispute-milestone/button/DisputeEscrow.tsx +98 -0
- package/templates/escrows/multi-release/initialize-escrow/dialog/InitializeEscrow.tsx +528 -0
- package/templates/escrows/multi-release/initialize-escrow/form/InitializeEscrow.tsx +506 -0
- package/templates/escrows/multi-release/initialize-escrow/shared/schema.ts +179 -0
- package/templates/escrows/multi-release/initialize-escrow/shared/useInitializeEscrow.ts +175 -0
- package/templates/escrows/multi-release/release-milestone/button/ReleaseEscrow.tsx +116 -0
- package/templates/escrows/multi-release/resolve-dispute/button/ResolveDispute.tsx +122 -0
- package/templates/escrows/multi-release/resolve-dispute/dialog/ResolveDispute.tsx +178 -0
- package/templates/escrows/multi-release/resolve-dispute/form/ResolveDispute.tsx +156 -0
- package/templates/escrows/multi-release/resolve-dispute/shared/schema.ts +85 -0
- package/templates/escrows/multi-release/resolve-dispute/shared/useResolveDispute.ts +105 -0
- package/templates/escrows/multi-release/update-escrow/dialog/UpdateEscrow.tsx +471 -0
- package/templates/escrows/multi-release/update-escrow/form/UpdateEscrow.tsx +449 -0
- package/templates/escrows/multi-release/update-escrow/shared/schema.ts +152 -0
- package/templates/escrows/multi-release/update-escrow/shared/useUpdateEscrow.ts +254 -0
- package/templates/escrows/{single-release → single-multi-release}/approve-milestone/button/ApproveMilestone.tsx +20 -7
- package/templates/escrows/{single-release → single-multi-release}/approve-milestone/dialog/ApproveMilestone.tsx +3 -3
- package/templates/escrows/{single-release → single-multi-release}/approve-milestone/form/ApproveMilestone.tsx +3 -3
- package/templates/escrows/{single-release/approve-milestone/shared → single-multi-release/approve-milestone}/useApproveMilestone.ts +16 -16
- package/templates/escrows/{single-release → single-multi-release}/change-milestone-status/button/ChangeMilestoneStatus.tsx +4 -4
- package/templates/escrows/{single-release → single-multi-release}/change-milestone-status/dialog/ChangeMilestoneStatus.tsx +4 -4
- package/templates/escrows/{single-release → single-multi-release}/change-milestone-status/form/ChangeMilestoneStatus.tsx +3 -3
- package/templates/escrows/{single-release/change-milestone-status/shared → single-multi-release/change-milestone-status}/useChangeMilestoneStatus.ts +1 -1
- package/templates/escrows/{single-release → single-multi-release}/fund-escrow/button/FundEscrow.tsx +3 -3
- package/templates/escrows/{single-release → single-multi-release}/fund-escrow/dialog/FundEscrow.tsx +3 -3
- package/templates/escrows/{single-release → single-multi-release}/fund-escrow/form/FundEscrow.tsx +3 -3
- package/templates/escrows/{single-release/fund-escrow/shared → single-multi-release/fund-escrow}/useFundEscrow.ts +1 -1
- package/templates/escrows/single-release/dispute-escrow/button/DisputeEscrow.tsx +2 -2
- package/templates/escrows/single-release/initialize-escrow/dialog/InitializeEscrow.tsx +14 -6
- package/templates/escrows/single-release/initialize-escrow/form/InitializeEscrow.tsx +14 -6
- package/templates/escrows/single-release/initialize-escrow/shared/schema.ts +0 -57
- package/templates/escrows/single-release/initialize-escrow/shared/useInitializeEscrow.ts +42 -1
- package/templates/escrows/single-release/release-escrow/button/ReleaseEscrow.tsx +2 -2
- package/templates/escrows/single-release/resolve-dispute/button/ResolveDispute.tsx +3 -3
- package/templates/escrows/single-release/resolve-dispute/dialog/ResolveDispute.tsx +3 -6
- package/templates/escrows/single-release/resolve-dispute/form/ResolveDispute.tsx +2 -2
- package/templates/escrows/single-release/resolve-dispute/shared/useResolveDispute.ts +14 -1
- package/templates/escrows/single-release/update-escrow/dialog/UpdateEscrow.tsx +2 -2
- package/templates/escrows/single-release/update-escrow/form/UpdateEscrow.tsx +2 -2
- package/templates/escrows/single-release/update-escrow/shared/useUpdateEscrow.ts +12 -7
- package/templates/providers/EscrowDialogsProvider.tsx +1 -3
- package/templates/providers/EscrowProvider.tsx +27 -4
- package/templates/providers/TrustlessWork.tsx +1 -1
- package/templates/escrows/details/ProgressEscrow.tsx +0 -191
- /package/templates/escrows/{single-release/approve-milestone/shared → single-multi-release/approve-milestone}/schema.ts +0 -0
- /package/templates/escrows/{single-release/change-milestone-status/shared → single-multi-release/change-milestone-status}/schema.ts +0 -0
- /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
|
|
24
|
-
import
|
|
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
|
|
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
|
|
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
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
(
|
|
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
|
|
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
|
|
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
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
280
|
-
?
|
|
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
|
|
394
|
-
? (cell.column.columnDef.meta as
|
|
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
|
-
|
|
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
|
+
};
|