hashim1 commited on
Commit
5e07f18
·
verified ·
1 Parent(s): 14a711a

Upload 18 files

Browse files
instance/users.db ADDED
Binary file (45.1 kB). View file
 
static/css/style.css ADDED
@@ -0,0 +1,278 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ :root {
2
+ --primary-color: #4CAF50;
3
+ --error-color: #f44336;
4
+ --success-color: #4CAF50;
5
+ --text-color: #333;
6
+ --background-color: #f5f5f5;
7
+ }
8
+
9
+ * {
10
+ margin: 0;
11
+ padding: 0;
12
+ box-sizing: border-box;
13
+ font-family: 'Arial', sans-serif;
14
+ }
15
+
16
+ body {
17
+ background-color: var(--background-color);
18
+ color: var(--text-color);
19
+ line-height: 1.6;
20
+ }
21
+
22
+ .container {
23
+ max-width: 1200px;
24
+ margin: 0 auto;
25
+ /* padding: 20px; */
26
+ }
27
+
28
+ .auth-container {
29
+ max-width: 500px;
30
+ margin: 40px auto;
31
+ padding: 30px;
32
+ background: #fff;
33
+ border-radius: 8px;
34
+ box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
35
+ }
36
+
37
+ h2 {
38
+ text-align: center;
39
+ color: var(--text-color);
40
+ margin-bottom: 30px;
41
+ }
42
+
43
+ .form-group {
44
+ margin-bottom: 20px;
45
+ }
46
+
47
+ label {
48
+ display: block;
49
+ margin-bottom: 8px;
50
+ font-weight: bold;
51
+ }
52
+
53
+ input[type="text"],
54
+ input[type="email"],
55
+ input[type="password"],
56
+ select {
57
+ width: 100%;
58
+ padding: 12px;
59
+ border: 1px solid #ddd;
60
+ border-radius: 4px;
61
+ font-size: 16px;
62
+ }
63
+
64
+ input:focus,
65
+ select:focus {
66
+ outline: none;
67
+ border-color: var(--primary-color);
68
+ box-shadow: 0 0 5px rgba(76, 175, 80, 0.2);
69
+ }
70
+
71
+ .submit-btn {
72
+ width: 100%;
73
+ padding: 12px;
74
+ background-color: var(--primary-color);
75
+ color: white;
76
+ border: none;
77
+ border-radius: 4px;
78
+ font-size: 16px;
79
+ cursor: pointer;
80
+ transition: background-color 0.3s;
81
+ }
82
+
83
+ .submit-btn:hover {
84
+ background-color: #45a049;
85
+ }
86
+
87
+ .auth-links {
88
+ text-align: center;
89
+ margin-top: 20px;
90
+ }
91
+
92
+ .auth-links a {
93
+ color: var(--primary-color);
94
+ text-decoration: none;
95
+ }
96
+
97
+ .auth-links a:hover {
98
+ text-decoration: underline;
99
+ }
100
+
101
+ .alert {
102
+ padding: 15px;
103
+ margin-bottom: 20px;
104
+ border-radius: 4px;
105
+ text-align: center;
106
+ }
107
+
108
+ .alert-error {
109
+ background-color: #ffebee;
110
+ color: var(--error-color);
111
+ border: 1px solid #ffcdd2;
112
+ }
113
+
114
+ .alert-success {
115
+ background-color: #e8f5e9;
116
+ color: var(--success-color);
117
+ border: 1px solid #c8e6c9;
118
+ }
119
+
120
+ .skill-input {
121
+ display: flex;
122
+ gap: 10px;
123
+ margin-bottom: 10px;
124
+ }
125
+
126
+ .skill-input input {
127
+ flex: 1;
128
+ }
129
+
130
+ .add-skill,
131
+ .remove-skill {
132
+ padding: 0 15px;
133
+ background-color: var(--primary-color);
134
+ color: white;
135
+ border: none;
136
+ border-radius: 4px;
137
+ cursor: pointer;
138
+ font-size: 18px;
139
+ }
140
+
141
+ .remove-skill {
142
+ background-color: var(--error-color);
143
+ }
144
+
145
+ #email-validation-message,
146
+ #password-match-message {
147
+ display: block;
148
+ margin-top: 5px;
149
+ font-size: 14px;
150
+ }
151
+
152
+ .error {
153
+ color: var(--error-color);
154
+ }
155
+
156
+ .success {
157
+ color: var(--success-color);
158
+ }
159
+
160
+ /* Password strength meter */
161
+ .strength-meter {
162
+ margin-top: 5px;
163
+ padding: 5px;
164
+ border-radius: 4px;
165
+ font-size: 14px;
166
+ text-align: center;
167
+ }
168
+
169
+ .weak {
170
+ background-color: #ffebee;
171
+ color: #d32f2f;
172
+ }
173
+
174
+ .medium {
175
+ background-color: #fff3e0;
176
+ color: #f57c00;
177
+ }
178
+
179
+ .strong {
180
+ background-color: #e8f5e9;
181
+ color: #388e3c;
182
+ }
183
+
184
+ .form-text {
185
+ display: block;
186
+ margin-top: 5px;
187
+ color: #666;
188
+ font-size: 14px;
189
+ }
190
+
191
+ /* RTL specific styles */
192
+ body {
193
+ direction: rtl;
194
+ }
195
+
196
+ .skill-input {
197
+ flex-direction: row-reverse;
198
+ }
199
+
200
+ .auth-container {
201
+ text-align: right;
202
+ }
203
+
204
+ /* Dashboard styles */
205
+ .dashboard-container {
206
+ max-width: 800px;
207
+ margin: 40px auto;
208
+ padding: 30px;
209
+ background: #fff;
210
+ border-radius: 8px;
211
+ box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
212
+ }
213
+
214
+ .user-info {
215
+ margin: 30px 0;
216
+ }
217
+
218
+ .info-card {
219
+ background: #f8f9fa;
220
+ padding: 20px;
221
+ border-radius: 8px;
222
+ margin-top: 15px;
223
+ }
224
+
225
+ .info-card p {
226
+ margin: 10px 0;
227
+ }
228
+
229
+ .skills-list {
230
+ list-style: none;
231
+ padding: 0;
232
+ margin: 10px 0;
233
+ display: flex;
234
+ flex-wrap: wrap;
235
+ gap: 10px;
236
+ }
237
+
238
+ .skills-list li {
239
+ background: var(--primary-color);
240
+ color: white;
241
+ padding: 5px 15px;
242
+ border-radius: 20px;
243
+ font-size: 14px;
244
+ }
245
+
246
+ .logout-btn {
247
+ display: inline-block;
248
+ padding: 10px 20px;
249
+ background-color: #dc3545;
250
+ color: white;
251
+ text-decoration: none;
252
+ border-radius: 4px;
253
+ transition: background-color 0.3s;
254
+ }
255
+
256
+ .logout-btn:hover {
257
+ background-color: #c82333;
258
+ }
259
+
260
+ .dashboard-container h2 {
261
+ color: var(--primary-color);
262
+ border-bottom: 2px solid #eee;
263
+ padding-bottom: 10px;
264
+ }
265
+
266
+ .dashboard-container h3 {
267
+ color: var(--text-color);
268
+ margin: 20px 0 10px;
269
+ }
270
+
271
+ .actions {
272
+ margin-top: 30px;
273
+ text-align: center;
274
+ }
275
+
276
+
277
+
278
+
static/js/main.js ADDED
@@ -0,0 +1,149 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Email validation function
2
+ function validateEmail(email) {
3
+ const re = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
4
+ return re.test(email);
5
+ }
6
+
7
+ // Password strength validation
8
+ function checkPasswordStrength(password) {
9
+ let strength = 0;
10
+
11
+ // Length check
12
+ if (password.length >= 8) strength += 1;
13
+
14
+ // Contains number
15
+ if (/\d/.test(password)) strength += 1;
16
+
17
+ // Contains lowercase
18
+ if (/[a-z]/.test(password)) strength += 1;
19
+
20
+ // Contains uppercase
21
+ if (/[A-Z]/.test(password)) strength += 1;
22
+
23
+ // Contains special character
24
+ if (/[^A-Za-z0-9]/.test(password)) strength += 1;
25
+
26
+ return {
27
+ score: strength,
28
+ message: getStrengthMessage(strength)
29
+ };
30
+ }
31
+
32
+ function getStrengthMessage(strength) {
33
+ switch(strength) {
34
+ case 0:
35
+ case 1:
36
+ return 'ضعيف جداً';
37
+ case 2:
38
+ return 'ضعيف';
39
+ case 3:
40
+ return 'متوسط';
41
+ case 4:
42
+ return 'قوي';
43
+ case 5:
44
+ return 'قوي جداً';
45
+ default:
46
+ return '';
47
+ }
48
+ }
49
+
50
+ // Initialize all tooltips
51
+ function initTooltips() {
52
+ const tooltips = document.querySelectorAll('[data-tooltip]');
53
+ tooltips.forEach(tooltip => {
54
+ tooltip.addEventListener('mouseover', showTooltip);
55
+ tooltip.addEventListener('mouseout', hideTooltip);
56
+ });
57
+ }
58
+
59
+ function showTooltip(e) {
60
+ const tooltip = document.createElement('div');
61
+ tooltip.className = 'tooltip';
62
+ tooltip.textContent = this.dataset.tooltip;
63
+ document.body.appendChild(tooltip);
64
+
65
+ const rect = this.getBoundingClientRect();
66
+ tooltip.style.top = rect.bottom + 5 + 'px';
67
+ tooltip.style.left = rect.left + (rect.width - tooltip.offsetWidth) / 2 + 'px';
68
+ }
69
+
70
+ function hideTooltip() {
71
+ const tooltips = document.querySelectorAll('.tooltip');
72
+ tooltips.forEach(tooltip => tooltip.remove());
73
+ }
74
+
75
+ // Form validation
76
+ document.addEventListener('DOMContentLoaded', function() {
77
+ const registerForm = document.getElementById('registerForm');
78
+ const loginForm = document.getElementById('loginForm');
79
+
80
+ if (registerForm) {
81
+ registerForm.addEventListener('submit', function(e) {
82
+ const password = document.getElementById('password').value;
83
+ const confirmPassword = document.getElementById('confirm_password').value;
84
+ const email = document.getElementById('email').value;
85
+
86
+ if (!validateEmail(email)) {
87
+ e.preventDefault();
88
+ alert('الرجاء إدخال بريد إلكتروني صحيح');
89
+ return;
90
+ }
91
+
92
+ if (password !== confirmPassword) {
93
+ e.preventDefault();
94
+ alert('كلمات المرور غير متطابقة');
95
+ return;
96
+ }
97
+
98
+ const passwordStrength = checkPasswordStrength(password);
99
+ if (passwordStrength.score < 3) {
100
+ if (!confirm('كلمة المرور ضعيفة. هل تريد المتابعة؟')) {
101
+ e.preventDefault();
102
+ return;
103
+ }
104
+ }
105
+ });
106
+
107
+ // Real-time password strength indicator
108
+ const passwordInput = document.getElementById('password');
109
+ if (passwordInput) {
110
+ const strengthIndicator = document.createElement('div');
111
+ strengthIndicator.className = 'password-strength';
112
+ passwordInput.parentNode.appendChild(strengthIndicator);
113
+
114
+ passwordInput.addEventListener('input', function() {
115
+ const strength = checkPasswordStrength(this.value);
116
+ strengthIndicator.textContent = 'قوة كلمة المرور: ' + strength.message;
117
+ strengthIndicator.className = 'password-strength strength-' + strength.score;
118
+ });
119
+ }
120
+ }
121
+
122
+ // Initialize tooltips
123
+ initTooltips();
124
+ });
125
+
126
+ // Skills management
127
+ document.addEventListener('DOMContentLoaded', function() {
128
+ const skillsContainer = document.getElementById('skills-container');
129
+
130
+ if (skillsContainer) {
131
+ // Add new skill field
132
+ document.querySelector('.add-skill').addEventListener('click', function() {
133
+ const skillInput = document.createElement('div');
134
+ skillInput.className = 'skill-input';
135
+ skillInput.innerHTML = `
136
+ <input type="text" name="skill" class="skill-field">
137
+ <button type="button" class="remove-skill">-</button>
138
+ `;
139
+ skillsContainer.appendChild(skillInput);
140
+ });
141
+
142
+ // Remove skill field
143
+ skillsContainer.addEventListener('click', function(e) {
144
+ if (e.target.classList.contains('remove-skill')) {
145
+ e.target.parentElement.remove();
146
+ }
147
+ });
148
+ }
149
+ });
static/uploads/default-avatar.jpg ADDED
templates/artical.html ADDED
@@ -0,0 +1,635 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="ar">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>مولد مقالات AI</title>
7
+ <style>
8
+ body {
9
+ font-family: 'Cairo', sans-serif;
10
+ margin: 20px;
11
+ padding: 0;
12
+ background-color: #f9f9f9;
13
+ direction: rtl;
14
+ }
15
+
16
+ h1 {
17
+ font-size: 28px;
18
+ color: #333;
19
+ text-align: center;
20
+ margin-bottom: 30px;
21
+ }
22
+
23
+ .container {
24
+ max-width: 800px;
25
+ margin: 0 auto;
26
+ }
27
+
28
+ input[type="text"] {
29
+ width: 100%;
30
+ padding: 12px;
31
+ font-size: 16px;
32
+ border: 1px solid #ccc;
33
+ border-radius: 5px;
34
+ margin-bottom: 15px;
35
+ box-sizing: border-box;
36
+ }
37
+
38
+ .btn {
39
+ width: 100%;
40
+ padding: 12px;
41
+ font-size: 16px;
42
+ background-color: #007bff;
43
+ color: #fff;
44
+ border: none;
45
+ border-radius: 5px;
46
+ cursor: pointer;
47
+ margin-bottom: 30px;
48
+ }
49
+
50
+ .article-box {
51
+ background-color: #fff;
52
+ border: 1px solid #e0e0e0;
53
+ border-radius: 12px;
54
+ padding: 20px;
55
+ margin-bottom: 20px;
56
+ cursor: pointer;
57
+ transition: all 0.3s ease;
58
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); /* ظل خفيف */
59
+ position: relative;
60
+ overflow: hidden;
61
+ }
62
+
63
+
64
+
65
+ .article-title {
66
+ font-size: 20px;
67
+ font-weight: bold;
68
+ color: #333;
69
+ margin: 0 0 10px 0;
70
+ }
71
+
72
+ .article-meta {
73
+ font-size: 14px;
74
+ color: #777;
75
+ margin: 0 0 10px 0;
76
+ }
77
+
78
+ /* النافذة المنبثقة (المودال) */
79
+ .article-content {
80
+ display: none;
81
+ position: fixed;
82
+ top: 100%;
83
+ left: 50%;
84
+ width: 100%;
85
+ max-width: 600px;
86
+ height: 100%;
87
+ transform: translateX(-50%);
88
+ background-color: #fff;
89
+ border: none;
90
+ border-radius: 10px;
91
+ /* padding: 20px; */
92
+ box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
93
+ z-index: 1000;
94
+ overflow-y: auto;
95
+ opacity: 0;
96
+ transition: opacity 0.3s ease-in-out, top 0.3s ease-in-out;
97
+ overflow-x: hidden;
98
+ }
99
+
100
+ .article-content.show {
101
+ top: 50%;
102
+ opacity: 1;
103
+ transform: translate(-50%, -50%);
104
+ }
105
+
106
+ .overlay {
107
+ display: none;
108
+ position: fixed;
109
+ top: 0;
110
+ left: 0;
111
+ width: 100%;
112
+ height: 100%;
113
+ background-color: rgba(0, 0, 0, 0.5);
114
+ z-index: 999;
115
+ opacity: 0;
116
+ transition: opacity 0.3s ease-in-out;
117
+ }
118
+
119
+ .overlay.show {
120
+ opacity: 1;
121
+ }
122
+
123
+ .close-btn {
124
+ position: sticky;
125
+ top: 10px;
126
+ right: 10px;
127
+ font-size: 24px;
128
+ cursor: pointer;
129
+ color: #333;
130
+ background-color: #fff;
131
+ border: 2px solid #ccc;
132
+ border-radius: 50%; /* جعل الزر دائريًا */
133
+ width: 40px;
134
+ height: 40px;
135
+ display: flex;
136
+ align-items: center;
137
+ justify-content: center;
138
+ z-index: 20;
139
+ transition: all 0.3s ease; /* إضافة تأثير سلس */
140
+ box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1); /* إضافة ظل خفيف */
141
+ }
142
+
143
+ .close-btn:hover {
144
+ color: #fff;
145
+ background-color: #ff4d4d; /* لون أحمر عند التمرير */
146
+ border-color: #ff4d4d;
147
+ box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2); /* زيادة الظل عند التمرير */
148
+ }
149
+
150
+ .close-btn:active {
151
+ transform: scale(0.9); /* تصغير الزر قليلاً عند النقر */
152
+ }
153
+
154
+ .close-btn:hover {
155
+ color: #000;
156
+ }
157
+
158
+ .modal-header {
159
+ font-size: 20px;
160
+ font-weight: bold;
161
+ color: #333;
162
+ text-align: center;
163
+ width: 100%;
164
+ white-space: nowrap; /* منع النص من الانتقال إلى سطر جديد */
165
+ overflow: hidden; /* إخفاء النص الذي يتجاوز العرض */
166
+ text-overflow: ellipsis; /* إضافة ... إذا تجاوز النص العرض */
167
+ padding: 0 10px; /* إضافة بعض المساحة الداخلية */
168
+ box-sizing: border-box; /* التأكد من أن الحشو لا يزيد العرض */
169
+ }
170
+
171
+ .article-body {
172
+ font-size: 16px;
173
+ color: #555;
174
+ line-height: 1.6;
175
+ padding: 20px;
176
+ }
177
+
178
+ .modal-footer {
179
+ font-size: 14px;
180
+ color: #777;
181
+ margin-top: 20px;
182
+ text-align: center;
183
+ }
184
+
185
+ .skeleton {
186
+ width: 100%;
187
+ height: 200px;
188
+ background: #f0f0f0;
189
+ animation: pulse 1.5s infinite ease-in-out;
190
+ border-radius: 5px;
191
+ }
192
+
193
+ @keyframes pulse {
194
+ 0% {
195
+ background-color: #f0f0f0;
196
+ }
197
+ 50% {
198
+ background-color: #e0e0e0;
199
+ }
200
+ 100% {
201
+ background-color: #f0f0f0;
202
+ }
203
+ }
204
+
205
+ /* مربع البحث */
206
+ .search-box {
207
+ margin-bottom: 20px;
208
+ }
209
+
210
+ .search-box input {
211
+ width: 100%;
212
+ padding: 10px;
213
+ font-size: 16px;
214
+ border: 1px solid #ccc;
215
+ border-radius: 5px;
216
+ }
217
+
218
+ code{
219
+ color: #fff;
220
+ background-color: #000;
221
+ padding: 5px;
222
+ border-radius: 3px;
223
+ }
224
+
225
+ .modal-footer {
226
+ display: flex;
227
+ justify-content: space-between;
228
+ align-items: center;
229
+ padding: 10px;
230
+ background-color: #f8f9fa;
231
+ border-top: 1px solid #e9ecef;
232
+ font-size: 14px;
233
+ color: #6c757d;
234
+ }
235
+
236
+ .user-info {
237
+ font-weight: bold;
238
+ color: #007bff;
239
+ width: 23%;
240
+ }
241
+
242
+ .date {
243
+ font-style: italic;
244
+ color: #6c757d;
245
+ }
246
+
247
+ .time {
248
+ font-weight: bold;
249
+ color: #28a745; /* لون مختلف للوقت */
250
+ }
251
+
252
+ code{
253
+ color: #fff;
254
+ background-color: #000;
255
+ padding: 5px;
256
+ border-radius: 3px;
257
+ }
258
+
259
+ .modal-footer {
260
+ display: flex;
261
+ justify-content: space-between;
262
+ align-items: center;
263
+ padding: 10px;
264
+ background-color: #f8f9fa;
265
+ border-top: 1px solid #e9ecef;
266
+ font-size: 14px;
267
+ color: #6c757d;
268
+ }
269
+
270
+ .user-info {
271
+ font-weight: bold;
272
+ color: #007bff;
273
+ }
274
+
275
+ .date {
276
+ font-style: italic;
277
+ color: #6c757d;
278
+ }
279
+
280
+ .time {
281
+ font-weight: bold;
282
+ color: #28a745; /* لون مختلف للوقت */
283
+ }
284
+
285
+ code{
286
+ color: #fff;
287
+ background-color: #000;
288
+ padding: 5px;
289
+ border-radius: 3px;
290
+ }
291
+ .modal-footer {
292
+ display: flex;
293
+ justify-content: space-between;
294
+ align-items: center;
295
+ padding: 10px;
296
+ background-color: #f8f9fa;
297
+ border-top: 1px solid #e9ecef;
298
+ font-size: 14px;
299
+ color: #6c757d;
300
+ }
301
+
302
+ .user-info {
303
+ font-weight: bold;
304
+ color: #007bff;
305
+ }
306
+
307
+ .date {
308
+ font-style: italic;
309
+ color: #6c757d;
310
+ }
311
+
312
+ .time {
313
+ font-weight: bold;
314
+ color: #28a745; /* لون مختلف للوقت */
315
+ margin-right: 10px;
316
+ }
317
+
318
+ .user-photo {
319
+ margin-left: 10px; /* مسافة بين الصورة والعناصر الأخرى */
320
+ }
321
+
322
+ .photo_user {
323
+ width: 40px; /* حجم الصورة */
324
+ height: 40px;
325
+ border-radius: 50%; /* جعل الصورة دائرية */
326
+ object-fit: cover; /* تأكد من أن الصورة تملأ المساحة دون تشويه */
327
+ border: 2px solid #007bff; /* إطار حول الصورة */
328
+ }
329
+
330
+ .article-title {
331
+ font-size: 20px;
332
+ font-weight: bold;
333
+ color: #333;
334
+ margin: 0 0 10px 0;
335
+ position: sticky;
336
+ top: 0;
337
+ background-color: #fff;
338
+ padding: 10px 0;
339
+ z-index: 10;
340
+ border-bottom: 1px solid #ddd;
341
+ }
342
+
343
+ .close-btn {
344
+ /* position: sticky; */
345
+ /* top: 0;
346
+ right: 0; */
347
+ font-size: 30px;
348
+ cursor: pointer;
349
+ color: #333;
350
+ /* background: none;
351
+ border: none;
352
+ z-index: 20;
353
+ margin-left: auto; */
354
+ padding: 10px;
355
+ /* background-color: #fff; */
356
+
357
+ }
358
+
359
+ .controls{
360
+ position: sticky;
361
+ top: 0;
362
+ right: 0;
363
+ font-size: 30px;
364
+ cursor: pointer;
365
+ color: #333;
366
+ background: none;
367
+ border: none;
368
+ z-index: 20;
369
+ margin-left: auto;
370
+ padding: 5px 10px;
371
+ width: 100%;
372
+ background-color: #fff;
373
+ display: flex;
374
+ align-items: center;
375
+ justify-content: space-between;
376
+ background-color: #007bff;
377
+ }
378
+
379
+
380
+
381
+ </style>
382
+ <!-- إضافة Prism CSS -->
383
+ <link href="https://cdn.jsdelivr.net/npm/[email protected]/themes/prism.css" rel="stylesheet"/>
384
+
385
+ <!-- إضافة Prism JS -->
386
+ <script src="https://cdn.jsdelivr.net/npm/[email protected]/prism.js"></script>
387
+
388
+ <script>
389
+ let overlay = null;
390
+ // فتح النافذة
391
+ function toggleContent(element) {
392
+ const content = element.querySelector('.article-content');
393
+
394
+ if (content.style.display === 'none' || content.style.display === '') {
395
+ content.style.display = 'block';
396
+ setTimeout(() => {
397
+ content.classList.add('show');
398
+ }, 10);
399
+ }
400
+ }
401
+
402
+ // إغلاق النافذة
403
+ // إغلاق المقالة عند الضغط على زر "إغلاق"
404
+ function closeContent(button) {
405
+ const content = button.closest('.article-content'); // الوصول إلى العنصر الأب (الـ article-content)
406
+ content.classList.remove('show'); // إزالة الفئة التي تعرض النافذة
407
+ setTimeout(() => {
408
+ content.style.display = 'none'; // إخفاء النافذة تمامًا بعد وقت قصير (500ms)
409
+ }, 500);
410
+ }
411
+ let isCreating = false; // متغير لتتبع حالة إنشاء المقالة
412
+
413
+ // إنشاء المقالة
414
+ async function createArticle() {
415
+ if (isCreating) {
416
+ // إذا كانت العملية جارية، عرض رسالة تذكير
417
+ const message = document.createElement('div');
418
+ message.id = 'creation-message';
419
+ message.textContent = 'انتظر لم ننتهي بعد';
420
+ message.style.color = 'red';
421
+ message.style.position = 'fixed';
422
+ message.style.top = '10px';
423
+ message.style.left = '50%';
424
+ message.style.transform = 'translateX(-50%)';
425
+ message.style.padding = '10px';
426
+ message.style.backgroundColor = 'white';
427
+ message.style.border = '1px solid red';
428
+ message.style.borderRadius = '5px';
429
+ message.style.zIndex = '1000';
430
+ document.body.appendChild(message);
431
+
432
+ // إخفاء الرسالة بعد 3 ثوانٍ
433
+ setTimeout(() => {
434
+ document.body.removeChild(message);
435
+ }, 3000);
436
+
437
+ return; // إيقاف التنفيذ إذا كانت العملية جارية
438
+ }
439
+
440
+ const title = document.getElementById('title').value; // جلب العنوان من الـ input
441
+ if (!title) {
442
+ alert('يرجى إدخال عنوان المقال.');
443
+ return;
444
+ }
445
+
446
+ isCreating = true; // تعيين حالة العملية إلى "جارية"
447
+ document.getElementById('loading-text').style.display = 'block'; // عرض النص "جاري التحميل"
448
+
449
+ const articleSection = document.getElementById('articles'); // الحصول على قسم المقالات
450
+ const loadingSkeleton = document.createElement('div'); // إنشاء عنصر جديد للتحميل
451
+ loadingSkeleton.classList.add('skeleton'); // إضافة الفئة التي تنشئ تأثير التحميل
452
+ articleSection.prepend(loadingSkeleton); // إضافة عنصر التحميل في البداية
453
+
454
+ try {
455
+ // إرسال طلب إلى السيرفر لإنشاء المقال
456
+ const response = await fetch('/create', {
457
+ method: 'POST',
458
+ headers: { 'Content-Type': 'application/json' },
459
+ body: JSON.stringify({ title }) // إرسال العنوان فقط
460
+ });
461
+
462
+ if (!response.ok) {
463
+ throw new Error('حدث خطأ أثناء إنشاء المقال.');
464
+ }
465
+
466
+ const data = await response.json(); // تحويل الاستجابة إلى JSON
467
+
468
+ // إنشاء المقال الجديد وعرضه
469
+ const newArticle = document.createElement('div');
470
+ newArticle.classList.add('article-box');
471
+ newArticle.setAttribute("data-idUser" , `${data.id_user}`)
472
+ newArticle.setAttribute('onclick', 'toggleContent(this)');
473
+ newArticle.innerHTML = `
474
+ <h3 class="article-title">${data.title}</h3>
475
+ <p class="article-meta">By: ${data.user} - ${new Date(data.created_at).toLocaleString()}</p>
476
+ <div class="article-content">
477
+ <div class="controls">
478
+ <button class="close-btn" onclick="closeContent(this)">×</button>
479
+ <div class="modal-header">${data.title}</div>
480
+ </div>
481
+ <div class="article-body">${data.content}</div>
482
+ <div class="modal-footer">
483
+ <img class="photo_user" src="${data.photo_user}" alt="User Photo">
484
+ <span class="user-info">By: ${data.user}</span>
485
+ <span class="date">${new Date(data.created_at).toLocaleDateString('en-US', { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' })}</span>
486
+ <span class="time">${new Date(data.created_at).toLocaleTimeString()}</span>
487
+ </div>
488
+ </div>
489
+ `;
490
+
491
+ // إزالة عنصر التحميل وعرض المقال الجديد
492
+ articleSection.removeChild(loadingSkeleton);
493
+ articleSection.prepend(newArticle); // إضافة المقال الجديد في أعلى القسم
494
+
495
+ } catch (error) {
496
+ console.error(error);
497
+ alert('حدث خطأ أثناء إنشاء المقال.');
498
+ articleSection.removeChild(loadingSkeleton); // إزالة عنصر التحميل في حال حدوث خطأ
499
+ } finally {
500
+ isCreating = false; // تعيين حالة العملية إلى "غير جارية"
501
+ document.getElementById('loading-text').style.display = 'none'; // إخفاء النص "جاري التحميل" عند الانتهاء
502
+ }
503
+ }
504
+
505
+
506
+ function searchArticles() {
507
+ const searchTerm = document.getElementById('search').value.toLowerCase();
508
+ const articles = document.querySelectorAll('.article-box');
509
+ articles.forEach(article => {
510
+ const title = article.querySelector('.article-title').textContent.toLowerCase();
511
+ if (title.includes(searchTerm)) {
512
+ article.style.display = 'block';
513
+ } else {
514
+ article.style.display = 'none';
515
+ }
516
+ });
517
+ }
518
+
519
+
520
+
521
+ document.addEventListener('DOMContentLoaded', () => {
522
+ // ربط الدالة بحدث النقر على زر "عرض مقالاتي"
523
+ const showMyArticlesButton = document.getElementById('showMyArticles');
524
+ if (showMyArticlesButton) {
525
+ showMyArticlesButton.addEventListener('click', async () => {
526
+ const currentUserId = await getCurrentUserId(); // جلب id المستخدم الحالي
527
+
528
+ if (currentUserId) {
529
+ console.log('ID المستخدم الحالي:', currentUserId);
530
+
531
+ // تصفية المقالات بناءً على id المستخدم
532
+ const articles = document.querySelectorAll('.article-box');
533
+ articles.forEach(article => {
534
+ const articleUserId = article.getAttribute('data-iduser'); // جلب id المستخدم من المقالة
535
+ if (articleUserId == currentUserId) {
536
+ article.style.display = 'block'; // عرض المقالة إذا كانت للمستخدم الحالي
537
+ } else {
538
+ article.style.display = 'none'; // إخفاء المقالة إذا لم تكن للمستخدم الحالي
539
+ }
540
+ });
541
+ } else {
542
+ console.log('لم يتم العثور على id المستخدم.');
543
+ alert('يجب تسجيل الدخول لعرض مقالاتك.');
544
+ }
545
+ });
546
+ } else {
547
+ console.error('الزر "عرض مقالاتي" غير موجود في الصفحة.');
548
+ }
549
+
550
+ // ربط الدالة بحدث النقر على زر "عرض كل المقالات"
551
+ const showAllArticlesButton = document.getElementById('showAllArticles');
552
+ if (showAllArticlesButton) {
553
+ showAllArticlesButton.addEventListener('click', () => {
554
+ // عرض جميع المقالات
555
+ const articles = document.querySelectorAll('.article-box');
556
+ articles.forEach(article => {
557
+ article.style.display = 'block'; // إظهار جميع المقالات
558
+ });
559
+ });
560
+ } else {
561
+ console.error('الزر "عرض كل المقالات" غير موجود في الصفحة.');
562
+ }
563
+ });
564
+
565
+ // دالة لجلب id المستخدم الحالي
566
+ async function getCurrentUserId() {
567
+ try {
568
+ const response = await fetch('/current_user_id', {
569
+ method: 'GET',
570
+ headers: {
571
+ 'Content-Type': 'application/json'
572
+ }
573
+ });
574
+
575
+ if (!response.ok) {
576
+ throw new Error('فشل في جلب بيانات المستخدم');
577
+ }
578
+
579
+ const data = await response.json(); // تحويل الاستجابة إلى JSON
580
+ return data.id; // إرجاع id المستخدم
581
+ } catch (error) {
582
+ console.error('حدث خطأ:', error);
583
+ return null; // إرجاع null في حالة حدوث خطأ
584
+ }
585
+ }
586
+
587
+ </script>
588
+ </head>
589
+ <body>
590
+
591
+ <div id="loading-text" style="text-align: center; margin-top: 20px; display: none;">
592
+ <p>جاري الإنشاء...</p>
593
+ </div>
594
+
595
+
596
+ <div class="container">
597
+ <h1>مولد مقالات AI</h1>
598
+
599
+ <!-- مربع البحث -->
600
+ <div class="search-box">
601
+ <input type="text" id="search" oninput="searchArticles()" placeholder="بحث عن مقال...">
602
+ </div>
603
+
604
+ <input type="text" id="title" placeholder="أدخل عنوان المقال">
605
+ <button class="btn" onclick="createArticle()">أنشئ مقال</button>
606
+ <button id="showMyArticles">عرض مقالاتي</button>
607
+ <button id="showAllArticles">عرض كل المقالات</button>
608
+
609
+ <div id="articles">
610
+ <!-- عرض المقالات الموجودة -->
611
+ {% for article in articles %}
612
+ <div class="article-box" data-idUser="{{ article.id_user }}" onclick="toggleContent(this)">
613
+ <h3 class="article-title">{{ article.title }}</h3>
614
+ <p class="article-meta">By: {{ article.user }} - {{ article.created_at.strftime('%Y-%m-%d %H:%M:%S') }}</p>
615
+ <div class="article-content">
616
+ <div class="controls">
617
+ <button class="close-btn" onclick="closeContent(this)">×</button>
618
+ <div class="modal-header ">{{ article.title }}</div>
619
+ </div>
620
+ <div class="article-body">{{ article.content | safe }}</div>
621
+ <div class="modal-footer">
622
+ <img class="photo_user" src="{{ url_for('static', filename=article.photo_user) }}" alt="User Photo">
623
+ <span class="user-info">By: {{ article.user }}</span>
624
+ <span class="date">{{ article.created_at.strftime('%A, %Y-%m-%d') }}</span>
625
+ <span class="time">{{ article.created_at.strftime('%H:%M') }}</span>
626
+ <div class="user-photo">
627
+ </div> </div>
628
+ </div> <!-- إغلاق article-content -->
629
+ </div> <!-- إغلاق article-box -->
630
+ {% endfor %}
631
+ </div> <!-- إغلاق articles -->
632
+
633
+
634
+ </body>
635
+ </html>
templates/base.html ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="ar" dir="rtl">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>{% block title %}{% endblock %}</title>
7
+ <link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}">
8
+ <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
9
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
10
+
11
+ </head>
12
+ <body>
13
+ <div class="container">
14
+ {% with messages = get_flashed_messages(with_categories=true) %}
15
+ {% if messages %}
16
+ {% for category, message in messages %}
17
+ <div class="alert alert-{{ category }}">{{ message }}</div>
18
+ {% endfor %}
19
+ {% endif %}
20
+ {% endwith %}
21
+
22
+ {% block content %}{% endblock %}
23
+ </div>
24
+
25
+ {% block scripts %}{% endblock %}
26
+ </body>
27
+ </html>
templates/create_post.html ADDED
@@ -0,0 +1,293 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {% extends "base.html" %}
2
+
3
+ {% block title %}إنشاء منشور{% endblock %}
4
+
5
+ {% block content %}
6
+ <div class="post-creation-container">
7
+ <!-- User Profile Section -->
8
+ <div class="user-profile">
9
+ <div class="profile-circle">
10
+ <img src="{{ url_for('static', filename='uploads/default-avatar.jpg') }}" alt="Profile Picture" class="profile-pic">
11
+ </div>
12
+ <span class="username">{{ current_user.username }}</span>
13
+ </div>
14
+
15
+ <!-- Post Creation Form -->
16
+ <form class="post-form" method="POST" enctype="multipart/form-data">
17
+ <div class="post-type-selector">
18
+ <button type="button" class="type-btn active" data-type="text">
19
+ <i class="fas fa-font"></i> نص
20
+ </button>
21
+ <button type="button" class="type-btn" data-type="media">
22
+ <i class="fas fa-image"></i> صورة/فيديو
23
+ </button>
24
+ </div>
25
+
26
+ <div class="text-post-section">
27
+ <textarea name="content" placeholder="بماذا تفكر؟" class="form-control"></textarea>
28
+
29
+ <div class="background-colors">
30
+ <button type="button" class="color-btn active" data-color="#ffffff" style="background-color: #ffffff">
31
+ <i class="fas fa-font"></i>
32
+ </button>
33
+ <button type="button" class="color-btn" data-color="#ffafcc" style="background-color: #ffafcc">
34
+ <i class="fas fa-font"></i>
35
+ </button>
36
+ <button type="button" class="color-btn" data-color="#a2d2ff" style="background-color: #a2d2ff">
37
+ <i class="fas fa-font"></i>
38
+ </button>
39
+ <button type="button" class="color-btn" data-color="#caffbf" style="background-color: #caffbf">
40
+ <i class="fas fa-font"></i>
41
+ </button>
42
+ <button type="button" class="color-btn" data-color="#ffd6a5" style="background-color: #ffd6a5">
43
+ <i class="fas fa-font"></i>
44
+ </button>
45
+ </div>
46
+ <input type="hidden" name="background_color" id="background_color" value="#ffffff">
47
+ </div>
48
+
49
+ <div class="media-post-section" style="display: none;">
50
+ <textarea name="media_content" placeholder="اكتب شيئاً عن هذه الصورة/الفيديو..." class="form-control"></textarea>
51
+ <div class="media-upload">
52
+ <input type="file" name="media" id="media-input" accept="image/*,video/*">
53
+ <label for="media-input" class="upload-label">
54
+ <i class="fas fa-cloud-upload-alt"></i> اختر صورة أو فيديو
55
+ </label>
56
+ <div id="media-preview"></div>
57
+ </div>
58
+ </div>
59
+
60
+ <div class="form-actions">
61
+ <button type="submit" class="btn btn-primary">نشر</button>
62
+ </div>
63
+ </form>
64
+ </div>
65
+
66
+ <style>
67
+ .post-creation-container {
68
+ max-width: 600px;
69
+ margin: 20px auto;
70
+ background: #fff;
71
+ border-radius: 8px;
72
+ box-shadow: 0 2px 4px rgba(0,0,0,0.1);
73
+ padding: 20px;
74
+ }
75
+
76
+ .user-profile {
77
+ display: flex;
78
+ align-items: center;
79
+ margin-bottom: 20px;
80
+ }
81
+
82
+ .profile-circle {
83
+ width: 40px;
84
+ height: 40px;
85
+ border-radius: 50%;
86
+ overflow: hidden;
87
+ margin-left: 10px;
88
+ }
89
+
90
+ .profile-circle img {
91
+ width: 100%;
92
+ height: 100%;
93
+ object-fit: cover;
94
+ }
95
+
96
+ .username {
97
+ font-weight: bold;
98
+ color: #1a1a1a;
99
+ }
100
+
101
+ .post-type-selector {
102
+ display: flex;
103
+ gap: 10px;
104
+ margin-bottom: 15px;
105
+ border-bottom: 1px solid #ddd;
106
+ padding-bottom: 10px;
107
+ }
108
+
109
+ .type-btn {
110
+ flex: 1;
111
+ padding: 8px;
112
+ border: none;
113
+ background: none;
114
+ cursor: pointer;
115
+ border-radius: 4px;
116
+ color: #65676b;
117
+ }
118
+
119
+ .type-btn.active {
120
+ background-color: #e7f3ff;
121
+ color: #1877f2;
122
+ }
123
+
124
+ .form-control {
125
+ width: 100%;
126
+ padding: 12px;
127
+ border: 1px solid #ddd;
128
+ border-radius: 8px;
129
+ font-size: 16px;
130
+ margin-bottom: 15px;
131
+ box-sizing: border-box;
132
+ }
133
+
134
+ textarea.form-control {
135
+ min-height: 100px;
136
+ resize: vertical;
137
+ white-space: pre-wrap;
138
+ direction: rtl;
139
+ }
140
+
141
+ .background-colors {
142
+ display: flex;
143
+ gap: 10px;
144
+ margin-bottom: 15px;
145
+ padding: 10px;
146
+ border-radius: 8px;
147
+ background: #f0f2f5;
148
+ }
149
+
150
+ .color-btn {
151
+ width: 40px;
152
+ height: 40px;
153
+ border: none;
154
+ border-radius: 50%;
155
+ cursor: pointer;
156
+ display: flex;
157
+ align-items: center;
158
+ justify-content: center;
159
+ color: #1a1a1a;
160
+ }
161
+
162
+ .color-btn.active {
163
+ border: 2px solid #1877f2;
164
+ }
165
+
166
+ .media-upload {
167
+ margin: 15px 0;
168
+ }
169
+
170
+ .upload-label {
171
+ display: inline-block;
172
+ padding: 10px 20px;
173
+ background: #f0f2f5;
174
+ border-radius: 8px;
175
+ cursor: pointer;
176
+ color: #1877f2;
177
+ }
178
+
179
+ .upload-label i {
180
+ margin-left: 8px;
181
+ }
182
+
183
+ #media-input {
184
+ display: none;
185
+ }
186
+
187
+ #media-preview {
188
+ margin-top: 15px;
189
+ }
190
+
191
+ #media-preview img,
192
+ #media-preview video {
193
+ max-width: 100%;
194
+ border-radius: 8px;
195
+ }
196
+
197
+ .btn {
198
+ padding: 8px 20px;
199
+ border: none;
200
+ border-radius: 6px;
201
+ cursor: pointer;
202
+ font-weight: bold;
203
+ font-size: 14px;
204
+ }
205
+
206
+ .btn-primary {
207
+ background: #1877f2;
208
+ color: white;
209
+ }
210
+
211
+ .form-actions {
212
+ display: flex;
213
+ justify-content: flex-end;
214
+ margin-top: 15px;
215
+ }
216
+ </style>
217
+
218
+ <script>
219
+ document.addEventListener('DOMContentLoaded', function() {
220
+ const form = document.querySelector('.post-form');
221
+ const typeButtons = document.querySelectorAll('.type-btn');
222
+ const textSection = document.querySelector('.text-post-section');
223
+ const mediaSection = document.querySelector('.media-post-section');
224
+ const colorButtons = document.querySelectorAll('.color-btn');
225
+ const backgroundColorInput = document.getElementById('background_color');
226
+ const mediaInput = document.getElementById('media-input');
227
+ const mediaPreview = document.getElementById('media-preview');
228
+ const contentTextarea = document.querySelector('textarea[name="content"]');
229
+
230
+ // Post Type Selection
231
+ typeButtons.forEach(btn => {
232
+ btn.addEventListener('click', () => {
233
+ typeButtons.forEach(b => b.classList.remove('active'));
234
+ btn.classList.add('active');
235
+
236
+ if (btn.dataset.type === 'text') {
237
+ textSection.style.display = 'block';
238
+ mediaSection.style.display = 'none';
239
+ } else {
240
+ textSection.style.display = 'none';
241
+ mediaSection.style.display = 'block';
242
+ }
243
+ });
244
+ });
245
+
246
+ // Background Color Selection
247
+ colorButtons.forEach(btn => {
248
+ btn.addEventListener('click', () => {
249
+ colorButtons.forEach(b => b.classList.remove('active'));
250
+ btn.classList.add('active');
251
+ const color = btn.dataset.color;
252
+ backgroundColorInput.value = color;
253
+ contentTextarea.style.backgroundColor = color;
254
+ });
255
+ });
256
+
257
+ // Media Preview
258
+ mediaInput.addEventListener('change', function() {
259
+ const file = this.files[0];
260
+ if (file) {
261
+ const reader = new FileReader();
262
+ reader.onload = function(e) {
263
+ mediaPreview.innerHTML = '';
264
+ if (file.type.startsWith('image/')) {
265
+ const img = document.createElement('img');
266
+ img.src = e.target.result;
267
+ mediaPreview.appendChild(img);
268
+ } else if (file.type.startsWith('video/')) {
269
+ const video = document.createElement('video');
270
+ video.src = e.target.result;
271
+ video.controls = true;
272
+ mediaPreview.appendChild(video);
273
+ }
274
+ };
275
+ reader.readAsDataURL(file);
276
+ }
277
+ });
278
+
279
+ // Form Submission
280
+ form.addEventListener('submit', function(e) {
281
+ const activeType = document.querySelector('.type-btn.active').dataset.type;
282
+ if (activeType === 'media') {
283
+ const mediaContent = document.querySelector('textarea[name="media_content"]').value;
284
+ document.querySelector('textarea[name="content"]').value = mediaContent;
285
+ }
286
+
287
+ // Add line breaks for text content
288
+ const contentTextarea = document.querySelector('textarea[name="content"]');
289
+ contentTextarea.value = contentTextarea.value.replace(/\n/g, '\n');
290
+ });
291
+ });
292
+ </script>
293
+ {% endblock %}
templates/create_post_iframe.html ADDED
@@ -0,0 +1,263 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="ar">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>إنشاء منشور جديد</title>
7
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css">
8
+ <style>
9
+ body {
10
+ margin: 0;
11
+ padding: 20px;
12
+ font-family: 'Arial', sans-serif;
13
+ background-color: #fff;
14
+ direction: rtl;
15
+ }
16
+
17
+ .post-form {
18
+ max-width: 100%;
19
+ }
20
+
21
+ .user-info {
22
+ display: flex;
23
+ align-items: center;
24
+ margin-bottom: 20px;
25
+ }
26
+
27
+ .profile-circle {
28
+ width: 40px;
29
+ height: 40px;
30
+ border-radius: 50%;
31
+ overflow: hidden;
32
+ margin-left: 10px;
33
+ }
34
+
35
+ .profile-circle img {
36
+ width: 100%;
37
+ height: 100%;
38
+ object-fit: cover;
39
+ }
40
+
41
+ .username {
42
+ font-weight: bold;
43
+ color: #1a1a1a;
44
+ }
45
+
46
+ .form-group {
47
+ margin-bottom: 15px;
48
+ }
49
+
50
+ input[type="text"],
51
+ textarea {
52
+ width: 100%;
53
+ padding: 12px;
54
+ border: 1px solid #ddd;
55
+ border-radius: 8px;
56
+ box-sizing: border-box;
57
+ font-size: 16px;
58
+ direction: rtl;
59
+ }
60
+
61
+ textarea {
62
+ min-height: 150px;
63
+ resize: vertical;
64
+ }
65
+
66
+ .media-upload {
67
+ display: flex;
68
+ gap: 10px;
69
+ margin-top: 20px;
70
+ padding: 15px;
71
+ border-top: 1px solid #ddd;
72
+ }
73
+
74
+ .upload-btn {
75
+ display: flex;
76
+ align-items: center;
77
+ gap: 8px;
78
+ padding: 8px 16px;
79
+ border: none;
80
+ border-radius: 20px;
81
+ background-color: #f0f2f5;
82
+ color: #1a1a1a;
83
+ cursor: pointer;
84
+ font-size: 14px;
85
+ transition: background-color 0.2s;
86
+ }
87
+
88
+ .upload-btn:hover {
89
+ background-color: #e4e6eb;
90
+ }
91
+
92
+ .submit-btn {
93
+ width: 100%;
94
+ padding: 12px;
95
+ background-color: #4CAF50;
96
+ color: white;
97
+ border: none;
98
+ border-radius: 8px;
99
+ font-size: 16px;
100
+ cursor: pointer;
101
+ transition: background-color 0.2s;
102
+ margin-top: 20px;
103
+ }
104
+
105
+ .submit-btn:hover {
106
+ background-color: #45a049;
107
+ }
108
+
109
+ .submit-btn:disabled {
110
+ background-color: #cccccc;
111
+ cursor: not-allowed;
112
+ }
113
+
114
+ #preview {
115
+ margin-top: 15px;
116
+ max-width: 100%;
117
+ border-radius: 8px;
118
+ display: none;
119
+ }
120
+
121
+ #preview img,
122
+ #preview video {
123
+ max-width: 100%;
124
+ border-radius: 8px;
125
+ }
126
+
127
+ .preview-container {
128
+ position: relative;
129
+ display: inline-block;
130
+ margin-top: 15px;
131
+ width: 100%;
132
+ }
133
+
134
+ .remove-preview {
135
+ position: absolute;
136
+ top: 10px;
137
+ right: 10px;
138
+ background: rgba(0, 0, 0, 0.5);
139
+ color: white;
140
+ border: none;
141
+ border-radius: 50%;
142
+ width: 30px;
143
+ height: 30px;
144
+ cursor: pointer;
145
+ display: flex;
146
+ align-items: center;
147
+ justify-content: center;
148
+ font-size: 18px;
149
+ }
150
+
151
+ .remove-preview:hover {
152
+ background: rgba(0, 0, 0, 0.7);
153
+ }
154
+
155
+ .media-preview {
156
+ width: 100%;
157
+ border-radius: 8px;
158
+ overflow: hidden;
159
+ background: #f0f2f5;
160
+ margin-top: 15px;
161
+ display: none;
162
+ }
163
+
164
+ .media-preview img {
165
+ width: 100%;
166
+ display: block;
167
+ }
168
+
169
+ .media-preview video {
170
+ width: 100%;
171
+ display: block;
172
+ }
173
+ </style>
174
+ </head>
175
+ <body>
176
+ <form class="post-form" method="POST" enctype="multipart/form-data">
177
+ <div class="user-info">
178
+ <div class="profile-circle">
179
+ <img src="{{ url_for('static', filename='uploads/default-avatar.jpg') }}" alt="صورة الملف الشخصي">
180
+ </div>
181
+ <span class="username">{{ current_user.username }}</span>
182
+ </div>
183
+
184
+ <div class="form-group">
185
+ <input type="text" name="title" placeholder="عنوان المنشور" required>
186
+ </div>
187
+
188
+ <div class="form-group">
189
+ <textarea name="content" placeholder="ماذا يدور في ذهنك؟" required></textarea>
190
+ </div>
191
+
192
+ <div class="media-preview" id="mediaPreview"></div>
193
+
194
+ <div class="media-upload">
195
+ <input type="file" id="imageInput" name="media" accept="image/*" style="display: none">
196
+ <button type="button" class="upload-btn" onclick="document.getElementById('imageInput').click()">
197
+ <i class="fas fa-image"></i>
198
+ صورة
199
+ </button>
200
+
201
+ <input type="file" id="videoInput" name="media" accept="video/*" style="display: none">
202
+ <button type="button" class="upload-btn" onclick="document.getElementById('videoInput').click()">
203
+ <i class="fas fa-video"></i>
204
+ فيديو
205
+ </button>
206
+ </div>
207
+
208
+ <button type="submit" class="submit-btn">نشر</button>
209
+ </form>
210
+
211
+ <script>
212
+ const imageInput = document.getElementById('imageInput');
213
+ const videoInput = document.getElementById('videoInput');
214
+ const mediaPreview = document.getElementById('mediaPreview');
215
+ let currentFile = null;
216
+
217
+ function showPreview(file, type) {
218
+ if (currentFile) {
219
+ URL.revokeObjectURL(currentFile);
220
+ }
221
+
222
+ const previewUrl = URL.createObjectURL(file);
223
+ currentFile = previewUrl;
224
+
225
+ mediaPreview.innerHTML = `
226
+ <div class="preview-container">
227
+ ${type === 'image'
228
+ ? `<img src="${previewUrl}" alt="معاينة">`
229
+ : `<video src="${previewUrl}" controls></video>`
230
+ }
231
+ <button type="button" class="remove-preview" onclick="removePreview()">×</button>
232
+ </div>
233
+ `;
234
+ mediaPreview.style.display = 'block';
235
+ }
236
+
237
+ function removePreview() {
238
+ if (currentFile) {
239
+ URL.revokeObjectURL(currentFile);
240
+ currentFile = null;
241
+ }
242
+ mediaPreview.innerHTML = '';
243
+ mediaPreview.style.display = 'none';
244
+ imageInput.value = '';
245
+ videoInput.value = '';
246
+ }
247
+
248
+ imageInput.addEventListener('change', (e) => {
249
+ if (e.target.files[0]) {
250
+ showPreview(e.target.files[0], 'image');
251
+ videoInput.value = '';
252
+ }
253
+ });
254
+
255
+ videoInput.addEventListener('change', (e) => {
256
+ if (e.target.files[0]) {
257
+ showPreview(e.target.files[0], 'video');
258
+ imageInput.value = '';
259
+ }
260
+ });
261
+ </script>
262
+ </body>
263
+ </html>
templates/dashboard.html ADDED
@@ -0,0 +1,2997 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="ar">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>لوحة التحكم</title>
7
+
8
+ <!-- استدعاء مكتبة Font Awesome -->
9
+ <link
10
+ rel="stylesheet"
11
+ href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css"
12
+ />
13
+ <!-- استدعاء مكتبة jQuery -->
14
+ <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
15
+
16
+ <style>
17
+ /* إعدادات عامة للجوال */
18
+ body {
19
+ margin: 0;
20
+ padding: 0;
21
+ font-family: "Arial", sans-serif;
22
+ background-color: #f0f2f5;
23
+ }
24
+
25
+ .top-bar {
26
+ display: flex;
27
+ justify-content: space-between;
28
+ align-items: center;
29
+ background-color: #4caf50;
30
+ padding: 15px;
31
+ position: fixed;
32
+ top: 0;
33
+ left: 0;
34
+ width: 100%;
35
+ z-index: 100;
36
+ box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);
37
+ height: 50px;
38
+ padding: 10px 20px;
39
+ }
40
+
41
+ /* الدائرة */
42
+ .profile-circle {
43
+ position: relative;
44
+ display: inline-block;
45
+ cursor: pointer;
46
+ width: 40px;
47
+ height: 40px;
48
+ }
49
+ .profile-circle img {
50
+ object-fit: cover;
51
+ }
52
+ #profileCircle img {
53
+ border-radius: 50%;
54
+ }
55
+
56
+ /* الدائرة */
57
+ .profile-circle {
58
+ position: relative;
59
+ display: inline-block;
60
+ cursor: pointer;
61
+
62
+ border-radius: 50%;
63
+ flex-shrink: 0;
64
+ }
65
+ .profile-circle img {
66
+ width: 100%;
67
+ height: 100%;
68
+ border-radius: 50%;
69
+ }
70
+ #profileCircle {
71
+ margin-right: 27px;
72
+ }
73
+
74
+ /* القائمة المنسدلة */
75
+ .dropdown-menu {
76
+ display: none; /* إخفاء القائمة بشكل افتراضي */
77
+ position: absolute;
78
+ top: 48px;
79
+ right: -8px;
80
+ background-color: #fff;
81
+ border-radius: 8px;
82
+ box-shadow: 0 12px 28px 0 rgba(0, 0, 0, 0.2),
83
+ 0 2px 4px 0 rgba(0, 0, 0, 0.1);
84
+ z-index: 1100;
85
+ min-width: 220px;
86
+ box-sizing: border-box;
87
+ overflow: hidden;
88
+ padding: 8px 0;
89
+ }
90
+
91
+ /* السهم الذي يشير إلى القائمة */
92
+ .dropdown-menu::before {
93
+ content: "";
94
+ position: absolute;
95
+ top: -8px;
96
+ right: 20px;
97
+ width: 16px;
98
+ height: 16px;
99
+ background: #fff;
100
+ transform: rotate(45deg);
101
+ box-shadow: -2px -2px 3px rgba(0, 0, 0, 0.08);
102
+ }
103
+
104
+ /* تصميم الروابط داخل القائمة */
105
+ .dropdown-menu a {
106
+ display: block;
107
+ padding: 12px 16px;
108
+ text-decoration: none;
109
+ color: #050505;
110
+ font-size: 15px;
111
+ text-align: right;
112
+ font-weight: 500;
113
+ transition: background-color 0.2s ease;
114
+ }
115
+
116
+ /* تأثير التمرير على الروابط */
117
+ .dropdown-menu a:hover {
118
+ background-color: #f2f2f2;
119
+ }
120
+
121
+ /* فاصل بين العناصر */
122
+ .dropdown-menu a:not(:last-child) {
123
+ border-bottom: 1px solid #e4e6eb;
124
+ }
125
+
126
+ /* نافذة عرض بيانات الحساب */
127
+ .fullscreen-container {
128
+ display: none; /* إخفاء النافذة بشكل افتراضي */
129
+ position: fixed;
130
+ top: 0;
131
+ left: 0;
132
+ right: 0;
133
+ bottom: 0;
134
+ background: rgba(0, 0, 0, 0.6); /* خلفية مظللة */
135
+ z-index: 1200;
136
+ padding: 50px;
137
+ background-color: #fff;
138
+ }
139
+
140
+ .content {
141
+ background: #fff;
142
+ padding: 20px;
143
+ border-radius: 8px;
144
+ max-width: 600px;
145
+ margin: auto;
146
+ }
147
+
148
+ .close-btn {
149
+ position: absolute;
150
+ top: 10px;
151
+ right: 10px;
152
+ font-size: 30px;
153
+ cursor: pointer;
154
+ }
155
+
156
+ .fullscreen-container h2 {
157
+ text-align: center;
158
+ margin-bottom: 20px;
159
+ }
160
+
161
+ .fullscreen-container p,
162
+ .fullscreen-container ul {
163
+ margin: 10px 0;
164
+ line-height: 1.6;
165
+ }
166
+ </style>
167
+ </head>
168
+
169
+ <body>
170
+
171
+
172
+ <div class="top-bar">
173
+ <!-- زر إنشاء منشور جديد -->
174
+ <button class="create-post-btn" id="createPostBtn">
175
+ <i class="fas fa-plus"></i> إنشاء منشور
176
+ </button>
177
+ <button class="chat-button">💬</button>
178
+
179
+ <div id="notifications">
180
+ <button id="notification-btn">
181
+ <span id="notification-count">0</span>
182
+ </button>
183
+ <a href="#" style="text-decoration: none;">
184
+ <button id="artical-open-btn">AI</button>
185
+ </a>
186
+
187
+ <!-- <a href="/videos" style="text-decoration: none;"> -->
188
+ <button class="video_page" >V</button>
189
+ <!-- </a> -->
190
+ <div id="notification-list">
191
+ <!-- الإشعارات ستظهر هنا -->
192
+ </div>
193
+ </div>
194
+ <button class="search-btn" id="openSearchModalBtn">بحث عن مستخدم</button>
195
+
196
+
197
+
198
+ <!-- زر فتح نافذة الشات -->
199
+
200
+ <!-- نافذة الشات -->
201
+ <div class="chat-window" id="chatWindow" style="display: none;">
202
+ <div class="chat-header">المحادثات <button class="close-main-chat">Close</button></div>
203
+ <div id="chatList" class="chat-list">
204
+ <!-- قائمة المستخدمين سيتم تعبئتها ديناميكيًا هنا -->
205
+ </div>
206
+ </div>
207
+
208
+
209
+ <!-- Container للـ iframe -->
210
+ <div id="artical-iframe-container">
211
+ <button id="artical-close-btn">إغلاق</button>
212
+ <iframe id="artical-iframe" src=""></iframe>
213
+ </div>
214
+
215
+ <!-- دائرة الملف الشخصي -->
216
+ <div class="profile-circle" id="profileCircle">
217
+ <img
218
+ src="{{ url_for('static', filename=current_user.profile_photo) }}"
219
+ alt="صورة الملف الشخصي"
220
+ />
221
+ <div class="dropdown-menu" id="dropdownMenu">
222
+ <a href="{{ url_for('profile') }}" id="profile-link">الملف الشخصي</a>
223
+ <a href="{{ url_for('logout') }}">تسجيل الخروج</a>
224
+ </div>
225
+ </div>
226
+ </div>
227
+
228
+
229
+ <!-- حاوية الملف الشخصي -->
230
+ <div id="profile-container">
231
+ <div id="profile-header">
232
+ <button id="close-profile-btn">✕</button>
233
+ </div>
234
+ <iframe id="profile-iframe"></iframe>
235
+ </div>
236
+ <!-- موديل البحث -->
237
+ <div class="modal-search" id="searchModal">
238
+ <div class="modal-search-content">
239
+ <span class="close-search-modal" id="closeSearchModalBtn">&times;</span>
240
+ <input type="text" class="search-input" id="searchInput" placeholder="ابحث عن مستخدم..." onkeyup="searchUsers()" />
241
+ <div class="search-results" id="searchResults"></div>
242
+ </div>
243
+ </div>
244
+
245
+ <button id="closeChatFrame">إغلاق</button>
246
+ <iframe id="chatFrame" src="">
247
+ </iframe>
248
+
249
+ <script>
250
+ document.addEventListener("DOMContentLoaded", function () {
251
+ const profileCircle = document.getElementById("profileCircle");
252
+ const dropdownMenu = document.getElementById("dropdownMenu");
253
+
254
+ // دالة لتبديل عرض القائمة المنسدلة
255
+ function toggleDropdown(e) {
256
+ e.stopPropagation(); // منع الحدث من الانتقال إلى العناصر الأخرى
257
+
258
+ // إذا كانت القائمة مخفية، فإظهارها
259
+ if (
260
+ dropdownMenu.style.display === "none" ||
261
+ dropdownMenu.style.display === ""
262
+ ) {
263
+ dropdownMenu.style.display = "block";
264
+ } else {
265
+ // إذا كانت القائمة ظاهرة، فإخفاؤها
266
+ dropdownMenu.style.display = "none";
267
+ }
268
+ }
269
+
270
+ // إضافة حدث عند النقر على دائرة الملف الشخصي
271
+ profileCircle.addEventListener("click", toggleDropdown);
272
+
273
+ // إغلاق القائمة عند النقر في أي مكان آخر
274
+ document.addEventListener("click", (e) => {
275
+ if (
276
+ !profileCircle.contains(e.target) &&
277
+ dropdownMenu.style.display === "block"
278
+ ) {
279
+ dropdownMenu.style.display = "none"; // إخفاء القائمة
280
+ }
281
+ });
282
+
283
+ // منع إغلاق القائمة عند النقر داخلها
284
+ dropdownMenu.addEventListener("click", (e) => {
285
+ e.stopPropagation(); // منع الحدث من الانتقال إلى العناصر الأخرى
286
+ });
287
+ });
288
+ </script>
289
+
290
+ <!-- إطار إنشاء المنشور -->
291
+ <div class="post-modal" id="postModal">
292
+ <div class="modal-overlay"></div>
293
+ <div class="modal-content">
294
+ <div class="modal-header">
295
+ <span class="close-modal">&times;</span>
296
+ <h3>إنشاء منشور جديد</h3>
297
+ </div>
298
+ <iframe src="{{ url_for('create_post') }}" frameborder="0"></iframe>
299
+ </div>
300
+ </div>
301
+
302
+ <!-- Comments Fixed Container -->
303
+ <div class="comments-overlay" id="commentsOverlay"></div>
304
+ <div class="comments-fixed-container" id="commentsFixedContainer">
305
+ <div class="comments-content">
306
+ <div class="comments-header">
307
+ <h3>التعليقات</h3>
308
+ <span class="close-comments">&times;</span>
309
+ </div>
310
+ <div class="comments-list-container">
311
+ <div class="comments-list"></div>
312
+ </div>
313
+ <div class="comment-input-container">
314
+ <textarea
315
+ class="comment-input"
316
+ placeholder="اكتب تعليقك ��نا..."
317
+ rows="1"
318
+ ></textarea>
319
+ <button class="send-comment-btn">
320
+ <i class="fas fa-paper-plane"></i>
321
+ </button>
322
+ </div>
323
+ </div>
324
+ </div>
325
+
326
+ <div class="reply-overlay" id="replyOverlay"></div>
327
+ <div class="reply-fixed-container" id="replyFixedContainer">
328
+ <div class="reply-content">
329
+ <div class="reply-header">
330
+ <h3>الرد</h3>
331
+ <span class="close-reply">&times;</span>
332
+ </div>
333
+ <div class="reply-input-container">
334
+ <textarea
335
+ class="reply-input"
336
+ placeholder="اكتب ردك هنا..."
337
+ rows="1"
338
+ ></textarea>
339
+ <button class="send-reply-btn">
340
+ <i class="fas fa-paper-plane"></i>
341
+ </button>
342
+ </div>
343
+ </div>
344
+ </div>
345
+
346
+
347
+ <style>
348
+ /* Comments Fixed Container Styles */
349
+ /* Comments Fixed Container Styles */
350
+ .comments-overlay {
351
+ display: none;
352
+ position: fixed;
353
+ top: 0;
354
+ left: 0;
355
+ right: 0;
356
+ bottom: 0;
357
+ background-color: rgba(0, 0, 0, 0.5);
358
+ z-index: 1999;
359
+ }
360
+
361
+ .comments-fixed-container {
362
+ display: none;
363
+ position: fixed;
364
+ bottom: 0;
365
+ left: 0;
366
+ right: 0;
367
+ height: 80%;
368
+ background: white;
369
+ box-shadow: 0 -2px 10px rgba(0, 0, 0, 0.1);
370
+ z-index: 2000;
371
+ transform: translateY(100%);
372
+ transition: transform 0.3s ease-out;
373
+ }
374
+
375
+ .comments-fixed-container.active {
376
+ transform: translateY(0);
377
+ }
378
+
379
+ .comments-content {
380
+ height: 100%;
381
+ display: flex;
382
+ flex-direction: column;
383
+ }
384
+
385
+ .comments-header {
386
+ padding: 16px;
387
+ border-bottom: 1px solid #ddd;
388
+ display: flex;
389
+ justify-content: space-between;
390
+ align-items: center;
391
+ }
392
+
393
+ .comments-header h3 {
394
+ margin: 0;
395
+ text-align: center;
396
+ flex-grow: 1;
397
+ }
398
+
399
+ .close-comments {
400
+ font-size: 24px;
401
+ cursor: pointer;
402
+ color: #666;
403
+ padding: 8px;
404
+ }
405
+
406
+ .comments-list-container {
407
+ flex-grow: 1;
408
+ overflow-y: auto;
409
+ padding: 16px;
410
+ }
411
+
412
+ .comments-container {
413
+ flex-grow: 1;
414
+ overflow-y: auto;
415
+ padding: 16px;
416
+ }
417
+
418
+ .comment-input-container {
419
+ padding: 12px;
420
+ border-top: 1px solid #ddd;
421
+ background: white;
422
+ display: flex;
423
+ gap: 8px;
424
+ align-items: flex-start;
425
+ }
426
+
427
+ .comment-input {
428
+ flex: 1;
429
+ padding: 12px;
430
+ border: 1px solid #ddd;
431
+ border-radius: 20px;
432
+ resize: none;
433
+ font-size: 14px;
434
+ direction: rtl;
435
+ }
436
+
437
+ .send-comment-btn {
438
+ background: #4caf50;
439
+ color: white;
440
+ border: none;
441
+ width: 36px;
442
+ height: 36px;
443
+ border-radius: 50%;
444
+ display: flex;
445
+ align-items: center;
446
+ justify-content: center;
447
+ cursor: pointer;
448
+ }
449
+
450
+ .send-comment-btn:hover {
451
+ background: #45a049;
452
+ }
453
+
454
+ .comments-list {
455
+ display: flex;
456
+ flex-direction: column;
457
+ gap: 12px;
458
+ direction: rtl;
459
+ }
460
+
461
+ .comment-item {
462
+ display: flex;
463
+ gap: 8px;
464
+ margin-bottom: 12px;
465
+ align-items: flex-start;
466
+ padding: 0 8px;
467
+ }
468
+
469
+ .comment-user-avatar {
470
+ width: 45px;
471
+ height: 45px;
472
+ flex-shrink: 0;
473
+ margin-left: 8px;
474
+ }
475
+
476
+ .comment-user-avatar img {
477
+ width: 100%;
478
+ height: 100%;
479
+ border-radius: 50%;
480
+ object-fit: cover;
481
+ }
482
+
483
+ .comment-bubble {
484
+ background: #f0f2f5;
485
+ border-radius: 18px;
486
+ padding: 8px 12px;
487
+ flex-grow: 1;
488
+ }
489
+
490
+ .comment-header {
491
+ margin-bottom: 4px;
492
+ }
493
+
494
+ .comment-username {
495
+ font-weight: 600;
496
+ color: #050505;
497
+ font-size: 13px;
498
+ }
499
+
500
+ .comment-content {
501
+ color: #050505;
502
+ font-size: 14px;
503
+ line-height: 1.4;
504
+ word-wrap: break-word;
505
+ }
506
+
507
+ .comment-time {
508
+ font-size: 11px;
509
+ color: #65676b;
510
+ margin-top: 4px;
511
+ }
512
+
513
+ .nested-comments {
514
+ margin-left: 20px;
515
+ }
516
+
517
+ .reply-input-container {
518
+ margin-top: 10px;
519
+ }
520
+
521
+ .reply-text {
522
+ width: 100%;
523
+ padding: 12px;
524
+ border: 1px solid #ddd;
525
+ border-radius: 20px;
526
+ resize: none;
527
+ font-size: 14px;
528
+ direction: rtl;
529
+ }
530
+
531
+ .send-reply-btn {
532
+ margin-top: 5px;
533
+ color: white;
534
+ background-color: blue;
535
+ border: none;
536
+ padding: 5px 10px;
537
+ cursor: pointer;
538
+ }
539
+
540
+ /* Reply Modal Styles */
541
+ .reply-overlay {
542
+ display: none;
543
+ position: fixed;
544
+ top: 0;
545
+ left: 0;
546
+ right: 0;
547
+ bottom: 0;
548
+ background-color: rgba(0, 0, 0, 0.5);
549
+ z-index: 2001;
550
+ }
551
+
552
+ .reply-fixed-container {
553
+ display: none;
554
+ position: fixed;
555
+ bottom: 0;
556
+ left: 0;
557
+ right: 0;
558
+ height: 30%;
559
+ background: white;
560
+ box-shadow: 0 -2px 10px rgba(0, 0, 0, 0.1);
561
+ z-index: 2002;
562
+ transform: translateY(100%);
563
+ transition: transform 0.3s ease-out;
564
+ }
565
+
566
+ .reply-fixed-container.active {
567
+ transform: translateY(0);
568
+ }
569
+
570
+ .reply-content {
571
+ height: 100%;
572
+ display: flex;
573
+ flex-direction: column;
574
+ }
575
+
576
+ .reply-header {
577
+ padding: 16px;
578
+ border-bottom: 1px solid #ddd;
579
+ display: flex;
580
+ justify-content: space-between;
581
+ align-items: center;
582
+ }
583
+
584
+ .reply-header h3 {
585
+ margin: 0;
586
+ text-align: center;
587
+ flex-grow: 1;
588
+ }
589
+
590
+ .close-reply {
591
+ font-size: 24px;
592
+ cursor: pointer;
593
+ color: #666;
594
+ padding: 8px;
595
+ }
596
+
597
+ .reply-input-container {
598
+ padding: 12px;
599
+ border-top: 1px solid #ddd;
600
+ background: white;
601
+ display: flex;
602
+ gap: 8px;
603
+ align-items: flex-start;
604
+ }
605
+
606
+ .reply-input {
607
+ flex: 1;
608
+ padding: 12px;
609
+ border: 1px solid #ddd;
610
+ border-radius: 20px;
611
+ resize: none;
612
+ font-size: 14px;
613
+ direction: rtl;
614
+ }
615
+
616
+ .send-reply-btn {
617
+ background: #4caf50;
618
+ color: white;
619
+ border: none;
620
+ width: 36px;
621
+ height: 36px;
622
+ border-radius: 50%;
623
+ display: flex;
624
+ align-items: center;
625
+ justify-content: center;
626
+ cursor: pointer;
627
+
628
+ }
629
+ .reply-btn{
630
+ color: blue;
631
+ cursor: pointer;
632
+ margin-right: 82%;
633
+ transform: translate(0%, -18px);
634
+ }
635
+
636
+ .send-reply-btn:hover {
637
+ background: #45a049;
638
+ }
639
+
640
+ /* أزرار جديدة */
641
+ .create-post-btn {
642
+ background-color: #fff;
643
+ color: #4caf50;
644
+ border: none;
645
+ padding: 8px 16px;
646
+ border-radius: 20px;
647
+ cursor: pointer;
648
+ font-size: 14px;
649
+ display: flex;
650
+ align-items: center;
651
+ gap: 8px;
652
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
653
+ }
654
+
655
+ .create-post-btn:hover {
656
+ background-color: #f0f2f5;
657
+ }
658
+
659
+ /* نافذة المنشور */
660
+ .post-modal {
661
+ display: none;
662
+ position: fixed;
663
+ top: 0;
664
+ left: 0;
665
+ width: 100%;
666
+ height: 100%;
667
+ z-index: 1000;
668
+ }
669
+
670
+ .modal-overlay {
671
+ position: absolute;
672
+ width: 100%;
673
+ height: 100%;
674
+ background-color: rgba(0, 0, 0, 0.5);
675
+ }
676
+ /*
677
+ .modal-content {
678
+ position: relative;
679
+ width: 90%;
680
+ max-width: 700px;
681
+ height: 80%;
682
+ background: white;
683
+ margin: 50px auto;
684
+ border-radius: 8px;
685
+ overflow: hidden;
686
+ box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
687
+ } */
688
+
689
+ .modal-header {
690
+ padding: 15px;
691
+ border-bottom: 1px solid #ddd;
692
+ display: flex;
693
+ justify-content: space-between;
694
+ align-items: center;
695
+ }
696
+
697
+ .close-modal {
698
+ font-size: 24px;
699
+ cursor: pointer;
700
+ color: #666;
701
+ }
702
+
703
+ .modal-content iframe {
704
+ width: 100%;
705
+ height: calc(100% - 60px);
706
+ border: none;
707
+ }
708
+
709
+ .modal-header h3 {
710
+ margin: 0;
711
+ text-align: center;
712
+ flex-grow: 1;
713
+ }
714
+
715
+ /* إعدادات عامة للـ iframe */
716
+ #chatFrame {
717
+ position: fixed; /* يجعل الـ iframe في مكان ثابت فوق الصفحة */
718
+ top: 0;
719
+ left: 0;
720
+ width: 100%;
721
+ height: 100%;
722
+ background-color: white; /* يمكنك تعديل اللون أو وضع صورة خلفية */
723
+ border: none; /* إزالة الحدود حول الـ iframe */
724
+ z-index: 9999; /* تعيين z-index عالٍ لجعل الـ iframe يظهر فوق كل العناصر الأخرى */
725
+ display: none; /* إخفاء الـ iframe في البداية */
726
+ }
727
+
728
+ /* زر الإغلاق */
729
+ #closeChatFrame {
730
+ position: absolute;
731
+ top: 10px;
732
+ right: 10px;
733
+ background-color: red;
734
+ color: white;
735
+ padding: 10px;
736
+ border: none;
737
+ cursor: pointer;
738
+ z-index: 10000; /* يجب أن يكون الزر فوق الـ iframe */
739
+ font-size: 16px;
740
+ display: none;
741
+ }
742
+
743
+ #closeChatFrame:hover {
744
+ background-color: darkred;
745
+
746
+ }
747
+
748
+ </style>
749
+
750
+ <script>
751
+ // إضافة كود جافا سكريبت للنافذة المنبثقة
752
+ const createPostBtn = document.getElementById("createPostBtn");
753
+ const postModal = document.getElementById("postModal");
754
+ const closeModal = document.querySelector(".close-modal");
755
+ const modalOverlay = document.querySelector(".modal-overlay");
756
+
757
+ createPostBtn.addEventListener("click", () => {
758
+ postModal.style.display = "block";
759
+ document.body.style.overflow = "hidden"; // منع التمرير في الخلفية
760
+ });
761
+
762
+ function closePostModal() {
763
+ postModal.style.display = "none";
764
+ document.body.style.overflow = "auto"; // إعادة تمكين التمرير
765
+ }
766
+
767
+ closeModal.addEventListener("click", closePostModal);
768
+ modalOverlay.addEventListener("click", closePostModal);
769
+ </script>
770
+
771
+ <!-- عرض المنشورات -->
772
+ <div class="posts-container">
773
+ {% for post in posts %}
774
+ <div class="post-card">
775
+ <div class="post-header">
776
+ <div class="profile-circle">
777
+ <a href="{{ url_for('public_profile', user_email=post.user_email) }}" class="public-profile-link">
778
+ <img src="{{ url_for('static', filename=post_authors[post.user_email]) }}" alt="صورة الملف الشخصي" />
779
+ </a>
780
+ </div>
781
+
782
+ <div class="user-info">
783
+ <span class="username">{{ post.user_email.split('@')[0] }}</span>
784
+ <span class="profession">{{ post.user_profession }}</span>
785
+ <span class="timestamp">{{ post.created_at|format_datetime }}</span>
786
+ </div>
787
+ {% if post.user_email == current_user.email %}
788
+ <div class="post-menu">
789
+ <i class="fas fa-ellipsis-v menu-dots"></i>
790
+ </div>
791
+ {% endif %}
792
+ </div>
793
+
794
+ <div
795
+ class="post-content"
796
+ {%
797
+ if
798
+ post.background_color
799
+ and
800
+ not
801
+ post.image_url
802
+ %}style="background-color: {{ post.background_color }}; border-radius: 8px; text-align: center; font-size: 24px;"
803
+ {%
804
+ endif
805
+ %}
806
+ >
807
+ {% if post.title %}
808
+ <h3 class="post-title">{{ post.title }}</h3>
809
+ {% endif %} {% if post.content %}
810
+ <div class="post-text-container">
811
+ <p
812
+ class="post-text collapsed"
813
+ {%
814
+ if
815
+ post.background_color
816
+ and
817
+ not
818
+ post.image_url
819
+ %}style="color: {% if post.background_color == '#ffffff' %}#1a1a1a{% else %}#000000{% endif %};"
820
+ {%
821
+ endif
822
+ %}
823
+ >
824
+ {{ post.content }}
825
+ </p>
826
+ <button class="see-more-btn">إظهار المزيد</button>
827
+ </div>
828
+ {% endif %} {% if post.image_url %}
829
+ <div class="post-media">
830
+ <img
831
+ src="{{ url_for('static', filename=post.image_url) }}"
832
+ alt="صورة المنشور"
833
+ />
834
+ </div>
835
+ {% endif %} {% if post.video_url %}
836
+ <div class="post-media video-container">
837
+ <video
838
+ src="{{ url_for('static', filename=post.video_url) }}"
839
+ controls
840
+ ></video>
841
+ </div>
842
+ {% endif %}
843
+ </div>
844
+
845
+ <div class="post-actions">
846
+ <button class="action-btn comment-btn" data-post-id="{{ post.id }}">
847
+ <i class="fas fa-comment"></i> تعليق
848
+ </button>
849
+ <button class="action-btn share-btn" data-post-id="{{ post.id }}">
850
+ <i class="fas fa-share"></i> مشاركة
851
+ </button>
852
+ </div>
853
+
854
+ <!-- قسم التعليقات -->
855
+ <div
856
+ class="comments-section"
857
+ data-post-id="{{ post.id }}"
858
+ style="display: none"
859
+ >
860
+ <div class="comment-input-container">
861
+ <textarea
862
+ class="comment-input"
863
+ placeholder="اكتب تعليقك هنا..."
864
+ rows="1"
865
+ ></textarea>
866
+ <button class="send-comment-btn">
867
+ <i class="fas fa-paper-plane"></i>
868
+ </button>
869
+ </div>
870
+ <div class="comments-list"></div>
871
+ </div>
872
+ </div>
873
+ {% endfor %}
874
+ </div>
875
+
876
+
877
+
878
+ <!-- Modal لعرض المنشور -->
879
+ <div class="post-view-modal" id="postViewModal" style="{% if show_post_modal %}display: block;{% else %}display: none;{% endif %}">
880
+ <div class="modal-overlay"></div>
881
+ <div class="modal-content">
882
+ <div class="modal-header">
883
+ <span class="close-modal">&times;</span>
884
+ <h3>عرض المنشور</h3>
885
+ </div>
886
+ <div class="post-content">
887
+ {% if post %}
888
+ <div class="post-header">
889
+ <div class="profile-circle">
890
+ <a href="{{ url_for('public_profile', user_email=post.user_email) }}">
891
+ <img src="{{ url_for('static', filename=post_authors[post.user_email]) }}" alt="صورة الملف الشخصي" />
892
+ </a>
893
+ </div>
894
+ <div class="user-info">
895
+ <span class="username">{{ post.user_email.split('@')[0] }}</span>
896
+ <span class="profession">{{ post.user_profession }}</span>
897
+ <span class="timestamp">{{ post.created_at|format_datetime }}</span>
898
+ </div>
899
+ {% if post.user_email == current_user.email %}
900
+ <div class="post-menu">
901
+ <i class="fas fa-ellipsis-v menu-dots"></i>
902
+ <div class="menu-options" style="display: none;">
903
+ <div class="menu-option edit-post" data-post-id="{{ post.id }}">
904
+ <i class="fas fa-edit"></i> تعديل المنشور
905
+ </div>
906
+ <div class="menu-option delete-post" data-post-id="{{ post.id }}">
907
+ <i class="fas fa-trash"></i> حذف المنشور
908
+ </div>
909
+ </div>
910
+ </div>
911
+ {% endif %}
912
+ </div>
913
+
914
+ <div
915
+ class="post-content-box"
916
+ {% if post.background_color and not post.image_url %}
917
+ style="background-color: {{ post.background_color }}; border-radius: 8px; text-align: center; font-size: 24px;"
918
+ {% endif %}
919
+ >
920
+ <div class="post-text-container">
921
+ <p
922
+ class="post-text collapsed"
923
+ {% if post.background_color and not post.image_url %}
924
+ style="color: {% if post.background_color == '#ffffff' %}#1a1a1a{% else %}#000000{% endif %};"
925
+ {% endif %}
926
+ >
927
+ {{ post.content }}
928
+ </p>
929
+ <button class="see-more-btn">إظهار المزيد</button>
930
+ </div>
931
+ </div>
932
+
933
+ {% if post.image_url %}
934
+ <div class="post-media">
935
+ <img src="{{ url_for('static', filename=post.image_url) }}" alt="صورة المنشور">
936
+ </div>
937
+ {% endif %}
938
+
939
+ {% if post.video_url %}
940
+ <div class="post-media video-container">
941
+ <video src="{{ url_for('static', filename=post.video_url) }}" controls></video>
942
+ </div>
943
+ {% endif %}
944
+
945
+ <!-- أزرار الإجراءات -->
946
+ <div class="post-actions">
947
+ <button class="action-btn comment-btn" data-post-id="{{ post.id }}">
948
+ <i class="fas fa-comment"></i> تعليق
949
+ </button>
950
+ <button class="action-btn share-btn" data-post-id="{{ post.id }}">
951
+ <i class="fas fa-share"></i> مشاركة
952
+ </button>
953
+ </div>
954
+
955
+ <!-- قسم التعليقات -->
956
+ <div class="comments-section" data-post-id="{{ post.id }}" style="display: none">
957
+ <div class="comment-input-container">
958
+ <textarea class="comment-input" placeholder="اكتب تعليقك هنا..." rows="1"></textarea>
959
+ <button class="send-comment-btn">
960
+ <i class="fas fa-paper-plane"></i>
961
+ </button>
962
+ </div>
963
+ <div class="comments-list"></div>
964
+ </div>
965
+ {% endif %}
966
+ </div>
967
+ </div>
968
+ </div>
969
+
970
+
971
+ <!-- Modal لتعديل المنشور -->
972
+ <div class="edit-modal" id="editModal" style="display: none;">
973
+ <div class="edit-modal-content">
974
+ <h3>تعديل المنشور</h3>
975
+ <textarea id="editContentInput" placeholder="أدخل محتوى المنشور" rows="5"></textarea>
976
+ <div class="edit-modal-buttons">
977
+ <button class="save-btn" id="saveEditBtn">حفظ</button>
978
+ <button class="cancel-btn" id="cancelEditBtn">إلغاء</button>
979
+ </div>
980
+ </div>
981
+ </div>
982
+
983
+
984
+ <!-- Modal لحذف المنشور -->
985
+ <div class="delete-modal" id="deleteModal" style="display: none;">
986
+ <div class="delete-modal-content">
987
+ <h3>تأكيد الحذف</h3>
988
+ <p>هل أنت متأكد من حذف هذا المنشور؟</p>
989
+ <div class="delete-modal-buttons">
990
+ <button class="confirm-delete" id="confirmDeleteBtn">حذف</button>
991
+ <button class="cancel-delete" id="cancelDeleteBtn">إلغاء</button>
992
+ </div>
993
+ </div>
994
+ </div>
995
+
996
+
997
+
998
+ <!-- حاوية الملف الشخصي العام -->
999
+ <div id="public-profile-container">
1000
+ <div id="public-profile-header">
1001
+ <button id="close-public-profile-btn">✕</button>
1002
+ </div>
1003
+ <iframe id="public-profile-iframe"></iframe>
1004
+ </div>
1005
+
1006
+
1007
+ <style>
1008
+ .posts-container {
1009
+ max-width: 600px;
1010
+ margin: 80px auto 20px;
1011
+ padding: 0 15px;
1012
+ }
1013
+
1014
+ .post-card {
1015
+ background: #fff;
1016
+ border-radius: 8px;
1017
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
1018
+ margin-bottom: 20px;
1019
+ }
1020
+
1021
+ .post-header {
1022
+ display: flex;
1023
+ align-items: center;
1024
+ padding: 12px;
1025
+ }
1026
+
1027
+ .post-content {
1028
+ padding: 12px;
1029
+ }
1030
+
1031
+ .post-title {
1032
+ margin: 0 0 8px 0;
1033
+ font-size: 18px;
1034
+ text-align: right;
1035
+ }
1036
+
1037
+ .post-text-container {
1038
+ position: relative;
1039
+ }
1040
+
1041
+ .post-content-box {
1042
+ background: #f8f9fa;
1043
+ border-radius: 8px;
1044
+ padding: 12px;
1045
+ margin-bottom: 10px;
1046
+ }
1047
+
1048
+ .post-text {
1049
+ margin: 0;
1050
+ color: #1a1a1a;
1051
+ line-height: 1.6;
1052
+ text-align: right;
1053
+ word-wrap: break-word;
1054
+ position: relative;
1055
+ direction: rtl;
1056
+ font-size: 16px;
1057
+ }
1058
+
1059
+ .post-text p {
1060
+ margin: 0;
1061
+ padding: 8px 0;
1062
+ line-height: inherit;
1063
+ white-space: pre-wrap;
1064
+ }
1065
+
1066
+ .post-text.collapsed {
1067
+ display: -webkit-box;
1068
+ -webkit-line-clamp: 4;
1069
+ -webkit-box-orient: vertical;
1070
+ overflow: hidden;
1071
+ max-height: calc(1.6em * 4); /* 4 lines maximum height */
1072
+ position: relative;
1073
+ }
1074
+
1075
+ .post-text.expanded {
1076
+ display: block;
1077
+ max-height: none;
1078
+ }
1079
+
1080
+ .post-text p:first-child {
1081
+ padding-top: 0;
1082
+ }
1083
+
1084
+ .post-text p:last-child {
1085
+ padding-bottom: 0;
1086
+ }
1087
+
1088
+ .post-text p:empty {
1089
+ min-height: 1.6em;
1090
+ display: block;
1091
+ margin: 4px 0;
1092
+ }
1093
+
1094
+ .see-more-btn {
1095
+ color: #1877f2;
1096
+ cursor: pointer;
1097
+ font-weight: 500;
1098
+ margin-top: 8px;
1099
+ display: none;
1100
+ background: none;
1101
+ border: none;
1102
+ padding: 0;
1103
+ text-align: right;
1104
+ width: 100%;
1105
+ }
1106
+
1107
+ .post-media {
1108
+ margin-top: 10px;
1109
+ border-radius: 8px;
1110
+ overflow: hidden;
1111
+ }
1112
+
1113
+ .post-media img {
1114
+ /* width: 400px; */
1115
+ /* height: 400px; */
1116
+ max-width: 100%;
1117
+ display: block;
1118
+ /* border-radius: 50%; */
1119
+ object-fit: cover;
1120
+ margin: 0 auto;
1121
+ }
1122
+
1123
+ .video-container {
1124
+ position: relative;
1125
+ padding-bottom: 56.25%; /* 16:9 نسبة العرض للفيديو */
1126
+ height: 0;
1127
+ overflow: hidden;
1128
+ }
1129
+
1130
+ .video-container video {
1131
+ position: absolute;
1132
+ top: 0;
1133
+ right: 0;
1134
+ width: 100%;
1135
+ height: 100%;
1136
+ object-fit: cover;
1137
+ }
1138
+
1139
+ .post-actions {
1140
+ display: flex;
1141
+ justify-content: space-around;
1142
+ padding: 8px;
1143
+ border-top: 1px solid #ddd;
1144
+ }
1145
+
1146
+ .action-btn {
1147
+ background: none;
1148
+ border: none;
1149
+ padding: 8px;
1150
+ color: #65676b;
1151
+ cursor: pointer;
1152
+ font-size: 14px;
1153
+ display: flex;
1154
+ align-items: center;
1155
+ gap: 5px;
1156
+ }
1157
+
1158
+ .action-btn:hover {
1159
+ background: #f0f2f5;
1160
+ border-radius: 4px;
1161
+ }
1162
+
1163
+ .action-btn i {
1164
+ font-size: 16px;
1165
+ }
1166
+
1167
+ .user-info {
1168
+ display: flex;
1169
+ flex-direction: column;
1170
+ margin-right: 10px;
1171
+ margin-left: 10px;
1172
+ }
1173
+
1174
+ .timestamp {
1175
+ font-size: 12px;
1176
+ color: #65676b;
1177
+ margin-top: 2px;
1178
+ }
1179
+
1180
+ .profession {
1181
+ font-size: 12px;
1182
+ color: #4caf50;
1183
+ margin-top: 2px;
1184
+ }
1185
+
1186
+ /* Post Menu Styles */
1187
+ .post-menu {
1188
+ position: relative;
1189
+ margin-right: auto;
1190
+ padding: 8px;
1191
+ }
1192
+
1193
+ .menu-dots {
1194
+ cursor: pointer;
1195
+ color: #65676b;
1196
+ padding: 8px;
1197
+ border-radius: 50%;
1198
+ width: 32px;
1199
+ height: 32px;
1200
+ display: flex;
1201
+ align-items: center;
1202
+ justify-content: center;
1203
+ }
1204
+
1205
+ .menu-dots:hover {
1206
+ background-color: #f0f2f5;
1207
+ }
1208
+
1209
+ .post-menu-modal {
1210
+ display: none;
1211
+ position: fixed;
1212
+ top: 0;
1213
+ left: 0;
1214
+ right: 0;
1215
+ bottom: 0;
1216
+ background-color: rgba(0, 0, 0, 0.5);
1217
+ z-index: 2000;
1218
+ display: flex;
1219
+ justify-content: center;
1220
+ align-items: center;
1221
+ }
1222
+
1223
+ .menu-options {
1224
+ background: white;
1225
+ border-radius: 8px;
1226
+ width: 90%;
1227
+ max-width: 300px;
1228
+ overflow: hidden;
1229
+ }
1230
+
1231
+ .menu-option {
1232
+ padding: 16px;
1233
+ cursor: pointer;
1234
+ color: #050505;
1235
+ display: flex;
1236
+ align-items: center;
1237
+ gap: 8px;
1238
+ transition: background-color 0.2s;
1239
+ font-size: 16px;
1240
+ justify-content: center;
1241
+ border-bottom: 1px solid #eee;
1242
+ }
1243
+
1244
+ .menu-option:last-child {
1245
+ border-bottom: none;
1246
+ }
1247
+
1248
+ .menu-option:hover {
1249
+ background-color: #f0f2f5;
1250
+ }
1251
+
1252
+ .menu-option i {
1253
+ font-size: 18px;
1254
+ }
1255
+
1256
+ .delete-post {
1257
+ color: #dc3545;
1258
+ }
1259
+
1260
+ .post-header {
1261
+ position: relative;
1262
+ }
1263
+
1264
+ .replies-toggle {
1265
+ margin-top: 5px;
1266
+ font-size: 14px;
1267
+ display: flex;
1268
+ align-items: center;
1269
+ }
1270
+
1271
+ .replies-toggle i {
1272
+ margin-right: 5px;
1273
+ }
1274
+
1275
+ .nested-comments {
1276
+ margin-left: 20px;
1277
+ border-left: 1px solid #ddd;
1278
+ padding-left: 10px;
1279
+ }
1280
+
1281
+
1282
+
1283
+ /* Post View Modal Styles */
1284
+ .post-view-modal {
1285
+ display: none;
1286
+ position: fixed;
1287
+ top: 0;
1288
+ left: 0;
1289
+ width: 100%;
1290
+ height: 100%;
1291
+ z-index: 1000;
1292
+ }
1293
+
1294
+ .modal-overlay {
1295
+ position: absolute;
1296
+ width: 100%;
1297
+ height: 100%;
1298
+ background-color: rgba(0, 0, 0, 0.5);
1299
+ }
1300
+
1301
+ .modal-content {
1302
+ position: relative;
1303
+ width: 90%;
1304
+ max-width: 700px;
1305
+ height: 80%;
1306
+ background: white;
1307
+ margin: 50px auto;
1308
+ border-radius: 8px;
1309
+ overflow-y: auto;
1310
+ box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
1311
+ }
1312
+
1313
+ .modal-header {
1314
+ padding: 15px;
1315
+ border-bottom: 1px solid #ddd;
1316
+ display: flex;
1317
+ justify-content: space-between;
1318
+ align-items: center;
1319
+ }
1320
+
1321
+ .close-modal {
1322
+ font-size: 24px;
1323
+ cursor: pointer;
1324
+ color: #666;
1325
+ }
1326
+
1327
+ .post-content {
1328
+ padding: 15px;
1329
+ }
1330
+
1331
+
1332
+
1333
+ /* تنسيقات modal التعديل */
1334
+ .edit-modal {
1335
+ display: none; /* مخفي بشكل افتراضي */
1336
+ position: fixed;
1337
+ top: 50%;
1338
+ left: 50%;
1339
+ transform: translate(-50%, -50%);
1340
+ background-color: white;
1341
+ padding: 20px;
1342
+ border-radius: 8px;
1343
+ box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
1344
+ z-index: 2000; /* أعلى من modal عرض المنشور */
1345
+ width: 90%;
1346
+ max-width: 500px;
1347
+ }
1348
+
1349
+ .edit-modal-content {
1350
+ display: flex;
1351
+ flex-direction: column;
1352
+ gap: 15px;
1353
+ }
1354
+
1355
+ .edit-modal textarea {
1356
+ width: 100%;
1357
+ padding: 10px;
1358
+ border: 1px solid #ddd;
1359
+ border-radius: 4px;
1360
+ resize: vertical;
1361
+ min-height: 150px;
1362
+ font-size: 16px;
1363
+ direction: rtl;
1364
+ }
1365
+
1366
+ .edit-modal-buttons {
1367
+ display: flex;
1368
+ justify-content: flex-end;
1369
+ gap: 10px;
1370
+ }
1371
+
1372
+ .edit-modal-buttons button {
1373
+ padding: 8px 16px;
1374
+ border: none;
1375
+ border-radius: 4px;
1376
+ cursor: pointer;
1377
+ font-size: 14px;
1378
+ }
1379
+
1380
+ .edit-modal-buttons .save-btn {
1381
+ background-color: #4caf50;
1382
+ color: white;
1383
+ }
1384
+
1385
+ .edit-modal-buttons .cancel-btn {
1386
+ background-color: #f44336;
1387
+ color: white;
1388
+ }
1389
+
1390
+ /* Post Menu Styles */
1391
+ .post-menu {
1392
+ position: relative;
1393
+ margin-right: auto;
1394
+ padding: 8px;
1395
+ }
1396
+
1397
+ .menu-dots {
1398
+ cursor: pointer;
1399
+ color: #65676b;
1400
+ padding: 8px;
1401
+ border-radius: 50%;
1402
+ }
1403
+
1404
+ .menu-dots:hover {
1405
+ background-color: #f0f2f5;
1406
+ }
1407
+
1408
+ .menu-options {
1409
+ display: none;
1410
+ position: absolute;
1411
+ left: 0;
1412
+ top: 100%;
1413
+ background: white;
1414
+ border-radius: 8px;
1415
+ box-shadow: 0 2px 4px rgba(0,0,0,0.1);
1416
+ z-index: 1000;
1417
+ min-width: 150px;
1418
+ }
1419
+
1420
+ .menu-option {
1421
+ padding: 8px 16px;
1422
+ cursor: pointer;
1423
+ color: #050505;
1424
+ display: flex;
1425
+ align-items: center;
1426
+ gap: 8px;
1427
+ }
1428
+
1429
+ .menu-option:hover {
1430
+ background-color: #f0f2f5;
1431
+ }
1432
+
1433
+ .menu-option i {
1434
+ font-size: 16px;
1435
+ width: 20px;
1436
+ }
1437
+
1438
+ .delete-post {
1439
+ color: #dc3545;
1440
+ }
1441
+
1442
+
1443
+ /* تنسيقات modal الحذف */
1444
+ .delete-modal {
1445
+ display: none; /* مخفي بشكل افتراضي */
1446
+ position: fixed;
1447
+ top: 50%;
1448
+ left: 50%;
1449
+ transform: translate(-50%, -50%);
1450
+ background-color: white;
1451
+ padding: 20px;
1452
+ border-radius: 8px;
1453
+ box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
1454
+ z-index: 2000; /* أعلى من modal عرض المنشور */
1455
+ width: 90%;
1456
+ max-width: 500px;
1457
+ }
1458
+
1459
+ .delete-modal-content {
1460
+ display: flex;
1461
+ flex-direction: column;
1462
+ gap: 15px;
1463
+ }
1464
+
1465
+ .delete-modal-buttons {
1466
+ display: flex;
1467
+ justify-content: flex-end;
1468
+ gap: 10px;
1469
+ }
1470
+
1471
+ .delete-modal-buttons button {
1472
+ padding: 8px 16px;
1473
+ border: none;
1474
+ border-radius: 4px;
1475
+ cursor: pointer;
1476
+ font-size: 14px;
1477
+ }
1478
+
1479
+ .delete-modal-buttons .confirm-delete {
1480
+ background-color: #dc3545;
1481
+ color: white;
1482
+ }
1483
+
1484
+ .delete-modal-buttons .cancel-delete {
1485
+ background-color: #f0f2f5;
1486
+ color: #050505;
1487
+ }
1488
+
1489
+ .modal-content{
1490
+ position: relative;
1491
+ width: 100% !important;
1492
+ max-width: 700px;
1493
+ height: 100%;
1494
+ background: white;
1495
+ margin: 0px auto;
1496
+ border-radius: 0px !important;
1497
+ overflow-y: auto;
1498
+ top: 0;
1499
+ box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
1500
+
1501
+
1502
+ }
1503
+
1504
+
1505
+
1506
+ /* تصميم زر الإشعارات */
1507
+ #notification-btn {
1508
+ background-color: #0078ff;
1509
+ color: white;
1510
+ border: none;
1511
+ padding: 10px 15px;
1512
+ border-radius: 5px;
1513
+ cursor: pointer;
1514
+ font-size: 16px;
1515
+ }
1516
+
1517
+ /* تصميم العداد */
1518
+ #notification-count {
1519
+ background-color: red;
1520
+ color: white;
1521
+ border-radius: 50%;
1522
+ padding: 2px 6px;
1523
+ font-size: 12px;
1524
+ margin-left: 5px;
1525
+ }
1526
+
1527
+ /* تصميم قائمة الإشعارات */
1528
+ #notification-list {
1529
+ display: none;
1530
+ position: absolute;
1531
+ left: 0;
1532
+ right: 0;
1533
+ top: 100%;
1534
+ background-color: white;
1535
+ border: 1px solid #ddd;
1536
+ border-radius: 5px;
1537
+ padding: 10px;
1538
+ width: 87%;
1539
+ height: 100%;
1540
+ overflow-y: auto;
1541
+ box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
1542
+ }
1543
+
1544
+ .no-notifications{
1545
+ text-align: center;
1546
+ }
1547
+
1548
+ /* تصميم عنصر الإشعار */
1549
+ .notification-item {
1550
+ display: flex;
1551
+ align-items: center;
1552
+ padding: 10px;
1553
+ border-bottom: 1px solid #ddd;
1554
+ }
1555
+
1556
+ .notification-item img {
1557
+ width: 40px;
1558
+ height: 40px;
1559
+ border-radius: 50%;
1560
+ margin-right: 10px;
1561
+ }
1562
+
1563
+ .notification-item div {
1564
+ flex: 1;
1565
+ }
1566
+
1567
+ .notification-item strong {
1568
+ font-size: 14px;
1569
+ }
1570
+
1571
+ .notification-item p {
1572
+ font-size: 12px;
1573
+ margin: 5px 0;
1574
+ }
1575
+
1576
+ .notification-item small {
1577
+ font-size: 10px;
1578
+ color: #666;
1579
+ }
1580
+
1581
+
1582
+ /* تنسيق زر الشات */
1583
+ /* .chat-button {
1584
+ position: fixed;
1585
+ bottom: 20px;
1586
+ right: 20px;
1587
+ background-color: #007bff;
1588
+ color: white;
1589
+ border: none;
1590
+ border-radius: 50%;
1591
+ width: 60px;
1592
+ height: 60px;
1593
+ font-size: 24px;
1594
+ cursor: pointer;
1595
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
1596
+ } */
1597
+
1598
+ /* تنسيق نافذة الشات */
1599
+ .chat-window {
1600
+ position: fixed;
1601
+ right: 0;
1602
+ left: 0;
1603
+ height: 100%;
1604
+ bottom: 0;
1605
+ background-color: #fff;
1606
+ border: 1px solid #ddd;
1607
+ border-radius: 10px;
1608
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
1609
+ overflow-y: auto;
1610
+ z-index: 1000;
1611
+ display: none;
1612
+ }
1613
+
1614
+ .chat-window .chat-header {
1615
+ padding: 10px;
1616
+ background-color: #007bff;
1617
+ color: white;
1618
+ font-size: 18px;
1619
+ font-weight: bold;
1620
+ text-align: center;
1621
+ border-top-left-radius: 10px;
1622
+ border-top-right-radius: 10px;
1623
+ }
1624
+
1625
+ .chat-window .chat-item {
1626
+ display: flex;
1627
+ align-items: center;
1628
+ padding: 10px;
1629
+ border-bottom: 1px solid #ddd;
1630
+ cursor: pointer;
1631
+ }
1632
+
1633
+ .chat-window .chat-item img {
1634
+ width: 40px;
1635
+ height: 40px;
1636
+ border-radius: 50%;
1637
+ margin-right: 10px;
1638
+ }
1639
+
1640
+ .chat-window .chat-item:hover {
1641
+ background-color: #f1f1f1;
1642
+ }
1643
+
1644
+ .no-chats {
1645
+ padding: 10px;
1646
+ text-align: center;
1647
+ color: #666;
1648
+ }
1649
+
1650
+ .close-main-chat{
1651
+ position: absolute;
1652
+ right: 5px;
1653
+ }
1654
+
1655
+
1656
+
1657
+ /* الأسلوب العام للموديل */
1658
+ .modal-search {
1659
+ display: none; /* الموديل مخفي بشكل افتراضي */
1660
+ position: fixed;
1661
+ z-index: 1;
1662
+ left: 0;
1663
+ top: 0;
1664
+ width: 100%;
1665
+ height: 100%;
1666
+ overflow: auto;
1667
+ background-color: rgba(0,0,0,0.4);
1668
+ }
1669
+
1670
+ /* محتوى الموديل */
1671
+ .modal-search-content {
1672
+ background-color: #fefefe;
1673
+ margin: 15% auto;
1674
+ padding: 20px;
1675
+ border: 1px solid #888;
1676
+ width: 80%;
1677
+ max-width: 500px;
1678
+ }
1679
+
1680
+ /* زر إغلاق الموديل */
1681
+ .close-search-modal {
1682
+ color: #aaa;
1683
+ float: right;
1684
+ font-size: 28px;
1685
+ font-weight: bold;
1686
+ }
1687
+
1688
+ .close-search-modal:hover,
1689
+ .close-search-modal:focus {
1690
+ color: black;
1691
+ text-decoration: none;
1692
+ cursor: pointer;
1693
+ }
1694
+
1695
+ /* تنسيق نتائج البحث */
1696
+ .search-results {
1697
+ margin-top: 10px;
1698
+ }
1699
+
1700
+ .search-result {
1701
+ padding: 8px;
1702
+ margin: 5px;
1703
+ cursor: pointer;
1704
+ }
1705
+
1706
+ .search-result:hover {
1707
+ background-color: #f0f0f0;
1708
+ }
1709
+
1710
+ .profile-img {
1711
+ width: 30px;
1712
+ height: 30px;
1713
+ border-radius: 50%;
1714
+ margin-right: 10px;
1715
+ }
1716
+
1717
+ .search-btn {
1718
+ padding: 8px 12px;
1719
+ background-color: #007BFF;
1720
+ color: white;
1721
+ border: none;
1722
+ cursor: pointer;
1723
+ }
1724
+
1725
+ .search-btn:hover {
1726
+ background-color: #0056b3;
1727
+ }
1728
+
1729
+ .search-input {
1730
+ width: 100%;
1731
+ padding: 10px;
1732
+ margin: 10px 0;
1733
+ border: 1px solid #ccc;
1734
+ border-radius: 4px;
1735
+ }
1736
+
1737
+ /* النمط الأساسي لـ profile-container */
1738
+ #profile-container {
1739
+ display: none; /* مخفي في البداية */
1740
+ position: fixed;
1741
+ top: 0;
1742
+ left: 0;
1743
+ width: 100%;
1744
+ height: 100%;
1745
+ background-color: rgba(0, 0, 0, 0.5); /* خلفية شفافة */
1746
+ z-index: 1000;
1747
+ }
1748
+
1749
+ /* محتوى iframe */
1750
+ #profile-iframe {
1751
+ width: 100%;
1752
+ height: 100%;
1753
+ border: none;
1754
+ }
1755
+
1756
+ /* رأس الحاوية مع زر الإغلاق */
1757
+ #profile-header {
1758
+ position: absolute;
1759
+ top: 0;
1760
+ right: 0;
1761
+ width: fit-content;
1762
+ background-color: #f1f1f1;
1763
+ padding: 10px;
1764
+ box-sizing: border-box;
1765
+ z-index: 1001;
1766
+ }
1767
+
1768
+ #close-profile-btn {
1769
+ background-color: transparent;
1770
+ border: none;
1771
+ font-size: 24px;
1772
+ cursor: pointer;
1773
+ float: left;
1774
+ }
1775
+
1776
+ /* الأنيميشن */
1777
+ @keyframes fadeIn {
1778
+ from { opacity: 0; }
1779
+ to { opacity: 1; }
1780
+ }
1781
+
1782
+ @keyframes slideIn {
1783
+ from { transform: translateY(100%); }
1784
+ to { transform: translateY(0); }
1785
+ }
1786
+
1787
+ @keyframes fadeOut {
1788
+ from { opacity: 1; }
1789
+ to { opacity: 0; }
1790
+ }
1791
+
1792
+ @keyframes slideOut {
1793
+ from { transform: translateY(0); }
1794
+ to { transform: translateY(100%); }
1795
+ }
1796
+
1797
+ #profile-container.show {
1798
+ display: block;
1799
+ animation: fadeIn 0.5s, slideIn 0.5s;
1800
+ }
1801
+
1802
+ #profile-container.hide {
1803
+ animation: fadeOut 0.5s, slideOut 0.5s;
1804
+ }
1805
+
1806
+
1807
+
1808
+
1809
+
1810
+ /* النمط الأساسي لـ public-profile-container */
1811
+ #public-profile-container {
1812
+ display: none; /* مخفي في البداية */
1813
+ position: fixed;
1814
+ top: 0;
1815
+ left: 0;
1816
+ width: 100%;
1817
+ height: 100%;
1818
+ background-color: rgba(0, 0, 0, 0.5); /* خلفية شفافة */
1819
+ z-index: 1000;
1820
+ }
1821
+
1822
+ /* محتوى iframe */
1823
+ #public-profile-iframe {
1824
+ width: 100%;
1825
+ height: 100%;
1826
+ border: none;
1827
+ }
1828
+
1829
+ /* رأس الحاوية مع زر الإغلاق */
1830
+ #public-profile-header {
1831
+ position: absolute;
1832
+ top: 0;
1833
+ left: 0;
1834
+ width: fit-content;
1835
+ background-color: #f1f1f1;
1836
+ padding: 10px;
1837
+ box-sizing: border-box;
1838
+ z-index: 1001;
1839
+ }
1840
+
1841
+ #close-public-profile-btn {
1842
+ background-color: transparent;
1843
+ border: none;
1844
+ font-size: 24px;
1845
+ cursor: pointer;
1846
+ float: left;
1847
+ }
1848
+
1849
+ /* الأنيميشن */
1850
+ @keyframes fadeIn {
1851
+ from { opacity: 0; }
1852
+ to { opacity: 1; }
1853
+ }
1854
+
1855
+ @keyframes slideIn {
1856
+ from { transform: translateY(100%); }
1857
+ to { transform: translateY(0); }
1858
+ }
1859
+
1860
+ @keyframes fadeOut {
1861
+ from { opacity: 1; }
1862
+ to { opacity: 0; }
1863
+ }
1864
+
1865
+ @keyframes slideOut {
1866
+ from { transform: translateY(0); }
1867
+ to { transform: translateY(100%); }
1868
+ }
1869
+
1870
+ #public-profile-container.show {
1871
+ display: block;
1872
+ animation: fadeIn 0.5s, slideIn 0.5s;
1873
+ }
1874
+
1875
+ #public-profile-container.hide {
1876
+ animation: fadeOut 0.5s, slideOut 0.5s;
1877
+ }
1878
+
1879
+
1880
+
1881
+ /* الأنيميشن فتح المقالات*/
1882
+ @keyframes articalFadeIn {
1883
+ from { opacity: 0; }
1884
+ to { opacity: 1; }
1885
+ }
1886
+
1887
+ @keyframes articalSlideIn {
1888
+ from { transform: translateY(100%); }
1889
+ to { transform: translateY(0); }
1890
+ }
1891
+
1892
+ @keyframes articalFadeOut {
1893
+ from { opacity: 1; }
1894
+ to { opacity: 0; }
1895
+ }
1896
+
1897
+ @keyframes articalSlideOut {
1898
+ from { transform: translateY(0); }
1899
+ to { transform: translateY(100%); }
1900
+ }
1901
+
1902
+ /* إعدادات iframe */
1903
+ #artical-iframe-container {
1904
+ display: none;
1905
+ position: fixed;
1906
+ bottom: 0;
1907
+ left: 0;
1908
+ width: 100%;
1909
+ height: 100%;
1910
+ background: white;
1911
+ box-shadow: 0 -5px 10px rgba(0, 0, 0, 0.2);
1912
+ z-index: 1000;
1913
+ }
1914
+
1915
+ #artical-iframe-container.show {
1916
+ display: block;
1917
+ animation: articalFadeIn 0.5s, articalSlideIn 0.5s;
1918
+ }
1919
+
1920
+ #artical-iframe-container.hide {
1921
+ animation: articalFadeOut 0.5s, articalSlideOut 0.5s;
1922
+ }
1923
+
1924
+ /* iframe */
1925
+ #artical-iframe {
1926
+ width: 100%;
1927
+ height: 100%;
1928
+ border: none;
1929
+ }
1930
+
1931
+ /* زر الإغلاق */
1932
+ #artical-close-btn {
1933
+ position: absolute;
1934
+ top: 10px;
1935
+ left: 10px;
1936
+ background: red;
1937
+ color: white;
1938
+ border: none;
1939
+ border-radius: 5px;
1940
+ padding: 5px 10px;
1941
+ cursor: pointer;
1942
+ }
1943
+
1944
+ </style>
1945
+
1946
+ <script>
1947
+ // Comments Functionality
1948
+ // Comments Functionality
1949
+ $(document).ready(function () {
1950
+ const commentsContainer = $("#commentsFixedContainer");
1951
+ const commentsOverlay = $("#commentsOverlay");
1952
+ const closeComments = $(".close-comments");
1953
+ let currentPostId = null;
1954
+
1955
+ // Reply Modal Elements
1956
+ const replyContainer = $("#replyFixedContainer");
1957
+ const replyOverlay = $("#replyOverlay");
1958
+ const closeReply = $(".close-reply");
1959
+ let currentCommentId = null;
1960
+
1961
+ // تحميل التعليقات عند النقر على زر التعليق
1962
+ $(".comment-btn").click(function () {
1963
+ const postId = $(this).data("post-id");
1964
+ currentPostId = postId;
1965
+
1966
+ // تحميل التعليقات
1967
+ loadComments(postId);
1968
+
1969
+ // عرض الخلفية والحاوية
1970
+ commentsOverlay.css("display", "block");
1971
+ commentsContainer.css("display", "block");
1972
+ document.body.style.overflow = "hidden"; // منع السكرول في الصفحة الرئيسية
1973
+ setTimeout(() => {
1974
+ commentsContainer.addClass("active");
1975
+ }, 10);
1976
+ });
1977
+
1978
+ // إغلاق التعليقات عند النقر خارج الحاوية
1979
+ commentsOverlay.click(function () {
1980
+ closeCommentsContainer();
1981
+ });
1982
+
1983
+ // إغلاق حاوية التعليقات
1984
+ closeComments.click(function () {
1985
+ closeCommentsContainer();
1986
+ });
1987
+
1988
+ // دالة إغلاق حاوية التعليقات
1989
+ function closeCommentsContainer() {
1990
+ commentsContainer.removeClass("active");
1991
+ document.body.style.overflow = "auto"; // إعادة تفعيل السكرول في الصفحة الرئيسية
1992
+ setTimeout(() => {
1993
+ commentsContainer.css("display", "none");
1994
+ commentsOverlay.css("display", "none");
1995
+ }, 300);
1996
+ }
1997
+
1998
+ // إرسال التعليق
1999
+ $(".send-comment-btn").click(function () {
2000
+ const input = commentsContainer.find(".comment-input");
2001
+ const content = input.val().trim();
2002
+
2003
+ if (content && currentPostId) {
2004
+ $.ajax({
2005
+ url: "/add_comment",
2006
+ method: "POST",
2007
+ data: {
2008
+ post_id: currentPostId,
2009
+ content: content,
2010
+ parent_id: null, // Root comment
2011
+ },
2012
+ success: function (response) {
2013
+ if (response.success) {
2014
+ input.val("");
2015
+ loadComments(currentPostId);
2016
+ }
2017
+ },
2018
+ });
2019
+ }
2020
+ });
2021
+
2022
+ // تحميل التعليقات
2023
+ function loadComments(postId) {
2024
+ $.get(`/get_comments/${postId}`, function (comments) {
2025
+ const commentsList = commentsContainer.find(".comments-list");
2026
+ commentsList.empty();
2027
+
2028
+ comments.forEach(function (comment) {
2029
+ const commentHtml = generateCommentHtml(comment);
2030
+ commentsList.append(commentHtml);
2031
+ });
2032
+ });
2033
+ }
2034
+
2035
+ // دالة لتوليد HTML للتعليقات والردود
2036
+ function generateCommentHtml(comment) {
2037
+ const hasReplies = comment.replies && comment.replies.length > 0;
2038
+ const repliesCount = hasReplies
2039
+ ? `${comment.replies.length} رداً`
2040
+ : "";
2041
+
2042
+ const repliesHtml = hasReplies
2043
+ ? comment.replies
2044
+ .map((reply) => generateReplyHtml(reply))
2045
+ .join("")
2046
+ : "";
2047
+
2048
+ return `
2049
+ <div class="comment-item">
2050
+ <div class="comment-user-avatar">
2051
+ <img src="/static/${
2052
+ comment.profile_photo
2053
+ }" alt="${comment.username}">
2054
+ </div>
2055
+ <div class="comment-bubble">
2056
+ <div class="comment-header">
2057
+ <span class="comment-username">${comment.username}</span>
2058
+ </div>
2059
+ <div class="comment-content">${comment.content}</div>
2060
+ <div class="comment-time">${comment.created_at}</div>
2061
+
2062
+ <!-- عرض زر الردود المخفية إذا كان هناك ردود -->
2063
+ ${
2064
+ hasReplies
2065
+ ? `
2066
+ <div class="replies-toggle" data-comment-id="${comment.id}">
2067
+ <span class="replies-toggle-text" style="color: blue; cursor: pointer;">
2068
+ <i class="fas fa-chevron-down"></i> ${repliesCount}
2069
+ </span>
2070
+ </div>
2071
+ `
2072
+ : ""
2073
+ }
2074
+
2075
+ <!-- زر الرد -->
2076
+ <button class="reply-btn" data-comment-id="${
2077
+ comment.id
2078
+ }" style="color: blue; cursor: pointer;">رد</button>
2079
+
2080
+ <!-- عرض الردود أسفل التعليق الرئيسي -->
2081
+ <div class="replies-container" style="display: ${
2082
+ hasReplies ? "none" : "none"
2083
+ };">
2084
+ ${repliesHtml}
2085
+ </div>
2086
+ </div>
2087
+ </div>
2088
+ `;
2089
+ }
2090
+
2091
+ // دالة لتوليد HTML للردود
2092
+ function generateReplyHtml(reply) {
2093
+ return `
2094
+ <div class="comment-item nested-comment" style=" border-bottom: 1px solid;">
2095
+ <div class="comment-user-avatar">
2096
+ <img src="/static/${
2097
+ reply.profile_photo
2098
+ }" alt="${reply.username}">
2099
+ </div>
2100
+ <div class="comment-bubble">
2101
+ <div class="comment-header">
2102
+ <span class="comment-username">${reply.username}</span>
2103
+ </div>
2104
+ <div class="comment-content">${reply.content}</div>
2105
+ <div class="comment-time">${reply.created_at}</div>
2106
+ </div>
2107
+ </div>
2108
+ `;
2109
+ }
2110
+
2111
+ // إظهار حقل الرد عند النقر على زر الرد
2112
+ $(document).on("click", ".reply-btn", function () {
2113
+ currentCommentId = $(this).data("comment-id");
2114
+ replyOverlay.css("display", "block");
2115
+ replyContainer.css("display", "block");
2116
+ setTimeout(() => {
2117
+ replyContainer.addClass("active");
2118
+ }, 10);
2119
+ });
2120
+
2121
+ // إغلاق الرد عند النقر خارج الحاوية
2122
+ replyOverlay.click(function () {
2123
+ closeReplyContainer();
2124
+ });
2125
+
2126
+ // إغلاق حاوية الرد
2127
+ closeReply.click(function () {
2128
+ closeReplyContainer();
2129
+ });
2130
+
2131
+ // دالة إغلاق حاوية الرد
2132
+ function closeReplyContainer() {
2133
+ replyContainer.removeClass("active");
2134
+ setTimeout(() => {
2135
+ replyContainer.css("display", "none");
2136
+ replyOverlay.css("display", "none");
2137
+ }, 300);
2138
+ }
2139
+
2140
+ // إرسال الرد على تعليق
2141
+ $(".send-reply-btn").click(function () {
2142
+ const input = replyContainer.find(".reply-input");
2143
+ const content = input.val().trim();
2144
+
2145
+ if (content && currentPostId && currentCommentId) {
2146
+ $.ajax({
2147
+ url: "/add_comment",
2148
+ method: "POST",
2149
+ data: {
2150
+ post_id: currentPostId,
2151
+ content: content,
2152
+ parent_id: currentCommentId, // Associate reply with parent
2153
+ },
2154
+ success: function (response) {
2155
+ if (response.success) {
2156
+ input.val("");
2157
+ closeReplyContainer();
2158
+ loadComments(currentPostId);
2159
+ }
2160
+ },
2161
+ });
2162
+ }
2163
+ });
2164
+
2165
+ // إظهار أو إخفاء الردود عند النقر على زر "12 رداً" أو ما يعادله
2166
+ $(document).on("click", ".replies-toggle-text", function () {
2167
+ const toggle = $(this).closest(".replies-toggle");
2168
+ const repliesContainer = toggle.siblings(".replies-container");
2169
+ const icon = toggle.find("i");
2170
+
2171
+ if (repliesContainer.is(":visible")) {
2172
+ repliesContainer.slideUp();
2173
+ icon.removeClass("fa-chevron-up").addClass("fa-chevron-down");
2174
+ } else {
2175
+ repliesContainer.slideDown();
2176
+ icon.removeClass("fa-chevron-down").addClass("fa-chevron-up");
2177
+ }
2178
+ });
2179
+ });
2180
+
2181
+
2182
+ // تفعيل زر إظهار المزيد
2183
+ document.addEventListener("DOMContentLoaded", function () {
2184
+ // تحديد النصوص الطويلة وإضافة زر إظهار المزيد
2185
+ document.querySelectorAll(".post-text").forEach(function ($text) {
2186
+ const $btn = $text.nextElementSibling;
2187
+
2188
+ // التحقق من وجود العنصر التالي (زر إظهار المزيد)
2189
+ if ($btn && $btn.classList.contains("see-more-btn")) {
2190
+ // إضافة collapsed class مبدئياً
2191
+ $text.classList.add("collapsed");
2192
+
2193
+ // حساب ارتفاع النص الكامل والنص المقتطع
2194
+ const originalHeight = $text.scrollHeight;
2195
+ const lineHeight = parseFloat(
2196
+ window.getComputedStyle($text).lineHeight
2197
+ );
2198
+ const maxHeight = lineHeight * 4; // ارتفاع 4 أسطر
2199
+
2200
+ // إظهار الزر فقط إذا كان النص أطول من 4 أسطر
2201
+ if (originalHeight > maxHeight) {
2202
+ $btn.style.display = "block";
2203
+ $btn.textContent = "إظهار المزيد";
2204
+ } else {
2205
+ $btn.style.display = "none";
2206
+ $text.classList.remove("collapsed");
2207
+ }
2208
+ }
2209
+ });
2210
+
2211
+ // تفعيل زر إظهار المزيد/أقل
2212
+ document.querySelectorAll(".see-more-btn").forEach(function ($btn) {
2213
+ $btn.addEventListener("click", function () {
2214
+ const $text = this.previousElementSibling;
2215
+
2216
+ if ($text.classList.contains("collapsed")) {
2217
+ $text.classList.remove("collapsed");
2218
+ $text.classList.add("expanded");
2219
+ this.textContent = "إظهار أقل";
2220
+ } else {
2221
+ $text.classList.remove("expanded");
2222
+ $text.classList.add("collapsed");
2223
+ this.textContent = "إظهار المزيد";
2224
+ }
2225
+ });
2226
+ });
2227
+
2228
+ // تفعيل قائمة النقاط الثلاث للمنشورات
2229
+ document.querySelectorAll(".menu-dots").forEach(function ($dots) {
2230
+ $dots.addEventListener("click", function (e) {
2231
+ e.stopPropagation();
2232
+ const $menu = this.nextElementSibling;
2233
+ $(".menu-options").not($menu).hide();
2234
+ $menu.style.display =
2235
+ $menu.style.display === "block" ? "none" : "block";
2236
+ });
2237
+ });
2238
+
2239
+ // إغلاق قوائم المنشورات عند النقر في أي مكان آخر
2240
+ document.addEventListener("click", function () {
2241
+ document.querySelectorAll(".menu-options").forEach(function ($menu) {
2242
+ $menu.style.display = "none";
2243
+ });
2244
+ });
2245
+
2246
+ // منع إغلاق القائمة عند النقر داخلها
2247
+ document.querySelectorAll(".menu-options").forEach(function ($menu) {
2248
+ $menu.addEventListener("click", function (e) {
2249
+ e.stopPropagation();
2250
+ });
2251
+ });
2252
+
2253
+
2254
+
2255
+
2256
+
2257
+
2258
+ // دالة لإغلاق modal
2259
+ function closePostModal() {
2260
+ const postModal = document.getElementById("postViewModal");
2261
+ console.log("hi")
2262
+ // إغلاق modal
2263
+ postModal.style.display = "none";
2264
+ document.body.style.overflow = "auto"; // إعادة تمكين التمرير
2265
+ }
2266
+
2267
+ // إضافة أحداث لإغلاق modal
2268
+ document.querySelector(".close-modal").addEventListener("click", closePostModal);
2269
+ document.querySelector(".modal-overlay").addEventListener("click", closePostModal);
2270
+
2271
+
2272
+
2273
+
2274
+
2275
+
2276
+
2277
+
2278
+ // تفعيل زر تعديل المنشور
2279
+ document.querySelectorAll(".edit-post").forEach(function ($editBtn) {
2280
+ $editBtn.addEventListener("click", function () {
2281
+ const postId = this.dataset.postId;
2282
+ const $postCard = this.closest(".post-card");
2283
+ const $postText = postCard.querySelector(".post-text");
2284
+ const currentContent = $postText.textContent.trim();
2285
+
2286
+ // إنشاء مربع حوار للتعديل
2287
+ const newContent = prompt("تعديل المنشور:", currentContent);
2288
+
2289
+ if (newContent !== null && newContent !== currentContent) {
2290
+ // إرسال طلب التعديل
2291
+ fetch("/edit_post_content", {
2292
+ method: "POST",
2293
+ headers: {
2294
+ "Content-Type": "application/x-www-form-urlencoded",
2295
+ },
2296
+ body: `post_id=${postId}&new_content=${encodeURIComponent(
2297
+ newContent
2298
+ )}`,
2299
+ })
2300
+ .then((response) => response.json())
2301
+ .then((data) => {
2302
+ if (data.success) {
2303
+ location.reload();
2304
+ }
2305
+ });
2306
+ }
2307
+ });
2308
+ });
2309
+
2310
+ // تفعيل زر حذف المنشور
2311
+ document
2312
+ .querySelectorAll(".delete-post")
2313
+ .forEach(function ($deleteBtn) {
2314
+ $deleteBtn.addEventListener("click", function () {
2315
+ const postId = this.dataset.postId;
2316
+
2317
+ // عرض الموديل بدلاً من confirm
2318
+ const deleteModal = document.getElementById("deleteModal");
2319
+ deleteModal.style.display = "block"; // عرض الموديل
2320
+
2321
+ // حدث عند الضغط على زر الحذف
2322
+ const confirmDeleteBtn = document.getElementById("confirmDeleteBtn");
2323
+ confirmDeleteBtn.onclick = function () {
2324
+ fetch("/delete_post", {
2325
+ method: "POST",
2326
+ headers: {
2327
+ "Content-Type": "application/x-www-form-urlencoded",
2328
+ },
2329
+ body: `post_id=${postId}`,
2330
+ })
2331
+ .then((response) => response.json())
2332
+ .then((data) => {
2333
+ if (data.success) {
2334
+ location.reload(); // إعادة تحميل الصفحة بعد الحذف
2335
+ }
2336
+ });
2337
+ deleteModal.style.display = "none"; // إغلاق الموديل بعد الحذف
2338
+ };
2339
+
2340
+ // حدث عند الضغط على زر الإلغاء
2341
+ const cancelDeleteBtn = document.getElementById("cancelDeleteBtn");
2342
+ cancelDeleteBtn.onclick = function () {
2343
+ deleteModal.style.display = "none"; // إغلاق الموديل دون حذف
2344
+ };
2345
+ });
2346
+ });
2347
+
2348
+ });
2349
+
2350
+ // تفعيل زر تعديل المنشور في modal
2351
+ document.addEventListener("DOMContentLoaded", function () {
2352
+ const editPostBtn = document.querySelector("#postViewModal .edit-post");
2353
+
2354
+ if (editPostBtn) {
2355
+ editPostBtn.addEventListener("click", function () {
2356
+ const postId = this.dataset.postId;
2357
+ const postText = document.querySelector("#postViewModal .post-text");
2358
+ const editModal = document.getElementById("editModal");
2359
+ const editContentInput = document.getElementById("editContentInput");
2360
+
2361
+ editModal.style.display = "block";
2362
+ editContentInput.value = postText.textContent.trim();
2363
+
2364
+ // إضافة أحداث لإغلاق modal
2365
+ const cancelEditBtn = document.getElementById("cancelEditBtn");
2366
+ cancelEditBtn.addEventListener("click", function () {
2367
+ editModal.style.display = "none";
2368
+ });
2369
+
2370
+ // إضافة أحداث لحفظ التغييرات
2371
+ const saveEditBtn = document.getElementById("saveEditBtn");
2372
+ saveEditBtn.addEventListener("click", function () {
2373
+ const newContent = editContentInput.value.trim();
2374
+
2375
+ if (newContent !== postText.textContent.trim()) {
2376
+ fetch("/edit_post_content", {
2377
+ method: "POST",
2378
+ headers: {
2379
+ "Content-Type": "application/x-www-form-urlencoded",
2380
+ },
2381
+ body: `post_id=${postId}&new_content=${encodeURIComponent(newContent)}`,
2382
+ })
2383
+ .then((response) => response.json())
2384
+ .then((data) => {
2385
+ if (data.success) {
2386
+ location.reload();
2387
+ }
2388
+ });
2389
+ }
2390
+
2391
+ editModal.style.display = "none";
2392
+ });
2393
+ });
2394
+ }
2395
+ });
2396
+
2397
+ // إضافة حدث لإغلاق الموديل عند الضغط على الزر الذي يحمل الكلاس 'close-modal'
2398
+ document.querySelectorAll(".close-modal").forEach(function ($closeBtn) {
2399
+ $closeBtn.addEventListener("click", function () {
2400
+ // إخفاء الموديل عن طريق تعيين display: none
2401
+ const postViewModal = document.getElementById("postViewModal");
2402
+ postViewModal.style.display = "none";
2403
+
2404
+ // إزالة جزء الرابط الحالي (مثل post/6) دون إعادة تحميل الصفحة
2405
+ const currentUrl = window.location.href; // الحصول على الرابط الحالي
2406
+ const baseUrl = currentUrl.split("/post/")[0]; // إزالة جزء post/6 من الرابط
2407
+ history.pushState(null, "", baseUrl); // تحديث الرابط في شريط العنوان
2408
+ });
2409
+ });
2410
+
2411
+
2412
+
2413
+ document.addEventListener("DOMContentLoaded", function () {
2414
+ document.querySelectorAll(".share-btn").forEach(function (button) {
2415
+ button.addEventListener("click", function () {
2416
+ const postId = this.dataset.postId;
2417
+ const shareUrl = `${window.location.origin}/post/${postId}`;
2418
+
2419
+ if (navigator.clipboard && navigator.clipboard.writeText) {
2420
+ navigator.clipboard.writeText(shareUrl).then(function () {
2421
+ showPopup("تم نسخ الرابط");
2422
+ }).catch(function (err) {
2423
+ console.error("فشل نسخ الرابط: ", err);
2424
+ });
2425
+ } else {
2426
+ const tempInput = document.createElement("input");
2427
+ tempInput.value = shareUrl;
2428
+ document.body.appendChild(tempInput);
2429
+ tempInput.select();
2430
+ try {
2431
+ document.execCommand("copy");
2432
+ showPopup("تم نسخ الرابط ");
2433
+ } catch (err) {
2434
+ console.error("فشل نسخ الرابط باستخدام الطريقة البديلة: ", err);
2435
+ }
2436
+ document.body.removeChild(tempInput);
2437
+ }
2438
+
2439
+ function showPopup(message) {
2440
+ const modal = document.createElement("div");
2441
+ modal.style.position = "fixed";
2442
+ modal.style.bottom = "20%";
2443
+ modal.style.left = "50%";
2444
+ modal.style.transform = "translateX(-50%)";
2445
+ modal.style.backgroundColor = "#333";
2446
+ modal.style.color = "#fff";
2447
+ modal.style.padding = "15px 20px";
2448
+ modal.style.borderRadius = "8px";
2449
+ modal.style.boxShadow = "0 4px 6px rgba(0, 0, 0, 0.1)";
2450
+ modal.style.opacity = "0";
2451
+ modal.style.transition = "opacity 0.4s ease, bottom 0.4s ease";
2452
+ modal.style.zIndex = "1000";
2453
+ modal.textContent = message;
2454
+
2455
+ document.body.appendChild(modal);
2456
+
2457
+ setTimeout(() => {
2458
+ modal.style.opacity = "1";
2459
+ modal.style.bottom = "25%";
2460
+ }, 10);
2461
+
2462
+ setTimeout(() => {
2463
+ modal.style.opacity = "0";
2464
+ modal.style.bottom = "20%";
2465
+ setTimeout(() => {
2466
+ modal.remove();
2467
+ }, 400);
2468
+ }, 3000);
2469
+ }
2470
+ });
2471
+ });
2472
+ });
2473
+
2474
+ document.addEventListener('DOMContentLoaded', function () {
2475
+ const notificationBtn = document.getElementById('notification-btn');
2476
+ const notificationCount = document.getElementById('notification-count');
2477
+ const notificationList = document.getElementById('notification-list');
2478
+
2479
+ let eventSource; // تعريف متغير EventSource خارج الوظيفة
2480
+
2481
+ // تحميل عدد الرسائل غير المقروءة
2482
+ function loadUnreadCount() {
2483
+ fetch('/get_unread_count')
2484
+ .then(response => response.json())
2485
+ .then(data => {
2486
+ notificationCount.textContent = data.unread_count; // تحديث العداد
2487
+ })
2488
+ .catch(error => console.error('Error loading unread count:', error));
2489
+ }
2490
+ // تحميل الإشعارات
2491
+ function loadNotifications() {
2492
+ fetch('/get_notifications')
2493
+ .then(response => response.json())
2494
+ .then(notifications => {
2495
+ notificationList.innerHTML = ''; // تفريغ القائمة القديمة
2496
+
2497
+ // فلترة الإشعارات غير المقروءة فقط
2498
+ const unreadNotifications = notifications.filter(notification =>
2499
+ (notification.is_received && !notification.watched_by_receiver) ||
2500
+ (!notification.is_received && !notification.watched_by_sender)
2501
+ );
2502
+
2503
+ // إذا كانت القائمة فارغة
2504
+ if (unreadNotifications.length === 0) {
2505
+ notificationList.innerHTML = '<div class="no-notifications">لا توجد إشعارات جديدة</div>';
2506
+ } else {
2507
+ unreadNotifications.forEach(notification => {
2508
+ const item = document.createElement('div');
2509
+ item.className = 'notification-item';
2510
+ item.dataset.messageId = notification.id;
2511
+
2512
+ const user = notification.is_received ? notification.sender_name : notification.receiver_name;
2513
+ const userPhoto = notification.is_received ? notification.sender_photo : notification.receiver_photo;
2514
+ const userEmail = notification.is_received ? notification.sender_email : notification.receiver_email;
2515
+
2516
+ // تحديد المحتوى مع الإيموجي حسب نوع الملف
2517
+ let contentPreview = '';
2518
+ if (notification.file_type === 'image') {
2519
+ contentPreview = '🖼️ صورة';
2520
+ } else if (notification.file_type === 'video') {
2521
+ contentPreview = '🎥 فيديو';
2522
+ } else {
2523
+ contentPreview = notification.content; // النص العادي
2524
+ }
2525
+
2526
+ item.innerHTML = `
2527
+ <img src="${userPhoto}" alt="${user}" class="sender-photo" data-user-email="${userEmail}">
2528
+ <div>
2529
+ <strong>${user}</strong>
2530
+ <p>${contentPreview}</p>
2531
+ <small>${notification.created_at}</small>
2532
+ </div>
2533
+ `;
2534
+
2535
+ notificationList.appendChild(item);
2536
+ });
2537
+ }
2538
+
2539
+ // إضافة حدث النقر على الصور
2540
+ document.querySelectorAll('.sender-photo').forEach(img => {
2541
+ img.addEventListener('click', function (event) {
2542
+ event.stopPropagation(); // منع انتشار الحدث إلى العنصر الأب
2543
+ const userEmail = this.dataset.userEmail; // الحصول على البريد الإلكتروني للمستخدم
2544
+
2545
+ if (userEmail) {
2546
+ // فتح الرابط داخل iframe
2547
+ const chatFrame = document.querySelector('#chatFrame');
2548
+ if (chatFrame) {
2549
+ chatFrame.src = `/messages/${userEmail}`; // تحميل الصفحة داخل iframe
2550
+ chatFrame.style.display = 'block'; // إظهار iframe
2551
+ const closeChatFrameButton = document.querySelector('#closeChatFrame');
2552
+ if (closeChatFrameButton) {
2553
+ closeChatFrameButton.style.display = 'block'; // إظهار زر الإغلاق
2554
+ }
2555
+ document.body.style.overflow = 'hidden'; // منع التمرير في الصفحة الرئيسية
2556
+
2557
+ // تفعيل دالة join_chat
2558
+ fetch('/join_chat', {
2559
+ method: 'POST',
2560
+ headers: {
2561
+ 'Content-Type': 'application/json',
2562
+ },
2563
+ body: JSON.stringify({}),
2564
+ })
2565
+ .then(response => response.json())
2566
+ .then(data => {
2567
+ if (data.success) {
2568
+ console.log('User joined the chat successfully');
2569
+ } else {
2570
+ console.error('Failed to join the chat');
2571
+ }
2572
+ })
2573
+ .catch(error => console.error('Error joining chat:', error));
2574
+ } else {
2575
+ console.error('iframe not found');
2576
+ }
2577
+ } else {
2578
+ console.error('User email is undefined');
2579
+ }
2580
+ });
2581
+ });
2582
+ })
2583
+ .catch(error => console.error('Error loading notifications:', error));
2584
+ }
2585
+
2586
+ // تحديث جميع الرسائل غير المقروءة إلى "مقروءة"
2587
+ function markAllAsRead() {
2588
+ fetch('/mark_all_as_read', {
2589
+ method: 'POST',
2590
+ headers: {
2591
+ 'Content-Type': 'application/json',
2592
+ },
2593
+ })
2594
+ .then(response => response.json())
2595
+ .then(data => {
2596
+ if (data.success) {
2597
+ loadNotifications(); // إعادة تحميل الإشعارات بعد التحديث
2598
+ loadUnreadCount(); // تحديث عدد الرسائل غير المقروءة
2599
+ }
2600
+ })
2601
+ .catch(error => console.error('Error marking all as read:', error));
2602
+ }
2603
+
2604
+ // عرض/إخفاء قائمة الإشعارات
2605
+ notificationBtn.addEventListener('click', function () {
2606
+ // التحقق من حالة عرض القائمة
2607
+ if (notificationList.style.display === 'none' || notificationList.style.display === '') {
2608
+ notificationList.style.display = 'block'; // عرض قائمة الإشعارات
2609
+
2610
+ // تحميل الإشعارات عند الضغط الأول
2611
+ loadNotifications(); // تحميل الإشعارات
2612
+ markAllAsRead(); // تحديث جميع الرسائل غير المقروءة إلى "مقروءة"
2613
+ } else {
2614
+ notificationList.style.display = 'none'; // إخفاء قائمة الإشعارات
2615
+ }
2616
+ });
2617
+
2618
+ // عند النقر على إشعار
2619
+ notificationList.addEventListener('click', function (event) {
2620
+ const notificationItem = event.target.closest('.notification-item');
2621
+ if (notificationItem) {
2622
+ const messageId = notificationItem.dataset.messageId;
2623
+
2624
+ // تحديث حالة الرسالة إلى "مقروءة"
2625
+ fetch(`/mark_as_read/${messageId}`)
2626
+ .then(() => {
2627
+ // إعادة تحميل الإشعارات بعد تحديث حالة الرسالة
2628
+ loadNotifications();
2629
+ loadUnreadCount(); // تحديث عدد الرسائل غير المقروءة
2630
+ })
2631
+ .catch(error => console.error('Error marking message as read:', error));
2632
+ }
2633
+ });
2634
+
2635
+
2636
+ // الاستماع إلى التحديثات الفورية لعدد الرسائل غير المق��وءة
2637
+ eventSource = new EventSource('/stream_unread_count');
2638
+ eventSource.onmessage = function (event) {
2639
+ // التحقق مما إذا كان المستخدم الحالي في صفحة messages.html
2640
+ const isInChatPage = window.location.pathname.startsWith('/messages/');
2641
+
2642
+ // تحديث العداد فقط إذا لم يكن في صفحة messages.html
2643
+ if (!isInChatPage) {
2644
+ const data = JSON.parse(event.data);
2645
+ notificationCount.textContent = data.unread_count; // تحديث العداد
2646
+ }
2647
+ };
2648
+
2649
+ // إغلاق EventSource عند مغادرة المستخدم للصفحة
2650
+ window.addEventListener('beforeunload', function () {
2651
+ if (eventSource) {
2652
+ eventSource.close();
2653
+ }
2654
+ });
2655
+
2656
+ // تحميل عدد الرسائل غير المقروءة عند فتح الصفحة
2657
+ loadUnreadCount();
2658
+ });
2659
+
2660
+
2661
+ // تحديد عناصر DOM
2662
+ const chatButton = document.querySelector('.chat-button');
2663
+ const chatWindow = document.querySelector('#chatWindow');
2664
+ let closeManiChat = document.querySelector(".close-main-chat")
2665
+
2666
+ const chatList = document.querySelector('#chatList');
2667
+ const chatFrame = document.querySelector('#chatFrame'); // الإشارة إلى iframe
2668
+ const closeChatFrameButton = document.querySelector('#closeChatFrame'); // الزر لإغلاق الـ iframe
2669
+
2670
+ // إظهار/إخفاء نافذة الشات عند الضغط على الزر
2671
+ chatButton.addEventListener('click', () => {
2672
+
2673
+ chatWindow.style.display = chatWindow.style.display === 'none' || chatWindow.style.display === '' ? 'block' : 'none';
2674
+ if (chatWindow.style.display === 'block') {
2675
+ loadChatList(); // تحميل قائمة الشات عند الفتح
2676
+ }
2677
+ });
2678
+ function loadChatList() {
2679
+ fetch('/getchat') // الاتصال بـ API الذي أنشأناه
2680
+ .then(response => response.json())
2681
+ .then(chats => {
2682
+ console.log(chats);
2683
+ chatList.innerHTML = ''; // تفريغ القائمة القديمة
2684
+
2685
+ if (chats.length === 0) {
2686
+ chatList.innerHTML = '<div class="no-chats">لا توجد محادثات</div>';
2687
+ return;
2688
+ }
2689
+
2690
+ // إضافة العناصر إلى القائمة
2691
+ chats.forEach(chat => {
2692
+ const chatItem = document.createElement('div');
2693
+ chatItem.className = 'chat-item';
2694
+ chatItem.dataset.userEmail = chat.user_email;
2695
+
2696
+ // تحديد نص الرسالة بناءً على المحتوى
2697
+ let lastMessageHtml = '';
2698
+ let messagePrefix = chat.is_sender ? 'انت :' : ``;
2699
+
2700
+ if (chat.message_type === 'text') {
2701
+ lastMessageHtml = `<p>${messagePrefix} ${chat.last_message}</p>`; // عرض النص
2702
+ }
2703
+ else if (chat.message_type === 'image') {
2704
+ lastMessageHtml = `<span class="emoji-image">🖼️</span>`; // إيموجي صورة
2705
+ }
2706
+ else if (chat.message_type === 'video') {
2707
+ lastMessageHtml = `<span class="emoji-video">📹</span>`; // إيموجي فيديو
2708
+ }
2709
+ else if (chat.message_type === 'audio') {
2710
+ lastMessageHtml = `<span class="emoji-audio">🎵</span>`; // إيموجي صوت
2711
+ }
2712
+
2713
+ // إضافة عدد الرسائل غير المقروءة إذا كان أكبر من 0
2714
+ let unreadCountHtml = '';
2715
+ if (chat.unread_count >= 2) {
2716
+ unreadCountHtml = `<span class="unread-count">${chat.unread_count}</span>`;
2717
+ }
2718
+
2719
+ chatItem.innerHTML = `
2720
+ <img src="${chat.user_photo}" alt="${chat.user_name}">
2721
+ <div>
2722
+ <strong>${chat.user_name}</strong>
2723
+ <div>${lastMessageHtml}</div> <!-- عرض المحتوى داخل div -->
2724
+ <small>${chat.last_updated}</small>
2725
+ </div>
2726
+ ${unreadCountHtml} <!-- عرض عدد الرسائل غير المقروءة إذا كان أكبر من أو يساوي 2 -->
2727
+ `;
2728
+
2729
+ // حدث النقر لفتح نافذة الشات داخل iframe
2730
+ chatItem.addEventListener('click', () => {
2731
+ // تغيير مصدر iframe إلى صفحة الرسائل الخاصة بالمستخدم
2732
+ chatFrame.src = `/messages/${chatItem.dataset.userEmail}`;
2733
+ chatFrame.style.display = 'block'; // عرض الـ iframe
2734
+ chatWindow.style.display = 'none'; // إخفاء نافذة الشات
2735
+ const closeChatFrameButton = document.querySelector('#closeChatFrame');
2736
+ closeChatFrameButton.style.display = 'block'; // إظهار زر الإغلاق
2737
+ document.body.style.overflow = 'hidden'; // منع التمرير في الصفحة الرئيسية
2738
+ });
2739
+
2740
+ chatList.appendChild(chatItem);
2741
+ });
2742
+ })
2743
+ .catch(error => console.error('Error loading chat list:', error));
2744
+ }
2745
+
2746
+
2747
+ document.addEventListener('DOMContentLoaded', () => {
2748
+ // الآن يمكن إضافة listeners بعد تحميل جميع العناصر
2749
+ const closeChatFrameButton = document.querySelector('#closeChatFrame');
2750
+ const chatFrame = document.querySelector('#chatFrame'); // الحصول على iframe
2751
+
2752
+ if (closeChatFrameButton && chatFrame) {
2753
+ closeChatFrameButton.addEventListener('click', () => {
2754
+ chatFrame.style.display = 'none'; // إخفاء الـ iframe
2755
+ chatFrame.src = ''; // إزالة src من iframe
2756
+ closeChatFrameButton.style.display = 'none'; // إخفاء زر الإغلاق
2757
+ chatWindow.style.display = 'block'; // إعادة عرض نافذة الشات
2758
+ document.body.style.overflow = 'auto'; // إعادة التمرير في الصفحة الرئيسية
2759
+ loadChatList()
2760
+ // تفعيل دالة leave_chat
2761
+ fetch('/leave_chat', {
2762
+ method: 'POST',
2763
+ headers: {
2764
+ 'Content-Type': 'application/json',
2765
+ },
2766
+ body: JSON.stringify({}),
2767
+ })
2768
+ .then(response => response.json())
2769
+ .then(data => {
2770
+ if (data.success) {
2771
+ console.log('User left the chat successfully');
2772
+ } else {
2773
+ console.error('Failed to leave the chat');
2774
+ }
2775
+ })
2776
+ .catch(error => console.error('Error leaving chat:', error));
2777
+ });
2778
+ }
2779
+ });
2780
+
2781
+
2782
+
2783
+ closeManiChat.addEventListener("click" , () =>{
2784
+ chatWindow.style.display = 'none'; // إخفاء الـ iframe
2785
+ })
2786
+
2787
+
2788
+
2789
+
2790
+ // فتح الموديل عند الضغط على زر البحث
2791
+ const openModalBtn = document.getElementById('openSearchModalBtn');
2792
+ const closeModalBtn = document.getElementById('closeSearchModalBtn');
2793
+ const searchModal = document.getElementById('searchModal');
2794
+
2795
+ // عند الضغط على زر "بحث عن مستخدم"، يتم فتح الموديل
2796
+ openModalBtn.onclick = function() {
2797
+ searchModal.style.display = 'block';
2798
+ }
2799
+
2800
+ // عند الضغط على "×" يتم إغلاق الموديل
2801
+ closeModalBtn.onclick = function() {
2802
+ searchModal.style.display = 'none';
2803
+ }
2804
+
2805
+
2806
+ // وظيفة البحث التلقائي
2807
+ function searchUsers() {
2808
+ const searchQuery = document.getElementById('searchInput').value;
2809
+ if (searchQuery.length > 0) {
2810
+ // إرسال استعلام AJAX إلى السيرفر
2811
+ fetch(`/search_users?q=${searchQuery}`)
2812
+ .then(response => response.json())
2813
+ .then(data => {
2814
+ // عرض النتائج
2815
+ const resultsContainer = document.getElementById('searchResults');
2816
+ resultsContainer.innerHTML = ''; // مسح النتائج القديمة
2817
+ if (data.length > 0) {
2818
+ data.forEach(user => {
2819
+ const userDiv = document.createElement('div');
2820
+ userDiv.classList.add('search-result');
2821
+ userDiv.innerHTML = `
2822
+ <img src="static/${user.profile_photo}" alt="Profile Image" class="profile-img" />
2823
+ <span>${user.username}</span>
2824
+ `;
2825
+ // إزالة المسافات من اسم المستخدم
2826
+ const userEmail = user.username.replace(/\s+/g, '') + "@moltka.eg"; // إزالة المسافات
2827
+
2828
+ // إضافة مستمع حدث على العنصر بأكمله لفتح الملف الشخصي داخل الـ iframe
2829
+ userDiv.addEventListener('click', function(event) {
2830
+ event.preventDefault(); // منع الانتقال إلى الصفحة الجديدة
2831
+ openPublicProfile(`/profile/${userEmail}`); // فتح الملف الشخصي داخل الـ iframe
2832
+ });
2833
+
2834
+ resultsContainer.appendChild(userDiv);
2835
+ });
2836
+ } else {
2837
+ resultsContainer.innerHTML = '<span>لا توجد نتائج</span>';
2838
+ }
2839
+ });
2840
+ } else {
2841
+ document.getElementById('searchResults').innerHTML = '';
2842
+ }
2843
+ }
2844
+
2845
+ // دالة لفتح الملف الشخصي داخل iframe
2846
+ function openProfile() {
2847
+ var container = document.getElementById('profile-container');
2848
+ var iframe = document.getElementById('profile-iframe');
2849
+
2850
+ if (container && iframe) {
2851
+ // إظهار الحاوية
2852
+ container.style.display = 'block';
2853
+ container.classList.remove('hide'); // إزالة فئة الإخفاء
2854
+ container.classList.add('show'); // إضافة فئة العرض
2855
+
2856
+ // تحميل صفحة الملف الشخصي داخل الـ iframe
2857
+ iframe.src = "{{ url_for('profile') }}";
2858
+
2859
+ // منع التمرير في الصفحة الرئيسية
2860
+ document.body.style.overflow = 'hidden';
2861
+ }
2862
+ }
2863
+
2864
+ // دالة لإغلاق الملف الشخصي
2865
+ function closeProfile() {
2866
+ var container = document.getElementById('profile-container');
2867
+ if (container) {
2868
+ // إضافة كلاس hide لتشغيل أنيميشن الإغلاق
2869
+ container.classList.remove('show'); // إزالة فئة العرض
2870
+ container.classList.add('hide'); // إضافة فئة الإخفاء
2871
+
2872
+ // الانتظار حتى يكتمل الأنيميشن قبل إخفاء العنصر
2873
+ setTimeout(function() {
2874
+ container.style.display = 'none';
2875
+
2876
+ // إعادة التمرير في الصفحة الرئيسية
2877
+ document.body.style.overflow = 'auto';
2878
+ }, 300); // الانتظار لمدة 0.5 ثانية (مدة الأنيميشن)
2879
+ }
2880
+ }
2881
+
2882
+ // إضافة مستمع الحدث لزر الإغلاق
2883
+ var closeBtn = document.getElementById("close-profile-btn");
2884
+ if (closeBtn) {
2885
+ closeBtn.addEventListener("click", function () {
2886
+ console.log("تم النقر على زر الإغلاق");
2887
+ closeProfile(); // استدعاء دالة الإغلاق
2888
+ });
2889
+ }
2890
+
2891
+ // إضافة مستمع حدث لرابط الملف الشخصي
2892
+ var profileLink = document.getElementById("profile-link");
2893
+ if (profileLink) {
2894
+ profileLink.addEventListener('click', function(event) {
2895
+ event.preventDefault(); // منع الانتقال إلى الصفحة الجديدة
2896
+ openProfile(); // فتح الملف الشخصي داخل الـ iframe
2897
+ });
2898
+ }
2899
+
2900
+
2901
+ // دالة لفتح الملف الشخصي العام داخل iframe
2902
+ function openPublicProfile(url) {
2903
+ var container = document.getElementById('public-profile-container');
2904
+ var iframe = document.getElementById('public-profile-iframe');
2905
+
2906
+ if (container && iframe) {
2907
+ // إظهار الحاوية
2908
+ container.style.display = 'block';
2909
+ container.classList.remove('hide'); // إزالة فئة الإخفاء
2910
+ container.classList.add('show'); // إضافة فئة العرض
2911
+
2912
+ // تحميل صفحة الملف الشخصي العام داخل الـ iframe
2913
+ iframe.src = url;
2914
+
2915
+ // منع التمرير في الصفحة الرئيسية
2916
+ document.body.style.overflow = 'hidden';
2917
+ }
2918
+ }
2919
+
2920
+ // دالة لإغلاق الملف الشخصي العام
2921
+ function closePublicProfile() {
2922
+ var container = document.getElementById('public-profile-container');
2923
+ if (container) {
2924
+ // إضافة كلاس hide لتشغيل أنيميشن الإغلاق
2925
+ container.classList.remove('show'); // إزالة فئة العرض
2926
+ container.classList.add('hide'); // إضافة فئة الإخفاء
2927
+
2928
+ // الانتظار حتى يكتمل الأنيميشن قبل إخفاء العنصر
2929
+ setTimeout(function() {
2930
+ container.style.display = 'none';
2931
+
2932
+ // إعادة التمرير في الصفحة الرئيسية
2933
+ document.body.style.overflow = 'auto';
2934
+ }, 300); // الانتظار لمدة 0.5 ثانية (مدة الأنيميشن)
2935
+ }
2936
+ }
2937
+
2938
+ // إضافة مستمع الحدث لزر الإغلاق
2939
+ var closeBtn = document.getElementById("close-public-profile-btn");
2940
+ if (closeBtn) {
2941
+ closeBtn.addEventListener("click", function () {
2942
+ console.log("تم النقر على زر الإغلاق");
2943
+ closePublicProfile(); // استدعاء دالة الإغلاق
2944
+ });
2945
+ }
2946
+
2947
+ // إضافة مستمع حدث للروابط التي تفتح داخل الـ iframe
2948
+ document.querySelectorAll('.public-profile-link').forEach(function(link) {
2949
+ link.addEventListener('click', function(event) {
2950
+ event.preventDefault(); // منع الانتقال إلى الصفحة الجديدة
2951
+ var url = this.getAttribute('href'); // الحصول على الرابط
2952
+ openPublicProfile(url); // فتح الرابط داخل الـ iframe
2953
+ });
2954
+ });
2955
+
2956
+
2957
+ // جلب العناصر
2958
+ // العناصر
2959
+ const openBtnArtical = document.getElementById('artical-open-btn');
2960
+ const closeBtnArtical = document.getElementById('artical-close-btn');
2961
+ const iframeContainer = document.getElementById('artical-iframe-container');
2962
+ const iframe = document.getElementById('artical-iframe');
2963
+ const videoBtn = document.querySelector('.video_page'); // الزر الخاص بفتح الفيديو
2964
+
2965
+ // فتح الـ iframe مع تحميل المقال
2966
+ openBtnArtical.addEventListener('click', (e) => {
2967
+ e.preventDefault();
2968
+ iframe.src = 'artical'; // تحميل الصفحة الخاصة بالمقال داخل الـ iframe
2969
+ iframeContainer.style.display = 'block'; // إظهار iframe container
2970
+ iframeContainer.classList.add('show');
2971
+ iframeContainer.classList.remove('hide');
2972
+ });
2973
+
2974
+ // فتح الـ iframe مع تحميل الفيديو
2975
+ videoBtn.addEventListener('click', (e) => {
2976
+ e.preventDefault();
2977
+ iframe.src = 'videos'; // تحميل الصفحة الخاصة بالفيديو داخل الـ iframe
2978
+ iframeContainer.style.display = 'block'; // إظهار iframe container
2979
+ iframeContainer.classList.add('show');
2980
+ iframeContainer.classList.remove('hide');
2981
+ });
2982
+
2983
+ // إغلاق الـ iframe
2984
+ closeBtnArtical.addEventListener('click', () => {
2985
+ iframeContainer.classList.add('hide');
2986
+ iframeContainer.classList.remove('show');
2987
+ setTimeout(() => {
2988
+ iframeContainer.style.display = 'none'; // إخفاء العنصر بعد الأنيميشن
2989
+ iframe.src = ''; // إفراغ الـ iframe بعد الإغلاق
2990
+ }, 300); // زمن الأنيميشن
2991
+ });
2992
+
2993
+
2994
+
2995
+ </script>
2996
+ </body>
2997
+ </html>
templates/forgot_password.html ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {% extends "base.html" %}
2
+
3
+ {% block title %}نسيت كلمة السر{% endblock %}
4
+
5
+ {% block content %}
6
+ <div class="auth-container">
7
+ <h2>نسيت كلمة السر</h2>
8
+ <form id="forgotPasswordForm" method="POST" action="{{ url_for('forgot_password') }}">
9
+ <div class="form-group">
10
+ <label for="email">البريد الإلكتروني</label>
11
+ <input type="email" id="email" name="email" required>
12
+ </div>
13
+ <button type="submit" class="submit-btn">إرسال</button>
14
+ </form>
15
+ </div>
16
+ {% endblock %}
templates/login.html ADDED
@@ -0,0 +1,44 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {% extends "base.html" %}
2
+
3
+ {% block title %}تسجيل الدخول{% endblock %}
4
+
5
+ {% block content %}
6
+ <div class="auth-container">
7
+ <h2>تسجيل الدخول</h2>
8
+ <form id="loginForm" method="POST" action="{{ url_for('login') }}">
9
+ <div class="form-group">
10
+ <label for="username">اسم المستخدم</label>
11
+ <input type="text" id="username" name="username" required>
12
+ <small class="form-text">سيتم إضافة @moltka.eg تلقائياً</small>
13
+ </div>
14
+
15
+ <div class="form-group">
16
+ <label for="password">كلمة المرور</label>
17
+ <input type="password" id="password" name="password" required>
18
+ </div>
19
+
20
+ <button type="submit" class="submit-btn">تسجيل الدخول</button>
21
+ </form>
22
+
23
+ <div class="auth-links">
24
+ <p><a href="{{ url_for('forgot_password') }}">نسيت كلمة السر؟</a></p>
25
+ <p>ليس لديك حساب؟ <a href="{{ url_for('register') }}">إنشاء حساب جديد</a></p>
26
+ </div>
27
+ </div>
28
+ {% endblock %}
29
+
30
+ {% block scripts %}
31
+ <script>
32
+ $(document).ready(function() {
33
+ $('#loginForm').on('submit', function(e) {
34
+ const username = $('#username').val().trim();
35
+ const password = $('#password').val();
36
+
37
+ if (!username || !password) {
38
+ e.preventDefault();
39
+ alert('الرجاء ملء جميع الحقول المطلوبة');
40
+ }
41
+ });
42
+ });
43
+ </script>
44
+ {% endblock %}
templates/messages.html ADDED
@@ -0,0 +1,639 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {% extends "base.html" %}
2
+
3
+ {% block title %}{{ user.username }} - الرسائل{% endblock %}
4
+
5
+ {% block content %}
6
+
7
+ <style>
8
+ /* تصميم الحاوية */
9
+ .messages-container {
10
+ max-width: 600px;
11
+ margin: 20px auto;
12
+ padding: 10px;
13
+ border: 1px solid #ddd;
14
+ border-radius: 10px;
15
+ background-color: #f9f9f9;
16
+ font-family: Arial, sans-serif;
17
+ }
18
+
19
+ /* معلومات المستخدم */
20
+ .user-info {
21
+ display: flex;
22
+ align-items: center;
23
+ margin-bottom: 15px;
24
+ padding: 10px;
25
+ background-color: #ffffff;
26
+ border-bottom: 1px solid #ddd;
27
+ }
28
+
29
+ .profile-photo {
30
+ width: 50px;
31
+ height: 50px;
32
+ border-radius: 50%;
33
+ margin-right: 10px;
34
+ }
35
+
36
+ .username {
37
+ font-size: 18px;
38
+ font-weight: bold;
39
+ }
40
+
41
+ /* قائمة الرسائل */
42
+ .messages-list {
43
+ display: flex;
44
+ flex-direction: column;
45
+ max-height: 400px;
46
+ overflow-y: auto;
47
+ padding: 10px;
48
+ background-color: #ffffff;
49
+ border-radius: 5px;
50
+ margin-bottom: 15px;
51
+ }
52
+
53
+ /* الرسائل */
54
+ .message-item {
55
+ margin: 5px 0;
56
+ padding: 10px;
57
+ border-radius: 15px;
58
+ max-width: 75%;
59
+ word-wrap: break-word;
60
+ font-size: 14px;
61
+ }
62
+
63
+ /* الرسائل المرسلة */
64
+ .message-item.sent {
65
+ background-color: #0078ff;
66
+ color: #ffffff;
67
+ align-self: flex-end;
68
+ text-align: right;
69
+ }
70
+
71
+ /* الرسائل المستلمة */
72
+ .message-item.received {
73
+ background-color: #f1f0f0;
74
+ color: #000000;
75
+ align-self: flex-start;
76
+ text-align: left;
77
+ }
78
+
79
+ /* الطابع الزمني */
80
+ .message-timestamp {
81
+ font-size: 10px;
82
+ color: #666;
83
+ margin-top: 5px;
84
+ display: block;
85
+ }
86
+
87
+ /* إدخال الرسائل */
88
+ .message-input {
89
+ /* display: flex; */
90
+ align-items: center;
91
+ gap: 10px;
92
+ }
93
+
94
+ textarea#message-input {
95
+ width: 100%;
96
+ height: 50px;
97
+ padding: 10px;
98
+ border: 1px solid #ddd;
99
+ border-radius: 5px;
100
+ resize: none;
101
+ font-size: 14px;
102
+ }
103
+
104
+ button#send-message-btn {
105
+ background-color: #0078ff;
106
+ color: #ffffff;
107
+ border: none;
108
+ padding: 10px 15px;
109
+ border-radius: 5px;
110
+ font-size: 14px;
111
+ cursor: pointer;
112
+ transition: background-color 0.3s;
113
+ }
114
+
115
+ button#send-message-btn:hover {
116
+ background-color: #005bb5;
117
+ }
118
+
119
+ .received .seen-status{
120
+ display: none;
121
+ }
122
+ img{
123
+ max-width: 100%;
124
+ }
125
+
126
+ video{
127
+ max-width: 100%;
128
+ }
129
+
130
+ .input-group{
131
+ display: flex;
132
+ flex-direction: row-reverse;
133
+ align-items: center;
134
+ position: fixed;
135
+ bottom: 10px;
136
+ width: calc(100vw - 16.8px);
137
+ }
138
+
139
+
140
+ .file-upload-btn{
141
+ font-size: 25px;
142
+ margin-top: 5px;
143
+ }
144
+
145
+ /* دائرة التحميل */
146
+ .loading-circle {
147
+ display: inline-block;
148
+ width: 40px; /* زيادة الحجم ليكون أكثر وضوحًا */
149
+ height: 40px;
150
+ border: 4px solid #0078ff; /* اللون الأزرق الزاهي */
151
+ border-top: 4px solid transparent; /* الجزء العلوي شفاف لإعطاء التأثير الدوار */
152
+ border-radius: 50%; /* جعلها دائرية */
153
+ animation: spin 0.8s linear infinite; /* سرعة التدوير أصبحت أسرع (0.8 ثانية) */
154
+ margin: 10px auto; /* ضبط المسافة بين الدائرة والرسائل */
155
+ box-shadow: 0px 0px 10px rgba(0, 120, 255, 0.5); /* إضافة ظل خفيف لإعطاء تأثير العمق */
156
+ }
157
+
158
+ /* التأثير الذي يجعل الدائرة تدور */
159
+ @keyframes spin {
160
+ 0% { transform: rotate(0deg); }
161
+ 100% { transform: rotate(360deg); }
162
+ }
163
+
164
+
165
+
166
+ /* تنسيق نافذة المعاينة المنبثقة */
167
+ .modal {
168
+ display: none;
169
+ position: fixed;
170
+ top: 0;
171
+ left: 0;
172
+ width: 100%;
173
+ height: 100%;
174
+ background: rgba(0, 0, 0, 0.8);
175
+ justify-content: center;
176
+ align-items: center;
177
+ z-index: 1000;
178
+ }
179
+
180
+ .modal-content {
181
+ background: white;
182
+ padding: 20px;
183
+ border-radius: 10px;
184
+ text-align: center;
185
+ position: relative;
186
+ max-width: 90%;
187
+ max-height: 90%;
188
+ margin-left: auto;
189
+ top: 50%;
190
+ margin-right: auto;
191
+ transform: translate(0, -50%);
192
+ }
193
+
194
+ #closeModal {
195
+ position: absolute;
196
+ top: 10px;
197
+ right: 10px;
198
+ background: red;
199
+ color: white;
200
+ border: none;
201
+ border-radius: 50%;
202
+ width: 30px;
203
+ height: 30px;
204
+ cursor: pointer;
205
+ }
206
+
207
+ .send-button {
208
+ background: #007bff;
209
+ color: white;
210
+ border: none;
211
+ padding: 10px 20px;
212
+ border-radius: 5px;
213
+ cursor: pointer;
214
+ margin-top: 10px;
215
+ }
216
+
217
+ .send-button:hover {
218
+ background: #0056b3;
219
+ }
220
+
221
+ #file-preview img,
222
+ #file-preview video {
223
+ max-width: 100px;
224
+ max-height: 100px;
225
+ border-radius: 5px;
226
+ margin-top: 10px;
227
+ }
228
+
229
+
230
+ /* تنسيق دائرة التحميل */
231
+ .loading-spinner {
232
+ display: flex;
233
+ justify-content: center;
234
+ align-items: center;
235
+ padding: 10px;
236
+ font-size: 14px;
237
+ color: #007bff;
238
+ background-color: #f1f1f1;
239
+ border-radius: 5px;
240
+ margin: 10px auto;
241
+ width: fit-content;
242
+ }
243
+
244
+ .loading-spinner::before {
245
+ content: "";
246
+ border: 3px solid #f3f3f3;
247
+ border-top: 3px solid #007bff;
248
+ border-radius: 50%;
249
+ width: 20px;
250
+ height: 20px;
251
+ animation: spin 1s linear infinite;
252
+ margin-right: 10px;
253
+ }
254
+
255
+ @keyframes spin {
256
+ 0% { transform: rotate(0deg); }
257
+ 100% { transform: rotate(360deg); }
258
+ }
259
+
260
+ /* تنسيق دائرة التحميل */
261
+ .loading-container {
262
+ display: flex;
263
+ flex-direction: column;
264
+ align-items: center;
265
+ padding: 10px;
266
+ background-color: #f1f1f1;
267
+ border-radius: 5px;
268
+ margin: 10px auto;
269
+ width: fit-content;
270
+ }
271
+
272
+ .loading-spinner {
273
+ font-size: 14px;
274
+ color: #007bff;
275
+ margin-bottom: 10px;
276
+ }
277
+
278
+ /* تنسيق شريط التقدم */
279
+ .progress-bar {
280
+ width: 200px;
281
+ height: 10px;
282
+ background-color: #e0e0e0;
283
+ border-radius: 5px;
284
+ overflow: hidden;
285
+ }
286
+
287
+ .progress {
288
+ height: 100%;
289
+ background-color: #007bff;
290
+ width: 0%;
291
+ transition: width 0.3s ease;
292
+ }
293
+ </style>
294
+ <div class="messages-container">
295
+ <!-- معلومات المستخدم -->
296
+ <div class="user-info">
297
+ <img src="{{ url_for('static', filename=user.profile_photo) }}" alt="صورة المستخدم" class="profile-photo">
298
+ <span class="username">{{ user.username }}</span>
299
+ </div>
300
+
301
+ <!-- قائمة الرسائل -->
302
+ <div class="messages-list" id="messages-list">
303
+ <div id="loading-container" style="display: none;">
304
+ <div class="loading-circle"></div>
305
+ </div>
306
+ </div>
307
+
308
+ <!-- إدخال الرسائل -->
309
+ <div class="message-input">
310
+ <form id="messageForm" enctype="multipart/form-data">
311
+ <div class="input-group">
312
+ <label for="file-input" class="file-upload-btn">
313
+ 📎
314
+ <input type="file" id="file-input" name="file" accept="image/*, video/*" hidden>
315
+ </label>
316
+ <textarea id="message-input" placeholder="اكتب رسالتك هنا..."></textarea>
317
+
318
+ <button type="submit" id="send-message-btn">ارسال</button>
319
+ </div>
320
+ <div id="file-preview"></div>
321
+ </form>
322
+ </div>
323
+ </div>
324
+
325
+ <!-- نافذة المعاينة المنبثقة -->
326
+ <div id="previewModal" class="modal">
327
+ <div class="modal-content">
328
+ <button id="closeModal">&times;</button>
329
+ <div id="modalPreview"></div>
330
+ <button id="sendFromModal" class="send-button">إرسال</button>
331
+ </div>
332
+ </div>
333
+
334
+ <script>
335
+ $(document).ready(async function () {
336
+ const messageList = $('#messages-list');
337
+ const receiverId = {{ user.id }};
338
+ let selectedFile = null;
339
+
340
+ // إرسال طلب لتحديث حالة المستخدم إلى "داخل المحادثة"
341
+ await fetch('/join_chat', {
342
+ method: 'POST',
343
+ headers: {
344
+ 'Content-Type': 'application/json',
345
+ },
346
+ });
347
+
348
+ // تحديث جميع الرسائل إلى "مقروءة" عند فتح المحادثة
349
+ await fetch('/mark_all_as_seen', {
350
+ method: 'POST',
351
+ headers: {
352
+ 'Content-Type': 'application/json',
353
+ },
354
+ body: JSON.stringify({ receiver_id: receiverId }),
355
+ });
356
+
357
+ // معالجة اختيار الملف
358
+ $('#file-input').change(function(e) {
359
+ const file = e.target.files[0];
360
+ if (file) {
361
+ selectedFile = file;
362
+ showFilePreview(file);
363
+ }
364
+ });
365
+
366
+ function showFilePreview(file) {
367
+ const preview = $('#file-preview');
368
+ preview.empty();
369
+
370
+ if (file.type.startsWith('image/')) {
371
+ preview.append(`<img src="${URL.createObjectURL(file)}" class="preview-image">`);
372
+ } else if (file.type.startsWith('video/')) {
373
+ preview.append(`
374
+ <video controls class="preview-video">
375
+ <source src="${URL.createObjectURL(file)}" type="${file.type}">
376
+ </video>
377
+ `);
378
+ }
379
+
380
+ preview.append(`
381
+ <div class="file-info">
382
+ <span>${file.name}</span>
383
+ <button type="button" class="remove-file-btn">×</button>
384
+ </div>
385
+ `);
386
+
387
+ $('.remove-file-btn').click(() => {
388
+ selectedFile = null;
389
+ preview.empty();
390
+ $('#file-input').val('');
391
+ });
392
+ }
393
+ async function loadMessages() {
394
+ try {
395
+ const response = await fetch(`/get_messages/${receiverId}`);
396
+ const messages = await response.json();
397
+
398
+ if (!Array.isArray(messages)) {
399
+ console.error('الرد ليس مصفوفة:', messages);
400
+ return;
401
+ }
402
+
403
+ messageList.empty();
404
+ messages.forEach(message => {
405
+ const messageItem = $('<div>')
406
+ .addClass('message-item')
407
+ .attr('data-message-id', message.id);
408
+
409
+ // تحديد إذا كانت الرسالة مرسلة أو مستقبلة
410
+ if (message.sender_id === {{ current_user.id }}) {
411
+ messageItem.addClass('sent');
412
+
413
+ // إضافة حالة المشاهدة للمرسل
414
+ if (message.watched_by_receiver) {
415
+ messageItem.append('<span class="seen-status">✓✓</span>'); // المستقبل شاهد الرسالة
416
+ } else {
417
+ messageItem.append('<span class="seen-status">✓</span>'); // الرسالة مرسلة، ولكن المستقبل لم يشاهدها بعد
418
+ }
419
+ } else {
420
+ messageItem.addClass('received');
421
+ // لا تظهر أي علامة للمستقبل
422
+ }
423
+
424
+ const contentContainer = $('<div>').addClass('message-content');
425
+
426
+ // عرض الوسائط (صور أو فيديوهات) إذا كانت موجودة
427
+ if (message.file_url) {
428
+ if (message.file_type.startsWith('image/')) {
429
+ // إذا كانت صورة
430
+ contentContainer.append(`<img src="/${message.file_url}" class="message-media">`);
431
+ } else if (message.file_type.startsWith('video/')) {
432
+ // إذا كان فيديو
433
+ contentContainer.append(`
434
+ <video controls class="message-media">
435
+ <source src="/${message.file_url}" type="${message.file_type}">
436
+ </video>
437
+ `);
438
+ }
439
+ }
440
+
441
+ // إضافة النصوص إذا كانت موجودة
442
+ if (message.content) {
443
+ contentContainer.append(`<span>${message.content}</span>`);
444
+ }
445
+
446
+ // إضافة الطابع الزمني
447
+ const timestamp = $('<span>')
448
+ .addClass('message-timestamp')
449
+ .text(message.created_at);
450
+
451
+ // إضافة جميع العناصر إلى الرسالة
452
+ messageItem.append(contentContainer).append(timestamp);
453
+ messageList.append(messageItem);
454
+ });
455
+
456
+ // تمرير التمرير لأسفل لرؤية آخر الرسائل
457
+ messageList.scrollTop(messageList.prop('scrollHeight'));
458
+ } catch (error) {
459
+ console.error('حدث خطأ أثناء تحميل الرسائل:', error);
460
+ }
461
+ }
462
+
463
+
464
+
465
+ // SSE لتحديث حالة المشاهدة
466
+ const updateEventSource = new EventSource(`/stream_message_updates/${receiverId}`);
467
+ updateEventSource.onmessage = function (event) {
468
+ const data = JSON.parse(event.data);
469
+ const messageId = data.message_id;
470
+ const isSender = data.sender_id === {{ current_user.id }};
471
+
472
+ // إذا كان المستخدم الحالي هو المرسل
473
+ if (isSender) {
474
+ const seenStatus = $(`.message-item[data-message-id="${messageId}"] .seen-status`);
475
+ if (data.watched_by_receiver) {
476
+ seenStatus.text('✓✓'); // المستقبل شاهد الرسالة
477
+ } else {
478
+ seenStatus.text('✓'); // الرسالة مرسلة، ولكن المستقبل لم يشاهدها بعد
479
+ }
480
+ }
481
+ };
482
+
483
+ updateEventSource.onerror = function () {
484
+ console.log('SSE error. Reconnecting...');
485
+ setTimeout(() => {
486
+ new EventSource(`/stream_message_updates/${receiverId}`);
487
+ }, 3000);
488
+ };
489
+
490
+ // SSE للرسائل الجديدة
491
+ const eventSource = new EventSource(`/stream_messages/${receiverId}`);
492
+ eventSource.onmessage = function (event) {
493
+ loadMessages();
494
+ };
495
+
496
+ // إرسال الرسالة
497
+
498
+
499
+ // عند اختيار ملف
500
+
501
+ // عند اختيار ملف
502
+ $('#file-input').change(function(e) {
503
+ const file = e.target.files[0];
504
+ if (file) {
505
+ selectedFile = file;
506
+ showFilePreview(file); // عرض معاينة الملف
507
+ }
508
+ });
509
+
510
+ // عرض معاينة الملف في نافذة منبثقة
511
+ function showFilePreview(file) {
512
+ const previewModal = $('#previewModal');
513
+ const modalPreview = $('#modalPreview');
514
+
515
+ // تنظيف المحتوى السابق
516
+ modalPreview.empty();
517
+
518
+ if (file.type.startsWith('image')) {
519
+ // عرض الصورة
520
+ const img = $('<img>').attr('src', URL.createObjectURL(file)).css({ maxWidth: '100%', maxHeight: '80vh' });
521
+ modalPreview.append(img);
522
+ } else if (file.type.startsWith('video')) {
523
+ // عرض الفيديو
524
+ const video = $('<video>').attr('src', URL.createObjectURL(file)).attr('controls', true).css({ maxWidth: '100%', maxHeight: '80vh' });
525
+ modalPreview.append(video);
526
+ }
527
+
528
+ // إظهار نافذة المعاينة
529
+ previewModal.show();
530
+ }
531
+
532
+ // إغلاق نافذة المعاينة
533
+ $('#closeModal').click(function() {
534
+ $('#previewModal').hide();
535
+ });
536
+
537
+ // إرسال الملف من نافذة المعاينة
538
+ $('#sendFromModal').click(function() {
539
+ $('#previewModal').hide();
540
+ $('#messageForm').submit();
541
+ });
542
+
543
+ // إرسال النموذج
544
+ $('#messageForm').submit(async function(e) {
545
+ e.preventDefault();
546
+ const messageContent = $('#message-input').val().trim();
547
+ const formData = new FormData();
548
+ formData.append('content', messageContent);
549
+ formData.append('receiver_id', receiverId);
550
+
551
+ if (selectedFile) {
552
+ formData.append('file', selectedFile);
553
+
554
+ // إظهار دائرة التحميل وشريط التقدم في مكان الرسائل
555
+ $('#messages-list').append(`
556
+ <div class="loading-container">
557
+ <div class="loading-spinner">جاري التحميل...</div>
558
+ <div class="progress-bar">
559
+ <div class="progress"></div>
560
+ </div>
561
+ </div>
562
+ `);
563
+ }
564
+
565
+ if (!messageContent && !selectedFile) return;
566
+
567
+ try {
568
+ const isReceiverActive = await fetch(`/is_user_active/${receiverId}`).then(res => res.json());
569
+
570
+ // استخدام XMLHttpRequest لتتبع تقدم الرفع
571
+ const xhr = new XMLHttpRequest();
572
+ xhr.open('POST', '/send_message', true);
573
+
574
+ // تحديث شريط التقدم أثناء الرفع
575
+ xhr.upload.onprogress = function(event) {
576
+ if (event.lengthComputable) {
577
+ const percentComplete = (event.loaded / event.total) * 100;
578
+ $('.progress').css('width', percentComplete + '%');
579
+ }
580
+ };
581
+
582
+ xhr.onload = function() {
583
+ if (xhr.status === 200) {
584
+ $('#message-input').val('');
585
+ $('#file-preview').empty();
586
+ selectedFile = null;
587
+ $('#file-input').val('');
588
+
589
+ if (isReceiverActive.active) {
590
+ const messageId = JSON.parse(xhr.responseText).message_id;
591
+ fetch(`/mark_message_as_seen/${messageId}`, {
592
+ method: 'POST',
593
+ headers: {
594
+ 'Content-Type': 'application/json',
595
+ },
596
+ });
597
+ }
598
+
599
+ // إخفاء دائرة التحميل وشريط التقدم بعد اكتمال الإرسال
600
+ $('.loading-container').remove();
601
+ loadMessages();
602
+ } else {
603
+ console.error('حدث خطأ أثناء إرسال الرسالة:', xhr.statusText);
604
+ $('.loading-container').remove();
605
+ }
606
+ };
607
+
608
+ xhr.onerror = function() {
609
+ console.error('حدث خطأ أثناء إرسال الرسالة:', xhr.statusText);
610
+ $('.loading-container').remove();
611
+ };
612
+
613
+ xhr.send(formData);
614
+ } catch (error) {
615
+ console.error('حدث خطأ أثناء إرسال الرسالة:', error);
616
+ // إخفاء دائرة التحميل وشريط التقدم في حالة حدوث خطأ
617
+ $('.loading-container').remove();
618
+ }
619
+ });
620
+
621
+
622
+ await loadMessages();
623
+ });
624
+
625
+ window.addEventListener('beforeunload', async function () {
626
+ await fetch('/leave_chat', {
627
+ method: 'POST',
628
+ headers: {
629
+ 'Content-Type': 'application/json',
630
+ },
631
+ });
632
+
633
+ if (updateEventSource) updateEventSource.close();
634
+ if (eventSource) eventSource.close();
635
+ });
636
+ </script>
637
+
638
+
639
+ {% endblock %}
templates/post_detail.html ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <div class="post-header">
2
+ <!-- صورة المستخدم الذي نشر المنشور -->
3
+ <div class="profile-circle">
4
+ <img src="{{ url_for('static', filename=current_user.profile_photo) }}" alt="الصورة الشخصية">
5
+ </div>
6
+ <div class="user-info">
7
+ <span class="username">{{ user.username }}</span> <!-- اسم المستخدم -->
8
+ <span class="profession">{{ user.profession }}</span> <!-- تخصص المستخدم -->
9
+ <span class="timestamp">{{ post.created_at.strftime('%Y-%m-%d %H:%M:%S') }}</span> <!-- وقت نشر المنشور -->
10
+ </div>
11
+ </div>
12
+
13
+ <!-- محتوى المنشور -->
14
+ <div class="post-content">
15
+ <!-- <h2>{{ post.title }}</h2> -->
16
+ <p>{{ post.content }}</p>
17
+ {% if post.image_url %}
18
+ <img src="{{ url_for('static', filename=post.image_url) }}" alt="Post Image"> <!-- صورة المنشور -->
19
+ {% endif %}
20
+ </div>
21
+
22
+ <!-- رابط المشاركة -->
23
+ <div class="share">
24
+ <label>شارك هذا المنشور:</label>
25
+ <input type="text" value="{{ url_for('view_post', post_id=post.id, _external=True) }}" readonly>
26
+ <button onclick="copyToClipboard()">نسخ الرابط</button>
27
+ </div>
28
+
29
+ <script>
30
+ function copyToClipboard() {
31
+ var copyText = document.querySelector('.share input');
32
+ copyText.select();
33
+ copyText.setSelectionRange(0, 99999); // لنسخ النص في الأجهزة المحمولة
34
+ document.execCommand('copy');
35
+ alert('تم نسخ الرابط!');
36
+ }
37
+ </script>
templates/profile.html ADDED
@@ -0,0 +1,1827 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {% extends "base.html" %}
2
+
3
+ {% block title %}{{ current_user.username }} - الملف الشخصي{% endblock %}
4
+
5
+ {% block content %}
6
+ <div class="profile-container">
7
+ <!-- قسم معلومات الملف الشخصي -->
8
+ <div class="profile-header">
9
+ <div class="cover-photo"></div>
10
+ <div class="profile-info">
11
+ <div class="profile-photo">
12
+ <img src="{{ url_for('static', filename=current_user.profile_photo) }}" alt="الصورة الشخصية">
13
+ </div>
14
+ <h1 class="profile-name">{{ current_user.username }}</h1>
15
+ <div class="profile-details">
16
+ <div class="detail-item">
17
+ <i class="fas fa-envelope"></i>
18
+ <span>{{ current_user.email }}</span>
19
+ </div>
20
+ <div class="detail-item">
21
+ <i class="fas fa-briefcase"></i>
22
+ <span>{{ current_user.profession }}</span>
23
+ </div>
24
+ </div>
25
+ <div class="skills-section">
26
+ <h3>المهارات</h3>
27
+ <div class="skills-list">
28
+ {% for skill in current_user.skills|from_json %}
29
+ <span class="skill-tag">{{ skill }}</span>
30
+ {% endfor %}
31
+ </div>
32
+ </div>
33
+ <button id="editProfileBtn" class="edit-btn">
34
+ <i class="fas fa-edit"></i>
35
+ تعديل الملف الشخصي
36
+ </button>
37
+ </div>
38
+ </div>
39
+
40
+ <div class="filter-buttons">
41
+ <button id="filterAll" class="filter-btn active">الكل</button>
42
+ <button id="filterImages" class="filter-btn">الصور</button>
43
+ <button id="filterVideos" class="filter-btn">الفيديوهات</button>
44
+ <button id="filterText" class="filter-btn">النص</button>
45
+ </div>
46
+
47
+ <div id="noPostsMessage" style="display: none; text-align: center; margin-top: 20px; color: #666;">
48
+ لا توجد منشورات تطابق الفلتر المحدد.
49
+ </div>
50
+
51
+ <!-- نموذج تعديل الملف الشخصي -->
52
+ <div id="editProfileForm" class="edit-form" style="display: none;">
53
+ <h2>تعديل الملف الشخصي</h2>
54
+ <form id="profileForm" method="POST" action="{{ url_for('update_profile') }}" enctype="multipart/form-data">
55
+ <div class="form-group">
56
+ <label>الصورة الشخصية</label>
57
+ <div class="profile-photo-upload">
58
+ <input type="file" id="avatar" name="avatar" accept="image/*" class="avatar-input">
59
+ <label for="avatar" class="upload-btn">
60
+ <i class="fas fa-camera"></i>
61
+ تغيير الصورة
62
+ </label>
63
+ <button type="button" class="remove-photo-btn" id="removePhotoBtn">
64
+ <i class="fas fa-times"></i>
65
+ إزالة الصورة
66
+ </button>
67
+ </div>
68
+ </div>
69
+ <div class="form-group">
70
+ <label for="username">اسم المستخدم</label>
71
+ <input type="text" id="username" name="username" value="{{ current_user.username }}" required>
72
+ <small class="form-text">@moltka.eg</small>
73
+ <span id="username-validation-message"></span>
74
+ </div>
75
+
76
+ <div class="form-group">
77
+ <label for="profession">المجال المهني</label>
78
+ <select id="profession" name="profession" required>
79
+ <option value="">اختر المجال المهني</option>
80
+ <option value="مطور ويب" {% if current_user.profession == "مطور ويب" %}selected{% endif %}>مطور ويب</option>
81
+ <option value="مطور واجهة خلفية" {% if current_user.profession == "مطور واجهة خلفية" %}selected{% endif %}>مطور واجهة خلفية</option>
82
+ <option value="برمجة" {% if current_user.profession == "برمجة" %}selected{% endif %}>برمجة</option>
83
+ <option value="مطور ألعاب" {% if current_user.profession == "مطور ألعاب" %}selected{% endif %}>مطور ألعاب</option>
84
+ <option value="مطور أندرويد" {% if current_user.profession == "مطور أندرويد" %}selected{% endif %}>مطور أندرويد</option>
85
+ <option value="مطور iOS" {% if current_user.profession == "مطور iOS" %}selected{% endif %}>مطور iOS</option>
86
+ <option value="مهندس" {% if current_user.profession == "مهندس" %}selected{% endif %}>مهندس</option>
87
+ <option value="طبيب" {% if current_user.profession == "طبيب" %}selected{% endif %}>طبيب</option>
88
+ <option value="علوم اجتماعية" {% if current_user.profession == "علوم اجتماعية" %}selected{% endif %}>علوم اجتماعية</option>
89
+ <option value="معلم" {% if current_user.profession == "معلم" %}selected{% endif %}>معلم</option>
90
+ <option value="محاسب" {% if current_user.profession == "محاسب" %}selected{% endif %}>محاسب</option>
91
+ <option value="صحفي" {% if current_user.profession == "صحفي" %}selected{% endif %}>صحفي</option>
92
+ <option value="محامي" {% if current_user.profession == "محامي" %}selected{% endif %}>محامي</option>
93
+ <option value="مصمم جرافيكي" {% if current_user.profession == "مصمم جرافيكي" %}selected{% endif %}>مصمم جرافيكي</option>
94
+ <option value="مصور" {% if current_user.profession == "مصور" %}selected{% endif %}>مصور</option>
95
+ <option value="كاتب" {% if current_user.profession == "كاتب" %}selected{% endif %}>كاتب</option>
96
+ <option value="مدرب رياضي" {% if current_user.profession == "مدرب رياضي" %}selected{% endif %}>مدرب رياضي</option>
97
+ <option value="طاهي" {% if current_user.profession == "طاهي" %}selected{% endif %}>طاهي</option>
98
+ <option value="ديني" {% if current_user.profession == "ديني" %}selected{% endif %}>ديني</option>
99
+ <option value="شاعر" {% if current_user.profession == "شاعر" %}selected{% endif %}>شاعر</option>
100
+ <option value="رسام" {% if current_user.profession == "رسام" %}selected{% endif %}>رسام</option>
101
+ <option value="محلل مالي" {% if current_user.profession == "محلل مالي" %}selected{% endif %}>محلل مالي</option>
102
+ <option value="فني صيانة" {% if current_user.profession == "فني صيانة" %}selected{% endif %}>فني صيانة</option>
103
+ <option value="باحث" {% if current_user.profession == "باحث" %}selected{% endif %}>باحث</option>
104
+ <option value="IT" {% if current_user.profession == "IT" %}selected{% endif %}>IT</option>
105
+ </select>
106
+ </div>
107
+
108
+ <div class="form-group">
109
+ <label>المهارات</label>
110
+ <div id="skills-container">
111
+ {% for skill in current_user.skills|from_json %}
112
+ <div class="skill-input">
113
+ <input type="text" name="skill" class="skill-field" value="{{ skill }}">
114
+ <button type="button" class="remove-skill">-</button>
115
+ </div>
116
+ {% endfor %}
117
+ <div class="skill-input">
118
+ <input type="text" name="skill" class="skill-field">
119
+ <button type="button" class="add-skill">+</button>
120
+ </div>
121
+ </div>
122
+ <input type="hidden" id="skills" name="skills">
123
+ </div>
124
+
125
+ <div class="form-actions">
126
+ <button type="submit" class="save-btn">حفظ التغييرات</button>
127
+ <button type="button" class="cancel-btn" id="cancelEdit">إلغاء</button>
128
+ </div>
129
+ </form>
130
+ </div>
131
+
132
+ <!-- قسم المنشورات -->
133
+ <div class="posts-section">
134
+ <h2>المنشورات</h2>
135
+ <div class="posts-container">
136
+ {% for post in posts %}
137
+ <div class="post-card">
138
+ <div class="post-header">
139
+ <div class="profile-circle">
140
+ <img src="{{ url_for('static', filename=current_user.profile_photo) }}" alt="صورة الملف الشخصي">
141
+ </div>
142
+ <div class="user-info">
143
+ <span class="username">{{ current_user.username }}</span>
144
+ <span class="profession">{{ post.user_profession }}</span>
145
+ <span class="timestamp">{{ post.created_at|format_datetime }}</span>
146
+ </div>
147
+ <div class="post-menu">
148
+ <i class="fas fa-ellipsis-v menu-dots"></i>
149
+ <div class="menu-options">
150
+ <div class="menu-option edit-post" data-post-id="{{ post.id }}">
151
+ <i class="fas fa-edit"></i> تعديل المنشور
152
+ </div>
153
+ <div class="menu-option delete-post" data-post-id="{{ post.id }}">
154
+ <i class="fas fa-trash"></i> حذف المنشور
155
+ </div>
156
+ </div>
157
+ </div>
158
+ </div>
159
+
160
+ <div class="post-content" {% if post.background_color and not post.image_url %}style="background-color: {{ post.background_color }}; border-radius: 8px; text-align: center; font-size: 24px;"{% endif %}>
161
+ {% if post.title %}
162
+ <h3 class="post-title">{{ post.title }}</h3>
163
+ {% endif %}
164
+ {% if post.content %}
165
+ <div class="post-text-container">
166
+ <div class="post-content-box">
167
+ <div class="post-text collapsed" {% if post.background_color and not post.image_url %}style="color: {% if post.background_color == '#ffffff' %}#1a1a1a{% else %}#000000{% endif %};"{% endif %}>
168
+ {% for line in post.content.split('\n') %}
169
+ {% if line.strip() %}
170
+ <p>{{ line }}</p>
171
+ {% else %}
172
+ <p>&nbsp;</p>
173
+ {% endif %}
174
+ {% endfor %}
175
+ </div>
176
+ <button class="see-more-btn" style="display: none;">إظهار المزيد</button>
177
+ </div>
178
+ </div>
179
+ {% endif %}
180
+ {% if post.image_url %}
181
+ <div class="post-media">
182
+ <img src="{{ url_for('static', filename=post.image_url) }}" alt="صورة المنشور">
183
+ </div>
184
+ {% endif %}
185
+ {% if post.video_url %}
186
+ <div class="post-media video-container">
187
+ <video src="{{ url_for('static', filename=post.video_url) }}" controls></video>
188
+ </div>
189
+ {% endif %}
190
+ </div>
191
+
192
+ <div class="post-actions">
193
+ <button class="action-btn comment-btn" data-post-id="{{ post.id }}">
194
+ <i class="fas fa-comment"></i> تعليق
195
+ </button>
196
+ <button class="action-btn share-btn" data-post-id="{{ post.id }}">
197
+ <i class="fas fa-share"></i> مشاركة
198
+ </button>
199
+ </div>
200
+ </div>
201
+ {% endfor %}
202
+ </div>
203
+ </div>
204
+
205
+
206
+
207
+ <!-- Comments Fixed Container -->
208
+ <div class="comments-overlay" id="commentsOverlay"></div>
209
+ <div class="comments-fixed-container" id="commentsFixedContainer">
210
+ <div class="comments-content">
211
+ <div class="comments-header">
212
+ <h3>التعليقات</h3>
213
+ <span class="close-comments">&times;</span>
214
+ </div>
215
+ <div class="comments-list-container">
216
+ <div class="comments-list"></div>
217
+ </div>
218
+ <div class="comment-input-container">
219
+ <textarea
220
+ class="comment-input"
221
+ placeholder="اكتب تعليقك هنا..."
222
+ rows="1"
223
+ ></textarea>
224
+ <button class="send-comment-btn">
225
+ <i class="fas fa-paper-plane"></i>
226
+ </button>
227
+ </div>
228
+ </div>
229
+ </div>
230
+
231
+ <div class="reply-overlay" id="replyOverlay"></div>
232
+ <div class="reply-fixed-container" id="replyFixedContainer">
233
+ <div class="reply-content">
234
+ <div class="reply-header">
235
+ <h3>الرد</h3>
236
+ <span class="close-reply">&times;</span>
237
+ </div>
238
+ <div class="reply-input-container">
239
+ <textarea
240
+ class="reply-input"
241
+ placeholder="اكتب ردك هنا..."
242
+ rows="1"
243
+ ></textarea>
244
+ <button class="send-reply-btn">
245
+ <i class="fas fa-paper-plane"></i>
246
+ </button>
247
+ </div>
248
+ </div>
249
+ </div>
250
+
251
+
252
+ <!-- زر العودة للصفحة الرئيسية -->
253
+ <!-- <a href="{{ url_for('dashboard') }}" class="back-btn">
254
+ <i class="fas fa-arrow-left"></i>
255
+ العودة للرئيسية
256
+ </a> -->
257
+
258
+ <style>
259
+ /* Comments Fixed Container Styles */
260
+ .comments-overlay {
261
+ display: none;
262
+ position: fixed;
263
+ top: 0;
264
+ left: 0;
265
+ right: 0;
266
+ bottom: 0;
267
+ background-color: rgba(0, 0, 0, 0.5);
268
+ z-index: 1999;
269
+ }
270
+
271
+ .comments-fixed-container {
272
+ display: none;
273
+ position: fixed;
274
+ bottom: 0;
275
+ left: 0;
276
+ right: 0;
277
+ height: 80%;
278
+ background: white;
279
+ box-shadow: 0 -2px 10px rgba(0, 0, 0, 0.1);
280
+ z-index: 2000;
281
+ transform: translateY(100%);
282
+ transition: transform 0.3s ease-out;
283
+ }
284
+
285
+ .comments-fixed-container.active {
286
+ transform: translateY(0);
287
+ }
288
+
289
+ .comments-content {
290
+ height: 100%;
291
+ display: flex;
292
+ flex-direction: column;
293
+ }
294
+
295
+ .comments-header {
296
+ padding: 16px;
297
+ border-bottom: 1px solid #ddd;
298
+ display: flex;
299
+ justify-content: space-between;
300
+ align-items: center;
301
+ }
302
+
303
+ .comments-header h3 {
304
+ margin: 0;
305
+ text-align: center;
306
+ flex-grow: 1;
307
+ }
308
+
309
+ .close-comments {
310
+ font-size: 24px;
311
+ cursor: pointer;
312
+ color: #666;
313
+ padding: 8px;
314
+ }
315
+
316
+ .comments-list-container {
317
+ flex-grow: 1;
318
+ overflow-y: auto;
319
+ padding: 16px;
320
+ }
321
+
322
+ .comments-container {
323
+ flex-grow: 1;
324
+ overflow-y: auto;
325
+ padding: 16px;
326
+ }
327
+
328
+ .comment-input-container {
329
+ padding: 12px;
330
+ border-top: 1px solid #ddd;
331
+ background: white;
332
+ display: flex;
333
+ gap: 8px;
334
+ align-items: flex-start;
335
+ }
336
+
337
+ .comment-input {
338
+ flex: 1;
339
+ padding: 12px;
340
+ border: 1px solid #ddd;
341
+ border-radius: 20px;
342
+ resize: none;
343
+ font-size: 14px;
344
+ direction: rtl;
345
+ }
346
+
347
+ .send-comment-btn {
348
+ background: #4caf50;
349
+ color: white;
350
+ border: none;
351
+ width: 36px;
352
+ height: 36px;
353
+ border-radius: 50%;
354
+ display: flex;
355
+ align-items: center;
356
+ justify-content: center;
357
+ cursor: pointer;
358
+ }
359
+
360
+ .send-comment-btn:hover {
361
+ background: #45a049;
362
+ }
363
+
364
+ .comments-list {
365
+ display: flex;
366
+ flex-direction: column;
367
+ gap: 12px;
368
+ direction: rtl;
369
+ }
370
+
371
+ .comment-item {
372
+ display: flex;
373
+ gap: 8px;
374
+ margin-bottom: 12px;
375
+ align-items: flex-start;
376
+ padding: 0 8px;
377
+ }
378
+
379
+ .comment-user-avatar {
380
+ width: 45px;
381
+ height: 45px;
382
+ flex-shrink: 0;
383
+ margin-left: 8px;
384
+ }
385
+
386
+ .comment-user-avatar img {
387
+ width: 100%;
388
+ height: 100%;
389
+ border-radius: 50%;
390
+ object-fit: cover;
391
+ }
392
+
393
+ .comment-bubble {
394
+ background: #f0f2f5;
395
+ border-radius: 18px;
396
+ padding: 8px 12px;
397
+ flex-grow: 1;
398
+ }
399
+
400
+ .comment-header {
401
+ margin-bottom: 4px;
402
+ }
403
+
404
+ .comment-username {
405
+ font-weight: 600;
406
+ color: #050505;
407
+ font-size: 13px;
408
+ }
409
+
410
+ .comment-content {
411
+ color: #050505;
412
+ font-size: 14px;
413
+ line-height: 1.4;
414
+ word-wrap: break-word;
415
+ }
416
+
417
+ .comment-time {
418
+ font-size: 11px;
419
+ color: #65676b;
420
+ margin-top: 4px;
421
+ }
422
+
423
+ .nested-comments {
424
+ margin-left: 20px;
425
+ }
426
+
427
+ .reply-input-container {
428
+ margin-top: 10px;
429
+ }
430
+
431
+ .reply-text {
432
+ width: 100%;
433
+ padding: 12px;
434
+ border: 1px solid #ddd;
435
+ border-radius: 20px;
436
+ resize: none;
437
+ font-size: 14px;
438
+ direction: rtl;
439
+ }
440
+
441
+ .send-reply-btn {
442
+ margin-top: 5px;
443
+ color: white;
444
+ background-color: blue;
445
+ border: none;
446
+ padding: 5px 10px;
447
+ cursor: pointer;
448
+ }
449
+
450
+ /* Reply Modal Styles */
451
+ .reply-overlay {
452
+ display: none;
453
+ position: fixed;
454
+ top: 0;
455
+ left: 0;
456
+ right: 0;
457
+ bottom: 0;
458
+ background-color: rgba(0, 0, 0, 0.5);
459
+ z-index: 2001;
460
+ }
461
+
462
+ .reply-fixed-container {
463
+ display: none;
464
+ position: fixed;
465
+ bottom: 0;
466
+ left: 0;
467
+ right: 0;
468
+ height: 30%;
469
+ background: white;
470
+ box-shadow: 0 -2px 10px rgba(0, 0, 0, 0.1);
471
+ z-index: 2002;
472
+ transform: translateY(100%);
473
+ transition: transform 0.3s ease-out;
474
+ }
475
+
476
+ .reply-fixed-container.active {
477
+ transform: translateY(0);
478
+ }
479
+
480
+ .reply-content {
481
+ height: 100%;
482
+ display: flex;
483
+ flex-direction: column;
484
+ }
485
+
486
+ .reply-header {
487
+ padding: 16px;
488
+ border-bottom: 1px solid #ddd;
489
+ display: flex;
490
+ justify-content: space-between;
491
+ align-items: center;
492
+ }
493
+
494
+ .reply-header h3 {
495
+ margin: 0;
496
+ text-align: center;
497
+ flex-grow: 1;
498
+ }
499
+
500
+ .close-reply {
501
+ font-size: 24px;
502
+ cursor: pointer;
503
+ color: #666;
504
+ padding: 8px;
505
+ }
506
+
507
+ .reply-input-container {
508
+ padding: 12px;
509
+ border-top: 1px solid #ddd;
510
+ background: white;
511
+ display: flex;
512
+ gap: 8px;
513
+ align-items: flex-start;
514
+ }
515
+
516
+ .reply-input {
517
+ flex: 1;
518
+ padding: 12px;
519
+ border: 1px solid #ddd;
520
+ border-radius: 20px;
521
+ resize: none;
522
+ font-size: 14px;
523
+ direction: rtl;
524
+ }
525
+
526
+ .send-reply-btn {
527
+ background: #4caf50;
528
+ color: white;
529
+ border: none;
530
+ width: 36px;
531
+ height: 36px;
532
+ border-radius: 50%;
533
+ display: flex;
534
+ align-items: center;
535
+ justify-content: center;
536
+ cursor: pointer;
537
+
538
+ }
539
+ .reply-btn{
540
+ color: blue;
541
+ cursor: pointer;
542
+ margin-right: 82%;
543
+ transform: translate(0%, -18px);
544
+ }
545
+
546
+ .send-reply-btn:hover {
547
+ background: #45a049;
548
+ }
549
+
550
+
551
+ /* أنماط زر التعديل */
552
+
553
+
554
+ .edit-btn {
555
+ background: #4CAF50;
556
+ color: white;
557
+ border: none;
558
+ padding: 8px 16px;
559
+ border-radius: 20px;
560
+ cursor: pointer;
561
+ font-size: 14px;
562
+ display: flex;
563
+ align-items: center;
564
+ gap: 8px;
565
+ margin: 20px auto 0;
566
+ }
567
+
568
+ .edit-btn:hover {
569
+ background: #45a049;
570
+ }
571
+
572
+ /* Profile Photo Upload Styles */
573
+ .profile-photo-upload {
574
+ display: flex;
575
+ gap: 10px;
576
+ justify-content: center;
577
+ margin-bottom: 20px;
578
+ }
579
+
580
+ .avatar-input {
581
+ display: none;
582
+ }
583
+
584
+ .upload-btn {
585
+ background: #4CAF50;
586
+ color: white;
587
+ padding: 8px 16px;
588
+ border-radius: 20px;
589
+ cursor: pointer;
590
+ font-size: 14px;
591
+ display: flex;
592
+ align-items: center;
593
+ gap: 8px;
594
+ }
595
+
596
+ .upload-btn:hover {
597
+ background: #45a049;
598
+ }
599
+
600
+ .remove-photo-btn {
601
+ background: #f44336;
602
+ color: white;
603
+ padding: 8px 16px;
604
+ border-radius: 20px;
605
+ border: none;
606
+ cursor: pointer;
607
+ font-size: 14px;
608
+ display: flex;
609
+ align-items: center;
610
+ gap: 8px;
611
+ }
612
+
613
+ .remove-photo-btn:hover {
614
+ background: #d32f2f;
615
+ }
616
+
617
+ /* أنماط نموذج التعديل */
618
+ .edit-form {
619
+ background: white;
620
+ padding: 20px;
621
+ border-radius: 8px;
622
+ margin: 20px 0;
623
+ box-shadow: 0 1px 2px rgba(0,0,0,0.1);
624
+ }
625
+
626
+ .edit-form h2 {
627
+ text-align: center;
628
+ margin-bottom: 20px;
629
+ color: #1a1a1a;
630
+ }
631
+
632
+ .form-group {
633
+ margin-bottom: 15px;
634
+ }
635
+
636
+ .form-group label {
637
+ display: block;
638
+ margin-bottom: 5px;
639
+ color: #1a1a1a;
640
+ }
641
+
642
+ .form-group input,
643
+ .form-group select {
644
+ width: 100%;
645
+ padding: 8px;
646
+ border: 1px solid #ddd;
647
+ border-radius: 4px;
648
+ font-size: 14px;
649
+ }
650
+
651
+ .skill-input {
652
+ display: flex;
653
+ gap: 8px;
654
+ margin-bottom: 8px;
655
+ }
656
+
657
+ .add-skill,
658
+ .remove-skill {
659
+ background: #4CAF50;
660
+ color: white;
661
+ border: none;
662
+ width: 30px;
663
+ height: 30px;
664
+ border-radius: 15px;
665
+ cursor: pointer;
666
+ display: flex;
667
+ align-items: center;
668
+ justify-content: center;
669
+ font-size: 18px;
670
+ }
671
+
672
+ .remove-skill {
673
+ background: #f44336;
674
+ }
675
+
676
+ .form-actions {
677
+ display: flex;
678
+ gap: 10px;
679
+ justify-content: flex-end;
680
+ margin-top: 20px;
681
+ }
682
+
683
+ .save-btn,
684
+ .cancel-btn {
685
+ padding: 8px 16px;
686
+ border: none;
687
+ border-radius: 4px;
688
+ cursor: pointer;
689
+ font-size: 14px;
690
+ }
691
+
692
+ .save-btn {
693
+ background: #4CAF50;
694
+ color: white;
695
+ }
696
+
697
+ .cancel-btn {
698
+ background: #f44336;
699
+ color: white;
700
+ }
701
+
702
+ /* أنماط الصفحة الرئيسية */
703
+ .back-btn {
704
+ position: fixed;
705
+ top: 20px;
706
+ left: 20px;
707
+ background: #fff;
708
+ color: #4CAF50;
709
+ border: none;
710
+ padding: 8px 16px;
711
+ border-radius: 20px;
712
+ cursor: pointer;
713
+ font-size: 14px;
714
+ display: flex;
715
+ align-items: center;
716
+ gap: 8px;
717
+ box-shadow: 0 2px 4px rgba(0,0,0,0.1);
718
+ z-index: 100;
719
+ text-decoration: none;
720
+ }
721
+
722
+ .back-btn:hover {
723
+ background-color: #f0f2f5;
724
+ }
725
+
726
+ .profile-container {
727
+ max-width: 600px;
728
+ margin: 0 auto;
729
+ /* padding: 0 15px; */
730
+ }
731
+
732
+ .profile-header {
733
+ background: #fff;
734
+ border-radius: 0 0 8px 8px;
735
+ margin-bottom: 20px;
736
+ box-shadow: 0 1px 2px rgba(0,0,0,0.1);
737
+ overflow: hidden;
738
+ /* margin-top: 20px; */
739
+ }
740
+
741
+ .cover-photo {
742
+ height: 150px;
743
+ background-color: #4CAF50;
744
+ position: relative;
745
+ }
746
+
747
+ .profile-info {
748
+ padding: 0 20px 20px;
749
+ text-align: center;
750
+ position: relative;
751
+ }
752
+
753
+ .profile-photo {
754
+ width: 120px;
755
+ height: 120px;
756
+ border-radius: 50%;
757
+ border: 4px solid #fff;
758
+ margin: -60px auto 10px;
759
+ overflow: hidden;
760
+ position: relative;
761
+ background: #fff;
762
+ box-shadow: 0 2px 4px rgba(0,0,0,0.1);
763
+ }
764
+
765
+ .profile-photo img {
766
+ width: 100%;
767
+ height: 100%;
768
+ object-fit: cover;
769
+ }
770
+
771
+ .profile-name {
772
+ font-size: 24px;
773
+ margin: 10px 0;
774
+ color: #1a1a1a;
775
+ }
776
+
777
+ .profile-details {
778
+ display: flex;
779
+ flex-direction: column;
780
+ gap: 10px;
781
+ margin: 15px 0;
782
+ }
783
+
784
+ .detail-item {
785
+ display: flex;
786
+ align-items: center;
787
+ justify-content: center;
788
+ gap: 8px;
789
+ color: #65676b;
790
+ }
791
+
792
+ .detail-item i {
793
+ color: #4CAF50;
794
+ }
795
+
796
+ .skills-section {
797
+ margin-top: 20px;
798
+ padding-top: 20px;
799
+ border-top: 1px solid #e4e6eb;
800
+ }
801
+
802
+ .skills-section h3 {
803
+ color: #1a1a1a;
804
+ margin-bottom: 15px;
805
+ }
806
+
807
+ .skills-list {
808
+ display: flex;
809
+ flex-wrap: wrap;
810
+ gap: 8px;
811
+ justify-content: center;
812
+ }
813
+
814
+ .skill-tag {
815
+ background: #e4e6eb;
816
+ padding: 6px 12px;
817
+ border-radius: 16px;
818
+ font-size: 14px;
819
+ color: #050505;
820
+ }
821
+
822
+ /* أنماط المنشورات */
823
+ .posts-section {
824
+ margin-top: 20px;
825
+ }
826
+
827
+ .posts-section h2 {
828
+ color: #1a1a1a;
829
+ margin-bottom: 15px;
830
+ text-align: center;
831
+ }
832
+
833
+ .posts-container {
834
+ margin-top: 20px;
835
+ }
836
+
837
+ .post-card {
838
+ background: #fff;
839
+ border-radius: 8px;
840
+ box-shadow: 0 1px 2px rgba(0,0,0,0.1);
841
+ margin-bottom: 20px;
842
+ }
843
+
844
+ .post-header {
845
+ display: flex;
846
+ align-items: center;
847
+ padding: 12px;
848
+ }
849
+
850
+ .post-content {
851
+ padding: 12px;
852
+ }
853
+
854
+ .post-title {
855
+ margin: 0 0 8px 0;
856
+ font-size: 18px;
857
+ text-align: right;
858
+ }
859
+
860
+ .post-content-box {
861
+ border-radius: 8px;
862
+ padding: 12px;
863
+ margin-bottom: 10px;
864
+ }
865
+
866
+ .post-text {
867
+ margin: 0;
868
+ color: #1a1a1a;
869
+ line-height: 1.6;
870
+ text-align: right;
871
+ word-wrap: break-word;
872
+ position: relative;
873
+ direction: rtl;
874
+ font-size: 16px;
875
+ }
876
+
877
+ .post-text p {
878
+ margin: 0;
879
+ padding: 4px 0;
880
+ line-height: 1.6;
881
+ }
882
+
883
+ .post-text.collapsed {
884
+ display: -webkit-box;
885
+ -webkit-line-clamp: 4;
886
+ -webkit-box-orient: vertical;
887
+ overflow: hidden;
888
+ }
889
+
890
+ .post-text.expanded {
891
+ display: block;
892
+ }
893
+
894
+ .post-text.expanded p {
895
+ white-space: pre-wrap;
896
+ padding: 2px 0;
897
+ }
898
+
899
+ .post-text p:first-child {
900
+ padding-top: 0;
901
+ }
902
+
903
+ .post-text p:last-child {
904
+ padding-bottom: 0;
905
+ }
906
+
907
+ .post-text p:empty {
908
+ min-height: 1em;
909
+ display: block;
910
+ }
911
+
912
+ .see-more-btn {
913
+ color: #1877f2;
914
+ cursor: pointer;
915
+ font-weight: 500;
916
+ margin-top: 8px;
917
+ display: none;
918
+ background: none;
919
+ border: none;
920
+ padding: 0;
921
+ text-align: right;
922
+ width: 100%;
923
+ }
924
+
925
+ .post-text-container {
926
+ position: relative;
927
+ }
928
+
929
+ .post-media {
930
+ margin-top: 10px;
931
+ border-radius: 8px;
932
+ overflow: hidden;
933
+ }
934
+
935
+ .post-media img {
936
+ width: 400px;
937
+ height: 400px;
938
+ display: block;
939
+ object-fit: cover;
940
+ margin: 0 auto;
941
+ }
942
+
943
+ .video-container {
944
+ position: relative;
945
+ padding-bottom: 56.25%;
946
+ height: 0;
947
+ overflow: hidden;
948
+ }
949
+
950
+ .video-container video {
951
+ position: absolute;
952
+ top: 0;
953
+ right: 0;
954
+ width: 100%;
955
+ height: 100%;
956
+ object-fit: cover;
957
+ }
958
+
959
+ .post-actions {
960
+ display: flex;
961
+ justify-content: space-around;
962
+ padding: 8px;
963
+ border-top: 1px solid #ddd;
964
+ }
965
+
966
+ .action-btn {
967
+ background: none;
968
+ border: none;
969
+ padding: 8px;
970
+ color: #65676b;
971
+ cursor: pointer;
972
+ font-size: 14px;
973
+ display: flex;
974
+ align-items: center;
975
+ gap: 5px;
976
+ }
977
+
978
+ .action-btn:hover {
979
+ background: #f0f2f5;
980
+ border-radius: 4px;
981
+ }
982
+
983
+ .action-btn i {
984
+ font-size: 16px;
985
+ }
986
+
987
+ .user-info {
988
+ display: flex;
989
+ flex-direction: column;
990
+ margin-right: 10px;
991
+ }
992
+
993
+ .timestamp {
994
+ font-size: 12px;
995
+ color: #65676b;
996
+ margin-top: 2px;
997
+ }
998
+
999
+ .profession {
1000
+ font-size: 12px;
1001
+ color: #4CAF50;
1002
+ margin-top: 2px;
1003
+ }
1004
+
1005
+ .profile-circle {
1006
+ width: 40px;
1007
+ height: 40px;
1008
+ border-radius: 50%;
1009
+ overflow: hidden;
1010
+ }
1011
+
1012
+ .profile-circle img {
1013
+ width: 100%;
1014
+ height: 100%;
1015
+ object-fit: cover;
1016
+ }
1017
+
1018
+ /* Post Menu Styles */
1019
+ .post-menu {
1020
+ position: relative;
1021
+ margin-right: auto;
1022
+ padding: 8px;
1023
+ }
1024
+
1025
+ .menu-dots {
1026
+ cursor: pointer;
1027
+ color: #65676b;
1028
+ padding: 8px;
1029
+ border-radius: 50%;
1030
+ }
1031
+
1032
+ .menu-dots:hover {
1033
+ background-color: #f0f2f5;
1034
+ }
1035
+
1036
+ .menu-options {
1037
+ display: none;
1038
+ position: absolute;
1039
+ left: 0;
1040
+ top: 100%;
1041
+ background: white;
1042
+ border-radius: 8px;
1043
+ box-shadow: 0 2px 4px rgba(0,0,0,0.1);
1044
+ z-index: 1000;
1045
+ min-width: 150px;
1046
+ }
1047
+
1048
+ .menu-option {
1049
+ padding: 8px 16px;
1050
+ cursor: pointer;
1051
+ color: #050505;
1052
+ display: flex;
1053
+ align-items: center;
1054
+ gap: 8px;
1055
+ }
1056
+
1057
+ .menu-option:hover {
1058
+ background-color: #f0f2f5;
1059
+ }
1060
+
1061
+ .menu-option i {
1062
+ font-size: 16px;
1063
+ width: 20px;
1064
+ }
1065
+
1066
+ .delete-post {
1067
+ color: #dc3545;
1068
+ }
1069
+
1070
+ /* Edit Title Modal */
1071
+ .edit-modal {
1072
+ display: none;
1073
+ position: fixed;
1074
+ top: 0;
1075
+ left: 0;
1076
+ width: 100%;
1077
+ height: 100%;
1078
+ background-color: rgba(0,0,0,0.5);
1079
+ z-index: 2000;
1080
+ }
1081
+
1082
+ .edit-modal-content {
1083
+ position: relative;
1084
+ background: white;
1085
+ padding: 20px;
1086
+ border-radius: 8px;
1087
+ width: 90%;
1088
+ max-width: 500px;
1089
+ margin: 50px auto;
1090
+ }
1091
+
1092
+ .edit-modal textarea {
1093
+ width: 100%;
1094
+ padding: 12px;
1095
+ margin: 10px 0;
1096
+ border: 1px solid #ddd;
1097
+ border-radius: 4px;
1098
+ font-size: 16px;
1099
+ resize: vertical;
1100
+ min-height: 120px;
1101
+ text-align: right;
1102
+ direction: rtl;
1103
+ white-space: pre-wrap;
1104
+ line-height: 1.6;
1105
+ }
1106
+
1107
+ .edit-modal-buttons {
1108
+ display: flex;
1109
+ justify-content: flex-end;
1110
+ gap: 10px;
1111
+ margin-top: 20px;
1112
+ }
1113
+
1114
+ .edit-modal-buttons button {
1115
+ padding: 8px 16px;
1116
+ border: none;
1117
+ border-radius: 4px;
1118
+ cursor: pointer;
1119
+ }
1120
+
1121
+ .edit-modal-buttons .save-btn {
1122
+ background-color: #4CAF50;
1123
+ color: white;
1124
+ }
1125
+
1126
+ .edit-modal-buttons .cancel-btn {
1127
+ background-color: #f0f2f5;
1128
+ color: #050505;
1129
+ }
1130
+
1131
+ /* Delete Confirmation Modal */
1132
+ .delete-modal {
1133
+ display: none;
1134
+ position: fixed;
1135
+ top: 0;
1136
+ left: 0;
1137
+ width: 100%;
1138
+ height: 100%;
1139
+ background-color: rgba(0,0,0,0.5);
1140
+ z-index: 2000;
1141
+ }
1142
+
1143
+ .delete-modal-content {
1144
+ position: relative;
1145
+ background: white;
1146
+ padding: 20px;
1147
+ border-radius: 8px;
1148
+ width: 90%;
1149
+ max-width: 500px;
1150
+ margin: 50px auto;
1151
+ text-align: center;
1152
+ }
1153
+
1154
+ .delete-modal-buttons {
1155
+ display: flex;
1156
+ justify-content: center;
1157
+ gap: 10px;
1158
+ margin-top: 20px;
1159
+ }
1160
+
1161
+ .delete-modal-buttons button {
1162
+ padding: 8px 16px;
1163
+ border: none;
1164
+ border-radius: 4px;
1165
+ cursor: pointer;
1166
+ }
1167
+
1168
+ .delete-modal-buttons .confirm-delete {
1169
+ background-color: #dc3545;
1170
+ color: white;
1171
+ }
1172
+
1173
+ .delete-modal-buttons .cancel-delete {
1174
+ background-color: #f0f2f5;
1175
+ color: #050505;
1176
+ }
1177
+
1178
+
1179
+ .replies-toggle {
1180
+ margin-top: 5px;
1181
+ font-size: 14px;
1182
+ display: flex;
1183
+ align-items: center;
1184
+ }
1185
+
1186
+ .replies-toggle i {
1187
+ margin-right: 5px;
1188
+ }
1189
+
1190
+ .nested-comments {
1191
+ margin-left: 20px;
1192
+ border-left: 1px solid #ddd;
1193
+ padding-left: 10px;
1194
+ }
1195
+
1196
+
1197
+ .filter-buttons {
1198
+ display: flex;
1199
+ justify-content: center;
1200
+ gap: 10px;
1201
+ margin-bottom: 20px;
1202
+ }
1203
+
1204
+ .filter-btn {
1205
+ padding: 8px 16px;
1206
+ border: none;
1207
+ border-radius: 20px;
1208
+ background-color: #f0f2f5;
1209
+ color: #1a1a1a;
1210
+ cursor: pointer;
1211
+ font-size: 14px;
1212
+ }
1213
+
1214
+ .filter-btn.active {
1215
+ background-color: #4CAF50;
1216
+ color: white;
1217
+ }
1218
+
1219
+ </style>
1220
+
1221
+ <!-- Edit Post Modal -->
1222
+ <div class="edit-modal" id="editModal">
1223
+ <div class="edit-modal-content">
1224
+ <h3>تعديل المنشور</h3>
1225
+ <textarea id="editContentInput" placeholder="أدخل محتوى المنشور" rows="5"></textarea>
1226
+ <div class="edit-modal-buttons">
1227
+ <button class="save-btn" id="saveEditBtn">حفظ</button>
1228
+ <button class="cancel-btn" id="cancelEditBtn">إلغاء</button>
1229
+ </div>
1230
+ </div>
1231
+ </div>
1232
+
1233
+ <!-- Delete Confirmation Modal -->
1234
+ <div class="delete-modal" id="deleteModal">
1235
+ <div class="delete-modal-content">
1236
+ <h3>تأكيد الحذف</h3>
1237
+ <p>هل أنت متأكد من حذف هذا المنشور؟</p>
1238
+ <div class="delete-modal-buttons">
1239
+ <button class="confirm-delete" id="confirmDeleteBtn">حذف</button>
1240
+ <button class="cancel-delete" id="cancelDeleteBtn">إلغاء</button>
1241
+ </div>
1242
+ </div>
1243
+ </div>
1244
+
1245
+
1246
+
1247
+
1248
+
1249
+ {% endblock %}
1250
+
1251
+ {% block scripts %}
1252
+ <script>
1253
+ // Comments Functionality
1254
+ // Comments Functionality
1255
+ $(document).ready(function () {
1256
+ const commentsContainer = $("#commentsFixedContainer");
1257
+ const commentsOverlay = $("#commentsOverlay");
1258
+ const closeComments = $(".close-comments");
1259
+ let currentPostId = null;
1260
+
1261
+ // Reply Modal Elements
1262
+ const replyContainer = $("#replyFixedContainer");
1263
+ const replyOverlay = $("#replyOverlay");
1264
+ const closeReply = $(".close-reply");
1265
+ let currentCommentId = null;
1266
+
1267
+ // تحميل التعليقات عند النقر على زر التعليق
1268
+ $(".comment-btn").click(function () {
1269
+ const postId = $(this).data("post-id");
1270
+ currentPostId = postId;
1271
+
1272
+ // تحميل التعليقات
1273
+ loadComments(postId);
1274
+
1275
+ // عرض الخلفية والحاوية
1276
+ commentsOverlay.css("display", "block");
1277
+ commentsContainer.css("display", "block");
1278
+ document.body.style.overflow = "hidden"; // منع السكرول في الصفحة الرئيسية
1279
+ setTimeout(() => {
1280
+ commentsContainer.addClass("active");
1281
+ }, 10);
1282
+ });
1283
+
1284
+ // إغلاق التعليقات عند النقر خارج الحاوية
1285
+ commentsOverlay.click(function () {
1286
+ closeCommentsContainer();
1287
+ });
1288
+
1289
+ // إغلاق حاوية التعليقات
1290
+ closeComments.click(function () {
1291
+ closeCommentsContainer();
1292
+ });
1293
+
1294
+ // دالة إغلاق حاوية التعليقات
1295
+ function closeCommentsContainer() {
1296
+ commentsContainer.removeClass("active");
1297
+ document.body.style.overflow = "auto"; // إعادة تفعيل السكرول في الصفحة الرئيسية
1298
+ setTimeout(() => {
1299
+ commentsContainer.css("display", "none");
1300
+ commentsOverlay.css("display", "none");
1301
+ }, 300);
1302
+ }
1303
+
1304
+ // إرسال التعليق
1305
+ $(".send-comment-btn").click(function () {
1306
+ const input = commentsContainer.find(".comment-input");
1307
+ const content = input.val().trim();
1308
+
1309
+ if (content && currentPostId) {
1310
+ $.ajax({
1311
+ url: "/add_comment",
1312
+ method: "POST",
1313
+ data: {
1314
+ post_id: currentPostId,
1315
+ content: content,
1316
+ parent_id: null, // Root comment
1317
+ },
1318
+ success: function (response) {
1319
+ if (response.success) {
1320
+ input.val("");
1321
+ loadComments(currentPostId);
1322
+ }
1323
+ },
1324
+ });
1325
+ }
1326
+ });
1327
+
1328
+ // تحميل التعليقات
1329
+ function loadComments(postId) {
1330
+ $.get(`/get_comments/${postId}`, function (comments) {
1331
+ const commentsList = commentsContainer.find(".comments-list");
1332
+ commentsList.empty();
1333
+
1334
+ comments.forEach(function (comment) {
1335
+ const commentHtml = generateCommentHtml(comment);
1336
+ commentsList.append(commentHtml);
1337
+ });
1338
+ });
1339
+ }
1340
+
1341
+ // دالة لتوليد HTML للتعليقات والردود
1342
+ function generateCommentHtml(comment) {
1343
+ const hasReplies = comment.replies && comment.replies.length > 0;
1344
+ const repliesCount = hasReplies
1345
+ ? `${comment.replies.length} رداً`
1346
+ : "";
1347
+
1348
+ const repliesHtml = hasReplies
1349
+ ? comment.replies
1350
+ .map((reply) => generateReplyHtml(reply))
1351
+ .join("")
1352
+ : "";
1353
+
1354
+ return `
1355
+ <div class="comment-item">
1356
+ <div class="comment-user-avatar">
1357
+ <img src="/static/${
1358
+ comment.profile_photo
1359
+ }" alt="${comment.username}">
1360
+ </div>
1361
+ <div class="comment-bubble">
1362
+ <div class="comment-header">
1363
+ <span class="comment-username">${comment.username}</span>
1364
+ </div>
1365
+ <div class="comment-content">${comment.content}</div>
1366
+ <div class="comment-time">${comment.created_at}</div>
1367
+
1368
+ <!-- عرض زر الردود المخفية إذا كان هناك ردود -->
1369
+ ${
1370
+ hasReplies
1371
+ ? `
1372
+ <div class="replies-toggle" data-comment-id="${comment.id}">
1373
+ <span class="replies-toggle-text" style="color: blue; cursor: pointer;">
1374
+ <i class="fas fa-chevron-down"></i> ${repliesCount}
1375
+ </span>
1376
+ </div>
1377
+ `
1378
+ : ""
1379
+ }
1380
+
1381
+ <!-- زر الرد -->
1382
+ <button class="reply-btn" data-comment-id="${
1383
+ comment.id
1384
+ }" style="color: blue; cursor: pointer;">رد</button>
1385
+
1386
+ <!-- عرض الردود أسفل التعليق الرئيسي -->
1387
+ <div class="replies-container" style="display: ${
1388
+ hasReplies ? "block" : "none"
1389
+ };">
1390
+ ${repliesHtml}
1391
+ </div>
1392
+ </div>
1393
+ </div>
1394
+ `;
1395
+ }
1396
+
1397
+ // دالة لتوليد HTML للردود
1398
+ function generateReplyHtml(reply) {
1399
+ return `
1400
+ <div class="comment-item nested-comment">
1401
+ <div class="comment-user-avatar">
1402
+ <img src="/static/${
1403
+ reply.profile_photo
1404
+ }" alt="${reply.username}">
1405
+ </div>
1406
+ <div class="comment-bubble">
1407
+ <div class="comment-header">
1408
+ <span class="comment-username">${reply.username}</span>
1409
+ </div>
1410
+ <div class="comment-content">${reply.content}</div>
1411
+ <div class="comment-time">${reply.created_at}</div>
1412
+ </div>
1413
+ </div>
1414
+ `;
1415
+ }
1416
+
1417
+ // إظهار حقل الرد عند النقر على زر الرد
1418
+ $(document).on("click", ".reply-btn", function () {
1419
+ currentCommentId = $(this).data("comment-id");
1420
+ replyOverlay.css("display", "block");
1421
+ replyContainer.css("display", "block");
1422
+ setTimeout(() => {
1423
+ replyContainer.addClass("active");
1424
+ }, 10);
1425
+ });
1426
+
1427
+ // إغلاق الرد عند النقر خارج الحاوية
1428
+ replyOverlay.click(function () {
1429
+ closeReplyContainer();
1430
+ });
1431
+
1432
+ // إغلاق حاوية الرد
1433
+ closeReply.click(function () {
1434
+ closeReplyContainer();
1435
+ });
1436
+
1437
+ // دالة إغلاق حاوية الرد
1438
+ function closeReplyContainer() {
1439
+ replyContainer.removeClass("active");
1440
+ setTimeout(() => {
1441
+ replyContainer.css("display", "none");
1442
+ replyOverlay.css("display", "none");
1443
+ }, 300);
1444
+ }
1445
+
1446
+ // إرسال الرد على تعليق
1447
+ $(".send-reply-btn").click(function () {
1448
+ const input = replyContainer.find(".reply-input");
1449
+ const content = input.val().trim();
1450
+
1451
+ if (content && currentPostId && currentCommentId) {
1452
+ $.ajax({
1453
+ url: "/add_comment",
1454
+ method: "POST",
1455
+ data: {
1456
+ post_id: currentPostId,
1457
+ content: content,
1458
+ parent_id: currentCommentId, // Associate reply with parent
1459
+ },
1460
+ success: function (response) {
1461
+ if (response.success) {
1462
+ input.val("");
1463
+ closeReplyContainer();
1464
+ loadComments(currentPostId);
1465
+ }
1466
+ },
1467
+ });
1468
+ }
1469
+ });
1470
+
1471
+ // إظهار أو إخفاء الردود عند النقر على زر "12 رداً" أو ما يعادله
1472
+ $(document).on("click", ".replies-toggle-text", function () {
1473
+ const toggle = $(this).closest(".replies-toggle");
1474
+ const repliesContainer = toggle.siblings(".replies-container");
1475
+ const icon = toggle.find("i");
1476
+
1477
+ if (repliesContainer.is(":visible")) {
1478
+ repliesContainer.slideUp();
1479
+ icon.removeClass("fa-chevron-up").addClass("fa-chevron-down");
1480
+ } else {
1481
+ repliesContainer.slideDown();
1482
+ icon.removeClass("fa-chevron-down").addClass("fa-chevron-up");
1483
+ }
1484
+ });
1485
+ });
1486
+
1487
+
1488
+
1489
+ </script>
1490
+
1491
+ <script>
1492
+ $(document).ready(function() {
1493
+ // تبديل عرض نموذج التعديل
1494
+ $('#editProfileBtn').click(function() {
1495
+ $('#editProfileForm').slideDown();
1496
+ });
1497
+
1498
+ $('#cancelEdit').click(function() {
1499
+ $('#editProfileForm').slideUp();
1500
+ });
1501
+
1502
+ // إدارة المهارات
1503
+ $('.add-skill').click(function() {
1504
+ const skillValue = $(this).siblings('.skill-field').val();
1505
+ if (skillValue.trim() !== "") {
1506
+ const skillInput = `
1507
+ <div class="skill-input">
1508
+ <input type="text" name="skill" class="skill-field" value="${skillValue}">
1509
+ <button type="button" class="remove-skill">-</button>
1510
+ </div>
1511
+ `;
1512
+ $(this).parent().before(skillInput);
1513
+ $(this).siblings('.skill-field').val("");
1514
+ }
1515
+ });
1516
+
1517
+ $(document).on('click', '.remove-skill', function() {
1518
+ $(this).parent().remove();
1519
+ });
1520
+
1521
+ // تقديم النموذج
1522
+ $('#profileForm').on('submit', function(e) {
1523
+ const skills = [];
1524
+ $('.skill-field').each(function() {
1525
+ const skill = $(this).val().trim();
1526
+ if (skill) {
1527
+ skills.push(skill);
1528
+ }
1529
+ });
1530
+ $('#skills').val(JSON.stringify(skills));
1531
+ });
1532
+
1533
+ // التحقق من اسم المستخدم
1534
+ $('#username').on('input', function() {
1535
+ const username = $(this).val();
1536
+ if (username && username !== '{{ current_user.username }}') {
1537
+ $.get('/validate-username', { username: username }, function(data) {
1538
+ if (data.exists) {
1539
+ $('#username-validation-message').text('اسم المستخدم مستخدم بالفعل').addClass('error').removeClass('success');
1540
+ } else {
1541
+ $('#username-validation-message').text('اسم المستخدم متاح').addClass('success').removeClass('error');
1542
+ }
1543
+ });
1544
+ } else {
1545
+ $('#username-validation-message').text('');
1546
+ }
1547
+ });
1548
+
1549
+ // تفعيل قائمة النقاط الثلاث
1550
+ $('.menu-dots').click(function(e) {
1551
+ e.stopPropagation();
1552
+ const menuOptions = $(this).siblings('.menu-options');
1553
+ $('.menu-options').not(menuOptions).hide();
1554
+ menuOptions.toggle();
1555
+ });
1556
+
1557
+ // إغلاق القائمة عند النقر في أي مكان آخر
1558
+ $(document).click(function() {
1559
+ $('.menu-options').hide();
1560
+ });
1561
+
1562
+ // منع إغلاق القائمة عند النقر داخلها
1563
+ $('.menu-options').click(function(e) {
1564
+ e.stopPropagation();
1565
+ });
1566
+
1567
+ let currentPostId = null;
1568
+
1569
+ // تفعيل زر تعديل المنشور
1570
+ $('.edit-post').click(function() {
1571
+ currentPostId = $(this).data('post-id');
1572
+ const $text = $(this).closest('.post-card').find('.post-text');
1573
+ const paragraphs = [];
1574
+ $text.find('p').each(function() {
1575
+ const content = $(this).text();
1576
+ if (content === '\u00A0') { // &nbsp;
1577
+ paragraphs.push('');
1578
+ } else {
1579
+ paragraphs.push(content);
1580
+ }
1581
+ });
1582
+ $('#editContentInput').val(paragraphs.join('\n'));
1583
+ $('#editModal').show();
1584
+ });
1585
+
1586
+ // إغلاق نافذة التعديل
1587
+ $('#cancelEditBtn').click(function() {
1588
+ $('#editModal').hide();
1589
+ });
1590
+
1591
+ // حفظ التعديل
1592
+ $('#saveEditBtn').click(function() {
1593
+ const newContent = $('#editContentInput').val();
1594
+ if (currentPostId && newContent.trim()) {
1595
+ $.ajax({
1596
+ url: '/edit_post_content',
1597
+ method: 'POST',
1598
+ data: {
1599
+ post_id: currentPostId,
1600
+ new_content: newContent
1601
+ },
1602
+ success: function(response) {
1603
+ if (response.success) {
1604
+ location.reload();
1605
+ }
1606
+ }
1607
+ });
1608
+ }
1609
+ $('#editModal').hide();
1610
+ });
1611
+
1612
+ // تفعيل زر حذف المنشور
1613
+ $('.delete-post').click(function() {
1614
+ currentPostId = $(this).data('post-id');
1615
+ $('#deleteModal').show();
1616
+ });
1617
+
1618
+ // إغلاق نافذة تأكيد الحذف
1619
+ $('#cancelDeleteBtn').click(function() {
1620
+ $('#deleteModal').hide();
1621
+ });
1622
+
1623
+ // تأكيد الحذف
1624
+ $('#confirmDeleteBtn').click(function() {
1625
+ if (currentPostId) {
1626
+ $.ajax({
1627
+ url: '/delete_post',
1628
+ method: 'POST',
1629
+ data: {
1630
+ post_id: currentPostId
1631
+ },
1632
+ success: function(response) {
1633
+ if (response.success) {
1634
+ location.reload();
1635
+ }
1636
+ }
1637
+ });
1638
+ }
1639
+ $('#deleteModal').hide();
1640
+ });
1641
+
1642
+ // تفعيل زر إظهار المزيد
1643
+ $('.post-text').each(function() {
1644
+ const $text = $(this);
1645
+ const $btn = $text.closest('.post-content-box').find('.see-more-btn');
1646
+
1647
+ // Get the original content
1648
+ const content = $text.html();
1649
+
1650
+ // Calculate line height and text height
1651
+ const lineHeight = parseInt(window.getComputedStyle($text[0]).lineHeight);
1652
+ const textHeight = $text[0].scrollHeight;
1653
+ const numLines = Math.floor(textHeight / lineHeight);
1654
+
1655
+ // Show button only if text has more than 4 lines
1656
+ if (numLines > 4) {
1657
+ $btn.show();
1658
+ $text.addClass('has-more');
1659
+ }
1660
+ });
1661
+
1662
+ $('.see-more-btn').click(function() {
1663
+ const $btn = $(this);
1664
+ const $text = $btn.closest('.post-content-box').find('.post-text');
1665
+
1666
+ if ($text.hasClass('collapsed')) {
1667
+ $text.removeClass('collapsed').addClass('expanded');
1668
+ $btn.text('إظهار أقل');
1669
+ } else {
1670
+ $text.removeClass('expanded').addClass('collapsed');
1671
+ $btn.text('إظهار المزيد');
1672
+ }
1673
+ });
1674
+
1675
+ // Profile Photo Upload Functionality
1676
+ $('#avatar').change(function(e) {
1677
+ if (this.files && this.files[0]) {
1678
+ const reader = new FileReader();
1679
+ reader.onload = function(e) {
1680
+ $('.profile-photo img').attr('src', e.target.result);
1681
+ }
1682
+ reader.readAsDataURL(this.files[0]);
1683
+ }
1684
+ });
1685
+
1686
+ // Remove Photo Functionality
1687
+ $('#removePhotoBtn').click(function() {
1688
+ $('.profile-photo img').attr('src', "{{ url_for('static', filename='uploads/default-avatar.jpg') }}");
1689
+ $('#avatar').val('');
1690
+ // Add a hidden input to signal photo removal
1691
+ if (!$('#remove_photo').length) {
1692
+ $('<input>').attr({
1693
+ type: 'hidden',
1694
+ id: 'remove_photo',
1695
+ name: 'remove_photo',
1696
+ value: 'true'
1697
+ }).appendTo('#profileForm');
1698
+ }
1699
+ });
1700
+ });
1701
+
1702
+
1703
+
1704
+
1705
+ document.addEventListener("DOMContentLoaded", function () {
1706
+ document.querySelectorAll(".share-btn").forEach(function (button) {
1707
+ button.addEventListener("click", function () {
1708
+ const postId = this.dataset.postId;
1709
+ const shareUrl = `${window.location.origin}/post/${postId}`;
1710
+
1711
+ if (navigator.clipboard && navigator.clipboard.writeText) {
1712
+ navigator.clipboard.writeText(shareUrl).then(function () {
1713
+ showPopup("تم نسخ الرابط");
1714
+ }).catch(function (err) {
1715
+ console.error("فشل نسخ الرابط: ", err);
1716
+ });
1717
+ } else {
1718
+ const tempInput = document.createElement("input");
1719
+ tempInput.value = shareUrl;
1720
+ document.body.appendChild(tempInput);
1721
+ tempInput.select();
1722
+ try {
1723
+ document.execCommand("copy");
1724
+ showPopup("تم نسخ الرابط ");
1725
+ } catch (err) {
1726
+ console.error("فشل نسخ الرابط باستخدام الطريقة البديلة: ", err);
1727
+ }
1728
+ document.body.removeChild(tempInput);
1729
+ }
1730
+
1731
+ function showPopup(message) {
1732
+ const modal = document.createElement("div");
1733
+ modal.style.position = "fixed";
1734
+ modal.style.bottom = "20%";
1735
+ modal.style.left = "50%";
1736
+ modal.style.transform = "translateX(-50%)";
1737
+ modal.style.backgroundColor = "#333";
1738
+ modal.style.color = "#fff";
1739
+ modal.style.padding = "15px 20px";
1740
+ modal.style.borderRadius = "8px";
1741
+ modal.style.boxShadow = "0 4px 6px rgba(0, 0, 0, 0.1)";
1742
+ modal.style.opacity = "0";
1743
+ modal.style.transition = "opacity 0.4s ease, bottom 0.4s ease";
1744
+ modal.style.zIndex = "1000";
1745
+ modal.textContent = message;
1746
+
1747
+ document.body.appendChild(modal);
1748
+
1749
+ setTimeout(() => {
1750
+ modal.style.opacity = "1";
1751
+ modal.style.bottom = "25%";
1752
+ }, 10);
1753
+
1754
+ setTimeout(() => {
1755
+ modal.style.opacity = "0";
1756
+ modal.style.bottom = "20%";
1757
+ setTimeout(() => {
1758
+ modal.remove();
1759
+ }, 400);
1760
+ }, 3000);
1761
+ }
1762
+ });
1763
+ });
1764
+ });
1765
+
1766
+
1767
+
1768
+ $(document).ready(function () {
1769
+ // تفعيل الفلترات
1770
+ $('.filter-btn').click(function () {
1771
+ // إزالة النشط من جميع الأزرار
1772
+ $('.filter-btn').removeClass('active');
1773
+ // إضافة النشط للزر المحدد
1774
+ $(this).addClass('active');
1775
+
1776
+ const filterType = $(this).attr('id'); // الحصول على نوع الفلتر
1777
+ let hasPosts = false; // متغير لتتبع وجود منشورات مطابقة
1778
+
1779
+ // إخفاء جميع المنشورات
1780
+ $('.post-card').hide();
1781
+
1782
+ if (filterType === 'filterAll') {
1783
+ // عرض جميع المنشورات
1784
+ $('.post-card').show();
1785
+ hasPosts = $('.post-card').length > 0; // تحقق إذا كان هناك منشورات
1786
+ } else if (filterType === 'filterImages') {
1787
+ // عرض المنشورات التي تحتوي على صور فقط
1788
+ $('.post-card').each(function () {
1789
+ if ($(this).find('.post-media img').length > 0) {
1790
+ $(this).show();
1791
+ hasPosts = true; // يوجد منشورات مطابقة
1792
+ }
1793
+ });
1794
+ } else if (filterType === 'filterVideos') {
1795
+ // عرض المنشورات التي تحتوي على فيديوهات فقط
1796
+ $('.post-card').each(function () {
1797
+ if ($(this).find('.post-media video').length > 0) {
1798
+ $(this).show();
1799
+ hasPosts = true; // يوجد منشورات مطابقة
1800
+ }
1801
+ });
1802
+ } else if (filterType === 'filterText') {
1803
+ // عرض المنشورات التي تحتوي على نص فقط
1804
+ $('.post-card').each(function () {
1805
+ if ($(this).find('.post-text').length > 0 && $(this).find('.post-media').length === 0) {
1806
+ $(this).show();
1807
+ hasPosts = true; // يوجد منشورات مطابقة
1808
+ }
1809
+ });
1810
+ }
1811
+
1812
+ // إظهار أو إخفاء الرسالة بناءً على وجود منشورات مطابقة
1813
+ if (hasPosts) {
1814
+ $('#noPostsMessage').hide(); // إخفاء الرسالة إذا كانت هناك منشورات
1815
+ } else {
1816
+ $('#noPostsMessage').show(); // إظهار الرسالة إذا لم تكن هناك منشورات
1817
+ }
1818
+ });
1819
+ });
1820
+
1821
+ // فكرة بحيث يظهر مشاركة عبر
1822
+
1823
+
1824
+
1825
+
1826
+ </script>
1827
+ {% endblock %}
templates/public_profile.html ADDED
@@ -0,0 +1,1984 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {% extends "base.html" %}
2
+
3
+ {% block title %}{{ user.username }} - الملف الشخصي{% endblock %}
4
+
5
+ {% block content %}
6
+ <div class="profile-container">
7
+ <!-- قسم معلومات الملف الشخصي -->
8
+ <div class="profile-header">
9
+ <div class="cover-photo"></div>
10
+ <div class="profile-info">
11
+ <div class="profile-photo">
12
+ <img src="{{ url_for('static', filename=user.profile_photo) }}" alt="الصورة الشخصية">
13
+ </div>
14
+ <h1 class="profile-name">{{ user.username }}</h1>
15
+ <div class="profile-details">
16
+ <div class="detail-item">
17
+ <i class="fas fa-envelope"></i>
18
+ <span>{{ user.email }}</span>
19
+ </div>
20
+ <div class="detail-item">
21
+ <i class="fas fa-briefcase"></i>
22
+ <span>{{ user.profession }}</span>
23
+ </div>
24
+ </div>
25
+ <div class="skills-section">
26
+ <h3>المهارات</h3>
27
+ <div class="skills-list">
28
+ {% for skill in user.skills|from_json %}
29
+ <span class="skill-tag">{{ skill }}</span>
30
+ {% endfor %}
31
+ </div>
32
+ </div>
33
+ <!-- <button id="editProfileBtn" class="edit-btn">
34
+ <i class="fas fa-edit"></i>
35
+ تعديل الملف الشخصي
36
+ </button> -->
37
+ </div>
38
+ </div>
39
+
40
+ </button>
41
+ <!-- زر المراسلة -->
42
+ <a href="#" class="message-btn" onclick="openMessage()">
43
+ <i class="fas fa-envelope"></i>
44
+ مراسلة
45
+ </a>
46
+
47
+ <!-- الحاوية الأساسية للرسالة (بدون iframe مسبقًا) -->
48
+ <div id="message-container" class="show" style="display: none;">
49
+ <div id="message-header">
50
+ <!-- <button id="close-btn">×</button> -->
51
+ </div>
52
+ <!-- سيتم إضافة iframe هنا ديناميكيًا -->
53
+ </div>
54
+
55
+ <div class="filter-buttons">
56
+ <button id="filterAll" class="filter-btn active">الكل</button>
57
+ <button id="filterImages" class="filter-btn">الصور</button>
58
+ <button id="filterVideos" class="filter-btn">الفيديوهات</button>
59
+ <button id="filterText" class="filter-btn">النص</button>
60
+ </div>
61
+
62
+ <div id="noPostsMessage" style="display: none; text-align: center; margin-top: 20px; color: #666;">
63
+ لا توجد منشورات تطابق الفلتر المحدد.
64
+ </div>
65
+
66
+ <!-- نموذج تعديل الملف الشخصي -->
67
+ <div id="editProfileForm" class="edit-form" style="display: none;">
68
+ <h2>تعديل الملف الشخصي</h2>
69
+ <form id="profileForm" method="POST" action="{{ url_for('update_profile') }}" enctype="multipart/form-data">
70
+ <div class="form-group">
71
+ <label>الصورة الشخصية</label>
72
+ <div class="profile-photo-upload">
73
+ <input type="file" id="avatar" name="avatar" accept="image/*" class="avatar-input">
74
+ <label for="avatar" class="upload-btn">
75
+ <i class="fas fa-camera"></i>
76
+ تغيير الصورة
77
+ </label>
78
+ <button type="button" class="remove-photo-btn" id="removePhotoBtn">
79
+ <i class="fas fa-times"></i>
80
+ إزالة الصورة
81
+ </button>
82
+ </div>
83
+ </div>
84
+ <div class="form-group">
85
+ <label for="username">اسم المستخدم</label>
86
+ <input type="text" id="username" name="username" value="{{ user.username }}" required>
87
+ <small class="form-text">@moltka.eg</small>
88
+ <span id="username-validation-message"></span>
89
+ </div>
90
+
91
+ <div class="form-group">
92
+ <label for="profession">المجال المهني</label>
93
+ <select id="profession" name="profession" required>
94
+ <option value="">اختر المجال المهني</option>
95
+ <option value="مطور ويب" {% if user.profession == "مطور ويب" %}selected{% endif %}>مطور ويب</option>
96
+ <option value="مطور واجهة خلفية" {% if user.profession == "مطور واجهة خلفية" %}selected{% endif %}>مطور واجهة خلفية</option>
97
+ <option value="برمجة" {% if user.profession == "برمجة" %}selected{% endif %}>برمجة</option>
98
+ <option value="مطور ألعاب" {% if user.profession == "مطور ألعاب" %}selected{% endif %}>مطور ألعاب</option>
99
+ <option value="مطور أندرويد" {% if user.profession == "مطور أندرويد" %}selected{% endif %}>مطور أندرويد</option>
100
+ <option value="مطور iOS" {% if user.profession == "مطور iOS" %}selected{% endif %}>مطور iOS</option>
101
+ <option value="مهندس" {% if user.profession == "مهندس" %}selected{% endif %}>مهندس</option>
102
+ <option value="طبيب" {% if user.profession == "طبيب" %}selected{% endif %}>طبيب</option>
103
+ <option value="علوم اجتماعية" {% if user.profession == "علوم اجتماعية" %}selected{% endif %}>علوم اجتماعية</option>
104
+ <option value="معلم" {% if user.profession == "معلم" %}selected{% endif %}>معلم</option>
105
+ <option value="محاسب" {% if user.profession == "محاسب" %}selected{% endif %}>محاسب</option>
106
+ <option value="صحفي" {% if user.profession == "صحفي" %}selected{% endif %}>صحفي</option>
107
+ <option value="محامي" {% if user.profession == "محامي" %}selected{% endif %}>محامي</option>
108
+ <option value="مصمم جرافيكي" {% if user.profession == "مصمم جرافيكي" %}selected{% endif %}>مصمم جرافيكي</option>
109
+ <option value="مصور" {% if user.profession == "مصور" %}selected{% endif %}>مصور</option>
110
+ <option value="كاتب" {% if user.profession == "كاتب" %}selected{% endif %}>كاتب</option>
111
+ <option value="مدرب رياضي" {% if user.profession == "مدرب رياضي" %}selected{% endif %}>مدرب رياضي</option>
112
+ <option value="طاهي" {% if user.profession == "طاهي" %}selected{% endif %}>طاهي</option>
113
+ <option value="ديني" {% if user.profession == "ديني" %}selected{% endif %}>ديني</option>
114
+ <option value="شاعر" {% if user.profession == "شاعر" %}selected{% endif %}>شاعر</option>
115
+ <option value="رسام" {% if user.profession == "رسام" %}selected{% endif %}>رسام</option>
116
+ <option value="محلل مالي" {% if user.profession == "محلل مالي" %}selected{% endif %}>محلل مالي</option>
117
+ <option value="فني صيانة" {% if user.profession == "فني صيانة" %}selected{% endif %}>فني صيانة</option>
118
+ <option value="باحث" {% if user.profession == "باحث" %}selected{% endif %}>باحث</option>
119
+ <option value="IT" {% if user.profession == "IT" %}selected{% endif %}>IT</option>
120
+ </select>
121
+ </div>
122
+
123
+ <div class="form-group">
124
+ <label>المهارات</label>
125
+ <div id="skills-container">
126
+ {% for skill in user.skills|from_json %}
127
+ <div class="skill-input">
128
+ <input type="text" name="skill" class="skill-field" value="{{ skill }}">
129
+ <button type="button" class="remove-skill">-</button>
130
+ </div>
131
+ {% endfor %}
132
+ <div class="skill-input">
133
+ <input type="text" name="skill" class="skill-field">
134
+ <button type="button" class="add-skill">+</button>
135
+ </div>
136
+ </div>
137
+ <input type="hidden" id="skills" name="skills">
138
+ </div>
139
+
140
+ <div class="form-actions">
141
+ <button type="submit" class="save-btn">حفظ التغييرات</button>
142
+ <button type="button" class="cancel-btn" id="cancelEdit">إلغاء</button>
143
+ </div>
144
+ </form>
145
+ </div>
146
+
147
+ <!-- قسم المنشورات -->
148
+ <div class="posts-section">
149
+ <h2>المنشورات</h2>
150
+ <div class="posts-container">
151
+ {% for post in posts %}
152
+ <div class="post-card">
153
+ <div class="post-header">
154
+ <div class="profile-circle">
155
+ <img src="{{ url_for('static', filename=user.profile_photo) }}" alt="صورة الملف الشخصي">
156
+ </div>
157
+ <div class="user-info">
158
+ <span class="username">{{ user.username }}</span>
159
+ <span class="profession">{{ post.user_profession }}</span>
160
+ <span class="timestamp">{{ post.created_at|format_datetime }}</span>
161
+ </div>
162
+ <div class="post-menu">
163
+ <!-- <i class="fas fa-ellipsis-v menu-dots"></i> -->
164
+ <div class="menu-options">
165
+ <div class="menu-option edit-post" data-post-id="{{ post.id }}">
166
+ <i class="fas fa-edit"></i> تعديل المنشور
167
+ </div>
168
+ <div class="menu-option delete-post" data-post-id="{{ post.id }}">
169
+ <i class="fas fa-trash"></i> حذف المنشور
170
+ </div>
171
+ </div>
172
+ </div>
173
+ </div>
174
+
175
+ <div class="post-content" {% if post.background_color and not post.image_url %}style="background-color: {{ post.background_color }}; border-radius: 8px; text-align: center; font-size: 24px;"{% endif %}>
176
+ {% if post.title %}
177
+ <h3 class="post-title">{{ post.title }}</h3>
178
+ {% endif %}
179
+ {% if post.content %}
180
+ <div class="post-text-container">
181
+ <div class="post-content-box">
182
+ <div class="post-text collapsed" {% if post.background_color and not post.image_url %}style="color: {% if post.background_color == '#ffffff' %}#1a1a1a{% else %}#000000{% endif %};"{% endif %}>
183
+ {% for line in post.content.split('\n') %}
184
+ {% if line.strip() %}
185
+ <p>{{ line }}</p>
186
+ {% else %}
187
+ <p>&nbsp;</p>
188
+ {% endif %}
189
+ {% endfor %}
190
+ </div>
191
+ <button class="see-more-btn" style="display: none;">إظهار المزيد</button>
192
+ </div>
193
+ </div>
194
+ {% endif %}
195
+ {% if post.image_url %}
196
+ <div class="post-media">
197
+ <img src="{{ url_for('static', filename=post.image_url) }}" alt="صورة المنشور">
198
+ </div>
199
+ {% endif %}
200
+ {% if post.video_url %}
201
+ <div class="post-media video-container">
202
+ <video src="{{ url_for('static', filename=post.video_url) }}" controls></video>
203
+ </div>
204
+ {% endif %}
205
+ </div>
206
+
207
+ <div class="post-actions">
208
+ <button class="action-btn comment-btn" data-post-id="{{ post.id }}">
209
+ <i class="fas fa-comment"></i> تعليق
210
+ </button>
211
+ <button class="action-btn share-btn" data-post-id="{{ post.id }}">
212
+ <i class="fas fa-share"></i> مشاركة
213
+ </button>
214
+ </div>
215
+ </div>
216
+ {% endfor %}
217
+ </div>
218
+ </div>
219
+
220
+
221
+
222
+ <!-- Comments Fixed Container -->
223
+ <div class="comments-overlay" id="commentsOverlay"></div>
224
+ <div class="comments-fixed-container" id="commentsFixedContainer">
225
+ <div class="comments-content">
226
+ <div class="comments-header">
227
+ <h3>التعليقات</h3>
228
+ <span class="close-comments">&times;</span>
229
+ </div>
230
+ <div class="comments-list-container">
231
+ <div class="comments-list"></div>
232
+ </div>
233
+ <div class="comment-input-container">
234
+ <textarea
235
+ class="comment-input"
236
+ placeholder="اكتب تعليقك هنا..."
237
+ rows="1"
238
+ ></textarea>
239
+ <button class="send-comment-btn">
240
+ <i class="fas fa-paper-plane"></i>
241
+ </button>
242
+ </div>
243
+ </div>
244
+ </div>
245
+
246
+ <div class="reply-overlay" id="replyOverlay"></div>
247
+ <div class="reply-fixed-container" id="replyFixedContainer">
248
+ <div class="reply-content">
249
+ <div class="reply-header">
250
+ <h3>الرد</h3>
251
+ <span class="close-reply">&times;</span>
252
+ </div>
253
+ <div class="reply-input-container">
254
+ <textarea
255
+ class="reply-input"
256
+ placeholder="اكتب ردك هنا..."
257
+ rows="1"
258
+ ></textarea>
259
+ <button class="send-reply-btn">
260
+ <i class="fas fa-paper-plane"></i>
261
+ </button>
262
+ </div>
263
+ </div>
264
+ </div>
265
+
266
+ <!-- زر العودة للصفحة الرئيسية -->
267
+ <!-- <a href="{{ url_for('dashboard') }}" class="back-btn">
268
+ <i class="fas fa-arrow-left"></i>
269
+ العودة للرئيسية
270
+ </a> -->
271
+
272
+ <style>
273
+ /* Comments Fixed Container Styles */
274
+ .comments-overlay {
275
+ display: none;
276
+ position: fixed;
277
+ top: 0;
278
+ left: 0;
279
+ right: 0;
280
+ bottom: 0;
281
+ background-color: rgba(0, 0, 0, 0.5);
282
+ z-index: 1999;
283
+ }
284
+
285
+ .comments-fixed-container {
286
+ display: none;
287
+ position: fixed;
288
+ bottom: 0;
289
+ left: 0;
290
+ right: 0;
291
+ height: 80%;
292
+ background: white;
293
+ box-shadow: 0 -2px 10px rgba(0, 0, 0, 0.1);
294
+ z-index: 2000;
295
+ transform: translateY(100%);
296
+ transition: transform 0.3s ease-out;
297
+ }
298
+
299
+ .comments-fixed-container.active {
300
+ transform: translateY(0);
301
+ }
302
+
303
+ .comments-content {
304
+ height: 100%;
305
+ display: flex;
306
+ flex-direction: column;
307
+ }
308
+
309
+ .comments-header {
310
+ padding: 16px;
311
+ border-bottom: 1px solid #ddd;
312
+ display: flex;
313
+ justify-content: space-between;
314
+ align-items: center;
315
+ }
316
+
317
+ .comments-header h3 {
318
+ margin: 0;
319
+ text-align: center;
320
+ flex-grow: 1;
321
+ }
322
+
323
+ .close-comments {
324
+ font-size: 24px;
325
+ cursor: pointer;
326
+ color: #666;
327
+ padding: 8px;
328
+ }
329
+
330
+ .comments-list-container {
331
+ flex-grow: 1;
332
+ overflow-y: auto;
333
+ padding: 16px;
334
+ }
335
+
336
+ .comments-container {
337
+ flex-grow: 1;
338
+ overflow-y: auto;
339
+ padding: 16px;
340
+ }
341
+
342
+ .comment-input-container {
343
+ padding: 12px;
344
+ border-top: 1px solid #ddd;
345
+ background: white;
346
+ display: flex;
347
+ gap: 8px;
348
+ align-items: flex-start;
349
+ }
350
+
351
+ .comment-input {
352
+ flex: 1;
353
+ padding: 12px;
354
+ border: 1px solid #ddd;
355
+ border-radius: 20px;
356
+ resize: none;
357
+ font-size: 14px;
358
+ direction: rtl;
359
+ }
360
+
361
+ .send-comment-btn {
362
+ background: #4caf50;
363
+ color: white;
364
+ border: none;
365
+ width: 36px;
366
+ height: 36px;
367
+ border-radius: 50%;
368
+ display: flex;
369
+ align-items: center;
370
+ justify-content: center;
371
+ cursor: pointer;
372
+ }
373
+
374
+ .send-comment-btn:hover {
375
+ background: #45a049;
376
+ }
377
+
378
+ .comments-list {
379
+ display: flex;
380
+ flex-direction: column;
381
+ gap: 12px;
382
+ direction: rtl;
383
+ }
384
+
385
+ .comment-item {
386
+ display: flex;
387
+ gap: 8px;
388
+ margin-bottom: 12px;
389
+ align-items: flex-start;
390
+ padding: 0 8px;
391
+ }
392
+
393
+ .comment-user-avatar {
394
+ width: 45px;
395
+ height: 45px;
396
+ flex-shrink: 0;
397
+ margin-left: 8px;
398
+ }
399
+
400
+ .comment-user-avatar img {
401
+ width: 100%;
402
+ height: 100%;
403
+ border-radius: 50%;
404
+ object-fit: cover;
405
+ }
406
+
407
+ .comment-bubble {
408
+ background: #f0f2f5;
409
+ border-radius: 18px;
410
+ padding: 8px 12px;
411
+ flex-grow: 1;
412
+ }
413
+
414
+ .comment-header {
415
+ margin-bottom: 4px;
416
+ }
417
+
418
+ .comment-username {
419
+ font-weight: 600;
420
+ color: #050505;
421
+ font-size: 13px;
422
+ }
423
+
424
+ .comment-content {
425
+ color: #050505;
426
+ font-size: 14px;
427
+ line-height: 1.4;
428
+ word-wrap: break-word;
429
+ }
430
+
431
+ .comment-time {
432
+ font-size: 11px;
433
+ color: #65676b;
434
+ margin-top: 4px;
435
+ }
436
+
437
+ .nested-comments {
438
+ margin-left: 20px;
439
+ }
440
+
441
+ .reply-input-container {
442
+ margin-top: 10px;
443
+ }
444
+
445
+ .reply-text {
446
+ width: 100%;
447
+ padding: 12px;
448
+ border: 1px solid #ddd;
449
+ border-radius: 20px;
450
+ resize: none;
451
+ font-size: 14px;
452
+ direction: rtl;
453
+ }
454
+
455
+ .send-reply-btn {
456
+ margin-top: 5px;
457
+ color: white;
458
+ background-color: blue;
459
+ border: none;
460
+ padding: 5px 10px;
461
+ cursor: pointer;
462
+ }
463
+
464
+ /* Reply Modal Styles */
465
+ .reply-overlay {
466
+ display: none;
467
+ position: fixed;
468
+ top: 0;
469
+ left: 0;
470
+ right: 0;
471
+ bottom: 0;
472
+ background-color: rgba(0, 0, 0, 0.5);
473
+ z-index: 2001;
474
+ }
475
+
476
+ .reply-fixed-container {
477
+ display: none;
478
+ position: fixed;
479
+ bottom: 0;
480
+ left: 0;
481
+ right: 0;
482
+ height: 30%;
483
+ background: white;
484
+ box-shadow: 0 -2px 10px rgba(0, 0, 0, 0.1);
485
+ z-index: 2002;
486
+ transform: translateY(100%);
487
+ transition: transform 0.3s ease-out;
488
+ }
489
+
490
+ .reply-fixed-container.active {
491
+ transform: translateY(0);
492
+ }
493
+
494
+ .reply-content {
495
+ height: 100%;
496
+ display: flex;
497
+ flex-direction: column;
498
+ }
499
+
500
+ .reply-header {
501
+ padding: 16px;
502
+ border-bottom: 1px solid #ddd;
503
+ display: flex;
504
+ justify-content: space-between;
505
+ align-items: center;
506
+ }
507
+
508
+ .reply-header h3 {
509
+ margin: 0;
510
+ text-align: center;
511
+ flex-grow: 1;
512
+ }
513
+
514
+ .close-reply {
515
+ font-size: 24px;
516
+ cursor: pointer;
517
+ color: #666;
518
+ padding: 8px;
519
+ }
520
+
521
+ .reply-input-container {
522
+ padding: 12px;
523
+ border-top: 1px solid #ddd;
524
+ background: white;
525
+ display: flex;
526
+ gap: 8px;
527
+ align-items: flex-start;
528
+ }
529
+
530
+ .reply-input {
531
+ flex: 1;
532
+ padding: 12px;
533
+ border: 1px solid #ddd;
534
+ border-radius: 20px;
535
+ resize: none;
536
+ font-size: 14px;
537
+ direction: rtl;
538
+ }
539
+
540
+ .send-reply-btn {
541
+ background: #4caf50;
542
+ color: white;
543
+ border: none;
544
+ width: 36px;
545
+ height: 36px;
546
+ border-radius: 50%;
547
+ display: flex;
548
+ align-items: center;
549
+ justify-content: center;
550
+ cursor: pointer;
551
+
552
+ }
553
+ .reply-btn{
554
+ color: blue;
555
+ cursor: pointer;
556
+ margin-right: 82%;
557
+ transform: translate(0%, -18px);
558
+ }
559
+
560
+ .send-reply-btn:hover {
561
+ background: #45a049;
562
+ }
563
+
564
+
565
+ /* أنماط زر التعديل */
566
+
567
+
568
+ .edit-btn {
569
+ background: #4CAF50;
570
+ color: white;
571
+ border: none;
572
+ padding: 8px 16px;
573
+ border-radius: 20px;
574
+ cursor: pointer;
575
+ font-size: 14px;
576
+ display: flex;
577
+ align-items: center;
578
+ gap: 8px;
579
+ margin: 20px auto 0;
580
+ }
581
+
582
+ .edit-btn:hover {
583
+ background: #45a049;
584
+ }
585
+
586
+ /* Profile Photo Upload Styles */
587
+ .profile-photo-upload {
588
+ display: flex;
589
+ gap: 10px;
590
+ justify-content: center;
591
+ margin-bottom: 20px;
592
+ }
593
+
594
+ .avatar-input {
595
+ display: none;
596
+ }
597
+
598
+ .upload-btn {
599
+ background: #4CAF50;
600
+ color: white;
601
+ padding: 8px 16px;
602
+ border-radius: 20px;
603
+ cursor: pointer;
604
+ font-size: 14px;
605
+ display: flex;
606
+ align-items: center;
607
+ gap: 8px;
608
+ }
609
+
610
+ .upload-btn:hover {
611
+ background: #45a049;
612
+ }
613
+
614
+ .remove-photo-btn {
615
+ background: #f44336;
616
+ color: white;
617
+ padding: 8px 16px;
618
+ border-radius: 20px;
619
+ border: none;
620
+ cursor: pointer;
621
+ font-size: 14px;
622
+ display: flex;
623
+ align-items: center;
624
+ gap: 8px;
625
+ }
626
+
627
+ .remove-photo-btn:hover {
628
+ background: #d32f2f;
629
+ }
630
+
631
+ /* أنماط نموذج التعديل */
632
+ .edit-form {
633
+ background: white;
634
+ padding: 20px;
635
+ border-radius: 8px;
636
+ margin: 20px 0;
637
+ box-shadow: 0 1px 2px rgba(0,0,0,0.1);
638
+ }
639
+
640
+ .edit-form h2 {
641
+ text-align: center;
642
+ margin-bottom: 20px;
643
+ color: #1a1a1a;
644
+ }
645
+
646
+ .form-group {
647
+ margin-bottom: 15px;
648
+ }
649
+
650
+ .form-group label {
651
+ display: block;
652
+ margin-bottom: 5px;
653
+ color: #1a1a1a;
654
+ }
655
+
656
+ .form-group input,
657
+ .form-group select {
658
+ width: 100%;
659
+ padding: 8px;
660
+ border: 1px solid #ddd;
661
+ border-radius: 4px;
662
+ font-size: 14px;
663
+ }
664
+
665
+ .skill-input {
666
+ display: flex;
667
+ gap: 8px;
668
+ margin-bottom: 8px;
669
+ }
670
+
671
+ .add-skill,
672
+ .remove-skill {
673
+ background: #4CAF50;
674
+ color: white;
675
+ border: none;
676
+ width: 30px;
677
+ height: 30px;
678
+ border-radius: 15px;
679
+ cursor: pointer;
680
+ display: flex;
681
+ align-items: center;
682
+ justify-content: center;
683
+ font-size: 18px;
684
+ }
685
+
686
+ .remove-skill {
687
+ background: #f44336;
688
+ }
689
+
690
+ .form-actions {
691
+ display: flex;
692
+ gap: 10px;
693
+ justify-content: flex-end;
694
+ margin-top: 20px;
695
+ }
696
+
697
+ .save-btn,
698
+ .cancel-btn {
699
+ padding: 8px 16px;
700
+ border: none;
701
+ border-radius: 4px;
702
+ cursor: pointer;
703
+ font-size: 14px;
704
+ }
705
+
706
+ .save-btn {
707
+ background: #4CAF50;
708
+ color: white;
709
+ }
710
+
711
+ .cancel-btn {
712
+ background: #f44336;
713
+ color: white;
714
+ }
715
+
716
+ /* أنماط الصفحة الرئيسية */
717
+ .back-btn {
718
+ position: fixed;
719
+ top: 20px;
720
+ left: 20px;
721
+ background: #fff;
722
+ color: #4CAF50;
723
+ border: none;
724
+ padding: 8px 16px;
725
+ border-radius: 20px;
726
+ cursor: pointer;
727
+ font-size: 14px;
728
+ display: flex;
729
+ align-items: center;
730
+ gap: 8px;
731
+ box-shadow: 0 2px 4px rgba(0,0,0,0.1);
732
+ z-index: 100;
733
+ text-decoration: none;
734
+ }
735
+
736
+ .back-btn:hover {
737
+ background-color: #f0f2f5;
738
+ }
739
+
740
+ .profile-container {
741
+ max-width: 600px;
742
+ margin: 0 auto;
743
+ /* padding: 0 15px; */
744
+ }
745
+
746
+ .profile-header {
747
+ background: #fff;
748
+ border-radius: 0 0 8px 8px;
749
+ margin-bottom: 20px;
750
+ box-shadow: 0 1px 2px rgba(0,0,0,0.1);
751
+ overflow: hidden;
752
+ /* margin-top: 20px; */
753
+ }
754
+
755
+ .cover-photo {
756
+ height: 150px;
757
+ background-color: #4CAF50;
758
+ position: relative;
759
+ }
760
+
761
+ .profile-info {
762
+ padding: 0 20px 20px;
763
+ text-align: center;
764
+ position: relative;
765
+ }
766
+
767
+ .profile-photo {
768
+ width: 120px;
769
+ height: 120px;
770
+ border-radius: 50%;
771
+ border: 4px solid #fff;
772
+ margin: -60px auto 10px;
773
+ overflow: hidden;
774
+ position: relative;
775
+ background: #fff;
776
+ box-shadow: 0 2px 4px rgba(0,0,0,0.1);
777
+ }
778
+
779
+ .profile-photo img {
780
+ width: 100%;
781
+ height: 100%;
782
+ object-fit: cover;
783
+ }
784
+
785
+ .profile-name {
786
+ font-size: 24px;
787
+ margin: 10px 0;
788
+ color: #1a1a1a;
789
+ }
790
+
791
+ .profile-details {
792
+ display: flex;
793
+ flex-direction: column;
794
+ gap: 10px;
795
+ margin: 15px 0;
796
+ }
797
+
798
+ .detail-item {
799
+ display: flex;
800
+ align-items: center;
801
+ justify-content: center;
802
+ gap: 8px;
803
+ color: #65676b;
804
+ }
805
+
806
+ .detail-item i {
807
+ color: #4CAF50;
808
+ }
809
+
810
+ .skills-section {
811
+ margin-top: 20px;
812
+ padding-top: 20px;
813
+ border-top: 1px solid #e4e6eb;
814
+ }
815
+
816
+ .skills-section h3 {
817
+ color: #1a1a1a;
818
+ margin-bottom: 15px;
819
+ }
820
+
821
+ .skills-list {
822
+ display: flex;
823
+ flex-wrap: wrap;
824
+ gap: 8px;
825
+ justify-content: center;
826
+ }
827
+
828
+ .skill-tag {
829
+ background: #e4e6eb;
830
+ padding: 6px 12px;
831
+ border-radius: 16px;
832
+ font-size: 14px;
833
+ color: #050505;
834
+ }
835
+
836
+ /* أنماط المنشورات */
837
+ .posts-section {
838
+ margin-top: 20px;
839
+ }
840
+
841
+ .posts-section h2 {
842
+ color: #1a1a1a;
843
+ margin-bottom: 15px;
844
+ text-align: center;
845
+ }
846
+
847
+ .posts-container {
848
+ margin-top: 20px;
849
+ }
850
+
851
+ .post-card {
852
+ background: #fff;
853
+ border-radius: 8px;
854
+ box-shadow: 0 1px 2px rgba(0,0,0,0.1);
855
+ margin-bottom: 20px;
856
+ }
857
+
858
+ .post-header {
859
+ display: flex;
860
+ align-items: center;
861
+ padding: 12px;
862
+ }
863
+
864
+ .post-content {
865
+ padding: 12px;
866
+ }
867
+
868
+ .post-title {
869
+ margin: 0 0 8px 0;
870
+ font-size: 18px;
871
+ text-align: right;
872
+ }
873
+
874
+ .post-content-box {
875
+ border-radius: 8px;
876
+ padding: 12px;
877
+ margin-bottom: 10px;
878
+ }
879
+
880
+ .post-text {
881
+ margin: 0;
882
+ color: #1a1a1a;
883
+ line-height: 1.6;
884
+ text-align: right;
885
+ word-wrap: break-word;
886
+ position: relative;
887
+ direction: rtl;
888
+ font-size: 16px;
889
+ }
890
+
891
+ .post-text p {
892
+ margin: 0;
893
+ padding: 4px 0;
894
+ line-height: 1.6;
895
+ }
896
+
897
+ .post-text.collapsed {
898
+ display: -webkit-box;
899
+ -webkit-line-clamp: 4;
900
+ -webkit-box-orient: vertical;
901
+ overflow: hidden;
902
+ }
903
+
904
+ .post-text.expanded {
905
+ display: block;
906
+ }
907
+
908
+ .post-text.expanded p {
909
+ white-space: pre-wrap;
910
+ padding: 2px 0;
911
+ }
912
+
913
+ .post-text p:first-child {
914
+ padding-top: 0;
915
+ }
916
+
917
+ .post-text p:last-child {
918
+ padding-bottom: 0;
919
+ }
920
+
921
+ .post-text p:empty {
922
+ min-height: 1em;
923
+ display: block;
924
+ }
925
+
926
+ .see-more-btn {
927
+ color: #1877f2;
928
+ cursor: pointer;
929
+ font-weight: 500;
930
+ margin-top: 8px;
931
+ display: none;
932
+ background: none;
933
+ border: none;
934
+ padding: 0;
935
+ text-align: right;
936
+ width: 100%;
937
+ }
938
+
939
+ .post-text-container {
940
+ position: relative;
941
+ }
942
+
943
+ .post-media {
944
+ margin-top: 10px;
945
+ border-radius: 8px;
946
+ overflow: hidden;
947
+ }
948
+
949
+ .post-media img {
950
+ width: 400px;
951
+ height: 400px;
952
+ display: block;
953
+ object-fit: cover;
954
+ margin: 0 auto;
955
+ }
956
+
957
+ .video-container {
958
+ position: relative;
959
+ padding-bottom: 56.25%;
960
+ height: 0;
961
+ overflow: hidden;
962
+ }
963
+
964
+ .video-container video {
965
+ position: absolute;
966
+ top: 0;
967
+ right: 0;
968
+ width: 100%;
969
+ height: 100%;
970
+ object-fit: cover;
971
+ }
972
+
973
+ .post-actions {
974
+ display: flex;
975
+ justify-content: space-around;
976
+ padding: 8px;
977
+ border-top: 1px solid #ddd;
978
+ }
979
+
980
+ .action-btn {
981
+ background: none;
982
+ border: none;
983
+ padding: 8px;
984
+ color: #65676b;
985
+ cursor: pointer;
986
+ font-size: 14px;
987
+ display: flex;
988
+ align-items: center;
989
+ gap: 5px;
990
+ }
991
+
992
+ .action-btn:hover {
993
+ background: #f0f2f5;
994
+ border-radius: 4px;
995
+ }
996
+
997
+ .action-btn i {
998
+ font-size: 16px;
999
+ }
1000
+
1001
+ .user-info {
1002
+ display: flex;
1003
+ flex-direction: column;
1004
+ margin-right: 10px;
1005
+ }
1006
+
1007
+ .timestamp {
1008
+ font-size: 12px;
1009
+ color: #65676b;
1010
+ margin-top: 2px;
1011
+ }
1012
+
1013
+ .profession {
1014
+ font-size: 12px;
1015
+ color: #4CAF50;
1016
+ margin-top: 2px;
1017
+ }
1018
+
1019
+ .profile-circle {
1020
+ width: 40px;
1021
+ height: 40px;
1022
+ border-radius: 50%;
1023
+ overflow: hidden;
1024
+ }
1025
+
1026
+ .profile-circle img {
1027
+ width: 100%;
1028
+ height: 100%;
1029
+ object-fit: cover;
1030
+ }
1031
+
1032
+ /* Post Menu Styles */
1033
+ .post-menu {
1034
+ position: relative;
1035
+ margin-right: auto;
1036
+ padding: 8px;
1037
+
1038
+ }
1039
+
1040
+ .menu-dots {
1041
+ cursor: pointer;
1042
+ color: #65676b;
1043
+ padding: 8px;
1044
+ border-radius: 50%;
1045
+
1046
+ }
1047
+
1048
+ .menu-dots:hover {
1049
+ background-color: #f0f2f5;
1050
+ }
1051
+
1052
+ .menu-options {
1053
+ display: none;
1054
+ position: absolute;
1055
+ left: 0;
1056
+ top: 100%;
1057
+ background: white;
1058
+ border-radius: 8px;
1059
+ box-shadow: 0 2px 4px rgba(0,0,0,0.1);
1060
+ z-index: 1000;
1061
+ min-width: 150px;
1062
+ }
1063
+
1064
+ .menu-option {
1065
+ padding: 8px 16px;
1066
+ cursor: pointer;
1067
+ color: #050505;
1068
+ display: flex;
1069
+ align-items: center;
1070
+ gap: 8px;
1071
+ }
1072
+
1073
+ .menu-option:hover {
1074
+ background-color: #f0f2f5;
1075
+ }
1076
+
1077
+ .menu-option i {
1078
+ font-size: 16px;
1079
+ width: 20px;
1080
+ }
1081
+
1082
+ .delete-post {
1083
+ color: #dc3545;
1084
+ }
1085
+
1086
+ /* Edit Title Modal */
1087
+ .edit-modal {
1088
+ display: none;
1089
+ position: fixed;
1090
+ top: 0;
1091
+ left: 0;
1092
+ width: 100%;
1093
+ height: 100%;
1094
+ background-color: rgba(0,0,0,0.5);
1095
+ z-index: 2000;
1096
+ }
1097
+
1098
+ .edit-modal-content {
1099
+ position: relative;
1100
+ background: white;
1101
+ padding: 20px;
1102
+ border-radius: 8px;
1103
+ width: 90%;
1104
+ max-width: 500px;
1105
+ margin: 50px auto;
1106
+ }
1107
+
1108
+ .edit-modal textarea {
1109
+ width: 100%;
1110
+ padding: 12px;
1111
+ margin: 10px 0;
1112
+ border: 1px solid #ddd;
1113
+ border-radius: 4px;
1114
+ font-size: 16px;
1115
+ resize: vertical;
1116
+ min-height: 120px;
1117
+ text-align: right;
1118
+ direction: rtl;
1119
+ white-space: pre-wrap;
1120
+ line-height: 1.6;
1121
+ }
1122
+
1123
+ .edit-modal-buttons {
1124
+ display: flex;
1125
+ justify-content: flex-end;
1126
+ gap: 10px;
1127
+ margin-top: 20px;
1128
+ }
1129
+
1130
+ .edit-modal-buttons button {
1131
+ padding: 8px 16px;
1132
+ border: none;
1133
+ border-radius: 4px;
1134
+ cursor: pointer;
1135
+ }
1136
+
1137
+ .edit-modal-buttons .save-btn {
1138
+ background-color: #4CAF50;
1139
+ color: white;
1140
+ }
1141
+
1142
+ .edit-modal-buttons .cancel-btn {
1143
+ background-color: #f0f2f5;
1144
+ color: #050505;
1145
+ }
1146
+
1147
+ /* Delete Confirmation Modal */
1148
+ .delete-modal {
1149
+ display: none;
1150
+ position: fixed;
1151
+ top: 0;
1152
+ left: 0;
1153
+ width: 100%;
1154
+ height: 100%;
1155
+ background-color: rgba(0,0,0,0.5);
1156
+ z-index: 2000;
1157
+ }
1158
+
1159
+ .delete-modal-content {
1160
+ position: relative;
1161
+ background: white;
1162
+ padding: 20px;
1163
+ border-radius: 8px;
1164
+ width: 90%;
1165
+ max-width: 500px;
1166
+ margin: 50px auto;
1167
+ text-align: center;
1168
+ }
1169
+
1170
+ .delete-modal-buttons {
1171
+ display: flex;
1172
+ justify-content: center;
1173
+ gap: 10px;
1174
+ margin-top: 20px;
1175
+ }
1176
+
1177
+ .delete-modal-buttons button {
1178
+ padding: 8px 16px;
1179
+ border: none;
1180
+ border-radius: 4px;
1181
+ cursor: pointer;
1182
+ }
1183
+
1184
+ .delete-modal-buttons .confirm-delete {
1185
+ background-color: #dc3545;
1186
+ color: white;
1187
+ }
1188
+
1189
+ .delete-modal-buttons .cancel-delete {
1190
+ background-color: #f0f2f5;
1191
+ color: #050505;
1192
+ }
1193
+
1194
+
1195
+ .replies-toggle {
1196
+ margin-top: 5px;
1197
+ font-size: 14px;
1198
+ display: flex;
1199
+ align-items: center;
1200
+ }
1201
+
1202
+ .replies-toggle i {
1203
+ margin-right: 5px;
1204
+ }
1205
+
1206
+ .nested-comments {
1207
+ margin-left: 20px;
1208
+ border-left: 1px solid #ddd;
1209
+ padding-left: 10px;
1210
+ }
1211
+
1212
+
1213
+ .filter-buttons {
1214
+ display: flex;
1215
+ justify-content: center;
1216
+ gap: 10px;
1217
+ margin-bottom: 20px;
1218
+ }
1219
+
1220
+ .filter-btn {
1221
+ padding: 8px 16px;
1222
+ border: none;
1223
+ border-radius: 20px;
1224
+ background-color: #f0f2f5;
1225
+ color: #1a1a1a;
1226
+ cursor: pointer;
1227
+ font-size: 14px;
1228
+ }
1229
+
1230
+ .filter-btn.active {
1231
+ background-color: #4CAF50;
1232
+ color: white;
1233
+ }
1234
+
1235
+ /* النمط الأساسي لـ iframe-container */
1236
+ #message-container {
1237
+ display: none; /* مخفي في البداية */
1238
+ position: fixed;
1239
+ top: 0;
1240
+ left: 0;
1241
+ width: 100%;
1242
+ height: 100%;
1243
+ background-color: rgba(0, 0, 0, 0.5); /* خلفية شفافة */
1244
+ z-index: 1000;
1245
+ animation: fadeIn 0.5s;
1246
+ }
1247
+
1248
+ /* محتوى iframe */
1249
+ #message-iframe {
1250
+ width: 100%;
1251
+ height: 100%;
1252
+ border: none;
1253
+ }
1254
+
1255
+ /* رأس الحاوية مع زر الإغلاق */
1256
+ #message-header {
1257
+ position: absolute;
1258
+ top: 0;
1259
+ left: 0;
1260
+ width: 100%;
1261
+ background-color: #f1f1f1;
1262
+ padding: 10px;
1263
+ box-sizing: border-box;
1264
+ z-index: 1001;
1265
+ }
1266
+
1267
+ #close-btn {
1268
+ background-color: transparent;
1269
+ border: none;
1270
+ font-size: 24px;
1271
+ cursor: pointer;
1272
+ float: left;
1273
+ }
1274
+
1275
+ /* الأنيميشن */
1276
+ @keyframes fadeIn {
1277
+ from { opacity: 0; }
1278
+ to { opacity: 1; }
1279
+ }
1280
+
1281
+ @keyframes slideIn {
1282
+ from { transform: translateY(100%); }
1283
+ to { transform: translateY(0); }
1284
+ }
1285
+
1286
+ @keyframes fadeOut {
1287
+ from { opacity: 1; }
1288
+ to { opacity: 0; }
1289
+ }
1290
+
1291
+ @keyframes slideOut {
1292
+ from { transform: translateY(0); }
1293
+ to { transform: translateY(100%); }
1294
+ }
1295
+
1296
+ #message-container.show {
1297
+ display: block;
1298
+ animation: fadeIn 0.5s;
1299
+ }
1300
+
1301
+ #message-container iframe {
1302
+ animation: slideIn 0.5s;
1303
+ }
1304
+
1305
+ #message-container.hide {
1306
+ animation: fadeOut 0.5s, slideOut 0.5s;
1307
+ opacity: 0;
1308
+ }
1309
+ </style>
1310
+
1311
+ <!-- Edit Post Modal -->
1312
+ <div class="edit-modal" id="editModal">
1313
+ <div class="edit-modal-content">
1314
+ <h3>تعديل المنشور</h3>
1315
+ <textarea id="editContentInput" placeholder="أدخل محتوى المنشور" rows="5"></textarea>
1316
+ <div class="edit-modal-buttons">
1317
+ <button class="save-btn" id="saveEditBtn">حفظ</button>
1318
+ <button class="cancel-btn" id="cancelEditBtn">إلغاء</button>
1319
+ </div>
1320
+ </div>
1321
+ </div>
1322
+
1323
+ <!-- Delete Confirmation Modal -->
1324
+ <div class="delete-modal" id="deleteModal">
1325
+ <div class="delete-modal-content">
1326
+ <h3>تأكيد الحذف</h3>
1327
+ <p>هل أنت متأكد من حذف هذا المنشور؟</p>
1328
+ <div class="delete-modal-buttons">
1329
+ <button class="confirm-delete" id="confirmDeleteBtn">حذف</button>
1330
+ <button class="cancel-delete" id="cancelDeleteBtn">إلغاء</button>
1331
+ </div>
1332
+ </div>
1333
+ </div>
1334
+
1335
+
1336
+
1337
+
1338
+
1339
+ {% endblock %}
1340
+
1341
+ {% block scripts %}
1342
+ <script>
1343
+ // Comments Functionality
1344
+ // Comments Functionality
1345
+ $(document).ready(function () {
1346
+ const commentsContainer = $("#commentsFixedContainer");
1347
+ const commentsOverlay = $("#commentsOverlay");
1348
+ const closeComments = $(".close-comments");
1349
+ let currentPostId = null;
1350
+
1351
+ // Reply Modal Elements
1352
+ const replyContainer = $("#replyFixedContainer");
1353
+ const replyOverlay = $("#replyOverlay");
1354
+ const closeReply = $(".close-reply");
1355
+ let currentCommentId = null;
1356
+
1357
+ // تحميل التعليقات عند النقر على زر التعليق
1358
+ $(".comment-btn").click(function () {
1359
+ const postId = $(this).data("post-id");
1360
+ currentPostId = postId;
1361
+
1362
+ // تحميل التعليقات
1363
+ loadComments(postId);
1364
+
1365
+ // عرض الخلفية والحاوية
1366
+ commentsOverlay.css("display", "block");
1367
+ commentsContainer.css("display", "block");
1368
+ document.body.style.overflow = "hidden"; // منع السكرول في الصفحة الرئيسية
1369
+ setTimeout(() => {
1370
+ commentsContainer.addClass("active");
1371
+ }, 10);
1372
+ });
1373
+
1374
+ // إغلاق التعليقات عند النقر خارج الحاوية
1375
+ commentsOverlay.click(function () {
1376
+ closeCommentsContainer();
1377
+ });
1378
+
1379
+ // إغلاق حاوية التعليقات
1380
+ closeComments.click(function () {
1381
+ closeCommentsContainer();
1382
+ });
1383
+
1384
+ // دالة إغلاق حاوية التعليقات
1385
+ function closeCommentsContainer() {
1386
+ commentsContainer.removeClass("active");
1387
+ document.body.style.overflow = "auto"; // إعادة تفعيل السكرول في الصفحة الرئيسية
1388
+ setTimeout(() => {
1389
+ commentsContainer.css("display", "none");
1390
+ commentsOverlay.css("display", "none");
1391
+ }, 300);
1392
+ }
1393
+
1394
+ // إرسال التعليق
1395
+ $(".send-comment-btn").click(function () {
1396
+ const input = commentsContainer.find(".comment-input");
1397
+ const content = input.val().trim();
1398
+
1399
+ if (content && currentPostId) {
1400
+ $.ajax({
1401
+ url: "/add_comment",
1402
+ method: "POST",
1403
+ data: {
1404
+ post_id: currentPostId,
1405
+ content: content,
1406
+ parent_id: null, // Root comment
1407
+ },
1408
+ success: function (response) {
1409
+ if (response.success) {
1410
+ input.val("");
1411
+ loadComments(currentPostId);
1412
+ }
1413
+ },
1414
+ });
1415
+ }
1416
+ });
1417
+
1418
+ // تحميل التعليقات
1419
+ function loadComments(postId) {
1420
+ $.get(`/get_comments/${postId}`, function (comments) {
1421
+ const commentsList = commentsContainer.find(".comments-list");
1422
+ commentsList.empty();
1423
+
1424
+ comments.forEach(function (comment) {
1425
+ const commentHtml = generateCommentHtml(comment);
1426
+ commentsList.append(commentHtml);
1427
+ });
1428
+ });
1429
+ }
1430
+
1431
+ // دالة لتوليد HTML للتعليقات والردود
1432
+ function generateCommentHtml(comment) {
1433
+ const hasReplies = comment.replies && comment.replies.length > 0;
1434
+ const repliesCount = hasReplies
1435
+ ? `${comment.replies.length} رداً`
1436
+ : "";
1437
+
1438
+ const repliesHtml = hasReplies
1439
+ ? comment.replies
1440
+ .map((reply) => generateReplyHtml(reply))
1441
+ .join("")
1442
+ : "";
1443
+
1444
+ return `
1445
+ <div class="comment-item">
1446
+ <div class="comment-user-avatar">
1447
+ <img src="/static/${
1448
+ comment.profile_photo
1449
+ }" alt="${comment.username}">
1450
+ </div>
1451
+ <div class="comment-bubble">
1452
+ <div class="comment-header">
1453
+ <span class="comment-username">${comment.username}</span>
1454
+ </div>
1455
+ <div class="comment-content">${comment.content}</div>
1456
+ <div class="comment-time">${comment.created_at}</div>
1457
+
1458
+ <!-- عرض زر الردود المخفية إذا كان هناك ردود -->
1459
+ ${
1460
+ hasReplies
1461
+ ? `
1462
+ <div class="replies-toggle" data-comment-id="${comment.id}">
1463
+ <span class="replies-toggle-text" style="color: blue; cursor: pointer;">
1464
+ <i class="fas fa-chevron-down"></i> ${repliesCount}
1465
+ </span>
1466
+ </div>
1467
+ `
1468
+ : ""
1469
+ }
1470
+
1471
+ <!-- زر الرد -->
1472
+ <button class="reply-btn" data-comment-id="${
1473
+ comment.id
1474
+ }" style="color: blue; cursor: pointer;">رد</button>
1475
+
1476
+ <!-- عرض الردود أسفل التعليق الرئيسي -->
1477
+ <div class="replies-container" style="display: ${
1478
+ hasReplies ? "block" : "none"
1479
+ };">
1480
+ ${repliesHtml}
1481
+ </div>
1482
+ </div>
1483
+ </div>
1484
+ `;
1485
+ }
1486
+
1487
+ // دالة لتوليد HTML للردود
1488
+ function generateReplyHtml(reply) {
1489
+ return `
1490
+ <div class="comment-item nested-comment">
1491
+ <div class="comment-user-avatar">
1492
+ <img src="/static/${
1493
+ reply.profile_photo
1494
+ }" alt="${reply.username}">
1495
+ </div>
1496
+ <div class="comment-bubble">
1497
+ <div class="comment-header">
1498
+ <span class="comment-username">${reply.username}</span>
1499
+ </div>
1500
+ <div class="comment-content">${reply.content}</div>
1501
+ <div class="comment-time">${reply.created_at}</div>
1502
+ </div>
1503
+ </div>
1504
+ `;
1505
+ }
1506
+
1507
+ // إظهار حقل الرد عند النقر على زر الرد
1508
+ $(document).on("click", ".reply-btn", function () {
1509
+ currentCommentId = $(this).data("comment-id");
1510
+ replyOverlay.css("display", "block");
1511
+ replyContainer.css("display", "block");
1512
+ setTimeout(() => {
1513
+ replyContainer.addClass("active");
1514
+ }, 10);
1515
+ });
1516
+
1517
+ // إغلاق الرد عند النقر خارج الحاوية
1518
+ replyOverlay.click(function () {
1519
+ closeReplyContainer();
1520
+ });
1521
+
1522
+ // إغلاق حاوية الرد
1523
+ closeReply.click(function () {
1524
+ closeReplyContainer();
1525
+ });
1526
+
1527
+ // دالة إغلاق حاوية الرد
1528
+ function closeReplyContainer() {
1529
+ replyContainer.removeClass("active");
1530
+ setTimeout(() => {
1531
+ replyContainer.css("display", "none");
1532
+ replyOverlay.css("display", "none");
1533
+ }, 300);
1534
+ }
1535
+
1536
+ // إرسال الرد على تعليق
1537
+ $(".send-reply-btn").click(function () {
1538
+ const input = replyContainer.find(".reply-input");
1539
+ const content = input.val().trim();
1540
+
1541
+ if (content && currentPostId && currentCommentId) {
1542
+ $.ajax({
1543
+ url: "/add_comment",
1544
+ method: "POST",
1545
+ data: {
1546
+ post_id: currentPostId,
1547
+ content: content,
1548
+ parent_id: currentCommentId, // Associate reply with parent
1549
+ },
1550
+ success: function (response) {
1551
+ if (response.success) {
1552
+ input.val("");
1553
+ closeReplyContainer();
1554
+ loadComments(currentPostId);
1555
+ }
1556
+ },
1557
+ });
1558
+ }
1559
+ });
1560
+
1561
+ // إظهار أو إخفاء الردود عند النقر على زر "12 رداً" أو ما يعادله
1562
+ $(document).on("click", ".replies-toggle-text", function () {
1563
+ const toggle = $(this).closest(".replies-toggle");
1564
+ const repliesContainer = toggle.siblings(".replies-container");
1565
+ const icon = toggle.find("i");
1566
+
1567
+ if (repliesContainer.is(":visible")) {
1568
+ repliesContainer.slideUp();
1569
+ icon.removeClass("fa-chevron-up").addClass("fa-chevron-down");
1570
+ } else {
1571
+ repliesContainer.slideDown();
1572
+ icon.removeClass("fa-chevron-down").addClass("fa-chevron-up");
1573
+ }
1574
+ });
1575
+ });
1576
+
1577
+
1578
+ </script>
1579
+
1580
+ <script>
1581
+ $(document).ready(function() {
1582
+ // تبديل عرض نموذج التعديل
1583
+ $('#editProfileBtn').click(function() {
1584
+ $('#editProfileForm').slideDown();
1585
+ });
1586
+
1587
+ $('#cancelEdit').click(function() {
1588
+ $('#editProfileForm').slideUp();
1589
+ });
1590
+
1591
+ // إدارة المهارات
1592
+ $('.add-skill').click(function() {
1593
+ const skillValue = $(this).siblings('.skill-field').val();
1594
+ if (skillValue.trim() !== "") {
1595
+ const skillInput = `
1596
+ <div class="skill-input">
1597
+ <input type="text" name="skill" class="skill-field" value="${skillValue}">
1598
+ <button type="button" class="remove-skill">-</button>
1599
+ </div>
1600
+ `;
1601
+ $(this).parent().before(skillInput);
1602
+ $(this).siblings('.skill-field').val("");
1603
+ }
1604
+ });
1605
+
1606
+ $(document).on('click', '.remove-skill', function() {
1607
+ $(this).parent().remove();
1608
+ });
1609
+
1610
+ // تقديم النموذج
1611
+ $('#profileForm').on('submit', function(e) {
1612
+ const skills = [];
1613
+ $('.skill-field').each(function() {
1614
+ const skill = $(this).val().trim();
1615
+ if (skill) {
1616
+ skills.push(skill);
1617
+ }
1618
+ });
1619
+ $('#skills').val(JSON.stringify(skills));
1620
+ });
1621
+
1622
+ // التحقق من اسم المستخدم
1623
+ $('#username').on('input', function() {
1624
+ const username = $(this).val();
1625
+ if (username && username !== '{{ user.username }}') {
1626
+ $.get('/validate-username', { username: username }, function(data) {
1627
+ if (data.exists) {
1628
+ $('#username-validation-message').text('اسم المستخدم مستخدم بالفعل').addClass('error').removeClass('success');
1629
+ } else {
1630
+ $('#username-validation-message').text('اسم المستخدم متاح').addClass('success').removeClass('error');
1631
+ }
1632
+ });
1633
+ } else {
1634
+ $('#username-validation-message').text('');
1635
+ }
1636
+ });
1637
+
1638
+ // تفعيل قائمة النقاط الثلاث
1639
+ $('.menu-dots').click(function(e) {
1640
+ e.stopPropagation();
1641
+ const menuOptions = $(this).siblings('.menu-options');
1642
+ $('.menu-options').not(menuOptions).hide();
1643
+ menuOptions.toggle();
1644
+ });
1645
+
1646
+ // إغلاق القائمة عند النقر في أي مكان آخر
1647
+ $(document).click(function() {
1648
+ $('.menu-options').hide();
1649
+ });
1650
+
1651
+ // منع إغلاق القائمة عند النقر داخلها
1652
+ $('.menu-options').click(function(e) {
1653
+ e.stopPropagation();
1654
+ });
1655
+
1656
+ let currentPostId = null;
1657
+
1658
+ // تفعيل زر تعديل المنشور
1659
+ $('.edit-post').click(function() {
1660
+ currentPostId = $(this).data('post-id');
1661
+ const $text = $(this).closest('.post-card').find('.post-text');
1662
+ const paragraphs = [];
1663
+ $text.find('p').each(function() {
1664
+ const content = $(this).text();
1665
+ if (content === '\u00A0') { // &nbsp;
1666
+ paragraphs.push('');
1667
+ } else {
1668
+ paragraphs.push(content);
1669
+ }
1670
+ });
1671
+ $('#editContentInput').val(paragraphs.join('\n'));
1672
+ $('#editModal').show();
1673
+ });
1674
+
1675
+ // إغلاق نافذة التعديل
1676
+ $('#cancelEditBtn').click(function() {
1677
+ $('#editModal').hide();
1678
+ });
1679
+
1680
+ // حفظ التعديل
1681
+ $('#saveEditBtn').click(function() {
1682
+ const newContent = $('#editContentInput').val();
1683
+ if (currentPostId && newContent.trim()) {
1684
+ $.ajax({
1685
+ url: '/edit_post_content',
1686
+ method: 'POST',
1687
+ data: {
1688
+ post_id: currentPostId,
1689
+ new_content: newContent
1690
+ },
1691
+ success: function(response) {
1692
+ if (response.success) {
1693
+ location.reload();
1694
+ }
1695
+ }
1696
+ });
1697
+ }
1698
+ $('#editModal').hide();
1699
+ });
1700
+
1701
+ // تفعيل زر حذف المنشور
1702
+ $('.delete-post').click(function() {
1703
+ currentPostId = $(this).data('post-id');
1704
+ $('#deleteModal').show();
1705
+ });
1706
+
1707
+ // إغلاق نافذة تأكيد الحذف
1708
+ $('#cancelDeleteBtn').click(function() {
1709
+ $('#deleteModal').hide();
1710
+ });
1711
+
1712
+ // تأكيد الحذف
1713
+ $('#confirmDeleteBtn').click(function() {
1714
+ if (currentPostId) {
1715
+ $.ajax({
1716
+ url: '/delete_post',
1717
+ method: 'POST',
1718
+ data: {
1719
+ post_id: currentPostId
1720
+ },
1721
+ success: function(response) {
1722
+ if (response.success) {
1723
+ location.reload();
1724
+ }
1725
+ }
1726
+ });
1727
+ }
1728
+ $('#deleteModal').hide();
1729
+ });
1730
+
1731
+ // تفعيل زر إظهار المزيد
1732
+ $('.post-text').each(function() {
1733
+ const $text = $(this);
1734
+ const $btn = $text.closest('.post-content-box').find('.see-more-btn');
1735
+
1736
+ // Get the original content
1737
+ const content = $text.html();
1738
+
1739
+ // Calculate line height and text height
1740
+ const lineHeight = parseInt(window.getComputedStyle($text[0]).lineHeight);
1741
+ const textHeight = $text[0].scrollHeight;
1742
+ const numLines = Math.floor(textHeight / lineHeight);
1743
+
1744
+ // Show button only if text has more than 4 lines
1745
+ if (numLines > 4) {
1746
+ $btn.show();
1747
+ $text.addClass('has-more');
1748
+ }
1749
+ });
1750
+
1751
+ $('.see-more-btn').click(function() {
1752
+ const $btn = $(this);
1753
+ const $text = $btn.closest('.post-content-box').find('.post-text');
1754
+
1755
+ if ($text.hasClass('collapsed')) {
1756
+ $text.removeClass('collapsed').addClass('expanded');
1757
+ $btn.text('إظهار أقل');
1758
+ } else {
1759
+ $text.removeClass('expanded').addClass('collapsed');
1760
+ $btn.text('إظهار المزيد');
1761
+ }
1762
+ });
1763
+
1764
+ // Profile Photo Upload Functionality
1765
+ $('#avatar').change(function(e) {
1766
+ if (this.files && this.files[0]) {
1767
+ const reader = new FileReader();
1768
+ reader.onload = function(e) {
1769
+ $('.profile-photo img').attr('src', e.target.result);
1770
+ }
1771
+ reader.readAsDataURL(this.files[0]);
1772
+ }
1773
+ });
1774
+
1775
+ // Remove Photo Functionality
1776
+ $('#removePhotoBtn').click(function() {
1777
+ $('.profile-photo img').attr('src', "{{ url_for('static', filename='uploads/default-avatar.jpg') }}");
1778
+ $('#avatar').val('');
1779
+ // Add a hidden input to signal photo removal
1780
+ if (!$('#remove_photo').length) {
1781
+ $('<input>').attr({
1782
+ type: 'hidden',
1783
+ id: 'remove_photo',
1784
+ name: 'remove_photo',
1785
+ value: 'true'
1786
+ }).appendTo('#profileForm');
1787
+ }
1788
+ });
1789
+ });
1790
+
1791
+
1792
+
1793
+
1794
+ document.addEventListener("DOMContentLoaded", function () {
1795
+ document.querySelectorAll(".share-btn").forEach(function (button) {
1796
+ button.addEventListener("click", function () {
1797
+ const postId = this.dataset.postId;
1798
+ const shareUrl = `${window.location.origin}/post/${postId}`;
1799
+
1800
+ if (navigator.clipboard && navigator.clipboard.writeText) {
1801
+ navigator.clipboard.writeText(shareUrl).then(function () {
1802
+ showPopup("تم نسخ الرابط");
1803
+ }).catch(function (err) {
1804
+ console.error("فشل نسخ الرابط: ", err);
1805
+ });
1806
+ } else {
1807
+ const tempInput = document.createElement("input");
1808
+ tempInput.value = shareUrl;
1809
+ document.body.appendChild(tempInput);
1810
+ tempInput.select();
1811
+ try {
1812
+ document.execCommand("copy");
1813
+ showPopup("تم نسخ الرابط ");
1814
+ } catch (err) {
1815
+ console.error("فشل نسخ الرابط باستخدام الطريقة البديلة: ", err);
1816
+ }
1817
+ document.body.removeChild(tempInput);
1818
+ }
1819
+
1820
+ function showPopup(message) {
1821
+ const modal = document.createElement("div");
1822
+ modal.style.position = "fixed";
1823
+ modal.style.bottom = "20%";
1824
+ modal.style.left = "50%";
1825
+ modal.style.transform = "translateX(-50%)";
1826
+ modal.style.backgroundColor = "#333";
1827
+ modal.style.color = "#fff";
1828
+ modal.style.padding = "15px 20px";
1829
+ modal.style.borderRadius = "8px";
1830
+ modal.style.boxShadow = "0 4px 6px rgba(0, 0, 0, 0.1)";
1831
+ modal.style.opacity = "0";
1832
+ modal.style.transition = "opacity 0.4s ease, bottom 0.4s ease";
1833
+ modal.style.zIndex = "1000";
1834
+ modal.textContent = message;
1835
+
1836
+ document.body.appendChild(modal);
1837
+
1838
+ setTimeout(() => {
1839
+ modal.style.opacity = "1";
1840
+ modal.style.bottom = "25%";
1841
+ }, 10);
1842
+
1843
+ setTimeout(() => {
1844
+ modal.style.opacity = "0";
1845
+ modal.style.bottom = "20%";
1846
+ setTimeout(() => {
1847
+ modal.remove();
1848
+ }, 400);
1849
+ }, 3000);
1850
+ }
1851
+ });
1852
+ });
1853
+ });
1854
+
1855
+
1856
+
1857
+ $(document).ready(function () {
1858
+ // تفعيل الفلترات
1859
+ $('.filter-btn').click(function () {
1860
+ // إزالة النشط من جميع الأزرار
1861
+ $('.filter-btn').removeClass('active');
1862
+ // إضافة النشط للزر المحدد
1863
+ $(this).addClass('active');
1864
+
1865
+ const filterType = $(this).attr('id'); // الحصول على نوع الفلتر
1866
+ let hasPosts = false; // متغير لتتبع وجود منشورات مطابقة
1867
+
1868
+ // إخفاء جميع المنشورات
1869
+ $('.post-card').hide();
1870
+
1871
+ if (filterType === 'filterAll') {
1872
+ // عرض جميع المنشورات
1873
+ $('.post-card').show();
1874
+ hasPosts = $('.post-card').length > 0; // تحقق إذا كان هناك منشورات
1875
+ } else if (filterType === 'filterImages') {
1876
+ // عرض المنشورات التي تحتوي على صور فقط
1877
+ $('.post-card').each(function () {
1878
+ if ($(this).find('.post-media img').length > 0) {
1879
+ $(this).show();
1880
+ hasPosts = true; // يوجد منشورات مطابقة
1881
+ }
1882
+ });
1883
+ } else if (filterType === 'filterVideos') {
1884
+ // عرض المنشورات التي تحتوي على فيديوهات فقط
1885
+ $('.post-card').each(function () {
1886
+ if ($(this).find('.post-media video').length > 0) {
1887
+ $(this).show();
1888
+ hasPosts = true; // يوجد منشورات مطابقة
1889
+ }
1890
+ });
1891
+ } else if (filterType === 'filterText') {
1892
+ // عرض المنشورات التي تحتوي على نص فقط
1893
+ $('.post-card').each(function () {
1894
+ if ($(this).find('.post-text').length > 0 && $(this).find('.post-media').length === 0) {
1895
+ $(this).show();
1896
+ hasPosts = true; // يوجد منشورات مطابقة
1897
+ }
1898
+ });
1899
+ }
1900
+
1901
+ // إظهار أو إخفاء الرسالة بناءً على وجود منشورات مطابقة
1902
+ if (hasPosts) {
1903
+ $('#noPostsMessage').hide(); // إخفاء الرسالة إذا كانت هناك منشورات
1904
+ } else {
1905
+ $('#noPostsMessage').show(); // إظهار الرسالة إذا لم تكن هناك منشورات
1906
+ }
1907
+ });
1908
+ });
1909
+
1910
+ // فكرة بحيث يظهر مشاركة عبر
1911
+
1912
+
1913
+ // دالة لفتح الرسالة
1914
+ function openMessage() {
1915
+ var container = document.getElementById('message-container');
1916
+ if (container) {
1917
+ // إظهار الحاوية
1918
+ container.style.display = 'block';
1919
+ container.classList.remove('hide'); // إزالة فئة الإخفاء
1920
+ container.classList.add('show'); // إضافة فئة العرض
1921
+
1922
+ // تحقق مما إذا كان الـ iframe موجودًا بالفعل
1923
+ var existingIframe = document.getElementById('message-iframe');
1924
+ if (!existingIframe) {
1925
+ // إنشاء iframe جديد إذا لم يكن موجودًا
1926
+ var iframe = document.createElement('iframe');
1927
+ iframe.id = 'message-iframe';
1928
+ iframe.src = "{{ url_for('messages', user_email=user.email) }}"; // مسار الرسالة
1929
+ container.appendChild(iframe); // إضافة iframe إلى الحاوية
1930
+ }
1931
+ }
1932
+ }
1933
+
1934
+ // دالة لإغلاق الرسالة (حذف iframe نهائيًا وإعلام الخادم)
1935
+ function closeMessage() {
1936
+ var container = document.getElementById('message-container');
1937
+ if (container) {
1938
+ // إضافة كلاس hide لتشغيل أنيميشن الإغلاق
1939
+ container.classList.remove('show'); // إزالة فئة العرض
1940
+ container.classList.add('hide'); // إضافة فئة الإخفاء
1941
+
1942
+ // الانتظار حتى يكتمل الأنيميشن قبل إخفاء العنصر
1943
+ setTimeout(function() {
1944
+ container.style.display = 'none';
1945
+
1946
+ // حذف الـ iframe نهائيًا
1947
+ var iframe = document.getElementById('message-iframe');
1948
+ if (iframe) {
1949
+ iframe.remove(); // إزالة iframe من DOM
1950
+ }
1951
+
1952
+ // إرسال طلب إلى الخادم لإعلامه بأن المستخدم قد غادر الدردشة
1953
+ fetch('/leave_chat', {
1954
+ method: 'POST',
1955
+ headers: {
1956
+ 'Content-Type': 'application/json' // نوع المحتوى
1957
+ },
1958
+ credentials: 'include' // لإرسال الكوكيز إذا لزم الأمر
1959
+ })
1960
+ .then(response => response.json())
1961
+ .then(data => {
1962
+ if (data.success) {
1963
+ console.log("تم إعلام الخادم بأن المستخدم قد غادر الدردشة.");
1964
+ } else {
1965
+ console.error("فشل في إعلام الخادم.");
1966
+ }
1967
+ })
1968
+ .catch(error => {
1969
+ console.error("حدث خطأ أثناء إرسال الطلب:", error);
1970
+ });
1971
+ }, 500); // الانتظار لمدة 0.5 ثانية (مدة الأنيميشن)
1972
+ }
1973
+ }
1974
+
1975
+ // إضافة مستمع الحدث لزر الإغلاق
1976
+ var closeBtn = document.getElementById("close-btn");
1977
+ if (closeBtn) {
1978
+ closeBtn.addEventListener("click", function () {
1979
+ console.log("تم النقر على زر الإغلاق");
1980
+ closeMessage(); // استدعاء دالة الإغلاق
1981
+ });
1982
+ }
1983
+ </script>
1984
+ {% endblock %}
templates/register.html ADDED
@@ -0,0 +1,195 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {% extends "base.html" %}
2
+
3
+ {% block title %}إنشاء حساب{% endblock %}
4
+
5
+ {% block content %}
6
+ <div class="auth-container">
7
+ <h2>إنشاء حساب جديد</h2>
8
+ <form id="registerForm" method="POST" action="{{ url_for('register') }}">
9
+ <div class="form-group">
10
+ <label for="username">اسم المستخدم</label>
11
+ <input type="text" id="username" name="username" required>
12
+ <small class="form-text">سيتم إضافة @moltka.eg تلقائياً</small>
13
+ <span id="username-validation-message"></span>
14
+ </div>
15
+
16
+ <div class="form-group">
17
+ <label for="password">كلمة المرور</label>
18
+ <input type="password" id="password" name="password" required>
19
+ <div id="password-strength" class="strength-meter"></div>
20
+ </div>
21
+
22
+ <div class="form-group">
23
+ <label for="confirm_password">تأكيد كلمة المرور</label>
24
+ <input type="password" id="confirm_password" name="confirm_password" required>
25
+ <span id="password-match-message"></span>
26
+ </div>
27
+
28
+ <div class="form-group">
29
+ <label for="profession">المجال المهني</label>
30
+ <select id="profession" name="profession" required>
31
+ <option value="">اختر المجال المهني</option>
32
+ <option value="مطور ويب">مطور ويب</option>
33
+ <option value="مطور واجهة خلفية">مطور واجهة خلفية</option>
34
+ <option value="برمجة">برمجة</option>
35
+ <option value="مطور ألعاب">مطور ألعاب</option>
36
+ <option value="مطور أندرويد">مطور أندرويد</option>
37
+ <option value="مطور iOS">مطور iOS</option>
38
+ <option value="مهندس">مهندس</option>
39
+ <option value="طبيب">طبيب</option>
40
+ <option value="علوم اجتماعية">علوم اجتماعية</option>
41
+ <option value="معلم">معلم</option>
42
+ <option value="محاسب">محاسب</option>
43
+ <option value="صحفي">صحفي</option>
44
+ <option value="محامي">محامي</option>
45
+ <option value="مصمم جرافيكي">مصمم جرافيكي</option>
46
+ <option value="مصور">مصور</option>
47
+ <option value="كاتب">كاتب</option>
48
+ <option value="مدرب رياضي">مدرب رياضي</option>
49
+ <option value="طاهي">طاهي</option>
50
+ <option value="ديني">ديني</option>
51
+ <option value="شاعر">شاعر</option>
52
+ <option value="رسام">رسام</option>
53
+ <option value="محلل مالي">محلل مالي</option>
54
+ <option value="فني صيانة">فني صيانة</option>
55
+ <option value="باحث">باحث</option>
56
+ <option value="IT">IT</option>
57
+ </select>
58
+ </div>
59
+
60
+ <div class="form-group">
61
+ <label>المهارات</label>
62
+ <div id="skills-container">
63
+ <div class="skill-input">
64
+ <input type="text" name="skill" class="skill-field">
65
+ <button type="button" class="add-skill">+</button>
66
+ </div>
67
+ </div>
68
+ <input type="hidden" id="skills" name="skills">
69
+ </div>
70
+
71
+ <div class="form-group">
72
+ <label for="security_question">سؤال الأمان</label>
73
+ <select id="security_question" name="security_question" required>
74
+ <option value="">اختر سؤال الأمان</option>
75
+ <option value="ما اسم مدرستك الأولى؟">ما اسم مدرستك الأولى؟</option>
76
+ <option value="ما اسم حيوانك الأليف الأول؟">ما اسم حيوانك الأليف الأول؟</option>
77
+ <option value="ما هي مدينتك المفضلة؟">ما هي مدينتك المفضلة؟</option>
78
+ <option value="ما اسم أفضل صديق في طفولتك؟">ما اسم أفضل صديق في طفولتك؟</option>
79
+ </select>
80
+ </div>
81
+
82
+ <div class="form-group">
83
+ <label for="security_answer">إجابة سؤال الأمان</label>
84
+ <input type="text" id="security_answer" name="security_answer" required>
85
+ </div>
86
+
87
+ <button type="submit" class="submit-btn">إنشاء الحساب</button>
88
+ </form>
89
+ <div class="auth-links">
90
+ <p>لديك حساب بالفعل؟ <a href="{{ url_for('login') }}">تسجيل الدخول</a></p>
91
+ </div>
92
+ </div>
93
+ {% endblock %}
94
+
95
+ {% block scripts %}
96
+ <script>
97
+ $(document).ready(function() {
98
+ // Username validation
99
+ $('#username').on('input', function() {
100
+ const username = $(this).val();
101
+ if (username) {
102
+ $.get('/validate-username', { username: username }, function(data) {
103
+ if (data.exists) {
104
+ $('#username-validation-message').text('اسم المستخدم مستخدم بالفعل').addClass('error').removeClass('success');
105
+ } else {
106
+ $('#username-validation-message').text('اسم المستخدم متاح').addClass('success').removeClass('error');
107
+ }
108
+ });
109
+ }
110
+ });
111
+
112
+ // Password matching validation
113
+ $('#confirm_password').on('input', function() {
114
+ const password = $('#password').val();
115
+ const confirmPassword = $(this).val();
116
+
117
+ if (password === confirmPassword) {
118
+ $('#password-match-message').text('كلمات المرور متطابقة').addClass('success').removeClass('error');
119
+ } else {
120
+ $('#password-match-message').text('كلمات المرور غير متطابقة').addClass('error').removeClass('success');
121
+ }
122
+ });
123
+
124
+ // Password strength
125
+ $('#password').on('input', function() {
126
+ const password = $(this).val();
127
+ let strength = 0;
128
+
129
+ if (password.length >= 8) strength++;
130
+ if (/[A-Z]/.test(password)) strength++;
131
+ if (/[a-z]/.test(password)) strength++;
132
+ if (/[0-9]/.test(password)) strength++;
133
+ if (/[^A-Za-z0-9]/.test(password)) strength++;
134
+
135
+ const strengthMeter = $('#password-strength');
136
+ strengthMeter.removeClass('weak medium strong');
137
+
138
+ if (strength <= 2) {
139
+ strengthMeter.text('ضعيف').addClass('weak');
140
+ } else if (strength <= 4) {
141
+ strengthMeter.text('متوسط').addClass('medium');
142
+ } else {
143
+ strengthMeter.text('قوي').addClass('strong');
144
+ }
145
+ });
146
+
147
+ // Skills management
148
+ $('.add-skill').click(function() {
149
+ const skillValue = $(this).siblings('.skill-field').val(); // Get the current skill value
150
+ if (skillValue.trim() !== "") {
151
+ const skillInput = `
152
+ <div class="skill-input">
153
+ <input type="text" name="skill" class="skill-field" value="${skillValue}">
154
+ <button type="button" class="remove-skill">-</button>
155
+ </div>
156
+ `;
157
+ $('#skills-container').append(skillInput);
158
+ $(this).siblings('.skill-field').val(""); // Clear the input field
159
+ }
160
+ });
161
+
162
+ $(document).on('click', '.remove-skill', function() {
163
+ $(this).parent().remove();
164
+ });
165
+
166
+ // Form submission
167
+ $('#registerForm').on('submit', function(e) {
168
+ const skills = [];
169
+ $('.skill-field').each(function() {
170
+ const skill = $(this).val().trim();
171
+ if (skill) {
172
+ skills.push(skill);
173
+ }
174
+ });
175
+ $('#skills').val(JSON.stringify(skills));
176
+
177
+ const password = $('#password').val();
178
+ const confirmPassword = $('#confirm_password').val();
179
+
180
+ if (password !== confirmPassword) {
181
+ e.preventDefault();
182
+ alert('كلمات المرور غير متطابقة');
183
+ return;
184
+ }
185
+
186
+ const username = $('#username').val().trim();
187
+ if (!username) {
188
+ e.preventDefault();
189
+ alert('الرجاء إدخال اسم المستخدم');
190
+ return;
191
+ }
192
+ });
193
+ });
194
+ </script>
195
+ {% endblock %}
templates/reset_password.html ADDED
@@ -0,0 +1,67 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {% extends "base.html" %}
2
+
3
+ {% block title %}إعادة تعيين كلمة السر{% endblock %}
4
+
5
+ {% block content %}
6
+ <div class="auth-container">
7
+ <h2>إعادة تعيين كلمة السر</h2>
8
+ <form id="resetPasswordForm" method="POST" action="{{ url_for('reset_password') }}">
9
+ <input type="hidden" name="email" value="{{ email }}">
10
+ <div class="form-group">
11
+ <label for="security_answer">إجابة سؤال الأمان</label>
12
+ <input type="text" id="security_answer" name="security_answer" required>
13
+ <span id="security-answer-message"></span>
14
+ </div>
15
+ <div class="form-group">
16
+ <label for="new_password">كلمة المرور الجديدة</label>
17
+ <input type="password" id="new_password" name="new_password" required>
18
+ </div>
19
+ <div class="form-group">
20
+ <label for="confirm_password">تأكيد كلمة المرور</label>
21
+ <input type="password" id="confirm_password" name="confirm_password" required>
22
+ </div>
23
+ <button type="submit" class="submit-btn" id="resetPasswordBtn" disabled>إعادة تعيين كلمة السر</button>
24
+ </form>
25
+ </div>
26
+ {% endblock %}
27
+
28
+ {% block scripts %}
29
+ <script>
30
+ $(document).ready(function() {
31
+ $('#security_answer').on('input', function() {
32
+ const email = '{{ email }}';
33
+ const security_answer = $(this).val();
34
+
35
+ $.ajax({
36
+ url: '/validate_security_answer',
37
+ type: 'POST',
38
+ contentType: 'application/json',
39
+ data: JSON.stringify({ email: email, security_answer: security_answer }),
40
+ success: function(data) {
41
+ const messageElement = $('#security-answer-message');
42
+ if (data.valid) {
43
+ messageElement.text('صحيح').css('color', 'green');
44
+ $('#resetPasswordBtn').prop('disabled', false);
45
+ } else {
46
+ messageElement.text('خطأ').css('color', 'red');
47
+ $('#resetPasswordBtn').prop('disabled', true);
48
+ }
49
+ },
50
+ error: function() {
51
+ $('#security-answer-message').text('حدث خطأ أثناء التحقق من إجابة سؤال الأمان').css('color', 'red');
52
+ }
53
+ });
54
+ });
55
+
56
+ $('#resetPasswordForm').on('submit', function(e) {
57
+ const new_password = $('#new_password').val();
58
+ const confirm_password = $('#confirm_password').val();
59
+
60
+ if (new_password !== confirm_password) {
61
+ e.preventDefault();
62
+ alert('كلمات المرور غير متطابقة');
63
+ }
64
+ });
65
+ });
66
+ </script>
67
+ {% endblock %}
templates/videos.html ADDED
@@ -0,0 +1,1855 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>Videos</title>
7
+ <!-- إضافة مكتبة FontAwesome -->
8
+ <link
9
+ href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css"
10
+ rel="stylesheet"
11
+ />
12
+
13
+ <style>
14
+ /* Skeleton Loading */
15
+ .skeleton {
16
+ background-color: #ddd;
17
+ animation: pulse 1.5s infinite;
18
+ }
19
+
20
+ @keyframes pulse {
21
+ 0% {
22
+ opacity: 1;
23
+ }
24
+ 50% {
25
+ opacity: 0.5;
26
+ }
27
+ 100% {
28
+ opacity: 1;
29
+ }
30
+ }
31
+
32
+ /* تنسيق الصفحة */
33
+ body {
34
+ font-family: Arial, sans-serif;
35
+ margin: 20px;
36
+ }
37
+
38
+ .upload-form {
39
+ margin-bottom: 30px;
40
+ padding: 15px;
41
+ border: 1px solid #ccc;
42
+ border-radius: 8px;
43
+ background-color: #f9f9f9;
44
+ }
45
+
46
+ .video-container {
47
+ display: flex;
48
+ flex-wrap: wrap;
49
+ gap: 15px;
50
+ }
51
+
52
+ .video-card {
53
+ border: 1px solid #ccc;
54
+ border-radius: 8px;
55
+ padding: 10px;
56
+ width: 300px;
57
+ background-color: #fff;
58
+ box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
59
+ cursor: pointer;
60
+ }
61
+
62
+ .video-card img {
63
+ width: 100%;
64
+ /* border-radius: 8px; */
65
+ }
66
+
67
+ .video-card h4,
68
+ .video-card p {
69
+ margin: 5px 0;
70
+ }
71
+
72
+ .skeleton-card {
73
+ width: 300px;
74
+ height: 200px;
75
+ border-radius: 8px;
76
+ margin-bottom: 10px;
77
+ }
78
+
79
+ .empty-message {
80
+ font-size: 18px;
81
+ color: #555;
82
+ margin-top: 20px;
83
+ }
84
+
85
+ .uploader_image {
86
+ width: 30px !important;
87
+ border-radius: 50% !important;
88
+ }
89
+
90
+ /* النافذة المنبثقة (Modal) */
91
+ .modal {
92
+ display: none; /* مخفية بشكل افتراضي */
93
+ position: fixed; /* ثابتة في مكانها */
94
+ z-index: 1000; /* تكون فوق كل العناصر */
95
+ left: 0;
96
+ top: 0;
97
+ width: 100%; /* عرض كامل */
98
+ height: 100%; /* ارتفاع كامل */
99
+ background-color: rgba(0, 0, 0, 0.9); /* خلفية داكنة مع شفافية */
100
+ overflow: auto; /* تمكين التمرير إذا لزم الأمر */
101
+ animation: modalFadeIn 0.3s ease-out forwards; /* إضافة أنيميشن عند فتح المودال */
102
+ }
103
+
104
+ /* محتوى النافذة المنبثقة */
105
+ .modal-content {
106
+ background-color: #fff;
107
+ margin: 0%;
108
+ /* padding: 20px; */
109
+ width: 99.4%;
110
+ height: 100%;
111
+ text-align: center;
112
+ overflow: hidden;
113
+ /* border-radius: 10px; */
114
+ }
115
+
116
+ /* زر الإغلاق */
117
+ .close {
118
+ color: #aaa;
119
+ position: fixed;
120
+ bottom: 0;
121
+ right: 50%;
122
+ transform: translate(50%, 0);
123
+ overflow: hidden;
124
+ font-size: 24px;
125
+ font-weight: bold;
126
+ cursor: pointer;
127
+ background-color: brown;
128
+ padding: 5px;
129
+ height: 30px;
130
+ width: 30px;
131
+ border-radius: 50%;
132
+ text-align: center;
133
+ margin-bottom: 10px;
134
+ margin-top: 10px;
135
+ }
136
+
137
+ .close:hover,
138
+ .close:focus {
139
+ color: #000;
140
+ text-decoration: none;
141
+ }
142
+
143
+ /* الفيديو */
144
+ video {
145
+ width: 100%;
146
+ height: auto;
147
+ max-width: 100%;
148
+ max-height: 400px;
149
+ background-color: black;
150
+ }
151
+
152
+ /* معلومات الفيديو */
153
+ #videoInfo {
154
+ margin-top: 15px;
155
+ padding: 5px 20px;
156
+ text-align: left;
157
+ }
158
+
159
+ #videoTitle {
160
+ font-size: 20px; /* حجم خط مناسب للجوال */
161
+ margin-bottom: 10px;
162
+ color: #333;
163
+ }
164
+
165
+ #videoCategory,
166
+ #uploadTime {
167
+ font-size: 14px; /* حجم خط أصغر */
168
+ color: #666;
169
+ margin-bottom: 10px;
170
+ }
171
+
172
+ /* معلومات المُحمِّل */
173
+ #uploaderInfo {
174
+ display: flex;
175
+ justify-content: left;
176
+ margin-top: 15px;
177
+ }
178
+
179
+ #uploaderName {
180
+ font-size: 16px; /* حجم خط مناسب للجوال */
181
+ color: #333;
182
+ margin-left: 10px;
183
+ }
184
+
185
+ /* الأنيميشن لفتح المودال */
186
+ @keyframes modalFadeIn {
187
+ 0% {
188
+ transform: scale(0.8);
189
+ opacity: 0;
190
+ }
191
+ 100% {
192
+ transform: scale(1);
193
+ opacity: 1;
194
+ }
195
+ }
196
+
197
+ /* الأنيميشن لإغلاق المودال */
198
+ @keyframes modalFadeOut {
199
+ 0% {
200
+ transform: scale(1);
201
+ opacity: 1;
202
+ }
203
+ 100% {
204
+ transform: scale(0.8);
205
+ opacity: 0;
206
+ }
207
+ }
208
+
209
+ /* لتقليص المودال عند الإغلاق */
210
+ .modal.close-animation {
211
+ animation: modalFadeOut 0.3s ease-out forwards;
212
+ }
213
+
214
+ /* تنسيق الفيديوهات */
215
+ .video-card {
216
+ border: 1px solid #ccc;
217
+ padding: 15px;
218
+ margin: 10px;
219
+ border-radius: 5px;
220
+ width: 300px;
221
+ display: inline-block;
222
+ vertical-align: top;
223
+ }
224
+
225
+ .video-card img {
226
+ width: 100%;
227
+ border-radius: 5px;
228
+ }
229
+
230
+ .video-card h4 {
231
+ margin: 10px 0;
232
+ }
233
+
234
+ .video-card p {
235
+ margin: 5px 0;
236
+ }
237
+
238
+ .uploader_image {
239
+ border-radius: 50%;
240
+ width: 30px;
241
+ height: 30px;
242
+ margin-top: 10px;
243
+ margin-left: 10px;
244
+ }
245
+
246
+ /* تنسيق الأزرار */
247
+ .video-actions {
248
+ margin-top: 10px;
249
+ }
250
+
251
+ .video-actions button {
252
+ margin-right: 10px;
253
+ padding: 5px 10px;
254
+ background-color: #007bff;
255
+ color: white;
256
+ border: none;
257
+ border-radius: 5px;
258
+ cursor: pointer;
259
+ }
260
+
261
+ .video-actions button:hover {
262
+ background-color: #0056b3;
263
+ }
264
+
265
+ /* تنسيق الـ Modals */
266
+ .modal {
267
+ display: none;
268
+ position: fixed;
269
+ z-index: 1000;
270
+ left: 0;
271
+ top: 0;
272
+ width: 100%;
273
+ height: 100%;
274
+ background-color: rgba(0, 0, 0, 0.5);
275
+ }
276
+
277
+ .close-edit,
278
+ .close-delete {
279
+ float: right;
280
+ cursor: pointer;
281
+ font-size: 24px;
282
+ }
283
+
284
+ .close-edit:hover,
285
+ .close-delete:hover {
286
+ color: #000;
287
+ }
288
+
289
+ /* تنسيق عام لـ Modals */
290
+ .custom-modal {
291
+ display: none; /* يتم إخفاء الـ Modal بشكل افتراضي */
292
+ position: fixed;
293
+ z-index: 1000;
294
+ left: 0;
295
+ top: 0;
296
+ width: 100%;
297
+ height: 100%;
298
+ background-color: rgba(0, 0, 0, 0.6); /* خلفية شبه شفافة داكنة */
299
+ backdrop-filter: blur(5px); /* تأثير ضبابي */
300
+ overflow: auto;
301
+ }
302
+
303
+ /* تنسيق محتوى الـ Modal */
304
+ .custom-modal-content {
305
+ position: absolute;
306
+ top: 50%;
307
+ transform: translate(0, -50%);
308
+ background-color: #fff;
309
+ margin: 0%;
310
+ padding: 10px 0px;
311
+ /* border-radius: 12px; */
312
+ width: 100%;
313
+ max-width: 500px;
314
+ box-shadow: 0 4px 15px rgba(0, 0, 0, 0.2);
315
+ /* animation: fadeIn 0.3s ease-in-out; */
316
+ height: fit-content;
317
+ }
318
+
319
+ .custom-modal-content-delete {
320
+ background-color: #fff;
321
+ margin: 0%;
322
+ padding: 25px;
323
+ /* border-radius: 12px; */
324
+ width: 90%;
325
+ max-width: 500px;
326
+ box-shadow: 0 4px 15px rgba(0, 0, 0, 0.2);
327
+ animation: fadeInDelete 0.3s ease-in-out;
328
+ }
329
+
330
+ @keyframes fadeIn {
331
+ from {
332
+ opacity: 0;
333
+ /* transform: translateY(-20px); */
334
+ }
335
+ to {
336
+ opacity: 1;
337
+ /* transform: translateY(0); */
338
+ }
339
+ }
340
+
341
+ @keyframes fadeInDelete {
342
+ from {
343
+ opacity: 0;
344
+ transform: translateY(-20px);
345
+ }
346
+ to {
347
+ opacity: 1;
348
+ transform: translateY(0);
349
+ }
350
+ }
351
+
352
+ /* تنسيق عنوان الـ Modal */
353
+ .modal-title {
354
+ font-size: 1.5rem;
355
+ color: #333;
356
+ margin-bottom: 20px;
357
+ text-align: center;
358
+ }
359
+
360
+ /* تنسيق حقل الإدخال */
361
+ .modal-input {
362
+ width: 80%;
363
+ padding: 10px 3px;
364
+ margin-bottom: 20px;
365
+ border: 1px solid #ddd;
366
+ border-radius: 8px;
367
+ font-size: 1rem;
368
+ outline: none;
369
+ transition: border-color 0.3s ease;
370
+ }
371
+
372
+ .modal-input:focus {
373
+ border-color: #007bff;
374
+ }
375
+
376
+ /* تنسيق الأزرار */
377
+ .modal-button {
378
+ padding: 10px 20px;
379
+ border: none;
380
+ border-radius: 8px;
381
+ font-size: 1rem;
382
+ cursor: pointer;
383
+ transition: background-color 0.3s ease, transform 0.2s ease;
384
+ }
385
+
386
+ .modal-button:hover {
387
+ transform: scale(1.05);
388
+ }
389
+
390
+ .modal-button:active {
391
+ transform: scale(0.95);
392
+ }
393
+
394
+ .modal-button-save {
395
+ background-color: #007bff;
396
+ color: #fff;
397
+ width: 80%;
398
+ }
399
+
400
+ .modal-button-save:hover {
401
+ background-color: #0056b3;
402
+ }
403
+
404
+ .modal-button-delete {
405
+ background-color: #ff4d4d;
406
+ color: #fff;
407
+ }
408
+
409
+ .modal-button-delete:hover {
410
+ background-color: #cc0000;
411
+ }
412
+
413
+ .modal-button-cancel {
414
+ background-color: #f1f1f1;
415
+ color: #333;
416
+ }
417
+
418
+ .modal-button-cancel:hover {
419
+ background-color: #ddd;
420
+ }
421
+
422
+ /* تنسيق زر الإغلاق */
423
+ .custom-close {
424
+ position: absolute;
425
+ top: 15px;
426
+ right: 15px;
427
+ font-size: 1.5rem;
428
+ color: #888;
429
+ cursor: pointer;
430
+ transition: color 0.3s ease;
431
+ }
432
+
433
+ .custom-close:hover {
434
+ color: #333;
435
+ }
436
+
437
+ /* تنسيق أزرار التأكيد والإلغاء */
438
+ .modal-buttons {
439
+ display: flex;
440
+ justify-content: space-between;
441
+ gap: 10px;
442
+ margin-top: 20px;
443
+ }
444
+
445
+ /* تأثير الظهور */
446
+ @keyframes fadeIn {
447
+ 0% {
448
+ opacity: 0;
449
+ transform: scale(0.8);
450
+ }
451
+ 100% {
452
+ opacity: 1;
453
+ transform: scale(1);
454
+ }
455
+ }
456
+
457
+ /* أسلوب المودال */
458
+ .modal-message {
459
+ display: none;
460
+ position: fixed;
461
+ top: 0;
462
+ left: 0;
463
+ width: 100%;
464
+ height: 100%;
465
+ background-color: rgba(0, 0, 0, 0.5); /* خلفية مظللة */
466
+ justify-content: center;
467
+ align-items: center;
468
+ z-index: 1000;
469
+ animation: fadeIn 0.3s ease-in-out; /* تطبيق الأنيميشن عند الظهور */
470
+ }
471
+
472
+ /* محتوى المودال */
473
+ .modal-content-main {
474
+ background-color: white;
475
+ padding: 25px;
476
+ border-radius: 8px;
477
+ text-align: center;
478
+ box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
479
+ max-width: 400px;
480
+ width: 100%;
481
+ }
482
+
483
+ /* أيقونة النجاح */
484
+ .modal-icon {
485
+ font-size: 50px;
486
+ color: #4caf50;
487
+ margin-bottom: 15px;
488
+ animation: bounce 1s infinite; /* تأثير اهتزاز */
489
+ }
490
+
491
+ /* تأثير الاهتزاز */
492
+ @keyframes bounce {
493
+ 0%,
494
+ 100% {
495
+ transform: translateY(0);
496
+ }
497
+ 50% {
498
+ transform: translateY(-10px);
499
+ }
500
+ }
501
+
502
+ /* إغلاق المودال */
503
+ .close-message {
504
+ position: absolute;
505
+ top: 10px;
506
+ right: 10px;
507
+ font-size: 25px;
508
+ cursor: pointer;
509
+ color: #888;
510
+ transition: color 0.3s ease;
511
+ }
512
+
513
+ /* تغيير اللون عند التمرير */
514
+ .close-message:hover {
515
+ color: #333;
516
+ }
517
+
518
+ /* رسالة النص */
519
+ #message-content {
520
+ font-size: 1.2rem;
521
+ margin-top: 10px;
522
+ color: #333;
523
+ }
524
+
525
+ /* إضافة الأنيميشن عند التفاعل مع الأزرار */
526
+ .modal-buttons {
527
+ display: flex;
528
+ justify-content: space-between;
529
+ gap: 10px;
530
+ margin-top: 20px;
531
+ }
532
+
533
+ /* تنسيق Modal قوائم التشغيل */
534
+ /* تنسيق Modal قوائم التشغيل */
535
+ #playlistModal {
536
+ display: none;
537
+ position: fixed;
538
+ z-index: 1000;
539
+ left: 0;
540
+ top: 0;
541
+ width: 100%;
542
+ height: 100%;
543
+ background-color: rgba(0, 0, 0, 0.5);
544
+ }
545
+
546
+ .modal-content-playlist {
547
+ background-color: #fff;
548
+ margin: 10% auto;
549
+ padding: 20px;
550
+ border-radius: 10px;
551
+ width: 80%;
552
+ max-width: 500px;
553
+ }
554
+
555
+ .close-playlist {
556
+ float: right;
557
+ font-size: 24px;
558
+ cursor: pointer;
559
+ }
560
+
561
+ .create-playlist {
562
+ margin-bottom: 20px;
563
+ }
564
+
565
+ .create-playlist input,
566
+ .create-playlist select {
567
+ width: 100%;
568
+ padding: 10px;
569
+ margin-bottom: 10px;
570
+ border: 1px solid #ddd;
571
+ border-radius: 5px;
572
+ }
573
+
574
+ .create-playlist button {
575
+ width: 100%;
576
+ padding: 10px;
577
+ background-color: #007bff;
578
+ color: #fff;
579
+ border: none;
580
+ border-radius: 5px;
581
+ cursor: pointer;
582
+ }
583
+
584
+ .existing-playlists ul {
585
+ list-style-type: none;
586
+ padding: 0;
587
+ }
588
+
589
+ .existing-playlists li {
590
+ margin-bottom: 10px;
591
+ }
592
+
593
+ .existing-playlists label {
594
+ display: flex;
595
+ align-items: center;
596
+ }
597
+
598
+ .existing-playlists input[type="checkbox"] {
599
+ margin-right: 10px;
600
+ }
601
+
602
+ #addToSelectedPlaylists {
603
+ width: 100%;
604
+ padding: 10px;
605
+ background-color: #28a745;
606
+ color: #fff;
607
+ border: none;
608
+ border-radius: 5px;
609
+ cursor: pointer;
610
+ margin-top: 20px;
611
+ }
612
+
613
+ .delete-playlist {
614
+ background-color: #ff4d4d;
615
+ color: white;
616
+ border: none;
617
+ padding: 5px 10px;
618
+ border-radius: 5px;
619
+ cursor: pointer;
620
+ margin-left: 10px;
621
+ }
622
+
623
+ .delete-playlist:hover {
624
+ background-color: #cc0000;
625
+ }
626
+
627
+
628
+
629
+ /* أنماط النماذج (Modals) */
630
+ .modal-unique {
631
+ display: none;
632
+ position: fixed;
633
+ top: 0;
634
+ left: 0;
635
+ width: 100%;
636
+ height: 100%;
637
+ background: rgba(0, 0, 0, 0.5);
638
+ justify-content: center;
639
+ align-items: center;
640
+ overflow: scroll;
641
+ }
642
+ .modal-content-unique {
643
+ position: absolute;
644
+ top: 50%;
645
+ transform: translate(0, -50%);
646
+ background-color: #fff;
647
+ margin: 0%;
648
+ padding: 10px 0px;
649
+ /* border-radius: 12px; */
650
+ width: 100%;
651
+ max-width: 500px;
652
+ box-shadow: 0 4px 15px rgba(0, 0, 0, 0.2);
653
+ /* animation: fadeIn 0.3s ease-in-out; */
654
+ height: 100%;
655
+ /* overflow: hidden; */
656
+ }
657
+
658
+
659
+
660
+ .close-unique {
661
+ /* position: absolute; */
662
+
663
+
664
+ font-size: 20px;
665
+ cursor: pointer;
666
+ }
667
+
668
+ /* أنماط قائمة التشغيل */
669
+ .playlist-item-unique {
670
+ padding: 10px;
671
+ border-bottom: 1px solid #ddd;
672
+ cursor: pointer;
673
+ }
674
+ .playlist-item-unique:hover {
675
+ background: #f1f1f1;
676
+ }
677
+
678
+
679
+ .video-list-unique {
680
+ margin-top: 20px;
681
+ }
682
+ .video-item-unique {
683
+ display: flex;
684
+ align-items: center;
685
+ /* margin-bottom: 10px; */
686
+ background-color: #bdb8b8;
687
+ cursor: pointer;
688
+ }
689
+ .video-item-unique img {
690
+ width: 120px;
691
+ height: 90px;
692
+ margin-right: 10px;
693
+ }
694
+
695
+
696
+ .video-item-unique.active {
697
+ background-color: #f0f0f0; /* تغيير خلفية الفيديو النشط */
698
+ border: 2px solid #007bff; /* إضافة حدود للفيديو النشط */
699
+ }
700
+
701
+ #videosModal{
702
+ /* overflow: hidden; */
703
+ }
704
+
705
+ #videosList{
706
+ overflow: scroll;
707
+ }
708
+
709
+
710
+ /* anmation loading vidoes to upload */
711
+
712
+ :root {
713
+ --bg: hsl(90,90%,20%);
714
+ --fg: hsl(223,10%,10%);
715
+ font-size: calc(16px + (24 - 16) * (100vw - 320px) / (1280 - 320));
716
+ }
717
+
718
+ .wheel-and-hamster {
719
+ --dur: 1s;
720
+ position: relative;
721
+ width: 12em;
722
+ height: 12em;
723
+ }
724
+ .wheel,
725
+ .hamster,
726
+ .hamster div,
727
+ .spoke {
728
+ position: absolute;
729
+ }
730
+ .wheel,
731
+ .spoke {
732
+ border-radius: 50%;
733
+ top: 0;
734
+ left: 0;
735
+ width: 100%;
736
+ height: 100%;
737
+ }
738
+ .wheel {
739
+ background: radial-gradient(100% 100% at center,hsla(0,0%,60%,0) 47.8%,hsl(0,0%,60%) 48%);
740
+ z-index: 2;
741
+ }
742
+ .hamster {
743
+ animation: hamster var(--dur) ease-in-out infinite;
744
+ top: 50%;
745
+ left: calc(50% - 3.5em);
746
+ width: 7em;
747
+ height: 3.75em;
748
+ transform: rotate(4deg) translate(-0.8em,1.85em);
749
+ transform-origin: 50% 0;
750
+ z-index: 1;
751
+ }
752
+ .hamster__head {
753
+ animation: hamsterHead var(--dur) ease-in-out infinite;
754
+ background: hsl(30,90%,55%);
755
+ border-radius: 70% 30% 0 100% / 40% 25% 25% 60%;
756
+ box-shadow:
757
+ 0 -0.25em 0 hsl(30,90%,80%) inset,
758
+ 0.75em -1.55em 0 hsl(30,90%,90%) inset;
759
+ top: 0;
760
+ left: -2em;
761
+ width: 2.75em;
762
+ height: 2.5em;
763
+ transform-origin: 100% 50%;
764
+ }
765
+ .hamster__ear {
766
+ animation: hamsterEar var(--dur) ease-in-out infinite;
767
+ background: hsl(0,90%,85%);
768
+ border-radius: 50%;
769
+ box-shadow: -0.25em 0 hsl(30,90%,55%) inset;
770
+ top: -0.25em;
771
+ right: -0.25em;
772
+ width: 0.75em;
773
+ height: 0.75em;
774
+ transform-origin: 50% 75%;
775
+ }
776
+ .hamster__eye {
777
+ animation: hamsterEye var(--dur) linear infinite;
778
+ background-color: hsl(0,0%,0%);
779
+ border-radius: 50%;
780
+ top: 0.375em;
781
+ left: 1.25em;
782
+ width: 0.5em;
783
+ height: 0.5em;
784
+ }
785
+ .hamster__nose {
786
+ background: hsl(0,90%,75%);
787
+ border-radius: 35% 65% 85% 15% / 70% 50% 50% 30%;
788
+ top: 0.75em;
789
+ left: 0;
790
+ width: 0.2em;
791
+ height: 0.25em;
792
+ }
793
+ .hamster__body {
794
+ animation: hamsterBody var(--dur) ease-in-out infinite;
795
+ background: hsl(30,90%,90%);
796
+ border-radius: 50% 30% 50% 30% / 15% 60% 40% 40%;
797
+ box-shadow:
798
+ 0.1em 0.75em 0 hsl(30,90%,55%) inset,
799
+ 0.15em -0.5em 0 hsl(30,90%,80%) inset;
800
+ top: 0.25em;
801
+ left: 2em;
802
+ width: 4.5em;
803
+ height: 3em;
804
+ transform-origin: 17% 50%;
805
+ transform-style: preserve-3d;
806
+ }
807
+ .hamster__limb--fr,
808
+ .hamster__limb--fl {
809
+ clip-path: polygon(0 0,100% 0,70% 80%,60% 100%,0% 100%,40% 80%);
810
+ top: 2em;
811
+ left: 0.5em;
812
+ width: 1em;
813
+ height: 1.5em;
814
+ transform-origin: 50% 0;
815
+ }
816
+ .hamster__limb--fr {
817
+ animation: hamsterFRLimb var(--dur) linear infinite;
818
+ background: linear-gradient(hsl(30,90%,80%) 80%,hsl(0,90%,75%) 80%);
819
+ transform: rotate(15deg) translateZ(-1px);
820
+ }
821
+ .hamster__limb--fl {
822
+ animation: hamsterFLLimb var(--dur) linear infinite;
823
+ background: linear-gradient(hsl(30,90%,90%) 80%,hsl(0,90%,85%) 80%);
824
+ transform: rotate(15deg);
825
+ }
826
+ .hamster__limb--br,
827
+ .hamster__limb--bl {
828
+ border-radius: 0.75em 0.75em 0 0;
829
+ clip-path: polygon(0 0,100% 0,100% 30%,70% 90%,70% 100%,30% 100%,40% 90%,0% 30%);
830
+ top: 1em;
831
+ left: 2.8em;
832
+ width: 1.5em;
833
+ height: 2.5em;
834
+ transform-origin: 50% 30%;
835
+ }
836
+ .hamster__limb--br {
837
+ animation: hamsterBRLimb var(--dur) linear infinite;
838
+ background: linear-gradient(hsl(30,90%,80%) 90%,hsl(0,90%,75%) 90%);
839
+ transform: rotate(-25deg) translateZ(-1px);
840
+ }
841
+ .hamster__limb--bl {
842
+ animation: hamsterBLLimb var(--dur) linear infinite;
843
+ background: linear-gradient(hsl(30,90%,90%) 90%,hsl(0,90%,85%) 90%);
844
+ transform: rotate(-25deg);
845
+ }
846
+ .hamster__tail {
847
+ animation: hamsterTail var(--dur) linear infinite;
848
+ background: hsl(0,90%,85%);
849
+ border-radius: 0.25em 50% 50% 0.25em;
850
+ box-shadow: 0 -0.2em 0 hsl(0,90%,75%) inset;
851
+ top: 1.5em;
852
+ right: -0.5em;
853
+ width: 1em;
854
+ height: 0.5em;
855
+ transform: rotate(30deg) translateZ(-1px);
856
+ transform-origin: 0.25em 0.25em;
857
+ }
858
+ .spoke {
859
+ animation: spoke var(--dur) linear infinite;
860
+ background:
861
+ radial-gradient(100% 100% at center,hsl(0,0%,60%) 4.8%,hsla(0,0%,60%,0) 5%),
862
+ linear-gradient(hsla(0,0%,55%,0) 46.9%,hsl(0,0%,65%) 47% 52.9%,hsla(0,0%,65%,0) 53%) 50% 50% / 99% 99% no-repeat;
863
+ }
864
+
865
+ /* Animations */
866
+ @keyframes hamster {
867
+ from, to { transform: rotate(4deg) translate(-0.8em,1.85em); }
868
+ 50% { transform: rotate(0) translate(-0.8em,1.85em); }
869
+ }
870
+ @keyframes hamsterHead {
871
+ from, 25%, 50%, 75%, to { transform: rotate(0); }
872
+ 12.5%, 37.5%, 62.5%, 87.5% { transform: rotate(8deg); }
873
+ }
874
+ @keyframes hamsterEye {
875
+ from, 90%, to { transform: scaleY(1); }
876
+ 95% { transform: scaleY(0); }
877
+ }
878
+ @keyframes hamsterEar {
879
+ from, 25%, 50%, 75%, to { transform: rotate(0); }
880
+ 12.5%, 37.5%, 62.5%, 87.5% { transform: rotate(12deg); }
881
+ }
882
+ @keyframes hamsterBody {
883
+ from, 25%, 50%, 75%, to { transform: rotate(0); }
884
+ 12.5%, 37.5%, 62.5%, 87.5% { transform: rotate(-2deg); }
885
+ }
886
+ @keyframes hamsterFRLimb {
887
+ from, 25%, 50%, 75%, to { transform: rotate(50deg) translateZ(-1px); }
888
+ 12.5%, 37.5%, 62.5%, 87.5% { transform: rotate(-30deg) translateZ(-1px); }
889
+ }
890
+ @keyframes hamsterFLLimb {
891
+ from, 25%, 50%, 75%, to { transform: rotate(-30deg); }
892
+ 12.5%, 37.5%, 62.5%, 87.5% { transform: rotate(50deg); }
893
+ }
894
+ @keyframes hamsterBRLimb {
895
+ from, 25%, 50%, 75%, to { transform: rotate(-60deg) translateZ(-1px); }
896
+ 12.5%, 37.5%, 62.5%, 87.5% { transform: rotate(20deg) translateZ(-1px); }
897
+ }
898
+ @keyframes hamsterBLLimb {
899
+ from, 25%, 50%, 75%, to { transform: rotate(20deg); }
900
+ 12.5%, 37.5%, 62.5%, 87.5% { transform: rotate(-60deg); }
901
+ }
902
+ @keyframes hamsterTail {
903
+ from, 25%, 50%, 75%, to { transform: rotate(30deg) translateZ(-1px); }
904
+ 12.5%, 37.5%, 62.5%, 87.5% { transform: rotate(10deg) translateZ(-1px); }
905
+ }
906
+ @keyframes spoke {
907
+ from { transform: rotate(0); }
908
+ to { transform: rotate(-1turn); }
909
+ }
910
+
911
+ .main-anmi-loading{
912
+ background: var(--bg);
913
+ color: var(--fg);
914
+ font: 1em / 1.5 sans-serif;
915
+ height: 100vh;
916
+ display: grid;
917
+ place-items: center;
918
+ position: fixed;
919
+ left: 0;
920
+ right: 0;
921
+ top: 0;
922
+ display: none;
923
+ }
924
+
925
+ </style>
926
+ </head>
927
+ <body>
928
+ <div class="main-anmi-loading">
929
+
930
+ <div class="wheel-and-hamster" role="img" aria-label="Orange and tan hamster running in a metal wheel">
931
+ <div class="wheel"></div>
932
+ <div class="hamster">
933
+ <div class="hamster__body">
934
+ <div class="hamster__head">
935
+ <div class="hamster__ear"></div>
936
+ <div class="hamster__eye"></div>
937
+ <div class="hamster__nose"></div>
938
+ </div>
939
+ <div class="hamster__limb hamster__limb--fr"></div>
940
+ <div class="hamster__limb hamster__limb--fl"></div>
941
+ <div class="hamster__limb hamster__limb--br"></div>
942
+ <div class="hamster__limb hamster__limb--bl"></div>
943
+ <div class="hamster__tail"></div>
944
+ </div>
945
+ </div>
946
+ <div class="spoke"></div>
947
+ </div>
948
+
949
+
950
+ </div>
951
+ <!-- Video Modal -->
952
+ <!-- Video Modal -->
953
+ <div id="videoModal" class="modal">
954
+ <div class="modal-content">
955
+ <span class="close">&times;</span>
956
+ <video autoplay id="videoPlayer" controls>
957
+ <source id="videoSource" type="video/mp4" />
958
+ Your browser does not support the video tag.
959
+ </video>
960
+ <div id="videoInfo">
961
+ <h3 id="videoTitle"></h3>
962
+ <p id="videoCategory"></p>
963
+ <p id="uploadTime"></p>
964
+ <div id="uploaderInfo">
965
+ <p>Uploaded by: <span id="uploaderName"></span></p>
966
+ <img
967
+ id="uploaderImage"
968
+ src=""
969
+ alt="Uploader Image"
970
+ class="uploader_image"
971
+ />
972
+ </div>
973
+ </div>
974
+ </div>
975
+ </div>
976
+
977
+ <!-- نموذج رفع الفيديو -->
978
+ <div class="upload-form">
979
+ <!-- حقل البحث -->
980
+ <input type="text" id="searchInput" placeholder="ابحث عن الفيديوهات..." />
981
+ <br>
982
+ <br>
983
+
984
+ <!-- زر لعرض قوائم التشغيل العامة -->
985
+ <button id="showPlaylistsBtn">عرض القوائم العامة</button>
986
+
987
+ <!-- زر لعرض قوائم التشغيل الخاصة بالمستخدم الحالي -->
988
+ <!-- زر جديد لعرض قوائم التشغيل الخاصة بالمستخدم -->
989
+ <button id="showUserPlaylistsBtn">عرض قوائم التشغيل الخاصة بي</button>
990
+
991
+ <div class="loading_model" id="loading_upload_model" style="display: none;">
992
+ <div class="progress-circle" id="progress-circle">
993
+ <span id="progress-percentage">0%</span>
994
+ </div>
995
+ </div>
996
+ <h3>Upload a Video</h3>
997
+ <form id="upload-form" action="/videos" method="POST" enctype="multipart/form-data">
998
+ <label for="title">Video Title:</label>
999
+ <input type="text" name="title" id="title" required />
1000
+ <br /><br />
1001
+ <label for="video">Select Video:</label>
1002
+ <input type="file" name="video" id="video" required />
1003
+ <br /><br />
1004
+ <label for="thumbnail">Select Thumbnail (optional):</label>
1005
+ <input type="file" name="thumbnail" id="thumbnail" />
1006
+ <br /><br />
1007
+ <button type="submit">Upload</button>
1008
+ </form>
1009
+
1010
+ <!-- عرض الفيديوهات -->
1011
+ <p id="no-results-message" style="display: none;">لا توجد نتائج للبحث</p>
1012
+ <div id="video-container" class="video-container">
1013
+
1014
+ <!-- Skeleton Loading -->
1015
+ {% for _ in range(5) %}
1016
+ <div class="skeleton skeleton-card"></div>
1017
+ {% endfor %}
1018
+ </div>
1019
+
1020
+ <!-- رسالة عند عدم وجود فيديوهات -->
1021
+ <div id="empty-message" class="empty-message" style="display: none">
1022
+ No videos found.
1023
+ </div>
1024
+
1025
+ <!-- Modal لتعديل الفيديو -->
1026
+ <div id="editModal" class="modal custom-modal">
1027
+ <div class="modal-content custom-modal-content">
1028
+ <span class="close-edit custom-close">&times;</span>
1029
+ <h2 class="modal-title">تعديل عنوان الفيديو</h2>
1030
+ <input
1031
+ type="text"
1032
+ id="editTitle"
1033
+ class="modal-input"
1034
+ placeholder="العنوان الجديد"
1035
+ />
1036
+ <button id="saveEdit" class="modal-button modal-button-save">
1037
+ حفظ
1038
+ </button>
1039
+ </div>
1040
+ </div>
1041
+
1042
+ <!-- Modal لتأكيد الحذف -->
1043
+ <div id="deleteModal" class="custom-modal">
1044
+ <div class="custom-modal-content-delete">
1045
+ <span class="close-delete custom-close">&times;</span>
1046
+ <h2 class="modal-title">هل أنت متأكد من حذف الفيديو؟</h2>
1047
+ <div class="modal-buttons">
1048
+ <button id="confirmDelete" class="modal-button modal-button-delete">
1049
+ نعم، احذف
1050
+ </button>
1051
+ <button id="cancelDelete" class="modal-button modal-button-cancel">
1052
+ إلغاء
1053
+ </button>
1054
+ </div>
1055
+ </div>
1056
+ </div>
1057
+
1058
+ <!-- Modal Message -->
1059
+ <!-- Modal Message -->
1060
+ <div id="model-message-success" class="modal-message">
1061
+ <div class="modal-content-main">
1062
+ <span class="close-message">&times;</span>
1063
+ <!-- أيقونة الصح مع الرسالة -->
1064
+ <div class="modal-icon">
1065
+ <i class="fas fa-check-circle success-icon"></i>
1066
+ </div>
1067
+ <p id="message-content"></p>
1068
+ </div>
1069
+ </div>
1070
+
1071
+ <!-- Modal لإضافة الفيديو إلى قائمة التشغيل -->
1072
+ <div id="playlistModal" class="modal">
1073
+ <div class="modal-content-playlist">
1074
+ <span class="close-playlist">&times;</span>
1075
+ <h2>إضافة إلى قائمة التشغيل</h2>
1076
+
1077
+ <!-- إنشاء قائمة تشغيل جديدة -->
1078
+ <div class="create-playlist">
1079
+ <input type="text" id="newPlaylistName" placeholder="اسم قائمة التشغيل الجديدة" />
1080
+ <select id="playlistVisibility">
1081
+ <option value="public">عامة</option>
1082
+ <option value="private">خاصة</option>
1083
+ </select>
1084
+ <button id="createPlaylist">إنشاء قائمة</button>
1085
+ </div>
1086
+
1087
+ <!-- قوائم التشغيل الحالية -->
1088
+ <div class="existing-playlists">
1089
+ <h3>قوائم التشغيل الحالية</h3>
1090
+ <ul id="playlistList"></ul>
1091
+ </div>
1092
+ </div>
1093
+ </div>
1094
+
1095
+
1096
+
1097
+ <!-- Modal لقوائم التشغيل -->
1098
+ <div id="playlistsModal" class="modal-unique">
1099
+ <div class="modal-content-unique">
1100
+ <h2>Playlists</h2>
1101
+ <button class="close-unique" onclick="closeModalUnique('playlistsModal')">&times;</button>
1102
+
1103
+ <!-- حقل البحث -->
1104
+ <input
1105
+ type="text"
1106
+ id="searchPlaylistsInput"
1107
+ placeholder="ابحث عن قائمة تشغيل..."
1108
+ style="width: 100%; margin-bottom: 10px; padding: 8px; border: 1px solid #ccc; border-radius: 5px;">
1109
+ <ul id="playlistsList"></ul>
1110
+ </div>
1111
+ </div>
1112
+
1113
+ <!-- Modal للفيديوهات -->
1114
+ <!-- نافذة الـ Modal الخاصة بالفيديوهات -->
1115
+ <div id="videosModal" class="modal-unique">
1116
+
1117
+ <div class="modal-content-unique">
1118
+
1119
+ <div id="videoPlayerContainer">
1120
+ <!-- محتوى الفيديو هنا -->
1121
+
1122
+ <video id="videoPlayer2" class="video-player-unique" controls></video>
1123
+ <button class="close-unique" onclick="closeModalUnique('videosModal')">&times;</button>
1124
+
1125
+ <div id="videoDetails" class="mt-3"></div>
1126
+ </div>
1127
+
1128
+ <div id="videosList" class="video-list-unique"></div>
1129
+ </div>
1130
+ </div>
1131
+
1132
+
1133
+ <script>
1134
+ document.addEventListener("DOMContentLoaded", function () {
1135
+ // جلب الفيديوهات باستخدام AJAX بعد تحميل الصفحة
1136
+ fetch("/get_videos")
1137
+ .then((response) => response.json())
1138
+ .then((data) => {
1139
+ console.log("Fetched videos data:", data); // تحقق من البيانات هنا
1140
+ const videoContainer = document.getElementById("video-container");
1141
+ const emptyMessage = document.getElementById("empty-message");
1142
+ const noResultsMessage = document.getElementById("no-results-message");
1143
+
1144
+ // إزالة السكلتون إذا كانت هناك فيديوهات
1145
+ if (data.length > 0) {
1146
+ videoContainer.innerHTML = ""; // مسح السكلتون
1147
+ data.forEach((video) => {
1148
+ console.log("Video data:", video); // تحقق من كل فيديو
1149
+ const videoCard = document.createElement("div");
1150
+ videoCard.classList.add("video-card");
1151
+ videoCard.innerHTML = `
1152
+ <img src="${video.thumbnail}" alt="Thumbnail">
1153
+ <h4>${video.uploader_name}</h4>
1154
+ <p><strong>Title:</strong> ${video.title}</p>
1155
+ <p><strong>Category:</strong> ${video.category}</p>
1156
+ <p>${video.upload_time}</p>
1157
+ <img class="uploader_image" src="${video.uploader_image}" alt="User Image" width="50">
1158
+
1159
+ <!-- الأزرار -->
1160
+ <div class="video-actions">
1161
+ ${
1162
+ video.is_owner
1163
+ ? `
1164
+ <button class="edit-video" data-video-id="${video.id}">تعديل</button>
1165
+ <button class="delete-video" data-video-id="${video.id}">حذف</button>
1166
+ `
1167
+ : ""
1168
+ }
1169
+ <button class="add-to-playlist" data-video-id="${video.id}">إضافة إلى قائمة التشغيل</button>
1170
+ </div>
1171
+ `;
1172
+ videoContainer.appendChild(videoCard);
1173
+
1174
+ // إضافة أحداث للأزرار
1175
+ if (video.is_owner) {
1176
+ const editButton = videoCard.querySelector(".edit-video");
1177
+ const deleteButton = videoCard.querySelector(".delete-video");
1178
+
1179
+ editButton.addEventListener("click", function (e) {
1180
+ e.stopPropagation(); // منع انتشار الحدث إلى الفيديو
1181
+ openEditModal(video);
1182
+ });
1183
+
1184
+ deleteButton.addEventListener("click", function (e) {
1185
+ e.stopPropagation(); // منع انتشار الحدث إلى الفيديو
1186
+ openDeleteModal(video);
1187
+ });
1188
+ }
1189
+
1190
+ const addToPlaylistButton = videoCard.querySelector(".add-to-playlist");
1191
+ addToPlaylistButton.addEventListener("click", function (e) {
1192
+ e.stopPropagation(); // منع انتشار الحدث إلى الفيديو
1193
+ addToPlaylist(video); // فتح Modal قوائم التشغيل
1194
+ });
1195
+
1196
+ // إضافة حدث عند النقر على الفيديو لفتح الـ Modal
1197
+ videoCard.addEventListener("click", function () {
1198
+ openModal(video);
1199
+ });
1200
+
1201
+ // إضافة خصائص مميزة لكل فيديو
1202
+ videoCard.dataset.title = video.title.toLowerCase(); // حفظ العنوان داخل الـ dataset
1203
+ videoCard.dataset.category = video.category.toLowerCase(); // حفظ الفئة داخل الـ dataset
1204
+ });
1205
+
1206
+ // إضافة حدث البحث على النص المدخل
1207
+ const searchInput = document.getElementById("searchInput");
1208
+ searchInput.addEventListener("input", function () {
1209
+ const searchTerm = searchInput.value.trim().toLowerCase(); // النص المدخل
1210
+ let resultsFound = false; // متغير لتتبع ما إذا كانت هناك نتائج أم لا
1211
+
1212
+ // إخفاء الفيديوهات التي لا تتطابق مع النص المدخل
1213
+ const videoCards = videoContainer.querySelectorAll(".video-card");
1214
+ videoCards.forEach((videoCard) => {
1215
+ const title = videoCard.dataset.title; // الحصول على العنوان المخزن
1216
+ const category = videoCard.dataset.category; // الحصول على الفئة المخزنة
1217
+
1218
+ // إذا كان هناك تطابق مع النص المدخل، إظهار الفيديو
1219
+ if (title.includes(searchTerm) || category.includes(searchTerm)) {
1220
+ videoCard.style.display = "block"; // إظهار الفيديو إذا كان متوافقًا مع البحث
1221
+ resultsFound = true; // هناك نتائج
1222
+ } else {
1223
+ videoCard.style.display = "none"; // إخفاء الفيديو إذا لم يتوافق مع البحث
1224
+ }
1225
+ });
1226
+
1227
+ // إظهار أو إخفاء رسالة "لا توجد نتائج"
1228
+ if (resultsFound) {
1229
+ noResultsMessage.style.display = "none"; // إخفاء الرسالة إذا كانت هناك نتائج
1230
+ } else {
1231
+ noResultsMessage.style.display = "block"; // إظهار الرسالة إذا لم توجد نتائج
1232
+ }
1233
+ });
1234
+ } else {
1235
+ // إذا لم توجد فيديوهات، إظهار رسالة فارغة
1236
+ setTimeout(() => {
1237
+ videoContainer.innerHTML = ""; // مسح السكلتون
1238
+ emptyMessage.style.display = "block"; // عرض الرسالة
1239
+ }, 1000); // تأخير 1 ثانية
1240
+ }
1241
+ })
1242
+ .catch((error) => {
1243
+ console.error("Error fetching videos:", error);
1244
+ const videoContainer = document.getElementById("video-container");
1245
+ videoContainer.innerHTML = ""; // مسح السكلتون في حالة حدوث خطأ
1246
+ const emptyMessage = document.getElementById("empty-message");
1247
+ emptyMessage.textContent =
1248
+ "Failed to load videos. Please try again later.";
1249
+ emptyMessage.style.display = "block";
1250
+ });
1251
+ });
1252
+
1253
+
1254
+ // وظيفة البحث داخل قوائم التشغيل
1255
+ document.getElementById('searchPlaylistsInput').addEventListener('input', function() {
1256
+ const searchTerm = this.value.toLowerCase();
1257
+ const items = document.querySelectorAll('.playlist-item-unique');
1258
+
1259
+ items.forEach(item => {
1260
+ const playlistName = item.textContent.toLowerCase();
1261
+ if (playlistName.includes(searchTerm)) {
1262
+ item.style.display = 'list-item';
1263
+ } else {
1264
+ item.style.display = 'none';
1265
+ }
1266
+ });
1267
+ });
1268
+
1269
+ // دالة لفتح الـ Modal عند النقر على الفيديو
1270
+ function openModal(video) {
1271
+ const modal = document.getElementById("videoModal");
1272
+ const videoPlayer = document.getElementById("videoPlayer");
1273
+ const videoTitle = document.getElementById("videoTitle");
1274
+ const videoCategory = document.getElementById("videoCategory");
1275
+ const uploadTime = document.getElementById("uploadTime");
1276
+ const uploaderName = document.getElementById("uploaderName");
1277
+ const uploaderImage = document.getElementById("uploaderImage");
1278
+ const videoSource = document.getElementById("videoSource");
1279
+
1280
+ // عرض الـ Modal مع أنيميشن
1281
+ modal.style.display = "block";
1282
+ modal.classList.remove("close-animation"); // إزالة التأثير عند الإغلاق
1283
+
1284
+ // تحديث البيانات فقط بعد عرض المودال
1285
+ setTimeout(() => {
1286
+ // تحديث مصدر الفيديو بشكل غير متزامن
1287
+ videoSource.src = video.video_path;
1288
+ videoPlayer.load(); // إعادة تحميل الفيديو (يبدأ التحميل)
1289
+
1290
+ // تحديث النصوص التفصيلية
1291
+ videoTitle.textContent = video.title;
1292
+ videoCategory.textContent = `Category: ${video.category}`;
1293
+ uploadTime.textContent = `Uploaded on: ${video.upload_time}`;
1294
+ uploaderName.textContent = video.uploader_name;
1295
+ uploaderImage.src = video.uploader_image;
1296
+ }, 50); // إضافة تأخير بسيط لكي يظهر المودال بسرعة قبل تحميل الفيديو
1297
+ }
1298
+
1299
+ // غلق الـ Modal عند النقر على زر الإغلاق
1300
+ document.querySelector(".close").addEventListener("click", function () {
1301
+ const modal = document.getElementById("videoModal");
1302
+ modal.classList.add("close-animation"); // إضافة التأثير عند الإغلاق
1303
+
1304
+ const videoSource = document.getElementById("videoSource");
1305
+ const videoPlayer = document.getElementById("videoPlayer");
1306
+
1307
+ // إزالة مصدر الفيديو لعدم تحميله في الخلفية
1308
+ videoSource.src = "";
1309
+ videoPlayer.load(); // إيقاف تحميل الفيديو
1310
+
1311
+ // تأخير إخفاء المودال حتى تنتهي الأنيميشن
1312
+ setTimeout(() => {
1313
+ modal.style.display = "none";
1314
+ }, 200); // تأخير يتناسب مع مدة الأنيميشن (0.3 ثانية)
1315
+ });
1316
+
1317
+ function showMessage(message, isSuccess) {
1318
+ const modal = document.getElementById("model-message-success");
1319
+ const messageContent = document.getElementById("message-content");
1320
+ const closeButton = document.querySelector(".close-message");
1321
+ const successIcon = document.querySelector(".success-icon");
1322
+
1323
+ // تغيير محتوى الرسالة بناءً على النجاح أو الفشل
1324
+ messageContent.textContent = message;
1325
+
1326
+ // تغيير الأيقونة بناءً على النجاح أو الفشل
1327
+ if (isSuccess) {
1328
+ successIcon.classList.remove("fa-times-circle");
1329
+ successIcon.classList.add("fa-check-circle");
1330
+ successIcon.style.color = "#4CAF50"; // الأخضر للنجاح
1331
+ } else {
1332
+ successIcon.classList.remove("fa-check-circle");
1333
+ successIcon.classList.add("fa-times-circle");
1334
+ successIcon.style.color = "#F44336"; // الأحمر للفشل
1335
+ }
1336
+
1337
+ // إظهار المودال
1338
+ modal.style.display = "flex";
1339
+
1340
+ // إغلاق المودال عند الضغط على زر الإغلاق
1341
+ closeButton.onclick = function () {
1342
+ modal.style.display = "none";
1343
+ };
1344
+
1345
+ // إغلاق المودال بعد 3 ثواني
1346
+ setTimeout(function () {
1347
+ modal.style.display = "none";
1348
+ }, 1000);
1349
+ }
1350
+
1351
+ // دالة لفتح Modal التعديل
1352
+ function openEditModal(video) {
1353
+ const editModal = document.getElementById("editModal");
1354
+ const editTitleInput = document.getElementById("editTitle");
1355
+ editTitleInput.value = video.title; // تعبئة العنوان الحالي
1356
+ editModal.style.display = "block";
1357
+
1358
+ // إغلاق Modal التعديل عند النقر على زر الإغلاق
1359
+ const closeEditButton = document.querySelector(".close-edit");
1360
+ closeEditButton.addEventListener("click", function () {
1361
+ editModal.style.display = "none";
1362
+ });
1363
+
1364
+ // حفظ التعديلات
1365
+ const saveEditButton = document.getElementById("saveEdit");
1366
+ saveEditButton.onclick = function () {
1367
+ const newTitle = editTitleInput.value;
1368
+ if (newTitle) {
1369
+ fetch(`/edit_video/${video.id}`, {
1370
+ method: "POST",
1371
+ headers: {
1372
+ "Content-Type": "application/json",
1373
+ },
1374
+ body: JSON.stringify({ title: newTitle }),
1375
+ })
1376
+ .then((response) => response.json())
1377
+ .then((data) => {
1378
+ if (data.success) {
1379
+ showMessage("تم تعديل العنوان بنجاح", true); // عرض رسالة النجاح
1380
+ editModal.style.display = "none";
1381
+ location.reload(); // إعادة تحميل الصفحة لتحديث البيانات
1382
+ } else {
1383
+ showMessage("حدث خطأ أثناء تعديل العنوان", false); // عرض رسالة الفشل
1384
+ }
1385
+ });
1386
+ }
1387
+ };
1388
+ }
1389
+
1390
+ // دالة لفتح Modal الحذف
1391
+ function openDeleteModal(video) {
1392
+ const deleteModal = document.getElementById("deleteModal");
1393
+ deleteModal.style.display = "block";
1394
+
1395
+ // إغلاق Modal الحذف عند النقر على زر الإغلاق
1396
+ const closeDeleteButton = document.querySelector(".close-delete");
1397
+ closeDeleteButton.addEventListener("click", function () {
1398
+ deleteModal.style.display = "none";
1399
+ });
1400
+
1401
+ // تأكيد الحذف
1402
+ const confirmDeleteButton = document.getElementById("confirmDelete");
1403
+ confirmDeleteButton.onclick = function () {
1404
+ fetch(`/delete_video/${video.id}`, {
1405
+ method: "DELETE",
1406
+ })
1407
+ .then((response) => response.json())
1408
+ .then((data) => {
1409
+ if (data.success) {
1410
+ showMessage("تم الحذف بنجاح", true); // عرض رسالة النجاح
1411
+ deleteModal.style.display = "none";
1412
+ location.reload(); // إعادة تحميل الصفحة لتحديث البيانات
1413
+ }
1414
+ });
1415
+ };
1416
+
1417
+ // إلغاء الحذف
1418
+ const cancelDeleteButton = document.getElementById("cancelDelete");
1419
+ cancelDeleteButton.onclick = function () {
1420
+ deleteModal.style.display = "none";
1421
+ };
1422
+ }
1423
+
1424
+
1425
+
1426
+
1427
+ // دالة لفتح Modal قوائم التشغيل
1428
+ // دالة لفتح Modal قوائم التشغيل
1429
+ function openPlaylistModal(video) {
1430
+ const modal = document.getElementById("playlistModal");
1431
+ modal.style.display = "block";
1432
+
1433
+ // إغلاق Modal عند النقر على زر الإغلاق
1434
+ const closeButton = document.querySelector(".close-playlist");
1435
+ closeButton.onclick = function () {
1436
+ modal.style.display = "none";
1437
+ };
1438
+
1439
+ // دالة لتحديث قوائم التشغيل في الواجهة
1440
+ function updatePlaylists() {
1441
+ fetch(`/get_playlists_with_video_status/${video.id}`)
1442
+ .then((response) => response.json())
1443
+ .then((data) => {
1444
+ const playlistList = document.getElementById("playlistList");
1445
+ playlistList.innerHTML = ""; // مسح القوائم القديمة
1446
+
1447
+ data.forEach((playlist) => {
1448
+ const listItem = document.createElement("li");
1449
+ listItem.innerHTML = `
1450
+ <label>
1451
+ <input type="checkbox" class="playlist-checkbox"
1452
+ data-playlist-id="${playlist.id}"
1453
+ ${playlist.video_exists ? "checked" : ""}>
1454
+ ${playlist.name} (${playlist.is_public ? "عامة" : "خاصة"})
1455
+ </label>
1456
+ <button class="delete-playlist" data-playlist-id="${playlist.id}">حذف</button>
1457
+ `;
1458
+ playlistList.appendChild(listItem);
1459
+
1460
+ // إضافة حدث تغيير الـ Checkbox
1461
+ const checkbox = listItem.querySelector(".playlist-checkbox");
1462
+ checkbox.addEventListener("change", function (e) {
1463
+ const playlistId = checkbox.getAttribute("data-playlist-id");
1464
+ const isChecked = checkbox.checked;
1465
+
1466
+ if (isChecked) {
1467
+ // إضافة الفيديو إلى القائمة
1468
+ fetch(`/add_video_to_playlist/${playlistId}/${video.id}`, {
1469
+ method: "POST",
1470
+ })
1471
+ .then((response) => response.json())
1472
+ .then((data) => {
1473
+ if (data.success) {
1474
+ console.log(`تمت إضافة الفيديو إلى القائمة ${playlistId}`);
1475
+ }
1476
+ });
1477
+ } else {
1478
+ // إزالة الفيديو من القائمة
1479
+ fetch(`/remove_video_from_playlist/${playlistId}/${video.id}`, {
1480
+ method: "DELETE",
1481
+ })
1482
+ .then((response) => response.json())
1483
+ .then((data) => {
1484
+ if (data.success) {
1485
+ console.log(`تمت إزالة الفيديو من القائمة ${playlistId}`);
1486
+ }
1487
+ });
1488
+ }
1489
+ });
1490
+
1491
+ // إضافة حدث حذف قائمة التشغيل
1492
+ const deleteButton = listItem.querySelector(".delete-playlist");
1493
+ deleteButton.addEventListener("click", function (e) {
1494
+ e.stopPropagation(); // منع انتشار الحدث
1495
+ const playlistId = deleteButton.getAttribute("data-playlist-id");
1496
+ deletePlaylist(playlistId, video); // تمرير video كمعامل
1497
+ });
1498
+ });
1499
+ });
1500
+ }
1501
+
1502
+ // تحديث قوائم التشغيل عند فتح الـ Modal
1503
+ updatePlaylists();
1504
+
1505
+ // إنشاء قائمة تشغيل جديدة
1506
+ const createPlaylistButton = document.getElementById("createPlaylist");
1507
+ createPlaylistButton.onclick = function () {
1508
+ const newPlaylistName = document.getElementById("newPlaylistName").value;
1509
+ const isPublic = document.getElementById("playlistVisibility").value === "public";
1510
+
1511
+ if (newPlaylistName) {
1512
+ fetch("/create_playlist", {
1513
+ method: "POST",
1514
+ headers: {
1515
+ "Content-Type": "application/json",
1516
+ },
1517
+ body: JSON.stringify({
1518
+ name: newPlaylistName,
1519
+ is_public: isPublic,
1520
+ }),
1521
+ })
1522
+ .then((response) => response.json())
1523
+ .then((data) => {
1524
+ if (data.success) {
1525
+ updatePlaylists(); // تحديث قوائم التشغيل بعد الإنشاء
1526
+ }
1527
+ });
1528
+ }
1529
+ };
1530
+ }
1531
+
1532
+ // دالة لحذف قائمة التشغيل
1533
+ function deletePlaylist(playlistId, video) {
1534
+ if (confirm("هل أنت متأكد من حذف هذه القائ��ة؟")) {
1535
+ fetch(`/delete_playlist/${playlistId}`, {
1536
+ method: "DELETE",
1537
+ })
1538
+ .then((response) => response.json())
1539
+ .then((data) => {
1540
+ if (data.success) {
1541
+ // alert("تم حذف القائمة بنجاح");
1542
+ openPlaylistModal(video); // إعادة تحميل قوائم التشغيل بعد الحذف
1543
+ } else {
1544
+ alert("حدث خطأ أثناء حذف القائمة");
1545
+ }
1546
+ });
1547
+ }
1548
+ }
1549
+ // دالة لإضافة الفيديو إلى قائمة التشغيل
1550
+ function addToPlaylist(video) {
1551
+ openPlaylistModal(video); // فتح Modal قوائم التشغيل
1552
+ }
1553
+
1554
+
1555
+
1556
+ // وظيفة لفتح النماذج
1557
+ function openModalUnique(modalId) {
1558
+ const modal = document.getElementById(modalId);
1559
+ if (modal) {
1560
+ modal.style.display = 'flex';
1561
+ let videoPlayer2 =document.getElementById("videoPlayer2").style.display = "flex"
1562
+
1563
+ }
1564
+ }
1565
+
1566
+ // وظيفة لإغلاق النماذج
1567
+ function closeModalUnique(modalId) {
1568
+ const modal = document.getElementById(modalId);
1569
+ if (modal) {
1570
+ modal.style.display = 'none';
1571
+ let videoPlayer2 = document.getElementById("videoPlayer2").load();;
1572
+
1573
+ }
1574
+ }
1575
+ // جلب قوائم التشغيل وعرضها
1576
+ document.getElementById('showPlaylistsBtn').addEventListener('click', async () => {
1577
+ try {
1578
+ const response = await fetch('/get_playlists');
1579
+ if (!response.ok) {
1580
+ throw new Error(`فشل تحميل قوائم التشغيل: ${response.statusText}`);
1581
+ }
1582
+
1583
+ const playlists = await response.json();
1584
+ const playlistsList = document.getElementById('playlistsList');
1585
+ if (playlists.length === 0) {
1586
+ playlistsList.innerHTML = '<li>No playlists available</li>';
1587
+ } else {
1588
+ playlistsList.innerHTML = playlists.map(playlist => `
1589
+ <li class="playlist-item-unique" data-playlist-id="${playlist.id}">
1590
+ ${playlist.name}
1591
+ </li>
1592
+ `).join('');
1593
+ }
1594
+
1595
+ openModalUnique('playlistsModal'); // فتح Modal قوائم التشغيل
1596
+
1597
+ // إضافة حدث النقر على عنصر قائمة التشغيل
1598
+ document.querySelectorAll('.playlist-item-unique').forEach(item => {
1599
+ item.addEventListener('click', async () => {
1600
+ const playlistId = item.getAttribute('data-playlist-id');
1601
+ try {
1602
+ const response = await fetch(`/get_playlist_videos/${playlistId}`);
1603
+ if (!response.ok) {
1604
+ throw new Error(`فشل تحميل الفيديوهات لقائمة التشغيل: ${response.statusText}`);
1605
+ }
1606
+
1607
+ const videos = await response.json();
1608
+ const videosList = document.getElementById('videosList');
1609
+ if (videos.length === 0) {
1610
+ const videoPlayer2 = document.getElementById("videoPlayer2").style.display = "none"
1611
+ const videoDetails = document.getElementById("videoDetails")
1612
+ videoDetails.innerHTML = '<div>No videos available</div>';
1613
+ } else {
1614
+ let videoPlayer2 = document.getElementById('videoPlayer2')
1615
+ videoPlayer2.style.display = "flex"
1616
+ videosList.innerHTML = videos.map(video => `
1617
+ <div class="video-item-unique" data-video-id="${video.id}">
1618
+ <img src="${video.thumbnail_path}" alt="${video.title}">
1619
+ <div>
1620
+ <h6>${video.title}</h6>
1621
+ <small>${video.uploader_name}</small>
1622
+ <!-- زر حذف الفيديو يظهر فقط إذا كان المستخدم هو المالك -->
1623
+ ${video.is_owner ? `<button class="delete-video-btn" data-video-id="${video.id}" data-playlist-id="${playlistId}">حذف</button>` : ''}
1624
+ </div>
1625
+ </div>
1626
+ `).join('');
1627
+ }
1628
+
1629
+ openModalUnique('videosModal'); // فتح الـ Modal الخاص بالفيديوهات
1630
+ } catch (error) {
1631
+ console.error(error.message);
1632
+ }
1633
+ });
1634
+ });
1635
+ } catch (error) {
1636
+ console.error(error.message);
1637
+ }
1638
+ });
1639
+
1640
+
1641
+
1642
+ // جلب قوائم التشغيل الخاصة بالمستخدم الحالي وعرضها
1643
+ document.getElementById('showUserPlaylistsBtn').addEventListener('click', async () => {
1644
+ try {
1645
+ const response = await fetch('/get_user_playlists');
1646
+ if (!response.ok) {
1647
+ throw new Error(`فشل تحميل قوائم التشغيل الخاصة بالمستخدم: ${response.statusText}`);
1648
+ }
1649
+
1650
+ const userPlaylists = await response.json();
1651
+ const playlistsList = document.getElementById('playlistsList');
1652
+ if (userPlaylists.length === 0) {
1653
+ playlistsList.innerHTML = '<li>لا توجد قوائم تشغيل خاصة بك</li>';
1654
+ } else {
1655
+ playlistsList.innerHTML = userPlaylists.map(playlist => `
1656
+ <li class="playlist-item-unique" data-playlist-id="${playlist.id}">
1657
+ ${playlist.name}
1658
+ </li>
1659
+ `).join('');
1660
+ }
1661
+
1662
+ openModalUnique('playlistsModal'); // فتح Modal قوائم التشغيل
1663
+
1664
+ // إضافة حدث النقر على عنصر قائمة التشغيل
1665
+ document.querySelectorAll('.playlist-item-unique').forEach(item => {
1666
+ item.addEventListener('click', async () => {
1667
+ const playlistId = item.getAttribute('data-playlist-id');
1668
+ try {
1669
+ const response = await fetch(`/get_playlist_videos/${playlistId}`);
1670
+ if (!response.ok) {
1671
+ throw new Error(`فشل تحميل الفيديوهات لقائمة التشغيل: ${response.statusText}`);
1672
+ }
1673
+
1674
+ const videos = await response.json();
1675
+ const videosList = document.getElementById('videosList');
1676
+ if (videos.length === 0) {
1677
+ const videoPlayer2 = document.getElementById("videoPlayer2").style.display = "none"
1678
+ const videoDetails = document.getElementById("videoDetails")
1679
+ videoDetails.innerHTML = '<div>No videos available</div>';
1680
+ } else {
1681
+ let videoPlayer2 = document.getElementById('videoPlayer2')
1682
+ videoPlayer2.style.display = "flex"
1683
+ videosList.innerHTML = videos.map(video => `
1684
+ <div class="video-item-unique" data-video-id="${video.id}">
1685
+ <img src="${video.thumbnail_path}" alt="${video.title}">
1686
+ <div>
1687
+ <h6>${video.title}</h6>
1688
+ <small>${video.uploader_name}</small>
1689
+ <!-- زر حذف الفيديو يظهر فقط إذا كان المستخدم هو المالك -->
1690
+ ${video.is_owner ? `<button class="delete-video-btn" data-video-id="${video.id}" data-playlist-id="${playlistId}">حذف</button>` : ''}
1691
+ </div>
1692
+ </div>
1693
+ `).join('');
1694
+ }
1695
+
1696
+ openModalUnique('videosModal'); // فتح الـ Modal الخاص بالفيديوهات
1697
+
1698
+
1699
+ // إضافة حدث النقر على زر حذف الفيديو
1700
+ document.querySelectorAll('.delete-video-btn').forEach(deleteBtn => {
1701
+ deleteBtn.addEventListener('click', async (e) => {
1702
+ const videoId = deleteBtn.getAttribute('data-video-id');
1703
+ const playlistId = deleteBtn.getAttribute('data-playlist-id');
1704
+
1705
+ try {
1706
+ // إرسال طلب الحذف إلى الخادم
1707
+ const response = await fetch('/delete_video_from_playlist', {
1708
+ method: 'POST',
1709
+ headers: {
1710
+ 'Content-Type': 'application/json'
1711
+ },
1712
+ body: JSON.stringify({
1713
+ video_id: videoId,
1714
+ playlist_id: playlistId
1715
+ })
1716
+ });
1717
+
1718
+ if (!response.ok) {
1719
+ throw new Error("فشل حذف الفيديو من قائمة التشغيل");
1720
+ }
1721
+
1722
+ // تحديد قائمة الفيديوهات والفهرس الحالي
1723
+ const videoItem = deleteBtn.closest('.video-item-unique');
1724
+ const videos = Array.from(document.querySelectorAll('.video-item-unique')); // تحويل القائمة إلى مصفوفة
1725
+ const currentVideoIndex = videos.findIndex(item => item.classList.contains('active')); // العثور على الفهرس الحالي
1726
+
1727
+ // حذف الفيديو من الواجهة
1728
+ videoItem.remove();
1729
+
1730
+ showMessage("تم الحذف الفديو من قائمة التشغيل", true); // عرض رسالة النجاح
1731
+
1732
+ // تحديث قائمة الفيديوهات المتبقية
1733
+ const remainingVideos = document.querySelectorAll('.video-item-unique');
1734
+ const videoPlayer2 = document.getElementById('videoPlayer2');
1735
+
1736
+ if (remainingVideos.length === 0) {
1737
+ // إذا لم يتبقَ أي فيديوهات
1738
+ videoPlayer2.src = ''; // إيقاف الفيديو
1739
+ videoPlayer2.style.display = "none"
1740
+ let videoDetails = document.getElementById("videoDetails").innerHTML = "<div>No videos available</div>"
1741
+ } else {
1742
+ // إذا كانت هناك فيديوهات
1743
+ if (currentVideoIndex > 0) {
1744
+ // تشغيل الفيديو السابق إذا كان موجودًا
1745
+ const previousVideoItem = videos[currentVideoIndex - 1];
1746
+ previousVideoItem.click();
1747
+ } else if (currentVideoIndex === 0 && videos.length > 1) {
1748
+ // إذا كان الفيديو الأول قد تم حذفه وكان هناك فيديوهات أخرى
1749
+ const nextVideoItem = videos[1];
1750
+ nextVideoItem.click();
1751
+ } else {
1752
+ // إذا لم يكن هناك فيديو نشط، تشغيل أول فيديو متبقٍ
1753
+ const firstRemainingVideo = remainingVideos[0];
1754
+ firstRemainingVideo.click();
1755
+ }
1756
+ }
1757
+ } catch (error) {
1758
+ console.error(error);
1759
+ alert("حدث خطأ أثناء حذف الفيديو");
1760
+ }
1761
+ });
1762
+ });
1763
+
1764
+
1765
+
1766
+ // تشغيل أول فيديو بعد تحميل الفيديوهات مباشرة
1767
+ setTimeout(() => {
1768
+ const firstVideoItem = document.querySelector('.video-item-unique');
1769
+ if (firstVideoItem) {
1770
+ firstVideoItem.click(); // نقوم بمحاكاة الضغط على أول فيديو
1771
+ }
1772
+ }, 100); // تأخير بسيط لانتظار تحميل المحتويات
1773
+
1774
+ let currentVideoIndex = 0; // متغير لتتبع الفيديو الحالي
1775
+
1776
+ // إضافة حدث النقر على عنصر الفيديو
1777
+ document.querySelectorAll('.video-item-unique').forEach((videoItem, index) => {
1778
+ videoItem.addEventListener('click', async () => {
1779
+ // إزالة الفئة active من جميع العناصر
1780
+ document.querySelectorAll('.video-item-unique').forEach(item => {
1781
+ item.classList.remove('active');
1782
+ });
1783
+
1784
+ // إضافة الفئة active للفيديو الذي يتم النقر عليه
1785
+ videoItem.classList.add('active');
1786
+
1787
+ const videoId = videoItem.getAttribute('data-video-id');
1788
+ try {
1789
+ const response = await fetch(`/get_video/${videoId}`);
1790
+ if (!response.ok) {
1791
+ throw new Error(`فشل تحميل الفيديو: ${response.statusText}`);
1792
+ }
1793
+
1794
+ const video = await response.json();
1795
+ const videoPlayer2 = document.getElementById('videoPlayer2');
1796
+ videoPlayer2.src = video.video_path;
1797
+ videoPlayer2.play();
1798
+
1799
+ const videoDetails = document.getElementById('videoDetails');
1800
+ videoDetails.innerHTML = `
1801
+ <h4>${video.title}</h4>
1802
+ <p>Uploaded by: ${video.uploader_name}</p>
1803
+ <p>Uploaded on: ${video.upload_time}</p>
1804
+ <img src="static/${video.uploader_image}" alt="${video.uploader_name}" width="50">
1805
+ `;
1806
+
1807
+ currentVideoIndex = index; // تحديث الفهرس عند النقر على الفيديو
1808
+ } catch (error) {
1809
+ console.error("Error fetching video:", error);
1810
+ alert("حدث خطأ أثناء تحميل الفيديو.");
1811
+ }
1812
+ });
1813
+ });
1814
+
1815
+ // إضافة حدث عند انتهاء الفيديو لتشغيل الفيديو التالي
1816
+ const videoPlayer2 = document.getElementById('videoPlayer2');
1817
+ videoPlayer2.addEventListener('ended', () => {
1818
+ if (currentVideoIndex < videos.length - 1) {
1819
+ const nextVideoItem = document.querySelectorAll('.video-item-unique')[currentVideoIndex + 1];
1820
+ nextVideoItem.click(); // نقوم بمحاكاة الضغط على الفيديو التالي
1821
+ }
1822
+ });
1823
+
1824
+ } catch (error) {
1825
+ console.error("Error fetching playlist videos:", error);
1826
+ alert("حدث خطأ أثناء تحميل الفيديوهات لقائمة التشغيل.");
1827
+ }
1828
+ });
1829
+ });
1830
+
1831
+ } catch (error) {
1832
+ console.error("Error fetching playlists:", error);
1833
+ alert("حدث خطأ أثناء تحميل قوائم التشغيل.");
1834
+ }
1835
+ });
1836
+
1837
+
1838
+
1839
+
1840
+
1841
+
1842
+
1843
+ const uploadForm = document.getElementById('upload-form');
1844
+
1845
+
1846
+ uploadForm.addEventListener('submit', function (e) {
1847
+ // e.preventDefault(); // منع الإرسال التلقائي للنموذج
1848
+ let animation = document.querySelector(".main-anmi-loading").style.display = "grid"
1849
+ })
1850
+
1851
+
1852
+
1853
+ </script>
1854
+ </body>
1855
+ </html>