Files
2025-11-30 11:57:22 +01:00

147 lines
4.4 KiB
PHP

<?php
namespace Paymenter\Extensions\Others\SocialBase\Livewire;
use Livewire\Component;
use Illuminate\Support\Facades\Auth;
use Paymenter\Extensions\Others\SocialBase\Models\Conversation;
use App\Models\User;
use Paymenter\Extensions\Others\SocialBase\Models\UserProfile;
use Paymenter\Extensions\Others\SocialBase\Models\Message;
class CreateGroup extends Component
{
public $showModal = false;
public $groupName = '';
public $selectedUsers = [];
public $searchQuery = '';
public $availableUsers = [];
protected $listeners = ['open-create-group' => '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');
}
}