add scroll-y lock on search
This commit is contained in:
1 parent
caf990f700
commit
7adc584199
6 files changed
+125
-36
No files matched your search
@@ -7,6 +7,7 @@
|
|||||||
|
|
||||||
.eventContainerTop {
|
.eventContainerTop {
|
||||||
display: flex;
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
}
|
}
|
||||||
|
|
||||||
.eventContainerBottom{
|
.eventContainerBottom{
|
||||||
|
|||||||
@@ -1,6 +1,37 @@
|
|||||||
import styles from "./SearchBar.module.css"
|
import styles from "./SearchBar.module.css"
|
||||||
|
import {Link} from "react-router";
|
||||||
|
import {useEffect, useState} from "react";
|
||||||
|
import searchEvents from "../../utils/searchEvents.js";
|
||||||
|
|
||||||
|
function SearchBar() {
|
||||||
|
const [searchQuery, setSearchQuery] = useState('');
|
||||||
|
const [searchResults, setSearchResults] = useState([]);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const performSearch = async (query) => {
|
||||||
|
if (query.trim() === '') {
|
||||||
|
setSearchResults([]);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const data = await searchEvents(query);
|
||||||
|
if (data) {
|
||||||
|
setSearchResults(data);
|
||||||
|
} else {
|
||||||
|
setSearchResults([]);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
const handler = setTimeout(() => {
|
||||||
|
performSearch(searchQuery);
|
||||||
|
}, 300);
|
||||||
|
|
||||||
|
return () => {
|
||||||
|
clearTimeout(handler);
|
||||||
|
};
|
||||||
|
}, [searchQuery]);
|
||||||
|
|
||||||
function SearchBar({ searchQuery, setSearchQuery}) {
|
|
||||||
return (
|
return (
|
||||||
<div className={`${styles.searchBarContainer} glassCard`}>
|
<div className={`${styles.searchBarContainer} glassCard`}>
|
||||||
<form className={styles.searchBarForm} onSubmit={(event) => event.preventDefault()}>
|
<form className={styles.searchBarForm} onSubmit={(event) => event.preventDefault()}>
|
||||||
@@ -15,6 +46,28 @@ function SearchBar({ searchQuery, setSearchQuery}) {
|
|||||||
onChange={(event) => setSearchQuery(event.target.value)}
|
onChange={(event) => setSearchQuery(event.target.value)}
|
||||||
/>
|
/>
|
||||||
</form>
|
</form>
|
||||||
|
|
||||||
|
<div className={styles.lineContainer}>
|
||||||
|
{searchResults.length > 0 ? (
|
||||||
|
<div className={styles.line}></div>
|
||||||
|
) : null}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
{searchResults.map((result, i) => (
|
||||||
|
<Link to={`/event/` + event.id}>
|
||||||
|
<div className={styles.searchedEvent} key={i}>
|
||||||
|
<div className={`${styles.eventImageDiv}`}>
|
||||||
|
{result.image == null ? (
|
||||||
|
<img src="empty.png" className={styles.eventImage} alt="Pas de photo de l'événement" />
|
||||||
|
) : (
|
||||||
|
<img src={result.image + `.png`} alt="Photo de l'événement" />
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
<p>{result.name}</p>
|
||||||
|
</div>
|
||||||
|
</Link>
|
||||||
|
))}
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,6 +10,58 @@
|
|||||||
display: flex;
|
display: flex;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
.eventImageDiv {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
margin-right: 1rem;
|
||||||
|
width: auto;
|
||||||
|
height: 2rem;
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.searchedEvent{
|
||||||
|
display: flex;
|
||||||
|
padding: 0.5rem;
|
||||||
|
border-radius: 15px;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.searchedEvent:hover {
|
||||||
|
background: #afafaf;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
.searchedEvent p {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
text-decoration: none;
|
||||||
|
color: black;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.lineContainer{
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.line{
|
||||||
|
height: 0;
|
||||||
|
width: 96%;
|
||||||
|
border: #606060 solid 1px;
|
||||||
|
margin: 0.5rem 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.eventImage {
|
||||||
|
max-width: 100%;
|
||||||
|
max-height: 100%;
|
||||||
|
object-fit: contain;
|
||||||
|
border-radius: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
.searchBarForm input{
|
.searchBarForm input{
|
||||||
background: none;
|
background: none;
|
||||||
box-shadow: none;
|
box-shadow: none;
|
||||||
|
|||||||
+6
-2
@@ -1,8 +1,10 @@
|
|||||||
* {
|
* {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
width: 100%;
|
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
html {
|
||||||
overflow-x: hidden;
|
overflow-x: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -20,12 +22,14 @@
|
|||||||
@media screen and (max-width: 768px) {
|
@media screen and (max-width: 768px) {
|
||||||
.content{
|
.content{
|
||||||
padding: 0.7rem;
|
padding: 0.7rem;
|
||||||
z-index:1;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
.content {
|
.content {
|
||||||
padding: 1.5rem;
|
padding: 1.5rem;
|
||||||
z-index: 1;
|
z-index: 1;
|
||||||
|
width: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
a {
|
a {
|
||||||
|
|||||||
@@ -4,14 +4,12 @@ import {Link} from "react-router";
|
|||||||
import styles from "./EventsPage.module.css";
|
import styles from "./EventsPage.module.css";
|
||||||
import Filter from "../../components/Filter/Filter.jsx";
|
import Filter from "../../components/Filter/Filter.jsx";
|
||||||
import SearchBar from "../../components/SearchBar/SearchBar.jsx";
|
import SearchBar from "../../components/SearchBar/SearchBar.jsx";
|
||||||
import searchEvents from "../../utils/searchEvents.js"
|
|
||||||
|
|
||||||
|
|
||||||
function EventsPage(){
|
function EventsPage(){
|
||||||
const [isFilterVisible, setIsFilterVisible] = useState(false);
|
const [isFilterVisible, setIsFilterVisible] = useState(false);
|
||||||
const [isSearchVisible, setIsSearchVisible] = useState(false);
|
const [isSearchVisible, setIsSearchVisible] = useState(false);
|
||||||
const [searchQuery, setSearchQuery] = useState('');
|
|
||||||
const [searchResults, setSearchResults] = useState([]);
|
|
||||||
const toggleFilters = () => {
|
const toggleFilters = () => {
|
||||||
setIsFilterVisible(prev => !prev);
|
setIsFilterVisible(prev => !prev);
|
||||||
};
|
};
|
||||||
@@ -21,33 +19,19 @@ function EventsPage(){
|
|||||||
yearOrder: "asc",
|
yearOrder: "asc",
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const performSearch = async (query) => {
|
if (isSearchVisible) {
|
||||||
if (query.trim() === '') {
|
document.documentElement.style.overflow = 'hidden';
|
||||||
setSearchResults([]);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const data = await searchEvents(query);
|
|
||||||
if (data) {
|
|
||||||
setSearchResults(data);
|
|
||||||
} else {
|
} else {
|
||||||
setSearchResults([]);
|
document.documentElement.style.overflow = '';
|
||||||
}
|
}
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
const handler = setTimeout(() => {
|
|
||||||
performSearch(searchQuery);
|
|
||||||
}, 300);
|
|
||||||
|
|
||||||
return () => {
|
return () => {
|
||||||
clearTimeout(handler);
|
document.documentElement.style.overflow = '';
|
||||||
};
|
};
|
||||||
}, [searchQuery]);
|
}, [isSearchVisible]);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
const [events] = useState([
|
const [events] = useState([
|
||||||
@@ -259,13 +243,7 @@ function EventsPage(){
|
|||||||
{isSearchVisible ? (
|
{isSearchVisible ? (
|
||||||
<div className={styles.searchBarContainer}>
|
<div className={styles.searchBarContainer}>
|
||||||
<div className={styles.searchBarOverlay} onClick={() => setIsSearchVisible(false)}></div>
|
<div className={styles.searchBarOverlay} onClick={() => setIsSearchVisible(false)}></div>
|
||||||
<SearchBar
|
<SearchBar/>
|
||||||
searchQuery={searchQuery}
|
|
||||||
setSearchQuery={setSearchQuery}
|
|
||||||
/>
|
|
||||||
{searchResults.map((event, index) => (
|
|
||||||
<Event key={index} event={event} />
|
|
||||||
))}
|
|
||||||
</div>
|
</div>
|
||||||
) : null}
|
) : null}
|
||||||
|
|
||||||
|
|||||||
@@ -34,6 +34,7 @@
|
|||||||
padding: 5px 5px 5px 5px;
|
padding: 5px 5px 5px 5px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
.searchBarOverlay {
|
.searchBarOverlay {
|
||||||
position: fixed;
|
position: fixed;
|
||||||
top: 0;
|
top: 0;
|
||||||
@@ -41,9 +42,9 @@
|
|||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
z-index: 100;
|
z-index: 100;
|
||||||
|
background-color: rgba(0, 0, 0, 0.3);
|
||||||
|
backdrop-filter: blur(4px);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
.searchBarContainer{
|
.searchBarContainer{
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
|
|||||||
Reference in new issue
Block a user