Scrapboard.org client
at main 48 lines 1.6 kB view raw
1"use client"; 2 3import { useState, useEffect } from "react"; 4import { AlertTriangle, Eye } from "lucide-react"; 5import { Button } from "@/components/ui/button"; 6import { Card } from "@/components/ui/card"; 7import { PostView } from "@atproto/api/dist/client/types/app/bsky/feed/defs"; 8import { type ModerationOpts } from "@atproto/api/dist/moderation/types"; 9import { useModerationStore } from "@/lib/stores/moderation"; 10import { useAuth } from "@/lib/hooks/useAuth"; 11import { ModerationDecision } from "@atproto/api"; 12 13interface ContentWarningProps { 14 mod: ModerationDecision; 15 children: React.ReactNode; 16 className?: string; 17} 18 19export function ContentWarning({ 20 mod, 21 children, 22 className, 23}: ContentWarningProps) { 24 const modUi = mod.ui("contentMedia"); 25 26 if (modUi.filter) return; 27 28 if (modUi.blur) { 29 return ( 30 <div className={className}> 31 <div className="relative overflow-hidden rounded-2xl"> 32 <div className="blur-3xl">{children}</div> 33 <div className="absolute inset-0 flex items-center justify-center"></div> 34 <div className="absolute inset-0 flex items-center justify-center bg-black/50 backdrop-blur-sm"> 35 <div className="space-y-3 text-center"> 36 <div className="flex items-center justify-center gap-3"> 37 <AlertTriangle className="h-5 w-5 text-orange-500 flex-shrink-0" /> 38 <h4 className="font-medium text-orange-100">Content Warning</h4> 39 </div> 40 </div> 41 </div> 42 </div> 43 </div> 44 ); 45 } 46 47 return <div className={className}>{children}</div>; 48}