Skip to content

Commit 194905a

Browse files
committed
refactor app, add clear data and global reset
1 parent 9d89a88 commit 194905a

33 files changed

+673
-130
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ npm run dev:android
6060

6161
# Web App Screenshot
6262
<p align="center">
63-
<img src="preview-web.png" alt="Web app Screenshot example" height="300"/>
63+
<img src="preview-web.png" alt="Web app Screenshot example" height="300"/>
6464
</p>
6565

6666
# Run it on the web

app/_layout.tsx

Lines changed: 8 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,64 +1,35 @@
11
import { Slot } from 'expo-router';
22
import { SafeAreaView } from 'react-native-safe-area-context';
3-
import { Button, KeyboardAvoidingView, Platform, StyleSheet, View, Text } from 'react-native';
3+
import { KeyboardAvoidingView, Platform, StyleSheet } from 'react-native';
44
import React from 'react';
55
import AppDataProvider from '@/data/providers/AppDataProvider';
6-
import { PersistenceType } from '@/data/types';
6+
import store from '@/store';
7+
import { Provider as ReduxProvider } from 'react-redux';
78

8-
const enabledPersistenceTypes = Platform.select({
9-
web: [PersistenceType.localstorage, PersistenceType.indexedDB, PersistenceType.sqlite],
10-
default: [PersistenceType.localstorage, PersistenceType.sqlite],
11-
});
129
const Root = () => {
13-
const [persistenceType, setPersistenceType] = React.useState<PersistenceType>(
14-
Platform.select({ web: PersistenceType.indexedDB, default: PersistenceType.sqlite })
15-
);
16-
1710
return (
1811
<SafeAreaView style={styles.container}>
1912
<KeyboardAvoidingView
2013
behavior={Platform.OS === 'ios' ? 'padding' : 'height'}
2114
style={styles.keyboardView}>
22-
<AppDataProvider persistenceType={persistenceType}>
23-
<Text style={styles.title}>
24-
Persistence type: {persistenceType}, OS: {Platform.OS}
25-
</Text>
26-
<View style={styles.buttons}>
27-
{enabledPersistenceTypes.map((persistenceType) => (
28-
<Button
29-
key={persistenceType}
30-
title={persistenceType}
31-
onPress={() => setPersistenceType(persistenceType)}
32-
/>
33-
))}
34-
</View>
35-
<Slot />
36-
</AppDataProvider>
15+
<ReduxProvider store={store}>
16+
<AppDataProvider>
17+
<Slot />
18+
</AppDataProvider>
19+
</ReduxProvider>
3720
</KeyboardAvoidingView>
3821
</SafeAreaView>
3922
);
4023
};
4124

4225
const styles = StyleSheet.create({
43-
buttons: {
44-
flexDirection: 'row',
45-
justifyContent: 'space-around',
46-
alignSelf: 'center',
47-
width: Platform.select({ web: '50%', default: '100%' }),
48-
padding: 10,
49-
},
5026
container: {
5127
flex: 1,
5228
backgroundColor: '#f8f8f8',
5329
},
5430
keyboardView: {
5531
flex: 1,
5632
},
57-
title: {
58-
textAlign: 'center',
59-
fontSize: 20,
60-
padding: 10,
61-
},
6233
});
6334

6435
export default Root;

app/detail/[id].tsx

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,38 +5,28 @@ import { Button, StyleSheet, Text, View } from 'react-native';
55
import { useDataContext } from '@/data/DataContext';
66
import { useAppDispatch, useAppSelector } from '@/store';
77
import { removeTaskHandler, selectTask } from '@/store/taskSlice';
8+
import Header from '@/Header';
89

