From b2522642116f6dbefd68db1d6dd30d877f76b154 Mon Sep 17 00:00:00 2001 From: Rajpreet0 Date: Sun, 27 Sep 2026 19:14:28 +0200 Subject: [PATCH] see comments --- ...00100_create_profile_on_signup_trigger.sql | 6 +++- modules/admin/actions/client.ts | 6 ++++ modules/admin/queries/clients.ts | 2 +- modules/admin/ui/components/copy-field.tsx | 29 ++++++++++++++----- 4 files changed, 34 insertions(+), 9 deletions(-) diff --git a/lib/supabase/migrations/20260927100100_create_profile_on_signup_trigger.sql b/lib/supabase/migrations/20260927100100_create_profile_on_signup_trigger.sql index 2e1b781..753ffd9 100644 --- a/lib/supabase/migrations/20260927100100_create_profile_on_signup_trigger.sql +++ b/lib/supabase/migrations/20260927100100_create_profile_on_signup_trigger.sql @@ -14,4 +14,8 @@ begin ); return new; end; -$$; \ No newline at end of file +$$; + +create trigger on_auth_user_created + after insert on auth.users + for each row execute function public.handle_new_user(); \ No newline at end of file diff --git a/modules/admin/actions/client.ts b/modules/admin/actions/client.ts index 79fc7e3..374f809 100644 --- a/modules/admin/actions/client.ts +++ b/modules/admin/actions/client.ts @@ -1,5 +1,6 @@ "use server"; import { createAdminClient } from "@/lib/supabase/admin"; +import { verifySession } from "@/lib/supabase/dal"; import { generatePassword } from "@/lib/generate-password"; import * as z from "zod"; @@ -20,6 +21,11 @@ export async function createClient( formData: FormData ): Promise { + const session = await verifySession(); + if (!session.isAdmin) { + return { error: "Keine Berechtigung." } + } + const validatedFields = CreateClientSchema.safeParse({ name: formData.get("name"), email: formData.get("email") diff --git a/modules/admin/queries/clients.ts b/modules/admin/queries/clients.ts index 86bf4ad..f2cba94 100644 --- a/modules/admin/queries/clients.ts +++ b/modules/admin/queries/clients.ts @@ -9,7 +9,7 @@ export async function getClients() { .eq("role", "client") .order("name") - if (error) return [] + if (error) throw new Error(`Failed to load clients: ${error.message}`) return data } diff --git a/modules/admin/ui/components/copy-field.tsx b/modules/admin/ui/components/copy-field.tsx index 1538510..459ef66 100644 --- a/modules/admin/ui/components/copy-field.tsx +++ b/modules/admin/ui/components/copy-field.tsx @@ -1,25 +1,31 @@ "use client" -import { useState } from "react"; +import { useRef, useState } from "react"; import { CheckIcon, CopyIcon } from "lucide-react"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Field, FieldLabel } from "@/components/ui/field"; export function CopyField({ label, value }: { label: string; value: string }) { - const [copied, setCopied] = useState(false); + const [status, setStatus] = useState<"idle" | "copied" | "error">("idle"); + const inputRef = useRef(null); async function handleCopy() { - await navigator.clipboard.writeText(value); - setCopied(true); - setTimeout(() => setCopied(false), 1500); + try { + await navigator.clipboard.writeText(value); + setStatus("copied"); + } catch { + inputRef.current?.select(); + setStatus("error"); + } + setTimeout(() => setStatus("idle"), 1500); } return ( {label}
- +
+ {status === "error" && ( +

+ Kopieren fehlgeschlagen — Text wurde markiert, bitte manuell kopieren. +

+ )}
) }