import { useState } from 'react';
import { useSignalsFeed, type SignalType, type Horizon } from '../hooks/useSignalsFeed';
import SignalCard from '../components/signals/SignalCard';
import { useT } from '../i18n/LanguageContext';
const CATEGORIES = ['All', 'Sports', 'Politics', 'Crypto', 'Weather', 'Tech', 'Finance', 'Culture', 'Geopolitics', 'Elections'];
const TYPES: { key: SignalType | ''; labelKey: string }[] = [
{ key: '', labelKey: 'sig.fAll' },
{ key: 'WHALE', labelKey: 'sig.fWhale' },
{ key: 'LONGSHOT', labelKey: 'sig.fLongshot' },
{ key: 'MOMENTUM', labelKey: 'sig.fMomentum' },
{ key: 'SPIKE', labelKey: 'sig.fSpike' },
];
const STRENGTHS: { key: number; labelKey: string }[] = [
{ key: 0, labelKey: 'sig.sAny' },
{ key: 0.5, labelKey: 'sig.sStrong' },
{ key: 0.8, labelKey: 'sig.sVeryStrong' },
];
const HORIZONS: { key: Horizon; labelKey: string }[] = [
{ key: '', labelKey: 'sig.hAny' },
{ key: 'fast', labelKey: 'sig.hFast' },
{ key: 'mid', labelKey: 'sig.hMid' },
{ key: 'long', labelKey: 'sig.hLong' },
];
export default function SignalsFeed() {
const [category, setCategory] = useState('All');
const [type, setType] = useState<SignalType | ''>('');
const [minStrength, setMinStrength] = useState(0);
const [horizon, setHorizon] = useState<Horizon>('');
const { signals, loading } = useSignalsFeed({ limit: 40, category, type, minStrength, horizon });
const { t: tr } = useT();
const cycleStrength = () => {
const i = STRENGTHS.findIndex(s => s.key === minStrength);
setMinStrength(STRENGTHS[(i + 1) % STRENGTHS.length].key);
};
const strengthLabel = tr(STRENGTHS.find(s => s.key === minStrength)?.labelKey ?? STRENGTHS[0].labelKey);
const cycleHorizon = () => {
const i = HORIZONS.findIndex(h => h.key === horizon);
setHorizon(HORIZONS[(i + 1) % HORIZONS.length].key);
};
const horizonLabel = tr(HORIZONS.find(h => h.key === horizon)?.labelKey ?? HORIZONS[0].labelKey);
return (
<div className="signals-feed">
<h2 className="sig-title">{tr('sig.title')}</h2>
<p className="sig-desc">{tr('sig.desc')}</p>
<div className="sf-filters">
<div className="sf-chips">
{TYPES.map(t => (
<button
key={t.key || 'all'}
className={`pill ${type === t.key ? 'pill-active' : ''}`}
onClick={() => setType(t.key)}
>
{tr(t.labelKey)}
</button>
))}
<button
className={`pill ${minStrength > 0 ? 'pill-active' : ''}`}
onClick={cycleStrength}
title={tr('sig.titleStrength')}
>
💪 {strengthLabel}
</button>
<button
className={`pill ${horizon ? 'pill-active' : ''}`}
onClick={cycleHorizon}
title={tr('sig.titleHorizon')}
>
⏱ {horizonLabel}
</button>
</div>
<div className="category-pills">
{CATEGORIES.map(cat => (
<button
key={cat}
className={`pill ${category === cat ? 'pill-active' : ''}`}
onClick={() => setCategory(cat)}
>
{cat}
</button>
))}
</div>
</div>
{loading && signals.length === 0 ? (
<div className="sf-grid">
{Array.from({ length: 6 }).map((_, i) => (
<div key={i} className="sf-skeleton" />
))}
</div>
) : signals.length === 0 ? (
<div className="sf-empty">
<div className="sf-empty-icon">🔍</div>
<div className="sf-empty-title">{tr('sig.emptyTitle')}</div>
<div className="sf-empty-sub">
{tr('sig.emptySub')}
</div>
</div>
) : (
<div className="sf-grid">
{signals.map(s => (
<SignalCard key={`${s.type}-${s.marketId}`} signal={s} />
))}
</div>
)}
</div>
);
}
📜 Git History
6c47fa4chore: local Polikopi project home + Phase 1 redesign artifacts12 days ago
Show last diff
Loading...