/** * Token Manager JavaScript * Handles token management functionality */ class TokenManager { constructor() { this.tokens = []; this.init(); } init() { this.loadTokens(); this.setupEventListeners(); this.setupTokenTypeHelp(); } setupEventListeners() { // Token form submission document.getElementById('token-form').addEventListener('submit', (e) => { e.preventDefault(); this.saveToken(); }); // Token validation document.getElementById('validate-token').addEventListener('click', () => { this.validateToken(); }); // Token type change document.getElementById('token-type').addEventListener('change', (e) => { this.updateTokenTypeHelp(e.target.value); }); // Task type change document.getElementById('task-type').addEventListener('change', (e) => { this.updateTaskHelp(e.target.value); }); // Get task token document.getElementById('get-task-token').addEventListener('click', () => { this.getTaskToken(); }); } setupTokenTypeHelp() { const tokenTypeHelp = { 'read': 'للتطوير والتعلم - قراءة فقط', 'write': 'لمشاركة النماذج - قراءة وكتابة', 'fine_grained': 'للمشاريع التجارية - أذونات مخصصة' }; this.tokenTypeHelp = tokenTypeHelp; this.updateTokenTypeHelp('read'); // Task type help const taskTypeHelp = { 'read': 'قراءة النماذج والبيانات العامة - يستخدم رمز القراءة', 'download': 'تحميل النماذج من Hugging Face - يستخدم رمز القراءة', 'medical': 'الوصول للبيانات الطبية الحساسة - يستخدم الرمز المخصص', 'private': 'الوصول للنماذج الخاصة والمحدودة - يستخدم الرمز المخصص', 'write': 'رفع النماذج الجديدة - يستخدم رمز الكتابة', 'upload': 'مشاركة المحتوى مع المجتمع - يستخدم رمز الكتابة', 'commercial': 'المشاريع التجارية والحساسة - يستخدم الرمز المخصص', 'enterprise': 'استخدام المؤسسات الكبيرة - يستخدم الرمز المخصص' }; this.taskTypeHelp = taskTypeHelp; this.updateTaskHelp('read'); } updateTokenTypeHelp(tokenType) { const helpElement = document.getElementById('token-type-help'); helpElement.textContent = this.tokenTypeHelp[tokenType] || ''; } updateTaskHelp(taskType) { const helpElement = document.getElementById('task-help'); helpElement.textContent = this.taskTypeHelp[taskType] || ''; } async getTaskToken() { const taskType = document.getElementById('task-type').value; const button = document.getElementById('get-task-token'); const resultDiv = document.getElementById('task-token-result'); const infoDiv = document.getElementById('selected-token-info'); // Show loading const originalText = button.innerHTML; button.innerHTML = 'جاري البحث...'; button.disabled = true; try { const response = await fetch(`/api/tokens/for-task/${taskType}`); const data = await response.json(); if (response.ok && data.token_info) { // Show token information infoDiv.innerHTML = `
نوع الرمز: ${data.token_info.type_name}
مستوى الأمان: ${data.token_info.security_level}
الاستخدام المناسب: ${data.token_info.recommended_for}
الرمز المحدد: ${data.token_info.token_name}
آخر استخدام: ${data.token_info.last_used || 'لم يُستخدم بعد'}
عدد مرات الاستخدام: ${data.token_info.usage_count || 0}
الوصف: ${data.token_info.description}
`; resultDiv.style.display = 'block'; // Store selected token for use this.selectedTaskToken = { taskType: taskType, tokenName: data.token_info.token_name, tokenType: data.token_info.type }; } else { this.showError(data.error || 'لم يتم العثور على رمز مناسب لهذه المهمة'); resultDiv.style.display = 'none'; } } catch (error) { console.error('Error getting task token:', error); this.showError('خطأ في الحصول على الرمز المناسب'); resultDiv.style.display = 'none'; } finally { button.innerHTML = originalText; button.disabled = false; } } async loadTokens() { try { const response = await fetch('/api/tokens'); const data = await response.json(); if (response.ok) { this.tokens = data.tokens; this.renderTokens(); } else { this.showError('فشل في تحميل الرموز'); } } catch (error) { console.error('Error loading tokens:', error); this.showError('خطأ في الاتصال بالخادم'); } } renderTokens() { const container = document.getElementById('tokens-list'); if (this.tokens.length === 0) { container.innerHTML = `
لا توجد رموز محفوظة

أضف رمز Hugging Face الأول للبدء

`; return; } const tokensHtml = this.tokens.map(token => this.renderTokenCard(token)).join(''); container.innerHTML = tokensHtml; } renderTokenCard(token) { const typeInfo = token.type_info || {}; const securityLevel = typeInfo.security_level || 'medium'; const securityClass = `security-${securityLevel.replace('_', '-')}`; const defaultBadge = token.is_default ? 'افتراضي' : ''; const activeBadge = token.is_active ? 'نشط' : 'غير نشط'; return `
${token.name} ${defaultBadge} ${activeBadge}
${typeInfo.name || token.type} ${this.getSecurityLevelText(securityLevel)}
${token.description ? `

${token.description}

` : ''} أُنشئ: ${this.formatDate(token.created_at)} ${token.last_used ? `| آخر استخدام: ${this.formatDate(token.last_used)}` : ''} | مرات الاستخدام: ${token.usage_count || 0}
${!token.is_default ? ` ` : ''}
الاستخدامات المناسبة: ${(typeInfo.use_cases || []).join('، ')}
`; } getSecurityLevelText(level) { const levels = { 'medium': 'متوسط', 'high': 'عالي', 'very_high': 'فائق' }; return levels[level] || level; } formatDate(dateString) { if (!dateString) return 'غير محدد'; const date = new Date(dateString); return date.toLocaleDateString('ar-SA', { year: 'numeric', month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit' }); } async saveToken() { const formData = new FormData(); formData.append('name', document.getElementById('token-name').value); formData.append('token', document.getElementById('token-value').value); formData.append('token_type', document.getElementById('token-type').value); formData.append('description', document.getElementById('token-description').value); formData.append('is_default', document.getElementById('is-default').checked); try { const response = await fetch('/api/tokens', { method: 'POST', body: formData }); const data = await response.json(); if (response.ok) { this.showSuccess(data.message); this.clearForm(); this.loadTokens(); } else { this.showError(data.detail || 'فشل في حفظ الرمز'); } } catch (error) { console.error('Error saving token:', error); this.showError('خطأ في الاتصال بالخادم'); } } async validateToken() { const tokenValue = document.getElementById('token-value').value; if (!tokenValue) { this.showError('يرجى إدخال قيمة الرمز أولاً'); return; } const button = document.getElementById('validate-token'); const originalText = button.innerHTML; button.innerHTML = 'جاري التحقق...'; button.disabled = true; try { const formData = new FormData(); formData.append('token', tokenValue); const response = await fetch('/api/tokens/validate', { method: 'POST', body: formData }); const data = await response.json(); if (data.valid) { this.showSuccess(`الرمز صحيح! المستخدم: ${data.username}, الخطة: ${data.plan}`); } else { this.showError(`الرمز غير صحيح: ${data.error}`); } } catch (error) { console.error('Error validating token:', error); this.showError('خطأ في التحقق من الرمز'); } finally { button.innerHTML = originalText; button.disabled = false; } } async setDefaultToken(tokenName) { try { const response = await fetch(`/api/tokens/${tokenName}/set-default`, { method: 'POST' }); const data = await response.json(); if (response.ok) { this.showSuccess(data.message); this.loadTokens(); } else { this.showError(data.detail || 'فشل في تعيين الرمز الافتراضي'); } } catch (error) { console.error('Error setting default token:', error); this.showError('خطأ في الاتصال بالخادم'); } } async deleteToken(tokenName) { if (!confirm(`هل أنت متأكد من حذف الرمز "${tokenName}"؟`)) { return; } try { const response = await fetch(`/api/tokens/${tokenName}`, { method: 'DELETE' }); const data = await response.json(); if (response.ok) { this.showSuccess(data.message); this.loadTokens(); } else { this.showError(data.detail || 'فشل في حذف الرمز'); } } catch (error) { console.error('Error deleting token:', error); this.showError('خطأ في الاتصال بالخادم'); } } clearForm() { document.getElementById('token-form').reset(); this.updateTokenTypeHelp('read'); } showSuccess(message) { document.getElementById('success-message').textContent = message; const toast = new bootstrap.Toast(document.getElementById('success-toast')); toast.show(); } showError(message) { document.getElementById('error-message').textContent = message; const toast = new bootstrap.Toast(document.getElementById('error-toast')); toast.show(); } } // Initialize token manager when page loads document.addEventListener('DOMContentLoaded', () => { window.tokenManager = new TokenManager(); });