From cce7c511d0fedc67c1021e13b0dc33837cae73f5 Mon Sep 17 00:00:00 2001 From: michaelschal <35957947-michaelschal@users.noreply.replit.com> Date: Thu, 2 Oct 2025 16:45:44 +0000 Subject: [PATCH] Enable users to edit and delete their managed social media pages Adds PUT and DELETE API endpoints for social pages, along with UI elements for editing and deleting pages on the client-side. Replit-Commit-Author: Agent Replit-Commit-Session-Id: ae4037a0-2a6f-4530-9bac-79b543286bda Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/397bca8c-984f-43ff-841a-10897aeb8140/ae4037a0-2a6f-4530-9bac-79b543286bda/Ob3gzfQ --- .replit | 6 +- client/src/pages/pages.tsx | 131 ++++++++++++++++++++++++++++++++++--- server/routes.ts | 39 +++++++++++ 3 files changed, 161 insertions(+), 15 deletions(-) diff --git a/.replit b/.replit index b6bf8b4..0556bf9 100644 --- a/.replit +++ b/.replit @@ -15,13 +15,9 @@ localPort = 5000 externalPort = 80 [[ports]] -localPort = 5555 +localPort = 35981 externalPort = 3002 -[[ports]] -localPort = 40011 -externalPort = 3003 - [[ports]] localPort = 40537 externalPort = 3000 diff --git a/client/src/pages/pages.tsx b/client/src/pages/pages.tsx index 308d5c7..0f5c2b8 100644 --- a/client/src/pages/pages.tsx +++ b/client/src/pages/pages.tsx @@ -1,6 +1,6 @@ import { useState } from "react"; import { useQuery, useMutation } from "@tanstack/react-query"; -import { Plus, Facebook, Instagram, Trash2, RefreshCw } from "lucide-react"; +import { Plus, Facebook, Instagram, Trash2, RefreshCw, Edit } from "lucide-react"; import Sidebar from "@/components/sidebar"; import TopBar from "@/components/topbar"; import { Button } from "@/components/ui/button"; @@ -16,6 +16,7 @@ import type { SocialPage } from "@shared/schema"; export default function PagesManagement() { const [sidebarOpen, setSidebarOpen] = useState(false); const [dialogOpen, setDialogOpen] = useState(false); + const [editingPage, setEditingPage] = useState(null); const { toast } = useToast(); const { data: pages = [], isLoading } = useQuery({ @@ -69,6 +70,7 @@ export default function PagesManagement() {

+ !open && setEditingPage(null)} /> {isLoading ? ( @@ -125,15 +127,25 @@ export default function PagesManagement() {
ID: {page.pageId}
- +
+ + +
@@ -293,3 +305,102 @@ function AddPageDialog({ open, onOpenChange }: { open: boolean; onOpenChange: (o ); } + +function EditPageDialog({ page, onOpenChange }: { page: SocialPage | null; onOpenChange: (open: boolean) => void }) { + const [accessToken, setAccessToken] = useState(''); + const { toast } = useToast(); + + const editMutation = useMutation({ + mutationFn: (data: any) => + apiRequest('PUT', `/api/pages/${page?.id}`, data), + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: ['/api/pages'] }); + toast({ + title: "Page modifiée", + description: "Le jeton d'accès a été mis à jour avec succès", + }); + onOpenChange(false); + setAccessToken(''); + }, + onError: () => { + toast({ + title: "Erreur", + description: "Impossible de modifier la page", + variant: "destructive", + }); + }, + }); + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + if (!page) return; + editMutation.mutate({ + accessToken, + }); + }; + + if (!page) return null; + + return ( + + + + Modifier le jeton d'accès + + Mettez à jour le jeton d'accès pour {page.pageName} + + +
+
+ + setAccessToken(e.target.value)} + placeholder="EAAxxxxxxxxxxxxx" + required + data-testid="input-edit-access-token" + /> +

+ Obtenez un nouveau jeton depuis{' '} + + Facebook Graph API Explorer + +

+
+ +
+ + +
+
+
+
+ ); +} diff --git a/server/routes.ts b/server/routes.ts index 969dec8..22afc99 100644 --- a/server/routes.ts +++ b/server/routes.ts @@ -541,6 +541,45 @@ export async function registerRoutes(app: Express): Promise { } }); + app.put("/api/pages/:id", requireAuth, async (req, res) => { + try { + const user = req.user as User; + const userId = user.id; + const pageId = req.params.id; + + const existingPage = await storage.getSocialPage(pageId); + if (!existingPage || existingPage.userId !== userId) { + return res.status(404).json({ error: "Page non trouvée" }); + } + + const pageData = insertSocialPageSchema.partial().parse(req.body); + const updatedPage = await storage.updateSocialPage(pageId, pageData); + res.json(updatedPage); + } catch (error) { + console.error("Error updating page:", error); + res.status(500).json({ error: "Failed to update page" }); + } + }); + + app.delete("/api/pages/:id", requireAuth, async (req, res) => { + try { + const user = req.user as User; + const userId = user.id; + const pageId = req.params.id; + + const existingPage = await storage.getSocialPage(pageId); + if (!existingPage || existingPage.userId !== userId) { + return res.status(404).json({ error: "Page non trouvée" }); + } + + await storage.deleteSocialPage(pageId); + res.json({ success: true }); + } catch (error) { + console.error("Error deleting page:", error); + res.status(500).json({ error: "Failed to delete page" }); + } + }); + // AI Generations app.get("/api/ai/generations", requireAuth, async (req, res) => { try {