|
1 | 1 | import { useStarships } from "@/hooks/useStarships";
|
2 |
| -import { useId } from "react"; |
| 2 | +import { UseQueryResult } from "@tanstack/react-query"; |
3 | 3 | import { StyleSheet, View } from "react-native";
|
4 | 4 | import { Text } from "react-native-paper";
|
5 | 5 |
|
6 | 6 | interface StarshipLoadableListProps {
|
7 | 7 | starships: string[];
|
8 | 8 | }
|
9 | 9 |
|
10 |
| -function getRandom(max: number) { |
11 |
| - return Math.floor(Math.random() * max); |
| 10 | +function randomId() { |
| 11 | + return Math.random().toString(36).substring(7); |
| 12 | +} |
| 13 | + |
| 14 | +function StarshipLoadableListItem({ |
| 15 | + result, |
| 16 | +}: { |
| 17 | + result: UseQueryResult<any, Error>; |
| 18 | +}) { |
| 19 | + if (result.isLoading) { |
| 20 | + return <Text variant="bodyMedium">Loading…</Text>; |
| 21 | + } |
| 22 | + |
| 23 | + if (result.isError) { |
| 24 | + return <Text variant="bodyMedium">Error 😕</Text>; |
| 25 | + } |
| 26 | + |
| 27 | + return ( |
| 28 | + <View style={styles.container}> |
| 29 | + <Text variant="titleMedium">{result.data.name}</Text> |
| 30 | + <Text variant="bodyMedium">{result.data.model}</Text> |
| 31 | + </View> |
| 32 | + ); |
12 | 33 | }
|
13 | 34 |
|
14 | 35 | export const StarshipLoadableList = ({
|
15 | 36 | starships,
|
16 | 37 | }: StarshipLoadableListProps) => {
|
17 | 38 | const queryResult = useStarships(starships);
|
18 |
| - const id = useId(); |
19 | 39 |
|
20 | 40 | return queryResult.map((result) => {
|
21 |
| - if (result.isLoading) { |
22 |
| - return ( |
23 |
| - <Text |
24 |
| - key={id} |
25 |
| - variant="bodyMedium" |
26 |
| - > |
27 |
| - Loading… |
28 |
| - </Text> |
29 |
| - ); |
30 |
| - } |
31 |
| - |
32 |
| - if (result.isError) { |
33 |
| - return ( |
34 |
| - <Text |
35 |
| - key={id} |
36 |
| - variant="bodyMedium" |
37 |
| - > |
38 |
| - Error 😕 |
39 |
| - </Text> |
40 |
| - ); |
41 |
| - } |
42 |
| - |
| 41 | + const id = randomId(); |
43 | 42 | return (
|
44 |
| - <View |
45 |
| - key={getRandom(1000)} |
46 |
| - style={styles.container} |
47 |
| - > |
48 |
| - <Text variant="titleMedium">{result.data.name}</Text> |
49 |
| - <Text variant="bodyMedium">{result.data.model}</Text> |
50 |
| - </View> |
| 43 | + <StarshipLoadableListItem |
| 44 | + key={id} |
| 45 | + result={result} |
| 46 | + /> |
51 | 47 | );
|
52 | 48 | });
|
53 | 49 | };
|
|
0 commit comments