Skip to content

Commit 27b7cbb

Browse files
committed
move explorers modal to separate component
1 parent e406df1 commit 27b7cbb

File tree

2 files changed

+93
-67
lines changed

2 files changed

+93
-67
lines changed

src/components/tabs/TasksTab.tsx

Lines changed: 4 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,8 @@ import {
22
Flex,
33
Link,
44
Button,
5-
Modal,
6-
ModalOverlay,
7-
ModalContent,
8-
ModalHeader,
9-
ModalBody,
10-
ModalCloseButton,
115
useDisclosure,
126
Text,
13-
Image,
14-
Box,
157
Alert,
168
AlertIcon,
179
} from "@chakra-ui/react";
@@ -22,19 +14,18 @@ import DashboardCard from "~/components/dashboard/DashboardCard";
2214
import DashboardCardValue from "~/components/dashboard/DashboardCardValue";
2315
import Markdown from "~/components/shared/Markdown";
2416
import TasksFaq from "~/components/tasks/TasksFaq";
17+
import ExplorersModal from "~/components/tasks/ExplorersModal";
2518
import { apos } from "~/lib/htmlEntities";
2619

2720
import { useAppContext } from "~/contexts/app";
2821
import useActivityQuery from "~/hooks/useActivityQuery";
2922
import useInstancesQuery from "~/hooks/useInstancesQuery";
30-
import useIsMobile from "~/hooks/useIsMobile";
3123

3224
export default function TasksTab() {
3325
const { apiToken } = useAppContext();
3426
const activityQuery = useActivityQuery();
3527
const instancesQuery = useInstancesQuery();
3628
const explorersModal = useDisclosure();
37-
const isMobile = useIsMobile();
3829

3930
const isLoading = activityQuery.isPlaceholderData && Boolean(apiToken);
4031

@@ -176,65 +167,11 @@ export default function TasksTab() {
176167
))}
177168
</Flex>
178169
<TasksFaq />
179-
<Modal
170+
<ExplorersModal
180171
isOpen={explorersModal.isOpen}
181172
onClose={explorersModal.onClose}
182-
size={isMobile ? "full" : "md"}
183-
isCentered
184-
autoFocus={false}
185-
>
186-
<ModalOverlay />
187-
<ModalContent width="400px" p={6}>
188-
<ModalHeader fontWeight="500" textStyle="h3" mb={4} pr={12}>
189-
Choose explorer
190-
</ModalHeader>
191-
<ModalCloseButton top={6} right={6} />
192-
<ModalBody mb={0}>
193-
<Flex flexDir="column" gap={6}>
194-
<Text>
195-
Choose Blockscout explorer that you want to interact with and
196-
earn Merits
197-
</Text>
198-
<Flex flexWrap="wrap" gap={2}>
199-
{instancesQuery.data?.items.map((instance) => (
200-
<Link
201-
key={instance.chain_id}
202-
href={instance.domain}
203-
isExternal
204-
_hover={{ textDecoration: "none" }}
205-
>
206-
<Flex
207-
gap={2}
208-
alignItems="center"
209-
p={2}
210-
bgColor="blue.50"
211-
borderRadius="base"
212-
>
213-
<Image
214-
src={instance.details.icon_url}
215-
alt={instance.name}
216-
boxSize={5}
217-
flexShrink={0}
218-
fallback={
219-
<Box
220-
boxSize={5}
221-
borderRadius="full"
222-
bg="gray.200"
223-
flexShrink={0}
224-
/>
225-
}
226-
/>
227-
<Text fontSize="sm" fontWeight="500">
228-
{instance.name}
229-
</Text>
230-
</Flex>
231-
</Link>
232-
))}
233-
</Flex>
234-
</Flex>
235-
</ModalBody>
236-
</ModalContent>
237-
</Modal>
173+
items={instancesQuery.data?.items}
174+
/>
238175
</>
239176
);
240177
}
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
import {
2+
Flex,
3+
Link,
4+
Modal,
5+
ModalOverlay,
6+
ModalContent,
7+
ModalHeader,
8+
ModalBody,
9+
ModalCloseButton,
10+
Text,
11+
Image,
12+
Box,
13+
} from "@chakra-ui/react";
14+
15+
import type { Instance } from "~/types/api/instances";
16+
17+
import useIsMobile from "~/hooks/useIsMobile";
18+
19+
type Props = {
20+
isOpen: boolean;
21+
onClose: () => void;
22+
items: Instance[] | undefined;
23+
};
24+
25+
export default function ExplorersModal({ isOpen, onClose, items }: Props) {
26+
const isMobile = useIsMobile();
27+
28+
return (
29+
<Modal
30+
isOpen={isOpen}
31+
onClose={onClose}
32+
size={isMobile ? "full" : "md"}
33+
isCentered
34+
autoFocus={false}
35+
>
36+
<ModalOverlay />
37+
<ModalContent width="400px" p={6}>
38+
<ModalHeader fontWeight="500" textStyle="h3" mb={4} pr={12}>
39+
Choose explorer
40+
</ModalHeader>
41+
<ModalCloseButton top={6} right={6} />
42+
<ModalBody mb={0}>
43+
<Flex flexDir="column" gap={6}>
44+
<Text>
45+
Choose Blockscout explorer that you want to interact with and earn
46+
Merits
47+
</Text>
48+
<Flex flexWrap="wrap" gap={2}>
49+
{items?.map((instance) => (
50+
<Link
51+
key={instance.chain_id}
52+
href={instance.domain}
53+
isExternal
54+
_hover={{ textDecoration: "none" }}
55+
>
56+
<Flex
57+
gap={2}
58+
alignItems="center"
59+
p={2}
60+
bgColor="blue.50"
61+
borderRadius="base"
62+
>
63+
<Image
64+
src={instance.details.icon_url}
65+
alt={instance.name}
66+
boxSize={5}
67+
flexShrink={0}
68+
fallback={
69+
<Box
70+
boxSize={5}
71+
borderRadius="full"
72+
bg="gray.200"
73+
flexShrink={0}
74+
/>
75+
}
76+
/>
77+
<Text fontSize="sm" fontWeight="500">
78+
{instance.name}
79+
</Text>
80+
</Flex>
81+
</Link>
82+
))}
83+
</Flex>
84+
</Flex>
85+
</ModalBody>
86+
</ModalContent>
87+
</Modal>
88+
);
89+
}

0 commit comments

Comments
 (0)