You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
129 lines
3.8 KiB
129 lines
3.8 KiB
import { CATEGORIES, STATUSES } from "../../../config";
|
|
import {
|
|
commonPopupConfig,
|
|
residentialPopupFields,
|
|
rivalsConfig,
|
|
workingPointFields,
|
|
} from "./config";
|
|
import { Col, Row } from "antd";
|
|
import { twMerge } from "tailwind-merge";
|
|
import { LAYER_IDS } from "../../Layers/constants";
|
|
import {getFilteredGroups, isNil} from "../../../utils.js";
|
|
import { useGetRegions } from "../../../components/RegionSelect.jsx";
|
|
import {useOtherGroups, usePostamatesAndPvzGroups} from "../../../api.js";
|
|
import {useMemo} from "react";
|
|
import { TrafficModal } from "../../TrafficModal.jsx";
|
|
|
|
const getRivalsName = (feature) => {
|
|
const { data: postamatesAndPvzGroups } = usePostamatesAndPvzGroups();
|
|
const { data: otherGroups } = useOtherGroups();
|
|
|
|
const filteredPostamatesCategories = useMemo(() => {
|
|
return getFilteredGroups(postamatesAndPvzGroups);
|
|
}, [postamatesAndPvzGroups]);
|
|
|
|
const filteredOtherCategories = useMemo(() => {
|
|
return getFilteredGroups(otherGroups);
|
|
}, [otherGroups]);
|
|
|
|
const filteredPostamatesGroups = useMemo(() => {
|
|
if (!filteredPostamatesCategories) return [];
|
|
return filteredPostamatesCategories
|
|
.map((category) => {
|
|
return [...category.groups]
|
|
}).flat();
|
|
}, [filteredPostamatesCategories]);
|
|
|
|
const filteredOtherGroups = useMemo(() => {
|
|
if (!filteredOtherCategories) return [];
|
|
return filteredOtherCategories
|
|
.map((category) => {
|
|
return [...category.groups]
|
|
}).flat();
|
|
}, [filteredOtherCategories]);
|
|
|
|
const isOther = feature.layer?.id.includes(LAYER_IDS.other);
|
|
const name = isOther ?
|
|
filteredOtherCategories.find(c => c.id === feature.properties.category_id)?.name :
|
|
filteredPostamatesCategories.find(c => c.id === feature.properties.category_id)?.name;
|
|
|
|
const groupName = isOther ?
|
|
filteredOtherGroups.find(c => c.id === feature.properties.group_id)?.name :
|
|
filteredPostamatesGroups.find(c => c.id === feature.properties.group_id)?.name;
|
|
|
|
return {
|
|
name,
|
|
groupName
|
|
}
|
|
}
|
|
|
|
export const FeatureProperties = ({ feature, dynamicStatus, postamatId, point }) => {
|
|
const { data } = useGetRegions();
|
|
const isResidential = feature.properties.category === CATEGORIES.residential;
|
|
const isWorking = feature.properties.status === STATUSES.working;
|
|
const { name, groupName } = getRivalsName(feature);
|
|
|
|
const isRivals =
|
|
feature.layer?.id.includes(LAYER_IDS.pvz) ||
|
|
feature.layer?.id.includes(LAYER_IDS.other);
|
|
|
|
const getConfig = () => {
|
|
if (isRivals) {
|
|
return rivalsConfig;
|
|
}
|
|
|
|
const config = isWorking ? [...commonPopupConfig, ...workingPointFields] : commonPopupConfig;
|
|
return isResidential ? [...config, ...residentialPopupFields] : config;
|
|
};
|
|
|
|
const getValue = ({ field, render, empty, type, fallbackField }) => {
|
|
let value = point ? point[field] : feature.properties[field];
|
|
|
|
if (field === "prediction_current") {
|
|
value = <TrafficModal point={point} />;
|
|
}
|
|
|
|
if (field === "category_id") {
|
|
value = name;
|
|
}
|
|
|
|
if (field === "group_id") {
|
|
value = groupName;
|
|
}
|
|
|
|
if (field === "status" && dynamicStatus) {
|
|
value = dynamicStatus;
|
|
}
|
|
|
|
if (field === "postamat_id" && postamatId) {
|
|
value = postamatId;
|
|
}
|
|
|
|
if (type === "region") {
|
|
const valueProvider = point ? point : feature
|
|
value = value ? value : valueProvider[fallbackField];
|
|
value = render(value, data?.normalized);
|
|
} else {
|
|
value = render ? render(value) : value;
|
|
value = isNil(value) && empty ? empty : value;
|
|
}
|
|
|
|
return value;
|
|
};
|
|
|
|
return (
|
|
<div>
|
|
{getConfig().map((row) => {
|
|
return (
|
|
<Row className={twMerge("p-1")} key={row.field}>
|
|
<Col className={"font-semibold"} span={12}>
|
|
{row.name}
|
|
</Col>
|
|
<Col span={12}>{getValue(row)}</Col>
|
|
</Row>
|
|
);
|
|
})}
|
|
</div>
|
|
);
|
|
};
|