import { useEffect, useMemo, useState } from 'react'; import type { BackupPool } from '../types'; import { RVN_POOL_PRESETS, DEFAULT_RVN_PRESET_IDS, orderedRVNPoolsFromSelection, detectRVNPresetIds, applyRVNPoolsToForgeFields, type RVNPoolForgeFields, } from '../help/poolPresets'; import './PoolPresetPicker.css'; interface RVNPoolPresetPickerProps { host: string; port: number; tls: boolean; pass: string; backups?: BackupPool[]; onChange: (next: RVNPoolForgeFields) => void; } export default function RVNPoolPresetPicker({ host, port, tls, pass, backups = [], onChange, }: RVNPoolPresetPickerProps) { const [selectedIds, setSelectedIds] = useState(() => { const detected = detectRVNPresetIds(host, port, tls, backups); return detected.length ? detected : [...DEFAULT_RVN_PRESET_IDS]; }); const [useCustom, setUseCustom] = useState(false); const [customHost, setCustomHost] = useState(''); const [customPort, setCustomPort] = useState(6060); const [customTls, setCustomTls] = useState(false); useEffect(() => { const detected = detectRVNPresetIds(host, port, tls, backups); if (detected.length) setSelectedIds(detected); }, [host, port, tls, backups]); const orderedPreview = useMemo(() => { const custom: BackupPool | null = useCustom && customHost.trim() ? { host: customHost.trim(), port: customPort || 6060, tls: customTls, pass: pass || 'x' } : null; return orderedRVNPoolsFromSelection(selectedIds, pass || 'x', custom); }, [selectedIds, pass, useCustom, customHost, customPort, customTls]); const applySelection = (ids: string[], customOn: boolean, cHost: string, cPort: number, cTls: boolean) => { const custom: BackupPool | null = customOn && cHost.trim() ? { host: cHost.trim(), port: cPort || 6060, tls: cTls, pass: pass || 'x' } : null; const pools = orderedRVNPoolsFromSelection(ids, pass || 'x', custom); onChange(applyRVNPoolsToForgeFields(pools)); }; const togglePreset = (id: string) => { const next = selectedIds.includes(id) ? selectedIds.filter((x) => x !== id) : [...selectedIds, id]; if (!next.length) return; setSelectedIds(next); applySelection(next, useCustom, customHost, customPort, customTls); }; const grouped = useMemo(() => { const map = new Map(); for (const p of RVN_POOL_PRESETS) { const list = map.get(p.provider) ?? []; list.push(p); map.set(p.provider, list); } return [...map.entries()]; }, []); return (

Select one or more Ravencoin (KawPoW) pools. Failover order applies — primary is tried first.

{grouped.map(([provider, presets]) => (
{provider} {presets.map((p) => ( ))}
))}
{useCustom && (
{ setCustomHost(e.target.value); applySelection(selectedIds, true, e.target.value, customPort, customTls); }} /> { const v = e.target.valueAsNumber || 6060; setCustomPort(v); applySelection(selectedIds, true, customHost, v, customTls); }} />
)}
{orderedPreview.length > 0 && (
Failover order
    {orderedPreview.map((p, i) => (
  1. {i === 0 ? 'Primary' : `Backup ${i}`}: {p.host}:{p.port} {p.tls ? ' (TLS)' : ''}
  2. ))}
)}
); }