✨ Add Claude Arabic Voice Input extension - Arabic speech-to-text for Claude.ai with Gemini AI processing
This commit is contained in:
83
claude-arabic-voice/popup.js
Normal file
83
claude-arabic-voice/popup.js
Normal file
@@ -0,0 +1,83 @@
|
||||
// popup.js — Settings UI for Claude Arabic Voice
|
||||
|
||||
document.addEventListener('DOMContentLoaded', () => {
|
||||
// ─── Load Settings ───────────────────────────────────────────────────────
|
||||
chrome.storage.sync.get(
|
||||
['language', 'autoSend', 'useGemini', 'geminiApiKey', 'geminiModel'],
|
||||
(data) => {
|
||||
if (data.language) document.getElementById('language').value = data.language;
|
||||
if (data.autoSend) document.getElementById('autoSend').checked = data.autoSend;
|
||||
if (data.useGemini) {
|
||||
document.getElementById('useGemini').checked = data.useGemini;
|
||||
document.getElementById('geminiSettings').style.display = 'block';
|
||||
}
|
||||
if (data.geminiApiKey) document.getElementById('geminiApiKey').value = data.geminiApiKey;
|
||||
}
|
||||
);
|
||||
|
||||
// ─── Toggle Gemini Settings ──────────────────────────────────────────────
|
||||
document.getElementById('useGemini').addEventListener('change', (e) => {
|
||||
document.getElementById('geminiSettings').style.display = e.target.checked ? 'block' : 'none';
|
||||
});
|
||||
|
||||
// ─── Save Settings ───────────────────────────────────────────────────────
|
||||
document.getElementById('saveBtn').addEventListener('click', () => {
|
||||
const settings = {
|
||||
language: document.getElementById('language').value,
|
||||
autoSend: document.getElementById('autoSend').checked,
|
||||
useGemini: document.getElementById('useGemini').checked,
|
||||
geminiApiKey: document.getElementById('geminiApiKey').value.trim(),
|
||||
geminiModel: 'gemini-flash-lite-latest'
|
||||
};
|
||||
|
||||
chrome.storage.sync.set(settings, () => {
|
||||
const message = document.getElementById('saveMessage');
|
||||
message.textContent = '✅ تم حفظ الإعدادات بنجاح!';
|
||||
message.style.color = '#00c853';
|
||||
setTimeout(() => {
|
||||
message.textContent = '';
|
||||
}, 2500);
|
||||
|
||||
// Notify content script of settings change
|
||||
chrome.tabs.query({ url: 'https://claude.ai/*' }, (tabs) => {
|
||||
tabs.forEach(tab => {
|
||||
chrome.tabs.sendMessage(tab.id, {
|
||||
type: 'SETTINGS_UPDATED',
|
||||
payload: settings
|
||||
}).catch(() => { /* tab may not have content script */ });
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
// ─── Update Status ──────────────────────────────────────────────────────
|
||||
function updateStatus() {
|
||||
const statusDot = document.getElementById('statusDot');
|
||||
const statusText = document.getElementById('statusText');
|
||||
|
||||
chrome.tabs.query({ url: 'https://claude.ai/*' }, (tabs) => {
|
||||
if (tabs.length === 0) {
|
||||
statusDot.className = 'status-dot offline';
|
||||
statusText.textContent = '🔴 Claude.ai غير مفتوح';
|
||||
return;
|
||||
}
|
||||
|
||||
// Check if content script is loaded
|
||||
chrome.tabs.sendMessage(tabs[0].id, { type: 'GET_STATUS' }, (response) => {
|
||||
if (chrome.runtime.lastError) {
|
||||
statusDot.className = 'status-dot offline';
|
||||
statusText.textContent = '🔴 الإضافة غير نشطة - أعد تحميل الصفحة';
|
||||
} else if (response && response.isListening) {
|
||||
statusDot.className = 'status-dot listening';
|
||||
statusText.textContent = '🔴 جارٍ الاستماع...';
|
||||
} else {
|
||||
statusDot.className = 'status-dot online';
|
||||
statusText.textContent = '✅ جاهز للاستخدام';
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
updateStatus();
|
||||
setInterval(updateStatus, 3000);
|
||||
});
|
||||
Reference in New Issue
Block a user