Skip to content

Commit 0ebfaee

Browse files
Merge branch 'main' into ContactUs
2 parents f9c0788 + 4f835a1 commit 0ebfaee

File tree

7 files changed

+472
-4
lines changed

7 files changed

+472
-4
lines changed

example/src/App.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,8 @@ import {
77
ComplexComponent,
88
PortfolioHome,
99
TeamMembers,
10-
ContactUs
11-
12-
10+
ContactUs,
11+
GroceryList,
1312
} from 'dezenix-react'
1413
import Home from './components/Home'
1514
import { HashRouter, Route, Routes } from 'react-router-dom'
@@ -47,6 +46,8 @@ const App = () => {
4746
<Route path='/portfoliohome' element={<PortfolioHome pic={img1} />} />
4847
<Route path='/team' element={<TeamMembers img={user} members={members} />} />
4948
<Route path='/contactus' element={<ContactUs />} />
49+
<Route path='/GroceryList' element={<GroceryList />} />
50+
5051
</Routes>
5152
</HashRouter>
5253
)

example/src/components/Home.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,9 @@ const Home = () => {
4040
<Link to='/contactus' className='component'>
4141
<h2>Contact Us</h2>
4242
</Link>
43+
<Link to='/GroceryList' className='component'>
44+
<h2>Grocery List Site</h2>
45+
</Link>
4346
</div>
4447
</div>
4548
</div>

src/index.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,5 @@ export { default as ProgressBar } from './lib-components/progress_bar'
55
export { default as ComplexComponent } from './lib-components/complexComponent'
66
export { default as PortfolioHome } from './lib-components/portfolio_home'
77
export { default as TeamMembers } from './lib-components/team_members'
8-
export { default as ContactUs} from './lib-components/contact_us'
8+
export { default as ContactUs} from './lib-components/contact_us'
9+
export { default as GroceryList } from './lib-components/Grocery List Site'
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import React, { useEffect } from 'react'
2+
import styles from './index.module.css'
3+
4+
const Alert = ({text, type, removeAlert,list}) => {
5+
useEffect(()=>{
6+
let showingAlert = setTimeout(() => {
7+
removeAlert()
8+
}, 3000);
9+
return ()=> clearTimeout(showingAlert);
10+
},[list])
11+
return (
12+
<p className={`${styles.alert} ${styles[`alert-${type}`]}`} >{text}</p>
13+
)
14+
}
15+
16+
export default Alert
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import React from 'react'
2+
import { FaEdit, FaTrash } from 'react-icons/fa'
3+
import styles from './index.module.css'
4+
5+
const List = ({gList,deleteItem,editItem}) => {
6+
return (
7+
<div className={styles['grocery-list']}>
8+
{gList.map(({id, title})=>{
9+
return (
10+
<article className={styles['grocery-item']} key={id} >
11+
<p className={styles.title} >{title}</p>
12+
<div className={styles['btn-container']} >
13+
<button type='button' className={styles['edit-btn']} onClick={()=>editItem(id)}>
14+
<FaEdit />
15+
</button>
16+
<button name='delete' type='button' className={styles['delete-btn']} onClick={(e)=>deleteItem(id)}>
17+
<FaTrash />
18+
</button>
19+
</div>
20+
</article>
21+
)
22+
})}
23+
</div>
24+
)
25+
}
26+
27+
export default List
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
import React, { useState, useEffect } from 'react'
2+
import List from './List'
3+
import Alert from './Alert'
4+
import styles from './index.module.css'
5+
6+
const getLocalStorage = ()=>{
7+
let data = JSON.parse(localStorage.getItem('list'));
8+
if(data){
9+
return data;
10+
}
11+
else return [] ;
12+
}
13+
14+
function GroceryList() {
15+
const [name, setName] = useState('');
16+
const [list, setList] = useState(getLocalStorage);
17+
const [isEditing, setIsEditing] = useState(false);
18+
const [editId, setEditId] = useState();
19+
const [alert, setAlert] = useState({
20+
value : false,
21+
text : '',
22+
type : ''
23+
});
24+
25+
const showAlert = (value=false, text='', type='') => {
26+
setAlert({value, text, type});
27+
}
28+
29+
30+
31+
const handleSubmit = (e)=>{
32+
e.preventDefault();
33+
if(name != ''){
34+
setList(preVal=>{
35+
let newList = {id:new Date().getTime().toString(), title:name};
36+
return [...preVal , newList];
37+
})
38+
setName('');
39+
showAlert(true, 'success', 'success');
40+
}
41+
if(name == ''){
42+
showAlert(true, 'please enter some item', 'danger');
43+
}
44+
if(name && isEditing){
45+
setList(
46+
list.map(item => {
47+
if(item.id === editId){
48+
return {
49+
...item,
50+
title : name
51+
}
52+
}
53+
return item;
54+
})
55+
)
56+
setName('');
57+
setEditId(null);
58+
setIsEditing(false);
59+
}
60+
}
61+
62+
useEffect(()=>{
63+
localStorage.setItem('list',JSON.stringify(list));
64+
},[list])
65+
66+
67+
const deleteItem = (id)=>{
68+
let newArray = list.filter(item=> item.id != id);
69+
setList(newArray);
70+
showAlert(true, 'Item deleted', 'danger');
71+
}
72+
const editItem = (id) =>{
73+
let itemToEdit = list.find(item=> item.id===id);
74+
setIsEditing(true);
75+
setEditId(id);
76+
setName(itemToEdit.title);
77+
}
78+
return(
79+
<section className={styles['sectionCenter']} >
80+
<form className={styles['grocery-form']} onSubmit={handleSubmit}>
81+
{alert.value && <Alert {...alert} removeAlert={showAlert} list={list}/>}
82+
<h3>Add your Grocery Here</h3>
83+
<div className={styles['form-control']}>
84+
<input className={styles.grocery} value={name} onChange={(e)=>setName(e.target.value)} />
85+
<button type='submit' className={styles['submit-btn']}> {!isEditing ? 'Add Item' : 'Edit'}</button>
86+
</div>
87+
</form>
88+
{list.length > 0 &&
89+
<div className={styles['grocery-container']}>
90+
<List gList={list} deleteItem={deleteItem} editItem={editItem}/>
91+
</div>}
92+
</section>
93+
)
94+
}
95+
96+
export default GroceryList

0 commit comments

Comments
 (0)