import { useSpaceJoin } from '../../hooks/useSpaceJoin'; import { getSpaceGradient } from '../../utils/gradients'; import type { TaggedExploreSpace } from '../../stores/exploreStore'; export function ExploreSpacePreviewCard({ space, onJoinSuccess, }: { space: TaggedExploreSpace; onJoinSuccess: (spaceId: string) => void; }) { const { isPublic, isPending, joining, joinError, showRequestForm, requestMessage, setRequestMessage, openRequestForm, cancelRequestForm, join, sendRequest, } = useSpaceJoin(space); const fallbackGradient = getSpaceGradient(space.id, space.name, space.avatarColor).gradient; const iconUrl = space.icon ? (space.icon.startsWith('http') || space.icon.startsWith('/') ? space.icon : `/api/uploads/${space.icon}`) : null; const originLabel = space._instanceOrigin ? (() => { try { return new URL(space._instanceOrigin).host; } catch { return space._instanceOrigin; } })() : null; const handleJoin = async () => { const full = await join(); if (full) onJoinSuccess(full.id); }; return (
{/* Icon */} {iconUrl ? ( {space.name} ) : (
{space.name.charAt(0).toUpperCase()}
)} {/* Name + meta */}
{space.name}
{space.memberCount} {space.memberCount === 1 ? 'member' : 'members'} {originLabel && · {originLabel}}
{/* Action */}
{isPublic ? ( ) : isPending ? ( Pending ) : ( )}
{/* Inline request form */} {showRequestForm && (