Onboarding Upload
This commit is contained in:
167
extensions/Others/Onboarding/Livewire/Onboarding/Modal.php
Normal file
167
extensions/Others/Onboarding/Livewire/Onboarding/Modal.php
Normal file
@@ -0,0 +1,167 @@
|
||||
<?php
|
||||
|
||||
namespace Paymenter\Extensions\Others\Onboarding\Livewire\Onboarding;
|
||||
|
||||
use Livewire\Component;
|
||||
use Paymenter\Extensions\Others\Onboarding\Models\OnboardingSlide;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
use App\Helpers\ExtensionHelper;
|
||||
|
||||
class Modal extends Component
|
||||
{
|
||||
public $currentSlide = 0;
|
||||
public $slides = [];
|
||||
public $showModal = false;
|
||||
|
||||
public function mount()
|
||||
{
|
||||
// Check if test mode and per session mode are enabled
|
||||
$extension = ExtensionHelper::getExtension('other', 'Onboarding');
|
||||
$testMode = $extension->config('test_mode', false);
|
||||
$perSession = $extension->config('per_session', false);
|
||||
|
||||
$userId = Auth::id();
|
||||
|
||||
// Check if user has seen onboarding before
|
||||
if ($perSession) {
|
||||
// Use cookie for per-session tracking
|
||||
$hasSeenOnboarding = $testMode ? false : \Illuminate\Support\Facades\Cookie::has('onboarding_completed');
|
||||
$this->currentSlide = (int) \Illuminate\Support\Facades\Cookie::get('onboarding_current_slide', 0);
|
||||
} else {
|
||||
// Use database session for persistent tracking
|
||||
$hasSeenOnboarding = $testMode ? false : session()->get("onboarding_seen_{$userId}", false);
|
||||
$this->currentSlide = session()->get("onboarding_current_slide_{$userId}", 0);
|
||||
}
|
||||
|
||||
// Only show if user hasn't seen it and there are slides
|
||||
$this->slides = OnboardingSlide::where('enabled', true)
|
||||
->orderBy('sort', 'asc')
|
||||
->get()
|
||||
->toArray();
|
||||
|
||||
$this->showModal = !$hasSeenOnboarding && count($this->slides) > 0 && $this->currentSlide < count($this->slides);
|
||||
}
|
||||
|
||||
public function getShowBackdropProperty()
|
||||
{
|
||||
$extension = ExtensionHelper::getExtension('other', 'Onboarding');
|
||||
return $extension->config('show_backdrop', false);
|
||||
}
|
||||
|
||||
public function nextSlide()
|
||||
{
|
||||
$currentSlideData = $this->slides[$this->currentSlide] ?? null;
|
||||
$extension = ExtensionHelper::getExtension('other', 'Onboarding');
|
||||
$perSession = $extension->config('per_session', false);
|
||||
|
||||
// If current slide is guided, redirect to the page
|
||||
if ($currentSlideData && $currentSlideData['is_guided'] && $currentSlideData['page_route']) {
|
||||
// Save current slide progress before redirecting
|
||||
$this->currentSlide++;
|
||||
|
||||
if ($perSession) {
|
||||
\Illuminate\Support\Facades\Cookie::queue('onboarding_current_slide', $this->currentSlide, 60 * 24 * 7); // 7 days
|
||||
} else {
|
||||
$userId = Auth::id();
|
||||
session()->put("onboarding_current_slide_{$userId}", $this->currentSlide);
|
||||
}
|
||||
|
||||
$this->redirectToPage($currentSlideData['page_route']);
|
||||
return;
|
||||
}
|
||||
|
||||
if ($this->currentSlide < count($this->slides) - 1) {
|
||||
$this->currentSlide++;
|
||||
// Save progress
|
||||
if ($perSession) {
|
||||
\Illuminate\Support\Facades\Cookie::queue('onboarding_current_slide', $this->currentSlide, 60 * 24 * 7); // 7 days
|
||||
} else {
|
||||
$userId = Auth::id();
|
||||
session()->put("onboarding_current_slide_{$userId}", $this->currentSlide);
|
||||
}
|
||||
} else {
|
||||
$this->finish();
|
||||
}
|
||||
}
|
||||
|
||||
public function previousSlide()
|
||||
{
|
||||
if ($this->currentSlide > 0) {
|
||||
$this->currentSlide--;
|
||||
// Save progress
|
||||
$extension = ExtensionHelper::getExtension('other', 'Onboarding');
|
||||
$perSession = $extension->config('per_session', false);
|
||||
|
||||
if ($perSession) {
|
||||
\Illuminate\Support\Facades\Cookie::queue('onboarding_current_slide', $this->currentSlide, 60 * 24 * 7); // 7 days
|
||||
} else {
|
||||
$userId = Auth::id();
|
||||
session()->put("onboarding_current_slide_{$userId}", $this->currentSlide);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function finish()
|
||||
{
|
||||
// Check if test mode and per session mode are enabled
|
||||
$extension = ExtensionHelper::getExtension('other', 'Onboarding');
|
||||
$testMode = $extension->config('test_mode', false);
|
||||
$perSession = $extension->config('per_session', false);
|
||||
|
||||
if ($perSession) {
|
||||
// Clear current slide progress cookie
|
||||
\Illuminate\Support\Facades\Cookie::queue(\Illuminate\Support\Facades\Cookie::forget('onboarding_current_slide'));
|
||||
|
||||
// Only mark as completed if not in test mode (30 days expiration)
|
||||
if (!$testMode) {
|
||||
\Illuminate\Support\Facades\Cookie::queue('onboarding_completed', '1', 60 * 24 * 30);
|
||||
}
|
||||
} else {
|
||||
$userId = Auth::id();
|
||||
|
||||
// Clear current slide progress
|
||||
session()->forget("onboarding_current_slide_{$userId}");
|
||||
|
||||
// Only mark as seen if not in test mode
|
||||
if (!$testMode) {
|
||||
session()->put("onboarding_seen_{$userId}", true);
|
||||
}
|
||||
}
|
||||
|
||||
$this->showModal = false;
|
||||
}
|
||||
|
||||
protected function redirectToPage($pageRoute)
|
||||
{
|
||||
$url = match ($pageRoute) {
|
||||
'dashboard' => route('dashboard'),
|
||||
'services' => route('services'),
|
||||
'services.first' => $this->getFirstServiceUrl(),
|
||||
'invoices' => route('invoices'),
|
||||
'tickets' => route('tickets'),
|
||||
'tickets.create' => route('tickets.create'),
|
||||
'account' => route('account'),
|
||||
'account.security' => route('account.security'),
|
||||
'account.payment-methods' => route('account.payment-methods'),
|
||||
'account.notifications' => route('account.notifications'),
|
||||
'products' => route('home') . '#shop',
|
||||
default => route('dashboard'),
|
||||
};
|
||||
|
||||
if ($url) {
|
||||
return $this->redirect($url, navigate: true);
|
||||
}
|
||||
}
|
||||
|
||||
protected function getFirstServiceUrl()
|
||||
{
|
||||
$service = Auth::user()->services()->where('status', 'active')->first();
|
||||
return $service ? route('services.show', $service) : route('services');
|
||||
}
|
||||
|
||||
public function render()
|
||||
{
|
||||
return view('onboarding::modal');
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user