import { useState } from "react"; import { useSelector, useDispatch } from "react-redux"; import { PiGraduationCap } from "react-icons/pi"; import { FiSearch, FiX } from "react-icons/fi"; import { cancelCreateSpace, navigateToSpace, } from "../../store/slices/appSlice"; import { createSpace } from "../../store/slices/spaceSlice"; import { dmService } from "../../services/dm.service"; import { spaceIcons, getSpaceIconComponent } from "../../constants/spaceIcons"; function CreateSpace() { const dispatch = useDispatch(); const { isDark } = useSelector((state) => state.theme); const [spaceName, setSpaceName] = useState(""); const [spaceIcon, setSpaceIcon] = useState(spaceIcons[0].id); const [spaceDescription, setSpaceDescription] = useState(""); // Members state const [members, setMembers] = useState([]); const [searchQuery, setSearchQuery] = useState(""); const [searchResults, setSearchResults] = useState([]); const [isSearching, setIsSearching] = useState(false); const searchTimeoutRef = useState(null); // Search users - only trigger on Enter key const handleSearch = async (query) => { setSearchQuery(query); if (!query.trim()) { setSearchResults([]); setIsSearching(false); return; } }; const handleSearchKeyDown = async (e) => { if (e.key === "Enter") { e.preventDefault(); const query = searchQuery.trim(); if (!query) { setSearchResults([]); return; } setIsSearching(true); try { const { data } = await dmService.searchUsers(query); const users = (data.users || []).map((user) => ({ id: user.id, name: user.display_name || user.email || "Unknown", avatar: user.avatar_url || null, email: user.email || "", })); setSearchResults(users); } catch { setSearchResults([]); } finally { setIsSearching(false); } } }; // Add member const addMember = (user) => { if (!members.some((m) => m.id === user.id)) { setMembers([...members, user]); } }; // Remove member const removeMember = (userId) => { setMembers((prev) => prev.filter((m) => m.id !== userId)); }; const [createError, setCreateError] = useState(null); const [isCreating, setIsCreating] = useState(false); const handleSubmit = async () => { if (!spaceName.trim() || isCreating) return; setCreateError(null); setIsCreating(true); try { const payload = { name: spaceName.trim(), isPrivate: false, }; if (spaceDescription.trim()) { payload.description = spaceDescription.trim(); } // Gửi icon id (theo spaceIcons id) lên BE payload.icon = spaceIcon; // Gửi memberIds nếu có members được chọn if (members.length > 0) { payload.memberIds = members.map((m) => m.id); } const result = await dispatch(createSpace(payload)).unwrap(); // If members were selected, add them to the space if (members.length > 0 && result?.id) { console.log("Space created, members to add:", members); } // Navigate to the newly created space if (result?.id) { dispatch(navigateToSpace(result.id)); } } catch (err) { console.error("Failed to create space:", err); setCreateError( typeof err === "string" ? err : err?.message || "Không thể tạo space. Vui lòng thử lại.", ); } finally { setIsCreating(false); } }; const selectedIconData = spaceIcons.find((s) => s.id === spaceIcon); const SelectedIcon = selectedIconData?.component || PiGraduationCap; return (
Tạo Space mới
Tạo không gian học tập mới
{/* Icon Selection */}

Chọn icon

{spaceIcons.map(({ id, component: IconComponent }) => ( ))}
{/* Space Name */}

Tên Space

setSpaceName(e.target.value)} placeholder="VD: Toán cao cấp, Lập trình AI..." className="w-full px-3 py-2 rounded-md text-sm border outline-none" style={{ background: "var(--input-bg)", borderColor: "var(--input-border)", color: "var(--input-text)", }} onFocus={(e) => (e.currentTarget.style.borderColor = "var(--primary)") } onBlur={(e) => (e.currentTarget.style.borderColor = "var(--input-border)") } />
{/* Description */}

Mô tả (tùy chọn)