import { h } from 'preact'; import { useState, useEffect } from 'preact/hooks'; import htm from 'htm'; import { api } from '../api.js'; const html = htm.bind(h); const LS_KEY = 'aftertouch_service_url'; export function PlayURL({ devices, serverServiceUrl }) { const [url, setUrl] = useState(''); const [name, setName] = useState(''); const [serviceUrl, setServiceUrl] = useState(() => localStorage.getItem(LS_KEY) || ''); const [pendingPlay, setPendingPlay] = useState(null); const [status, setStatus] = useState(null); useEffect(() => { if (serverServiceUrl && !localStorage.getItem(LS_KEY)) { setServiceUrl(serverServiceUrl); } }, [serverServiceUrl]); function onServiceUrlChange(val) { setServiceUrl(val); if (val) { localStorage.setItem(LS_KEY, val); } else { localStorage.removeItem(LS_KEY); } } function startPlay() { const trimmedUrl = url.trim(); if (!trimmedUrl) return; setStatus(null); setPendingPlay({ url: trimmedUrl, name: name.trim() || trimmedUrl }); } async function playOn(deviceId) { const item = pendingPlay; setPendingPlay(null); setStatus('Playing…'); try { // When configured server-side, that value wins; send it so a stale // localStorage override never matters. const effectiveServiceUrl = serverServiceUrl || serviceUrl.trim(); const resp = await api.playURL(deviceId, item.url, item.name, '', effectiveServiceUrl); setStatus(resp.success ? 'Playing — use ★ on the device page to save as preset' : 'Error: ' + (resp.error || 'Unknown error')); } catch (e) { setStatus('Error: ' + e.message); } } const deviceEntries = Object.entries(devices); return html`