diff --git a/app/Models/User.php b/app/Models/User.php
index 309b669..df60b4b 100644
--- a/app/Models/User.php
+++ b/app/Models/User.php
@@ -6,11 +6,24 @@ use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
+use App\Notifications\VerifyEmail as MelayuEmel;
+use App\Notifications\ResetPassword as ResetPass;
+
+
class User extends Authenticatable implements MustVerifyEmail
{
use HasFactory, Notifiable;
+ public function sendEmailVerificationNotification()
+ {
+ $this->notify(new MelayuEmel);
+ }
+
+ public function sendPasswordResetNotification($token)
+ {
+ $this->notify(new ResetPass($token));
+ }
/**
* The attributes that are mass assignable.
*
diff --git a/app/Notifications/ResetPassword.php b/app/Notifications/ResetPassword.php
new file mode 100644
index 0000000..db60cd4
--- /dev/null
+++ b/app/Notifications/ResetPassword.php
@@ -0,0 +1,115 @@
+token = $token;
+ }
+
+ /**
+ * Get the notification's channels.
+ *
+ * @param mixed $notifiable
+ * @return array|string
+ */
+ public function via($notifiable)
+ {
+ return ['mail'];
+ }
+
+ /**
+ * Build the mail representation of the notification.
+ *
+ * @param mixed $notifiable
+ * @return \Illuminate\Notifications\Messages\MailMessage
+ */
+ public function toMail($notifiable)
+ {
+ if (static::$toMailCallback) {
+ return call_user_func(static::$toMailCallback, $notifiable, $this->token);
+ }
+
+ if (static::$createUrlCallback) {
+ $url = call_user_func(static::$createUrlCallback, $notifiable, $this->token);
+ } else {
+ $url = url(route('password.reset', [
+ 'token' => $this->token,
+ 'email' => $notifiable->getEmailForPasswordReset(),
+ ], false));
+ }
+
+ return $this->buildMailMessage($url);
+ }
+
+ /**
+ * Get the reset password notification mail message for the given URL.
+ *
+ * @param string $url
+ * @return \Illuminate\Notifications\Messages\MailMessage
+ */
+ protected function buildMailMessage($url)
+ {
+ return (new MailMessage)
+ ->subject(Lang::get('Tetapan Semula Kata Laluan'))
+ ->line(Lang::get('Sila klik butang dibawah untuk menetapkan semula kata laluan akaun Customer Portal.'))
+ ->action(Lang::get('Tetap Semula'), $url)
+ ->line(Lang::get('Pautan tetapan semula kata laluan ini akan berakhir dalam :count minit.', ['count' => config('auth.passwords.'.config('auth.defaults.passwords').'.expire')]))
+ ->line(Lang::get('Abaikan e-mel ini jika anda tidak membuat sebarang permohonan.'));
+ }
+
+ /**
+ * Set a callback that should be used when creating the reset password button URL.
+ *
+ * @param \Closure $callback
+ * @return void
+ */
+ public static function createUrlUsing($callback)
+ {
+ static::$createUrlCallback = $callback;
+ }
+
+ /**
+ * Set a callback that should be used when building the notification mail message.
+ *
+ * @param \Closure $callback
+ * @return void
+ */
+ public static function toMailUsing($callback)
+ {
+ static::$toMailCallback = $callback;
+ }
+}
\ No newline at end of file
diff --git a/app/Notifications/VerifyEmail.php b/app/Notifications/VerifyEmail.php
new file mode 100644
index 0000000..1f5ebe5
--- /dev/null
+++ b/app/Notifications/VerifyEmail.php
@@ -0,0 +1,114 @@
+verificationUrl($notifiable);
+
+ if (static::$toMailCallback) {
+ return call_user_func(static::$toMailCallback, $notifiable, $verificationUrl);
+ }
+
+ return $this->buildMailMessage($verificationUrl);
+ }
+
+ /**
+ * Get the verify email notification mail message for the given URL.
+ *
+ * @param string $url
+ * @return \Illuminate\Notifications\Messages\MailMessage
+ */
+ protected function buildMailMessage($url)
+ {
+ return (new MailMessage)
+ ->subject(Lang::get('Sahkan Alamat E-mel'))
+ ->line(Lang::get('Sila klik butang dibawah untuk pengesahan alamat e-mel akaun Customer Portal.'))
+ ->action(Lang::get('Sahkan'), $url)
+ ->line(Lang::get('Abaikan e-mel ini jika anda tidak membuat sebarang permohonan.'));
+ }
+
+ /**
+ * Get the verification URL for the given notifiable.
+ *
+ * @param mixed $notifiable
+ * @return string
+ */
+ protected function verificationUrl($notifiable)
+ {
+ if (static::$createUrlCallback) {
+ return call_user_func(static::$createUrlCallback, $notifiable);
+ }
+
+ return URL::temporarySignedRoute(
+ 'verification.verify',
+ Carbon::now()->addMinutes(Config::get('auth.verification.expire', 60)),
+ [
+ 'id' => $notifiable->getKey(),
+ 'hash' => sha1($notifiable->getEmailForVerification()),
+ ]
+ );
+ }
+
+ /**
+ * Set a callback that should be used when creating the email verification URL.
+ *
+ * @param \Closure $callback
+ * @return void
+ */
+ public static function createUrlUsing($callback)
+ {
+ static::$createUrlCallback = $callback;
+ }
+
+ /**
+ * Set a callback that should be used when building the notification mail message.
+ *
+ * @param \Closure $callback
+ * @return void
+ */
+ public static function toMailUsing($callback)
+ {
+ static::$toMailCallback = $callback;
+ }
+}
\ No newline at end of file
diff --git a/public/argon/img/brand/arrahnpay.png b/public/argon/img/brand/arrahnpay.png
new file mode 100644
index 0000000..76b9528
Binary files /dev/null and b/public/argon/img/brand/arrahnpay.png differ
diff --git a/resources/views/vendor/mail/html/button.blade.php b/resources/views/vendor/mail/html/button.blade.php
new file mode 100644
index 0000000..e74fe55
--- /dev/null
+++ b/resources/views/vendor/mail/html/button.blade.php
@@ -0,0 +1,19 @@
+
diff --git a/resources/views/vendor/mail/html/footer.blade.php b/resources/views/vendor/mail/html/footer.blade.php
new file mode 100644
index 0000000..3ff41f8
--- /dev/null
+++ b/resources/views/vendor/mail/html/footer.blade.php
@@ -0,0 +1,11 @@
+
+|
+
+ |
+
diff --git a/resources/views/vendor/mail/html/header.blade.php b/resources/views/vendor/mail/html/header.blade.php
new file mode 100644
index 0000000..77eb57c
--- /dev/null
+++ b/resources/views/vendor/mail/html/header.blade.php
@@ -0,0 +1,12 @@
+
+
+
diff --git a/resources/views/vendor/mail/html/layout.blade.php b/resources/views/vendor/mail/html/layout.blade.php
new file mode 100644
index 0000000..21d349b
--- /dev/null
+++ b/resources/views/vendor/mail/html/layout.blade.php
@@ -0,0 +1,56 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{{ $header ?? '' }}
+
+
+
+
+
+
+
+|
+{{ Illuminate\Mail\Markdown::parse($slot) }}
+
+{{ $subcopy ?? '' }}
+ |
+
+
+ |
+
+
+{{ $footer ?? '' }}
+
+ |
+
+
+
+
diff --git a/resources/views/vendor/mail/html/message.blade.php b/resources/views/vendor/mail/html/message.blade.php
new file mode 100644
index 0000000..4fa92be
--- /dev/null
+++ b/resources/views/vendor/mail/html/message.blade.php
@@ -0,0 +1,28 @@
+@component('mail::layout')
+{{-- Header --}}
+@slot('header')
+@component('mail::header', ['url' => config('app.url')])
+{{ config('app.name') }}
+@endcomponent
+@endslot
+
+{{-- Body --}}
+{{ $slot }}
+
+{{-- Subcopy --}}
+@isset($subcopy)
+@slot('subcopy')
+@component('mail::subcopy')
+{{ $subcopy }}
+@endcomponent
+@endslot
+@endisset
+
+{{-- Footer --}}
+@slot('footer')
+@component('mail::footer')
+{{-- © {{ date('Y') }} {{ config('app.name') }}. @lang('All rights reserved.') --}}
+© {{ date('Y') }}. @lang('Permodalan Kelantan Berhad.')
+@endcomponent
+@endslot
+@endcomponent
diff --git a/resources/views/vendor/mail/html/panel.blade.php b/resources/views/vendor/mail/html/panel.blade.php
new file mode 100644
index 0000000..2975a60
--- /dev/null
+++ b/resources/views/vendor/mail/html/panel.blade.php
@@ -0,0 +1,14 @@
+
+
+
+
+
+|
+{{ Illuminate\Mail\Markdown::parse($slot) }}
+ |
+
+
+ |
+
+
+
diff --git a/resources/views/vendor/mail/html/subcopy.blade.php b/resources/views/vendor/mail/html/subcopy.blade.php
new file mode 100644
index 0000000..790ce6c
--- /dev/null
+++ b/resources/views/vendor/mail/html/subcopy.blade.php
@@ -0,0 +1,7 @@
+
+
+|
+{{ Illuminate\Mail\Markdown::parse($slot) }}
+ |
+
+
diff --git a/resources/views/vendor/mail/html/table.blade.php b/resources/views/vendor/mail/html/table.blade.php
new file mode 100644
index 0000000..a5f3348
--- /dev/null
+++ b/resources/views/vendor/mail/html/table.blade.php
@@ -0,0 +1,3 @@
+
+{{ Illuminate\Mail\Markdown::parse($slot) }}
+
diff --git a/resources/views/vendor/mail/html/themes/default.css b/resources/views/vendor/mail/html/themes/default.css
new file mode 100644
index 0000000..f74f101
--- /dev/null
+++ b/resources/views/vendor/mail/html/themes/default.css
@@ -0,0 +1,290 @@
+/* Base */
+
+body,
+body *:not(html):not(style):not(br):not(tr):not(code) {
+ box-sizing: border-box;
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif,
+ 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';
+ position: relative;
+}
+
+body {
+ -webkit-text-size-adjust: none;
+ background-color: #ffffff;
+ color: #718096;
+ height: 100%;
+ line-height: 1.4;
+ margin: 0;
+ padding: 0;
+ width: 100% !important;
+}
+
+p,
+ul,
+ol,
+blockquote {
+ line-height: 1.4;
+ text-align: left;
+}
+
+a {
+ color: #3869d4;
+}
+
+a img {
+ border: none;
+}
+
+/* Typography */
+
+h1 {
+ color: #3d4852;
+ font-size: 18px;
+ font-weight: bold;
+ margin-top: 0;
+ text-align: left;
+}
+
+h2 {
+ font-size: 16px;
+ font-weight: bold;
+ margin-top: 0;
+ text-align: left;
+}
+
+h3 {
+ font-size: 14px;
+ font-weight: bold;
+ margin-top: 0;
+ text-align: left;
+}
+
+p {
+ font-size: 16px;
+ line-height: 1.5em;
+ margin-top: 0;
+ text-align: left;
+}
+
+p.sub {
+ font-size: 12px;
+}
+
+img {
+ max-width: 100%;
+}
+
+/* Layout */
+
+.wrapper {
+ -premailer-cellpadding: 0;
+ -premailer-cellspacing: 0;
+ -premailer-width: 100%;
+ background-color: #edf2f7;
+ margin: 0;
+ padding: 0;
+ width: 100%;
+}
+
+.content {
+ -premailer-cellpadding: 0;
+ -premailer-cellspacing: 0;
+ -premailer-width: 100%;
+ margin: 0;
+ padding: 0;
+ width: 100%;
+}
+
+/* Header */
+
+.header {
+ padding: 25px 0;
+ text-align: center;
+}
+
+.header a {
+ color: #3d4852;
+ font-size: 19px;
+ font-weight: bold;
+ text-decoration: none;
+}
+
+/* Logo */
+
+.logo {
+ height: 75px;
+ max-height: 75px;
+ width: 75px;
+}
+
+/* Body */
+
+.body {
+ -premailer-cellpadding: 0;
+ -premailer-cellspacing: 0;
+ -premailer-width: 100%;
+ background-color: #edf2f7;
+ border-bottom: 1px solid #edf2f7;
+ border-top: 1px solid #edf2f7;
+ margin: 0;
+ padding: 0;
+ width: 100%;
+}
+
+.inner-body {
+ -premailer-cellpadding: 0;
+ -premailer-cellspacing: 0;
+ -premailer-width: 570px;
+ background-color: #ffffff;
+ border-color: #e8e5ef;
+ border-radius: 2px;
+ border-width: 1px;
+ box-shadow: 0 2px 0 rgba(0, 0, 150, 0.025), 2px 4px 0 rgba(0, 0, 150, 0.015);
+ margin: 0 auto;
+ padding: 0;
+ width: 570px;
+}
+
+/* Subcopy */
+
+.subcopy {
+ border-top: 1px solid #e8e5ef;
+ margin-top: 25px;
+ padding-top: 25px;
+}
+
+.subcopy p {
+ font-size: 14px;
+}
+
+/* Footer */
+
+.footer {
+ -premailer-cellpadding: 0;
+ -premailer-cellspacing: 0;
+ -premailer-width: 570px;
+ margin: 0 auto;
+ padding: 0;
+ text-align: center;
+ width: 570px;
+}
+
+.footer p {
+ color: #b0adc5;
+ font-size: 12px;
+ text-align: center;
+}
+
+.footer a {
+ color: #b0adc5;
+ text-decoration: underline;
+}
+
+/* Tables */
+
+.table table {
+ -premailer-cellpadding: 0;
+ -premailer-cellspacing: 0;
+ -premailer-width: 100%;
+ margin: 30px auto;
+ width: 100%;
+}
+
+.table th {
+ border-bottom: 1px solid #edeff2;
+ margin: 0;
+ padding-bottom: 8px;
+}
+
+.table td {
+ color: #74787e;
+ font-size: 15px;
+ line-height: 18px;
+ margin: 0;
+ padding: 10px 0;
+}
+
+.content-cell {
+ max-width: 100vw;
+ padding: 32px;
+}
+
+/* Buttons */
+
+.action {
+ -premailer-cellpadding: 0;
+ -premailer-cellspacing: 0;
+ -premailer-width: 100%;
+ margin: 30px auto;
+ padding: 0;
+ text-align: center;
+ width: 100%;
+}
+
+.button {
+ -webkit-text-size-adjust: none;
+ border-radius: 4px;
+ color: #fff;
+ display: inline-block;
+ overflow: hidden;
+ text-decoration: none;
+}
+
+.button-blue,
+.button-primary {
+ background-color: #3b7dee;
+ border-bottom: 8px solid #3b7dee;
+ border-left: 18px solid #3b7dee;
+ border-right: 18px solid #3b7dee;
+ border-top: 8px solid #3b7dee;
+}
+
+.button-green,
+.button-success {
+ background-color: #48bb78;
+ border-bottom: 8px solid #48bb78;
+ border-left: 18px solid #48bb78;
+ border-right: 18px solid #48bb78;
+ border-top: 8px solid #48bb78;
+}
+
+.button-red,
+.button-error {
+ background-color: #e53e3e;
+ border-bottom: 8px solid #e53e3e;
+ border-left: 18px solid #e53e3e;
+ border-right: 18px solid #e53e3e;
+ border-top: 8px solid #e53e3e;
+}
+
+/* Panels */
+
+.panel {
+ border-left: #2d3748 solid 4px;
+ margin: 21px 0;
+}
+
+.panel-content {
+ background-color: #edf2f7;
+ color: #718096;
+ padding: 16px;
+}
+
+.panel-content p {
+ color: #718096;
+}
+
+.panel-item {
+ padding: 0;
+}
+
+.panel-item p:last-of-type {
+ margin-bottom: 0;
+ padding-bottom: 0;
+}
+
+/* Utilities */
+
+.break-all {
+ word-break: break-all;
+}
diff --git a/resources/views/vendor/mail/text/button.blade.php b/resources/views/vendor/mail/text/button.blade.php
new file mode 100644
index 0000000..97444eb
--- /dev/null
+++ b/resources/views/vendor/mail/text/button.blade.php
@@ -0,0 +1 @@
+{{ $slot }}: {{ $url }}
diff --git a/resources/views/vendor/mail/text/footer.blade.php b/resources/views/vendor/mail/text/footer.blade.php
new file mode 100644
index 0000000..3338f62
--- /dev/null
+++ b/resources/views/vendor/mail/text/footer.blade.php
@@ -0,0 +1 @@
+{{ $slot }}
diff --git a/resources/views/vendor/mail/text/header.blade.php b/resources/views/vendor/mail/text/header.blade.php
new file mode 100644
index 0000000..aaa3e57
--- /dev/null
+++ b/resources/views/vendor/mail/text/header.blade.php
@@ -0,0 +1 @@
+[{{ $slot }}]({{ $url }})
diff --git a/resources/views/vendor/mail/text/layout.blade.php b/resources/views/vendor/mail/text/layout.blade.php
new file mode 100644
index 0000000..9378baa
--- /dev/null
+++ b/resources/views/vendor/mail/text/layout.blade.php
@@ -0,0 +1,9 @@
+{!! strip_tags($header) !!}
+
+{!! strip_tags($slot) !!}
+@isset($subcopy)
+
+{!! strip_tags($subcopy) !!}
+@endisset
+
+{!! strip_tags($footer) !!}
diff --git a/resources/views/vendor/mail/text/message.blade.php b/resources/views/vendor/mail/text/message.blade.php
new file mode 100644
index 0000000..1ae9ed8
--- /dev/null
+++ b/resources/views/vendor/mail/text/message.blade.php
@@ -0,0 +1,27 @@
+@component('mail::layout')
+ {{-- Header --}}
+ @slot('header')
+ @component('mail::header', ['url' => config('app.url')])
+ {{ config('app.name') }}
+ @endcomponent
+ @endslot
+
+ {{-- Body --}}
+ {{ $slot }}
+
+ {{-- Subcopy --}}
+ @isset($subcopy)
+ @slot('subcopy')
+ @component('mail::subcopy')
+ {{ $subcopy }}
+ @endcomponent
+ @endslot
+ @endisset
+
+ {{-- Footer --}}
+ @slot('footer')
+ @component('mail::footer')
+ © {{ date('Y') }} {{ config('app.name') }}. @lang('All rights reserved.')
+ @endcomponent
+ @endslot
+@endcomponent
diff --git a/resources/views/vendor/mail/text/panel.blade.php b/resources/views/vendor/mail/text/panel.blade.php
new file mode 100644
index 0000000..3338f62
--- /dev/null
+++ b/resources/views/vendor/mail/text/panel.blade.php
@@ -0,0 +1 @@
+{{ $slot }}
diff --git a/resources/views/vendor/mail/text/subcopy.blade.php b/resources/views/vendor/mail/text/subcopy.blade.php
new file mode 100644
index 0000000..3338f62
--- /dev/null
+++ b/resources/views/vendor/mail/text/subcopy.blade.php
@@ -0,0 +1 @@
+{{ $slot }}
diff --git a/resources/views/vendor/mail/text/table.blade.php b/resources/views/vendor/mail/text/table.blade.php
new file mode 100644
index 0000000..3338f62
--- /dev/null
+++ b/resources/views/vendor/mail/text/table.blade.php
@@ -0,0 +1 @@
+{{ $slot }}
diff --git a/resources/views/vendor/notifications/email.blade.php b/resources/views/vendor/notifications/email.blade.php
new file mode 100644
index 0000000..ec6d175
--- /dev/null
+++ b/resources/views/vendor/notifications/email.blade.php
@@ -0,0 +1,62 @@
+@component('mail::message')
+{{-- Greeting --}}
+@if (! empty($greeting))
+# {{ $greeting }}
+@else
+@if ($level === 'error')
+# @lang('Whoops!')
+@else
+# @lang('Salam Sejahtera')
+@endif
+@endif
+
+{{-- Intro Lines --}}
+@foreach ($introLines as $line)
+{{ $line }}
+
+@endforeach
+
+{{-- Action Button --}}
+@isset($actionText)
+
+@component('mail::button', ['url' => $actionUrl, 'color' => $color])
+{{ $actionText }}
+@endcomponent
+@endisset
+
+{{-- Outro Lines --}}
+@foreach ($outroLines as $line)
+{{ $line }}
+
+@endforeach
+
+{{-- Salutation --}}
+@if (! empty($salutation))
+{{ $salutation }}
+@else
+@lang('Terima kasih.')
+{{-- config('app.name') --}}
+@endif
+
+{{-- Subcopy --}}
+@isset($actionText)
+@slot('subcopy')
+@lang(
+ "Jika anda menghadapi masalah untuk menekan butang \":actionText\", sila salin dan tampal \n".
+ 'pautan di bawah ke pelayar anda:',
+ [
+ 'actionText' => $actionText,
+ ]
+) [{{ $displayableActionUrl }}]({{ $actionUrl }})
+@endslot
+@endisset
+@endcomponent
\ No newline at end of file