A fonctional ToDo app, Features comming soon

This commit is contained in:
Alexandre 2025-03-06 11:52:19 +01:00
parent f90472a9a1
commit d595ea1265
4 changed files with 2283 additions and 9 deletions

117
App.js
View File

@ -1,11 +1,78 @@
import { StatusBar } from 'expo-status-bar'; import { StatusBar } from "expo-status-bar";
import { StyleSheet, Text, View } from 'react-native'; import {
KeyboardAvoidingView,
Platform,
StyleSheet,
Text,
TextInput,
View,
TouchableOpacity,
Keyboard,
ScrollView,
} from "react-native";
import React, { useState } from "react";
import Task from "./components/Task";
export default function App() { export default function App() {
const [task, setTask] = useState();
const [taskItems, setTaskItems] = useState([]);
const handleAddTask = () => {
Keyboard.dismiss();
setTaskItems([...taskItems, task]);
setTask(null);
};
const completeTask = (index) => {
let itemsCopy = [...taskItems];
itemsCopy.splice(index, 1);
setTaskItems(itemsCopy);
};
return ( return (
<View style={styles.container}> <View style={styles.container}>
<Text>Open up App.js to start working on your app!</Text> <ScrollView
<StatusBar style="auto" /> contentContainerStyle={{
flexGrow: 1,
}}
keyboardShouldPersistTaps="handled"
>
{/* Today's Tasks */}
<View style={styles.tasksWrapper}>
<Text style={styles.sectionTitle}>Today's tasks</Text>
<View style={styles.items}>
{/* This is where the tasks will go! */}
{taskItems.map((item, index) => {
return (
<TouchableOpacity
key={index}
onPress={() => completeTask(index)}
>
<Task text={item} />
</TouchableOpacity>
);
})}
</View>
</View>
</ScrollView>
{/* Write a task */}
<KeyboardAvoidingView
behavior={Platform.OS == "ios" ? "padding" : "height"}
style={styles.writeTaskWrapper}
>
<TextInput
style={styles.input}
placeholder={"Write a task"}
value={task}
onChangeText={(text) => setTask(text)}
/>
<TouchableOpacity onPress={() => handleAddTask()}>
<View style={styles.addWrapper}>
<Text style={styles.addText}>+</Text>
</View>
</TouchableOpacity>
</KeyboardAvoidingView>
</View> </View>
); );
} }
@ -13,8 +80,44 @@ export default function App() {
const styles = StyleSheet.create({ const styles = StyleSheet.create({
container: { container: {
flex: 1, flex: 1,
backgroundColor: '#fff', backgroundColor: "#E8EAED",
alignItems: 'center', },
justifyContent: 'center', tasksWrapper: {
paddingTop: 80,
paddingHorizontal: 20,
},
sectionTitle: {
fontSize: 24,
fontWeight: "bold",
},
items: {
marginTop: 30,
},
writeTaskWrapper: {
position: "absolute",
bottom: 60,
width: "100%",
flexDirection: "row",
alignItems: "center",
justifyContent: "space-around",
},
input: {
paddingVertical: 15,
paddingHorizontal: 15,
backgroundColor: "#FFF",
borderRadius: 60,
borderColor: "#C0C0C0",
borderWidth: 1,
width: 250,
},
addWrapper: {
width: 60,
height: 60,
backgroundColor: "#FFF",
borderRadius: 60,
justifyContent: "center",
alignItems: "center",
borderColor: "#C0C0C0",
borderWidth: 1,
}, },
}); });

51
components/Task.js Normal file
View File

@ -0,0 +1,51 @@
import React from "react";
import { View, Text, StyleSheet } from "react-native";
const Task = (props) => {
return (
<View style={styles.item}>
<View style={styles.itemLeft}>
<View style={styles.square}></View>
<Text style={styles.itemText}>{props.text}</Text>
</View>
<View style={styles.circular}></View>
</View>
);
};
const styles = StyleSheet.create({
item: {
backgroundColor: "#FFF",
padding: 15,
borderRadius: 10,
flexDirection: "row",
alignItems: "center",
justifyContent: "space-between",
marginBottom: 20,
},
itemLeft: {
flexDirection: "row",
alignItems: "center",
flexWrap: "wrap",
},
square: {
width: 24,
height: 24,
backgroundColor: "#55BCF6",
opacity: 0.4,
borderRadius: 5,
marginRight: 15,
},
itemText: {
maxWidth: "80%",
},
circular: {
width: 12,
height: 12,
borderColor: "#55BCF6",
borderWidth: 2,
borderRadius: 5,
},
});
export default Task;

2121
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -16,7 +16,8 @@
"react-native": "0.76.7" "react-native": "0.76.7"
}, },
"devDependencies": { "devDependencies": {
"@babel/core": "^7.20.0" "@babel/core": "^7.20.0",
"@react-native-community/cli": "latest"
}, },
"private": true "private": true
} }