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