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 {