ECOMMERCE/resources/views/account/signin.blade.php

155 lines
7.4 KiB
PHP

@extends('layouts.landing', ['title' => 'Account - Sign In'])
@section('content')
<main class="content-wrapper w-100 px-3 ps-lg-5 pe-lg-4 mx-auto" style="max-width: 1920px">
<div class="d-lg-flex">
<!-- Login form + Footer -->
<div class="d-flex flex-column min-vh-100 w-100 py-4 mx-auto me-lg-5" style="max-width: 416px">
<!-- Logo -->
<header class="navbar px-0 pb-4 mt-n2 mt-sm-0 mb-2 mb-md-3 mb-lg-4">
<a class="navbar-brand pt-0" href="/">
<span class="d-flex flex-shrink-0 text-primary me-2">
<img src="{{ asset('logo/logo-colored.png') }}" alt="AsiaGolf Logo" style="height: 36px; width: auto;">
</span>
AsiaGolf
</a>
</header>
<h1 class="h2 mt-auto">{{ __('signin.title') }}</h1>
<div class="nav fs-sm mb-4">
{{ __('signin.no_account') }}
<a class="nav-link text-decoration-underline p-0 ms-2"
href="{{ route('register') }}">{{ __('signin.create_account') }}</a>
</div>
{{-- show error message --}}
<div id="error-message" class="alert alert-danger d-none"></div>
<!-- Form -->
<form class="needs-validation" id="loginForm" novalidate="">
<div class="position-relative mb-4">
<input class="form-control form-control-lg" placeholder="{{ $type == 'email' ? __('signin.email_placeholder') : __('signin.phone_placeholder') }}" required="" name="identity" id="identity" min="1" type="{{ $type == 'email' ? 'email' :'number' }}" />
<div class="invalid-tooltip bg-transparent py-0">{{ $type == 'email' ? __('signin.email_invalid') : __('signin.phone_invalid') }}</div>
</div>
<div class="d-flex align-items-center justify-content-end mb-4">
{{-- <div class="form-check me-2">
<input class="form-check-input" id="remember-30" type="checkbox" />
<label class="form-check-label" for="remember-30">{{ __('signin.remember_for_30_days') }}</label>
</div> --}}
<div class="nav">
<a class="nav-link animate-underline p-0"
href="{{ $type == 'email' ? route('login') : route('login-email') }}">
<span class="animate-target">{{ $type == 'email' ? __('signin.login_with_phone') : __('signin.login_with_email') }}</span>
</a>
</div>
</div>
<button class="btn btn-lg btn-primary w-100" type="submit">{{ __('signin.sign_in') }}</button>
</form>
<x-social-login />
<!-- Footer -->
<footer class="mt-auto">
<div class="nav mb-4">
<a class="nav-link text-decoration-underline p-0"
href="{{ route('second', ['help', 'topics-v1']) }}">{{ __('signin.need_help') }}</a>
</div>
<p class="fs-xs mb-0">
{!! __('signin.rights_reserved', ['company' => config('app.name')]) !!}
</p>
</footer>
</div>
<!-- Cover image visible on screens > 992px wide (lg breakpoint) -->
<div class="d-none d-lg-block w-100 py-4 ms-auto" style="max-width: 1034px">
<div class="d-flex flex-column justify-content-end h-100 rounded-5 overflow-hidden">
<span class="position-absolute top-0 start-0 w-100 h-100 d-none-dark"
style="background: linear-gradient(-90deg, #accbee 0%, #e7f0fd 100%)"></span>
<span class="position-absolute top-0 start-0 w-100 h-100 d-none d-block-dark"
style="background: linear-gradient(-90deg, #1b273a 0%, #1f2632 100%)"></span>
<div class="ratio position-relative z-2" style="--cz-aspect-ratio: calc(1030 / 1032 * 100%)">
<img alt="Girl" src="/img/account/cover.png" />
</div>
</div>
</div>
</div>
</main>
@endsection
@section('scripts')
<script>
document.addEventListener('DOMContentLoaded', function() {
const loginForm = document.getElementById('loginForm');
const submitBtn = loginForm.querySelector('button[type="submit"]');
const identityInput = document.getElementById('identity');
// Hide error message when user starts typing
identityInput.addEventListener('input', function() {
const errorDiv = document.getElementById('error-message');
errorDiv.classList.add('d-none');
});
loginForm.addEventListener('submit', function(e) {
e.preventDefault();
// Hide error message when submitting
const errorDiv = document.getElementById('error-message');
errorDiv.classList.add('d-none');
// Reset validation
loginForm.classList.remove('was-validated');
// Basic validation
if (!identityInput.value.trim()) {
loginForm.classList.add('was-validated');
return;
}
// Show loading state
submitBtn.disabled = true;
submitBtn.innerHTML = '<span class="spinner-border spinner-border-sm me-2"></span>{{ __("signin.sending") }}';
// Determine form type based on current route
const isPhoneLogin = '{{ $type }}' === 'phone';
if (isPhoneLogin) {
// Send OTP request for phone login
fetch('{{ route("login-phone.otp") }}', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').getAttribute('content')
},
body: JSON.stringify({
identity: identityInput.value.trim()
})
})
.then(response => response.json())
.then(data => {
if (data.success) {
// Redirect to OTP verification page
window.location.href = data.redirect;
} else {
// Show error in error message div
const errorDiv = document.getElementById('error-message');
errorDiv.textContent = data.message || '{{ __("signin.error") }}';
errorDiv.classList.remove('d-none');
}
})
.catch(error => {
console.error('Error:', error);
const errorDiv = document.getElementById('error-message');
errorDiv.textContent = '{{ __("signin.error") }}';
errorDiv.classList.remove('d-none');
})
.finally(() => {
// Reset button state
submitBtn.disabled = false;
submitBtn.textContent = '{{ __("signin.sign_in") }}';
});
} else {
// Handle email login (traditional form submission)
loginForm.submit();
}
});
});
</script>
@endsection