'openModal']; protected $rules = [ 'groupName' => 'required|string|min:3|max:100', 'selectedUsers' => 'required|array|min:1', 'selectedUsers.*' => 'exists:users,id', ]; protected $messages = [ 'groupName.required' => 'Group name is required.', 'groupName.min' => 'Group name must be at least 3 characters.', 'groupName.max' => 'Group name cannot exceed 100 characters.', 'selectedUsers.required' => 'Select at least one user to add to the group.', 'selectedUsers.min' => 'Select at least one user to add to the group.', ]; public function mount() { $this->loadAvailableUsers(); } public function openModal() { $this->showModal = true; $this->resetFields(); $this->loadAvailableUsers(); } public function closeModal() { $this->showModal = false; $this->resetFields(); } public function resetFields() { $this->groupName = ''; $this->selectedUsers = []; $this->searchQuery = ''; $this->resetValidation(); } public function loadAvailableUsers() { // Load users excluding current user $usersQuery = User::where('id', '!=', Auth::id()); // Search by email or display_name in UserProfile if ($this->searchQuery) { $search = $this->searchQuery; $userIdsFromProfiles = UserProfile::where('display_name', 'like', "%$search%") ->pluck('user_id') ->toArray(); $usersQuery->where(function ($q) use ($search, $userIdsFromProfiles) { $q->where('email', 'like', "%$search%") ->orWhereIn('id', $userIdsFromProfiles); }); } // Get limited users $this->availableUsers = $usersQuery->limit(20)->get()->map(function ($user) { $profile = UserProfile::where('user_id', $user->id)->first(); return [ 'id' => $user->id, 'name' => $profile?->display_name ?? $user->username ?? $user->email, 'email' => $user->email, 'avatar' => $profile?->avatar_url ?? $user->avatar, ]; })->toArray(); } public function updatedSearchQuery() { $this->loadAvailableUsers(); } public function toggleUser($userId) { if (in_array($userId, $this->selectedUsers)) { $this->selectedUsers = array_diff($this->selectedUsers, [$userId]); } else { $this->selectedUsers[] = $userId; } } public function createGroup() { $this->validate(); // Create group conversation $conversation = Conversation::create([ 'type' => 'group', 'subject' => $this->groupName, 'created_by' => Auth::id(), ]); // Add creator and selected users as participants $participants = array_merge([Auth::id()], $this->selectedUsers); $conversation->participants()->attach($participants); // Send system message Message::create([ 'conversation_id' => $conversation->id, 'sender_id' => null, 'content' => "**Group Created**\n\n" . Auth::user()->name . " created the group \"" . $this->groupName . "\"", 'type' => 'system', 'is_system' => true, 'system_type' => 'group_created', 'metadata' => [], ]); // Update last message timestamp $conversation->update(['last_message_at' => now()]); $this->closeModal(); $this->dispatch('groupCreated', $conversation->id); $this->dispatch('success', 'Group created successfully!'); } public function render() { return view('socialbase::livewire.create-group'); } }