الملفات
talabatuk_plus_1/admin.js
Muhammad Kadi 1fad70df4a ١
2026-03-16 17:25:57 +04:00

240 أسطر
8.0 KiB
JavaScript

/* ============================================
admin.js - لوحة تحكم طلباتك بلس (نسخة آمنة بدون كلمة مرور ثابتة)
============================================ */
// تحديد رابط API بناءً على البيئة
const API_BASE = (() => {
const host = window.location.hostname;
if (host === 'localhost' || host === '127.0.0.1' || host.startsWith('192.168.')) {
return `http://${host}:3000/api`; // عدّل المنفذ حسب إعدادات السيرفر
}
return '/api';
})();
// --- دالة تسجيل الدخول عبر الخادم ---
async function checkAuth() {
const password = document.getElementById('adminPassword').value;
try {
const res = await fetch(API_BASE + '/login', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ password })
});
const data = await res.json();
if (data.success) {
sessionStorage.setItem('adminPass', password);
document.getElementById('loginSection').classList.add('hidden');
document.getElementById('adminContent').classList.remove('hidden');
loadSettings(); // تحميل الإعدادات بعد الدخول
} else {
alert('❌ ' + (data.message || 'كلمة المرور غير صحيحة'));
}
} catch (err) {
alert('❌ فشل الاتصال بالخادم. تأكد من تشغيل السيرفر.');
}
}
function logout() {
document.getElementById('loginSection').classList.remove('hidden');
document.getElementById('adminContent').classList.add('hidden');
document.getElementById('adminPassword').value = '';
}
// --- تحميل الإعدادات من الخادم ---
async function loadSettings() {
try {
const res = await fetch(API_BASE + '/settings');
if (!res.ok) throw new Error('فشل تحميل الإعدادات');
const data = await res.json();
document.getElementById('whatsappNumber').value = data.whatsappNumber || '';
document.getElementById('facebookUrl').value = data.facebookUrl || '';
document.getElementById('instagramUrl').value = data.instagramUrl || '';
document.getElementById('appStoreUrl').value = data.appStoreUrl || '';
document.getElementById('googlePlayUrl').value = data.googlePlayUrl || '';
document.getElementById('apkUrl').value = data.apkUrl || '';
if (data.telegramChatIds && Array.isArray(data.telegramChatIds)) {
document.getElementById('telegramChatIds').value = data.telegramChatIds.join('\n');
}
renderVideos(data.videos || []);
} catch (error) {
console.error('خطأ في تحميل الإعدادات:', error);
alert('تعذر تحميل الإعدادات. تأكد من تشغيل الخادم.');
}
}
// --- عرض الفيديوهات ---
function renderVideos(videos) {
const container = document.getElementById('videosList');
container.innerHTML = '';
videos.forEach((url, index) => {
const videoId = extractYouTubeVideoId(url);
const thumbnail = videoId ? `https://img.youtube.com/vi/${videoId}/mqdefault.jpg` : '';
const card = document.createElement('div');
card.className = 'bg-zinc-100 p-4 rounded-2xl relative';
card.innerHTML = `
<img src="${thumbnail}" alt="فيديو" class="w-full h-32 object-cover rounded-xl mb-2">
<p class="text-sm truncate" title="${url}">${url}</p>
<button onclick="deleteVideo(${index})" class="mt-2 bg-red-500 text-white px-3 py-1 rounded-xl text-sm hover:bg-red-600 transition-colors">
🗑️ حذف
</button>
`;
container.appendChild(card);
});
}
function extractYouTubeVideoId(url) {
const patterns = [
/youtube\.com\/watch\?v=([^&]+)/,
/youtu\.be\/([^?]+)/,
/youtube\.com\/embed\/([^?]+)/
];
for (let pattern of patterns) {
const match = url.match(pattern);
if (match && match[1]) return match[1];
}
return null;
}
// --- إضافة فيديو جديد ---
async function addVideo() {
const url = document.getElementById('newVideoUrl').value.trim();
if (!url) {
alert('الرجاء إدخال رابط الفيديو');
return;
}
try {
const res = await fetch(API_BASE + '/settings');
const data = await res.json();
const videos = data.videos || [];
videos.push(url);
const updateRes = await fetch(API_BASE + '/settings', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'x-admin-password': sessionStorage.getItem('adminPass') || ''
},
body: JSON.stringify({ videos })
});
if (updateRes.ok) {
document.getElementById('newVideoUrl').value = '';
loadSettings(); // إعادة تحميل القائمة
alert('✅ تمت إضافة الفيديو بنجاح');
} else {
alert('❌ فشل إضافة الفيديو');
}
} catch (error) {
console.error(error);
alert('❌ خطأ في الاتصال بالخادم');
}
}
// --- حذف فيديو ---
async function deleteVideo(index) {
if (!confirm('هل أنت متأكد من حذف هذا الفيديو؟')) return;
try {
const res = await fetch(API_BASE + '/settings');
const data = await res.json();
const videos = data.videos || [];
videos.splice(index, 1);
const updateRes = await fetch(API_BASE + '/settings', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'x-admin-password': sessionStorage.getItem('adminPass') || ''
},
body: JSON.stringify({ videos })
});
if (updateRes.ok) {
loadSettings();
alert('✅ تم الحذف');
} else {
alert('❌ فشل الحذف');
}
} catch (error) {
console.error(error);
alert('❌ خطأ في الاتصال');
}
}
// --- دوال تحديث الحقول الفردية ---
async function updateWhatsApp() {
const value = document.getElementById('whatsappNumber').value.trim();
await updateField('whatsappNumber', value);
}
async function updateFacebook() {
const value = document.getElementById('facebookUrl').value.trim();
await updateField('facebookUrl', value);
}
async function updateInstagram() {
const value = document.getElementById('instagramUrl').value.trim();
await updateField('instagramUrl', value);
}
async function updateAppStore() {
const value = document.getElementById('appStoreUrl').value.trim();
await updateField('appStoreUrl', value);
}
async function updateGooglePlay() {
const value = document.getElementById('googlePlayUrl').value.trim();
await updateField('googlePlayUrl', value);
}
async function updateApk() {
const value = document.getElementById('apkUrl').value.trim();
await updateField('apkUrl', value);
}
async function updateTelegramChatIds() {
const text = document.getElementById('telegramChatIds').value.trim();
const ids = text.split('\n')
.map(line => line.trim())
.filter(line => line !== '');
await updateField('telegramChatIds', ids);
}
// دالة عامة لتحديث حقل واحد
async function updateField(key, value) {
const password = document.getElementById('adminPassword').value || sessionStorage.getItem('adminPass') || '';
try {
const res = await fetch(API_BASE + '/settings', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'x-admin-password': password
},
body: JSON.stringify({ [key]: value })
});
if (res.ok) {
alert('✅ تم الحفظ بنجاح');
} else {
const err = await res.json();
alert('❌ فشل الحفظ: ' + (err.message || 'خطأ غير معروف'));
}
} catch (error) {
console.error(error);
alert('❌ خطأ في الاتصال بالخادم');
}
}
// ربط الدوال بالكائن window
window.checkAuth = checkAuth;
window.logout = logout;
window.addVideo = addVideo;
window.deleteVideo = deleteVideo;
window.updateWhatsApp = updateWhatsApp;
window.updateFacebook = updateFacebook;
window.updateInstagram = updateInstagram;
window.updateAppStore = updateAppStore;
window.updateGooglePlay = updateGooglePlay;
window.updateApk = updateApk;
window.updateTelegramChatIds = updateTelegramChatIds;