blob: e324056b0d28fdc7dd8990de9a17c212ff533086 [file] [log] [blame]
Krishyaf1d0ea82025-05-03 17:01:58 +08001import React, { useState } from 'react';
2import axios from 'axios';
Krishya7ec1dd02025-04-19 15:29:03 +08003import { Edit } from '@icon-park/react';
4import './CreatePostButton.css';
22301009df48f962025-06-05 13:40:44 +08005import { useUser } from '../../../../context/UserContext';
Krishya7ec1dd02025-04-19 15:29:03 +08006
Krishyaf1d0ea82025-05-03 17:01:58 +08007const CreatePostButton = () => {
22301009df48f962025-06-05 13:40:44 +08008 const { user } = useUser();
9 const userId = user?.userId; // 这里改为 userId,跟 UserContext 统一
Krishyaf1d0ea82025-05-03 17:01:58 +080010
22301009df48f962025-06-05 13:40:44 +080011 const [showModal, setShowModal] = useState(false);
Krishyaf1d0ea82025-05-03 17:01:58 +080012 const [title, setTitle] = useState('');
13 const [content, setContent] = useState('');
14 const [previewUrls, setPreviewUrls] = useState([]);
Krishya2283d882025-05-27 22:25:19 +080015 const [files, setFiles] = useState([]);
Krishyaf1d0ea82025-05-03 17:01:58 +080016
Krishya2283d882025-05-27 22:25:19 +080017 const handleImageChange = (e) => {
18 const selectedFiles = Array.from(e.target.files);
19 if (!selectedFiles.length) return;
20 setFiles(selectedFiles);
21 setPreviewUrls(selectedFiles.map(f => URL.createObjectURL(f)));
Krishyaf1d0ea82025-05-03 17:01:58 +080022 };
23
Krishyaf1d0ea82025-05-03 17:01:58 +080024 const handleSubmit = async () => {
22301009df48f962025-06-05 13:40:44 +080025 if (!userId) {
26 alert('用户未登录或用户ID未获取到,无法发帖');
27 return;
28 }
Krishyaf1d0ea82025-05-03 17:01:58 +080029 if (!title.trim() || !content.trim()) {
30 alert('标题和内容均为必填项');
31 return;
32 }
33
Krishya2283d882025-05-27 22:25:19 +080034 const formData = new FormData();
35 formData.append('title', title.trim());
36 formData.append('postContent', content.trim());
37
38 files.forEach(file => {
22301009df48f962025-06-05 13:40:44 +080039 formData.append('imageUrl', file);
Krishya2283d882025-05-27 22:25:19 +080040 });
41
Krishyaf1d0ea82025-05-03 17:01:58 +080042 try {
43 await axios.post(
Krishya2283d882025-05-27 22:25:19 +080044 `/echo/forum/posts/${userId}/createPost`,
45 formData,
Krishyaf1d0ea82025-05-03 17:01:58 +080046 {
Krishya2283d882025-05-27 22:25:19 +080047 headers: { 'Content-Type': 'multipart/form-data' }
Krishyaf1d0ea82025-05-03 17:01:58 +080048 }
49 );
Krishya2283d882025-05-27 22:25:19 +080050
Krishyaf1d0ea82025-05-03 17:01:58 +080051 setTitle('');
52 setContent('');
Krishya2283d882025-05-27 22:25:19 +080053 setFiles([]);
Krishyaf1d0ea82025-05-03 17:01:58 +080054 setPreviewUrls([]);
Krishyaf1d0ea82025-05-03 17:01:58 +080055 setShowModal(false);
56 alert('发帖成功');
Krishyaf1d0ea82025-05-03 17:01:58 +080057 } catch (err) {
58 console.error('发帖失败:', err.response?.data || err);
59 alert(err.response?.data?.error || '发帖失败,请稍后重试');
60 }
Krishya7ec1dd02025-04-19 15:29:03 +080061 };
62
63 return (
Krishyaf1d0ea82025-05-03 17:01:58 +080064 <>
65 <div className="create-post">
66 <button onClick={() => setShowModal(true)} className="create-btn">
67 <Edit theme="outline" size="18" style={{ marginRight: 6 }} />
68 发帖
69 </button>
70 </div>
71
72 {showModal && (
73 <div className="cp-modal-overlay" onClick={() => setShowModal(false)}>
74 <div className="cp-modal-dialog" onClick={e => e.stopPropagation()}>
75 <h3>创建新帖子</h3>
76
77 <input
78 type="text"
79 placeholder="帖子标题"
80 value={title}
81 onChange={e => setTitle(e.target.value)}
82 />
83
84 <textarea
85 placeholder="正文内容"
86 value={content}
87 onChange={e => setContent(e.target.value)}
88 />
89
90 <label className="file-label">
91 选择图片
92 <input
93 type="file"
94 accept="image/*"
95 multiple
96 onChange={handleImageChange}
97 style={{ display: 'none' }}
98 />
99 </label>
100
101 <div className="cp-preview">
102 {previewUrls.map((url, i) => (
Krishya2283d882025-05-27 22:25:19 +0800103 <img key={i} src={url} alt={`预览 ${i}`} />
Krishyaf1d0ea82025-05-03 17:01:58 +0800104 ))}
105 </div>
106
107 <div className="cp-actions">
108 <button className="btn cancel" onClick={() => setShowModal(false)}>
109 取消
110 </button>
111 <button className="btn submit" onClick={handleSubmit}>
112 发布
113 </button>
114 </div>
115 </div>
116 </div>
117 )}
118 </>
Krishya7ec1dd02025-04-19 15:29:03 +0800119 );
120};
121
122export default CreatePostButton;