diff --git a/apps/web/src/components/CheckboxDropdown.tsx b/apps/web/src/components/CheckboxDropdown.tsx index 743e9d89..a710a4f4 100644 --- a/apps/web/src/components/CheckboxDropdown.tsx +++ b/apps/web/src/components/CheckboxDropdown.tsx @@ -113,7 +113,7 @@ export default function CheckboxDropdown({ <> {children} diff --git a/apps/web/src/views/card/components/MemberSelector.tsx b/apps/web/src/views/card/components/MemberSelector.tsx index 4dd8574a..44f9c74f 100644 --- a/apps/web/src/views/card/components/MemberSelector.tsx +++ b/apps/web/src/views/card/components/MemberSelector.tsx @@ -1,24 +1,20 @@ -import { Menu, Transition } from "@headlessui/react"; -import { Fragment } from "react"; -import { useForm } from "react-hook-form"; +import { useRouter } from "next/router"; +import { Menu } from "@headlessui/react"; import { HiMiniPlus } from "react-icons/hi2"; import Avatar from "~/components/Avatar"; +import CheckboxDropdown from "~/components/CheckboxDropdown"; +import { useModal } from "~/providers/modal"; import { api } from "~/utils/api"; -import { formatMemberDisplayName } from "~/utils/helpers"; -import { getPublicUrl } from "~/utils/supabase/getPublicUrl"; interface MemberSelectorProps { cardPublicId: string; members: { - publicId: string; - user: { - id: string; - name: string | null; - image: string | null; - email: string | null; - }; + key: string; + value: string; selected: boolean; + leftIcon: React.ReactNode; + imageUrl: string | undefined; }[]; isLoading: boolean; } @@ -28,6 +24,8 @@ export default function MemberSelector({ members, isLoading, }: MemberSelectorProps) { + const router = useRouter(); + const { openModal } = useModal(); const utils = api.useUtils(); const refetchCard = () => utils.card.byId.refetch({ cardPublicId }); @@ -38,18 +36,13 @@ export default function MemberSelector({ }, }); - const { register, handleSubmit, setValue, watch } = useForm({ - values: Object.fromEntries( - members.map((member) => [member.publicId, member.selected]) ?? [], - ), - }); - - const onSubmit = (values: Record) => { - console.log({ values }); - }; - const selectedMembers = members.filter((member) => member.selected); + const handleInviteMember = async () => { + await router.push(`/members`); + openModal("INVITE_MEMBER"); + }; + return ( <> {isLoading ? ( @@ -57,27 +50,28 @@ export default function MemberSelector({
) : ( - + addOrRemoveMember.mutate({ + cardPublicId, + workspaceMemberPublicId: member.key, + }) + } + handleCreate={handleInviteMember} + createNewItemLabel="Invite member" + asChild > - + {selectedMembers.length ? ( -
- {selectedMembers.map((member) => ( - - - {member.user.name - ? member.user.name - .split(" ") - .map((namePart) => namePart.charAt(0).toUpperCase()) - .join("") - : null} - - +
+ {selectedMembers.map(({ value, imageUrl }) => ( + ))}
) : ( @@ -87,77 +81,7 @@ export default function MemberSelector({ )} - - - -
-
- {members.map((member) => ( - - {() => ( -
{ - const newValue = !watch(member.publicId); - setValue(member.publicId, newValue); - - addOrRemoveMember.mutate({ - cardPublicId, - workspaceMemberPublicId: member.publicId, - }); - - handleSubmit(onSubmit); - }} - > - event.stopPropagation()} - {...register(member.publicId)} - checked={watch(member.publicId)} - /> -
- - - - -
-
- )} -
- ))} -
-
-
-
-
+ )} ); diff --git a/apps/web/src/views/card/index.tsx b/apps/web/src/views/card/index.tsx index 477e7a13..b7f281ce 100644 --- a/apps/web/src/views/card/index.tsx +++ b/apps/web/src/views/card/index.tsx @@ -4,6 +4,7 @@ import ContentEditable from "react-contenteditable"; import { useForm } from "react-hook-form"; import { IoChevronForwardSharp } from "react-icons/io5"; +import Avatar from "~/components/Avatar"; import LabelIcon from "~/components/LabelIcon"; import Modal from "~/components/modal"; import { NewWorkspaceForm } from "~/components/NewWorkspaceForm"; @@ -11,6 +12,8 @@ import { PageHead } from "~/components/PageHead"; import { useModal } from "~/providers/modal"; import { usePopup } from "~/providers/popup"; import { api } from "~/utils/api"; +import { formatMemberDisplayName } from "~/utils/helpers"; +import { getPublicUrl } from "~/utils/supabase/getPublicUrl"; import ActivityList from "./components/ActivityList"; import { DeleteCardConfirmation } from "./components/DeleteCardConfirmation"; import { DeleteLabelConfirmation } from "./components/DeleteLabelConfirmation"; @@ -76,9 +79,25 @@ export default function CardPage() { ); return { - ...member, - user: member.user ?? { id: "", name: null }, + key: member.publicId, + value: formatMemberDisplayName( + member.user?.name ?? null, + member.user?.email ?? null, + ), + imageUrl: member.user?.image + ? getPublicUrl(member.user.image) + : undefined, selected: isSelected ?? false, + leftIcon: ( + + ), }; }) ?? [];