import React, { useEffect, useState } from "react"; import TextInput from "@/components/TextInput"; import toast from "react-hot-toast"; import { AccountSettings, CollectionIncludingMembersAndLinkCount, Member, } from "@/types/global"; import getPublicUserData from "@/lib/client/getPublicUserData"; import usePermissions from "@/hooks/usePermissions"; import ProfilePhoto from "../ProfilePhoto"; import addMemberToCollection from "@/lib/client/addMemberToCollection"; import Modal from "../Modal"; import { dropdownTriggerer } from "@/lib/client/utils"; import { useTranslation } from "next-i18next"; import { useUpdateCollection } from "@/hooks/store/collections"; import { useUser } from "@/hooks/store/user"; import CopyButton from "../CopyButton"; import { useRouter } from "next/router"; type Props = { onClose: Function; activeCollection: CollectionIncludingMembersAndLinkCount; }; export default function EditCollectionSharingModal({ onClose, activeCollection, }: Props) { const { t } = useTranslation(); const [collection, setCollection] = useState(activeCollection); const [submitLoader, setSubmitLoader] = useState(false); const updateCollection = useUpdateCollection(); const submit = async () => { if (!submitLoader) { setSubmitLoader(true); if (!collection) return null; setSubmitLoader(true); const load = toast.loading(t("updating_collection")); await updateCollection.mutateAsync(collection, { onSettled: (data, error) => { setSubmitLoader(false); toast.dismiss(load); if (error) { toast.error(error.message); } else { onClose(); toast.success(t("updated")); } }, }); } }; const { data: user = {} } = useUser(); const permissions = usePermissions(collection.id as number); const currentURL = new URL(document.URL); const publicCollectionURL = `${currentURL.origin}/public/collections/${collection.id}`; const [memberIdentifier, setMemberIdentifier] = useState(""); const [collectionOwner, setCollectionOwner] = useState< Partial >({}); useEffect(() => { const fetchOwner = async () => { const owner = await getPublicUserData(collection.ownerId as number); setCollectionOwner(owner); }; fetchOwner(); setCollection(activeCollection); }, []); const setMemberState = (newMember: Member) => { if (!collection) return null; setCollection({ ...collection, members: [...collection.members, newMember], }); setMemberIdentifier(""); }; const router = useRouter(); const isPublicRoute = router.pathname.startsWith("/public") ? true : false; return (

{permissions === true && !isPublicRoute ? t("share_and_collaborate") : t("team")}

{permissions === true && !isPublicRoute && (

{t("make_collection_public")}

{t("make_collection_public_desc")}

)} {collection.isPublic && (

{t("sharable_link")}

{publicCollectionURL}
)} {permissions === true && !isPublicRoute && (
)} {permissions === true && !isPublicRoute && ( <>

{t("members")}

setMemberIdentifier(e.target.value)} onKeyDown={(e) => e.key === "Enter" && addMemberToCollection( user, memberIdentifier.replace(/^@/, "") || "", collection, setMemberState, t ) } />
addMemberToCollection( user, memberIdentifier.replace(/^@/, "") || "", collection, setMemberState, t ) } className="btn btn-accent dark:border-violet-400 text-white btn-square btn-sm h-10 w-10" >
)} {collection?.members[0]?.user && ( <>

{collectionOwner.name}

@{collectionOwner.username}

{t("owner")}

{collection.members .sort((a, b) => (a.userId as number) - (b.userId as number)) .map((e, i) => { const roleLabel = e.canCreate && e.canUpdate && e.canDelete ? t("admin") : e.canCreate && !e.canUpdate && !e.canDelete ? t("contributor") : !e.canCreate && !e.canUpdate && !e.canDelete ? t("viewer") : undefined; return (

{e.user.name}

@{e.user.username}

{permissions === true && !isPublicRoute ? (
{roleLabel}
) : (

{roleLabel}

)} {permissions === true && !isPublicRoute && ( { const updatedMembers = collection.members.filter((member) => { return ( member.user.username !== e.user.username ); }); setCollection({ ...collection, members: updatedMembers, }); }} /> )}
); })}
)} {permissions === true && !isPublicRoute && ( )}
); }