import React, { useEffect, useMemo, useState } from 'react' import { router, usePage } from '@inertiajs/react' import StudioLayout from '../../Layouts/StudioLayout' const modules = [ { key: 'artworks', label: 'Artworks' }, { key: 'cards', label: 'Cards' }, { key: 'collections', label: 'Collections' }, { key: 'stories', label: 'Stories' }, ] async function requestJson(url, method, body) { const response = await fetch(url, { method, credentials: 'same-origin', headers: { Accept: 'application/json', 'Content-Type': 'application/json', 'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]')?.getAttribute('content') || '', 'X-Requested-With': 'XMLHttpRequest', }, body: body ? JSON.stringify(body) : undefined, }) const payload = await response.json().catch(() => ({})) if (!response.ok) { throw new Error(payload?.message || payload?.error || 'Request failed') } return payload } export default function StudioFeatured() { const { props } = usePage() const [featuredModules, setFeaturedModules] = useState(props.featuredModules || []) const [selected, setSelected] = useState(props.selected || {}) const [saving, setSaving] = useState(false) useEffect(() => { setFeaturedModules(props.featuredModules || []) setSelected(props.selected || {}) }, [props.featuredModules, props.selected]) const groupedItems = useMemo(() => { return (props.items || []).reduce((accumulator, item) => { const key = item.module || 'unknown' accumulator[key] = [...(accumulator[key] || []), item] return accumulator }, {}) }, [props.items]) const toggleModule = (module) => { setFeaturedModules((current) => ( current.includes(module) ? current.filter((entry) => entry !== module) : [...current, module] )) } const saveSelections = async () => { setSaving(true) try { await requestJson(props.endpoints.save, 'PUT', { featured_modules: featuredModules, featured_content: selected, }) router.reload({ preserveScroll: true, preserveState: true }) } catch (error) { window.alert(error?.message || 'Unable to save featured content.') } finally { setSaving(false) } } return (

Profile highlights

Choose which modules are highlighted on your profile, then assign one representative item to each active module.

Active modules

{modules.map((module) => { const active = featuredModules.includes(module.key) return ( ) })}
{modules.map((module) => { const items = groupedItems[module.key] || [] const active = featuredModules.includes(module.key) return (

{module.label}

Select one featured item that represents this module on your profile.

{active ? 'Active' : 'Hidden'}
{items.length > 0 ? (
{items.map((item) => { const isSelected = Number(selected[module.key] || 0) === Number(item.numeric_id || 0) return (
{item.image_url ? ( {item.title} ) : (
)}

{item.module_label}

{item.title}

{item.subtitle || item.visibility || 'Published item'}

Views
{Number(item.metrics?.views || 0).toLocaleString()}
Reactions
{Number(item.metrics?.appreciation || 0).toLocaleString()}
Comments
{Number(item.metrics?.comments || 0).toLocaleString()}
) })}
) : (
No published {module.label.toLowerCase()} candidates yet.
)}
) })}
) }