diff --git a/attached_assets/스크린샷 2025-09-30 오전 11.18.50_1759198810776.png b/attached_assets/스크린샷 2025-09-30 오전 11.18.50_1759198810776.png new file mode 100644 index 0000000..fdfce14 Binary files /dev/null and b/attached_assets/스크린샷 2025-09-30 오전 11.18.50_1759198810776.png differ diff --git a/client/src/pages/MediaOutlet.tsx b/client/src/pages/MediaOutlet.tsx index db83509..fe8a9e6 100644 --- a/client/src/pages/MediaOutlet.tsx +++ b/client/src/pages/MediaOutlet.tsx @@ -1,14 +1,16 @@ import { useState } from "react"; -import { useQuery } from "@tanstack/react-query"; +import { useQuery, useMutation } from "@tanstack/react-query"; import { useRoute, useLocation } from "wouter"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Card, CardContent } from "@/components/ui/card"; import { Badge } from "@/components/ui/badge"; -import { Gavel, Clock, TrendingUp, Search, Settings, User, LogOut, Grid, List } from "lucide-react"; +import { Textarea } from "@/components/ui/textarea"; +import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription } from "@/components/ui/dialog"; +import { Gavel, Clock, TrendingUp, Search, Settings, User, LogOut, Grid, List, Edit } from "lucide-react"; import { useAuth } from "@/hooks/useAuth"; import { useToast } from "@/hooks/use-toast"; -import { queryClient } from "@/lib/queryClient"; +import { queryClient, apiRequest } from "@/lib/queryClient"; import ArticleCard from "@/components/ArticleCard"; import Footer from "@/components/Footer"; import LoginModal from "@/components/LoginModal"; @@ -21,6 +23,9 @@ export default function MediaOutlet() { const [viewMode, setViewMode] = useState<"grid" | "list">("grid"); const [isLoginModalOpen, setIsLoginModalOpen] = useState(false); const [isSearchModalOpen, setIsSearchModalOpen] = useState(false); + const [isEditDescModalOpen, setIsEditDescModalOpen] = useState(false); + const [newDescription, setNewDescription] = useState(""); + const [alternativeDescription, setAlternativeDescription] = useState("Partner at Type3 Capital and Non-Executive Director at TrueFi DAO with a strong background in fund management, venture capital, and digital assets"); const { user, isAuthenticated } = useAuth(); const { toast } = useToast(); @@ -67,6 +72,37 @@ export default function MediaOutlet() { setLocation("/admin"); }; + const updateDescriptionMutation = useMutation({ + mutationFn: async (description: string) => { + await apiRequest("PATCH", `/api/media-outlets/${params?.slug}`, { description }); + }, + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: ["/api/media-outlets", params?.slug] }); + toast({ + title: "Success", + description: "Description updated successfully", + }); + setIsEditDescModalOpen(false); + }, + onError: () => { + toast({ + title: "Error", + description: "Failed to update description", + variant: "destructive", + }); + }, + }); + + const handleEditDescription = () => { + setNewDescription(outlet?.description || ""); + setIsEditDescModalOpen(true); + }; + + const handleSaveDescription = (useAlternative: boolean = false) => { + const descToSave = useAlternative ? alternativeDescription : newDescription; + updateDescriptionMutation.mutate(descToSave); + }; + const formatCurrency = (amount: string | null) => { if (!amount) return "$0"; return new Intl.NumberFormat('en-US', { @@ -327,7 +363,19 @@ export default function MediaOutlet() { {outlet.category} -
{outlet.description}
+{outlet.description}
+ {user && (user.role === 'admin' || user.role === 'superadmin') && ( + + )} +