experiments in a post-browser web
10
fork

Configure Feed

Select the types of activity you want to include in your feed.

feat(extension): show config values without args, add sync command

+91 -8
+22 -1
backend/extension/background.js
··· 6 6 7 7 import { openDatabase } from './datastore.js'; 8 8 import { ensureDefaultProfile, getCurrentProfile, getSyncConfig, updateProfileEnvironment, enableSync } from './profiles.js'; 9 - import { setConfig as setEngineConfig } from './engine.js'; 9 + import { getConfig as getEngineConfig, setConfig as setEngineConfig } from './engine.js'; 10 10 import { syncAll, getSyncConfig as getFullSyncConfig, getSyncStatus } from './sync.js'; 11 11 import { DATASTORE_VERSION, PROTOCOL_VERSION } from './version.js'; 12 12 import { getEnvironment } from './environment.js'; ··· 162 162 163 163 if (message.type === 'set-api-key') { 164 164 handleSetApiKey(message.data).then(sendResponse); 165 + return true; 166 + } 167 + 168 + if (message.type === 'get-sync-config') { 169 + handleGetSyncConfig().then(sendResponse); 165 170 return true; 166 171 } 167 172 }); ··· 428 433 return { success: false, error: error.message }; 429 434 } 430 435 } 436 + 437 + async function handleGetSyncConfig() { 438 + try { 439 + const config = await getEngineConfig(); 440 + return { 441 + success: true, 442 + data: { 443 + serverUrl: config.serverUrl || null, 444 + apiKey: config.apiKey || null, 445 + } 446 + }; 447 + } catch (error) { 448 + console.error('[peek:bg] Get sync config error:', error); 449 + return { success: false, error: error.message }; 450 + } 451 + }
+1 -1
backend/extension/popup.html
··· 202 202 <div class="command-row"> 203 203 <div class="command-display" id="command-display"> 204 204 <input id="command-input" type="text" autofocus spellcheck="false" /> 205 - <div id="command-text" class="placeholder">tag, note, search, server, key...</div> 205 + <div id="command-text" class="placeholder">tag, note, server, key, sync...</div> 206 206 </div> 207 207 <div class="feedback" id="feedback"> 208 208 <span class="feedback-icon" id="feedback-icon"></span>
+68 -6
backend/extension/popup.js
··· 4 4 * Shows success/error feedback before closing 5 5 */ 6 6 7 - const COMMANDS = ['tag', 'note', 'search', 'server', 'key']; 7 + const COMMANDS = ['tag', 'note', 'search', 'server', 'key', 'sync']; 8 8 9 9 let state = { 10 10 typed: '', ··· 75 75 76 76 if (!state.typed) { 77 77 commandText.classList.add('placeholder'); 78 - commandText.textContent = 'tag, note, search, server, key...'; 78 + commandText.textContent = 'tag, note, server, key, sync...'; 79 79 return; 80 80 } 81 81 ··· 113 113 saveNote(args); 114 114 } else if (cmd === 'search' && args) { 115 115 performSearch(args); 116 - } else if (cmd === 'server' && args) { 117 - setServer(args); 118 - } else if (cmd === 'key' && args) { 119 - setApiKey(args); 116 + } else if (cmd === 'server') { 117 + if (args) { 118 + setServer(args); 119 + } else { 120 + showServer(); 121 + } 122 + } else if (cmd === 'key') { 123 + if (args) { 124 + setApiKey(args); 125 + } else { 126 + showApiKey(); 127 + } 128 + } else if (cmd === 'sync') { 129 + runSync(); 120 130 } else if (state.match && !args) { 121 131 commandInput.value = state.match + ' '; 122 132 state.typed = commandInput.value; ··· 230 240 } catch (err) { 231 241 console.error('Failed to set API key:', err); 232 242 showFeedback('error', 'Failed to set API key'); 243 + } 244 + } 245 + 246 + async function showServer() { 247 + try { 248 + const response = await chrome.runtime.sendMessage({ type: 'get-sync-config' }); 249 + if (response?.success && response.data?.serverUrl) { 250 + showFeedback('success', response.data.serverUrl); 251 + } else { 252 + showFeedback('error', 'Not set'); 253 + } 254 + } catch (err) { 255 + showFeedback('error', 'Failed to get server'); 256 + } 257 + } 258 + 259 + async function showApiKey() { 260 + try { 261 + const response = await chrome.runtime.sendMessage({ type: 'get-sync-config' }); 262 + if (response?.success && response.data?.apiKey) { 263 + // Mask the key, showing only last 4 chars 264 + const key = response.data.apiKey; 265 + const masked = key.length > 4 266 + ? '•'.repeat(key.length - 4) + key.slice(-4) 267 + : '•'.repeat(key.length); 268 + showFeedback('success', masked); 269 + } else { 270 + showFeedback('error', 'Not set'); 271 + } 272 + } catch (err) { 273 + showFeedback('error', 'Failed to get key'); 274 + } 275 + } 276 + 277 + async function runSync() { 278 + showFeedback('success', 'Syncing...'); 279 + 280 + try { 281 + const response = await chrome.runtime.sendMessage({ type: 'sync-now' }); 282 + 283 + if (response?.success) { 284 + const data = response.data || {}; 285 + const pulled = data.pulled || 0; 286 + const pushed = data.pushed || 0; 287 + showFeedback('success', `Synced: ↓${pulled} ↑${pushed}`); 288 + setTimeout(() => window.close(), 1200); 289 + } else { 290 + showFeedback('error', response?.error || 'Sync failed'); 291 + } 292 + } catch (err) { 293 + console.error('Sync failed:', err); 294 + showFeedback('error', 'Sync failed'); 233 295 } 234 296 } 235 297