import styles from "./Maps.module.css"; import "react-tiles-dnd/esm/index.css"; import {TilesContainer} from "react-tiles-dnd"; import {Link} from "react-router-dom"; import card from "../../assets/card-map.png"; import star_icon from "../../assets/star_icon.png"; // Unfilled star icon import star_filled_icon from "../../assets/star_filled_icon.png"; // Filled star icon import {useEffect, useState} from "react"; import HttpService from "../../scripts/net/HttpService.js"; import Logo from "../../components/Logo/Logo.jsx"; import Profile from "../../components/Profile/Profile.jsx"; import config from "../../scripts/net/netconfig.js"; import {useAppContext} from "../../components/AppContext/AppContext.jsx"; import FilterMaps from "../../components/FilterMaps/FilterMaps.jsx"; let loadedTiles = []; const renderTile = ({data, isDragging, toggleFavorite}) => (
Map Thumbnail
{data.text} {isDragging ? "DRAGGING" : null}
toggleFavorite(data.text, data.isFavorite)}> Favorite Icon
); const tileSize = (tile) => ({ colSpan: tile.cols, rowSpan: tile.rows, }); export default function BrowseMaps() { const [searchTerm, setSearchTerm] = useState(""); const [tiles, setTiles] = useState([]); const {username, isAuthenticated} = useAppContext(); const [filter, setFilter] = useState("all") const [mapFilters, setMapFilters] = useState([]) useEffect(() => { const loadMaps = async () => { const httpService = new HttpService(); let mapTiles = []; let mapTypes = ['Hospital', 'Faculty', 'House', 'Other']; if (isAuthenticated) { // :D const favResp = await httpService.get(`${config.favourites.display}?username=${username}`); console.log("RESPONSE FAVORITE MAPS", favResp); const favMapTiles = favResp.map((elem) => ({ text: elem.mapName, cols: 1, rows: 1, isFavorite: true, type: elem.mapType, })); console.log("TUKA") // Load all maps const allResp = await httpService.get(config.view_maps.display); console.log("RESPONSE MAPS PUBLIC", allResp); // mapTypes = allResp.filter(elem => elem.mapType != null && elem.mapType !== "").map(elem => elem.mapType); const nonFavMapTiles = allResp .filter((elem) => !favMapTiles.some((fav) => fav.text === elem.mapName)) .map((elem) => ({ text: elem.mapName, cols: 1, rows: 1, isFavorite: false, type: elem.mapType, })); mapTiles = [...favMapTiles, ...nonFavMapTiles]; } else { const allResp = await httpService.get(config.view_maps.display); console.log("RESPONSE MAPS PUBLIC", allResp); // mapTypes = allResp.filter(elem => elem.mapType != null && elem.mapType !== "").map(elem => elem.mapType); mapTiles = allResp.map((elem) => ({ text: elem.mapName, cols: 1, rows: 1, isFavorite: false, type: elem.mapType, })); } console.log("TYPES:", mapTypes); setMapFilters(mapTypes); loadedTiles = [...mapTiles]; sortTiles(mapTiles); setTiles(mapTiles); }; loadMaps(); }, [isAuthenticated, username]); const toggleFavorite = async (tileName, isFavorite) => { const httpService = new HttpService(); const url = isFavorite ? `${config.favourites.delete}?username=${username}&mapName=${encodeURIComponent(tileName)}` : `${config.favourites.add}?username=${username}&mapName=${encodeURIComponent(tileName)}`; console.log("Request URL:", url); let response; if (isFavorite) { response = await httpService.delete(url); } else { response = await httpService.post(url); } console.log("Response received:", response); const updatedTiles = tiles.map((tile) => tile.text === tileName ? {...tile, isFavorite: !tile.isFavorite} : tile ); loadedTiles = [...updatedTiles]; sortTiles(updatedTiles); setTiles(updatedTiles); }; const handleSearchChange = (e) => { const value = e.target.value.toLowerCase(); setSearchTerm(value); const filteredTiles = loadedTiles.filter((tile) => tile.text.toLowerCase().includes(value) ); sortTiles(filteredTiles); setTiles(filteredTiles); }; const sortTiles = (tilesToSort) => { tilesToSort.sort((a, b) => { if (a.isFavorite === b.isFavorite) return a.text.localeCompare(b.text); return a.isFavorite ? -1 : 1; }); }; const onFilter = (selectedFilter) => { setFilter(selectedFilter); if (selectedFilter === "all") { // Show all tiles setTiles(loadedTiles); } else { // Filter tiles by selected type const filteredTiles = loadedTiles.filter((tile) => tile.type === selectedFilter); setTiles(filteredTiles); } }; return (

Explore Maps

{filter !== "all" && tiles.length === 0 &&

No maps of type {filter} found

} renderTile({...props, toggleFavorite})} tileSize={tileSize} forceTileWidth={170} forceTileHeight={200} />
); }