147 lines
4.4 KiB
PHP
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');
|
|
}
|
|
}
|