Add all files
This commit is contained in:
146
extensions/Others/SocialBase/Livewire/CreateGroup.php
Normal file
146
extensions/Others/SocialBase/Livewire/CreateGroup.php
Normal file
@@ -0,0 +1,146 @@
|
||||
<?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');
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user