import React, { useMemo, useRef, useState } from 'react' import { router, usePage } from '@inertiajs/react' import StudioLayout from '../../Layouts/StudioLayout' import GroupStudioPromoCard from '../../components/groups/GroupStudioPromoCard' import NovaSelect from '../../components/ui/NovaSelect' function slugifyGroupValue(value) { return String(value || '') .normalize('NFKD') .replace(/[\u0300-\u036f]/g, '') .toLowerCase() .replace(/[^a-z0-9]+/g, '-') .replace(/^-+|-+$/g, '') .slice(0, 90) } function resolveMediaPreviewUrl(path, filesCdnUrl) { const trimmed = String(path || '').trim() if (!trimmed) { return '' } if (trimmed.startsWith('blob:') || trimmed.startsWith('data:') || trimmed.startsWith('http://') || trimmed.startsWith('https://')) { return trimmed } return `${String(filesCdnUrl || '').replace(/\/$/, '')}/${trimmed.replace(/^\/+/, '')}` } export default function StudioGroupCreate() { const { props } = usePage() const filesCdnUrl = props?.cdn?.files_url || '' const avatarInputRef = useRef(null) const bannerInputRef = useRef(null) const [slugManuallyEdited, setSlugManuallyEdited] = useState(false) const [form, setForm] = useState({ name: '', slug: '', headline: '', bio: '', type: '', founded_at: '', avatar_path: '', banner_path: '', visibility: 'public', membership_policy: 'invite_only', website_url: '', links_json: [{ label: '', url: '' }], avatar_file: null, banner_file: null, }) const [avatarPreview, setAvatarPreview] = useState('') const [bannerPreview, setBannerPreview] = useState('') const resolvedAvatarPreview = useMemo(() => avatarPreview || resolveMediaPreviewUrl(form.avatar_path, filesCdnUrl), [avatarPreview, form.avatar_path, filesCdnUrl]) const resolvedBannerPreview = useMemo(() => bannerPreview || resolveMediaPreviewUrl(form.banner_path, filesCdnUrl), [bannerPreview, form.banner_path, filesCdnUrl]) const updateLink = (index, key, value) => { setForm((current) => ({ ...current, links_json: current.links_json.map((item, itemIndex) => itemIndex === index ? { ...item, [key]: value } : item), })) } const addLink = () => { setForm((current) => ({ ...current, links_json: [...current.links_json, { label: '', url: '' }], })) } const removeLink = (index) => { setForm((current) => ({ ...current, links_json: current.links_json.filter((_, itemIndex) => itemIndex !== index), })) } const submit = () => { router.post(props.endpoints?.store, { ...form, links_json: form.links_json.filter((item) => item.label.trim() !== '' || item.url.trim() !== ''), }, { forceFormData: true, }) } const handleFileSelected = (field, setPreview) => (event) => { const file = event.target.files?.[0] || null setForm((current) => ({ ...current, [field]: file })) setPreview(file ? URL.createObjectURL(file) : '') } const clearSelectedFile = (field, setPreview, inputRef) => { setForm((current) => ({ ...current, [field]: null })) setPreview('') if (inputRef.current) { inputRef.current.value = '' } } const handleNameChange = (event) => { const nextName = event.target.value setForm((current) => ({ ...current, name: nextName, slug: slugManuallyEdited ? current.slug : slugifyGroupValue(nextName), })) } const handleSlugChange = (event) => { const nextSlug = slugifyGroupValue(event.target.value) setSlugManuallyEdited(nextSlug !== '') setForm((current) => ({ ...current, slug: nextSlug })) } return (