import { ReactNode, useEffect, useRef, useState } from 'react' import { Link, useNavigate } from 'react-router-dom'; import { Item, ItemsApi, LayerProps } from '../../types'; import { getValue } from '../../Utils/GetValue'; import { TextView } from '../Map'; import { PlusButton } from '../Profile/PlusButton'; import { TextInput, TextAreaInput } from '../Input'; import { useAddTag, useTags } from '../Map/hooks/useTags'; import { toast } from 'react-toastify'; import { hashTagRegex } from '../../Utils/HashTagRegex'; import { randomColor } from '../../Utils/RandomColor'; import { useAuth } from '../Auth'; import { useLayers } from '../Map/hooks/useLayers'; import { HeaderView } from '../Map/Subcomponents/ItemPopupComponents/HeaderView'; import { MapOverlayPage } from './MapOverlayPage'; import { useAddItem, useItems, useRemoveItem } from '../Map/hooks/useItems'; import { timeAgo } from '../../Utils/TimeAgo'; type breadcrumb = { name: string, path: string } export const OverlayItemsIndexPage = ({ url, layerName, parameterField, breadcrumbs, itemNameField, itemTextField, itemImageField, itemSymbolField, itemSubnameField, plusButton = true, children }: { layerName: string, url: string, parameterField: string, breadcrumbs: Array, itemNameField: string, itemTextField: string, itemImageField: string, itemSymbolField: string, itemSubnameField: string, plusButton?: boolean, children?: ReactNode }) => { console.log(itemSymbolField); const [loading, setLoading] = useState(false); const [addItemPopupType, setAddItemPopupType] = useState(""); const tabRef = useRef(null); function scroll() { tabRef.current?.scrollIntoView(); } useEffect(() => { scroll(); }, [addItemPopupType]) const navigate = useNavigate(); const tags = useTags(); const addTag = useAddTag(); const { user } = useAuth(); const items = useItems(); const addItem = useAddItem(); const removeItem = useRemoveItem(); const layers = useLayers(); useEffect(() => { console.log(items); }, [items]) 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() }) } }); 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: layer }); 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 ( <>
{breadcrumbs &&
    {breadcrumbs.map((b, i) =>
  • {b.name}
  • )}
}
{ items?.filter(i => i.layer?.name === layerName) .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) => { return (
navigate(url + getValue(i, parameterField))}> navigate("/edit-item/" + i.id)} deleteCallback={() => deleteItem(i)}>

{`${i.date_updated && i.date_updated != i.date_created ? "updated" : "posted" } ${i && i.user_created && i.user_created.first_name ? `by ${i.user_created.first_name}` : ""} ${i.date_updated ? timeAgo(i.date_updated) : timeAgo(i.date_created!)}`}

{ //** */ }
) }) } {addItemPopupType == "place" ?
submitNewItem(e)} >
: <> }
{children}
{plusButton && { setAddItemPopupType("place"); scroll(); }} color={'#777'} collection='items' />} ) }