fix: pre-launch UI hardening + KOL reduce-action type, proxy IP relay, settings redesign
Frontend half of the pre-launch audit campaign: - types/index.ts + kol/KolPageClient.tsx: add missing 'reduce' KolAction (backend emits it; frontend lacked the type + color/label maps → undefined styling). Adds ACTION_COLOR/actionLabel/postActionLabel entries. - proxy/[...path]/route.ts: relay real client IP (x-forwarded-for / x-real-ip) so the backend rate limiter buckets per-user instead of per-Next-server (BUG-02). - Settings/BotConfigPanel redesign, paper-mode clarity, copy cleanup. - Assorted page/display fixes, loading states, Pagination component. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -389,7 +389,12 @@ export default function BotConfigPanel() {
|
||||
<span style={{ fontSize: 11, color: subPaperChoice === 'paper' ? 'var(--ink-2)' : 'var(--ink-4)', fontWeight: subPaperChoice === 'paper' ? 600 : 400 }}>Paper</span>
|
||||
<Switch
|
||||
on={subPaperChoice === 'live'}
|
||||
onChange={v => setSubPaperChoice(v ? 'live' : 'paper')}
|
||||
onChange={v => {
|
||||
setSubPaperChoice(v ? 'live' : 'paper')
|
||||
// Clear any stale subscribe-error from a previous attempt so
|
||||
// the user sees a clean state for the new paper/live choice.
|
||||
if (subState === 'err') { setSubState('idle'); setSubErr('') }
|
||||
}}
|
||||
tone="amber"
|
||||
/>
|
||||
<span style={{ fontSize: 11, color: subPaperChoice === 'live' ? 'var(--amber-ink)' : 'var(--ink-4)', fontWeight: subPaperChoice === 'live' ? 600 : 400 }}>Live</span>
|
||||
@@ -492,7 +497,15 @@ export default function BotConfigPanel() {
|
||||
)}
|
||||
{/* Live mode: show key input */}
|
||||
{!paperMode && (hlApiKeySet && !apiKey ? (
|
||||
<button className="btn ghost" style={{ padding: '6px 14px', fontSize: 12, flexShrink: 0 }} onClick={() => setApiKey(' ')}>Rotate</button>
|
||||
<button
|
||||
className="btn ghost"
|
||||
style={{ padding: '6px 14px', fontSize: 12, flexShrink: 0 }}
|
||||
onClick={() => {
|
||||
// Switch to edit mode AND clear any stale error / status from
|
||||
// a previous failed save so the row isn't pre-stained red.
|
||||
setApiKey(' '); setKeyState('idle'); setKeyErr('')
|
||||
}}
|
||||
>Rotate</button>
|
||||
) : (
|
||||
<div style={{ display: 'flex', alignItems: 'center', gap: 8, flexWrap: 'wrap' }}>
|
||||
<input
|
||||
@@ -787,13 +800,13 @@ export default function BotConfigPanel() {
|
||||
<div style={{ display: 'flex', alignItems: 'center', gap: 10, flexWrap: 'wrap' }}>
|
||||
<div className="num-field">
|
||||
<span className="prefix">From</span>
|
||||
<input type="datetime-local" value={fromLocal}
|
||||
<input type="datetime-local" lang="en-US" value={fromLocal}
|
||||
onChange={e => { setFromLocal(e.target.value); setDirty(true) }} style={{ width: 190 }} />
|
||||
</div>
|
||||
<span style={{ fontSize: 12, color: 'var(--ink-4)' }}>→</span>
|
||||
<div className="num-field">
|
||||
<span className="prefix">Until</span>
|
||||
<input type="datetime-local" value={untilLocal}
|
||||
<input type="datetime-local" lang="en-US" value={untilLocal}
|
||||
onChange={e => { setUntilLocal(e.target.value); setDirty(true) }} style={{ width: 190 }} />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user