Bilder + GSC + Posthog

This commit is contained in:
2026-04-29 20:33:21 +02:00
committed by Timo Knuth
parent 32bd2c38e0
commit 6b6ce9d6ae
11 changed files with 411 additions and 234 deletions

View File

@@ -5,9 +5,20 @@ import { useRouter } from 'next/navigation'
import { createOrganization } from './actions'
import { LandingPagePreview } from './LandingPagePreview'
const initialState = { success: false, error: '' }
export function CreateOrgForm() {
const initialState = { success: false, error: '' }
async function readUploadResponse(res: Response) {
const data = await res.json().catch(() => null)
if (!res.ok) {
throw new Error(data?.error || 'Upload fehlgeschlagen')
}
if (!data?.url) {
throw new Error('Upload-Antwort enthaelt keine Datei-URL')
}
return data as { url: string }
}
export function CreateOrgForm() {
const [state, formAction, isPending] = useActionState(createOrganization, initialState)
const router = useRouter()
const [step, setStep] = useState(1)
@@ -69,20 +80,19 @@ export function CreateOrgForm() {
const uploadFormData = new FormData()
uploadFormData.append('file', file)
try {
const res = await fetch('/api/upload', {
method: 'POST',
body: uploadFormData
})
const data = await res.json()
if (data.url) {
setFormData(prev => ({ ...prev, logoUrl: data.url }))
}
} catch (err) {
console.error('Upload failed', err)
} finally {
setIsUploading(false)
}
try {
const res = await fetch('/api/upload', {
method: 'POST',
body: uploadFormData
})
const data = await readUploadResponse(res)
setFormData(prev => ({ ...prev, logoUrl: data.url }))
} catch (err) {
console.error('Upload failed', err)
alert(err instanceof Error ? err.message : 'Upload fehlgeschlagen')
} finally {
setIsUploading(false)
}
}
const [isHeroUploading, setIsHeroUploading] = useState(false)
@@ -98,20 +108,19 @@ export function CreateOrgForm() {
const uploadFormData = new FormData()
uploadFormData.append('file', file)
try {
const res = await fetch('/api/upload', {
method: 'POST',
body: uploadFormData
})
const data = await res.json()
if (data.url) {
setFormData(prev => ({ ...prev, landingPageHeroImage: data.url }))
}
} catch (err) {
console.error('Upload failed', err)
} finally {
setIsHeroUploading(false)
}
try {
const res = await fetch('/api/upload', {
method: 'POST',
body: uploadFormData
})
const data = await readUploadResponse(res)
setFormData(prev => ({ ...prev, landingPageHeroImage: data.url }))
} catch (err) {
console.error('Upload failed', err)
alert(err instanceof Error ? err.message : 'Upload fehlgeschlagen')
} finally {
setIsHeroUploading(false)
}
}
const handleChange = (e: React.ChangeEvent<HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement>) => {

View File

@@ -1,6 +1,6 @@
'use server'
import { prisma, Prisma } from '@innungsapp/shared'
import { prisma } from '@innungsapp/shared'
import { auth, getSanitizedHeaders } from '@/lib/auth'
import { revalidatePath } from 'next/cache'
import { redirect } from 'next/navigation'
@@ -13,13 +13,13 @@ function normalizeEmail(email: string | null | undefined): string {
return (email ?? '').trim().toLowerCase()
}
function toJsonbText(value: string | undefined): Prisma.InputJsonValue | Prisma.NullableJsonNullValueInput {
if (!value) {
return Prisma.DbNull
}
return value
}
function toJsonbText(value: string | undefined): string | null {
if (!value) {
return null
}
return value
}
/**
* Sets a credential (email+password) account for a user.

View File

@@ -43,9 +43,20 @@ interface Props {
}
}
const initialState = { success: false, error: '' }
export function EditOrgForm({ org }: Props) {
const initialState = { success: false, error: '' }
async function readUploadResponse(res: Response) {
const data = await res.json().catch(() => null)
if (!res.ok) {
throw new Error(data?.error || 'Upload fehlgeschlagen')
}
if (!data?.url) {
throw new Error('Upload-Antwort enthaelt keine Datei-URL')
}
return data as { url: string }
}
export function EditOrgForm({ org }: Props) {
const boundAction = updateOrganization.bind(null, org.id)
const [state, formAction, isPending] = useActionState(boundAction, initialState)
const [logoUrl, setLogoUrl] = useState(org.logoUrl || '')
@@ -65,21 +76,20 @@ export function EditOrgForm({ org }: Props) {
const uploadFormData = new FormData()
uploadFormData.append('file', file)
try {
const res = await fetch('/api/upload', {
method: 'POST',
body: uploadFormData
})
const data = await res.json()
if (data.url) {
if (type === 'logo') setLogoUrl(data.url)
if (type === 'hero') setHeroImageUrl(data.url)
}
} catch (err) {
console.error('Upload failed', err)
} finally {
setIsUploading(prev => ({ ...prev, [type]: false }))
}
try {
const res = await fetch('/api/upload', {
method: 'POST',
body: uploadFormData
})
const data = await readUploadResponse(res)
if (type === 'logo') setLogoUrl(data.url)
if (type === 'hero') setHeroImageUrl(data.url)
} catch (err) {
console.error('Upload failed', err)
alert(err instanceof Error ? err.message : 'Upload fehlgeschlagen')
} finally {
setIsUploading(prev => ({ ...prev, [type]: false }))
}
}