diff --git a/src/components/AddExpenseForm.js b/src/components/AddExpenseForm.js index e83537a..ee1d2a8 100644 --- a/src/components/AddExpenseForm.js +++ b/src/components/AddExpenseForm.js @@ -13,24 +13,7 @@ const AddExpenseForm = (props) => { const [transactionType, setTransactionType] = useState('expenses'); useEffect(() => { - try { - fetch('https://api.bb.gabefarrell.com/w/budget', { - method: 'GET', - headers: { - 'x-session-key' : getSessionKey(), - } - }) - .then(response => response.json()) - .then(data => { - if (data.status != 200) { - console.log(data.error); - } else { - getCategoryList(); - } - }) - } catch(error) { - console.error(error); - } + getCategoryList(); }, [transactionType]) const toggleTransactionType = () => { @@ -42,32 +25,43 @@ const AddExpenseForm = (props) => { } const getCategoryList = () => { - fetch('https://api.bb.gabefarrell.com/w/budget', { - method: 'GET', - headers: { - 'x-session-key' : getSessionKey(), - } - }) - .then(response => response.json()) - .then(data => { - if (data.status != 200) { - console.log(data.error); - } else { - let categories = []; - - Object.values(data.expenses).map((transactions) => { - transactions.forEach(transaction => { - if (transaction.type == transactionType && !categories.includes(transaction.category)) { - categories.push(transaction.category) - } - }); - }); - - if (categories.length == 0) categories = ["Uncategorized"]; - setCategoryList(categories); - setCategory(categories[0]) - } - }) + if (transactionType == "expenses") { + fetch('https://api.bb.gabefarrell.com/w/budget', { + method: 'GET', + headers: { + 'x-session-key' : getSessionKey(), + } + }) + .then(response => response.json()) + .then(data => { + if (data.status != 200) { + console.log(data.error); + } else { + let categories = Object.keys(data.expenses_by_category).length > 0 ? Object.keys(data.expenses_by_category) : ["Uncategorized"]; + + setCategoryList(categories); + setCategory(categories[0]) + } + }) + } else { + fetch('https://api.bb.gabefarrell.com/w/income', { + method: 'GET', + headers: { + 'x-session-key' : getSessionKey(), + } + }) + .then(response => response.json()) + .then(data => { + if (data.status != 200) { + console.log(data.error); + } else { + let categories = Object.keys(data.income_by_category).length > 0 ? Object.keys(data.income_by_category) : ["Uncategorized"]; + + setCategoryList(categories); + setCategory(categories[0]) + } + }) + } }; const onSubmit = (event) => { @@ -91,8 +85,6 @@ const AddExpenseForm = (props) => { formData.append('whole', whole); formData.append('decimal', decimal); formData.append('type', transactionType) - - console.log(transactionType); try { fetch(`https://api.bb.gabefarrell.com/w/transactions?whole=${whole}&decimal=${decimal}¤cy=${currency}&category=${category}&type=${transactionType}`, { @@ -113,7 +105,6 @@ const AddExpenseForm = (props) => { } catch(error) { console.error(error); } - setCost(''); }; @@ -128,6 +119,10 @@ const AddExpenseForm = (props) => { } } + const quickSet = (event) => { + setCost(event.target.value) + } + return (
Loading...
diff --git a/src/components/CategorizedIncome.js b/src/components/CategorizedIncome.js index 9ff679e..9330b4a 100644 --- a/src/components/CategorizedIncome.js +++ b/src/components/CategorizedIncome.js @@ -8,13 +8,13 @@ import { Minimize } from "@material-ui/icons"; ChartJS.register(ArcElement, Tooltip, Legend); -export default function CategorizedIncome() { +export default function CategorizedExpenses(props) { const [chartData, setChartData] = useState(null); useEffect(() => { async function getChartData() { try { - fetch('https://api.bb.gabefarrell.com/w/budget', { + fetch('https://api.bb.gabefarrell.com/w/income', { method: 'GET', headers: { 'x-session-key' : getSessionKey(), @@ -24,28 +24,33 @@ export default function CategorizedIncome() { .then(data => { if (data.status != 200) { console.log(data.error); - } else { - + } else { const chartData = { - labels: Object.keys(data.income).length > 0 ? Object.keys(data.income) : [ "no income"], - datasets: [ - { - data: Object.values(data.income_by_category).map(category => { - return calculateValue(category); - }), - backgroundColor: [ - '#FFC857', - '#ED8146', - '#DB3A34', - '#5672C7', - ], - borderColor: [ - "white" - ], - borderWidth: 2, - }, - ], + labels: Object.keys(data.income_by_category).length > 0 ? Object.keys(data.income_by_category) : ["No income."], + datasets: [{ + data: Object.values(data.income_by_category).map((category) => { + return calculateValue(category); + }), + label: "Total cost", + backgroundColor: [ + '#61B06E', + '#8166CC', + '#ED8146', + '#B0BC63', + '#5672C7', + '#E45E3D', + '#FFC857', + '#5C919B', + '#DB3A34', + '#F6A54F' + ], + borderColor: [ + "white" + ], + borderWidth: 2, + }], } + setChartData(chartData); } }) diff --git a/src/components/QuickTransaction.js b/src/components/QuickTransaction.js new file mode 100644 index 0000000..e8525fd --- /dev/null +++ b/src/components/QuickTransaction.js @@ -0,0 +1,168 @@ +import React, { useContext, useEffect, useState } from 'react'; +import { AppContext } from '../context/AppContext'; +import { v4 as uuidv4 } from 'uuid'; +import './AddExpenseForm.css' +import { getSessionKey } from '../utils/utils.js' + +export default function QuickTransaction(props) { + const { dispatch } = useContext(AppContext); + + const [cost, setCost] = useState(''); + const [category, setCategory] = useState(''); + const [categoryList, setCategoryList] = useState([]); + const [transactionType, setTransactionType] = useState('expenses'); + + useEffect(() => { + getCategoryList(); + }, [transactionType]) + + const toggleTransactionType = () => { + if (transactionType == "expenses") { + setTransactionType("income"); + } else { + setTransactionType("expenses"); + } + } + + const getCategoryList = () => { + if (transactionType == "expenses") { + fetch('https://api.bb.gabefarrell.com/w/budget', { + method: 'GET', + headers: { + 'x-session-key' : getSessionKey(), + } + }) + .then(response => response.json()) + .then(data => { + if (data.status != 200) { + console.log(data.error); + } else { + let categories = Object.keys(data.expenses_by_category).length > 0 ? Object.keys(data.expenses_by_category) : ["Uncategorized"]; + + setCategoryList(categories); + setCategory(categories[0]) + } + }) + } else { + fetch('https://api.bb.gabefarrell.com/w/income', { + method: 'GET', + headers: { + 'x-session-key' : getSessionKey(), + } + }) + .then(response => response.json()) + .then(data => { + if (data.status != 200) { + console.log(data.error); + } else { + let categories = Object.keys(data.income_by_category).length > 0 ? Object.keys(data.income_by_category) : ["Uncategorized"]; + + setCategoryList(categories); + setCategory(categories[0]) + } + }) + } + }; + + const onSubmit = (event) => { + event.preventDefault(); + + const formData = new FormData(); + + let currency = "USD" + let whole = 0; + let decimal = 0; + + + if (cost.includes(".")) { + whole = parseInt(cost.split(".")[0]); + decimal = parseInt(cost.split(".")[1]); + } else { + whole = parseInt(cost); + } + formData.append('category', category) + formData.append('currency', currency); + formData.append('whole', whole); + formData.append('decimal', decimal); + formData.append('type', transactionType) + + try { + fetch(`https://api.bb.gabefarrell.com/w/transactions?whole=${whole}&decimal=${decimal}¤cy=${currency}&category=${category}&type=${transactionType}`, { + method: 'POST', + body: formData, + headers: { + 'x-session-key' : getSessionKey(), + } + }) + .then(response => response.json()) + .then(data => { + if (data.status != 200) { + console.log(data.error); + } else { + + } + }) + } catch(error) { + console.error(error); + } + setCost(''); + }; + + const handleAddCategory = () => { + const newCategory = prompt('Enter the new category name:'); + if (newCategory) { + if (categoryList.indexOf(newCategory) == -1) { + const newCategories = [...categoryList, newCategory]; + setCategoryList(newCategories); + } + setCategory(newCategory); + } + } + + return ( +