diff --git a/app/Http/Controllers/Auth/VerifyEmailController.php b/app/Http/Controllers/Auth/VerifyEmailController.php new file mode 100644 index 0000000..a300bfa --- /dev/null +++ b/app/Http/Controllers/Auth/VerifyEmailController.php @@ -0,0 +1,30 @@ +user()->hasVerifiedEmail()) { + return redirect()->intended(route('dashboard', absolute: false).'?verified=1'); + } + + if ($request->user()->markEmailAsVerified()) { + /** @var \Illuminate\Contracts\Auth\MustVerifyEmail $user */ + $user = $request->user(); + + event(new Verified($user)); + } + + return redirect()->intended(route('dashboard', absolute: false).'?verified=1'); + } +} diff --git a/app/Livewire/Actions/Logout.php b/app/Livewire/Actions/Logout.php new file mode 100644 index 0000000..45993bb --- /dev/null +++ b/app/Livewire/Actions/Logout.php @@ -0,0 +1,22 @@ +logout(); + + Session::invalidate(); + Session::regenerateToken(); + + return redirect('/'); + } +} diff --git a/app/Livewire/Auth/ConfirmPassword.php b/app/Livewire/Auth/ConfirmPassword.php new file mode 100644 index 0000000..9a89db0 --- /dev/null +++ b/app/Livewire/Auth/ConfirmPassword.php @@ -0,0 +1,37 @@ +validate([ + 'password' => ['required', 'string'], + ]); + + if (! Auth::guard('web')->validate([ + 'email' => Auth::user()->email, + 'password' => $this->password, + ])) { + throw ValidationException::withMessages([ + 'password' => __('auth.password'), + ]); + } + + session(['auth.password_confirmed_at' => time()]); + + $this->redirectIntended(default: route('dashboard', absolute: false), navigate: true); + } +} diff --git a/app/Livewire/Auth/ForgotPassword.php b/app/Livewire/Auth/ForgotPassword.php new file mode 100644 index 0000000..7f3b681 --- /dev/null +++ b/app/Livewire/Auth/ForgotPassword.php @@ -0,0 +1,27 @@ +validate([ + 'email' => ['required', 'string', 'email'], + ]); + + Password::sendResetLink($this->only('email')); + + session()->flash('status', __('A reset link will be sent if the account exists.')); + } +} diff --git a/app/Livewire/Auth/Login.php b/app/Livewire/Auth/Login.php new file mode 100644 index 0000000..9925f63 --- /dev/null +++ b/app/Livewire/Auth/Login.php @@ -0,0 +1,77 @@ +validate(); + + $this->ensureIsNotRateLimited(); + + if (! Auth::attempt(['email' => $this->email, 'password' => $this->password], $this->remember)) { + RateLimiter::hit($this->throttleKey()); + + throw ValidationException::withMessages([ + 'email' => __('auth.failed'), + ]); + } + + RateLimiter::clear($this->throttleKey()); + Session::regenerate(); + + $this->redirectIntended(default: route('dashboard', absolute: false), navigate: true); + } + + /** + * Ensure the authentication request is not rate limited. + */ + protected function ensureIsNotRateLimited(): void + { + if (! RateLimiter::tooManyAttempts($this->throttleKey(), 5)) { + return; + } + + event(new Lockout(request())); + + $seconds = RateLimiter::availableIn($this->throttleKey()); + + throw ValidationException::withMessages([ + 'email' => __('auth.throttle', [ + 'seconds' => $seconds, + 'minutes' => ceil($seconds / 60), + ]), + ]); + } + + /** + * Get the authentication rate limiting throttle key. + */ + protected function throttleKey(): string + { + return Str::transliterate(Str::lower($this->email).'|'.request()->ip()); + } +} diff --git a/app/Livewire/Auth/Register.php b/app/Livewire/Auth/Register.php new file mode 100644 index 0000000..8541536 --- /dev/null +++ b/app/Livewire/Auth/Register.php @@ -0,0 +1,43 @@ +validate([ + 'name' => ['required', 'string', 'max:255'], + 'email' => ['required', 'string', 'lowercase', 'email', 'max:255', 'unique:'.User::class], + 'password' => ['required', 'string', 'confirmed', Rules\Password::defaults()], + ]); + + $validated['password'] = Hash::make($validated['password']); + + event(new Registered(($user = User::create($validated)))); + + Auth::login($user); + + $this->redirect(route('dashboard', absolute: false), navigate: true); + } +} diff --git a/app/Livewire/Auth/ResetPassword.php b/app/Livewire/Auth/ResetPassword.php new file mode 100644 index 0000000..28b3940 --- /dev/null +++ b/app/Livewire/Auth/ResetPassword.php @@ -0,0 +1,76 @@ +token = $token; + + $this->email = request()->string('email'); + } + + /** + * Reset the password for the given user. + */ + public function resetPassword(): void + { + $this->validate([ + 'token' => ['required'], + 'email' => ['required', 'string', 'email'], + 'password' => ['required', 'string', 'confirmed', Rules\Password::defaults()], + ]); + + // Here we will attempt to reset the user's password. If it is successful we + // will update the password on an actual user model and persist it to the + // database. Otherwise we will parse the error and return the response. + $status = Password::reset( + $this->only('email', 'password', 'password_confirmation', 'token'), + function ($user) { + $user->forceFill([ + 'password' => Hash::make($this->password), + 'remember_token' => Str::random(60), + ])->save(); + + event(new PasswordReset($user)); + } + ); + + // If the password was successfully reset, we will redirect the user back to + // the application's home authenticated view. If there is an error we can + // redirect them back to where they came from with their error message. + if ($status != Password::PasswordReset) { + $this->addError('email', __($status)); + + return; + } + + Session::flash('status', __($status)); + + $this->redirectRoute('login', navigate: true); + } +} diff --git a/app/Livewire/Auth/VerifyEmail.php b/app/Livewire/Auth/VerifyEmail.php new file mode 100644 index 0000000..ba11d73 --- /dev/null +++ b/app/Livewire/Auth/VerifyEmail.php @@ -0,0 +1,39 @@ +hasVerifiedEmail()) { + $this->redirectIntended(default: route('dashboard', absolute: false), navigate: true); + + return; + } + + Auth::user()->sendEmailVerificationNotification(); + + Session::flash('status', 'verification-link-sent'); + } + + /** + * Log the current user out of the application. + */ + public function logout(Logout $logout): void + { + $logout(); + + $this->redirect('/', navigate: true); + } +} diff --git a/app/Livewire/Dashboard/Dashboard.php b/app/Livewire/Dashboard/Dashboard.php new file mode 100644 index 0000000..1e0ef9a --- /dev/null +++ b/app/Livewire/Dashboard/Dashboard.php @@ -0,0 +1,13 @@ +layout('components.layouts.dashboard'); + } +} diff --git a/app/Livewire/Settings/Appearance.php b/app/Livewire/Settings/Appearance.php new file mode 100644 index 0000000..be0927a --- /dev/null +++ b/app/Livewire/Settings/Appearance.php @@ -0,0 +1,12 @@ +validate([ + 'password' => ['required', 'string', 'current_password'], + ]); + + tap(Auth::user(), $logout(...))->delete(); + + $this->redirect('/', navigate: true); + } +} diff --git a/app/Livewire/Settings/Password.php b/app/Livewire/Settings/Password.php new file mode 100644 index 0000000..9fb0d26 --- /dev/null +++ b/app/Livewire/Settings/Password.php @@ -0,0 +1,45 @@ +validate([ + 'current_password' => ['required', 'string', 'current_password'], + 'password' => ['required', 'string', PasswordRule::defaults(), 'confirmed'], + ]); + } catch (ValidationException $e) { + $this->reset('current_password', 'password', 'password_confirmation'); + + throw $e; + } + + Auth::user()->update([ + 'password' => Hash::make($validated['password']), + ]); + + $this->reset('current_password', 'password', 'password_confirmation'); + + $this->dispatch('password-updated'); + } +} diff --git a/app/Livewire/Settings/Profile.php b/app/Livewire/Settings/Profile.php new file mode 100644 index 0000000..d114ad2 --- /dev/null +++ b/app/Livewire/Settings/Profile.php @@ -0,0 +1,76 @@ +name = Auth::user()->name; + $this->email = Auth::user()->email; + } + + /** + * Update the profile information for the currently authenticated user. + */ + public function updateProfileInformation(): void + { + $user = Auth::user(); + + $validated = $this->validate([ + 'name' => ['required', 'string', 'max:255'], + + 'email' => [ + 'required', + 'string', + 'lowercase', + 'email', + 'max:255', + Rule::unique(User::class)->ignore($user->id), + ], + ]); + + $user->fill($validated); + + if ($user->isDirty('email')) { + $user->email_verified_at = null; + } + + $user->save(); + + $this->dispatch('profile-updated', name: $user->name); + } + + /** + * Send an email verification notification to the current user. + */ + public function resendVerificationNotification(): void + { + $user = Auth::user(); + + if ($user->hasVerifiedEmail()) { + $this->redirectIntended(default: route('dashboard', absolute: false)); + + return; + } + + $user->sendEmailVerificationNotification(); + + Session::flash('status', 'verification-link-sent'); + } +} diff --git a/app/Models/User.php b/app/Models/User.php index 81e5ffe..3a0508e 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -8,8 +8,10 @@ use Filament\Panel; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; +use Illuminate\Contracts\Auth\MustVerifyEmail; +use Illuminate\Support\Str; -class User extends Authenticatable implements FilamentUser +class User extends Authenticatable implements FilamentUser, MustVerifyEmail { /** @use HasFactory<\Database\Factories\UserFactory> */ use HasFactory, Notifiable; @@ -48,6 +50,14 @@ class User extends Authenticatable implements FilamentUser ]; } + public function initials(): string + { + return Str::of($this->name) + ->explode(' ') + ->map(fn (string $name) => Str::of($name)->substr(0, 1)) + ->implode(''); + } + public function canAccessPanel(Panel $panel): bool { return str_ends_with($this->email, '@zemail.me') && $this->level === 9 && $this->hasVerifiedEmail(); diff --git a/resources/views/components/action-message.blade.php b/resources/views/components/action-message.blade.php new file mode 100644 index 0000000..d313ee6 --- /dev/null +++ b/resources/views/components/action-message.blade.php @@ -0,0 +1,14 @@ +@props([ + 'on', +]) + +
merge(['class' => 'text-sm']) }} +> + {{ $slot->isEmpty() ? __('Saved.') : $slot }} +
diff --git a/resources/views/components/app-logo-icon.blade.php b/resources/views/components/app-logo-icon.blade.php new file mode 100644 index 0000000..a76b040 --- /dev/null +++ b/resources/views/components/app-logo-icon.blade.php @@ -0,0 +1 @@ +logo diff --git a/resources/views/components/auth-header.blade.php b/resources/views/components/auth-header.blade.php new file mode 100644 index 0000000..e596a3f --- /dev/null +++ b/resources/views/components/auth-header.blade.php @@ -0,0 +1,9 @@ +@props([ + 'title', + 'description', +]) + +
+ {{ $title }} + {{ $description }} +
diff --git a/resources/views/components/auth-session-status.blade.php b/resources/views/components/auth-session-status.blade.php new file mode 100644 index 0000000..98e0011 --- /dev/null +++ b/resources/views/components/auth-session-status.blade.php @@ -0,0 +1,9 @@ +@props([ + 'status', +]) + +@if ($status) +
merge(['class' => 'font-medium text-sm text-green-600']) }}> + {{ $status }} +
+@endif diff --git a/resources/views/components/layouts/app.blade.php b/resources/views/components/layouts/app.blade.php index 08b811a..368911d 100644 --- a/resources/views/components/layouts/app.blade.php +++ b/resources/views/components/layouts/app.blade.php @@ -212,6 +212,6 @@ }); {!! config('app.settings.app_footer') !!} - @yield('custom_header') + @yield('custom_footer') diff --git a/resources/views/components/layouts/auth.blade.php b/resources/views/components/layouts/auth.blade.php new file mode 100644 index 0000000..56d6cb6 --- /dev/null +++ b/resources/views/components/layouts/auth.blade.php @@ -0,0 +1,3 @@ + + {{ $slot }} + diff --git a/resources/views/components/layouts/auth/card.blade.php b/resources/views/components/layouts/auth/card.blade.php new file mode 100644 index 0000000..db94716 --- /dev/null +++ b/resources/views/components/layouts/auth/card.blade.php @@ -0,0 +1,26 @@ + + + + @include('partials.head') + + +
+
+ + + + + + {{ config('app.name', 'Laravel') }} + + +
+
+
{{ $slot }}
+
+
+
+
+ @fluxScripts + + diff --git a/resources/views/components/layouts/auth/simple.blade.php b/resources/views/components/layouts/auth/simple.blade.php new file mode 100644 index 0000000..6e0d909 --- /dev/null +++ b/resources/views/components/layouts/auth/simple.blade.php @@ -0,0 +1,22 @@ + + + + @include('partials.head') + + +
+
+ + + + + {{ config('app.name', 'Laravel') }} + +
+ {{ $slot }} +
+
+
+ @fluxScripts + + diff --git a/resources/views/components/layouts/auth/split.blade.php b/resources/views/components/layouts/auth/split.blade.php new file mode 100644 index 0000000..4e9788b --- /dev/null +++ b/resources/views/components/layouts/auth/split.blade.php @@ -0,0 +1,43 @@ + + + + @include('partials.head') + + +
+ +
+ +
+
+ @fluxScripts + + diff --git a/resources/views/components/layouts/dashboard.blade.php b/resources/views/components/layouts/dashboard.blade.php new file mode 100644 index 0000000..782d609 --- /dev/null +++ b/resources/views/components/layouts/dashboard.blade.php @@ -0,0 +1,189 @@ + + + + + + + + @yield('title', config('app.settings.app_title')) + + + @forelse (json_decode(config('app.settings.app_meta')) as $key => $value) + @if ($value) + + @endif + @empty + @endforelse + + @yield('metas') + + @if (file_exists(public_path('build/manifest.json')) || file_exists(public_path('hot'))) + @vite(['resources/css/app.css', 'resources/css/boil.css', 'resources/js/app.js', 'resources/js/boil.js']) + @endif + + @fluxAppearance + @yield('custom_header') + + + + + + logo + + + + + @php + $navItems = [ + ['label' => 'Dashboard', 'route' => 'dashboard'], + ['label' => 'Generate Premium Email', 'route' => 'dashboard.premium'], + ['label' => '10 Minute Mail', 'route' => 'dashboard.10minute'], + ['label' => 'Bulk Email', 'route' => 'dashboard.bulk'], + ['label' => 'Compose Email', 'route' => 'dashboard.compose'], + ]; + + $currentRoute = Route::currentRouteName(); + @endphp + + @foreach ($navItems as $item) + + @endforeach + + + + + + + + + + +
+
+ + + {{ auth()->user()->initials() }} + + + +
+ {{ auth()->user()->name }} + {{ auth()->user()->email }} +
+
+
+
+ + + + + {{ __('Settings') }} + + + +
+ @csrf + + {{ __('Log Out') }} + +
+
+
+

