0e7f7e1dfd
Generated by create-expo-app 3.2.0.
69 lines
1.7 KiB
TypeScript
69 lines
1.7 KiB
TypeScript
import FilmItem from "@/components/FilmItem";
|
|
import ListEmptyComponent from "@/components/ListEmptyComponent";
|
|
import { COLORS } from "@/constants/colors";
|
|
import { Film } from "@/types/film";
|
|
import React, { useEffect } from "react";
|
|
import { FlatList, RefreshControl, StyleSheet, View } from "react-native";
|
|
|
|
const Page = () => {
|
|
const [films, setFilms] = React.useState<Film[]>([]);
|
|
const [refreshing, setRefreshing] = React.useState(false);
|
|
const [loading, setLoading] = React.useState(false);
|
|
|
|
const fetchFilms = async () => {
|
|
try {
|
|
setLoading(true);
|
|
const response = await fetch("https://swapi.dev/api/films/");
|
|
const data = await response.json();
|
|
setFilms(data.results);
|
|
} catch (error) {
|
|
console.error(error);
|
|
} finally {
|
|
setLoading(false);
|
|
setRefreshing(false);
|
|
}
|
|
};
|
|
|
|
useEffect(() => {
|
|
fetchFilms();
|
|
}, []);
|
|
|
|
const onRefresh = () => {
|
|
setRefreshing(true);
|
|
fetchFilms();
|
|
};
|
|
|
|
return (
|
|
<View style={styles.container}>
|
|
<FlatList
|
|
data={films}
|
|
keyExtractor={(item) => item.episode_id.toString()}
|
|
renderItem={({ item }) => <FilmItem item={item} />}
|
|
refreshControl={
|
|
<RefreshControl
|
|
refreshing={refreshing}
|
|
onRefresh={onRefresh}
|
|
tintColor={COLORS.text}
|
|
/>
|
|
}
|
|
ListEmptyComponent={
|
|
<ListEmptyComponent loading={loading} message="No films found" />
|
|
}
|
|
/>
|
|
</View>
|
|
);
|
|
};
|
|
|
|
export default Page;
|
|
|
|
const styles = StyleSheet.create({
|
|
container: {
|
|
flex: 1,
|
|
backgroundColor: COLORS.containerBackground,
|
|
},
|
|
item: {
|
|
padding: 16,
|
|
borderBottomWidth: 1,
|
|
},
|
|
});
|