9-
const Page = () => {
10+
const Page: React.FC = () => {
1011
const { id } = useLocalSearchParams<{ id: string }>();
1112
const decodedId = parseInt(id);
1213
const { tasksClient } = useDataContext();
1314
const dispatch = useAppDispatch();
1415
const task = useAppSelector(selectTask(decodedId));
1516

16-
const goBack = () => {
17-
if (router.canGoBack()) {
18-
router.back();
19-
} else {
20-
router.push('/');
21-
}
22-
};
23-
2417
const handleDelete = async () => {
2518
dispatch(removeTaskHandler({ tasksClient, id: decodedId }));
26-
goBack();
19+
router.push('/');
2720
};
2821

2922
if (!task) {
3023
return <Unmatched />;
3124
}
3225
return (
3326
<View style={styles.root}>
34-
<View style={styles.taskItem}>
35-
<Button
36-
title="Go back"
37-
onPress={goBack}
38-
/>
39-
</View>
27+
<Header showBack={true}>
28+
<Text style={styles.taskText}>Task: {task.task}</Text>
29+
</Header>
4030
<View style={styles.taskItem}>
4131
<Text style={styles.taskText}>Task: {task.task}</Text>
4232
</View>

app/index.tsx

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,24 @@
1-
import { FlatList, Text, TextInput, TouchableOpacity, View } from 'react-native';
1+
import { FlatList, Text, TextInput, TouchableOpacity } from 'react-native';
22
import React, { useState } from 'react';
33
import { Task } from '@/types';
4-
import logger from '@/logger';
54
import type { ListRenderItem } from '@react-native/virtualized-lists';
65
import { router } from 'expo-router';
76
import globalStyles from '@/globalStyles';
87
import { useDataContext } from '@/data/DataContext';
98
import { useAppDispatch, useAppSelector } from '@/store';
109
import { addTaskHandler, selectTasksState } from '@/store/taskSlice';
10+
import Header from '@/Header';
11+
import Icon from '@expo/vector-icons/MaterialCommunityIcons';
1112

12-
const LandingPage = () => {
13-
const { tasksClient } = useDataContext();
13+
const LandingPage: React.FC = () => {
14+
const { taskClient } = useDataContext();
1415
const dispatch = useAppDispatch();
1516
const [newTask, setNewTask] = useState('');
1617
const tasks = useAppSelector(selectTasksState);
1718

1819
const addTask = async () => {
1920
if (newTask.trim()) {
20-
dispatch(addTaskHandler({ taskName: newTask, tasksClient }));
21+
dispatch(addTaskHandler({ taskName: newTask, taskClient }));
2122
setNewTask('');
2223
}
2324
};
@@ -35,21 +36,36 @@ const LandingPage = () => {
3536
data={tasks}
3637
keyExtractor={(item) => item.id.toString()}
3738
renderItem={renderItem}
38-
style={globalStyles.taskList}
39+
style={globalStyles.root}
3940
ListHeaderComponent={
40-
<View style={globalStyles.inputContainer}>
41+
<Header>
42+
<TouchableOpacity
43+
style={globalStyles.button}
44+
onPress={() => router.push('/settings')}>
45+
<Text style={globalStyles.buttonText}>
46+
<Icon
47+
name="cog"
48+
size={globalStyles.icon.fontSize}
49+
color={globalStyles.icon.color}
50+
/>
51+
</Text>
52+
</TouchableOpacity>
4153
<TextInput
4254
style={globalStyles.input}
4355
placeholder="Add a new task"
4456
value={newTask}
4557
onChangeText={setNewTask}
4658
/>
4759
<TouchableOpacity
48-
style={globalStyles.addButton}
60+
style={globalStyles.button}
4961
onPress={addTask}>
50-
<Text style={globalStyles.addButtonText}>Add</Text>
62+
<Icon
63+
name="plus"
64+
size={globalStyles.icon.fontSize}
65+
color={globalStyles.icon.color}
66+
/>
5167
</TouchableOpacity>
52-
</View>
68+
</Header>
5369
}
5470
/>
5571
);

app/settings.tsx

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import React from 'react';
2+
import { View, Text, StyleSheet, Platform, Button } from 'react-native';
3+
import { enabledPersistenceTypes } from '@/config';
4+
import { useAppDispatch, useAppSelector } from '@/store';
5+
import { changePersistence, selectedPersistence } from '@/store/settingsSlice';
6+
import Header from '@/Header';
7+
import globalStyles from '@/globalStyles';
8+
import { clearData } from '@/store/globalReset';
9+
import { useDataContext } from '@/data/DataContext';
10+
11+
const SettingsPage = () => {
12+
const dispatch = useAppDispatch();
13+
const persistenceType = useAppSelector(selectedPersistence);
14+
const { opsClient } = useDataContext();
15+
16+
return (
17+
<View style={globalStyles.root}>
18+
<Header showBack={true}>
19+
<Text style={globalStyles.headerText}>Settings</Text>
20+
</Header>
21+
<View style={styles.settingRow}>
22+
<Text>
23+
Persistence type: {persistenceType}, OS: {Platform.OS}
24+
</Text>
25+
{enabledPersistenceTypes.map((value) => (
26+
<Button
27+
key={value}
28+
title={value}
29+
onPress={() => dispatch(changePersistence({ value }))}
30+
/>
31+
))}
32+
<View style={globalStyles.divider} />
33+
<Text>Clear Data</Text>
34+
<Button
35+
title="Clear data"
36+
onPress={() => {
37+
dispatch(clearData({ opsClient }));
38+
}}
39+
/>
40+
</View>
41+
</View>
42+
);
43+
};
44+
45+
const styles = StyleSheet.create({
46+
settingRow: {
47+
alignItems: 'flex-start',
48+
gap: 5,
49+
padding: 16,
50+
},
51+
});
52+
53+
export default SettingsPage;

0 commit comments

Comments
 (0)