import React, { useEffect, useRef, useState } from 'react'; import Paper from '@mui/material/Paper'; import Typography from '@mui/material/Typography'; import TextField from '@mui/material/TextField'; import Button from '@mui/material/Button'; import Box from '@mui/material/Box'; import FormControlLabel from '@mui/material/FormControlLabel'; import Switch from '@mui/material/Switch'; import IconButton from '@mui/material/IconButton'; import DeleteIcon from '@mui/icons-material/Delete'; import AddIcon from '@mui/icons-material/Add'; import { getSettings, saveSettings } from '../../api/settings.js'; import { uploadFile } from '../../api/upload.js'; import { showSnack } from '../snack.jsx'; /** 首页设置:个人信息(头像/简介/联系链接)/主页内容(Markdown)/音乐嵌入(迁移自 v1 首页卡片) */ export default function Homepage() { const [form, setForm] = useState({ homepage_avatar: '', homepage_bio: '', homepage_content: '', music_embed_enabled: false, music_embed_code: '', music_embed_position: 'right', music_embed_autohide: false, music_embed_idle_timeout: '10', }); const [contacts, setContacts] = useState([{ icon: 'link', url: '', title: '' }]); const [saving, setSaving] = useState(false); const [uploadStatus, setUploadStatus] = useState(''); const fileRef = useRef(null); useEffect(() => { getSettings() .then((s) => { let parsed = []; try { parsed = JSON.parse(s.homepage_contacts || '[]'); } catch { parsed = []; } setForm({ homepage_avatar: s.homepage_avatar || '', homepage_bio: s.homepage_bio || '', homepage_content: s.homepage_content || '', music_embed_enabled: s.music_embed_enabled === '1', music_embed_code: s.music_embed_code || '', music_embed_position: s.music_embed_position || 'right', music_embed_autohide: s.music_embed_autohide === '1', music_embed_idle_timeout: s.music_embed_idle_timeout || '10', }); setContacts(parsed.length > 0 ? parsed : [{ icon: 'link', url: '', title: '' }]); }) .catch((e) => showSnack(e.message, 'error')); }, []); const set = (k) => (e) => setForm((p) => ({ ...p, [k]: e.target.value })); const setSwitch = (k) => (e) => setForm((p) => ({ ...p, [k]: e.target.checked })); const updateContact = (i, k) => (e) => { const next = [...contacts]; next[i] = { ...next[i], [k]: e.target.value }; setContacts(next); }; const addContact = () => { if (contacts.length >= 5) { showSnack('最多 5 个联系链接', 'error'); return; } setContacts([...contacts, { icon: 'link', url: '', title: '' }]); }; const removeContact = (i) => setContacts(contacts.filter((_, idx) => idx !== i)); const handleUpload = async (e) => { const file = e.target.files && e.target.files[0]; e.target.value = ''; if (!file) return; try { const data = await uploadFile(file); setForm((p) => ({ ...p, homepage_content: p.homepage_content + '\n' + data.tag + '\n' })); setUploadStatus('已插入: ' + data.tag); } catch (err) { showSnack(err.message, 'error'); } }; const save = async () => { const validContacts = contacts.filter((c) => c.url.trim()); setSaving(true); try { await saveSettings({ homepage_avatar: form.homepage_avatar.trim(), homepage_bio: form.homepage_bio, homepage_content: form.homepage_content, homepage_contacts: JSON.stringify(validContacts), music_embed_enabled: form.music_embed_enabled ? '1' : '0', music_embed_code: form.music_embed_code.trim(), music_embed_position: form.music_embed_position, music_embed_autohide: form.music_embed_autohide ? '1' : '0', music_embed_idle_timeout: form.music_embed_idle_timeout, }); showSnack('首页设置已保存'); } catch (e) { showSnack(e.message, 'error'); } setSaving(false); }; return ( 首页设置 个人信息 联系链接(最多5个) {contacts.map((c, i) => ( removeContact(i)} title="删除"> ))} 主页内容 {uploadStatus && {uploadStatus}} 音乐嵌入 } label="所有页面显示音乐播放器" /> } label="无操作后缩小为图标" /> ); }