Initial commit

Generated by create-expo-app 3.2.0.
This commit is contained in:
Dennis Hundertmark
2025-02-25 11:38:57 +01:00
commit 0e7f7e1dfd
31 changed files with 18794 additions and 0 deletions
+68
View File
@@ -0,0 +1,68 @@
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,
},
});