import { MapOverlayPage } from '../Templates' import { useItems, useRemoveItem, useUpdateItem } from '../Map/hooks/useItems' import { useLocation, useNavigate } from 'react-router-dom' import { useEffect, useState } from 'react'; import { Item, ItemsApi, Tag } from '../../types'; import { useMap } from 'react-leaflet'; import { LatLng } from 'leaflet'; import { useHasUserPermission } from '../Map/hooks/usePermissions'; import { HeaderView } from '../Map/Subcomponents/ItemPopupComponents/HeaderView'; import { useSelectPosition, useSetSelectPosition } from '../Map/hooks/useSelectPosition'; import { useClusterRef } from '../Map/hooks/useClusterRef'; import { useLeafletRefs } from '../Map/hooks/useLeafletRefs'; import { getValue } from '../../Utils/GetValue'; import { TabsView } from './Templates/TabsView'; import { OnepagerView } from './Templates/OnepagerView'; import { SimpleView } from './Templates/SimpleView'; import { handleDelete, linkItem, unlinkItem } from './itemFunctions'; import { useTags } from '../Map/hooks/useTags'; export function ProfileView({ userType, attestationApi }: { userType: string , attestationApi?: ItemsApi}) { const [item, setItem] = useState() const [updatePermission, setUpdatePermission] = useState(false); const [relations, setRelations] = useState>([]); const [offers, setOffers] = useState>([]); const [needs, setNeeds] = useState>([]); const [loading, setLoading] = useState(false); const [template, setTemplate] = useState(""); const location = useLocation(); const items = useItems(); const updateItem = useUpdateItem(); const map = useMap(); const selectPosition = useSelectPosition(); const removeItem = useRemoveItem(); const tags = useTags(); const navigate = useNavigate(); const hasUserPermission = useHasUserPermission(); const setSelectPosition = useSetSelectPosition(); const clusterRef = useClusterRef(); const leafletRefs = useLeafletRefs(); const [attestations, setAttestations] = useState>([]); useEffect(() => { if (attestationApi) { attestationApi.getItems() .then(value => { console.log(value); setAttestations(value); }) .catch(error => { console.error("Error fetching items:", error); }); } }, [attestationApi]) useEffect(() => { const itemId = location.pathname.split("/")[2]; const item = items.find(i => i.id === itemId); item && setItem(item); }, [items, location]) useEffect(() => { setOffers([]); setNeeds([]); setRelations([]); item?.layer?.itemOffersField && getValue(item, item.layer.itemOffersField)?.map(o => { const tag = tags.find(t => t.id === o.tags_id); tag && setOffers(current => [...current, tag]) }) item?.layer?.itemNeedsField && getValue(item, item.layer.itemNeedsField)?.map(n => { const tag = tags.find(t => t.id === n.tags_id); tag && setNeeds(current => [...current, tag]) }) item?.relations?.map(r => { const item = items.find(i => i.id == r.related_items_id) item && setRelations(current => [...current, item]) }) // eslint-disable-next-line react-hooks/exhaustive-deps }, [item, items]) useEffect(() => { const setMap = async (marker, x) => { await map.setView(new LatLng(item?.position?.coordinates[1]!, item?.position?.coordinates[0]! + x / 4), undefined); setTimeout(() => { marker.openPopup(); }, 500); } if (item) { if (item.position) { const marker = Object.entries(leafletRefs).find(r => r[1].item == item)?.[1].marker; marker && clusterRef.hasLayer(marker) && clusterRef?.zoomToShowLayer(marker, () => { const bounds = map.getBounds(); const x = bounds.getEast() - bounds.getWest(); setMap(marker, x); } ); } else { const parent = getFirstAncestor(item); const marker = Object.entries(leafletRefs).find(r => r[1].item == parent)?.[1].marker; marker && clusterRef.hasLayer(marker) && clusterRef?.zoomToShowLayer(marker, () => { const bounds = map.getBounds(); const x = bounds.getEast() - bounds.getWest(); setMap(marker, x); } ); } } // eslint-disable-next-line react-hooks/exhaustive-deps }, [item]) const getFirstAncestor = (item: Item): Item | undefined => { const parent = items.find(i => i.id === item.parent); if (parent?.parent) { return getFirstAncestor(parent); } else { return parent; } }; useEffect(() => { item && hasUserPermission("items", "update", item) && setUpdatePermission(true); // eslint-disable-next-line react-hooks/exhaustive-deps }, [item]) useEffect(() => { selectPosition && map.closePopup(); // eslint-disable-next-line react-hooks/exhaustive-deps }, [selectPosition]) useEffect(() => { setTemplate(item?.layer?.itemType.template || userType); }, [userType, item]) const [/* urlParams, */ setUrlParams] = useState(new URLSearchParams(location.search)); return ( <> {item && <>
handleDelete(e, item, setLoading, removeItem, map, navigate)} editCallback={() => navigate("/edit-item/" + item.id)} setPositionCallback={() => { map.closePopup(); setSelectPosition(item); navigate("/") }} big truncateSubname={false} />
{template == "onepager" && } {template == "simple" && } {template == "tabs" && linkItem(id, item, updateItem)} unlinkItem={(id) => unlinkItem(id, item, updateItem)}/> }
} ) }