import { useState, useEffect } from 'react' import { api } from '../api' const platformLabels = { instagram: 'Instagram', facebook: 'Facebook', youtube: 'YouTube', tiktok: 'TikTok', } const platformColors = { instagram: 'bg-pink-50 text-pink-600 border-pink-200', facebook: 'bg-blue-50 text-blue-600 border-blue-200', youtube: 'bg-red-50 text-red-600 border-red-200', tiktok: 'bg-slate-900 text-white border-slate-700', } const EMPTY_ACCOUNT = { platform: 'instagram', account_name: '', access_token: '', page_id: '', } export default function SocialAccounts() { const [characters, setCharacters] = useState([]) const [accounts, setAccounts] = useState([]) const [loading, setLoading] = useState(true) const [showForm, setShowForm] = useState(null) // character_id or null const [form, setForm] = useState(EMPTY_ACCOUNT) const [saving, setSaving] = useState(false) const [error, setError] = useState('') const [testing, setTesting] = useState(null) const [testResult, setTestResult] = useState({}) useEffect(() => { loadData() }, []) const loadData = async () => { setLoading(true) try { const [charsData, accsData] = await Promise.all([ api.get('/characters/'), api.get('/social/accounts'), ]) setCharacters(charsData) setAccounts(accsData) } catch { // silent } finally { setLoading(false) } } const getAccountsForCharacter = (characterId) => { return accounts.filter((a) => a.character_id === characterId) } const handleFormChange = (field, value) => { setForm((prev) => ({ ...prev, [field]: value })) } const handleAddAccount = async (characterId) => { setError('') setSaving(true) try { await api.post('/social/accounts', { character_id: characterId, platform: form.platform, account_name: form.account_name, access_token: form.access_token, page_id: form.page_id || null, }) setShowForm(null) setForm(EMPTY_ACCOUNT) loadData() } catch (err) { setError(err.message || 'Errore nel salvataggio') } finally { setSaving(false) } } const handleTest = async (accountId) => { setTesting(accountId) setTestResult((prev) => ({ ...prev, [accountId]: null })) try { const result = await api.post(`/social/accounts/${accountId}/test`) setTestResult((prev) => ({ ...prev, [accountId]: { success: true, message: result.message || 'Connessione OK' } })) } catch (err) { setTestResult((prev) => ({ ...prev, [accountId]: { success: false, message: err.message || 'Test fallito' } })) } finally { setTesting(null) } } const handleToggle = async (account) => { try { await api.put(`/social/accounts/${account.id}`, { is_active: !account.is_active }) loadData() } catch { // silent } } const handleRemove = async (accountId) => { if (!confirm('Rimuovere questo account social?')) return try { await api.delete(`/social/accounts/${accountId}`) loadData() } catch { // silent } } if (loading) { return (

Account Social

Gestisci le connessioni ai social network

) } return (

Account Social

Gestisci le connessioni ai social network per ogni personaggio

{/* Info box */}
i

Configurazione OAuth

Per la pubblicazione automatica, ogni piattaforma richiede la configurazione di un'app developer con le relative credenziali OAuth. Inserisci access token e page ID ottenuti dalla console developer di ciascuna piattaforma.

{error && (
{error}
)} {characters.length === 0 ? (

Nessun personaggio

Crea un personaggio per poi collegare gli account social

) : (
{characters.map((character) => { const charAccounts = getAccountsForCharacter(character.id) const isFormOpen = showForm === character.id return (
{/* Character header */}
{character.name?.charAt(0).toUpperCase()}

{character.name}

{character.niche}

{/* Inline form */} {isFormOpen && (
handleFormChange('account_name', e.target.value)} placeholder="Es. @mio_profilo" className="w-full px-4 py-2.5 border border-slate-200 rounded-lg focus:outline-none focus:ring-2 focus:ring-brand-500 focus:border-transparent text-sm" required />
handleFormChange('access_token', e.target.value)} placeholder="Token di accesso dalla piattaforma" className="w-full px-4 py-2.5 border border-slate-200 rounded-lg focus:outline-none focus:ring-2 focus:ring-brand-500 focus:border-transparent text-sm font-mono" required />
handleFormChange('page_id', e.target.value)} placeholder="ID pagina (per Facebook/YouTube)" className="w-full px-4 py-2.5 border border-slate-200 rounded-lg focus:outline-none focus:ring-2 focus:ring-brand-500 focus:border-transparent text-sm font-mono" />
)} {/* Accounts list */}
{charAccounts.length === 0 ? (

Nessun account collegato

) : ( charAccounts.map((account) => (
{/* Platform badge */} {platformLabels[account.platform] || account.platform} {/* Account name */} {account.account_name} {/* Status */} {/* Test result */} {testResult[account.id] && ( {testResult[account.id].message} )} {/* Actions */}
)) )}
) })}
)}
) }