init commit
This commit is contained in:
parent
504e6772b1
commit
014ca66466
25 changed files with 20122 additions and 0 deletions
28
todo_app/.gitignore
vendored
Normal file
28
todo_app/.gitignore
vendored
Normal file
|
@ -0,0 +1,28 @@
|
|||
node_modules/
|
||||
.expo/
|
||||
dist/
|
||||
npm-debug.*
|
||||
*.jks
|
||||
*.p8
|
||||
*.p12
|
||||
*.key
|
||||
*.mobileprovision
|
||||
*.orig.*
|
||||
web-build/
|
||||
|
||||
# macOS
|
||||
.DS_Store
|
||||
|
||||
# @generated expo-cli sync-2b81b286409207a5da26e14c78851eb30d8ccbdb
|
||||
# The following patterns were generated by expo-cli
|
||||
|
||||
expo-env.d.ts
|
||||
|
||||
|
||||
api/index.js
|
||||
.env
|
||||
README.md
|
||||
scripts/*
|
||||
hooks/*
|
||||
constants/*
|
||||
components/*
|
0
todo_app/api/models/todo.js
Normal file
0
todo_app/api/models/todo.js
Normal file
30
todo_app/api/models/user.js
Normal file
30
todo_app/api/models/user.js
Normal file
|
@ -0,0 +1,30 @@
|
|||
const mongoose = require("mongoose");
|
||||
|
||||
const userSchema = new mongoose.Schema({
|
||||
name:{
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
email:{
|
||||
type: String,
|
||||
required: true,
|
||||
unique: true,
|
||||
},
|
||||
password:{
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
todos:[
|
||||
{
|
||||
type: mongoose.Schema.Types.ObjectId,
|
||||
ref: "Todo",
|
||||
}
|
||||
],
|
||||
createdAt:{
|
||||
type: Date,
|
||||
default: Date.now
|
||||
}
|
||||
});
|
||||
|
||||
const User = mongoose.model("User", userSchema);
|
||||
module.exports = User
|
1388
todo_app/api/package-lock.json
generated
Normal file
1388
todo_app/api/package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load diff
21
todo_app/api/package.json
Normal file
21
todo_app/api/package.json
Normal file
|
@ -0,0 +1,21 @@
|
|||
{
|
||||
"name": "api",
|
||||
"version": "1.0.0",
|
||||
"description": "server_side",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"start": "nodemon index.js",
|
||||
"test": "echo \"Error: no test specified\" && exit 1"
|
||||
},
|
||||
"author": "",
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"body-parser": "^1.20.2",
|
||||
"cors": "^2.8.5",
|
||||
"express": "^4.19.2",
|
||||
"jsonwebtoken": "^9.0.2",
|
||||
"mongodb": "^6.8.0",
|
||||
"mongoose": "^8.5.1",
|
||||
"nodemon": "^3.1.4"
|
||||
}
|
||||
}
|
36
todo_app/app.json
Normal file
36
todo_app/app.json
Normal file
|
@ -0,0 +1,36 @@
|
|||
{
|
||||
"expo": {
|
||||
"name": "todo_app",
|
||||
"slug": "todo_app",
|
||||
"version": "1.0.0",
|
||||
"orientation": "portrait",
|
||||
"icon": "./assets/images/icon.png",
|
||||
"scheme": "todo_app",
|
||||
"userInterfaceStyle": "automatic",
|
||||
"splash": {
|
||||
"image": "./assets/images/splash.png",
|
||||
"resizeMode": "contain",
|
||||
"backgroundColor": "#ffffff"
|
||||
},
|
||||
"ios": {
|
||||
"supportsTablet": true
|
||||
},
|
||||
"android": {
|
||||
"adaptiveIcon": {
|
||||
"foregroundImage": "./assets/images/adaptive-icon.png",
|
||||
"backgroundColor": "#ffffff"
|
||||
}
|
||||
},
|
||||
"web": {
|
||||
"bundler": "metro",
|
||||
"output": "static",
|
||||
"favicon": "./assets/images/favicon.png"
|
||||
},
|
||||
"plugins": [
|
||||
"expo-router"
|
||||
],
|
||||
"experiments": {
|
||||
"typedRoutes": true
|
||||
}
|
||||
}
|
||||
}
|
10
todo_app/app/(authenticate)/_layout.js
Normal file
10
todo_app/app/(authenticate)/_layout.js
Normal file
|
@ -0,0 +1,10 @@
|
|||
import {Stack} from "expo-router";
|
||||
|
||||
export default function Layout(){
|
||||
return(
|
||||
<Stack>
|
||||
<Stack.Screen name="login" options={{headerShown: false}}/>
|
||||
<Stack.Screen name="register" options={{headerShown: false}}/>
|
||||
</Stack>
|
||||
)
|
||||
}
|
57
todo_app/app/(authenticate)/login.js
Normal file
57
todo_app/app/(authenticate)/login.js
Normal file
|
@ -0,0 +1,57 @@
|
|||
import { StyleSheet, Text, View, SafeAreaView, KeyboardAvoidingView, Image, TextInput, Pressable } from 'react-native'
|
||||
import React, { useState } from 'react'
|
||||
import { Fontisto } from '@expo/vector-icons';
|
||||
import { Entypo } from '@expo/vector-icons';
|
||||
import { useRouter } from 'expo-router';
|
||||
|
||||
const login = () => {
|
||||
const [email, setEmail] = useState('');
|
||||
const [password, setPassword] = useState('');
|
||||
const router = useRouter();
|
||||
|
||||
return (
|
||||
<SafeAreaView style={{flex:1, backgroundColor: "white", alignItems: "center", justifyContent:"center"}}>
|
||||
<View>
|
||||
<View style={{alignItems: "center"}}>
|
||||
<Image
|
||||
style={{width: 150, height: 150, resizeMode: "containe"}}
|
||||
source={{
|
||||
uri:"./assets/images/logo.png",
|
||||
}}
|
||||
/>
|
||||
</View>
|
||||
<Text style={{fontSize: 24, fontWeight: 600, color: "#222831", marginTop: 20}}>Keep Tracking</Text>
|
||||
</View>
|
||||
<KeyboardAvoidingView>
|
||||
<View style={{alignItems: "center"}}>
|
||||
<Text style={{fontSize: 16, fontWeight: 600, color: "black", marginTop: 20}}>Welcome back!</Text>
|
||||
</View>
|
||||
<View style={{marginTop: 50}}>
|
||||
<View style={{flexDirection: "row", justifyContent: "center", alignItems: "center", gap:5, backgroundColor: "#EEEEEE", paddingHorizontal:10, borderRadius:5}}>
|
||||
<Fontisto name="email" size={16} color="#31363F" />
|
||||
<TextInput value={email} onChangeText={(text) => setEmail(text)} style={{color: "#31363F", width:250, outlineStyle: 'none', marginVertical: 10, fontSize:email ? 14 : 14}} placeholder='Enter your email'/>
|
||||
</View>
|
||||
<View style={{flexDirection: "row", justifyContent: "center", alignItems: "center", gap:5, backgroundColor: "#EEEEEE", paddingHorizontal:10, borderRadius:5, marginTop: 10}}>
|
||||
<Entypo name="key" size={16} color="#31363F" />
|
||||
<TextInput value={password} onChangeText={(text) => setPassword(text)} secureTextEntry={true} style={{color: "#31363F", width:250, outlineStyle: 'none', marginVertical: 10, fontSize:email ? 14 : 14}} placeholder='Enter your password'/>
|
||||
</View>
|
||||
<View style={{flexDirection: "row", alignItems: "center", justifyContent:"space-between", marginTop:10}}>
|
||||
<Text style={{fontSize: 12}}>Keep me login</Text>
|
||||
<Text style={{color: "#61677A", fontSize: 12}}>Forgot password?</Text>
|
||||
</View>
|
||||
<View style={{marginTop: 50}}/>
|
||||
<Pressable style={{backgroundColor: "#61677A", padding:10, borderRadius:5, alignItems: "center"}}>
|
||||
<Text style={{color: "#D8D9DA", fontSize: 16, fontWeight: 600}}>Login</Text>
|
||||
</Pressable>
|
||||
<Pressable onPress={() => router.replace("/register")} style={{marginTop: 10}}>
|
||||
<Text style={{fontSize: 12, textAlign:"center"}}>Don't have an account? <Text style={{fontWeight: 700}}>Register</Text></Text>
|
||||
</Pressable>
|
||||
</View>
|
||||
</KeyboardAvoidingView>
|
||||
</SafeAreaView>
|
||||
)
|
||||
}
|
||||
|
||||
export default login
|
||||
|
||||
const styles = StyleSheet.create({})
|
53
todo_app/app/(authenticate)/register.js
Normal file
53
todo_app/app/(authenticate)/register.js
Normal file
|
@ -0,0 +1,53 @@
|
|||
import { StyleSheet, Text, View, SafeAreaView, KeyboardAvoidingView, Image, TextInput, Pressable } from 'react-native'
|
||||
import React, { useState } from 'react'
|
||||
import { Fontisto } from '@expo/vector-icons';
|
||||
import { Entypo } from '@expo/vector-icons';
|
||||
import { useRouter } from 'expo-router';
|
||||
|
||||
const register = () => {
|
||||
const [email, setEmail] = useState('');
|
||||
const [password, setPassword] = useState('');
|
||||
const router = useRouter();
|
||||
|
||||
return (
|
||||
<SafeAreaView style={{flex:1, backgroundColor: "white", alignItems: "center", justifyContent:"center"}}>
|
||||
<View>
|
||||
<View style={{alignItems: "center"}}>
|
||||
<Image
|
||||
style={{width: 150, height: 150, resizeMode: "containe"}}
|
||||
source={{
|
||||
uri:"./assets/images/logo.png",
|
||||
}}
|
||||
/>
|
||||
</View>
|
||||
<Text style={{fontSize: 24, fontWeight: 600, color: "#222831", marginTop: 20}}>Keep Tracking</Text>
|
||||
</View>
|
||||
<KeyboardAvoidingView>
|
||||
<View style={{alignItems: "center"}}>
|
||||
<Text style={{fontSize: 16, fontWeight: 600, color: "black", marginTop: 20}}>Register</Text>
|
||||
</View>
|
||||
<View style={{marginTop: 50}}>
|
||||
<View style={{flexDirection: "row", justifyContent: "center", alignItems: "center", gap:5, backgroundColor: "#EEEEEE", paddingHorizontal:10, borderRadius:5}}>
|
||||
<Fontisto name="email" size={16} color="#31363F" />
|
||||
<TextInput value={email} onChangeText={(text) => setEmail(text)} style={{color: "#31363F", width:250, outlineStyle: 'none', marginVertical: 10, fontSize:email ? 14 : 14}} placeholder='Enter your email'/>
|
||||
</View>
|
||||
<View style={{flexDirection: "row", justifyContent: "center", alignItems: "center", gap:5, backgroundColor: "#EEEEEE", paddingHorizontal:10, borderRadius:5, marginTop: 10}}>
|
||||
<Entypo name="key" size={16} color="#31363F" />
|
||||
<TextInput value={password} onChangeText={(text) => setPassword(text)} secureTextEntry={true} style={{color: "#31363F", width:250, outlineStyle: 'none', marginVertical: 10, fontSize:email ? 14 : 14}} placeholder='Enter your password'/>
|
||||
</View>
|
||||
<View style={{marginTop: 50}}/>
|
||||
<Pressable style={{backgroundColor: "#61677A", padding:10, borderRadius:5, alignItems: "center"}}>
|
||||
<Text style={{color: "#D8D9DA", fontSize: 16, fontWeight: 600}}>Register</Text>
|
||||
</Pressable>
|
||||
<Pressable onPress={() => router.replace("/login")} style={{marginTop: 10}}>
|
||||
<Text style={{fontSize: 12, textAlign:"center"}}>Already have an account? <Text style={{fontWeight: 700}}>Login</Text></Text>
|
||||
</Pressable>
|
||||
</View>
|
||||
</KeyboardAvoidingView>
|
||||
</SafeAreaView>
|
||||
)
|
||||
}
|
||||
|
||||
export default register
|
||||
|
||||
const styles = StyleSheet.create({})
|
53
todo_app/app/(tabs)/_layout.js
Normal file
53
todo_app/app/(tabs)/_layout.js
Normal file
|
@ -0,0 +1,53 @@
|
|||
import {Tabs} from "expo-router";
|
||||
import { FontAwesome } from '@expo/vector-icons';
|
||||
import { AntDesign } from '@expo/vector-icons';
|
||||
import { MaterialCommunityIcons } from '@expo/vector-icons';
|
||||
|
||||
export default function Layout(){
|
||||
return(
|
||||
<Tabs>
|
||||
<Tabs.Screen
|
||||
name="home"
|
||||
options={{
|
||||
tabBarLabel:"Home",
|
||||
tabBarLabelStyle:{color:"black"},
|
||||
headerShown: false,
|
||||
tabBarIcon:({focused}) =>
|
||||
focused? (
|
||||
<FontAwesome name="tasks" size={24} color="black" />
|
||||
) : (
|
||||
<FontAwesome name="tasks" size={24} color="#45474B" />
|
||||
)
|
||||
}}
|
||||
/>
|
||||
<Tabs.Screen
|
||||
name="calendar"
|
||||
options={{
|
||||
tabBarLabel:"calendar",
|
||||
tabBarLabelStyle:{color:"black"},
|
||||
headerShown: false,
|
||||
tabBarIcon:({focused}) =>
|
||||
focused? (
|
||||
<AntDesign name="calendar" size={24} color="black" />
|
||||
) : (
|
||||
<AntDesign name="calendar" size={24} color="#45474B" />
|
||||
)
|
||||
}}
|
||||
/>
|
||||
<Tabs.Screen
|
||||
name="profile"
|
||||
options={{
|
||||
tabBarLabel:"profile",
|
||||
tabBarLabelStyle:{color:"black"},
|
||||
headerShown: false,
|
||||
tabBarIcon:({focused}) =>
|
||||
focused? (
|
||||
<MaterialCommunityIcons name="account-details" size={24} color="black" />
|
||||
) : (
|
||||
<MaterialCommunityIcons name="account-details" size={24} color="#45474B" />
|
||||
)
|
||||
}}
|
||||
/>
|
||||
</Tabs>
|
||||
)
|
||||
}
|
9
todo_app/app/(tabs)/calendar/_layout.js
Normal file
9
todo_app/app/(tabs)/calendar/_layout.js
Normal file
|
@ -0,0 +1,9 @@
|
|||
import {Stack} from "expo-router";
|
||||
|
||||
export default function Layout(){
|
||||
return(
|
||||
<Stack screenOptions={{headerShown:false}}>
|
||||
<Stack.Screen name="index"/>
|
||||
</Stack>
|
||||
)
|
||||
}
|
14
todo_app/app/(tabs)/calendar/index.js
Normal file
14
todo_app/app/(tabs)/calendar/index.js
Normal file
|
@ -0,0 +1,14 @@
|
|||
import { StyleSheet, Text, View } from 'react-native'
|
||||
import React from 'react'
|
||||
|
||||
const index = () => {
|
||||
return (
|
||||
<View>
|
||||
<Text>index</Text>
|
||||
</View>
|
||||
)
|
||||
}
|
||||
|
||||
export default index
|
||||
|
||||
const styles = StyleSheet.create({})
|
9
todo_app/app/(tabs)/home/_layout.js
Normal file
9
todo_app/app/(tabs)/home/_layout.js
Normal file
|
@ -0,0 +1,9 @@
|
|||
import {Stack} from "expo-router";
|
||||
|
||||
export default function Layout(){
|
||||
return(
|
||||
<Stack screenOptions={{headerShown:false}}>
|
||||
<Stack.Screen name="index"/>
|
||||
</Stack>
|
||||
)
|
||||
}
|
51
todo_app/app/(tabs)/home/index.js
Normal file
51
todo_app/app/(tabs)/home/index.js
Normal file
|
@ -0,0 +1,51 @@
|
|||
import { Image, Pressable, ScrollView, StyleSheet, Text, View } from 'react-native'
|
||||
import React from 'react'
|
||||
import { AntDesign } from '@expo/vector-icons';
|
||||
|
||||
const index = () => {
|
||||
const todo = [
|
||||
|
||||
];
|
||||
return (
|
||||
<>
|
||||
<View style={{marginHorizontal:20, marginVertical:20, alignItems: "center", flexDirection: "row", gap: 10}}>
|
||||
<Pressable style={{backgroundColor: "#000000", paddingHorizontal:10, paddingVertical: 5, borderRadius:25, alignItems: "center", justifyContent: "center"}}>
|
||||
<Text style={{color: "white", textAlign: "center"}}>All</Text>
|
||||
</Pressable>
|
||||
<Pressable style={{backgroundColor: "#000000", paddingHorizontal:10, paddingVertical: 5, borderRadius:25, alignItems: "center", justifyContent: "center"}}>
|
||||
<Text style={{color: "white", textAlign: "center"}}>Work</Text>
|
||||
</Pressable>
|
||||
<Pressable style={{backgroundColor: "#000000", paddingHorizontal:10, paddingVertical: 5, borderRadius:25, alignItems: "center", justifyContent: "center", marginRight: "auto"}}>
|
||||
<Text style={{color: "white", textAlign: "center"}}>Personal</Text>
|
||||
</Pressable>
|
||||
<Pressable>
|
||||
<AntDesign name="plus" size={24} color="black" />
|
||||
</Pressable>
|
||||
</View>
|
||||
<ScrollView style={{flex:1, backgroundColor: "white"}}>
|
||||
<View style={{padding: 10}}>
|
||||
{todo?.length > 0 ? (
|
||||
<View></View>
|
||||
) : (
|
||||
<View style={{flex:1, justifyContent:"center", alignItems:"center", marginTop:150, marginLeft:"auto", marginRight:"auto"}}>
|
||||
<Image
|
||||
style={{width: 100, height: 100, resizeMode: "containe"}}
|
||||
source={{
|
||||
uri:"./assets/images/to-do.png",
|
||||
}}
|
||||
/>
|
||||
<Text style={{fontSize:16, fontWeight:600, marginTop: 20, textAlign:"center"}}>Hooray! No task for today</Text>
|
||||
<Pressable style={{backgroundColor: "black", marginTop: 20, padding:5, borderRadius: 5}}>
|
||||
<Text style={{fontSize:16, fontWeight:600, textAlign:"center", color: "white"}}>Add task <AntDesign name="plus" size={16} color="white" /></Text>
|
||||
</Pressable>
|
||||
</View>
|
||||
)}
|
||||
</View>
|
||||
</ScrollView>
|
||||
</>
|
||||
)
|
||||
}
|
||||
|
||||
export default index
|
||||
|
||||
const styles = StyleSheet.create({})
|
9
todo_app/app/(tabs)/profile/_layout.js
Normal file
9
todo_app/app/(tabs)/profile/_layout.js
Normal file
|
@ -0,0 +1,9 @@
|
|||
import {Stack} from "expo-router";
|
||||
|
||||
export default function Layout(){
|
||||
return(
|
||||
<Stack screenOptions={{headerShown:false}}>
|
||||
<Stack.Screen name="index"/>
|
||||
</Stack>
|
||||
)
|
||||
}
|
14
todo_app/app/(tabs)/profile/index.js
Normal file
14
todo_app/app/(tabs)/profile/index.js
Normal file
|
@ -0,0 +1,14 @@
|
|||
import { StyleSheet, Text, View } from 'react-native'
|
||||
import React from 'react'
|
||||
|
||||
const index = () => {
|
||||
return (
|
||||
<View>
|
||||
<Text>index</Text>
|
||||
</View>
|
||||
)
|
||||
}
|
||||
|
||||
export default index
|
||||
|
||||
const styles = StyleSheet.create({})
|
13
todo_app/app/index.js
Normal file
13
todo_app/app/index.js
Normal file
|
@ -0,0 +1,13 @@
|
|||
import { StyleSheet, Text, View } from "react-native";
|
||||
import React from 'react';
|
||||
import { Redirect } from "expo-router";
|
||||
|
||||
const index = () => {
|
||||
return (
|
||||
<Redirect href="/(authenticate)/login"/>
|
||||
)
|
||||
}
|
||||
|
||||
export default index
|
||||
|
||||
const styles = StyleSheet.create({})
|
BIN
todo_app/assets/fonts/SpaceMono-Regular.ttf
Executable file
BIN
todo_app/assets/fonts/SpaceMono-Regular.ttf
Executable file
Binary file not shown.
BIN
todo_app/assets/images/list.png
Normal file
BIN
todo_app/assets/images/list.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 35 KiB |
BIN
todo_app/assets/images/logo.png
Normal file
BIN
todo_app/assets/images/logo.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 24 KiB |
BIN
todo_app/assets/images/to-do.png
Normal file
BIN
todo_app/assets/images/to-do.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 17 KiB |
6
todo_app/babel.config.js
Normal file
6
todo_app/babel.config.js
Normal file
|
@ -0,0 +1,6 @@
|
|||
module.exports = function (api) {
|
||||
api.cache(true);
|
||||
return {
|
||||
presets: ['babel-preset-expo'],
|
||||
};
|
||||
};
|
18255
todo_app/package-lock.json
generated
Normal file
18255
todo_app/package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load diff
49
todo_app/package.json
Normal file
49
todo_app/package.json
Normal file
|
@ -0,0 +1,49 @@
|
|||
{
|
||||
"name": "todo_app",
|
||||
"main": "expo-router/entry",
|
||||
"version": "1.0.0",
|
||||
"scripts": {
|
||||
"start": "expo start",
|
||||
"reset-project": "node ./scripts/reset-project.js",
|
||||
"android": "expo start --android",
|
||||
"ios": "expo start --ios",
|
||||
"web": "expo start --web",
|
||||
"test": "jest --watchAll",
|
||||
"lint": "expo lint"
|
||||
},
|
||||
"jest": {
|
||||
"preset": "jest-expo"
|
||||
},
|
||||
"dependencies": {
|
||||
"@expo/vector-icons": "^14.0.2",
|
||||
"@react-navigation/native": "^6.0.2",
|
||||
"expo": "~51.0.20",
|
||||
"expo-constants": "~16.0.2",
|
||||
"expo-font": "~12.0.8",
|
||||
"expo-linking": "~6.3.1",
|
||||
"expo-router": "~3.5.18",
|
||||
"expo-splash-screen": "~0.27.5",
|
||||
"expo-status-bar": "~1.12.1",
|
||||
"expo-system-ui": "~3.0.7",
|
||||
"expo-web-browser": "~13.0.3",
|
||||
"react": "18.2.0",
|
||||
"react-dom": "18.2.0",
|
||||
"react-native": "0.74.3",
|
||||
"react-native-gesture-handler": "~2.16.1",
|
||||
"react-native-reanimated": "~3.10.1",
|
||||
"react-native-safe-area-context": "4.10.1",
|
||||
"react-native-screens": "3.31.1",
|
||||
"react-native-web": "~0.19.10"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/core": "^7.20.0",
|
||||
"@types/jest": "^29.5.12",
|
||||
"@types/react": "~18.2.45",
|
||||
"@types/react-test-renderer": "^18.0.7",
|
||||
"jest": "^29.2.1",
|
||||
"jest-expo": "~51.0.3",
|
||||
"react-test-renderer": "18.2.0",
|
||||
"typescript": "~5.3.3"
|
||||
},
|
||||
"private": true
|
||||
}
|
17
todo_app/tsconfig.json
Normal file
17
todo_app/tsconfig.json
Normal file
|
@ -0,0 +1,17 @@
|
|||
{
|
||||
"extends": "expo/tsconfig.base",
|
||||
"compilerOptions": {
|
||||
"strict": true,
|
||||
"paths": {
|
||||
"@/*": [
|
||||
"./*"
|
||||
]
|
||||
}
|
||||
},
|
||||
"include": [
|
||||
"**/*.ts",
|
||||
"**/*.tsx",
|
||||
".expo/types/**/*.ts",
|
||||
"expo-env.d.ts"
|
||||
]
|
||||
}
|
Loading…
Add table
Reference in a new issue