Scrapboard.org client
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}