|
|
class ModalComponent { |
|
|
static showLogin() { |
|
|
const modalHTML = ` |
|
|
<div class="modal-overlay active" id="loginModal"> |
|
|
<div class="modal-content"> |
|
|
<button class="modal-close" onclick="ModalComponent.closeCurrentModal()">×</button> |
|
|
<div class="modal-header"> |
|
|
<h3>🔐 ورود به سیستم</h3> |
|
|
</div> |
|
|
<div class="modal-body"> |
|
|
<form id="modalLoginForm"> |
|
|
<div class="form-group"> |
|
|
<label for="modalUsername">نام کاربری</label> |
|
|
<input type="text" id="modalUsername" name="username" required> |
|
|
</div> |
|
|
<div class="form-group"> |
|
|
<label for="modalPassword">رمز عبور</label> |
|
|
<input type="password" id="modalPassword" name="password" required> |
|
|
</div> |
|
|
<button type="submit" class="btn btn-primary btn-block">ورود</button> |
|
|
</form> |
|
|
|
|
|
<div class="auth-links"> |
|
|
<p>حساب کاربری ندارید؟ <a href="register.html">ثبت نام کنید</a></p> |
|
|
</div> |
|
|
|
|
|
<div class="demo-accounts"> |
|
|
<h4>حسابهای آزمایشی:</h4> |
|
|
<div class="demo-account"> |
|
|
<strong>student</strong> / <strong>password123</strong> |
|
|
</div> |
|
|
<div class="demo-account"> |
|
|
<strong>admin</strong> / <strong>admin123</strong> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
`; |
|
|
|
|
|
this.showCustomModal('login-modal', modalHTML); |
|
|
this.setupLoginForm(); |
|
|
} |
|
|
|
|
|
static showRegister() { |
|
|
const modalHTML = ` |
|
|
<div class="modal-overlay active" id="registerModal"> |
|
|
<div class="modal-content"> |
|
|
<button class="modal-close" onclick="ModalComponent.closeCurrentModal()">×</button> |
|
|
<div class="modal-header"> |
|
|
<h3>📝 ثبت نام</h3> |
|
|
</div> |
|
|
<div class="modal-body"> |
|
|
<form id="modalRegisterForm"> |
|
|
<div class="form-row"> |
|
|
<div class="form-group"> |
|
|
<label for="modalFirstName">نام</label> |
|
|
<input type="text" id="modalFirstName" name="firstName"> |
|
|
</div> |
|
|
<div class="form-group"> |
|
|
<label for="modalLastName">نام خانوادگی</label> |
|
|
<input type="text" id="modalLastName" name="lastName"> |
|
|
</div> |
|
|
</div> |
|
|
<div class="form-group"> |
|
|
<label for="modalRegUsername">نام کاربری *</label> |
|
|
<input type="text" id="modalRegUsername" name="username" required> |
|
|
</div> |
|
|
<div class="form-group"> |
|
|
<label for="modalRegEmail">ایمیل *</label> |
|
|
<input type="email" id="modalRegEmail" name="email" required> |
|
|
</div> |
|
|
<div class="form-group"> |
|
|
<label for="modalRegPassword">رمز عبور *</label> |
|
|
<input type="password" id="modalRegPassword" name="password" required> |
|
|
</div> |
|
|
<div class="form-group"> |
|
|
<label for="modalRegConfirmPassword">تکرار رمز عبور *</label> |
|
|
<input type="password" id="modalRegConfirmPassword" name="confirmPassword" required> |
|
|
</div> |
|
|
<button type="submit" class="btn btn-primary btn-block">ثبت نام</button> |
|
|
</form> |
|
|
|
|
|
<div class="auth-links"> |
|
|
<p>قبلاً ثبت نام کردهاید؟ <a href="login.html">وارد شوید</a></p> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
`; |
|
|
|
|
|
this.showCustomModal('register-modal', modalHTML); |
|
|
this.setupRegisterForm(); |
|
|
} |
|
|
|
|
|
static showCustomModal(modalId, contentHTML) { |
|
|
|
|
|
this.closeCurrentModal(); |
|
|
|
|
|
const modalContainer = document.getElementById('modalContainer'); |
|
|
if (!modalContainer) return; |
|
|
|
|
|
const modalElement = document.createElement('div'); |
|
|
modalElement.id = modalId; |
|
|
modalElement.innerHTML = contentHTML; |
|
|
modalContainer.appendChild(modalElement); |
|
|
|
|
|
|
|
|
const overlay = modalElement.querySelector('.modal-overlay'); |
|
|
if (overlay) { |
|
|
overlay.addEventListener('click', (e) => { |
|
|
if (e.target === overlay) { |
|
|
this.closeCurrentModal(); |
|
|
} |
|
|
}); |
|
|
} |
|
|
|
|
|
|
|
|
const escapeHandler = (e) => { |
|
|
if (e.key === 'Escape') { |
|
|
this.closeCurrentModal(); |
|
|
document.removeEventListener('keydown', escapeHandler); |
|
|
} |
|
|
}; |
|
|
document.addEventListener('keydown', escapeHandler); |
|
|
|
|
|
|
|
|
modalElement._escapeHandler = escapeHandler; |
|
|
} |
|
|
|
|
|
static closeCurrentModal() { |
|
|
const modalContainer = document.getElementById('modalContainer'); |
|
|
if (!modalContainer) return; |
|
|
|
|
|
|
|
|
while (modalContainer.firstChild) { |
|
|
const modal = modalContainer.firstChild; |
|
|
if (modal._escapeHandler) { |
|
|
document.removeEventListener('keydown', modal._escapeHandler); |
|
|
} |
|
|
modalContainer.removeChild(modal); |
|
|
} |
|
|
} |
|
|
|
|
|
static setupLoginForm() { |
|
|
const loginForm = document.getElementById('modalLoginForm'); |
|
|
if (!loginForm) return; |
|
|
|
|
|
loginForm.addEventListener('submit', async (e) => { |
|
|
e.preventDefault(); |
|
|
|
|
|
const formData = new FormData(loginForm); |
|
|
const data = { |
|
|
username: formData.get('username').trim(), |
|
|
password: formData.get('password') |
|
|
}; |
|
|
|
|
|
|
|
|
const validation = ValidationMiddleware.validateLoginData(data); |
|
|
if (!validation.isValid) { |
|
|
Utils.showNotification(validation.errors.join(' • '), 'error'); |
|
|
return; |
|
|
} |
|
|
|
|
|
const submitBtn = loginForm.querySelector('button[type="submit"]'); |
|
|
const originalText = submitBtn.textContent; |
|
|
submitBtn.disabled = true; |
|
|
submitBtn.textContent = '⏳ در حال ورود...'; |
|
|
|
|
|
try { |
|
|
const result = authManager.loginUser(data.username, data.password); |
|
|
|
|
|
if (result.success) { |
|
|
authManager.setToken(result.token); |
|
|
authManager.setCurrentUser(result.user); |
|
|
|
|
|
Utils.showNotification('ورود موفقیتآمیز!', 'success'); |
|
|
this.closeCurrentModal(); |
|
|
|
|
|
|
|
|
document.dispatchEvent(new CustomEvent('authStateChanged')); |
|
|
|
|
|
} else { |
|
|
Utils.showNotification(result.message, 'error'); |
|
|
} |
|
|
} catch (error) { |
|
|
console.error('Login error:', error); |
|
|
Utils.showNotification('خطا در ورود به سیستم', 'error'); |
|
|
} finally { |
|
|
submitBtn.disabled = false; |
|
|
submitBtn.textContent = originalText; |
|
|
} |
|
|
}); |
|
|
} |
|
|
|
|
|
static setupRegisterForm() { |
|
|
const registerForm = document.getElementById('modalRegisterForm'); |
|
|
if (!registerForm) return; |
|
|
|
|
|
registerForm.addEventListener('submit', async (e) => { |
|
|
e.preventDefault(); |
|
|
|
|
|
const formData = new FormData(registerForm); |
|
|
const data = { |
|
|
firstName: formData.get('firstName')?.trim(), |
|
|
lastName: formData.get('lastName')?.trim(), |
|
|
username: formData.get('username').trim(), |
|
|
email: formData.get('email').trim(), |
|
|
password: formData.get('password'), |
|
|
confirmPassword: formData.get('confirmPassword') |
|
|
}; |
|
|
|
|
|
|
|
|
const validation = ValidationMiddleware.validateRegisterData(data); |
|
|
if (!validation.isValid) { |
|
|
Utils.showNotification(validation.errors.join(' • '), 'error'); |
|
|
return; |
|
|
} |
|
|
|
|
|
const submitBtn = registerForm.querySelector('button[type="submit"]'); |
|
|
const originalText = submitBtn.textContent; |
|
|
submitBtn.disabled = true; |
|
|
submitBtn.textContent = '⏳ در حال ثبت نام...'; |
|
|
|
|
|
try { |
|
|
const profile = { |
|
|
fullName: `${data.firstName || ''} ${data.lastName || ''}`.trim() |
|
|
}; |
|
|
|
|
|
const result = authManager.registerUser( |
|
|
data.username, |
|
|
data.email, |
|
|
data.password, |
|
|
'student', |
|
|
profile |
|
|
); |
|
|
|
|
|
if (result.success) { |
|
|
Utils.showNotification('حساب کاربری با موفقیت ایجاد شد!', 'success'); |
|
|
this.closeCurrentModal(); |
|
|
|
|
|
|
|
|
setTimeout(() => { |
|
|
this.showLogin(); |
|
|
}, 1500); |
|
|
|
|
|
} else { |
|
|
Utils.showNotification(result.message, 'error'); |
|
|
} |
|
|
} catch (error) { |
|
|
console.error('Registration error:', error); |
|
|
Utils.showNotification('خطا در ایجاد حساب کاربری', 'error'); |
|
|
} finally { |
|
|
submitBtn.disabled = false; |
|
|
submitBtn.textContent = originalText; |
|
|
} |
|
|
}); |
|
|
} |
|
|
|
|
|
static showMessage(title, message, type = 'info') { |
|
|
const modalHTML = ` |
|
|
<div class="modal-overlay active"> |
|
|
<div class="modal-content"> |
|
|
<button class="modal-close" onclick="ModalComponent.closeCurrentModal()">×</button> |
|
|
<div class="modal-header"> |
|
|
<h3>${title}</h3> |
|
|
</div> |
|
|
<div class="modal-body"> |
|
|
<div class="message-content ${type}"> |
|
|
<p>${message}</p> |
|
|
</div> |
|
|
<button class="btn btn-primary btn-block" onclick="ModalComponent.closeCurrentModal()"> |
|
|
متوجه شدم |
|
|
</button> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
`; |
|
|
|
|
|
this.showCustomModal('message-modal', modalHTML); |
|
|
} |
|
|
|
|
|
static showError(message) { |
|
|
this.showMessage('❌ خطا', message, 'error'); |
|
|
} |
|
|
|
|
|
static showSuccess(message) { |
|
|
this.showMessage('✅ موفقیت', message, 'success'); |
|
|
} |
|
|
} |