// // import React, { useState } from 'react';
// // import axios from 'axios';
// // import { useNavigate } from 'react-router-dom';
// // import './CreateMoment.css';
// // import Header from '../../components/Header';

// // 
// // const USER_ID = 456;

// // const CreateMoment = () => {
// //   const [title, setTitle] = useState('');
// //   const [content, setContent] = useState('');
// //   const [previewUrls, setPreviewUrls] = useState([]);
// //   const [images, setImages] = useState([]);
// //   const navigate = useNavigate();

// //   const handleImageChange = async (e) => {
// //     const files = Array.from(e.target.files);
// //     if (!files.length) return;

// //     setPreviewUrls(files.map(f => URL.createObjectURL(f)));

// //     try {
// //       const uploaded = await Promise.all(
// //         files.map(file => uploadImageToServer(file))
// //       );
// //       setImages(uploaded);
// //     } catch (err) {
// //       console.error('图片上传失败：', err);
// //       alert('有图片上传失败，请重试');
// //     }
// //   };

// //   const uploadImageToServer = async (file) => {
// //     const formData = new FormData();
// //     formData.append('file', file);
// //     const res = await axios.post(`/upload`, formData, {
// //       headers: {'Content-Type': 'multipart/form-data'}
// //     });
// //     return res.data.url;
// //   };

// //   const handleSubmit = async () => {
// //     if (!content.trim()) {
// //       alert('内容不能为空');
// //       return;
// //     }
// //     try {
// //       await axios.post(
// //         `/echo/users/${USER_ID}/CreateMoment`,
// //         {
// //           title: title.trim() || undefined,
// //           friend_content: content.trim(),
// //           images
// //         }
// //       );
// //       navigate('/friend-moments');
// //     } catch (err) {
// //       console.error('发布失败：', err);
// //       alert('发布失败，请稍后重试');
// //     }
// //   };

// //   return (
// //     <div className="create-feed-page">
// //       <Header/>
// //       <div className="cf-header">
// //         <button onClick={() => navigate(-1)} style={{padding : '5px 10px', backgroundColor: '#BA929A', color: 'white'}}>返回</button>
// //         <h3>发布新动态</h3>
// //       </div>

// //       <div className="cf-form">
// //         <input
// //           type="text"
// //           placeholder="标题"
// //           value={title}
// //           onChange={e => setTitle(e.target.value)}
// //         />
// //         <textarea
// //           placeholder="写下你的内容..."
// //           value={content}
// //           onChange={e => setContent(e.target.value)}
// //         />
// //         <input
// //           type="file"
// //           accept="image/*"
// //           multiple
// //           onChange={handleImageChange}
// //         />
// //         <div className="cf-preview">
// //           {previewUrls.map((url, i) => (
// //             <img key={i} src={url} alt={`预览 ${i}`} />
// //           ))}
// //         </div>
// //         <button className="cf-submit-btn" onClick={handleSubmit}>
// //           发布
// //         </button>
// //       </div>
// //     </div>
// //   );
// // };

// // export default CreateMoment;
// import React, { useState } from 'react';
// import axios from 'axios';
// import { useNavigate } from 'react-router-dom';
// import './CreateMoment.css';
// import Header from '../../components/Header';

// 
// const USER_ID = 456;

// const CreateMoment = ({ onClose, fetchFeeds }) => {
//     const [title, setTitle] = useState('');
//     const [content, setContent] = useState('');
//     const [previewUrls, setPreviewUrls] = useState([]);
//     const [images, setImages] = useState([]);
//     const navigate = useNavigate();

//     const handleImageChange = async (e) => {
//         const files = Array.from(e.target.files);
//         if (!files.length) return;
//         setPreviewUrls(files.map(f => URL.createObjectURL(f)));
//         try {
//             const uploaded = await Promise.all(
//                 files.map(file => uploadImageToServer(file))
//             );
//             setImages(uploaded);
//         } catch (err) {
//             console.error('图片上传失败：', err);
//             alert('有图片上传失败，请重试');
//         }
//     };

//     const uploadImageToServer = async (file) => {
//         const formData = new FormData();
//         formData.append('file', file);
//         const res = await axios.post(`/upload`, formData, {
//             headers: { 'Content-Type': 'multipart/form-data' }
//         });
//         return res.data.url;
//     };

//     const handleSubmit = async () => {
//         if (!content.trim()) {
//             alert('内容不能为空');
//             return;
//         }
//         try {
//             await axios.post(
//                 `/echo/users/${USER_ID}/CreateMoment`,
//                 {
//                     title: title.trim() || undefined,
//                     friend_content: content.trim(),
//                     images
//                 }
//             );
//             onClose();
//             fetchFeeds();
//         } catch (err) {
//             console.error('发布失败：', err);
//             alert('发布失败，请稍后重试');
//         }
//     };

//     return (
//         <div className="create-feed-page">
//             <div className="cf-header">
//                 <button onClick={onClose} style={{ padding: '5px 10px', backgroundColor: '#BA929A', color: 'white' }}>
//                     返回
//                 </button>
//                 <h3>发布新动态</h3>
//             </div>
//             <div className="cf-form">
//                 <input
//                     type="text"
//                     placeholder="标题"
//                     value={title}
//                     onChange={e => setTitle(e.target.value)}
//                 />
//                 <textarea
//                     placeholder="写下你的内容..."
//                     value={content}
//                     onChange={e => setContent(e.target.value)}
//                 />
//                 <input
//                     type="file"
//                     accept="image/*"
//                     multiple
//                     onChange={handleImageChange}
//                 />
//                 <div className="cf-preview">
//                     {previewUrls.map((url, i) => (
//                         <img key={i} src={url} alt={`预览 ${i}`} />
//                     ))}
//                 </div>
//                 <button className="cf-submit-btn" onClick={handleSubmit}>
//                     发布
//                 </button>
//             </div>
//         </div>
//     );
// };

// export default CreateMoment;
    
