diff --git a/components/apps/setting/pages/AddPageModal.vue b/components/apps/setting/pages/AddPageModal.vue new file mode 100644 index 0000000..308291b --- /dev/null +++ b/components/apps/setting/pages/AddPageModal.vue @@ -0,0 +1,359 @@ + + + diff --git a/components/apps/setting/pages/PageRow.vue b/components/apps/setting/pages/PageRow.vue new file mode 100644 index 0000000..cc7bc8d --- /dev/null +++ b/components/apps/setting/pages/PageRow.vue @@ -0,0 +1,90 @@ + + + + + diff --git a/components/auth/LoginForm.vue b/components/auth/LoginForm.vue index 565497d..4240fee 100644 --- a/components/auth/LoginForm.vue +++ b/components/auth/LoginForm.vue @@ -8,17 +8,18 @@

Silakan masuk dengan akun yang telah terdaftar

- - - {{ errorMessage }} - + + + {{ errorMessage }} + - - - {{ successMessage }} - + + + {{ successMessage }} + - + mdi-key-variant Masuk dengan Keycloak @@ -30,41 +31,19 @@ - - + +
- +
- -
@@ -76,38 +55,57 @@ + + \ No newline at end of file diff --git a/components/shared/LoadingState.vue b/components/shared/LoadingState.vue new file mode 100644 index 0000000..5c6ca5f --- /dev/null +++ b/components/shared/LoadingState.vue @@ -0,0 +1,127 @@ + + + + + diff --git a/composables/useAuth.ts b/composables/useAuth.ts index f3676d3..06766d8 100644 --- a/composables/useAuth.ts +++ b/composables/useAuth.ts @@ -12,8 +12,6 @@ const clearLocalAuthStorage = () => { localStorage.removeItem('accessToken'); localStorage.removeItem('refreshToken'); - localStorage.removeItem('user-preferences'); - localStorage.removeItem('app-state'); sessionStorage.clear(); }; diff --git a/composables/useValidation.ts b/composables/useValidation.ts index 3d36bdc..0f17199 100644 --- a/composables/useValidation.ts +++ b/composables/useValidation.ts @@ -8,6 +8,11 @@ export const useValidation = () => { return (value !== null && value !== undefined && String(value).trim() !== '') || message; }; + const emailRules = (value, message = 'Email tidak valid.') => { + if (!value) return true; + return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value) || message; + }; + const minNameLength = (value, minLength = 3) => { if (!value) return true; // Lewati jika kosong (handle oleh 'required') const length = value.trim().length; // Hitung panjang setelah menghapus spasi di awal/akhir @@ -51,6 +56,7 @@ export const useValidation = () => { return { required, + emailRules, isNumber, phoneLength, indonesianPhoneFormat, diff --git a/pages/apps/dashboard/index.vue b/pages/apps/dashboard/index.vue index f39ca62..f2dedbe 100644 --- a/pages/apps/dashboard/index.vue +++ b/pages/apps/dashboard/index.vue @@ -6,10 +6,24 @@ import Totalincome from '@/components/dashboard/TotalIncome.vue'; import RevenueProduct from '@/components/dashboard/RevenueProducts.vue'; import DailyActivities from '@/components/dashboard/DailyActivities.vue'; import BlogCards from '@/components/dashboard/BlogCards.vue'; +import { useAuth } from '~/composables/useAuth'; definePageMeta({ middleware: 'auth', }); + +const { sessionData } = useAuth(); + +onMounted(async () => { + const urlParams = new URLSearchParams(window.location.search); + const authStatus = urlParams.get('authenticated'); + if (authStatus === 'true') { + if (sessionData.value?.accessToken && sessionData.value?.refreshToken) { + localStorage.setItem('accessToken', sessionData.value.accessToken); + localStorage.setItem('refreshToken', sessionData.value.refreshToken); + } + } +});