diff --git a/app/Http/Controllers/Admin/Setting/AppearanceController.php b/app/Http/Controllers/Admin/Setting/AppearanceController.php
new file mode 100644
index 0000000..7ebeba5
--- /dev/null
+++ b/app/Http/Controllers/Admin/Setting/AppearanceController.php
@@ -0,0 +1,36 @@
+ request()->cookie('appearance', 'system'),
+ ]);
+ }
+
+ public function update(UpdateAppearanceRequest $request): RedirectResponse
+ {
+ $appearance = $request->string('appearance')->toString();
+
+ Inertia::flash('success', 'Tampilan berhasil diperbarui.');
+
+ return redirect()
+ ->route('admin.setting.appearance')
+ ->withCookie(Cookie::create('appearance')
+ ->withValue($appearance)
+ ->withExpires(now()->addYear())
+ ->withPath('/')
+ ->withHttpOnly(false)
+ ->withSameSite('lax'));
+ }
+}
diff --git a/app/Http/Controllers/Admin/Setting/PasswordController.php b/app/Http/Controllers/Admin/Setting/PasswordController.php
new file mode 100644
index 0000000..8c7e46e
--- /dev/null
+++ b/app/Http/Controllers/Admin/Setting/PasswordController.php
@@ -0,0 +1,29 @@
+user();
+ $user->password = Hash::make($request->string('password')->toString());
+ $user->save();
+
+ Inertia::flash('success', 'Kata sandi berhasil diperbarui.');
+
+ return redirect()->route('admin.setting.password');
+ }
+}
diff --git a/app/Http/Controllers/Admin/Setting/ProfileController.php b/app/Http/Controllers/Admin/Setting/ProfileController.php
new file mode 100644
index 0000000..8779ddd
--- /dev/null
+++ b/app/Http/Controllers/Admin/Setting/ProfileController.php
@@ -0,0 +1,37 @@
+user()->load('profile');
+
+ return Inertia::render('admin/setting/Profile', [
+ 'genders' => Gender::selectOptions(),
+ 'user' => $user,
+ ]);
+ }
+
+ public function update(UpdateProfileRequest $request): RedirectResponse
+ {
+ $this->profileService->update($request->validated());
+
+ Inertia::flash('success', 'Profil berhasil diperbarui.');
+
+ return redirect()->route('admin.setting.profile');
+ }
+}
diff --git a/app/Http/Middleware/HandleAppearance.php b/app/Http/Middleware/HandleAppearance.php
new file mode 100644
index 0000000..15c2394
--- /dev/null
+++ b/app/Http/Middleware/HandleAppearance.php
@@ -0,0 +1,21 @@
+cookie('appearance', 'system'));
+
+ return $next($request);
+ }
+}
diff --git a/app/Http/Middleware/HandleInertiaRequests.php b/app/Http/Middleware/HandleInertiaRequests.php
index c9e1368..b6674f7 100644
--- a/app/Http/Middleware/HandleInertiaRequests.php
+++ b/app/Http/Middleware/HandleInertiaRequests.php
@@ -55,6 +55,7 @@ public function share(Request $request): array
],
'sidebarOpen' => ! $request->hasCookie('sidebar_state')
|| $request->cookie('sidebar_state') === 'true',
+ 'appearance' => $request->cookie('appearance', 'system'),
];
}
}
diff --git a/app/Http/Requests/Admin/Setting/UpdateAppearanceRequest.php b/app/Http/Requests/Admin/Setting/UpdateAppearanceRequest.php
new file mode 100644
index 0000000..cb8af1c
--- /dev/null
+++ b/app/Http/Requests/Admin/Setting/UpdateAppearanceRequest.php
@@ -0,0 +1,21 @@
+check();
+ }
+
+ public function rules(): array
+ {
+ return [
+ 'appearance' => ['required', Rule::in(['light', 'dark', 'system'])],
+ ];
+ }
+}
diff --git a/app/Http/Requests/Admin/Setting/UpdatePasswordRequest.php b/app/Http/Requests/Admin/Setting/UpdatePasswordRequest.php
new file mode 100644
index 0000000..14d771c
--- /dev/null
+++ b/app/Http/Requests/Admin/Setting/UpdatePasswordRequest.php
@@ -0,0 +1,22 @@
+check();
+ }
+
+ public function rules(): array
+ {
+ return [
+ 'current_password' => ['required', 'current_password'],
+ 'password' => ['required', 'confirmed', Password::defaults()],
+ ];
+ }
+}
diff --git a/app/Http/Requests/Admin/Setting/UpdateProfileRequest.php b/app/Http/Requests/Admin/Setting/UpdateProfileRequest.php
new file mode 100644
index 0000000..9c07909
--- /dev/null
+++ b/app/Http/Requests/Admin/Setting/UpdateProfileRequest.php
@@ -0,0 +1,28 @@
+check();
+ }
+
+ public function rules(): array
+ {
+ return [
+ 'email' => ['required', 'email', 'max:100', Rule::unique('users', 'email')->ignore($this->user()?->id)],
+ 'username' => ['required', 'string', 'max:20', 'alpha_dash', Rule::unique('users', 'username')->ignore($this->user()?->id)],
+ 'full_name' => ['required', 'string', 'max:200'],
+ 'phone_number' => ['nullable', 'string', 'regex:/^08\d{8,11}$/'],
+ 'gender' => ['nullable', Rule::enum(Gender::class)],
+ 'birth_date' => ['nullable', 'date', 'before:today'],
+ 'address' => ['nullable', 'string'],
+ ];
+ }
+}
diff --git a/app/Services/Setting/ProfileService.php b/app/Services/Setting/ProfileService.php
new file mode 100644
index 0000000..7b89e11
--- /dev/null
+++ b/app/Services/Setting/ProfileService.php
@@ -0,0 +1,30 @@
+user();
+
+ DB::transaction(function () use ($user, $validated): void {
+ $user->email = $validated['email'];
+ $user->username = $validated['username'];
+ $user->save();
+
+ $user->profile()->updateOrCreate(
+ ['user_id' => $user->id],
+ [
+ 'full_name' => $validated['full_name'],
+ 'phone_number' => $validated['phone_number'] ?? null,
+ 'gender' => $validated['gender'] ?? null,
+ 'birth_date' => $validated['birth_date'] ?? null,
+ 'address' => $validated['address'] ?? null,
+ ],
+ );
+ });
+ }
+}
diff --git a/bootstrap/app.php b/bootstrap/app.php
index 8c18807..b9b2d94 100644
--- a/bootstrap/app.php
+++ b/bootstrap/app.php
@@ -1,5 +1,6 @@
web(append: [
+ HandleAppearance::class,
HandleInertiaRequests::class,
AddLinkHeadersForPreloadedAssets::class,
]);
diff --git a/resources/js/components/UserNav.vue b/resources/js/components/UserNav.vue
index 62a3e87..f1d8b97 100644
--- a/resources/js/components/UserNav.vue
+++ b/resources/js/components/UserNav.vue
@@ -1,6 +1,6 @@
+
+
+
+ Pengaturan
+
+