2022-04-16 12:50:42 -05:00
|
|
|
import { useEffect, useState } from 'react';
|
2022-04-22 07:13:22 -05:00
|
|
|
import './styles/App.css';
|
2022-04-16 12:50:42 -05:00
|
|
|
import List from './componets/List';
|
2022-05-30 11:44:34 -05:00
|
|
|
import AddItem from './componets/AddItem';
|
2022-05-10 11:40:08 -05:00
|
|
|
import config from './config.json';
|
2022-05-30 11:44:34 -05:00
|
|
|
import Filters from './componets/Filters';
|
2022-05-31 04:32:05 -05:00
|
|
|
import Sort from './componets/Sort';
|
2022-04-09 03:14:50 -05:00
|
|
|
|
|
|
|
function App() {
|
2022-04-16 12:50:42 -05:00
|
|
|
const [data, setData] = useState([]);
|
2022-05-31 04:32:05 -05:00
|
|
|
const [newBox, setNewBox] = useState(false);
|
|
|
|
const [filterBox, setFilterBox] = useState(false);
|
|
|
|
const [sortBox, setSortBox] = useState(false);
|
2022-04-24 18:34:30 -05:00
|
|
|
const [searchQuery, setSearchQuery] = useState('');
|
2022-05-27 02:26:21 -05:00
|
|
|
const [numberOfResults, setNumberOfResults] = useState(0);
|
2022-05-28 22:27:27 -05:00
|
|
|
const [nameChecked, setNameChecked] = useState(true);
|
|
|
|
const [descriptionChecked, setDescriptionChecked] = useState(true);
|
|
|
|
const [tagsChecked, setTagsChecked] = useState(true);
|
2022-06-01 03:04:04 -05:00
|
|
|
const [sort, setSort] = useState('Date');
|
2022-05-28 22:27:27 -05:00
|
|
|
|
|
|
|
function handleNameCheckbox() {
|
|
|
|
setNameChecked(!nameChecked);
|
|
|
|
}
|
|
|
|
|
|
|
|
function handleDescriptionCheckbox() {
|
|
|
|
setDescriptionChecked(!descriptionChecked);
|
|
|
|
}
|
|
|
|
|
|
|
|
function handleTagsCheckbox() {
|
|
|
|
setTagsChecked(!tagsChecked);
|
|
|
|
}
|
2022-04-22 07:13:22 -05:00
|
|
|
|
|
|
|
function exitAdding() {
|
2022-05-31 04:32:05 -05:00
|
|
|
setNewBox(!newBox);
|
2022-04-22 07:13:22 -05:00
|
|
|
}
|
2022-04-16 12:50:42 -05:00
|
|
|
|
2022-05-30 11:44:34 -05:00
|
|
|
function exitFilter() {
|
2022-05-31 04:32:05 -05:00
|
|
|
setFilterBox(!filterBox);
|
|
|
|
}
|
|
|
|
|
|
|
|
function exitSorting() {
|
|
|
|
setSortBox(!sortBox);
|
2022-05-30 11:44:34 -05:00
|
|
|
}
|
|
|
|
|
2022-04-24 18:34:30 -05:00
|
|
|
function search(e) {
|
|
|
|
setSearchQuery(e.target.value);
|
|
|
|
}
|
2022-05-28 04:42:30 -05:00
|
|
|
|
2022-04-24 18:34:30 -05:00
|
|
|
const filteredData = data.filter((e) => {
|
2022-05-28 22:27:27 -05:00
|
|
|
const name = e.name.toLowerCase().includes(searchQuery.toLowerCase());
|
|
|
|
const title = e.title.toLowerCase().includes(searchQuery.toLowerCase());
|
|
|
|
const tags = e.tag.some((e) => e.includes(searchQuery.toLowerCase()));
|
|
|
|
|
|
|
|
if((nameChecked && tagsChecked && descriptionChecked) || (!nameChecked && !tagsChecked && !descriptionChecked)) {
|
|
|
|
return (name || title || tags);
|
|
|
|
} else if(nameChecked && tagsChecked) {
|
|
|
|
return (name || tags);
|
|
|
|
} else if(nameChecked && descriptionChecked) {
|
|
|
|
return (name || title);
|
|
|
|
} else if(tagsChecked && descriptionChecked) {
|
|
|
|
return (tags || title);
|
|
|
|
}
|
|
|
|
else if(nameChecked) { return name }
|
|
|
|
else if(tagsChecked) { return tags }
|
|
|
|
else if(descriptionChecked) { return title }
|
2022-04-24 18:34:30 -05:00
|
|
|
});
|
|
|
|
|
2022-05-26 11:15:07 -05:00
|
|
|
async function fetchData() {
|
|
|
|
const address = config.api.address + ":" + config.api.port;
|
|
|
|
const res = await fetch(address + '/api');
|
|
|
|
const resJSON = await res.json();
|
2022-06-01 03:04:04 -05:00
|
|
|
const Data = resJSON.sort((a, b) => { return b-a }); // <-- SORT IT!
|
2022-05-26 11:15:07 -05:00
|
|
|
setData(Data);
|
|
|
|
}
|
2022-04-16 12:50:42 -05:00
|
|
|
|
2022-05-30 11:44:34 -05:00
|
|
|
const concatTags = () => {
|
|
|
|
let tags = [];
|
|
|
|
|
|
|
|
for (let i = 0; i < data.length; i++) {
|
|
|
|
tags = tags.concat(data[i].tag)
|
|
|
|
}
|
|
|
|
|
|
|
|
tags = tags.filter((v, i, a) => a.indexOf(v) === i);
|
|
|
|
|
|
|
|
return tags;
|
|
|
|
}
|
|
|
|
|
2022-05-26 11:15:07 -05:00
|
|
|
useEffect(() => {
|
2022-04-16 12:50:42 -05:00
|
|
|
fetchData();
|
2022-05-26 11:15:07 -05:00
|
|
|
}, []);
|
2022-05-27 02:26:21 -05:00
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
setNumberOfResults(filteredData.length);
|
|
|
|
}, [filteredData]);
|
2022-04-16 12:50:42 -05:00
|
|
|
|
2022-04-09 03:14:50 -05:00
|
|
|
return (
|
|
|
|
<div className="App">
|
2022-04-14 09:10:27 -05:00
|
|
|
<div className="head">
|
2022-05-28 22:27:27 -05:00
|
|
|
<input className="search" type="search" placeholder=" Search" onChange={search}/>
|
2022-05-31 04:32:05 -05:00
|
|
|
<button className="btn" onClick={() => setNewBox(true)}></button>
|
2022-04-14 09:10:27 -05:00
|
|
|
</div>
|
2022-05-30 11:44:34 -05:00
|
|
|
|
2022-05-30 13:30:32 -05:00
|
|
|
<p className="results">{numberOfResults > 0 ? numberOfResults + ' Bookmarks found' : 'No bookmarks found.'}</p>
|
2022-05-30 11:44:34 -05:00
|
|
|
|
2022-05-31 04:32:05 -05:00
|
|
|
<button className='btn' onClick={() => setFilterBox(true)}></button>
|
|
|
|
<button className='btn' onClick={() => setSortBox(true)}></button>
|
|
|
|
<List data={filteredData} reFetch={fetchData} />
|
|
|
|
|
|
|
|
{sortBox ? <Sort
|
|
|
|
onExit={exitSorting}
|
|
|
|
reFetch={fetchData}
|
|
|
|
/> : null}
|
|
|
|
|
|
|
|
{filterBox ? <Filters
|
2022-05-30 11:44:34 -05:00
|
|
|
nameChecked={nameChecked}
|
|
|
|
handleNameCheckbox={handleNameCheckbox}
|
|
|
|
descriptionChecked={descriptionChecked}
|
|
|
|
handleDescriptionCheckbox={handleDescriptionCheckbox}
|
|
|
|
tagsChecked={tagsChecked}
|
|
|
|
handleTagsCheckbox={handleTagsCheckbox}
|
|
|
|
onExit={exitFilter}
|
|
|
|
/> : null}
|
|
|
|
|
2022-05-31 04:32:05 -05:00
|
|
|
{newBox ? <AddItem
|
|
|
|
onExit={exitAdding}
|
|
|
|
reFetch={fetchData}
|
|
|
|
tags={concatTags}
|
|
|
|
/> : null}
|
2022-04-09 03:14:50 -05:00
|
|
|
</div>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
2022-04-19 07:22:53 -05:00
|
|
|
export default App;
|