├── public ├── robots.txt ├── favicon.ico ├── logo192.png ├── logo512.png ├── manifest.json └── index.html ├── src ├── components │ ├── UI │ │ ├── Card.css │ │ └── Card.js │ ├── Expenses │ │ ├── Expenses.css │ │ ├── ExpensesList.css │ │ ├── ExpenseDate.css │ │ ├── ExpenseDate.js │ │ ├── ExpensesList.js │ │ ├── ExpenseItem.js │ │ ├── ExpensesChart.js │ │ ├── Expenses.js │ │ └── ExpenseItem.css │ ├── Chart │ │ ├── Chart.css │ │ ├── Chart.js │ │ ├── ChartBar.js │ │ └── ChartBar.css │ ├── ExpensesFilter │ │ ├── ExpensesFilter.css │ │ └── ExpensesFilter.js │ └── NewExpense │ │ ├── ExpenseForm.css │ │ ├── NewExpense.css │ │ ├── NewExpense.js │ │ └── ExpenseForm.js ├── index.js ├── index.css └── App.js ├── .idea ├── .gitignore ├── vcs.xml ├── inspectionProfiles │ └── Project_Default.xml ├── modules.xml └── 01-starting-setup.iml ├── .gitignore ├── package.json └── .eslintcache /public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/somekindofwallflower/expenses-react-project/master/public/favicon.ico -------------------------------------------------------------------------------- /public/logo192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/somekindofwallflower/expenses-react-project/master/public/logo192.png -------------------------------------------------------------------------------- /public/logo512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/somekindofwallflower/expenses-react-project/master/public/logo512.png -------------------------------------------------------------------------------- /src/components/UI/Card.css: -------------------------------------------------------------------------------- 1 | .card { 2 | border-radius: 12px; 3 | box-shadow: 0 1px 8px rgba(0, 0, 0, 0.25); 4 | } 5 | -------------------------------------------------------------------------------- /.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /shelf/ 3 | /workspace.xml 4 | # Editor-based HTTP Client requests 5 | /httpRequests/ 6 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | import ReactDOM from 'react-dom'; 2 | 3 | import './index.css'; 4 | import App from './App'; 5 | 6 | ReactDOM.render(, document.getElementById('root')); 7 | -------------------------------------------------------------------------------- /src/components/Expenses/Expenses.css: -------------------------------------------------------------------------------- 1 | .expenses { 2 | padding: 1rem; 3 | background-color: rgb(31, 31, 31); 4 | margin: 2rem auto; 5 | width: 50rem; 6 | max-width: 95%; 7 | } 8 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/components/Expenses/ExpensesList.css: -------------------------------------------------------------------------------- 1 | .expenses-list { 2 | list-style: none; 3 | padding: 0; 4 | } 5 | 6 | .expenses-list__fallback { 7 | color: white; 8 | text-align: center; 9 | } 10 | -------------------------------------------------------------------------------- /src/components/UI/Card.js: -------------------------------------------------------------------------------- 1 | import './Card.css' 2 | 3 | const Card = (props) => { 4 | const classes = 'card ' + props.className 5 | return
{props.children}
6 | } 7 | 8 | export default Card 9 | -------------------------------------------------------------------------------- /src/components/Chart/Chart.css: -------------------------------------------------------------------------------- 1 | .chart { 2 | padding: 1rem; 3 | border-radius: 12px; 4 | background-color: #f8dfff; 5 | text-align: center; 6 | display: flex; 7 | justify-content: space-around; 8 | height: 10rem; 9 | } 10 | -------------------------------------------------------------------------------- /.idea/inspectionProfiles/Project_Default.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | -------------------------------------------------------------------------------- /src/index.css: -------------------------------------------------------------------------------- 1 | @import url('https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;700&display=swap'); 2 | 3 | * { 4 | box-sizing: border-box; 5 | } 6 | 7 | html { 8 | font-family: 'Noto Sans JP', sans-serif; 9 | } 10 | 11 | body { 12 | margin: 0; 13 | background-color: #3f3f3f; 14 | } 15 | 16 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | .vscode 3 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 4 | 5 | # dependencies 6 | /node_modules 7 | /.pnp 8 | .pnp.js 9 | 10 | # testing 11 | /coverage 12 | 13 | # production 14 | /build 15 | 16 | # misc 17 | .DS_Store 18 | .env.local 19 | .env.development.local 20 | .env.test.local 21 | .env.production.local 22 | 23 | npm-debug.log* 24 | yarn-debug.log* 25 | yarn-error.log* 26 | -------------------------------------------------------------------------------- /.idea/01-starting-setup.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /src/components/ExpensesFilter/ExpensesFilter.css: -------------------------------------------------------------------------------- 1 | .expenses-filter { 2 | color: white; 3 | padding: 0 1rem; 4 | } 5 | 6 | .expenses-filter__control { 7 | display: flex; 8 | width: 100%; 9 | align-items: center; 10 | justify-content: space-between; 11 | margin: 1rem 0; 12 | } 13 | 14 | .expenses-filter label { 15 | font-weight: bold; 16 | margin-bottom: 0.5rem; 17 | } 18 | 19 | .expenses-filter select { 20 | font: inherit; 21 | padding: 0.5rem 3rem; 22 | font-weight: bold; 23 | border-radius: 6px; 24 | } 25 | -------------------------------------------------------------------------------- /src/components/NewExpense/ExpenseForm.css: -------------------------------------------------------------------------------- 1 | .new-expense__controls { 2 | display: flex; 3 | flex-wrap: wrap; 4 | gap: 1rem; 5 | margin-bottom: 1rem; 6 | text-align: left; 7 | } 8 | 9 | .new-expense__control label { 10 | font-weight: bold; 11 | margin-bottom: 0.5rem; 12 | display: block; 13 | } 14 | 15 | .new-expense__control input { 16 | font: inherit; 17 | padding: 0.5rem; 18 | border-radius: 6px; 19 | border: 1px solid #ccc; 20 | width: 20rem; 21 | max-width: 100%; 22 | } 23 | 24 | .new-expense__actions { 25 | text-align: right; 26 | } 27 | -------------------------------------------------------------------------------- /src/components/Expenses/ExpenseDate.css: -------------------------------------------------------------------------------- 1 | .expense-date { 2 | display: flex; 3 | flex-direction: column; 4 | width: 5.5rem; 5 | height: 5.5rem; 6 | border: 1px solid #ececec; 7 | background-color: #2a2a2a; 8 | color: white; 9 | border-radius: 12px; 10 | align-items: center; 11 | justify-content: center; 12 | } 13 | 14 | .expense-date__month { 15 | font-size: 0.75rem; 16 | font-weight: bold; 17 | } 18 | 19 | .expense-date__year { 20 | font-size: 0.75rem; 21 | } 22 | 23 | .expense-date__day { 24 | font-size: 1.5rem; 25 | font-weight: bold; 26 | } 27 | -------------------------------------------------------------------------------- /public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "React App", 3 | "name": "Create React App Sample", 4 | "icons": [ 5 | { 6 | "src": "favicon.ico", 7 | "sizes": "64x64 32x32 24x24 16x16", 8 | "type": "image/x-icon" 9 | }, 10 | { 11 | "src": "logo192.png", 12 | "type": "image/png", 13 | "sizes": "192x192" 14 | }, 15 | { 16 | "src": "logo512.png", 17 | "type": "image/png", 18 | "sizes": "512x512" 19 | } 20 | ], 21 | "start_url": ".", 22 | "display": "standalone", 23 | "theme_color": "#000000", 24 | "background_color": "#ffffff" 25 | } 26 | -------------------------------------------------------------------------------- /src/components/Expenses/ExpenseDate.js: -------------------------------------------------------------------------------- 1 | import './ExpenseDate.css' 2 | 3 | const ExpenseDate = (props) => { 4 | const month = props.date.toLocaleString('en-US', {month: 'long'}) 5 | const day = props.date.toLocaleString('en-US', {day: '2-digit'}) 6 | const year = props.date.getFullYear() 7 | 8 | return ( 9 |
10 |
{month}
11 |
{year}
12 |
{day}
13 |
14 | ) 15 | } 16 | 17 | export default ExpenseDate 18 | -------------------------------------------------------------------------------- /src/components/Chart/Chart.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import './Chart.css' 3 | import ChartBar from "./ChartBar"; 4 | const Chart = (props) => { 5 | const dataPointsValue = props.dataPoints.map((dataPoint) => dataPoint.value) 6 | const totalMax = Math.max(...dataPointsValue) 7 | return ( 8 |
9 | {props.dataPoints && props.dataPoints.length &&
10 | {props.dataPoints.map(dataPoint => )} 11 |
} 12 |
13 | ) 14 | } 15 | 16 | export default Chart 17 | -------------------------------------------------------------------------------- /src/components/Expenses/ExpensesList.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import './ExpensesList.css' 3 | import ExpenseItem from "./ExpenseItem"; 4 | const ExpensesList = (props) => { 5 | if(props.items.length === 0) { 6 | return

No expenses Found

7 | } 8 | return ( 9 | 13 | ) 14 | } 15 | 16 | export default ExpensesList 17 | -------------------------------------------------------------------------------- /src/components/Chart/ChartBar.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import './ChartBar.css' 3 | 4 | const ChartBar = (props) => { 5 | let barFillHeight = "0%" 6 | 7 | if(props.max > 0) { 8 | barFillHeight = Math.round((props.value / props.max) * 100) + '%' 9 | } 10 | return ( 11 |
12 |
13 |
14 |
15 |
16 | {props.label} 17 |
18 |
19 | ) 20 | } 21 | 22 | export default ChartBar 23 | -------------------------------------------------------------------------------- /src/components/Expenses/ExpenseItem.js: -------------------------------------------------------------------------------- 1 | 2 | import './ExpenseItem.css' 3 | import ExpenseDate from './ExpenseDate' 4 | import Card from '../UI/Card' 5 | import React, { useState } from 'react' 6 | 7 | const ExpenseItem = (props) => { 8 | return ( 9 |
  • 10 | 11 | 12 |
    13 |

    {props.title}

    14 |
    ${props.amount}
    15 |
    16 |
    17 |
  • 18 | 19 | ) 20 | } 21 | 22 | export default ExpenseItem; 23 | -------------------------------------------------------------------------------- /src/components/Chart/ChartBar.css: -------------------------------------------------------------------------------- 1 | .chart-bar { 2 | height: 100%; 3 | display: flex; 4 | flex-direction: column; 5 | align-items: center; 6 | } 7 | 8 | .chart-bar__inner { 9 | height: 100%; 10 | width: 100%; 11 | border: 1px solid #313131; 12 | border-radius: 12px; 13 | background-color: #c3b4f3; 14 | overflow: hidden; 15 | display: flex; 16 | flex-direction: column; 17 | justify-content: flex-end; 18 | } 19 | 20 | .chart-bar__fill { 21 | background-color: #4826b9; 22 | width: 100%; 23 | transition: all 0.3s ease-out; 24 | } 25 | 26 | .chart-bar__label { 27 | font-weight: bold; 28 | font-size: 0.5rem; 29 | text-align: center; 30 | } 31 | -------------------------------------------------------------------------------- /src/components/ExpensesFilter/ExpensesFilter.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import './ExpensesFilter.css' 3 | 4 | const ExpensesFilter = (props) => { 5 | const selectedFilterHandler = (event) => { 6 | props.onExpenseFilterSelect(event.target.value) 7 | } 8 | return ( 9 |
    10 |
    11 | 12 | 13 | 19 |
    20 |
    21 | ) 22 | } 23 | 24 | export default ExpensesFilter 25 | -------------------------------------------------------------------------------- /src/components/Expenses/ExpensesChart.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import Chart from "../Chart/Chart"; 3 | 4 | const ExpensesChart = (props) => { 5 | const chartDataPoints = [ 6 | {label: 'Jan', value: 0}, 7 | {label: 'Fab', value: 0}, 8 | {label: 'Mar', value: 0}, 9 | {label: 'Apr', value: 0}, 10 | {label: 'May', value: 0}, 11 | {label: 'Jun', value: 0}, 12 | {label: 'Jul', value: 0}, 13 | {label: 'Aug', value: 0}, 14 | {label: 'Set', value: 0}, 15 | {label: 'Oct', value: 0}, 16 | {label: 'Nov', value: 0}, 17 | {label: 'Dec', value: 0}, 18 | ] 19 | 20 | for (const expense of props.expenses) { 21 | const expenseMonth = expense.date.getMonth() 22 | chartDataPoints[expenseMonth].value += expense.amount 23 | } 24 | return ( 25 | 26 | ) 27 | } 28 | 29 | export default ExpensesChart 30 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "react-complete-guide", 3 | "version": "0.1.0", 4 | "private": true, 5 | "dependencies": { 6 | "@testing-library/jest-dom": "^5.11.6", 7 | "@testing-library/react": "^11.2.2", 8 | "@testing-library/user-event": "^12.5.0", 9 | "react": "^17.0.1", 10 | "react-dom": "^17.0.1", 11 | "react-scripts": "4.0.1", 12 | "web-vitals": "^0.2.4" 13 | }, 14 | "scripts": { 15 | "start": "react-scripts start", 16 | "build": "react-scripts build", 17 | "test": "react-scripts test", 18 | "eject": "react-scripts eject" 19 | }, 20 | "eslintConfig": { 21 | "extends": [ 22 | "react-app", 23 | "react-app/jest" 24 | ] 25 | }, 26 | "browserslist": { 27 | "production": [ 28 | ">0.2%", 29 | "not dead", 30 | "not op_mini all" 31 | ], 32 | "development": [ 33 | "last 1 chrome version", 34 | "last 1 firefox version", 35 | "last 1 safari version" 36 | ] 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/components/NewExpense/NewExpense.css: -------------------------------------------------------------------------------- 1 | .new-expense { 2 | background-color: #a892ee; 3 | padding: 1rem; 4 | margin: 2rem auto; 5 | width: 50rem; 6 | max-width: 95%; 7 | border-radius: 12px; 8 | text-align: center; 9 | box-shadow: 0 1px 8px rgba(0, 0, 0, 0.25); 10 | } 11 | 12 | .new-expense button { 13 | font: inherit; 14 | cursor: pointer; 15 | padding: 1rem 2rem; 16 | border: 1px solid #40005d; 17 | background-color: #40005d; 18 | color: white; 19 | border-radius: 12px; 20 | margin-right: 1rem; 21 | } 22 | 23 | .new-expense button:hover, 24 | .new-expense button:active { 25 | background-color: #510674; 26 | border-color: #510674; 27 | } 28 | 29 | .new-expense button.alternative { 30 | color: #220131; 31 | border-color: transparent; 32 | background-color: transparent; 33 | } 34 | 35 | .new-expense button.alternative:hover, 36 | .new-expense button.alternative:active { 37 | background-color: #ddb3f8; 38 | } 39 | -------------------------------------------------------------------------------- /src/components/NewExpense/NewExpense.js: -------------------------------------------------------------------------------- 1 | import React, {useState} from 'react' 2 | import './NewExpense.css' 3 | import ExpenseForm from "./ExpenseForm"; 4 | const NewExpense = (props) => { 5 | const saveExpenseDataHandler = (enteredExpenseData) => { 6 | const expenseData = { 7 | ...enteredExpenseData, 8 | id: Math.random().toString() 9 | } 10 | props.onAddExpense(expenseData) 11 | } 12 | 13 | const [showAddNewExpenseForm, setShowExpenseForm]= useState(false) 14 | const showExpenseFormHandler = () => { 15 | setShowExpenseForm((prevShowExpenseForm) => !prevShowExpenseForm) 16 | } 17 | return ( 18 |
    19 | {showAddNewExpenseForm ? : } 20 | 21 | 22 |
    23 | ) 24 | } 25 | 26 | export default NewExpense; 27 | -------------------------------------------------------------------------------- /src/components/Expenses/Expenses.js: -------------------------------------------------------------------------------- 1 | import ExpenseItem from "./ExpenseItem"; 2 | import './Expenses.css' 3 | import Card from "../UI/Card"; 4 | import ExpensesFilter from "../ExpensesFilter/ExpensesFilter"; 5 | import React, {useState} from 'react' 6 | import ExpensesList from "./ExpensesList"; 7 | import ExpensesChart from "./ExpensesChart"; 8 | const Expenses = (props) => { 9 | const [filteredYear, setFilteredYear] = useState('2021') 10 | const filteredExpenses = props.expenses.filter((expense) => expense.date.getFullYear().toString() === filteredYear) 11 | const expenseFilterHandler = (selectedFilter) => { 12 | setFilteredYear(selectedFilter) 13 | } 14 | return ( 15 | 16 | 17 | 18 | 19 | 20 | 21 | ) 22 | } 23 | 24 | export default Expenses 25 | -------------------------------------------------------------------------------- /src/components/Expenses/ExpenseItem.css: -------------------------------------------------------------------------------- 1 | .expense-item { 2 | display: flex; 3 | justify-content: space-between; 4 | align-items: center; 5 | padding: 0.5rem; 6 | margin: 1rem 0; 7 | background-color: #4b4b4b; 8 | } 9 | 10 | .expense-item__description { 11 | display: flex; 12 | flex-direction: column; 13 | gap: 1rem; 14 | align-items: flex-end; 15 | flex-flow: column-reverse; 16 | justify-content: flex-start; 17 | flex: 1; 18 | } 19 | 20 | .expense-item h2 { 21 | color: #3a3a3a; 22 | font-size: 1rem; 23 | flex: 1; 24 | margin: 0 1rem; 25 | color: white; 26 | } 27 | 28 | .expense-item__price { 29 | font-size: 1rem; 30 | font-weight: bold; 31 | color: white; 32 | background-color: #40005d; 33 | border: 1px solid white; 34 | padding: 0.5rem; 35 | border-radius: 12px; 36 | } 37 | 38 | @media (min-width: 580px) { 39 | .expense-item__description { 40 | flex-direction: row; 41 | align-items: center; 42 | justify-content: flex-start; 43 | flex: 1; 44 | } 45 | 46 | .expense-item__description h2 { 47 | font-size: 1.25rem; 48 | } 49 | 50 | .expense-item__price { 51 | font-size: 1.25rem; 52 | padding: 0.5rem 1.5rem; 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /src/App.js: -------------------------------------------------------------------------------- 1 | import Expenses from "./components/Expenses/Expenses"; 2 | import NewExpense from "./components/NewExpense/NewExpense" 3 | import React, {useState} from 'react' 4 | const App = () => { 5 | const addExpenseHandler = (expense) => { 6 | setExpenses((prevExpense) => { 7 | return [expense, ...prevExpense] 8 | }) 9 | } 10 | const DUMMY_EXPENSES = [ 11 | { 12 | id: 'e1', 13 | title: 'Toilet Paper', 14 | amount: 94.12, 15 | date: new Date(2022, 7, 14), 16 | }, 17 | { 18 | id: 'e2', 19 | title: 'New TV', 20 | amount: 799.49, 21 | date: new Date(2021, 2, 12) }, 22 | { 23 | id: 'e3', 24 | title: 'Car Insurance', 25 | amount: 294.67, 26 | date: new Date(2021, 2, 28), 27 | }, 28 | { 29 | id: 'e4', 30 | title: 'New Desk (Wooden)', 31 | amount: 450, 32 | date: new Date(2021, 5, 12), 33 | }, 34 | ]; 35 | 36 | const [expenses, setExpenses] = useState(DUMMY_EXPENSES) 37 | 38 | return ( 39 |
    40 | 41 | 42 |
    43 | ); 44 | } 45 | 46 | export default App; 47 | -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 12 | 13 | 17 | 18 | 27 | React App 28 | 29 | 30 | 31 |
    32 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /src/components/NewExpense/ExpenseForm.js: -------------------------------------------------------------------------------- 1 | import React, {useState} from 'react' 2 | import './ExpenseForm.css' 3 | const ExpenseForm = (props) => { 4 | const submitHandler = (event) => { 5 | event.preventDefault() 6 | const expenseData = { 7 | title: userInput.enteredTitle, 8 | amount: +userInput.enteredAmount, 9 | date: userInput.enteredDate 10 | } 11 | props.onSaveExpenseData(expenseData) 12 | 13 | 14 | 15 | const [userInput, setUserInput] = useState({ 16 | enteredTitle: '', 17 | enteredAmount: '', 18 | enteredDate: '' 19 | }) 20 | // const [enteredTitle, setEnteredTitle] = useState('') 21 | // const [enteredAmount, setEnteredAmount] = useState('') 22 | // const [enteredDate, setEnteredDate] = useState('') 23 | const titleChangeHandler = (event) => { 24 | setUserInput((prevState) => { 25 | return { 26 | ...prevState, 27 | enteredTitle: event.target.value 28 | } 29 | }) 30 | // setEnteredTitle(event.target.value) 31 | } 32 | const dateChangeHandler = (event) => { 33 | setUserInput((prevState) => { 34 | return { 35 | ...prevState, 36 | enteredDate: new Date(event.target.value) 37 | } 38 | }) 39 | // setEnteredDate(event.target.value) 40 | } 41 | const amountChangeHandler = (event) => { 42 | setUserInput((prevState) => { 43 | return { 44 | ...prevState, 45 | enteredAmount: event.target.value 46 | } 47 | }) 48 | // setEnteredAmount(event.target.value) 49 | } 50 | const cancelNewExpenseHandler = () => { 51 | props.showAddNewExpenseForm() 52 | } 53 | return ( 54 |
    55 |
    56 |
    57 | 58 | 59 |
    60 |
    61 | 62 | 63 |
    64 |
    65 | 66 | 67 |
    68 |
    69 |
    70 | 71 | 72 |
    73 |
    74 | 75 | ) 76 | } 77 | 78 | export default ExpenseForm; 79 | -------------------------------------------------------------------------------- /.eslintcache: -------------------------------------------------------------------------------- 1 | [{"/home/wallf/Documents/Stentle/Learn React/01-starting-setup/src/index.js":"1","/home/wallf/Documents/Stentle/Learn React/01-starting-setup/src/App.js":"2","/home/wallf/Documents/Stentle/Learn React/01-starting-setup/src/components/Expenses/Expenses.js":"3","/home/wallf/Documents/Stentle/Learn React/01-starting-setup/src/components/Expenses/ExpenseItem.js":"4","/home/wallf/Documents/Stentle/Learn React/01-starting-setup/src/components/UI/Card.js":"5","/home/wallf/Documents/Stentle/Learn React/01-starting-setup/src/components/Expenses/ExpenseDate.js":"6","/home/wallf/Documents/Stentle/Learn React/01-starting-setup/src/components/NewExpense/NewExpense.js":"7","/home/wallf/Documents/Stentle/Learn React/01-starting-setup/src/components/NewExpense/ExpenseForm.js":"8","/home/wallf/Documents/Stentle/Learn React/01-starting-setup/src/components/ExpensesFilter/ExpensesFilter.js":"9","/home/wallf/Documents/Stentle/Learn React/01-starting-setup/src/components/Expenses/ExpensesList.js":"10","/home/wallf/Documents/Stentle/Learn React/01-starting-setup/src/components/Chart/Chart.js":"11","/home/wallf/Documents/Stentle/Learn React/01-starting-setup/src/components/Chart/ChartBar.js":"12","/home/wallf/Documents/Stentle/Learn React/01-starting-setup/src/components/Expenses/ExpensesChart.js":"13"},{"size":142,"mtime":1616592305000,"results":"14","hashOfConfig":"15"},{"size":1168,"mtime":1624288696437,"results":"16","hashOfConfig":"15"},{"size":919,"mtime":1624292331591,"results":"17","hashOfConfig":"15"},{"size":568,"mtime":1624284053778,"results":"18","hashOfConfig":"15"},{"size":175,"mtime":1624020923872,"results":"19","hashOfConfig":"15"},{"size":529,"mtime":1624020923888,"results":"20","hashOfConfig":"15"},{"size":886,"mtime":1624286399790,"results":"21","hashOfConfig":"15"},{"size":2704,"mtime":1624300249619,"results":"22","hashOfConfig":"15"},{"size":786,"mtime":1624225282729,"results":"23","hashOfConfig":"15"},{"size":560,"mtime":1624283776062,"results":"24","hashOfConfig":"15"},{"size":567,"mtime":1624300072429,"results":"25","hashOfConfig":"15"},{"size":562,"mtime":1624300072453,"results":"26","hashOfConfig":"15"},{"size":816,"mtime":1624300033252,"results":"27","hashOfConfig":"15"},{"filePath":"28","messages":"29","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"30"},"1eh6kdm",{"filePath":"31","messages":"32","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33","messages":"34","errorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"35","messages":"36","errorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"37","messages":"38","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"30"},{"filePath":"39","messages":"40","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"30"},{"filePath":"41","messages":"42","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"43","messages":"44","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"45","messages":"46","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"30"},{"filePath":"47","messages":"48","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"49","messages":"50","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"51","messages":"52","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"53","messages":"54","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"/home/wallf/Documents/Stentle/Learn React/01-starting-setup/src/index.js",[],["55","56"],"/home/wallf/Documents/Stentle/Learn React/01-starting-setup/src/App.js",[],"/home/wallf/Documents/Stentle/Learn React/01-starting-setup/src/components/Expenses/Expenses.js",["57"],"/home/wallf/Documents/Stentle/Learn React/01-starting-setup/src/components/Expenses/ExpenseItem.js",["58"],"/home/wallf/Documents/Stentle/Learn React/01-starting-setup/src/components/UI/Card.js",[],"/home/wallf/Documents/Stentle/Learn React/01-starting-setup/src/components/Expenses/ExpenseDate.js",[],"/home/wallf/Documents/Stentle/Learn React/01-starting-setup/src/components/NewExpense/NewExpense.js",[],"/home/wallf/Documents/Stentle/Learn React/01-starting-setup/src/components/NewExpense/ExpenseForm.js",[],"/home/wallf/Documents/Stentle/Learn React/01-starting-setup/src/components/ExpensesFilter/ExpensesFilter.js",[],"/home/wallf/Documents/Stentle/Learn React/01-starting-setup/src/components/Expenses/ExpensesList.js",[],"/home/wallf/Documents/Stentle/Learn React/01-starting-setup/src/components/Chart/Chart.js",[],"/home/wallf/Documents/Stentle/Learn React/01-starting-setup/src/components/Chart/ChartBar.js",[],"/home/wallf/Documents/Stentle/Learn React/01-starting-setup/src/components/Expenses/ExpensesChart.js",[],{"ruleId":"59","replacedBy":"60"},{"ruleId":"61","replacedBy":"62"},{"ruleId":"63","severity":1,"message":"64","line":1,"column":8,"nodeType":"65","messageId":"66","endLine":1,"endColumn":19},{"ruleId":"63","severity":1,"message":"67","line":5,"column":17,"nodeType":"65","messageId":"66","endLine":5,"endColumn":25},"no-native-reassign",["68"],"no-negated-in-lhs",["69"],"no-unused-vars","'ExpenseItem' is defined but never used.","Identifier","unusedVar","'useState' is defined but never used.","no-global-assign","no-unsafe-negation"] --------------------------------------------------------------------------------