Checkpoint: Implémentation du résumé automatique généré par l'IA pour chaque article RSS (veille et AAP), marquage lu/non lu avec point bleu et fond teinté, bouton "Tout marquer comme lu", compteurs non lus dans la sidebar et dans les titres de page. Migration BDD : table article_reads + colonne iaResume dans veille_items et aap_items.

This commit is contained in:
Manus
2026-06-16 03:08:29 -04:00
parent c47c76215e
commit 67dfbb1a13
12 changed files with 1324 additions and 35 deletions

View File

@@ -89,6 +89,12 @@ export function AppLayout({ children, user, onLogout }: AppLayoutProps) {
const isAdmin = user?.role === "admin";
// Compteurs non lus
const veilleUnreadQuery = trpc.veille.unreadCount.useQuery();
const aapUnreadQuery = trpc.aap.unreadCount.useQuery();
const veilleUnread = veilleUnreadQuery.data?.count ?? 0;
const aapUnread = aapUnreadQuery.data?.count ?? 0;
const importMutation = trpc.import.run.useMutation({
onSuccess: (data) => {
const v = "veille" in data ? data.veille : null;
@@ -174,6 +180,16 @@ export function AppLayout({ children, user, onLogout }: AppLayoutProps) {
{item.badge}
</Badge>
)}
{!collapsed && item.href === "/veille" && veilleUnread > 0 && (
<span className="ml-auto inline-flex items-center justify-center min-w-[18px] h-[18px] px-1 rounded-full bg-primary text-primary-foreground text-[10px] font-bold">
{veilleUnread}
</span>
)}
{!collapsed && item.href === "/aap" && aapUnread > 0 && (
<span className="ml-auto inline-flex items-center justify-center min-w-[18px] h-[18px] px-1 rounded-full bg-primary text-primary-foreground text-[10px] font-bold">
{aapUnread}
</span>
)}
</div>
</Link>
);