import { Search } from "lucide-react";
import type { ReactNode } from "react";
import {
FeedEmpty,
FeedError,
FeedLoading,
TweetSkeletonRows,
} from "./FeedState";
import { ConversationSurfaceScope } from "#/lib/conversation-surface";
import {
feedClass,
pageHeaderClass,
pageHeaderRowClass,
pageSubtitleClass,
pageTitleClass,
searchFieldIconClass,
searchFieldInputClass,
searchFieldShellClass,
} from "#/lib/ui";
export function TimelineFeedHeader({
title,
subtitles,
action,
controls,
}: {
title: string;
subtitles: ReactNode;
action?: ReactNode;
controls?: ReactNode;
}) {
return (
{title}
{subtitles}
{action}
{controls}
);
}
export function TimelineHeaderSubtitle({ children }: { children: ReactNode }) {
return
{children}
;
}
export function TimelineSearchField({
value,
onChange,
placeholder,
}: {
value: string;
onChange: (value: string) => void;
placeholder: string;
}) {
return (
);
}
export function TimelineFeedShell({
header,
notice,
loading,
loadingLabel,
loadingDetail,
error,
errorTitle,
onRetry,
empty,
emptyLabel,
emptyDetail,
children,
hasMore,
loadingMore,
onLoadMore,
}: {
header: ReactNode;
notice?: ReactNode;
loading: boolean;
loadingLabel: string;
loadingDetail: string;
error: string | null;
errorTitle: string;
onRetry: () => void;
empty: boolean;
emptyLabel: string;
emptyDetail: string;
children: ReactNode;
hasMore: boolean;
loadingMore: boolean;
onLoadMore: () => void;
}) {
return (
<>
{header}
{notice}
{loading ? (
) : error ? (
Retry
}
message={error}
title={errorTitle}
/>
) : empty ? (
) : null}
{children}
{!loading && !error && hasMore ? (
) : null}
>
);
}