Files
Dwinzo_Demo/app/src/components/templates/CollaborationPopup.tsx

135 lines
5.8 KiB
TypeScript
Raw Normal View History

2025-06-10 15:28:23 +05:30
import React, { useEffect, useState } from "react";
import RenderOverlay from "./Overlay";
2025-09-16 16:44:01 +05:30
import { CloseIcon } from "../icons/ExportCommonIcons";
2025-06-10 15:28:23 +05:30
import { AccessOption, User } from "../../types/users";
import RegularDropDown from "../ui/inputs/RegularDropDown";
import MultiEmailInvite from "../ui/inputs/MultiEmailInvite";
2025-06-23 09:37:53 +05:30
import { getUserData } from "../../functions/getUserData";
2025-09-10 11:44:15 +05:30
import { getProjectSharedList } from "../../services/factoryBuilder/collab/project/getProjectSharedList";
import { useParams } from "react-router-dom";
2025-09-10 11:44:15 +05:30
import { shareAccess } from "../../services/factoryBuilder/collab/project/shareAccess";
import { getAvatarColor } from "../../modules/collaboration/functions/getAvatarColor";
2025-06-10 15:28:23 +05:30
interface UserListTemplateProps {
2025-09-16 16:44:01 +05:30
user: User;
2025-06-10 15:28:23 +05:30
}
const UserListTemplate: React.FC<UserListTemplateProps> = ({ user }) => {
2025-09-16 16:44:01 +05:30
const [accessSelection, setAccessSelection] = useState<string>(user?.Access);
const { projectId } = useParams();
2025-06-10 15:28:23 +05:30
2025-09-16 16:44:01 +05:30
const accessUpdate = async ({ option }: AccessOption) => {
if (!projectId) return;
const accessSelection = await shareAccess(projectId, user.userId, option);
setAccessSelection(option);
};
2025-06-10 15:28:23 +05:30
2025-09-16 16:44:01 +05:30
return (
<div className="user-list-container">
<div className="user-details">
<div className="profile-image">
{user.profileImage ? (
<img src={user.profileImage || "https://via.placeholder.com/150"} alt={`${user.userName}'s profile`} />
) : (
<div className="no-profile-container" style={{ background: getAvatarColor(1, user.userId) }}>
{user.userName.charAt(0).toUpperCase()}
</div>
)}
</div>
<div className="user-name"> {user.userName.charAt(0).toUpperCase() + user.userName.slice(1).toLowerCase()}</div>
</div>
<div className="user-access">
<RegularDropDown header={accessSelection} options={["Admin", "User", "Viewer"]} onSelect={(option) => accessUpdate({ option })} search={false} />
{/* <ArrowIcon /> */}
2025-06-10 15:28:23 +05:30
</div>
</div>
2025-09-16 16:44:01 +05:30
);
2025-06-10 15:28:23 +05:30
};
interface CollaborateProps {
2025-09-16 16:44:01 +05:30
setUserManagement: (value: boolean) => void;
2025-06-10 15:28:23 +05:30
}
2025-09-16 16:44:01 +05:30
const CollaborationPopup: React.FC<CollaborateProps> = ({ setUserManagement }) => {
const { userName } = getUserData();
const [users, setUsers] = useState([]);
const { projectId } = useParams();
2025-09-16 16:44:01 +05:30
function getData() {
if (!projectId) return;
getProjectSharedList(projectId)
.then((allUser) => {
const accesMail = allUser?.datas || [];
setUsers(accesMail);
})
.catch((err) => {});
}
2025-09-16 16:44:01 +05:30
useEffect(() => {
getData();
}, []);
2025-09-16 16:44:01 +05:30
return (
<RenderOverlay>
<div
className="collaboration-popup-wrapper"
2025-06-10 15:28:23 +05:30
onClick={() => {
2025-09-16 16:44:01 +05:30
setUserManagement(false);
2025-06-10 15:28:23 +05:30
}}
2025-09-16 16:44:01 +05:30
>
<div
className="collaboration-popup-container"
onClick={(e) => {
e.preventDefault();
e.stopPropagation();
}}
>
<div className="header">
<div className="content">Share this file</div>
<div className="content">
{/* <div className="copy-link-button">copy link</div> */}
<div
className="close-button"
onClick={() => {
setUserManagement(false);
}}
>
<CloseIcon />
</div>
</div>
</div>
<div className="invite-input-container">
<MultiEmailInvite users={users} getData={getData} />
</div>
<div className="split"></div>
<section>
<div className="access-and-user-control-container">
<div className="user-header">Who has access</div>
<div className="general-access-container">
<div className="team-container">
<div className="project-name">Untitled</div>
<div className="number-of-peoples-have-access">{users.length} persons</div>
</div>
</div>
<div className="users-list-container">
<div className="you-container">
<div className="your-name">
<div className="user-profile">{userName && userName[0].toUpperCase()}</div>
{userName && userName.charAt(0).toUpperCase() + userName.slice(1).toLowerCase()}
</div>
<div className="indicater">you</div>
</div>
{users.map((user, index) => (
<UserListTemplate key={index} user={user} />
))}
</div>
</div>
</section>
2025-06-10 15:28:23 +05:30
</div>
</div>
2025-09-16 16:44:01 +05:30
</RenderOverlay>
);
2025-06-10 15:28:23 +05:30
};
export default CollaborationPopup;