$request->user()]); } public function send(string $locale, Request $request, CustomerEmailChangeService $emailChange): RedirectResponse { $user = $request->user(); $request->merge(['email' => Str::lower(trim((string) $request->input('email')))]); $validated = $request->validate([ 'email' => [ 'required', 'email', 'max:255', Rule::notIn([$user->email]), ], ], [ 'email.not_in' => __('storefront.account.email_same'), ]); try { $emailChange->request($user, $validated['email']); } catch (EmailAlreadyTakenException) { return back()->withInput()->withErrors(['email' => __('storefront.account.email_taken')]); } catch (OtpThrottledException) { return back()->withInput()->withErrors(['email' => __('storefront.auth.too_many_codes')]); } $request->session()->put(self::SESSION_KEY, $validated['email']); return redirect()->route('account.email.code'); } public function code(string $locale, Request $request): View|RedirectResponse { $pendingEmail = $request->session()->get(self::SESSION_KEY); if (! $pendingEmail) { return redirect()->route('account.email.edit'); } return view('account.email-code', ['email' => $pendingEmail]); } public function resend(string $locale, Request $request, CustomerEmailChangeService $emailChange): RedirectResponse { $pendingEmail = $request->session()->get(self::SESSION_KEY); if (! $pendingEmail) { return redirect()->route('account.email.edit'); } try { $emailChange->request($request->user(), $pendingEmail); } catch (EmailAlreadyTakenException) { $request->session()->forget(self::SESSION_KEY); return redirect()->route('account.email.edit') ->withErrors(['email' => __('storefront.account.email_taken')]); } catch (OtpThrottledException) { return back()->withErrors(['code' => __('storefront.auth.too_many_codes')]); } return back()->with('status', __('storefront.auth.code_resent')); } public function verify(string $locale, Request $request, CustomerEmailChangeService $emailChange): RedirectResponse { $pendingEmail = $request->session()->get(self::SESSION_KEY); if (! $pendingEmail) { return redirect()->route('account.email.edit'); } $validated = $request->validate(['code' => ['required', 'digits:6']]); try { $emailChange->confirm($request->user(), $validated['code']); } catch (EmailAlreadyTakenException) { $request->session()->forget(self::SESSION_KEY); return redirect()->route('account.email.edit') ->withErrors(['email' => __('storefront.account.email_taken')]); } catch (InvalidEmailChangeCodeException) { return back()->withErrors(['code' => __('storefront.auth.invalid_code')]); } $request->session()->forget(self::SESSION_KEY); return redirect()->route('account')->with('status', __('storefront.account.email_changed')); } }