parent
f31b7a4c74
commit
93c3e06c52
@ -0,0 +1,29 @@
|
|||||||
|
import { Layer, Source } from "react-map-gl";
|
||||||
|
import { gridLayer } from "./layers-config";
|
||||||
|
import { useGridSize } from "../stores/useGridSize";
|
||||||
|
import { useLayersVisibility } from "../stores/useLayersVisibility";
|
||||||
|
|
||||||
|
export const Grid = () => {
|
||||||
|
const { gridSize } = useGridSize();
|
||||||
|
const {
|
||||||
|
isVisible: { grid },
|
||||||
|
} = useLayersVisibility();
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Source
|
||||||
|
id="grid"
|
||||||
|
type="vector"
|
||||||
|
tiles={[
|
||||||
|
`http://postamates.spatiality.website/martin/public.${gridSize}/{z}/{x}/{y}.pbf`,
|
||||||
|
]}
|
||||||
|
>
|
||||||
|
<Layer
|
||||||
|
{...gridLayer}
|
||||||
|
layout={{
|
||||||
|
...gridLayer.layout,
|
||||||
|
visibility: grid ? "visible" : "none",
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</Source>
|
||||||
|
);
|
||||||
|
};
|
||||||
@ -1,47 +1,28 @@
|
|||||||
import { Layer, Source } from "react-map-gl";
|
import { Grid } from "./Grid";
|
||||||
import { gridLayer, pointLayer } from "./layers-config";
|
import { useRating } from "../stores/useRating";
|
||||||
import {
|
|
||||||
getGridVisibility,
|
|
||||||
getPointsVisibility,
|
|
||||||
useLayersStore,
|
|
||||||
} from "../stores/useLayersStore";
|
|
||||||
|
|
||||||
export const Layers = () => {
|
export const Layers = () => {
|
||||||
const isPointsVisible = useLayersStore(getPointsVisibility);
|
const { rate } = useRating();
|
||||||
const isGridVisible = useLayersStore(getGridVisibility);
|
|
||||||
|
|
||||||
|
console.log(rate);
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<Source
|
<Grid />
|
||||||
id="grid"
|
{/*<Source*/}
|
||||||
type="vector"
|
{/* id="points"*/}
|
||||||
tiles={[
|
{/* type="vector"*/}
|
||||||
"https://business.spatiality.website/martin/public.service_polygon/{z}/{x}/{y}.pbf",
|
{/* tiles={[*/}
|
||||||
]}
|
{/* "https://property.spatiality.website/public.service_geofeature/{z}/{x}/{y}.pbf",*/}
|
||||||
>
|
{/* ]}*/}
|
||||||
<Layer
|
{/*>*/}
|
||||||
{...gridLayer}
|
{/* <Layer*/}
|
||||||
layout={{
|
{/* {...pointLayer}*/}
|
||||||
...gridLayer.layout,
|
{/* layout={{*/}
|
||||||
visibility: isGridVisible ? "visible" : "none",
|
{/* ...pointLayer.layout,*/}
|
||||||
}}
|
{/* visibility: isPointsVisible ? "visible" : "none",*/}
|
||||||
/>
|
{/* }}*/}
|
||||||
</Source>
|
{/* />*/}
|
||||||
<Source
|
{/*</Source>*/}
|
||||||
id="points"
|
|
||||||
type="vector"
|
|
||||||
tiles={[
|
|
||||||
"https://business.spatiality.website/martin/public.service_point/{z}/{x}/{y}.pbf",
|
|
||||||
]}
|
|
||||||
>
|
|
||||||
<Layer
|
|
||||||
{...pointLayer}
|
|
||||||
layout={{
|
|
||||||
...pointLayer.layout,
|
|
||||||
visibility: isPointsVisible ? "visible" : "none",
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
</Source>
|
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@ -0,0 +1,52 @@
|
|||||||
|
import { Title } from "./Title";
|
||||||
|
import { Slider } from "antd";
|
||||||
|
import { useState } from "react";
|
||||||
|
|
||||||
|
const Mark = ({ value }) => {
|
||||||
|
return <span className={"text-grey text-xs"}>{value}</span>;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const SliderComponent = ({
|
||||||
|
title,
|
||||||
|
value: initialValue,
|
||||||
|
onChange,
|
||||||
|
onAfterChange,
|
||||||
|
min = 0,
|
||||||
|
max = 100,
|
||||||
|
}) => {
|
||||||
|
const fullRangeMarks = {
|
||||||
|
[min]: <Mark value={min} />,
|
||||||
|
[max]: <Mark value={max} />,
|
||||||
|
};
|
||||||
|
const [value, setValue] = useState(initialValue);
|
||||||
|
const [marks, setMarks] = useState(fullRangeMarks);
|
||||||
|
|
||||||
|
const handleAfterChange = (value) => {
|
||||||
|
const [min, max] = value;
|
||||||
|
setMarks({
|
||||||
|
...fullRangeMarks,
|
||||||
|
[min]: <Mark value={min} />,
|
||||||
|
[max]: <Mark value={max} />,
|
||||||
|
});
|
||||||
|
|
||||||
|
onAfterChange?.(value);
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleChange = (value) => {
|
||||||
|
setValue(value);
|
||||||
|
onChange?.(value);
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<Title text={title} />
|
||||||
|
<Slider
|
||||||
|
range
|
||||||
|
value={value}
|
||||||
|
marks={marks}
|
||||||
|
onChange={handleChange}
|
||||||
|
onAfterChange={handleAfterChange}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
@ -0,0 +1,29 @@
|
|||||||
|
import { Radio } from "antd";
|
||||||
|
import { Title } from "../../components/Title";
|
||||||
|
import { useGridSize } from "../../stores/useGridSize";
|
||||||
|
|
||||||
|
const options = [
|
||||||
|
{ label: "3 мин", value: "net3" },
|
||||||
|
{ label: "4 мин", value: "net4" },
|
||||||
|
{ label: "5 мин", value: "net5" },
|
||||||
|
];
|
||||||
|
|
||||||
|
export const GridSizeSelect = () => {
|
||||||
|
const { gridSize, setGridSize } = useGridSize();
|
||||||
|
const onChange = ({ target: { value } }) => {
|
||||||
|
setGridSize(value);
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className={"flex flex-col items-center"}>
|
||||||
|
<Title text={"Зона пешей доступности"} />
|
||||||
|
<Radio.Group
|
||||||
|
options={options}
|
||||||
|
onChange={onChange}
|
||||||
|
value={gridSize}
|
||||||
|
optionType="button"
|
||||||
|
buttonStyle={"solid"}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
@ -0,0 +1,26 @@
|
|||||||
|
import { Select } from "antd";
|
||||||
|
import { Title } from "../../components/Title";
|
||||||
|
import { useState } from "react";
|
||||||
|
|
||||||
|
const options = [
|
||||||
|
{ value: "statistic", label: "Обычная" },
|
||||||
|
{ value: "ml", label: "Основанная на ML" },
|
||||||
|
];
|
||||||
|
|
||||||
|
export const ModelSelect = () => {
|
||||||
|
const [value, setValue] = useState("statistic");
|
||||||
|
const handleChange = (newValue) => setValue(newValue);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className={"flex flex-col items-center"}>
|
||||||
|
<Title text={"Модель расчета"} />
|
||||||
|
<Select
|
||||||
|
className={"w-full"}
|
||||||
|
value={value}
|
||||||
|
onChange={handleChange}
|
||||||
|
options={options}
|
||||||
|
disabled={true}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
@ -1,34 +1,16 @@
|
|||||||
import { Slider } from "antd";
|
import { useRating } from "../../stores/useRating";
|
||||||
import { Title } from "../../components/Title";
|
import { SliderComponent as Slider } from "../../components/Slider";
|
||||||
import { useState } from "react";
|
|
||||||
|
|
||||||
const Mark = ({ value }) => {
|
|
||||||
return <span className={"text-grey text-xs"}>{value}</span>;
|
|
||||||
};
|
|
||||||
|
|
||||||
const fullRangeMarks = { 0: <Mark value={0} />, 100: <Mark value={100} /> };
|
|
||||||
|
|
||||||
export const RatingSlider = () => {
|
export const RatingSlider = () => {
|
||||||
const [marks, setMarks] = useState(fullRangeMarks);
|
const { rate, setRate } = useRating();
|
||||||
|
|
||||||
const handleAfterChange = (range) => {
|
const handleAfterChange = (range) => setRate(range);
|
||||||
const [min, max] = range;
|
|
||||||
setMarks({
|
|
||||||
...fullRangeMarks,
|
|
||||||
[min]: <Mark value={min} />,
|
|
||||||
[max]: <Mark value={max} />,
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div>
|
<Slider
|
||||||
<Title text={"Востребованность постамата, усл. ед."} />
|
title={"Востребованность постамата, усл. ед."}
|
||||||
<Slider
|
value={rate}
|
||||||
range
|
onAfterChange={handleAfterChange}
|
||||||
defaultValue={[0, 100]}
|
/>
|
||||||
marks={marks}
|
|
||||||
onAfterChange={handleAfterChange}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@ -0,0 +1,18 @@
|
|||||||
|
import { SliderComponent as Slider } from "../../components/Slider";
|
||||||
|
import { Button } from "antd";
|
||||||
|
|
||||||
|
export const Settings = () => {
|
||||||
|
return (
|
||||||
|
<div className={"space-y-2 min-w-[300px]"}>
|
||||||
|
<Slider title={"Количество жителей"} />
|
||||||
|
<Slider title={"Количество станций метро"} />
|
||||||
|
<Slider title={"Количество существующих постаматов"} />
|
||||||
|
<Slider title={"Whatever"} />
|
||||||
|
<div>
|
||||||
|
<Button type="primary" block className={"mt-2"}>
|
||||||
|
Рассчитать
|
||||||
|
</Button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
@ -0,0 +1,20 @@
|
|||||||
|
import create from "zustand";
|
||||||
|
import { immer } from "zustand/middleware/immer";
|
||||||
|
|
||||||
|
const store = (set) => ({
|
||||||
|
activeTypes: [],
|
||||||
|
setActiveTypes: (type) =>
|
||||||
|
set((state) => {
|
||||||
|
if (Array.isArray(type)) {
|
||||||
|
state.activeTypes = [];
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (state.activeTypes.includes(type)) {
|
||||||
|
state.activeTypes = state.activeTypes.filter((id) => id !== type);
|
||||||
|
} else {
|
||||||
|
state.activeTypes.push(type);
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
|
||||||
|
export const useActiveTypes = create(immer(store));
|
||||||
@ -0,0 +1,12 @@
|
|||||||
|
import create from "zustand";
|
||||||
|
import { immer } from "zustand/middleware/immer";
|
||||||
|
|
||||||
|
const store = (set) => ({
|
||||||
|
gridSize: "net3",
|
||||||
|
setGridSize: (value) =>
|
||||||
|
set((state) => {
|
||||||
|
state.gridSize = value;
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
|
||||||
|
export const useGridSize = create(immer(store));
|
||||||
@ -1,29 +0,0 @@
|
|||||||
import create from "zustand";
|
|
||||||
import { immer } from "zustand/middleware/immer";
|
|
||||||
|
|
||||||
const INITIAL_STATE = {
|
|
||||||
points: {
|
|
||||||
visible: true,
|
|
||||||
filter: {},
|
|
||||||
},
|
|
||||||
grid: {
|
|
||||||
visible: true,
|
|
||||||
filter: {},
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
const store = (set) => ({
|
|
||||||
layers: INITIAL_STATE,
|
|
||||||
toggleVisibility: (layerId) =>
|
|
||||||
set((state) => {
|
|
||||||
state.layers[layerId].visible = !state.layers[layerId].visible;
|
|
||||||
}),
|
|
||||||
});
|
|
||||||
|
|
||||||
export const useLayersStore = create(immer(store));
|
|
||||||
|
|
||||||
export const getLayerVisibility = (layerId) => (state) =>
|
|
||||||
state.layers[layerId].visible;
|
|
||||||
|
|
||||||
export const getPointsVisibility = getLayerVisibility("points");
|
|
||||||
export const getGridVisibility = getLayerVisibility("grid");
|
|
||||||
@ -0,0 +1,17 @@
|
|||||||
|
import create from "zustand";
|
||||||
|
import { immer } from "zustand/middleware/immer";
|
||||||
|
|
||||||
|
const INITIAL_STATE = {
|
||||||
|
points: true,
|
||||||
|
grid: true,
|
||||||
|
};
|
||||||
|
|
||||||
|
const store = (set) => ({
|
||||||
|
isVisible: INITIAL_STATE,
|
||||||
|
toggleVisibility: (layerId) =>
|
||||||
|
set((state) => {
|
||||||
|
state.isVisible[layerId] = !state.isVisible[layerId];
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
|
||||||
|
export const useLayersVisibility = create(immer(store));
|
||||||
@ -0,0 +1,12 @@
|
|||||||
|
import create from "zustand";
|
||||||
|
import { immer } from "zustand/middleware/immer";
|
||||||
|
|
||||||
|
const store = (set) => ({
|
||||||
|
rate: [0, 100],
|
||||||
|
setRate: (value) =>
|
||||||
|
set((state) => {
|
||||||
|
state.rate = value;
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
|
||||||
|
export const useRating = create(immer(store));
|
||||||
@ -0,0 +1,12 @@
|
|||||||
|
import create from "zustand";
|
||||||
|
import { immer } from "zustand/middleware/immer";
|
||||||
|
|
||||||
|
const store = (set) => ({
|
||||||
|
region: null,
|
||||||
|
setRegion: (value) =>
|
||||||
|
set((state) => {
|
||||||
|
state.region = value;
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
|
||||||
|
export const useRegion = create(immer(store));
|
||||||
Loading…
Reference in new issue