© 2020–{{ date('Y') }} – All Rights Reserved {{ config('app.settings.app_name') }} | Coded with ♥️

+ +
+ + +
+
+ +
+
+ + + + + + + + @foreach(config('app.locales') as $item => $language) + {{ config('app.locales_text')[$item] }} + @endforeach + + + + + + + {{-- --}} + {{-- --}} + {{-- --}} + + + + +
+
+ +
+ + + {{ $slot }} + + +
+ + + + @fluxScripts + + @yield('custom_footer') + + diff --git a/resources/views/components/placeholder-pattern.blade.php b/resources/views/components/placeholder-pattern.blade.php new file mode 100644 index 0000000..8a434f0 --- /dev/null +++ b/resources/views/components/placeholder-pattern.blade.php @@ -0,0 +1,12 @@ +@props([ + 'id' => uniqid(), +]) + + + + + + + + + diff --git a/resources/views/components/settings/layout.blade.php b/resources/views/components/settings/layout.blade.php new file mode 100644 index 0000000..05c0637 --- /dev/null +++ b/resources/views/components/settings/layout.blade.php @@ -0,0 +1,20 @@ +
+
+ + {{ __('Profile') }} + {{ __('Password') }} + {{ __('Appearance') }} + +
+ + + +
+ {{ $heading ?? '' }} + {{ $subheading ?? '' }} + +
+ {{ $slot }} +
+
+
diff --git a/resources/views/flux/icon/chevrons-up-down.blade.php b/resources/views/flux/icon/chevrons-up-down.blade.php new file mode 100644 index 0000000..b501899 --- /dev/null +++ b/resources/views/flux/icon/chevrons-up-down.blade.php @@ -0,0 +1,42 @@ +{{-- Credit: Lucide (https://lucide.dev) --}} + +@props([ + 'variant' => 'outline', +]) + +@php +if ($variant === 'solid') { + throw new \Exception('The "solid" variant is not supported in Lucide.'); +} + +$classes = Flux::classes('shrink-0') + ->add(match($variant) { + 'outline' => '[:where(&)]:size-6', + 'solid' => '[:where(&)]:size-6', + 'mini' => '[:where(&)]:size-5', + 'micro' => '[:where(&)]:size-4', + }); + +$strokeWidth = match ($variant) { + 'outline' => 2, + 'mini' => 2.25, + 'micro' => 2.5, +}; +@endphp + +class($classes) }} + data-flux-icon + xmlns="http://www.w3.org/2000/svg" + viewBox="0 0 24 24" + fill="none" + stroke="currentColor" + stroke-width="{{ $strokeWidth }}" + stroke-linecap="round" + stroke-linejoin="round" + aria-hidden="true" + data-slot="icon" +> + + + diff --git a/resources/views/livewire/auth/confirm-password.blade.php b/resources/views/livewire/auth/confirm-password.blade.php new file mode 100644 index 0000000..ad8b73b --- /dev/null +++ b/resources/views/livewire/auth/confirm-password.blade.php @@ -0,0 +1,24 @@ +
+ + + + + +
+ + + + {{ __('Confirm') }} + +
diff --git a/resources/views/livewire/auth/forgot-password.blade.php b/resources/views/livewire/auth/forgot-password.blade.php new file mode 100644 index 0000000..fcfb566 --- /dev/null +++ b/resources/views/livewire/auth/forgot-password.blade.php @@ -0,0 +1,27 @@ +@section('title'){{ __('Forget Password | ') }}@endsection +
+ + + + + +
+ + + + {{ __('Email password reset link') }} + + +
+ {{ __('Or, return to') }} + {{ __('log in') }} +
+
diff --git a/resources/views/livewire/auth/login.blade.php b/resources/views/livewire/auth/login.blade.php new file mode 100644 index 0000000..4b33c84 --- /dev/null +++ b/resources/views/livewire/auth/login.blade.php @@ -0,0 +1,53 @@ +@section('title'){{ __('Login | ') }}@endsection +
+ + + + + +
+ + + + +
+ + + @if (Route::has('password.request')) + + {{ __('Forgot your password?') }} + + @endif +
+ + + + +
+ {{ __('Log in') }} +
+ + + @if (Route::has('register')) +
+ {{ __('Don\'t have an account?') }} + {{ __('Sign up') }} +
+ @endif +
diff --git a/resources/views/livewire/auth/register.blade.php b/resources/views/livewire/auth/register.blade.php new file mode 100644 index 0000000..07d31a2 --- /dev/null +++ b/resources/views/livewire/auth/register.blade.php @@ -0,0 +1,63 @@ +@section('title'){{ __('Register | ') }}@endsection +
+ + + + + +
+ + + + + + + + + + + + +
+ + {{ __('Create account') }} + +
+ + +
+ {{ __('Already have an account?') }} + {{ __('Log in') }} +
+
diff --git a/resources/views/livewire/auth/reset-password.blade.php b/resources/views/livewire/auth/reset-password.blade.php new file mode 100644 index 0000000..e8085c5 --- /dev/null +++ b/resources/views/livewire/auth/reset-password.blade.php @@ -0,0 +1,45 @@ +
+ + + + + +
+ + + + + + + + + +
+ + {{ __('Reset password') }} + +
+ +
diff --git a/resources/views/livewire/auth/verify-email.blade.php b/resources/views/livewire/auth/verify-email.blade.php new file mode 100644 index 0000000..ab48ec0 --- /dev/null +++ b/resources/views/livewire/auth/verify-email.blade.php @@ -0,0 +1,21 @@ +
+ + {{ __('Please verify your email address by clicking on the link we just emailed to you.') }} + + + @if (session('status') == 'verification-link-sent') + + {{ __('A new verification link has been sent to the email address you provided during registration.') }} + + @endif + +
+ + {{ __('Resend verification email') }} + + + + {{ __('Log out') }} + +
+
diff --git a/resources/views/livewire/dashboard/dashboard.blade.php b/resources/views/livewire/dashboard/dashboard.blade.php new file mode 100644 index 0000000..82f42dd --- /dev/null +++ b/resources/views/livewire/dashboard/dashboard.blade.php @@ -0,0 +1,17 @@ +@section('title'){{ __('Dashboard') }}@endsection +
+
+
+ +
+
+ +
+
+ +
+
+
+ +
+
diff --git a/resources/views/livewire/settings/appearance.blade.php b/resources/views/livewire/settings/appearance.blade.php new file mode 100644 index 0000000..85e8983 --- /dev/null +++ b/resources/views/livewire/settings/appearance.blade.php @@ -0,0 +1,11 @@ +
+ @include('partials.settings-heading') + + + + {{ __('Light') }} + {{ __('Dark') }} + {{ __('System') }} + + +
diff --git a/resources/views/livewire/settings/delete-user-form.blade.php b/resources/views/livewire/settings/delete-user-form.blade.php new file mode 100644 index 0000000..47c9eb8 --- /dev/null +++ b/resources/views/livewire/settings/delete-user-form.blade.php @@ -0,0 +1,34 @@ +
+
+ {{ __('Delete account') }} + {{ __('Delete your account and all of its resources') }} +
+ + + + {{ __('Delete account') }} + + + + +
+
+ {{ __('Are you sure you want to delete your account?') }} + + + {{ __('Once your account is deleted, all of its resources and data will be permanently deleted. Please enter your password to confirm you would like to permanently delete your account.') }} + +
+ + + +
+ + {{ __('Cancel') }} + + + {{ __('Delete account') }} +
+ +
+
diff --git a/resources/views/livewire/settings/password.blade.php b/resources/views/livewire/settings/password.blade.php new file mode 100644 index 0000000..a55db8b --- /dev/null +++ b/resources/views/livewire/settings/password.blade.php @@ -0,0 +1,39 @@ +
+ @include('partials.settings-heading') + + +
+ + + + +
+
+ {{ __('Save') }} +
+ + + {{ __('Saved.') }} + +
+ +
+
diff --git a/resources/views/livewire/settings/profile.blade.php b/resources/views/livewire/settings/profile.blade.php new file mode 100644 index 0000000..5fa6cdb --- /dev/null +++ b/resources/views/livewire/settings/profile.blade.php @@ -0,0 +1,43 @@ +
+ @include('partials.settings-heading') + + +
+ + +
+ + + @if (auth()->user() instanceof \Illuminate\Contracts\Auth\MustVerifyEmail &&! auth()->user()->hasVerifiedEmail()) +
+ + {{ __('Your email address is unverified.') }} + + + {{ __('Click here to re-send the verification email.') }} + + + + @if (session('status') === 'verification-link-sent') + + {{ __('A new verification link has been sent to your email address.') }} + + @endif +
+ @endif +
+ +
+
+ {{ __('Save') }} +
+ + + {{ __('Saved.') }} + +
+ + +{{-- --}} +
+
diff --git a/resources/views/partials/head.blade.php b/resources/views/partials/head.blade.php new file mode 100644 index 0000000..6b7c586 --- /dev/null +++ b/resources/views/partials/head.blade.php @@ -0,0 +1,11 @@ + + + + +@yield('title', ''){{ config('app.settings.app_title') }} + +@if (file_exists(public_path('build/manifest.json')) || file_exists(public_path('hot'))) + @vite(['resources/css/app.css', 'resources/js/app.js']) +@endif + +@fluxAppearance diff --git a/resources/views/partials/settings-heading.blade.php b/resources/views/partials/settings-heading.blade.php new file mode 100644 index 0000000..925ace9 --- /dev/null +++ b/resources/views/partials/settings-heading.blade.php @@ -0,0 +1,5 @@ +
+ {{ __('Settings') }} + {{ __('Manage your profile and account settings') }} + +
diff --git a/resources/views/welcome.blade.php b/resources/views/welcome.blade.php index a383ca7..885c3ea 100644 --- a/resources/views/welcome.blade.php +++ b/resources/views/welcome.blade.php @@ -30,6 +30,12 @@ > Dashboard +
+ @csrf + + {{ __('Log Out') }} + +
@else group(function () { + Route::get('login', Login::class)->name('login'); + Route::get('register', Register::class)->name('register'); + Route::get('forgot-password', ForgotPassword::class)->name('password.request'); + Route::get('reset-password/{token}', ResetPassword::class)->name('password.reset'); +}); + +Route::middleware('auth')->group(function () { + Route::get('verify-email', VerifyEmail::class) + ->name('verification.notice'); + + Route::get('verify-email/{id}/{hash}', VerifyEmailController::class) + ->middleware(['signed', 'throttle:6,1']) + ->name('verification.verify'); + + Route::get('confirm-password', ConfirmPassword::class) + ->name('password.confirm'); +}); + +Route::post('logout', App\Livewire\Actions\Logout::class) + ->name('logout'); diff --git a/routes/web.php b/routes/web.php index 82878e3..b89b755 100644 --- a/routes/web.php +++ b/routes/web.php @@ -3,11 +3,15 @@ use App\Http\Controllers\AppController; use App\Http\Middleware\CheckPageSlug; use App\Livewire\Blog; +use App\Livewire\Dashboard\Dashboard; use App\Livewire\Frontend\Mailbox; use App\Livewire\Home; use App\Livewire\ListBlog; use App\Livewire\Page; +use App\Livewire\Settings\Appearance; +use App\Livewire\Settings\Password; +use App\Livewire\Settings\Profile; use App\Models\Email; use Illuminate\Support\Facades\Route; @@ -35,4 +39,24 @@ Route::post('/sync', function (Request $request) { return response()->noContent(); }); + +Route::middleware(['auth', 'verified'])->group(function () { + Route::get('dashboard', Dashboard::class)->name('dashboard'); + Route::get('dashboard/generate-premium-email', Dashboard::class)->name('dashboard.premium'); + Route::get('dashboard/generate-10minute-email', Dashboard::class)->name('dashboard.10minute'); + Route::get('dashboard/bulk-email-generator', Dashboard::class)->name('dashboard.bulk'); + Route::get('dashboard/compose-email', Dashboard::class)->name('dashboard.compose'); + +}); + +Route::middleware(['auth'])->group(function () { + Route::redirect('settings', 'settings/profile'); + + Route::get('settings/profile', Profile::class)->name('settings.profile'); + Route::get('settings/password', Password::class)->name('settings.password'); + Route::get('settings/appearance', Appearance::class)->name('settings.appearance'); +}); + +require __DIR__.'/auth.php'; + Route::get('{slug}', Page::class)->where('slug', '.*')->name('page')->middleware(CheckPageSlug::class);