blob: 7ec885076a8a862ac9050449ca080c4c1592f8db [file] [log] [blame]
import instance from '@/utils/axios';
import React, { useCallback, useEffect, useState } from 'react';
import styles from './upload.module.css';
import {postTorrentUpload } from '@/api/torrent';
import { useLocation, useNavigate } from 'react-router-dom'; // 用于跳转
import { getTagsByMainTag } from '@/utils/common';
import { Checkbox, Row, Col } from 'antd'; // 使用 antd 的 Checkbox 组件
import { MainTag, MainPostTag } from '@/types/common';
import { Select } from 'antd';
import { UploadOutlined } from '@ant-design/icons';
import type { UploadProps } from 'antd';
import { Button, message, Upload as UploadArea } from 'antd';
import request from '@/utils/request';
import {useApi} from '@/hooks/request';
const CreatePost = () => {
const location = useLocation();
const [postTitle, setPostTitle] = useState('');
const [postContent, setPostContent] = useState('');
const [isChecked, setIsChecked] = useState(false);
const {type} = location.state || {type: ''}; // 获取路由传递的参数
const [tagIds, setTagIds] = useState<number[]>([]);
const [postType, setPostType] = useState<string>(type || ''); // 初始化 postType
const navigate = useNavigate();
const [tags, setTags] = useState<Map<string, number>>(new Map());
const [torrentId, setTorrentId] = useState<number>(0); // 用于存储上传的种子 ID
const [messageApi, contextHolder] = message.useMessage();
const {refresh} = useApi((payload)=> request.post('/post', payload), false)
const props: UploadProps = {
name: 'file',
action: process.env.API_BASE_URL + postTorrentUpload, // 替换为实际的上传接口地址
headers: {
authorization: `Bearer ${localStorage.getItem('token')}`, // 使用本地存储的 token
},
onChange(info) {
if (info.file.status === 'done') {
const response = info.file.response;
if(response && response.code !== 200) {
messageApi.error(response.message || '上传失败');
return;
}
else {
console.log('上传成功:', response);
messageApi.success('上传成功')
console.log(response.data.torrentId);
setTorrentId(response.data.torrentId); // 假设返回的数据中有 torrentId
}
} else if (info.file.status === 'error') {
messageApi.error(`${info.file.name} 文件上传失败`);
}
},
};
const handleSubmit = async () => {
console.log(torrentId)
if (!postTitle.trim() || !postType || !postContent.trim()) {
alert('请填写完整内容(资源名、类型、内容介绍)');
return;
}
if (!isChecked) {
alert('请先确认您已知晓以上内容');
return;
}
const payload = {
post: {
postTitle,
postContent,
torrentId,
postType:'resource'
},
tagIds: new Array(...tagIds, MainPostTag[postType as keyof typeof MainPostTag]), // 确保 tagIds 是一个数组
};
try{
const res = await refresh(payload)
messageApi.success('发布成功', 3).then(()=>{
navigate('/')
});
; // 发布成功后跳转到首页
} catch (err){
messageApi.error((err as Error).message || '发布失败,请稍后再试');
}
};
useEffect(() => {
setTags(getTagsByMainTag(type)); // 获取对应类型的标签
},[]);
const handlePostTypeChange = useCallback((value:string) => {
setPostType(value);
setTags(getTagsByMainTag(value)); // 更新 tags
setTagIds([]); // 清空已选的标签 ID
}, [postType, setTags, setTagIds]);
return (
<div className={styles.container}>
{contextHolder}
<div className={styles.formGroup}>
<label>资源名:</label>
<input
type="text"
value={postTitle}
placeholder="请输入文本"
onChange={(e) => setPostTitle(e.target.value)}
className={styles.input}
/>
</div>
<div className={styles.formGroup}>
<label>种子类型:</label>
<Select
value={postType}
onChange={handlePostTypeChange}
options ={ MainTag.map((item) => ({
label: item,
value: item
}))} />
</div>
<div className={styles.formGroup}>
<label>类型选择:</label>
<Checkbox.Group
value={tagIds}
onChange={(checkedValues) => setTagIds(checkedValues as number[])}
>
<Row gutter={[12, 12]}>
{[...tags.entries()].map(([name, id]) => (
<Col key={id} xs={12} sm={8} md={6} lg={4}>
<Checkbox value={id}>{name}</Checkbox>
</Col>
))}
</Row>
</Checkbox.Group>
</div>
{/* 暂时移除上传文件表单 */}
<div className={styles.formGroup}>
<label>上传资源:</label>
<UploadArea {...props}>
<Button icon={<UploadOutlined />}>Upload</Button>
</UploadArea>
</div>
<div className={styles.formGroup}>
<label>内容介绍:</label>
<textarea
placeholder="请输入内容介绍"
value={postContent}
onChange={(e) => setPostContent(e.target.value)}
maxLength={200}
className={styles.textarea}
/>
<div className={styles.charCount}>{postContent.length}/200</div>
</div>
<div className={styles.requirement}>【发布内容要求】</div>
<div className={styles.checkbox}>
<input
type="checkbox"
checked={isChecked}
onChange={() => setIsChecked(!isChecked)}
/>
<span>我已知晓以上内容</span>
</div>
<button onClick={handleSubmit} className={styles.submitBtn} disabled={!isChecked}>
我已知晓
</button>
</div>
);
};
export default CreatePost;