๐ Major UI improvements
Changes
13 files changed, +208 -224
MODIFY
app.json
+1 -1
@@ -4,7 +4,7 @@
4
4
"slug": "taskflow",
5
5
"version": "1.0.0",
6
6
"orientation": "portrait",
7
- "icon": "./assets/images/icon.png",
7
+ "icon": "./assets/images/Logo.png",
8
8
"scheme": "taskflow",
9
9
"userInterfaceStyle": "automatic",
10
10
"newArchEnabled": true,
MODIFY
app/(tabs)/_layout.tsx
+4 -2
@@ -1,6 +1,7 @@
1
1
import { Tabs } from 'expo-router';
2
2
import React from 'react';
3
3
import { Ionicons } from '@expo/vector-icons';
4
+import { useSafeAreaInsets } from 'react-native-safe-area-context';
4
5
5
6
import { HapticTab } from '@/components/haptic-tab';
6
7
import { Colors } from '@/constants/theme';
@@ -8,6 +9,7 @@
8
9
9
10
export default function TabLayout() {
10
11
const colorScheme = useColorScheme();
12
+ const insets = useSafeAreaInsets();
11
13
12
14
return (
13
15
<Tabs
@@ -16,9 +18,9 @@
16
18
headerShown: false,
17
19
tabBarButton: HapticTab,
18
20
tabBarStyle: {
19
- paddingBottom: 8,
21
+ height: 60 + insets.bottom,
22
+ paddingBottom: insets.bottom,
20
23
paddingTop: 8,
21
- height: 60,
22
24
},
23
25
}}>
24
26
<Tabs.Screen
MODIFY
app/(tabs)/calendar.tsx
+42 -28
@@ -1,5 +1,6 @@
1
1
import React, { useEffect, useState } from 'react';
2
-import { StyleSheet, SafeAreaView, Alert, ScrollView, TouchableOpacity, View } from 'react-native';
2
+import { StyleSheet, Alert, ScrollView, TouchableOpacity, View } from 'react-native';
3
+import { SafeAreaView } from 'react-native-safe-area-context';
3
4
import { router, useFocusEffect } from 'expo-router';
4
5
import { ThemedView } from '@/components/themed-view';
5
6
import { ThemedText } from '@/components/themed-text';
@@ -161,19 +162,21 @@
161
162
]}
162
163
onPress={() => handleDateSelect(day)}
163
164
>
164
- <ThemedText style={[
165
- styles.dayText,
166
- isSelected && styles.selectedDayText,
167
- ]}>
168
- {day}
169
- </ThemedText>
170
- {taskCount > 0 && (
171
- <View style={[styles.taskBadge, { backgroundColor: isSelected ? '#fff' : colors.tint }]}>
172
- <ThemedText style={[styles.taskBadgeText, { color: isSelected ? colors.tint : '#fff' }]}>
173
- {taskCount}
174
- </ThemedText>
175
- </View>
176
- )}
165
+ <View style={styles.dayCellContent}>
166
+ <ThemedText style={[
167
+ styles.dayText,
168
+ isSelected && styles.selectedDayText,
169
+ ]}>
170
+ {day}
171
+ </ThemedText>
172
+ {taskCount > 0 && (
173
+ <View style={[styles.taskBadge, { backgroundColor: isSelected ? '#fff' : colors.tint }]}>
174
+ <ThemedText style={[styles.taskBadgeText, { color: isSelected ? colors.tint : '#fff' }]}>
175
+ {taskCount}
176
+ </ThemedText>
177
+ </View>
178
+ )}
179
+ </View>
177
180
</TouchableOpacity>
178
181
);
179
182
}
@@ -187,12 +190,13 @@
187
190
};
188
191
189
192
return (
190
- <SafeAreaView style={styles.container}>
191
- <ThemedView style={styles.header}>
192
- <ThemedText type="title">Calendar</ThemedText>
193
- </ThemedView>
193
+ <ThemedView style={styles.container}>
194
+ <SafeAreaView style={styles.safeArea} edges={['top']}>
195
+ <ThemedView style={styles.header}>
196
+ <ThemedText type="title">Calendar</ThemedText>
197
+ </ThemedView>
194
198
195
- <ThemedView style={styles.monthSelector}>
199
+ <ThemedView style={styles.monthSelector}>
196
200
<TouchableOpacity onPress={handlePrevMonth}>
197
201
<ThemedText style={[styles.monthButton, { color: colors.tint }]}>โ</ThemedText>
198
202
</TouchableOpacity>
@@ -226,7 +230,8 @@
226
230
</ScrollView>
227
231
228
232
<FabButton onPress={handleAddTask} />
229
- </SafeAreaView>
233
+ </SafeAreaView>
234
+ </ThemedView>
230
235
);
231
236
}
232
237
@@ -234,6 +239,9 @@
234
239
container: {
235
240
flex: 1,
236
241
},
242
+ safeArea: {
243
+ flex: 1,
244
+ },
237
245
header: {
238
246
paddingHorizontal: 16,
239
247
paddingTop: 16,
@@ -279,9 +287,12 @@
279
287
dayCell: {
280
288
width: `${100 / 7}%`,
281
289
aspectRatio: 1,
290
+ padding: 4,
291
+ },
292
+ dayCellContent: {
293
+ flex: 1,
282
294
justifyContent: 'center',
283
295
alignItems: 'center',
284
- padding: 4,
285
296
position: 'relative',
286
297
},
287
298
today: {
@@ -293,6 +304,7 @@
293
304
},
294
305
dayText: {
295
306
fontSize: 16,
307
+ textAlign: 'center',
296
308
},
297
309
selectedDayText: {
298
310
color: '#fff',
@@ -300,18 +312,20 @@
300
312
},
301
313
taskBadge: {
302
314
position: 'absolute',
303
- top: 4,
304
- right: 4,
305
- minWidth: 18,
306
- height: 18,
307
- borderRadius: 9,
315
+ top: 2,
316
+ right: 2,
317
+ minWidth: 16,
318
+ width: 16,
319
+ height: 16,
320
+ borderRadius: 8,
308
321
justifyContent: 'center',
309
322
alignItems: 'center',
310
- paddingHorizontal: 4,
311
323
},
312
324
taskBadgeText: {
313
- fontSize: 10,
325
+ fontSize: 9,
314
326
fontWeight: 'bold',
327
+ lineHeight: 9,
328
+ includeFontPadding: false,
315
329
},
316
330
tasksSection: {
317
331
marginTop: 24,
MODIFY
app/(tabs)/index.tsx
+66 -59
@@ -1,5 +1,6 @@
1
1
import React, { useEffect, useState } from 'react';
2
-import { StyleSheet, SafeAreaView, Alert, TouchableOpacity, ScrollView } from 'react-native';
2
+import { StyleSheet, Alert, TouchableOpacity, ScrollView, View } from 'react-native';
3
+import { SafeAreaView } from 'react-native-safe-area-context';
3
4
import { router, useFocusEffect } from 'expo-router';
4
5
import { ThemedView } from '@/components/themed-view';
5
6
import { ThemedText } from '@/components/themed-text';
@@ -64,65 +65,67 @@
64
65
const colors = Colors[colorScheme];
65
66
66
67
return (
67
- <SafeAreaView style={styles.container}>
68
- <ThemedView style={styles.header}>
69
- <ThemedText type="title">Inbox</ThemedText>
70
- <ThemedText style={styles.count}>{tasks.length} tasks</ThemedText>
71
- </ThemedView>
68
+ <ThemedView style={styles.container}>
69
+ <SafeAreaView style={styles.safeArea} edges={['top']}>
70
+ <ThemedView style={styles.header}>
71
+ <ThemedText type="title">Inbox</ThemedText>
72
+ <ThemedText style={styles.count}>{tasks.length} tasks</ThemedText>
73
+ </ThemedView>
72
74
73
- <ThemedView style={styles.filterContainer}>
74
- <ScrollView horizontal showsHorizontalScrollIndicator={false} contentContainerStyle={styles.filterScroll}>
75
- <TouchableOpacity
76
- style={[
77
- styles.filterButton,
78
- { borderColor: colors.border },
79
- statusFilter === 'all' && [styles.filterButtonActive, { backgroundColor: colors.tint, borderColor: colors.tint }],
80
- ]}
81
- onPress={() => setStatusFilter('all')}
82
- >
83
- <ThemedText style={[
84
- styles.filterText,
85
- statusFilter === 'all' && styles.filterTextActive,
86
- ]}>All</ThemedText>
87
- </TouchableOpacity>
88
- <TouchableOpacity
89
- style={[
90
- styles.filterButton,
91
- { borderColor: colors.border },
92
- statusFilter === 'waiting' && [styles.filterButtonActive, { backgroundColor: colors.tint, borderColor: colors.tint }],
93
- ]}
94
- onPress={() => setStatusFilter('waiting')}
95
- >
96
- <ThemedText style={[
97
- styles.filterText,
98
- statusFilter === 'waiting' && styles.filterTextActive,
99
- ]}>โณ Waiting</ThemedText>
100
- </TouchableOpacity>
101
- <TouchableOpacity
102
- style={[
103
- styles.filterButton,
104
- { borderColor: colors.border },
105
- statusFilter === 'someday' && [styles.filterButtonActive, { backgroundColor: colors.tint, borderColor: colors.tint }],
106
- ]}
107
- onPress={() => setStatusFilter('someday')}
108
- >
109
- <ThemedText style={[
110
- styles.filterText,
111
- statusFilter === 'someday' && styles.filterTextActive,
112
- ]}>๐ญ Someday</ThemedText>
113
- </TouchableOpacity>
114
- </ScrollView>
115
- </ThemedView>
116
-
117
- <TaskList
118
- tasks={tasks}
119
- onTaskPress={handleTaskPress}
120
- onToggleComplete={handleToggleComplete}
121
- emptyMessage="๐ Inbox is empty!"
122
- />
123
-
124
- <FabButton onPress={handleAddTask} />
125
- </SafeAreaView>
75
+ <ThemedView style={styles.filterContainer}>
76
+ <ScrollView horizontal showsHorizontalScrollIndicator={false} contentContainerStyle={styles.filterScroll}>
77
+ <TouchableOpacity
78
+ style={[
79
+ styles.filterButton,
80
+ { borderColor: colors.border },
81
+ statusFilter === 'all' && [styles.filterButtonActive, { backgroundColor: colors.tint, borderColor: colors.tint }],
82
+ ]}
83
+ onPress={() => setStatusFilter('all')}
84
+ >
85
+ <ThemedText style={[
86
+ styles.filterText,
87
+ statusFilter === 'all' && styles.filterTextActive,
88
+ ]}>All</ThemedText>
89
+ </TouchableOpacity>
90
+ <TouchableOpacity
91
+ style={[
92
+ styles.filterButton,
93
+ { borderColor: colors.border },
94
+ statusFilter === 'waiting' && [styles.filterButtonActive, { backgroundColor: colors.tint, borderColor: colors.tint }],
95
+ ]}
96
+ onPress={() => setStatusFilter('waiting')}
97
+ >
98
+ <ThemedText style={[
99
+ styles.filterText,
100
+ statusFilter === 'waiting' && styles.filterTextActive,
101
+ ]}>โณ Waiting</ThemedText>
102
+ </TouchableOpacity>
103
+ <TouchableOpacity
104
+ style={[
105
+ styles.filterButton,
106
+ { borderColor: colors.border },
107
+ statusFilter === 'someday' && [styles.filterButtonActive, { backgroundColor: colors.tint, borderColor: colors.tint }],
108
+ ]}
109
+ onPress={() => setStatusFilter('someday')}
110
+ >
111
+ <ThemedText style={[
112
+ styles.filterText,
113
+ statusFilter === 'someday' && styles.filterTextActive,
114
+ ]}>๐ญ Someday</ThemedText>
115
+ </TouchableOpacity>
116
+ </ScrollView>
117
+ </ThemedView>
118
+
119
+ <TaskList
120
+ tasks={tasks}
121
+ onTaskPress={handleTaskPress}
122
+ onToggleComplete={handleToggleComplete}
123
+ emptyMessage="๐ Inbox is empty!"
124
+ />
125
+
126
+ <FabButton onPress={handleAddTask} />
127
+ </SafeAreaView>
128
+ </ThemedView>
126
129
);
127
130
}
128
131
@@ -130,6 +133,9 @@
130
133
container: {
131
134
flex: 1,
132
135
},
136
+ safeArea: {
137
+ flex: 1,
138
+ },
133
139
header: {
134
140
paddingHorizontal: 16,
135
141
paddingTop: 16,
@@ -142,6 +148,7 @@
142
148
},
143
149
filterContainer: {
144
150
paddingVertical: 8,
151
+ paddingBottom: 4,
145
152
},
146
153
filterScroll: {
147
154
paddingHorizontal: 16,
MODIFY
app/(tabs)/projects.tsx
+32 -26
@@ -1,5 +1,6 @@
1
1
import React, { useEffect, useState } from 'react';
2
-import { StyleSheet, SafeAreaView, Alert, TouchableOpacity, FlatList, View } from 'react-native';
2
+import { StyleSheet, Alert, TouchableOpacity, FlatList, View } from 'react-native';
3
+import { SafeAreaView } from 'react-native-safe-area-context';
3
4
import { router, useFocusEffect } from 'expo-router';
4
5
import { ThemedView } from '@/components/themed-view';
5
6
import { ThemedText } from '@/components/themed-text';
@@ -71,32 +72,34 @@
71
72
);
72
73
73
74
return (
74
- <SafeAreaView style={styles.container}>
75
- <ThemedView style={styles.header}>
76
- <ThemedText type="title">Projects</ThemedText>
77
- <ThemedText style={styles.count}>{projects.length} projects</ThemedText>
78
- </ThemedView>
79
-
80
- {projects.length === 0 ? (
81
- <ThemedView style={styles.emptyContainer}>
82
- <ThemedText style={styles.emptyText}>
83
- ๐ No projects yet
84
- </ThemedText>
85
- <ThemedText style={styles.emptySubtext}>
86
- Create a project to organize your tasks
87
- </ThemedText>
75
+ <ThemedView style={styles.container}>
76
+ <SafeAreaView style={styles.safeArea} edges={['top']}>
77
+ <ThemedView style={styles.header}>
78
+ <ThemedText type="title">Projects</ThemedText>
79
+ <ThemedText style={styles.count}>{projects.length} projects</ThemedText>
88
80
</ThemedView>
89
- ) : (
90
- <FlatList
91
- data={projects}
92
- keyExtractor={(item) => item.id}
93
- renderItem={renderProject}
94
- contentContainerStyle={styles.list}
95
- />
96
- )}
97
-
98
- <FabButton onPress={handleAddProject} />
99
- </SafeAreaView>
81
+
82
+ {projects.length === 0 ? (
83
+ <ThemedView style={styles.emptyContainer}>
84
+ <ThemedText style={styles.emptyText}>
85
+ ๐ No projects yet
86
+ </ThemedText>
87
+ <ThemedText style={styles.emptySubtext}>
88
+ Create a project to organize your tasks
89
+ </ThemedText>
90
+ </ThemedView>
91
+ ) : (
92
+ <FlatList
93
+ data={projects}
94
+ keyExtractor={(item) => item.id}
95
+ renderItem={renderProject}
96
+ contentContainerStyle={styles.list}
97
+ />
98
+ )}
99
+
100
+ <FabButton onPress={handleAddProject} />
101
+ </SafeAreaView>
102
+ </ThemedView>
100
103
);
101
104
}
102
105
@@ -104,6 +107,9 @@
104
107
container: {
105
108
flex: 1,
106
109
},
110
+ safeArea: {
111
+ flex: 1,
112
+ },
107
113
header: {
108
114
paddingHorizontal: 16,
109
115
paddingTop: 16,
MODIFY
app/(tabs)/settings.tsx
+14 -8
@@ -1,5 +1,6 @@
1
1
import React, { useState } from 'react';
2
-import { StyleSheet, SafeAreaView, Alert, TouchableOpacity, ScrollView, Switch } from 'react-native';
2
+import { StyleSheet, Alert, TouchableOpacity, ScrollView, Switch } from 'react-native';
3
+import { SafeAreaView } from 'react-native-safe-area-context';
3
4
import { ThemedView } from '@/components/themed-view';
4
5
import { ThemedText } from '@/components/themed-text';
5
6
import { storageService, taskService } from '@/services';
@@ -85,12 +86,13 @@
85
86
};
86
87
87
88
return (
88
- <SafeAreaView style={styles.container}>
89
- <ThemedView style={styles.header}>
90
- <ThemedText type="title">Settings</ThemedText>
91
- </ThemedView>
92
-
93
- <ScrollView style={styles.scrollView}>
89
+ <ThemedView style={styles.container}>
90
+ <SafeAreaView style={styles.safeArea} edges={['top']}>
91
+ <ThemedView style={styles.header}>
92
+ <ThemedText type="title">Settings</ThemedText>
93
+ </ThemedView>
94
+
95
+ <ScrollView style={styles.scrollView}>
94
96
<ThemedView style={styles.section}>
95
97
<ThemedText type="subtitle" style={styles.sectionTitle}>Appearance</ThemedText>
96
98
@@ -210,7 +212,8 @@
210
212
</TouchableOpacity>
211
213
</ThemedView>
212
214
</ScrollView>
213
- </SafeAreaView>
215
+ </SafeAreaView>
216
+ </ThemedView>
214
217
);
215
218
}
216
219
@@ -218,6 +221,9 @@
218
221
container: {
219
222
flex: 1,
220
223
},
224
+ safeArea: {
225
+ flex: 1,
226
+ },
221
227
header: {
222
228
paddingHorizontal: 16,
223
229
paddingTop: 16,
MODIFY
app/(tabs)/today.tsx
+36 -94
@@ -1,5 +1,6 @@
1
1
import React, { useEffect, useState } from 'react';
2
-import { StyleSheet, SafeAreaView, Alert, ScrollView } from 'react-native';
2
+import { StyleSheet, Alert, ScrollView } from 'react-native';
3
+import { SafeAreaView } from 'react-native-safe-area-context';
3
4
import { router, useFocusEffect } from 'expo-router';
4
5
import { ThemedView } from '@/components/themed-view';
5
6
import { ThemedText } from '@/components/themed-text';
@@ -10,8 +11,6 @@
10
11
11
12
export default function TodayScreen() {
12
13
const [todayTasks, setTodayTasks] = useState<Task[]>([]);
13
- const [tomorrowTasks, setTomorrowTasks] = useState<Task[]>([]);
14
- const [overdueTasks, setOverdueTasks] = useState<Task[]>([]);
15
14
const [loading, setLoading] = useState(true);
16
15
17
16
useFocusEffect(
@@ -22,15 +21,8 @@
22
21
23
22
const loadTasks = async () => {
24
23
try {
25
- const [today, tomorrow, overdue] = await Promise.all([
26
- taskService.getTodayTasks(),
27
- taskService.getTomorrowTasks(),
28
- taskService.getOverdueTasks(),
29
- ]);
30
-
24
+ const today = await taskService.getTodayTasks();
31
25
setTodayTasks(today);
32
- setTomorrowTasks(tomorrow);
33
- setOverdueTasks(overdue);
34
26
} catch (error) {
35
27
Alert.alert('Error', 'Failed to load tasks');
36
28
} finally {
@@ -40,8 +32,7 @@
40
32
41
33
const handleToggleComplete = async (taskId: string) => {
42
34
try {
43
- const allTasks = [...overdueTasks, ...todayTasks, ...tomorrowTasks];
44
- const task = allTasks.find(t => t.id === taskId);
35
+ const task = todayTasks.find(t => t.id === taskId);
45
36
if (!task) return;
46
37
47
38
if (task.completed) {
@@ -61,70 +52,38 @@
61
52
};
62
53
63
54
const handleAddTask = () => {
64
- router.push('/task/new');
55
+ const today = new Date();
56
+ today.setHours(23, 59, 59, 999);
57
+ router.push({
58
+ pathname: '/task/new',
59
+ params: { dueDate: today.getTime().toString() },
60
+ });
65
61
};
66
62
67
63
return (
68
- <SafeAreaView style={styles.container}>
69
- <ThemedView style={styles.header}>
70
- <ThemedText type="title">Today</ThemedText>
71
- <ThemedText style={styles.date}>
72
- {new Date().toLocaleDateString('de-DE', {
73
- weekday: 'long',
74
- day: 'numeric',
75
- month: 'long'
76
- })}
77
- </ThemedText>
78
- </ThemedView>
79
-
80
- <ScrollView style={styles.scrollView}>
81
- {overdueTasks.length > 0 && (
82
- <ThemedView style={styles.section}>
83
- <ThemedText type="subtitle" style={styles.overdueTitle}>โ ๏ธ Overdue</ThemedText>
84
- <TaskList
85
- tasks={overdueTasks}
86
- onTaskPress={handleTaskPress}
87
- onToggleComplete={handleToggleComplete}
88
- scrollable={false}
89
- />
90
- </ThemedView>
91
- )}
92
-
93
- {todayTasks.length > 0 && (
94
- <ThemedView style={styles.section}>
95
- <ThemedText type="subtitle">Today</ThemedText>
96
- <TaskList
97
- tasks={todayTasks}
98
- onTaskPress={handleTaskPress}
99
- onToggleComplete={handleToggleComplete}
100
- scrollable={false}
101
- />
102
- </ThemedView>
103
- )}
104
-
105
- {tomorrowTasks.length > 0 && (
106
- <ThemedView style={styles.section}>
107
- <ThemedText type="subtitle">Tomorrow</ThemedText>
108
- <TaskList
109
- tasks={tomorrowTasks}
110
- onTaskPress={handleTaskPress}
111
- onToggleComplete={handleToggleComplete}
112
- scrollable={false}
113
- />
114
- </ThemedView>
115
- )}
116
-
117
- {overdueTasks.length === 0 && todayTasks.length === 0 && tomorrowTasks.length === 0 && (
118
- <ThemedView style={styles.emptyContainer}>
119
- <ThemedText style={styles.emptyText}>
120
- โ๏ธ All clear! No scheduled tasks.
121
- </ThemedText>
122
- </ThemedView>
123
- )}
124
- </ScrollView>
125
-
126
- <FabButton onPress={handleAddTask} />
127
- </SafeAreaView>
64
+ <ThemedView style={styles.container}>
65
+ <SafeAreaView style={styles.safeArea} edges={['top']}>
66
+ <ThemedView style={styles.header}>
67
+ <ThemedText type="title">Today</ThemedText>
68
+ <ThemedText style={styles.date}>
69
+ {new Date().toLocaleDateString('de-DE', {
70
+ weekday: 'long',
71
+ day: 'numeric',
72
+ month: 'long'
73
+ })}
74
+ </ThemedText>
75
+ </ThemedView>
76
+
77
+ <TaskList
78
+ tasks={todayTasks}
79
+ onTaskPress={handleTaskPress}
80
+ onToggleComplete={handleToggleComplete}
81
+ emptyMessage="โ๏ธ No tasks for today!"
82
+ />
83
+
84
+ <FabButton onPress={handleAddTask} />
85
+ </SafeAreaView>
86
+ </ThemedView>
128
87
);
129
88
}
130
89
@@ -132,6 +91,9 @@
132
91
container: {
133
92
flex: 1,
134
93
},
94
+ safeArea: {
95
+ flex: 1,
96
+ },
135
97
header: {
136
98
paddingHorizontal: 16,
137
99
paddingTop: 16,
@@ -142,24 +104,4 @@
142
104
opacity: 0.6,
143
105
marginTop: 4,
144
106
},
145
- scrollView: {
146
- flex: 1,
147
- },
148
- section: {
149
- marginBottom: 24,
150
- },
151
- overdueTitle: {
152
- color: '#ef4444',
153
- },
154
- emptyContainer: {
155
- flex: 1,
156
- justifyContent: 'center',
157
- alignItems: 'center',
158
- paddingVertical: 60,
159
- },
160
- emptyText: {
161
- fontSize: 16,
162
- opacity: 0.5,
163
- textAlign: 'center',
164
- },
165
107
});
MODIFY
app/_layout.tsx
+8 -3
@@ -1,6 +1,7 @@
1
1
import { DarkTheme, DefaultTheme, ThemeProvider as NavigationThemeProvider } from '@react-navigation/native';
2
2
import { Stack } from 'expo-router';
3
3
import { StatusBar } from 'expo-status-bar';
4
+import { SafeAreaProvider } from 'react-native-safe-area-context';
4
5
import 'react-native-reanimated';
5
6
6
7
import { useColorScheme } from '@/hooks/use-color-scheme';
@@ -17,6 +18,8 @@
17
18
<NavigationThemeProvider value={colorScheme === 'dark' ? DarkTheme : DefaultTheme}>
18
19
<Stack>
19
20
<Stack.Screen name="(tabs)" options={{ headerShown: false }} />
21
+ <Stack.Screen name="task/[id]" options={{ headerShown: false }} />
22
+ <Stack.Screen name="project/[id]" options={{ headerShown: false }} />
20
23
<Stack.Screen name="modal" options={{ presentation: 'modal', title: 'Modal' }} />
21
24
</Stack>
22
25
<StatusBar style="auto" />
@@ -26,8 +29,10 @@
26
29
27
30
export default function RootLayout() {
28
31
return (
29
- <ThemeProvider>
30
- <RootLayoutNav />
31
- </ThemeProvider>
32
+ <SafeAreaProvider>
33
+ <ThemeProvider>
34
+ <RootLayoutNav />
35
+ </ThemeProvider>
36
+ </SafeAreaProvider>
32
37
);
33
38
}
MODIFY
app/project/[id].tsx
+2 -1
@@ -1,5 +1,6 @@
1
1
import React, { useEffect, useState } from 'react';
2
-import { StyleSheet, SafeAreaView, Alert, ScrollView, TouchableOpacity, TextInput } from 'react-native';
2
+import { StyleSheet, Alert, ScrollView, TouchableOpacity, TextInput } from 'react-native';
3
+import { SafeAreaView } from 'react-native-safe-area-context';
3
4
import { router, useLocalSearchParams } from 'expo-router';
4
5
import { ThemedView } from '@/components/themed-view';
5
6
import { ThemedText } from '@/components/themed-text';
MODIFY
app/task/[id].tsx
+2 -1
@@ -1,5 +1,6 @@
1
1
import React, { useEffect, useState } from 'react';
2
-import { StyleSheet, SafeAreaView, Alert, ScrollView, TouchableOpacity, TextInput, Platform } from 'react-native';
2
+import { StyleSheet, Alert, ScrollView, TouchableOpacity, TextInput, Platform } from 'react-native';
3
+import { SafeAreaView } from 'react-native-safe-area-context';
3
4
import { router, useLocalSearchParams } from 'expo-router';
4
5
import { ThemedView } from '@/components/themed-view';
5
6
import { ThemedText } from '@/components/themed-text';
ADD
assets/images/Logo.png
+0 -0
0
0
Binary files differ
ADD
assets/images/Logo@2.png
+0 -0
0
0
Binary files differ
MODIFY
components/fab-button.tsx
+1 -1
@@ -27,7 +27,7 @@
27
27
fab: {
28
28
position: 'absolute',
29
29
right: 20,
30
- bottom: Platform.OS === 'ios' ? 90 : 80,
30
+ bottom: Platform.OS === 'ios' ? 20 : 20,
31
31
width: 56,
32
32
height: 56,
33
33
borderRadius: 28,