Skip to content

Commit 396c620

Browse files
feat: add tastRaw onglet in task page (#73) (#76)
* feat: implement theme provider and mode toggle for light/dark mode support * fix: update icon color from 'text-secondary' to 'text-foreground' in multiple preview tables * feat: update styles for improved UI consistency across components * fix: reduce transition duration for improved responsiveness across components * feat: enhance ModeToggle component with system theme option and improve button styling * feat: update borderTypeColor to include background colors and dark mode support * feat: enhance CopyButton tooltip styling and improve TableBody dark mode support * feat: update component styles for improved UI consistency and responsiveness * refactor: simplify header layout in account route component * feat: update brand and muted foreground colors for improved accessibility * feat: update InteractiveJsonViewer styles for improved color consistency and accessibility * feat: update AddressChip button styles for improved visual consistency and accessibility; refine SchemaSearch layout for better readability * feat: update ring color variable to use primary color for improved theming consistency * refactor: update Tabs component layout and styling for improved consistency * feat: implement dynamic tab indicator positioning and styling * refactor: improve SchemaSearch component layout and button text for clarity * feat: add default JSON view styles and integrate into JsonBlock and InteractiveJsonViewer components * refactor: simplify Button component structure in SmartLinkGroup * feat: enhance DataTable with row click navigation and keyboard accessibility * fix: address or id not showing on small screen * refactor: remove unused imports from account layout component * feat: add buttonText prop to CopyButton for customizable button label * feat: implement TaskRawData component and integrate with TasksRoute for improved task detail display * refactor: remove unused copyText prop from JsonBlock component * fix: add className prop to CopyButton for consistent styling in JsonBlock * feat: enhance TaskRawData component to accept taskWorkerpoolId for improved data fetching
1 parent fce50a1 commit 396c620

File tree

3 files changed

+108
-6
lines changed

3 files changed

+108
-6
lines changed

src/components/CopyButton.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,15 @@ import {
1010
const CopyButton = ({
1111
textToCopy,
1212
displayText,
13+
buttonText,
1314
tooltipWithText = false,
15+
className,
1416
}: {
1517
textToCopy: string;
1618
displayText?: string;
19+
buttonText?: string;
1720
tooltipWithText?: boolean;
21+
className?: string;
1822
}) => {
1923
const [showTooltip, setShowTooltip] = useState(false);
2024
const [tooltipMessage, setTooltipMessage] = useState('Copy');
@@ -43,7 +47,7 @@ const CopyButton = ({
4347
return (
4448
<TooltipProvider delayDuration={0}>
4549
<Tooltip open={showTooltip}>
46-
<TooltipTrigger asChild>
50+
<TooltipTrigger asChild className={className}>
4751
<span className="box-content flex max-w-full items-center gap-1">
4852
{displayText && (
4953
<span className="overflow-hidden overflow-ellipsis">
@@ -60,6 +64,7 @@ const CopyButton = ({
6064
onMouseLeave={handleMouseLeave}
6165
className="hover:before:bg-muted active:before:bg-secondary relative z-0 -mx-1 -my-1 items-center gap-1 px-1 py-1 transition-colors before:absolute before:inset-0 before:-z-10 before:rounded-lg before:duration-200 active:before:scale-x-[0.98] active:before:scale-y-[0.94]"
6266
>
67+
{buttonText && <span className="mr-1 text-sm">{buttonText}</span>}
6368
<Copy className="size-4 flex-none" />
6469
</button>
6570
</span>
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
import { TABLE_REFETCH_INTERVAL } from '@/config';
2+
import { useQuery } from '@tanstack/react-query';
3+
import { getIExec } from '@/externals/iexecSdkClient';
4+
import { ErrorAlert } from '@/modules/ErrorAlert';
5+
import JsonBlock from '@/modules/JsonBlock';
6+
import useUserStore from '@/stores/useUser.store';
7+
import { createPlaceholderDataFnForQueryKey } from '@/utils/createPlaceholderDataFnForQueryKey';
8+
9+
function useTaskRawData({
10+
taskWorkerpoolId,
11+
taskId,
12+
}: {
13+
taskWorkerpoolId?: string;
14+
taskId: string;
15+
}) {
16+
const { chainId } = useUserStore();
17+
18+
const queryKey = [chainId, 'task', 'raw', taskWorkerpoolId, taskId];
19+
20+
const { data, isLoading, isRefetching, isError, errorUpdateCount } = useQuery(
21+
{
22+
queryKey,
23+
queryFn: async () => {
24+
const iexec = await getIExec();
25+
const apiUrl = await iexec.workerpool.getWorkerpoolApiUrl(
26+
taskWorkerpoolId!
27+
);
28+
29+
const response = await fetch(`${apiUrl}/tasks/${taskId}`);
30+
if (!response.ok) {
31+
throw new Error('Failed to fetch task raw data');
32+
}
33+
return response.json();
34+
},
35+
refetchInterval: TABLE_REFETCH_INTERVAL,
36+
placeholderData: createPlaceholderDataFnForQueryKey(queryKey),
37+
enabled: !!taskWorkerpoolId && !!taskId,
38+
}
39+
);
40+
41+
return {
42+
data,
43+
isLoading,
44+
isRefetching,
45+
isError,
46+
hasPastError: isError || errorUpdateCount > 0,
47+
};
48+
}
49+
50+
export function TaskRawData({
51+
taskWorkerpoolId,
52+
taskId,
53+
}: {
54+
taskWorkerpoolId?: string;
55+
taskId: string;
56+
}) {
57+
const {
58+
data: tasks,
59+
hasPastError,
60+
isLoading,
61+
} = useTaskRawData({ taskWorkerpoolId, taskId });
62+
63+
return hasPastError && (!tasks || !tasks.length) ? (
64+
<ErrorAlert
65+
message={
66+
"Unable to load raw task data: the workerpool associated with this task doesn't expose a public API"
67+
}
68+
/>
69+
) : (
70+
<div className="dark:bg-tooltip min-h-40 rounded-3xl border bg-[#fafaff] p-6">
71+
{isLoading ? (
72+
<p>Loading...</p>
73+
) : (
74+
<JsonBlock collapsed={5}>{tasks}</JsonBlock>
75+
)}
76+
</div>
77+
);
78+
}

src/routes/$chainSlug/_layout/task/$taskId.tsx

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,13 @@ import { createFileRoute } from '@tanstack/react-router';
55
import { LoaderCircle } from 'lucide-react';
66
import TaskIcon from '@/components/icons/TaskIcon';
77
import { BackButton } from '@/components/ui/BackButton';
8+
import { useTabParam } from '@/hooks/usePageParam';
89
import { DetailsTable } from '@/modules/DetailsTable';
910
import { ErrorAlert } from '@/modules/ErrorAlert';
11+
import { Tabs } from '@/modules/Tabs';
1012
import { SearcherBar } from '@/modules/search/SearcherBar';
1113
import { TaskBreadcrumbs } from '@/modules/tasks/task/TaskBreadcrumbs';
14+
import { TaskRawData } from '@/modules/tasks/task/TaskRawData';
1215
import { buildTaskDetails } from '@/modules/tasks/task/buildTaskDetails';
1316
import { taskQuery } from '@/modules/tasks/task/taskQuery';
1417
import useUserStore from '@/stores/useUser.store';
@@ -64,6 +67,8 @@ function TasksRoute() {
6467
isValid,
6568
error,
6669
} = useTaskData((taskId as string).toLowerCase(), chainId!);
70+
const tabLabels = ['DETAILS', 'RAW DATA'];
71+
const [currentTab, setCurrentTab] = useTabParam('dealTab', tabLabels, 0);
6772

6873
const taskDetails = task ? buildTaskDetails({ task }) : undefined;
6974

@@ -99,11 +104,25 @@ function TasksRoute() {
99104
</div>
100105
</div>
101106

102-
{hasPastError && !taskDetails ? (
103-
<ErrorAlert message="An error occurred during task details loading." />
104-
) : (
105-
<DetailsTable details={taskDetails || {}} />
106-
)}
107+
<Tabs
108+
currentTab={currentTab}
109+
tabLabels={tabLabels}
110+
onTabChange={setCurrentTab}
111+
/>
112+
<div>
113+
{currentTab === 0 &&
114+
(hasPastError && !taskDetails ? (
115+
<ErrorAlert message="An error occurred during task details loading." />
116+
) : (
117+
<DetailsTable details={taskDetails || {}} />
118+
))}
119+
{currentTab === 1 && (
120+
<TaskRawData
121+
taskWorkerpoolId={task?.deal.workerpool.address}
122+
taskId={taskId}
123+
/>
124+
)}
125+
</div>
107126
</div>
108127
);
109128
}

0 commit comments

Comments
 (0)