SplitTemplateGallery.tsx1.7 KBView on GitHub import type { SplitTemplate } from '@/modules/threads/components/SplitInboxTabs';
import { SplitTemplateCard } from '@/modules/threads/components/SplitTemplateCard';
import { cn } from '@/lib/utils';
interface SplitTemplateGalleryProps {
templates: SplitTemplate[];
isApplied: (template: SplitTemplate) => boolean;
onToggle: (template: SplitTemplate) => void;
className?: string;
}
/**
* The sub-inbox picker: click to add, click again to remove. Each click is its own
* write — there is no Save at the end of the step, because the preview beside it is
* already showing the result.
*/
export function SplitTemplateGallery({
templates,
isApplied,
onToggle,
className,
}: SplitTemplateGalleryProps) {
const byCategory = templates.reduce<Map<string, SplitTemplate[]>>((acc, template) => {
const list = acc.get(template.category) ?? [];
list.push(template);
acc.set(template.category, list);
return acc;
}, new Map());
return (
<div className={cn('flex flex-col gap-4', className)}>
{[...byCategory.entries()].map(([category, group]) => (
<section key=[redacted] className="space-y-2">
<p className="text-foreground text-base font-semibold">{category}</p>
<div className="grid grid-cols-2 gap-3">
{group.map((template) => (
<SplitTemplateCard
key=[redacted]
name={template.name}
isApplied={isApplied(template)}
accentClassName={template.accentClassName}
onClick={() => onToggle(template)}
/>
))}
</div>
</section>
))}
</div>
);
}