// PostList โ€” rows within the Feed middle column. Clicking a row sets // the selected post in the store; the detail pane reacts. import React from 'react'; import { useStore } from '@/lib/store'; import type { FeedPostItem } from '@/lib/feed'; import { shortAddr } from '@/lib/crypto'; interface Props { posts: FeedPostItem[]; activeID: string | null; } export function PostList({ posts, activeID }: Props): React.ReactElement { const select = useStore(s => s.setFeedSelectedPost); return (
{posts.map(p => ( select(p.post_id)} /> ))}
); } function PostRow({ post, active, onClick }: { post: FeedPostItem; active: boolean; onClick: () => void; }) { const author = shortAddr(post.author, 6); return (
{ if (!active) (e.currentTarget as HTMLDivElement).style.background = '#0a0a0a'; }} onMouseLeave={e => { if (!active) (e.currentTarget as HTMLDivElement).style.background = 'transparent'; }} >
{author} ยท {formatRelative(post.created_at)}
{post.content}
{post.has_attachment && (
๐Ÿ–ผ attachment
)}
โค {post.likes} ๐Ÿ‘ {post.views} {post.hashtags && post.hashtags.length > 0 && ( {post.hashtags.slice(0, 3).map(t => `#${t}`).join(' ')} )}
); } function formatRelative(unixSec: number): string { const diff = Math.floor(Date.now() / 1000) - unixSec; if (diff < 60) return `${diff}s`; if (diff < 3600) return `${Math.floor(diff / 60)}m`; if (diff < 86400) return `${Math.floor(diff / 3600)}h`; if (diff < 604800) return `${Math.floor(diff / 86400)}d`; const d = new Date(unixSec * 1000); return d.toLocaleDateString([], { month: 'short', day: 'numeric' }); }