Magento 2 Experten — Hyvä Theme, Tailwind CSS & SEO aus einer Hand ›

Ein Projekt löschen

Ein Projekt löschen

~12 Min. Lesezeit Zuletzt aktualisiert am 8. August 2026

Löschen ist UNWIDERRUFLICH (Kapitel 44: cascade: ['remove'] löscht AUCH alle Tasks MIT) – ein Bestätigungsdialog ist HIER BESONDERS wichtig.

Den Delete-Hook schreiben

src/hooks/useDeleteProject.ts
import { useMutation, useQueryClient } from '@tanstack/react-query';
import { apiClient } from '../api/client';

export function useDeleteProject() {
  const queryClient = useQueryClient();

  return useMutation({
    mutationFn: async (id: number) => {
      await apiClient.delete(`/projects/${id}`);
    },
    onSuccess: () => {
      queryClient.invalidateQueries({ queryKey: ['projects'] });
    },
  });
}

GENAU wie Kapitel 10 zeigte: DELETE liefert 204 No Content, KEIN Response-Body – mutationFn gibt entsprechend NICHTS zurück (Promise<void>).

Ein Bestätigungsdialog

function DeleteProjectButton({ projectId }: { projectId: number }) {
  const deleteProject = useDeleteProject();

  function handleClick() {
    const confirmed = window.confirm(
      'Dieses Projekt WIRKLICH löschen? Alle zugehörigen Tasks werden ebenfalls gelöscht.',
    );

    if (confirmed) {
      deleteProject.mutate(projectId);
    }
  }

  return (
    <button onClick={handleClick} disabled={deleteProject.isPending}>
      Löschen
    </button>
  );
}

Achtung: window.confirm ist die EINFACHSTE Lösung, aber blockiert den GESAMTEN Browser-Tab und lässt sich NICHT stylen – für ein PRODUKTIONSREIFES UI wäre eine EIGENE Modal-Komponente die BESSERE Wahl. Für UNSER Lernprojekt reicht der native Dialog VÖLLIG aus.

403 korrekt behandeln

Der Voter aus Kapitel 52-53 kann eine LÖSCHUNG mit 403 ABLEHNEN (z. B. wenn NICHT der Owner löscht) – der GLOBALE 401-Interceptor aus Kapitel 77 greift HIER NICHT (403 ist KEIN Authentifizierungsfehler), isError des Hooks reicht aber AUS, um eine passende Meldung anzuzeigen.

Tipp: GENAU wie Kapitel 53 die securityMessage für Server-seitige Fehlermeldungen einführte, kann das Frontend error.response?.data."hydra:description" auswerten, um DIESE Meldung DIREKT im UI anzuzeigen, statt eine EIGENE, generische Fehlermeldung zu erfinden.