blob: 4f7d7b15cb1b58e115c165b85c92d5ee6765f705 [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';
5
Krishyaf1d0ea82025-05-03 17:01:58 +08006const API_BASE = process.env.REACT_APP_API_BASE;
Krishya57cc17b2025-05-26 16:43:34 +08007const user_id = 456;
Krishya7ec1dd02025-04-19 15:29:03 +08008
Krishyaf1d0ea82025-05-03 17:01:58 +08009const CreatePostButton = () => {
10 const [showModal, setShowModal] = useState(false);
11
12 // 表单字段
13 const [title, setTitle] = useState('');
14 const [content, setContent] = useState('');
15 const [previewUrls, setPreviewUrls] = useState([]);
16 const [imageUrls, setImageUrls] = useState([]);
17
18 // 处理文件选中:预览 & 上传
19 const handleImageChange = async (e) => {
20 const files = Array.from(e.target.files);
21 if (!files.length) return;
22 // 本地预览
23 setPreviewUrls(files.map(f => URL.createObjectURL(f)));
24
25 // 并发上传,假设 /upload 接口返回 { url: '...' }
26 try {
27 const uploaded = await Promise.all(
28 files.map(file => {
29 const fd = new FormData();
30 fd.append('file', file);
31 return axios.post(`${API_BASE}/upload`, fd, {
32 headers: { 'Content-Type': 'multipart/form-data' }
33 }).then(res => res.data.url);
34 })
35 );
36 setImageUrls(uploaded);
37 } catch (err) {
38 console.error('图片上传失败:', err);
39 alert('封面图上传失败,请重试');
40 }
41 };
42
43 // 提交发帖
44 const handleSubmit = async () => {
45 if (!title.trim() || !content.trim()) {
46 alert('标题和内容均为必填项');
47 return;
48 }
49
50 try {
51 await axios.post(
Krishya57cc17b2025-05-26 16:43:34 +080052 `${API_BASE}/echo/forum/posts/${user_id}/createPost`,
Krishyaf1d0ea82025-05-03 17:01:58 +080053 {
54 title: title.trim(),
55 post_content: content.trim(),
56 image_url: imageUrls
57 }
58 );
59 // 重置状态并关闭
60 setTitle('');
61 setContent('');
62 setPreviewUrls([]);
63 setImageUrls([]);
64 setShowModal(false);
65 alert('发帖成功');
66 // 如需刷新帖子列表,可在这里触发外部回调
67 } catch (err) {
68 console.error('发帖失败:', err.response?.data || err);
69 alert(err.response?.data?.error || '发帖失败,请稍后重试');
70 }
Krishya7ec1dd02025-04-19 15:29:03 +080071 };
72
73 return (
Krishyaf1d0ea82025-05-03 17:01:58 +080074 <>
75 <div className="create-post">
76 <button onClick={() => setShowModal(true)} className="create-btn">
77 <Edit theme="outline" size="18" style={{ marginRight: 6 }} />
78 发帖
79 </button>
80 </div>
81
82 {showModal && (
83 <div className="cp-modal-overlay" onClick={() => setShowModal(false)}>
84 <div className="cp-modal-dialog" onClick={e => e.stopPropagation()}>
85 <h3>创建新帖子</h3>
86
87 <input
88 type="text"
89 placeholder="帖子标题"
90 value={title}
91 onChange={e => setTitle(e.target.value)}
92 />
93
94 <textarea
95 placeholder="正文内容"
96 value={content}
97 onChange={e => setContent(e.target.value)}
98 />
99
100 <label className="file-label">
101 选择图片
102 <input
103 type="file"
104 accept="image/*"
105 multiple
106 onChange={handleImageChange}
107 style={{ display: 'none' }}
108 />
109 </label>
110
111 <div className="cp-preview">
112 {previewUrls.map((url, i) => (
113 <img key={i} src={url} alt={`封面预览 ${i}`} />
114 ))}
115 </div>
116
117 <div className="cp-actions">
118 <button className="btn cancel" onClick={() => setShowModal(false)}>
119 取消
120 </button>
121 <button className="btn submit" onClick={handleSubmit}>
122 发布
123 </button>
124 </div>
125 </div>
126 </div>
127 )}
128 </>
Krishya7ec1dd02025-04-19 15:29:03 +0800129 );
130};
131
132export default CreatePostButton;