diff --git a/src/components/InfrastructurePage/InfrastructureFilters.tsx b/src/components/InfrastructurePage/InfrastructureFilters.tsx index 00faa78..edc5704 100644 --- a/src/components/InfrastructurePage/InfrastructureFilters.tsx +++ b/src/components/InfrastructurePage/InfrastructureFilters.tsx @@ -1,9 +1,9 @@ -import { useState } from "react"; +import { useEffect, useState } from "react"; import { environments, transports } from "../../consts/infrastructure"; import InputRange from "./InputRange"; import { Mark } from "../../types/Mark"; -interface IInfrastructureFiltersProps { +interface InfrastructureFiltersProps { setSelectedRange: React.Dispatch>; setFilteredMarks: React.Dispatch>; selectedRange: number; @@ -15,7 +15,7 @@ const InfrastructureFilters = ({ setFilteredMarks, selectedRange, marks, -}: IInfrastructureFiltersProps) => { +}: InfrastructureFiltersProps) => { const [filter, setFilter] = useState(""); function handleOnFilterClick( event: React.MouseEvent @@ -23,10 +23,6 @@ const InfrastructureFilters = ({ const infrastructureFilter = event.currentTarget.dataset.set; if (!infrastructureFilter) return; - const filteredMarks = marks.filter( - (mark) => mark.icon === infrastructureFilter - ); - setFilteredMarks(filteredMarks); setFilter(infrastructureFilter); } @@ -34,6 +30,15 @@ const InfrastructureFilters = ({ event: React.ChangeEvent ) => setSelectedRange(Number(event.target.value)); + useEffect(() => { + const filteredMarks = marks.filter( + (mark) => mark.icon === filter && mark.distance <= selectedRange + ); + console.log("filteredMarks", filteredMarks); + + setFilteredMarks(filteredMarks); + }, [selectedRange, filter, marks, setFilteredMarks]); + return ( <>
diff --git a/src/components/InfrastructurePage/InputRange.tsx b/src/components/InfrastructurePage/InputRange.tsx index eb8168e..6991d0a 100644 --- a/src/components/InfrastructurePage/InputRange.tsx +++ b/src/components/InfrastructurePage/InputRange.tsx @@ -1,11 +1,11 @@ import { rangeStart, rangeEnd, rangeStep } from "../../consts/infrastructure"; -interface IInputRangeProps { +interface InputRangeProps { selectedRange: number; handleOnChange: (event: React.ChangeEvent) => void; } -const InputRange = ({ handleOnChange, selectedRange }: IInputRangeProps) => { +const InputRange = ({ handleOnChange, selectedRange }: InputRangeProps) => { return (
diff --git a/src/components/Mark.tsx b/src/components/Mark.tsx deleted file mode 100644 index 6bbbb36..0000000 --- a/src/components/Mark.tsx +++ /dev/null @@ -1,5 +0,0 @@ -function Mark() { - return
Mark
; -} - -export default Mark; diff --git a/src/components/MarksContainer.tsx b/src/components/MarksContainer.tsx index 1ac64b1..77ab0c5 100644 --- a/src/components/MarksContainer.tsx +++ b/src/components/MarksContainer.tsx @@ -2,6 +2,11 @@ import { Mark } from "../types/Mark"; import MarkFoodIcon from "./icons/marks/MarkFoodIcon"; import MarkShopIcon from "./icons/marks/MarkShopIcon"; +const markIcons: { [key: string]: React.ReactNode } = { + shop: , + food: , +}; + interface MarksContainerProps { marks: Mark[]; filteredMarks: Mark[]; @@ -25,27 +30,14 @@ function MarksContainer({ className="absolute top-0 left-0 w-full h-full" > {marks.map((mark) => { - let icon; const isFiltered = filteredMarks.find( (filteredMark) => filteredMark.id === mark.id ); - switch (mark.icon) { - case "shop": - icon = ; - break; - case "food": - icon = ; - break; - - default: - break; - } - return ( - {icon} + {markIcons[mark.icon]} ); })} diff --git a/src/marks.json b/src/marks.json index b69821e..6705fbe 100644 --- a/src/marks.json +++ b/src/marks.json @@ -3,36 +3,125 @@ "id": "shop_1", "x": 900, "y": 1000, - "icon": "shop" + "icon": "shop", + "distance": 200 }, { "id": "shop_2", "x": 666, "y": 777, - "icon": "shop" + "icon": "shop", + "distance": 200 }, { "id": "shop_3", "x": 500, "y": 900, - "icon": "shop" + "icon": "shop", + "distance": 200 }, { "id": "food_1", - "x": 390, - "y": 590, - "icon": "food" + "label": "Сезоны", + "x": 970, + "y": 850, + "icon": "food", + "distance": 300 }, { "id": "food_2", - "x": 590, - "y": 990, - "icon": "food" + "label": "Штерн", + "x": 920, + "y": 1030, + "icon": "food", + "distance": 200 }, { "id": "food_3", + "label": "Lo Vegano", "x": 1190, - "y": 990, - "icon": "food" + "y": 1120, + "icon": "food", + "distance": 250 + }, + { + "id": "food_4", + "label": "La Coffeina", + "x": 1070, + "y": 1200, + "icon": "food", + "distance": 250 + }, + { + "id": "food_5", + "label": "Фартук", + "x": 930, + "y": 1170, + "icon": "food", + "distance": 250 + }, + { + "id": "food_6", + "label": "Breadway", + "x": 1090, + "y": 870, + "icon": "food", + "distance": 250 + }, + { + "id": "food_7", + "label": "Cucina", + "x": 1180, + "y": 890, + "icon": "food", + "distance": 300 + }, + { + "id": "food_8", + "label": "Демидов", + "x": 1280, + "y": 960, + "icon": "food", + "distance": 350 + }, + { + "id": "food_9", + "label": "БарБорис", + "x": 1090, + "y": 770, + "icon": "food", + "distance": 400 + }, + { + "id": "food_10", + "label": "Барашка на гранате", + "x": 1360, + "y": 1020, + "icon": "food", + "distance": 450 + }, + { + "id": "food_11", + "label": "Dorian Gray", + "x": 1330, + "y": 1140, + "icon": "food", + "distance": 400 + }, + { + "id": "food_12", + "label": "Витязь", + "x": 860, + "y": 1240, + "icon": "food", + "distance": 400 + }, + { + "id": "food_13", + "label": "Coffee&Flowers", + "x": 820, + "y": 1190, + "icon": "food", + "distance": 400 } ] diff --git a/src/types/Mark.ts b/src/types/Mark.ts index 15cb496..2c80786 100644 --- a/src/types/Mark.ts +++ b/src/types/Mark.ts @@ -1,6 +1,8 @@ interface Mark { id: string; + label: string; icon: string; + distance: number; x: number; y: number; width?: number;