import clsx from 'clsx' import { useRouter } from 'next/router' import { useState } from 'react' import { groupPath } from 'web/lib/firebase/groups' import { ConfirmationButton } from '../confirmation-button' import { Col } from '../layout/col' import { Spacer } from '../layout/spacer' import { Title } from '../title' import { FilterSelectUsers } from 'web/components/filter-select-users' import { User } from 'common/user' import { MAX_GROUP_NAME_LENGTH } from 'common/group' import { createGroup } from 'web/lib/firebase/api' export function CreateGroupButton(props: { user: User className?: string label?: string onOpenStateChange?: (isOpen: boolean) => void goToGroupOnSubmit?: boolean icon?: JSX.Element }) { const { user, className, label, onOpenStateChange, goToGroupOnSubmit, icon } = props const [defaultName, setDefaultName] = useState(`${user.name}'s group`) const [name, setName] = useState('') const [memberUsers, setMemberUsers] = useState([]) const [isSubmitting, setIsSubmitting] = useState(false) const [errorText, setErrorText] = useState('') const router = useRouter() function updateMemberUsers(users: User[]) { const usersFirstNames = users.map((user) => user.name.split(' ')[0]) const postFix = usersFirstNames.length > 3 ? ` & ${usersFirstNames.length - 3} more` : '' const newName = `${user.name.split(' ')[0]}${ users.length > 0 ? ', ' + usersFirstNames.slice(0, 3).join(', ') : '' }${postFix}'s group` setDefaultName(newName) setMemberUsers(users) } const onSubmit = async () => { setIsSubmitting(true) const groupName = name !== '' ? name : defaultName const newGroup = { name: groupName, memberIds: memberUsers.map((user) => user.id), anyoneCanJoin: true, } const result = await createGroup(newGroup).catch((e) => { const errorDetails = e.details[0] if (errorDetails) setErrorText( `Error with ${errorDetails.field} field - ${errorDetails.error} ` ) else setErrorText(e.message) setIsSubmitting(false) console.error(e) return e }) console.log(result.details) if (result.group) { updateMemberUsers([]) if (goToGroupOnSubmit) router.push(groupPath(result.group.slug)).catch((e) => { console.log(e) setErrorText(e.message) }) setIsSubmitting(false) return true } else { setIsSubmitting(false) return false } } if (user.isBannedFromPosting) return <> return ( { onOpenStateChange?.(isOpen) updateMemberUsers([]) setName('') }} > <Col className="gap-1 text-gray-500"> <div>You can add markets and members to your group after creation.</div> </Col> <div className={'text-error'}>{errorText}</div> <div> <div className="form-control w-full"> <label className="label"> <span className="mb-0">Add members (optional)</span> </label> <FilterSelectUsers setSelectedUsers={updateMemberUsers} selectedUsers={memberUsers} ignoreUserIds={[user.id]} /> </div> <div className="form-control w-full"> <label className="label"> <span className="mt-1">Group name (optional)</span> </label> <input placeholder={defaultName} className="input input-bordered resize-none" disabled={isSubmitting} value={name} maxLength={MAX_GROUP_NAME_LENGTH} onChange={(e) => setName(e.target.value || '')} /> </div> <Spacer h={4} /> </div> </ConfirmationButton> ) }