Refactor category type to use enum

This commit is contained in:
Walcher 2024-01-25 17:23:17 +01:00 committed by Jakob Stornig
parent 6ca505d505
commit bdc2ca22f6
6 changed files with 22 additions and 15 deletions

View file

@ -5,6 +5,7 @@ import { SafeAreaView } from 'react-native-safe-area-context';
import { AutoDecimalInput, CustomColorPicker, NavigationButton, TypeSelectorSwitch } from "../../../components"; import { AutoDecimalInput, CustomColorPicker, NavigationButton, TypeSelectorSwitch } from "../../../components";
import { addCategory } from "../../../services/database"; import { addCategory } from "../../../services/database";
import { useTheme } from "../../contexts/ThemeContext"; import { useTheme } from "../../contexts/ThemeContext";
import { CategoryType } from "../../../services/database";
export default function Page() { export default function Page() {
const {colors} = useTheme(); const {colors} = useTheme();
@ -13,7 +14,9 @@ export default function Page() {
const [categoryName, setCategoryName] = useState<string>(""); const [categoryName, setCategoryName] = useState<string>("");
const [categoryColor, setCategoryColor] = useState<string>('#' + Math.floor(Math.random()*16777215).toString(16)); const [categoryColor, setCategoryColor] = useState<string>('#' + Math.floor(Math.random()*16777215).toString(16));
const [selectedType, setSelectedType] = useState<string>("expense");
const [selectedType, setSelectedType] = useState<CategoryType>(CategoryType.EXPENSE);
const [amount, setAmount] = useState(0); const [amount, setAmount] = useState(0);
return ( return (
@ -35,7 +38,7 @@ export default function Page() {
<TypeSelectorSwitch <TypeSelectorSwitch
currentSelected={selectedType} currentSelected={selectedType}
handleButtonPress={(type) => { handleButtonPress={(type: CategoryType) => {
setSelectedType(type); setSelectedType(type);
}} }}
/> />

View file

@ -1,10 +1,11 @@
import { StyleSheet, Text, TouchableOpacity, View } from "react-native"; import { StyleSheet, Text, TouchableOpacity, View } from "react-native";
import { useTheme } from "../../app/contexts/ThemeContext"; import { useTheme } from "../../app/contexts/ThemeContext";
import { CategoryType } from "../../services/database";
export type TypeSelectorSwitchProperties = { export type TypeSelectorSwitchProperties = {
handleButtonPress: (type: string) => void, handleButtonPress: (type: CategoryType) => void,
currentSelected: string, currentSelected: CategoryType,
} }
const TypeSelectorSwitch = (properties: TypeSelectorSwitchProperties) => { const TypeSelectorSwitch = (properties: TypeSelectorSwitchProperties) => {
@ -14,17 +15,17 @@ const TypeSelectorSwitch = (properties: TypeSelectorSwitchProperties) => {
<View style={styles.containerStyle}> <View style={styles.containerStyle}>
<TouchableOpacity <TouchableOpacity
onPress={() => { onPress={() => {
properties.handleButtonPress("expense"); properties.handleButtonPress(CategoryType.EXPENSE);
}} }}
style={[styles.touchableOpacityStyle, properties.currentSelected == "expense" ? {backgroundColor: colors.accentColor} : {backgroundColor: colors.elementDefaultColor}] style={[styles.touchableOpacityStyle, properties.currentSelected == CategoryType.EXPENSE ? {backgroundColor: colors.accentColor} : {backgroundColor: colors.elementDefaultColor}]
}> }>
<Text style={[styles.textStyle, {color: colors.primaryText}]}>Expenses</Text> <Text style={[styles.textStyle, {color: colors.primaryText}]}>Expenses</Text>
</TouchableOpacity> </TouchableOpacity>
<TouchableOpacity <TouchableOpacity
onPress={() => { onPress={() => {
properties.handleButtonPress("saving"); properties.handleButtonPress(CategoryType.SAVING);
}} }}
style={[styles.touchableOpacityStyle, properties.currentSelected == "saving" ? {backgroundColor: colors.accentColor} : {backgroundColor: colors.elementDefaultColor}] style={[styles.touchableOpacityStyle, properties.currentSelected == CategoryType.SAVING ? {backgroundColor: colors.accentColor} : {backgroundColor: colors.elementDefaultColor}]
}> }>
<Text style={[styles.textStyle, {color: colors.primaryText}]}>Savings</Text> <Text style={[styles.textStyle, {color: colors.primaryText}]}>Savings</Text>
</TouchableOpacity> </TouchableOpacity>

View file

@ -2,6 +2,7 @@ import React, { useState, useEffect } from 'react';
import { View, Text, StyleSheet } from 'react-native'; import { View, Text, StyleSheet } from 'react-native';
import { useTheme } from '../../app/contexts/ThemeContext'; import { useTheme } from '../../app/contexts/ThemeContext';
import useFetch from '../../hooks/useFetch'; import useFetch from '../../hooks/useFetch';
import { CategoryType } from '../../services/database';
const BudgetOverview = () => { const BudgetOverview = () => {
const { colors } = useTheme(); const { colors } = useTheme();
@ -9,12 +10,12 @@ const BudgetOverview = () => {
const [budget, setBudget] = useState(0); const [budget, setBudget] = useState(0);
const spentQuery = { const spentQuery = {
sql: "SELECT SUM(e.amount) as total FROM expense e LEFT JOIN category c ON e.category_guid = c.guid WHERE c.type = 'budget'", sql: `SELECT SUM(e.amount) as total FROM expense e LEFT JOIN category c ON e.category_guid = c.guid WHERE c.type = '${CategoryType.EXPENSE.toString()}'`,
args: [] args: []
}; };
const budgetQuery = { const budgetQuery = {
sql: "SELECT SUM(allocated_amount) as total FROM category WHERE type = 'budget'", sql: `SELECT SUM(allocated_amount) as total FROM category WHERE type = '${CategoryType.EXPENSE.toString()}'`,
args: [] args: []
}; };

View file

@ -2,6 +2,7 @@ import React, { useState, useEffect } from 'react';
import { Text, StyleSheet } from 'react-native'; import { Text, StyleSheet } from 'react-native';
import { useTheme } from '../../app/contexts/ThemeContext'; import { useTheme } from '../../app/contexts/ThemeContext';
import useFetch from '../../hooks/useFetch'; import useFetch from '../../hooks/useFetch';
import { CategoryType } from '../../services/database';
const styles = StyleSheet.create({ const styles = StyleSheet.create({
text: { text: {
@ -23,7 +24,7 @@ const BudgetRemaining = () => {
}; };
const budgetQuery = { const budgetQuery = {
sql: "SELECT SUM(allocated_amount) as total FROM category WHERE type = 'budget'", sql: `SELECT SUM(allocated_amount) as total FROM category WHERE type = '${CategoryType.EXPENSE.toString()}'`,
args: [] args: []
}; };

View file

@ -2,6 +2,7 @@ import React, { useState, useEffect } from 'react';
import { View, Text, StyleSheet } from 'react-native'; import { View, Text, StyleSheet } from 'react-native';
import { useTheme } from '../../app/contexts/ThemeContext'; import { useTheme } from '../../app/contexts/ThemeContext';
import useFetch from '../../hooks/useFetch'; import useFetch from '../../hooks/useFetch';
import { CategoryType } from '../../services/database';
const SavingsOverview = () => { const SavingsOverview = () => {
const { colors } = useTheme(); const { colors } = useTheme();
@ -9,12 +10,12 @@ const SavingsOverview = () => {
const [goal, setGoal] = useState(0); const [goal, setGoal] = useState(0);
const savedQuery = { const savedQuery = {
sql: "SELECT SUM(e.amount) as total FROM expense e LEFT JOIN category c ON e.category_guid = c.guid WHERE c.type = 'savings'", sql: `SELECT SUM(e.amount) as total FROM expense e LEFT JOIN category c ON e.category_guid = c.guid WHERE c.type = '${CategoryType.SAVING.toString()}'`,
args: [] args: []
}; };
const goalQuery = { const goalQuery = {
sql: "SELECT SUM(allocated_amount) as total FROM category WHERE type = 'budget'", sql: `SELECT SUM(allocated_amount) as total FROM category WHERE type = '${CategoryType.SAVING.toString()}'`,
args: [] args: []
}; };

View file

@ -17,7 +17,7 @@ export const initDatabase = async () => {
try { try {
await db.transactionAsync(async (tx: SQLite.SQLTransactionAsync) => { await db.transactionAsync(async (tx: SQLite.SQLTransactionAsync) => {
await tx.executeSqlAsync( await tx.executeSqlAsync(
"CREATE TABLE IF NOT EXISTS category (guid VARCHAR(36) PRIMARY KEY, name TEXT, color TEXT, type TEXT, allocated_amount DOUBLE);" "CREATE TABLE IF NOT EXISTS category (guid VARCHAR(36) PRIMARY KEY, name TEXT, color TEXT, type string, allocated_amount DOUBLE);"
); );
await tx.executeSqlAsync( await tx.executeSqlAsync(
"CREATE TABLE IF NOT EXISTS expense (guid VARCHAR(36) PRIMARY KEY, name TEXT, category_guid VARCHAR(36), datetime DATETIME, amount DOUBLE, FOREIGN KEY (category_guid) REFERENCES category(guid));" "CREATE TABLE IF NOT EXISTS expense (guid VARCHAR(36) PRIMARY KEY, name TEXT, category_guid VARCHAR(36), datetime DATETIME, amount DOUBLE, FOREIGN KEY (category_guid) REFERENCES category(guid));"