import { useItems, useUpdateItem } from '../Map/hooks/useItems' import { useEffect, useState } from 'react'; import { getValue } from '../../Utils/GetValue'; import { toast } from 'react-toastify'; import { useAuth } from '../Auth'; import { TextInput, TextAreaInput } from '../Input'; import { ColorPicker } from './ColorPicker'; import { hashTagRegex } from '../../Utils/HashTagRegex'; import { useAddTag, useTags } from '../Map/hooks/useTags'; import { randomColor } from '../../Utils/RandomColor'; import { useNavigate } from 'react-router-dom'; import { Tag, UserItem } from '../../types'; import { MapOverlayPage } from '../Templates'; import { TagsWidget } from './TagsWidget'; import { encodeTag } from '../../Utils/FormatTags'; import { AvatarWidget } from './AvatarWidget'; export function OverlayProfileSettings() { const { user, updateUser, loading } = useAuth(); const [id, setId] = useState(""); const [name, setName] = useState(""); const [text, setText] = useState(""); const [avatar, setAvatar] = useState(""); const [color, setColor] = useState(""); const [offers, setOffers] = useState>([]); const [needs, setNeeds] = useState>([]); const [contact, setContact] = useState(""); const [activeTab, setActiveTab] = useState(1); const items = useItems(); const updateItem = useUpdateItem(); const tags = useTags(); const addTag = useAddTag(); const navigate = useNavigate(); useEffect(() => { setId(user?.id ? user.id : ""); setName(user?.first_name ? user.first_name : ""); setText(user?.description ? user.description : ""); setAvatar(user?.avatar ? user?.avatar : ""); setColor(user?.color ? user.color : "#3D3846"); setOffers([]); setNeeds([]); user?.offers.map(o=> { const offer = tags.find(t => t.id === o.tags_id); offer && setOffers(current => [...current,offer]) }) user?.needs.map(o=> { const need = tags.find(t => t.id === o.tags_id); need && setNeeds(current => [...current,need]) }) setContact(user?.contact ? user.contact : ""); }, [user]) const onUpdateUser = async () => { let changedUser = {} as UserItem; let offer_updates : Array = []; //check for new offers offers.map(o => { const existingOffer = user?.offers.find(t => t.tags_id === o.id) existingOffer && offer_updates.push(existingOffer.id) if(!existingOffer && !tags.some(t => t.id === o.id)) addTag({...o,offer_or_need: true}) !existingOffer && offer_updates.push({directus_user_id: user?.id, tags_id: o.id}) }); let needs_updates : Array = []; needs.map(n => { const existingNeed = user?.needs.find(t => t.tags_id === n.id) existingNeed && needs_updates.push(existingNeed.id) !existingNeed && needs_updates.push({directus_user_id: user?.id, tags_id: n.id}) !existingNeed && !tags.some(t => t.id === n.id) && addTag({...n,offer_or_need: true}) }); changedUser = { id: id, first_name: name, description: text, contact: contact, color: color, ...avatar.length > 10 && { avatar: avatar }, ... offers.length > 0 && {offers: offer_updates}, ... needs.length > 0 && {needs: needs_updates} }; // update profile item in current state const item = items.find(i => i.layer?.itemOwnerField && getValue(i, i.layer?.itemOwnerField).id === id); let offer_state : Array = []; let needs_state : Array = []; await offers.map(o => { offer_state.push({directus_user_id: user?.id, tags_id: o.id}) }); await needs.map(n => { needs_state.push({directus_user_id: user?.id, tags_id: n.id}) }); if (item && item.layer && item.layer.itemOwnerField) item[item.layer.itemOwnerField] = {... changedUser, offers: offer_state, needs: needs_state}; // add new hashtags from profile text text.toLocaleLowerCase().match(hashTagRegex)?.map(tag => { if (!tags.find((t) => t.name.toLocaleLowerCase() === tag.slice(1).toLocaleLowerCase())) { addTag({ id: crypto.randomUUID(), name: encodeTag(tag.slice(1).toLocaleLowerCase()), color: randomColor()}) } }); toast.promise( updateUser(changedUser), { pending: 'updating Profile ...', success: 'Profile updated', error: { render({ data }) { return `${data}` }, }, }) .then(() => item && updateItem(item)) .then(() => navigate("/")); } return ( <>
setName(v)} containerStyle='tw-grow tw-ml-6 tw-my-auto ' />
setActiveTab(1)} />
setText(v)} containerStyle='tw-h-full' inputStyle='tw-h-full tw-border-t-0 tw-rounded-tl-none' />
setActiveTab(2)} />
setOffers(v)} placeholder="enter your offers" containerStyle='tw-bg-transparent tw-w-full tw-h-full tw-mt-3 tw-text-xs tw-h-[calc(100%-1rem)] tw-min-h-[5em] tw-pb-2 tw-overflow-auto'/>
setNeeds(v)} placeholder="enter your needs" containerStyle='tw-bg-transparent tw-w-full tw-h-full tw-mt-3 tw-text-xs tw-h-[calc(100%-1rem)] tw-min-h-[5em] tw-pb-2 tw-overflow-auto'/>
setActiveTab(3)} />
setContact(v)} containerStyle='tw-h-full' inputStyle='tw-h-full tw-border-t-0 ' />
) }