1*ce122c8cSTomasz Sapetaimport { Image } from 'expo-image';
2*ce122c8cSTomasz Sapetaimport { useCallback, useState } from 'react';
3*ce122c8cSTomasz Sapetaimport { ScrollView, StyleSheet, Text, View } from 'react-native';
4*ce122c8cSTomasz Sapeta
5*ce122c8cSTomasz Sapetaimport Button from '../../components/Button';
6*ce122c8cSTomasz Sapetaimport MonoText from '../../components/MonoText';
7*ce122c8cSTomasz Sapetaimport { Colors } from '../../constants';
8*ce122c8cSTomasz Sapeta
9*ce122c8cSTomasz Sapetaexport default function ImagePlaceholderScreen() {
10*ce122c8cSTomasz Sapeta  const [uri, setUri] = useState<string>(getRandomImageUri());
11*ce122c8cSTomasz Sapeta  const [isLoading, setIsLoading] = useState<boolean>(true);
12*ce122c8cSTomasz Sapeta
13*ce122c8cSTomasz Sapeta  const loadRandomImage = useCallback(() => {
14*ce122c8cSTomasz Sapeta    setIsLoading(true);
15*ce122c8cSTomasz Sapeta    setUri(getRandomImageUri());
16*ce122c8cSTomasz Sapeta  }, [uri]);
17*ce122c8cSTomasz Sapeta
18*ce122c8cSTomasz Sapeta  const source = {
19*ce122c8cSTomasz Sapeta    uri,
20*ce122c8cSTomasz Sapeta    cacheKey: 'CUSTOM_CONSTANT_CACHE_KEY',
21*ce122c8cSTomasz Sapeta  };
22*ce122c8cSTomasz Sapeta
23*ce122c8cSTomasz Sapeta  return (
24*ce122c8cSTomasz Sapeta    <View style={styles.container}>
25*ce122c8cSTomasz Sapeta      <Image
26*ce122c8cSTomasz Sapeta        style={styles.image}
27*ce122c8cSTomasz Sapeta        source={source}
28*ce122c8cSTomasz Sapeta        cachePolicy="disk"
29*ce122c8cSTomasz Sapeta        onLoad={({ cacheType }) => {
30*ce122c8cSTomasz Sapeta          if (cacheType === 'disk') {
31*ce122c8cSTomasz Sapeta            alert('Image was loaded from the disk cache');
32*ce122c8cSTomasz Sapeta          }
33*ce122c8cSTomasz Sapeta          setIsLoading(false);
34*ce122c8cSTomasz Sapeta        }}
35*ce122c8cSTomasz Sapeta      />
36*ce122c8cSTomasz Sapeta
37*ce122c8cSTomasz Sapeta      <MonoText>{`const source = ${JSON.stringify(source, null, 2)}`}</MonoText>
38*ce122c8cSTomasz Sapeta
39*ce122c8cSTomasz Sapeta      <ScrollView style={styles.scrollView} contentContainerStyle={styles.actionsContainer}>
40*ce122c8cSTomasz Sapeta        <Text style={styles.text}>
41*ce122c8cSTomasz Sapeta          At first let's make sure the disk cache is cleared{'\n'}
42*ce122c8cSTomasz Sapeta          ��
43*ce122c8cSTomasz Sapeta        </Text>
44*ce122c8cSTomasz Sapeta
45*ce122c8cSTomasz Sapeta        <Button
46*ce122c8cSTomasz Sapeta          style={styles.actionButton}
47*ce122c8cSTomasz Sapeta          title="Clear disk cache"
48*ce122c8cSTomasz Sapeta          onPress={Image.clearDiskCache}
49*ce122c8cSTomasz Sapeta        />
50*ce122c8cSTomasz Sapeta
51*ce122c8cSTomasz Sapeta        <Text style={styles.text}>
52*ce122c8cSTomasz Sapeta          Now load a new random source that{'\n'}
53*ce122c8cSTomasz Sapeta          uses the constant as a cache key.{'\n'}
54*ce122c8cSTomasz Sapeta          Do it multiple times and notice the image{'\n'}
55*ce122c8cSTomasz Sapeta          is not changing when the source changes{'\n'}
56*ce122c8cSTomasz Sapeta          ��
57*ce122c8cSTomasz Sapeta        </Text>
58*ce122c8cSTomasz Sapeta
59*ce122c8cSTomasz Sapeta        <Button
60*ce122c8cSTomasz Sapeta          disabled={isLoading}
61*ce122c8cSTomasz Sapeta          style={styles.actionButton}
62*ce122c8cSTomasz Sapeta          title="Set random source uri"
63*ce122c8cSTomasz Sapeta          onPress={loadRandomImage}
64*ce122c8cSTomasz Sapeta        />
65*ce122c8cSTomasz Sapeta      </ScrollView>
66*ce122c8cSTomasz Sapeta    </View>
67*ce122c8cSTomasz Sapeta  );
68*ce122c8cSTomasz Sapeta}
69*ce122c8cSTomasz Sapeta
70*ce122c8cSTomasz Sapetafunction getRandomImageUri(): string {
71*ce122c8cSTomasz Sapeta  const seed = 100 + Math.round(Math.random() * 100);
72*ce122c8cSTomasz Sapeta  return `https://picsum.photos/seed/${seed}/1200/800`;
73*ce122c8cSTomasz Sapeta}
74*ce122c8cSTomasz Sapeta
75*ce122c8cSTomasz Sapetaconst styles = StyleSheet.create({
76*ce122c8cSTomasz Sapeta  container: {
77*ce122c8cSTomasz Sapeta    flex: 1,
78*ce122c8cSTomasz Sapeta    padding: 20,
79*ce122c8cSTomasz Sapeta  },
80*ce122c8cSTomasz Sapeta  image: {
81*ce122c8cSTomasz Sapeta    height: 200,
82*ce122c8cSTomasz Sapeta    borderWidth: 1,
83*ce122c8cSTomasz Sapeta    borderColor: Colors.border,
84*ce122c8cSTomasz Sapeta  },
85*ce122c8cSTomasz Sapeta  scrollView: {
86*ce122c8cSTomasz Sapeta    marginTop: 10,
87*ce122c8cSTomasz Sapeta    borderTopWidth: 1,
88*ce122c8cSTomasz Sapeta    borderTopColor: Colors.border,
89*ce122c8cSTomasz Sapeta  },
90*ce122c8cSTomasz Sapeta  actionsContainer: {
91*ce122c8cSTomasz Sapeta    alignItems: 'center',
92*ce122c8cSTomasz Sapeta    padding: 10,
93*ce122c8cSTomasz Sapeta  },
94*ce122c8cSTomasz Sapeta  actionButton: {
95*ce122c8cSTomasz Sapeta    marginVertical: 15,
96*ce122c8cSTomasz Sapeta  },
97*ce122c8cSTomasz Sapeta  text: {
98*ce122c8cSTomasz Sapeta    marginTop: 15,
99*ce122c8cSTomasz Sapeta    color: Colors.secondaryText,
100*ce122c8cSTomasz Sapeta    textAlign: 'center',
101*ce122c8cSTomasz Sapeta  },
102*ce122c8cSTomasz Sapeta});
103