import React, { useEffect, useState } from "react"; import TextInput from "@/components/TextInput"; import useCollectionStore from "@/store/collections"; import toast from "react-hot-toast"; import { CollectionIncludingMembersAndLinkCount, Member } from "@/types/global"; import getPublicUserData from "@/lib/client/getPublicUserData"; import useAccountStore from "@/store/account"; import usePermissions from "@/hooks/usePermissions"; import ProfilePhoto from "../ProfilePhoto"; import addMemberToCollection from "@/lib/client/addMemberToCollection"; import Modal from "../Modal"; type Props = { onClose: Function; activeCollection: CollectionIncludingMembersAndLinkCount; }; export default function EditCollectionSharingModal({ onClose, activeCollection, }: Props) { const [collection, setCollection] = useState(activeCollection); const [submitLoader, setSubmitLoader] = useState(false); const { updateCollection } = useCollectionStore(); const submit = async () => { if (!submitLoader) { setSubmitLoader(true); if (!collection) return null; setSubmitLoader(true); const load = toast.loading("Updating..."); let response; response = await updateCollection(collection as any); toast.dismiss(load); if (response.ok) { toast.success(`Updated!`); onClose(); } else toast.error(response.data as string); setSubmitLoader(false); } }; const { account } = useAccountStore(); const permissions = usePermissions(collection.id as number); const currentURL = new URL(document.URL); const publicCollectionURL = `${currentURL.origin}/public/collections/${collection.id}`; const [memberUsername, setMemberUsername] = useState(""); const [collectionOwner, setCollectionOwner] = useState({ id: null as unknown as number, name: "", username: "", image: "", archiveAsScreenshot: undefined as unknown as boolean, archiveAsPDF: undefined as unknown as boolean, }); 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], }); setMemberUsername(""); }; return (

{permissions === true ? "Share and Collaborate" : "Team"}

{permissions === true && (

Make Public

This will let Anyone to view this collection and it's users.

)} {collection.isPublic ? (

Sharable Link (Click to copy)

{ try { navigator.clipboard .writeText(publicCollectionURL) .then(() => toast.success("Copied!")); } catch (err) { console.log(err); } }} className="w-full hide-scrollbar overflow-x-auto whitespace-nowrap rounded-md p-2 bg-base-200 border-neutral-content border-solid border outline-none hover:border-primary dark:hover:border-primary duration-100 cursor-text" > {publicCollectionURL}
) : null} {permissions === true &&
} {permissions === true && ( <>

Members

setMemberUsername(e.target.value)} onKeyDown={(e) => e.key === "Enter" && addMemberToCollection( account.username as string, memberUsername || "", collection, setMemberState ) } />
addMemberToCollection( account.username as string, memberUsername || "", collection, setMemberState ) } 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}

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 ? "Admin" : e.canCreate && !e.canUpdate && !e.canDelete ? "Contributor" : !e.canCreate && !e.canUpdate && !e.canDelete ? "Viewer" : undefined; return ( <>

{e.user.name}

@{e.user.username}

{permissions === true ? (
{roleLabel}
) : (

{roleLabel}

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