Mhdeusi commited on
Commit
a9b4899
·
verified ·
1 Parent(s): b8d248e

Create modal.js

Browse files
Files changed (1) hide show
  1. js/component/modal.js +290 -0
js/component/modal.js ADDED
@@ -0,0 +1,290 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ class ModalComponent {
2
+ static showLogin() {
3
+ const modalHTML = `
4
+ <div class="modal-overlay active" id="loginModal">
5
+ <div class="modal-content">
6
+ <button class="modal-close" onclick="ModalComponent.closeCurrentModal()">&times;</button>
7
+ <div class="modal-header">
8
+ <h3>🔐 ورود به سیستم</h3>
9
+ </div>
10
+ <div class="modal-body">
11
+ <form id="modalLoginForm">
12
+ <div class="form-group">
13
+ <label for="modalUsername">نام کاربری</label>
14
+ <input type="text" id="modalUsername" name="username" required>
15
+ </div>
16
+ <div class="form-group">
17
+ <label for="modalPassword">رمز عبور</label>
18
+ <input type="password" id="modalPassword" name="password" required>
19
+ </div>
20
+ <button type="submit" class="btn btn-primary btn-block">ورود</button>
21
+ </form>
22
+
23
+ <div class="auth-links">
24
+ <p>حساب کاربری ندارید؟ <a href="register.html">ثبت نام کنید</a></p>
25
+ </div>
26
+
27
+ <div class="demo-accounts">
28
+ <h4>حساب‌های آزمایشی:</h4>
29
+ <div class="demo-account">
30
+ <strong>student</strong> / <strong>password123</strong>
31
+ </div>
32
+ <div class="demo-account">
33
+ <strong>admin</strong> / <strong>admin123</strong>
34
+ </div>
35
+ </div>
36
+ </div>
37
+ </div>
38
+ </div>
39
+ `;
40
+
41
+ this.showCustomModal('login-modal', modalHTML);
42
+ this.setupLoginForm();
43
+ }
44
+
45
+ static showRegister() {
46
+ const modalHTML = `
47
+ <div class="modal-overlay active" id="registerModal">
48
+ <div class="modal-content">
49
+ <button class="modal-close" onclick="ModalComponent.closeCurrentModal()">&times;</button>
50
+ <div class="modal-header">
51
+ <h3>📝 ثبت نام</h3>
52
+ </div>
53
+ <div class="modal-body">
54
+ <form id="modalRegisterForm">
55
+ <div class="form-row">
56
+ <div class="form-group">
57
+ <label for="modalFirstName">نام</label>
58
+ <input type="text" id="modalFirstName" name="firstName">
59
+ </div>
60
+ <div class="form-group">
61
+ <label for="modalLastName">نام خانوادگی</label>
62
+ <input type="text" id="modalLastName" name="lastName">
63
+ </div>
64
+ </div>
65
+ <div class="form-group">
66
+ <label for="modalRegUsername">نام کاربری *</label>
67
+ <input type="text" id="modalRegUsername" name="username" required>
68
+ </div>
69
+ <div class="form-group">
70
+ <label for="modalRegEmail">ایمیل *</label>
71
+ <input type="email" id="modalRegEmail" name="email" required>
72
+ </div>
73
+ <div class="form-group">
74
+ <label for="modalRegPassword">رمز عبور *</label>
75
+ <input type="password" id="modalRegPassword" name="password" required>
76
+ </div>
77
+ <div class="form-group">
78
+ <label for="modalRegConfirmPassword">تکرار رمز عبور *</label>
79
+ <input type="password" id="modalRegConfirmPassword" name="confirmPassword" required>
80
+ </div>
81
+ <button type="submit" class="btn btn-primary btn-block">ثبت نام</button>
82
+ </form>
83
+
84
+ <div class="auth-links">
85
+ <p>قبلاً ثبت نام کرده‌اید؟ <a href="login.html">وارد شوید</a></p>
86
+ </div>
87
+ </div>
88
+ </div>
89
+ </div>
90
+ `;
91
+
92
+ this.showCustomModal('register-modal', modalHTML);
93
+ this.setupRegisterForm();
94
+ }
95
+
96
+ static showCustomModal(modalId, contentHTML) {
97
+ // بستن مودال قبلی
98
+ this.closeCurrentModal();
99
+
100
+ const modalContainer = document.getElementById('modalContainer');
101
+ if (!modalContainer) return;
102
+
103
+ const modalElement = document.createElement('div');
104
+ modalElement.id = modalId;
105
+ modalElement.innerHTML = contentHTML;
106
+ modalContainer.appendChild(modalElement);
107
+
108
+ // بستن مودال با کلیک روی overlay
109
+ const overlay = modalElement.querySelector('.modal-overlay');
110
+ if (overlay) {
111
+ overlay.addEventListener('click', (e) => {
112
+ if (e.target === overlay) {
113
+ this.closeCurrentModal();
114
+ }
115
+ });
116
+ }
117
+
118
+ // بستن مودال با کلید Escape
119
+ const escapeHandler = (e) => {
120
+ if (e.key === 'Escape') {
121
+ this.closeCurrentModal();
122
+ document.removeEventListener('keydown', escapeHandler);
123
+ }
124
+ };
125
+ document.addEventListener('keydown', escapeHandler);
126
+
127
+ // ذخیره handler برای حذف بعدی
128
+ modalElement._escapeHandler = escapeHandler;
129
+ }
130
+
131
+ static closeCurrentModal() {
132
+ const modalContainer = document.getElementById('modalContainer');
133
+ if (!modalContainer) return;
134
+
135
+ // حذف همه مودال‌ها
136
+ while (modalContainer.firstChild) {
137
+ const modal = modalContainer.firstChild;
138
+ if (modal._escapeHandler) {
139
+ document.removeEventListener('keydown', modal._escapeHandler);
140
+ }
141
+ modalContainer.removeChild(modal);
142
+ }
143
+ }
144
+
145
+ static setupLoginForm() {
146
+ const loginForm = document.getElementById('modalLoginForm');
147
+ if (!loginForm) return;
148
+
149
+ loginForm.addEventListener('submit', async (e) => {
150
+ e.preventDefault();
151
+
152
+ const formData = new FormData(loginForm);
153
+ const data = {
154
+ username: formData.get('username').trim(),
155
+ password: formData.get('password')
156
+ };
157
+
158
+ // اعتبارسنجی
159
+ const validation = ValidationMiddleware.validateLoginData(data);
160
+ if (!validation.isValid) {
161
+ Utils.showNotification(validation.errors.join(' • '), 'error');
162
+ return;
163
+ }
164
+
165
+ const submitBtn = loginForm.querySelector('button[type="submit"]');
166
+ const originalText = submitBtn.textContent;
167
+ submitBtn.disabled = true;
168
+ submitBtn.textContent = '⏳ در حال ورود...';
169
+
170
+ try {
171
+ const result = authManager.loginUser(data.username, data.password);
172
+
173
+ if (result.success) {
174
+ authManager.setToken(result.token);
175
+ authManager.setCurrentUser(result.user);
176
+
177
+ Utils.showNotification('ورود موفقیت‌آمیز!', 'success');
178
+ this.closeCurrentModal();
179
+
180
+ // ارسال event برای به‌روزرسانی UI
181
+ document.dispatchEvent(new CustomEvent('authStateChanged'));
182
+
183
+ } else {
184
+ Utils.showNotification(result.message, 'error');
185
+ }
186
+ } catch (error) {
187
+ console.error('Login error:', error);
188
+ Utils.showNotification('خطا در ورود به سیستم', 'error');
189
+ } finally {
190
+ submitBtn.disabled = false;
191
+ submitBtn.textContent = originalText;
192
+ }
193
+ });
194
+ }
195
+
196
+ static setupRegisterForm() {
197
+ const registerForm = document.getElementById('modalRegisterForm');
198
+ if (!registerForm) return;
199
+
200
+ registerForm.addEventListener('submit', async (e) => {
201
+ e.preventDefault();
202
+
203
+ const formData = new FormData(registerForm);
204
+ const data = {
205
+ firstName: formData.get('firstName')?.trim(),
206
+ lastName: formData.get('lastName')?.trim(),
207
+ username: formData.get('username').trim(),
208
+ email: formData.get('email').trim(),
209
+ password: formData.get('password'),
210
+ confirmPassword: formData.get('confirmPassword')
211
+ };
212
+
213
+ // اعتبارسنجی
214
+ const validation = ValidationMiddleware.validateRegisterData(data);
215
+ if (!validation.isValid) {
216
+ Utils.showNotification(validation.errors.join(' • '), 'error');
217
+ return;
218
+ }
219
+
220
+ const submitBtn = registerForm.querySelector('button[type="submit"]');
221
+ const originalText = submitBtn.textContent;
222
+ submitBtn.disabled = true;
223
+ submitBtn.textContent = '⏳ در حال ثبت نام...';
224
+
225
+ try {
226
+ const profile = {
227
+ fullName: `${data.firstName || ''} ${data.lastName || ''}`.trim()
228
+ };
229
+
230
+ const result = authManager.registerUser(
231
+ data.username,
232
+ data.email,
233
+ data.password,
234
+ 'student',
235
+ profile
236
+ );
237
+
238
+ if (result.success) {
239
+ Utils.showNotification('حساب کاربری با موفقیت ایجاد شد!', 'success');
240
+ this.closeCurrentModal();
241
+
242
+ // نمایش فرم ورود
243
+ setTimeout(() => {
244
+ this.showLogin();
245
+ }, 1500);
246
+
247
+ } else {
248
+ Utils.showNotification(result.message, 'error');
249
+ }
250
+ } catch (error) {
251
+ console.error('Registration error:', error);
252
+ Utils.showNotification('خطا در ایجاد حساب کاربری', 'error');
253
+ } finally {
254
+ submitBtn.disabled = false;
255
+ submitBtn.textContent = originalText;
256
+ }
257
+ });
258
+ }
259
+
260
+ static showMessage(title, message, type = 'info') {
261
+ const modalHTML = `
262
+ <div class="modal-overlay active">
263
+ <div class="modal-content">
264
+ <button class="modal-close" onclick="ModalComponent.closeCurrentModal()">&times;</button>
265
+ <div class="modal-header">
266
+ <h3>${title}</h3>
267
+ </div>
268
+ <div class="modal-body">
269
+ <div class="message-content ${type}">
270
+ <p>${message}</p>
271
+ </div>
272
+ <button class="btn btn-primary btn-block" onclick="ModalComponent.closeCurrentModal()">
273
+ متوجه شدم
274
+ </button>
275
+ </div>
276
+ </div>
277
+ </div>
278
+ `;
279
+
280
+ this.showCustomModal('message-modal', modalHTML);
281
+ }
282
+
283
+ static showError(message) {
284
+ this.showMessage('❌ خطا', message, 'error');
285
+ }
286
+
287
+ static showSuccess(message) {
288
+ this.showMessage('✅ موفقیت', message, 'success');
289
+ }
290
+ }