el.xwx.moe/src/App.js

133 lines
3.8 KiB
JavaScript
Raw Normal View History

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('');
const [numberOfResults, setNumberOfResults] = useState(0);
const [nameChecked, setNameChecked] = useState(true);
const [descriptionChecked, setDescriptionChecked] = useState(true);
const [tagsChecked, setTagsChecked] = useState(true);
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) => {
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
});
async function fetchData() {
const address = config.api.address + ":" + config.api.port;
const res = await fetch(address + '/api');
const resJSON = await res.json();
const Data = resJSON.sort((a, b) => { return b-a });
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;
}
useEffect(() => {
2022-04-16 12:50:42 -05:00
fetchData();
}, []);
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">
<input className="search" type="search" placeholder="&#xf002; Search" onChange={search}/>
2022-05-31 04:32:05 -05:00
<button className="btn" onClick={() => setNewBox(true)}>&#xf067;</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)}>&#xf0b0;</button>
<button className='btn' onClick={() => setSortBox(true)}>&#xf0dc;</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;