2025-06-10 15:28:23 +05:30
|
|
|
import React, { useState } from "react";
|
2025-06-25 09:35:47 +05:30
|
|
|
import { getSearchUsers } from "../../../services/factoryBuilder/collab/getSearchUsers";
|
|
|
|
|
import { useParams } from "react-router-dom";
|
|
|
|
|
import { shareProject } from "../../../services/factoryBuilder/collab/shareProject";
|
|
|
|
|
import { getUserData } from "../../../functions/getUserData";
|
2025-06-10 15:28:23 +05:30
|
|
|
|
2025-06-25 09:35:47 +05:30
|
|
|
interface UserData {
|
|
|
|
|
_id: string;
|
|
|
|
|
Email: string;
|
|
|
|
|
userName: string;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
interface MultiEmailProps {
|
|
|
|
|
users: any,
|
|
|
|
|
getData: any,
|
|
|
|
|
}
|
2025-06-26 09:25:02 +05:30
|
|
|
const MultiEmailInvite: React.FC<MultiEmailProps> = ({ users, getData }) => {
|
2025-06-25 09:35:47 +05:30
|
|
|
const [emails, setEmails] = useState<any>([]);
|
2025-06-26 09:25:02 +05:30
|
|
|
const [searchedEmail, setSearchedEmail] = useState<UserData[]>([]);
|
2025-06-25 09:35:47 +05:30
|
|
|
const [inputFocus, setInputFocus] = useState(false);
|
2025-06-10 15:28:23 +05:30
|
|
|
const [inputValue, setInputValue] = useState("");
|
2025-06-25 09:35:47 +05:30
|
|
|
const { projectId } = useParams();
|
|
|
|
|
const { userId } = getUserData();
|
2025-06-10 15:28:23 +05:30
|
|
|
|
2025-06-25 09:35:47 +05:30
|
|
|
const handleAddEmail = async (selectedUser: UserData) => {
|
|
|
|
|
if (!projectId || !selectedUser) return
|
2025-06-10 15:28:23 +05:30
|
|
|
const trimmedEmail = inputValue.trim();
|
2025-06-25 09:35:47 +05:30
|
|
|
setEmails((prev: any[]) => {
|
|
|
|
|
if (!selectedUser) return prev;
|
|
|
|
|
const isNotCurrentUser = selectedUser._id !== userId;
|
|
|
|
|
const alreadyExistsInEmails = prev.some(email => email._id === selectedUser._id);
|
|
|
|
|
const alreadyExistsInUsers = users.some((val: any) => val.userId === selectedUser._id);
|
|
|
|
|
if (isNotCurrentUser && !alreadyExistsInEmails && !alreadyExistsInUsers) {
|
|
|
|
|
return [...prev, selectedUser];
|
|
|
|
|
}
|
2025-06-10 15:28:23 +05:30
|
|
|
|
2025-06-25 09:35:47 +05:30
|
|
|
return prev;
|
|
|
|
|
});
|
2025-06-10 15:28:23 +05:30
|
|
|
setInputValue(""); // Clear the input field after adding
|
|
|
|
|
};
|
2025-06-25 09:35:47 +05:30
|
|
|
const handleSearchMail = async (e: any) => {
|
|
|
|
|
setInputValue(e.target.value);
|
|
|
|
|
const trimmedEmail = e.target.value.trim();
|
|
|
|
|
|
|
|
|
|
if (trimmedEmail.length < 3) return;
|
|
|
|
|
try {
|
|
|
|
|
const searchedMail = await getSearchUsers(trimmedEmail);
|
|
|
|
|
const filteredEmail = searchedMail.sharchMail?.filtered;
|
|
|
|
|
if (filteredEmail) {
|
|
|
|
|
setSearchedEmail(filteredEmail)
|
|
|
|
|
}
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.error("Failed to search mail:", error);
|
|
|
|
|
}
|
|
|
|
|
};
|
2025-06-10 15:28:23 +05:30
|
|
|
|
2025-06-25 09:35:47 +05:30
|
|
|
|
|
|
|
|
const handleKeyDown = async (e: React.KeyboardEvent<HTMLInputElement>) => {
|
|
|
|
|
if (e.key === "Enter" || e.key === "," && searchedEmail.length > 0) {
|
2025-06-10 15:28:23 +05:30
|
|
|
e.preventDefault();
|
2025-06-25 09:35:47 +05:30
|
|
|
handleAddEmail(searchedEmail[0]);
|
2025-06-10 15:28:23 +05:30
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
2025-06-25 09:35:47 +05:30
|
|
|
const handleRemoveEmail = (idToRemove: string) => {
|
|
|
|
|
setEmails((prev: any) => prev.filter((email: any) => email._id !== idToRemove));
|
2025-06-10 15:28:23 +05:30
|
|
|
};
|
|
|
|
|
|
2025-06-25 09:35:47 +05:30
|
|
|
|
2025-06-10 15:28:23 +05:30
|
|
|
const validateEmail = (email: string) => {
|
|
|
|
|
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
|
|
|
return emailRegex.test(email);
|
|
|
|
|
};
|
|
|
|
|
|
2025-06-25 09:35:47 +05:30
|
|
|
const handleInvite = () => {
|
|
|
|
|
if (!projectId) return;
|
|
|
|
|
try {
|
|
|
|
|
emails.forEach((user: any) => {
|
|
|
|
|
shareProject(user._id, projectId)
|
|
|
|
|
.then((res) => {
|
|
|
|
|
console.log("sharedProject:", res);
|
|
|
|
|
|
|
|
|
|
})
|
|
|
|
|
.catch((err) => {
|
|
|
|
|
console.error("Error sharing project:", err);
|
|
|
|
|
});
|
|
|
|
|
setEmails([])
|
2025-06-26 09:25:02 +05:30
|
|
|
setInputValue("")
|
2025-06-25 09:35:47 +05:30
|
|
|
});
|
|
|
|
|
setTimeout(() => {
|
|
|
|
|
getData()
|
|
|
|
|
}, 1000);
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.error("General error:", error);
|
|
|
|
|
}
|
|
|
|
|
};
|
2025-06-10 15:28:23 +05:30
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
<div className="multi-email-invite-input-container">
|
|
|
|
|
<div className={`multi-email-invite-input${inputFocus ? " active" : ""}`}>
|
2025-06-25 09:35:47 +05:30
|
|
|
{emails.map((email: any, index: number) => (
|
2025-06-10 15:28:23 +05:30
|
|
|
<div key={index} className="entered-emails">
|
2025-06-25 09:35:47 +05:30
|
|
|
{email.Email}
|
|
|
|
|
<span onClick={() => handleRemoveEmail(email._id)}>×</span>
|
2025-06-10 15:28:23 +05:30
|
|
|
</div>
|
|
|
|
|
))}
|
|
|
|
|
<input
|
|
|
|
|
type="text"
|
|
|
|
|
value={inputValue}
|
2025-06-25 09:35:47 +05:30
|
|
|
onChange={(e) => handleSearchMail(e)}
|
2025-06-10 15:28:23 +05:30
|
|
|
onFocus={() => setInputFocus(true)}
|
2025-06-25 09:35:47 +05:30
|
|
|
// onBlur={() => setInputFocus(false)}
|
2025-06-10 15:28:23 +05:30
|
|
|
onKeyDown={handleKeyDown}
|
|
|
|
|
placeholder="Enter email and press Enter or comma to seperate"
|
|
|
|
|
/>
|
|
|
|
|
</div>
|
2025-06-25 09:35:47 +05:30
|
|
|
<div onClick={handleInvite} className="invite-button">
|
2025-06-26 09:25:02 +05:30
|
|
|
Add
|
2025-06-10 15:28:23 +05:30
|
|
|
</div>
|
2025-06-26 09:25:02 +05:30
|
|
|
{inputFocus && inputValue.length > 2 && searchedEmail && searchedEmail.length > 0 && (
|
2025-06-25 09:35:47 +05:30
|
|
|
<div className="users-list-container">
|
|
|
|
|
{/* list available users here */}
|
|
|
|
|
{searchedEmail.map((val: any, i: any) => (
|
|
|
|
|
<div onClick={(e) => {
|
|
|
|
|
handleAddEmail(val)
|
|
|
|
|
setInputFocus(false)
|
|
|
|
|
}} key={i} >
|
|
|
|
|
{val?.Email}
|
|
|
|
|
</div>
|
|
|
|
|
))}
|
|
|
|
|
</div>
|
|
|
|
|
)}
|
2025-06-10 15:28:23 +05:30
|
|
|
</div>
|
|
|
|
|
);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export default MultiEmailInvite;
|