/* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/prefer-optional-chain */ /* eslint-disable @typescript-eslint/no-misused-promises */ /* eslint-disable @typescript-eslint/no-non-null-assertion */ /* eslint-disable @typescript-eslint/no-unsafe-member-access */ /* eslint-disable @typescript-eslint/no-unsafe-argument */ /* eslint-disable @typescript-eslint/no-unsafe-call */ import { useEffect, useRef, useState } from 'react' import { toast } from 'react-toastify' import { useAuth } from '#components/Auth/useAuth' import { TextInput, TextAreaInput } from '#components/Input' import { PopupStartEndInput } from '#components/Map' import { useFilterTags } from '#components/Map/hooks/useFilter' import { useAddItem, useItems, useRemoveItem } from '#components/Map/hooks/useItems' import { useLayers } from '#components/Map/hooks/useLayers' import { useAddTag, useGetItemTags, useTags } from '#components/Map/hooks/useTags' import { Control } from '#components/Map/Subcomponents/Controls/Control' import { SearchControl } from '#components/Map/Subcomponents/Controls/SearchControl' import { TagsControl } from '#components/Map/Subcomponents/Controls/TagsControl' import { PlusButton } from '#components/Profile/Subcomponents/PlusButton' import { Item } from '#src/types' import { hashTagRegex } from '#utils/HashTagRegex' import { randomColor } from '#utils/RandomColor' import { ItemCard } from './ItemCard' import { MapOverlayPage } from './MapOverlayPage' export const OverlayItemsIndexPage = ({ url, layerName, parameterField, plusButton = true, }: { layerName: string url: string parameterField: string plusButton?: boolean }) => { const [loading, setLoading] = useState(false) const [addItemPopupType, setAddItemPopupType] = useState('') const tabRef = useRef(null) function scroll() { tabRef.current?.scrollIntoView() } useEffect(() => { scroll() }, [addItemPopupType]) useEffect(() => { setAddItemPopupType('') }, [layerName]) const tags = useTags() const addTag = useAddTag() const { user } = useAuth() const items = useItems() const addItem = useAddItem() const removeItem = useRemoveItem() const layers = useLayers() const filterTags = useFilterTags() const getItemTags = useGetItemTags() const layer = layers.find((l) => l.name === layerName) const submitNewItem = async (evt: any) => { evt.preventDefault() const formItem: Item = {} as Item Array.from(evt.target).forEach((input: HTMLInputElement) => { if (input.name) { formItem[input.name] = input.value } }) setLoading(true) formItem.text && formItem.text .toLocaleLowerCase() .match(hashTagRegex) ?.map((tag) => { if (!tags.find((t) => t.name.toLocaleLowerCase() === tag.slice(1).toLocaleLowerCase())) { addTag({ id: crypto.randomUUID(), name: tag.slice(1), color: randomColor() }) } return null }) const uuid = crypto.randomUUID() let success = false try { await layer?.api?.createItem!({ ...formItem, id: uuid }) success = true } catch (error) { toast.error(error.toString()) } if (success) { toast.success('New item created') } addItem({ ...formItem, user_created: user, id: uuid, layer, public_edit: !user }) setLoading(false) setAddItemPopupType('') } const deleteItem = async (item) => { setLoading(true) let success = false try { await layer?.api?.deleteItem!(item.id) success = true } catch (error) { toast.error(error.toString()) } if (success) { toast.success('Item deleted') } removeItem(item) setLoading(false) } return ( <>
{items .filter((i) => i.layer?.name === layerName) .filter((item) => filterTags.length === 0 ? item : filterTags.some((tag) => getItemTags(item).some( (filterTag) => filterTag.name.toLocaleLowerCase() === tag.name.toLocaleLowerCase(), ), ), ) .sort((a, b) => { // Convert date_created to milliseconds, handle undefined by converting to lowest possible date (0 milliseconds) const dateA = a.date_updated ? new Date(a.date_updated).getTime() : a.date_created ? new Date(a.date_created).getTime() : 0 const dateB = b.date_updated ? new Date(b.date_updated).getTime() : b.date_created ? new Date(b.date_created).getTime() : 0 return dateB - dateA // Subtracts milliseconds which are numbers }) .map((i, k) => (
deleteItem(i)} />
))} {addItemPopupType === 'place' && (
submitNewItem(e)}>
{layer?.itemType.show_start_end_input && }
)}
{plusButton && ( { setAddItemPopupType('place') scroll() }} color={'#777'} collection='items' /> )} ) }