puerto 0.17.0

Puerto — Rust full-stack DDD framework CLI. Scaffolds Clean Architecture projects with auto-wired DI, SQLx support, and zero manual wiring. Formerly puerto-framework.
import { useState } from "react";
import { Link, useLocation } from "wouter";
import { useDependencies } from "../../../core/dependencies";
import { useAsync } from "../../../core/hooks/use-async";
import { ConfirmDialog } from "../../../shared/ui/confirm-dialog";
import { ErrorAlert } from "../../../shared/ui/error-alert";
import { {{ pascal }}DetailView } from "../views/{{ kebab }}-detail-view";

export function {{ pascal }}DetailContainer({ id }: { id: string }) {
  const { {{ camel }}Repository } = useDependencies();
  const {{ ident }} = useAsync(() => {{ camel }}Repository.get(id), [{{ camel }}Repository, id]);
  const [, navigate] = useLocation();
  const [confirming, setConfirming] = useState(false);
  const [failure, setFailure] = useState<unknown>(null);

  const remove = async () => {
    setConfirming(false);
    try {
      await {{ camel }}Repository.remove(id);
      navigate("/{{ plural }}");
    } catch (error) {
      setFailure(error);
    }
  };

  return (
    <section className="space-y-4">
      <h1 className="text-2xl font-bold">{{ label }}</h1>
      {failure !== null && <ErrorAlert error={failure} />}
      {{ "{" }}{{ ident }}.status === "loading" && <span className="loading loading-spinner" />}
      {{ "{" }}{{ ident }}.status === "error" && <ErrorAlert error={{ "{" }}{{ ident }}.error} />}
      {{ "{" }}{{ ident }}.status === "ok" && (
        <div className="card bg-base-100">
          <div className="card-body">
            <{{ pascal }}DetailView {{ ident }}={{ "{" }}{{ ident }}.data} />
            <div className="card-actions justify-end">
              <Link href={`/{{ plural }}/${id}/edit`} className="btn">
                Edit
              </Link>
              <button type="button" className="btn btn-error" onClick={() => setConfirming(true)}>
                Delete
              </button>
            </div>
          </div>
        </div>
      )}
      <Link href="/{{ plural }}" className="link">
        Back to {{ words_plural }}
      </Link>
      <ConfirmDialog
        open={confirming}
        message="Delete this {{ words }}?"
        onConfirm={remove}
        onCancel={() => setConfirming(false)}
      />
    </section>
  );
}