// Copyright (C) 2022-present Daniel31x13 // This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. // This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. // You should have received a copy of the GNU General Public License along with this program. If not, see . import React, { useState } from "react"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { faClose, faPenToSquare, faPlus, faTrashCan, faUser, faUserPlus, } from "@fortawesome/free-solid-svg-icons"; import useCollectionStore from "@/store/collections"; import { CollectionIncludingMembers, Member } from "@/types/global"; import { useSession } from "next-auth/react"; import Modal from "@/components/Modal"; import DeleteCollection from "@/components/Modal/DeleteCollection"; import RequiredBadge from "../RequiredBadge"; import addMemberToCollection from "@/lib/client/addMemberToCollection"; import ImageWithFallback from "../ImageWithFallback"; import Checkbox from "../Checkbox"; type Props = { toggleCollectionModal: Function; activeCollection: CollectionIncludingMembers; method: "CREATE" | "UPDATE"; }; export default function CollectionModal({ toggleCollectionModal, activeCollection, method, }: Props) { const [collection, setCollection] = useState(activeCollection); const [member, setMember] = useState({ canCreate: false, canUpdate: false, canDelete: false, user: { name: "", email: "", }, }); const { updateCollection, addCollection } = useCollectionStore(); const [deleteCollectionModal, setDeleteCollectionModal] = useState(false); const toggleDeleteCollectionModal = () => { setDeleteCollectionModal(!deleteCollectionModal); }; const session = useSession(); const setMemberState = (newMember: Member) => { if (!collection) return null; setCollection({ ...collection, members: [...collection.members, newMember], }); setMember({ canCreate: false, canUpdate: false, canDelete: false, user: { name: "", email: "", }, }); }; const submit = async () => { if (!collection) return null; let response = null; if (method === "CREATE") response = await addCollection(collection); else if (method === "UPDATE") response = await updateCollection(collection); else console.log("Unknown method."); if (response) toggleCollectionModal(); }; return (

{method === "CREATE" ? "Add" : "Edit"} Collection

Name

setCollection({ ...collection, name: e.target.value }) } type="text" placeholder="e.g. Example Collection" className="w-full rounded-md p-3 border-sky-100 border-solid border outline-none focus:border-sky-500 duration-100" />

Description

setCollection({ ...collection, description: e.target.value, }) } type="text" placeholder="Collection description" className="w-full rounded-md p-3 border-sky-100 border-solid border outline-none focus:border-sky-500 duration-100" />

{/*

Sharing & Collaboration Settings

Collaboration

Manage Team
console.log("Clicked!")} />

This will let anyone to access this collection.

*/}
{ setMember({ ...member, user: { ...member.user, email: e.target.value }, }); }} type="text" placeholder="Email" className="w-full rounded-md p-3 pr-12 border-sky-100 border-solid border outline-none focus:border-sky-500 duration-100" />
addMemberToCollection( session.data?.user.email as string, member.user.email, collection, setMemberState ) } className="absolute flex items-center justify-center right-2 top-2 bottom-2 bg-sky-500 hover:bg-sky-400 duration-100 text-white w-9 rounded-md cursor-pointer" >
{collection?.members[0]?.user ? ( <>

(All Members have Read access to this collection.)

{collection.members.map((e, i) => { return (
{ const updatedMembers = collection.members.filter( (member) => { return member.user.email !== e.user.email; } ); setCollection({ ...collection, members: updatedMembers, }); }} />

{e.user.name}

{e.user.email}

Permissions

(Click to toggle.)

); })}
) : null}
{method === "CREATE" ? "Add Collection" : "Edit Collection"}
{method === "UPDATE" ? ( <>

OR


{ toggleDeleteCollectionModal(); }} className="w-fit inline-flex rounded-md cursor-pointer bg-red-500 hover:bg-red-400 duration-100 p-2" >
) : null}
{deleteCollectionModal ? ( ) : null}
); }