|
|
@@ -1,79 +1,548 @@
|
|
|
-import { DislikeOutlined, EditOutlined, LikeOutlined, VideoCameraOutlined, WeiboSquareOutlined } from '@ant-design/icons'
|
|
|
+import { DislikeOutlined, EditOutlined, LikeOutlined, PictureOutlined, VideoCameraOutlined, WeiboSquareOutlined, RetweetOutlined, MessageOutlined } from '@ant-design/icons'
|
|
|
+import { Dropdown, Menu } from 'antd'
|
|
|
import Myinfo from '../find/recommend/components/Recommend_body_right/components/Myinfo'
|
|
|
import UserStats from '../find/recommend/components/Recommend_body_right/components/UserStats'
|
|
|
import './index.css'
|
|
|
-import { Button, Image } from 'antd'
|
|
|
+import { Button, Form, Image, Input, message, Modal, Upload } from 'antd'
|
|
|
import Mine_Friend_recommend from './Mine_Friend_recommend'
|
|
|
+import { useEffect, useState, useRef } from 'react'
|
|
|
+import TextArea from 'antd/es/input/TextArea'
|
|
|
+import { useNavigate } from 'react-router-dom'
|
|
|
+import type { UploadFile, UploadProps } from 'antd'
|
|
|
+import { uploadFile } from '@/apis/upload'
|
|
|
+import { addShare, shareList, likeShare, cancelLikeShare, dislikeShare, cancelDislikeShare, forwardShare, cancelForwardShare, deleteShare } from '@/apis/share'
|
|
|
+import InfiniteScroll from 'react-infinite-scroll-component'
|
|
|
+
|
|
|
+// 定义分享项的类型
|
|
|
+interface ShareItem {
|
|
|
+ id: number;
|
|
|
+ userId: string;
|
|
|
+ artistName: string;
|
|
|
+ avatar: string;
|
|
|
+ content: string;
|
|
|
+ likeCount: number;
|
|
|
+ unlikeCount: number;
|
|
|
+ isForward: boolean;
|
|
|
+ forwardCount: number;
|
|
|
+ commentCount: number;
|
|
|
+ jumpUrls: string | null;
|
|
|
+ files: string; // JSON字符串
|
|
|
+ createdAt: string;
|
|
|
+ isLiked: boolean; // 用户是否已点赞
|
|
|
+ isDisliked: boolean; // 用户是否已点踩
|
|
|
+ isForwarded: boolean; // 用户是否已转发
|
|
|
+}
|
|
|
+
|
|
|
const Mine_Friend = () => {
|
|
|
- return (
|
|
|
- <div className='Mine_Friend'>
|
|
|
- <div className="Mine_Friend_left">
|
|
|
- <div className="Mine_Friend_left_title">
|
|
|
- <div className="Mine_Friend_left_title_p">
|
|
|
- 笔记
|
|
|
- </div>
|
|
|
- <div className="Mine_Friend_left_title_Button">
|
|
|
- <div className="Mine_Friend_left_title_Button_content">
|
|
|
- <EditOutlined />发笔记
|
|
|
- </div>
|
|
|
- <div className="Mine_Friend_left_title_Button_content">
|
|
|
- <VideoCameraOutlined /> 发视频
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- <div className="Mine_Friend_left_hr" />
|
|
|
- <div className="notify">
|
|
|
- <div className="notify_left">你关注的杭盖乐队等2位歌手发布了新作品</div>
|
|
|
- <div className="notify_right">快去看看{'>'}</div>
|
|
|
- </div>
|
|
|
- <div className="Mine_Friend_content">
|
|
|
+ const [isModalOpen, setIsModalOpen] = useState(false)
|
|
|
+ const useroute = useNavigate()
|
|
|
+ const [messageApi, contextHolder] = message.useMessage()
|
|
|
+ const [form] = Form.useForm()
|
|
|
+ const [fileList, setFileList] = useState<UploadFile[]>([])
|
|
|
+ const [shareData, setShareData] = useState<ShareItem[]>([])
|
|
|
+ const [hasMore, setHasMore] = useState(true)
|
|
|
+ const [page, setPage] = useState(1)
|
|
|
+ const [loading, setLoading] = useState(false)
|
|
|
+ const [totalPages, setTotalPages] = useState(0)
|
|
|
+
|
|
|
+ const handleChange: UploadProps['onChange'] = ({ fileList: newFileList }) => {
|
|
|
+ console.log(newFileList);
|
|
|
+ setFileList(newFileList)
|
|
|
+
|
|
|
+ const fileInfoArray = newFileList
|
|
|
+ .filter(file => file.status === 'done' && (file.response || file.url))
|
|
|
+ .map(file => ({
|
|
|
+ url: file.response
|
|
|
+ }))
|
|
|
+
|
|
|
+ form.setFieldsValue({
|
|
|
+ files: fileInfoArray
|
|
|
+ })
|
|
|
+ }
|
|
|
+ const uploadButton = <PictureOutlined />
|
|
|
+
|
|
|
+ const onFinish = async (values: any) => {
|
|
|
+ console.log(values);
|
|
|
+
|
|
|
+ const processedValues = {
|
|
|
+ ...values,
|
|
|
+ files: values.files ? JSON.stringify(values.files) : ""
|
|
|
+ }
|
|
|
+
|
|
|
+ console.log('表单值:', processedValues)
|
|
|
+ await addShare(processedValues)
|
|
|
+ messageApi.success('发布成功')
|
|
|
+ setIsModalOpen(false)
|
|
|
+ form.resetFields()
|
|
|
+ setFileList([])
|
|
|
+ // 重新加载第一页数据
|
|
|
+ setPage(1)
|
|
|
+ setShareData([])
|
|
|
+ await fetchShareList(1)
|
|
|
+ }
|
|
|
+
|
|
|
+ const onFinishFailed = (errorInfo: any) => {
|
|
|
+ console.log('表单验证失败:', errorInfo)
|
|
|
+ }
|
|
|
+
|
|
|
+ const handleOk = () => {
|
|
|
+ form.submit()
|
|
|
+ }
|
|
|
+
|
|
|
+ const handleCancel = () => {
|
|
|
+ setIsModalOpen(false)
|
|
|
+ form.resetFields()
|
|
|
+ }
|
|
|
+
|
|
|
+ const onopenModal = () => {
|
|
|
+ setIsModalOpen(true)
|
|
|
+ }
|
|
|
+
|
|
|
+ const customRequest = async (options: any) => {
|
|
|
+ const { file, onSuccess, onError, onProgress } = options
|
|
|
+ try {
|
|
|
+ const result = await uploadFile('Video_Temp', file, '', onProgress)
|
|
|
+ messageApi.success('封面上传成功')
|
|
|
+ console.log(result);
|
|
|
+
|
|
|
+ onSuccess(result.data)
|
|
|
+ } catch (error) {
|
|
|
+ console.error('封面上传失败:', error)
|
|
|
+ const errorMessage = error.response?.data?.error || '封面上传失败'
|
|
|
+ messageApi.error(errorMessage)
|
|
|
+ onError(error)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ const fetchShareList = async (pageNum: number) => {
|
|
|
+ try {
|
|
|
+ setLoading(true)
|
|
|
+ const res = await shareList(pageNum, 5) // 每页5条数据
|
|
|
+ if (pageNum === 1) {
|
|
|
+ setShareData(res.data.records)
|
|
|
+ } else {
|
|
|
+ setShareData(prev => [...prev, ...res.data.records])
|
|
|
+ }
|
|
|
+ setTotalPages(res.data.pages)
|
|
|
+ setHasMore(pageNum < res.data.pages)
|
|
|
+ } catch (error) {
|
|
|
+ console.error('获取分享列表失败:', error)
|
|
|
+ } finally {
|
|
|
+ setLoading(false)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ useEffect(() => {
|
|
|
+ fetchShareList(1)
|
|
|
+ }, [])
|
|
|
+
|
|
|
+ // 加载更多数据
|
|
|
+ const loadMoreData = async () => {
|
|
|
+ if (loading || !hasMore) return
|
|
|
+ const nextPage = page + 1
|
|
|
+ await fetchShareList(nextPage)
|
|
|
+ setPage(nextPage)
|
|
|
+ }
|
|
|
+
|
|
|
+ // 解析图片文件
|
|
|
+ const parseFiles = (filesStr: string) => {
|
|
|
+ try {
|
|
|
+ return JSON.parse(filesStr) || []
|
|
|
+ } catch {
|
|
|
+ return []
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 处理点赞
|
|
|
+ const handleLike = async (id: number, index: number) => {
|
|
|
+ try {
|
|
|
+ const item = shareData[index]
|
|
|
+ if (item.isLiked) {
|
|
|
+ // 如果已点赞,取消点赞
|
|
|
+ await cancelLikeShare(id)
|
|
|
+ messageApi.success('已取消点赞')
|
|
|
+ // 更新本地状态
|
|
|
+ setShareData(prev => prev.map((item, i) =>
|
|
|
+ i === index
|
|
|
+ ? {
|
|
|
+ ...item,
|
|
|
+ likeCount: Math.max(0, item.likeCount - 1),
|
|
|
+ isLiked: false,
|
|
|
+ isDisliked: false // 取消点赞时也取消点踩状态
|
|
|
+ }
|
|
|
+ : item
|
|
|
+ ))
|
|
|
+ } else {
|
|
|
+ // 如果未点赞,点赞
|
|
|
+ await likeShare(id)
|
|
|
+ messageApi.success('已点赞')
|
|
|
+ // 更新本地状态
|
|
|
+ setShareData(prev => prev.map((item, i) =>
|
|
|
+ i === index
|
|
|
+ ? {
|
|
|
+ ...item,
|
|
|
+ likeCount: item.likeCount + 1,
|
|
|
+ isLiked: true,
|
|
|
+ isDisliked: false // 点赞时取消点踩状态
|
|
|
+ }
|
|
|
+ : item
|
|
|
+ ))
|
|
|
+ }
|
|
|
+ } catch (error) {
|
|
|
+ console.error('操作失败:', error)
|
|
|
+ messageApi.error('操作失败')
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 处理点踩
|
|
|
+ const handleDislike = async (id: number, index: number) => {
|
|
|
+ try {
|
|
|
+ const item = shareData[index]
|
|
|
+ if (item.isDisliked) {
|
|
|
+ // 如果已点踩,取消点踩
|
|
|
+ await cancelDislikeShare(id)
|
|
|
+ messageApi.success('已取消点踩')
|
|
|
+ // 更新本地状态
|
|
|
+ setShareData(prev => prev.map((item, i) =>
|
|
|
+ i === index
|
|
|
+ ? {
|
|
|
+ ...item,
|
|
|
+ unlikeCount: Math.max(0, item.unlikeCount - 1),
|
|
|
+ isDisliked: false,
|
|
|
+ isLiked: false // 取消点踩时也取消点赞状态
|
|
|
+ }
|
|
|
+ : item
|
|
|
+ ))
|
|
|
+ } else {
|
|
|
+ // 如果未点踩,点踩
|
|
|
+ await dislikeShare(id)
|
|
|
+ messageApi.success('已点踩')
|
|
|
+ // 更新本地状态
|
|
|
+ setShareData(prev => prev.map((item, i) =>
|
|
|
+ i === index
|
|
|
+ ? {
|
|
|
+ ...item,
|
|
|
+ unlikeCount: item.unlikeCount + 1,
|
|
|
+ isDisliked: true,
|
|
|
+ isLiked: false // 点踩时取消点赞状态
|
|
|
+ }
|
|
|
+ : item
|
|
|
+ ))
|
|
|
+ }
|
|
|
+ } catch (error) {
|
|
|
+ console.error('操作失败:', error)
|
|
|
+ messageApi.error('操作失败')
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 处理转发
|
|
|
+ const handleForward = async (id: number, index: number) => {
|
|
|
+ try {
|
|
|
+ const item = shareData[index]
|
|
|
+ if (item.isForwarded) {
|
|
|
+ // 如果已转发,取消转发
|
|
|
+ await cancelForwardShare(id)
|
|
|
+ messageApi.success('已取消转发')
|
|
|
+ // 更新本地状态
|
|
|
+ setShareData(prev => prev.map((item, i) =>
|
|
|
+ i === index
|
|
|
+ ? {
|
|
|
+ ...item,
|
|
|
+ forwardCount: Math.max(0, item.forwardCount - 1),
|
|
|
+ isForwarded: false
|
|
|
+ }
|
|
|
+ : item
|
|
|
+ ))
|
|
|
+ } else {
|
|
|
+ // 如果未转发,转发
|
|
|
+ await forwardShare(id)
|
|
|
+ messageApi.success('已转发')
|
|
|
+ // 更新本地状态
|
|
|
+ setShareData(prev => prev.map((item, i) =>
|
|
|
+ i === index
|
|
|
+ ? {
|
|
|
+ ...item,
|
|
|
+ forwardCount: item.forwardCount + 1,
|
|
|
+ isForwarded: true
|
|
|
+ }
|
|
|
+ : item
|
|
|
+ ))
|
|
|
+ }
|
|
|
+ } catch (error) {
|
|
|
+ console.error('转发失败:', error)
|
|
|
+ messageApi.error('转发失败')
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 删除分享
|
|
|
+ const handleDeleteShare = async (id: number) => {
|
|
|
+ try {
|
|
|
+ await deleteShare(id)
|
|
|
+ messageApi.success('分享已删除')
|
|
|
+ // 从本地状态中移除该分享
|
|
|
+ setShareData(prev => prev.filter(item => item.id !== id))
|
|
|
+ } catch (error) {
|
|
|
+ console.error('删除分享失败:', error)
|
|
|
+ messageApi.error('删除分享失败')
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 处理评论(暂时跳转到详情页)
|
|
|
+ const handleComment = (id: number) => {
|
|
|
+ // 这里可以跳转到详情页或者打开评论弹窗
|
|
|
+ console.log('评论分享:', id)
|
|
|
+ messageApi.info('评论功能开发中...')
|
|
|
+ }
|
|
|
+
|
|
|
+ // 右键菜单
|
|
|
+ const getContextMenu = (item: ShareItem) => {
|
|
|
+ const menu = (
|
|
|
+ <Menu>
|
|
|
+ <Menu.Item
|
|
|
+ key="delete"
|
|
|
+ danger
|
|
|
+ onClick={() => handleDeleteShare(item.id)}
|
|
|
+ >
|
|
|
+ 删除分享
|
|
|
+ </Menu.Item>
|
|
|
+ </Menu>
|
|
|
+ )
|
|
|
+
|
|
|
+ return menu
|
|
|
+ }
|
|
|
+
|
|
|
+ // 渲染分享内容
|
|
|
+ const renderShareContent = (item: ShareItem, index: number) => {
|
|
|
+ const files = parseFiles(item.files)
|
|
|
+
|
|
|
+ return (
|
|
|
+ <Dropdown
|
|
|
+ overlay={getContextMenu(item)}
|
|
|
+ trigger={['contextMenu']}
|
|
|
+ >
|
|
|
+ <div
|
|
|
+ className="Mine_Friend_content"
|
|
|
+ key={item.id}
|
|
|
+ onContextMenu={(e) => e.preventDefault()} // 阻止默认右键菜单
|
|
|
+ >
|
|
|
<div className="Mine_Friend_content_title">
|
|
|
<Image
|
|
|
width={50}
|
|
|
- src="https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png"
|
|
|
+ height={50}
|
|
|
+ src={item.avatar}
|
|
|
+ preview={false}
|
|
|
/>
|
|
|
<div className="Mine_Friend_content_title_right">
|
|
|
<div className="Mine_Friend_content_title_right_top">
|
|
|
- <div className="Mine_Friend_content_title_username">
|
|
|
- 云音乐VIP
|
|
|
+ <div className="Mine_Friend_content_title_username">{item.artistName}</div>
|
|
|
+ <div className="Mine_Friend_content_title_source">
|
|
|
+ {item.isForward ? '分享网页' : '个人发布'}
|
|
|
</div>
|
|
|
- <div className="Mine_Friend_content_title_source">分享网页</div>
|
|
|
</div>
|
|
|
<div className="Mine_Friend_content_title_right_bottom">
|
|
|
- 12:00
|
|
|
+ {new Date(item.createdAt).toLocaleString()}
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
<div className="Mine_Friend_content_text">
|
|
|
- 🧀奶酪派对时间到!欢喜冤家组合已就位,只等你啦~
|
|
|
- 「猫和老鼠7件套」奇趣装扮礼包上线🥳!
|
|
|
- 头像挂件/图标/启动图/红心动效/点赞动效/DIY播放器背景/皮肤
|
|
|
- “猫”力全开😆萌“鼠”我了
|
|
|
- 戳⬇️链接⬇️直达猫鼠派对现场😍限时解锁主题装扮!
|
|
|
- </div>
|
|
|
- <div className="Mine_Friend_content_image">
|
|
|
- <Image
|
|
|
- width={200}
|
|
|
- src="https://p1.music.126.net/mPpP_sr3mhGdyD0Qb2g8xg==/109951172248792284.jpg?param=0x338&quality=100"
|
|
|
- />
|
|
|
+ {item.content}
|
|
|
</div>
|
|
|
+ {files.length > 0 && (
|
|
|
+ <div className="Mine_Friend_content_image">
|
|
|
+ {files.map((file: any, fileIndex: number) => (
|
|
|
+ <div key={fileIndex} className="image-wrapper">
|
|
|
+ {item.jumpUrls ? (
|
|
|
+ <a href={item.jumpUrls} target="_blank" rel="noopener noreferrer">
|
|
|
+ <Image
|
|
|
+ width={180}
|
|
|
+ src={file.url}
|
|
|
+ preview={false} // 禁用预览
|
|
|
+ />
|
|
|
+ </a>
|
|
|
+ ) : (
|
|
|
+ <Image
|
|
|
+ width={180}
|
|
|
+ src={file.url}
|
|
|
+ preview={{
|
|
|
+ visible: false, // 不显示预览
|
|
|
+ onVisibleChange: (vis) => {
|
|
|
+ if (vis) {
|
|
|
+ // 如果需要自定义预览行为,可以在这里处理
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }}
|
|
|
+ />
|
|
|
+ )}
|
|
|
+ </div>
|
|
|
+ ))}
|
|
|
+ </div>
|
|
|
+ )}
|
|
|
<div className="Mine_Friend_content_bottom">
|
|
|
- <LikeOutlined />
|
|
|
- <DislikeOutlined />
|
|
|
- <span>转发 (1)</span>
|
|
|
- <span>评论 (22)</span>
|
|
|
+ <span
|
|
|
+ className={`action-item ${item.isLiked ? 'liked' : ''}`}
|
|
|
+ onClick={(e) => {
|
|
|
+ e.stopPropagation(); // 阻止事件冒泡到右键菜单
|
|
|
+ handleLike(item.id, index)
|
|
|
+ }}
|
|
|
+ >
|
|
|
+ {item.isLiked ? <LikeOutlined style={{ color: '#1890ff' }} /> : <LikeOutlined />}
|
|
|
+ <span style={{ marginLeft: '4px' }}>{item.likeCount}</span>
|
|
|
+ </span>
|
|
|
+
|
|
|
+ <span
|
|
|
+ className={`action-item ${item.isDisliked ? 'disliked' : ''}`}
|
|
|
+ onClick={(e) => {
|
|
|
+ e.stopPropagation(); // 阻止事件冒泡到右键菜单
|
|
|
+ handleDislike(item.id, index)
|
|
|
+ }}
|
|
|
+ >
|
|
|
+ {item.isDisliked ? <DislikeOutlined style={{ color: '#ff4d4f' }} /> : <DislikeOutlined />}
|
|
|
+ <span style={{ marginLeft: '4px' }}>{item.unlikeCount}</span>
|
|
|
+ </span>
|
|
|
+
|
|
|
+ <span
|
|
|
+ className={`action-item ${item.isForwarded ? 'forwarded' : ''}`}
|
|
|
+ onClick={(e) => {
|
|
|
+ e.stopPropagation(); // 阻止事件冒泡到右键菜单
|
|
|
+ handleForward(item.id, index)
|
|
|
+ }}
|
|
|
+ >
|
|
|
+ {item.isForwarded ? <RetweetOutlined style={{ color: '#52c41a' }} /> : <RetweetOutlined />}
|
|
|
+ <span style={{ marginLeft: '4px' }}>转发 ({item.forwardCount})</span>
|
|
|
+ </span>
|
|
|
+
|
|
|
+ <span
|
|
|
+ className="action-item"
|
|
|
+ onClick={(e) => {
|
|
|
+ e.stopPropagation(); // 阻止事件冒泡到右键菜单
|
|
|
+ handleComment(item.id)
|
|
|
+ }}
|
|
|
+ >
|
|
|
+ <MessageOutlined />
|
|
|
+ <span style={{ marginLeft: '4px' }}>评论 ({item.commentCount})</span>
|
|
|
+ </span>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </Dropdown>
|
|
|
+ )
|
|
|
+ }
|
|
|
+
|
|
|
+ return (
|
|
|
+ <div className="Mine_Friend">
|
|
|
+ {contextHolder}
|
|
|
+ <div className="Mine_Friend_left">
|
|
|
+ <div className="Mine_Friend_left_title">
|
|
|
+ <div className="Mine_Friend_left_title_p">笔记</div>
|
|
|
+ <div className="Mine_Friend_left_title_Button">
|
|
|
+ <div className="Mine_Friend_left_title_Button_content" onClick={onopenModal}>
|
|
|
+ <EditOutlined />
|
|
|
+ 发笔记
|
|
|
+ </div>
|
|
|
+ <div
|
|
|
+ className="Mine_Friend_left_title_Button_content"
|
|
|
+ onClick={() => useroute(`/musician/musicianHome`)}
|
|
|
+ >
|
|
|
+ <VideoCameraOutlined /> 发视频
|
|
|
+ </div>
|
|
|
</div>
|
|
|
</div>
|
|
|
+ <div className="Mine_Friend_left_hr" />
|
|
|
+ <div className="notify">
|
|
|
+ <div className="notify_left">你关注的杭盖乐队等2位歌手发布了新作品</div>
|
|
|
+ <div className="notify_right">快去看看{'>'}</div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ {/* 使用 InfiniteScroll 组件实现触底加载 */}
|
|
|
+ <InfiniteScroll
|
|
|
+ dataLength={shareData.length}
|
|
|
+ next={loadMoreData}
|
|
|
+ hasMore={hasMore}
|
|
|
+ loader={<div style={{ textAlign: 'center', padding: '20px' }}>加载中...</div>}
|
|
|
+ endMessage={<div style={{ textAlign: 'center', padding: '20px' }}>没有更多数据了</div>}
|
|
|
+ style={{ overflow: 'none' }} // 移除默认滚动
|
|
|
+ >
|
|
|
+ {/* 渲染分享列表 */}
|
|
|
+ {shareData.map((item, index) => renderShareContent(item, index))}
|
|
|
+ </InfiniteScroll>
|
|
|
</div>
|
|
|
<div className="Mine_Friend_right">
|
|
|
<Myinfo></Myinfo>
|
|
|
<UserStats></UserStats>
|
|
|
<Mine_Friend_recommend></Mine_Friend_recommend>
|
|
|
- <div className='Mine_Friend_right_bottom_p'>添加微博好友,和他们分享音乐</div>
|
|
|
- <div className='Mine_Friend_right_bottom_button'> <Button ><WeiboSquareOutlined /> 绑定新浪微博</Button></div>
|
|
|
-
|
|
|
+ <div className="Mine_Friend_right_bottom_p">添加微博好友,和他们分享音乐</div>
|
|
|
+ <div className="Mine_Friend_right_bottom_button">
|
|
|
+ <Button>
|
|
|
+ <WeiboSquareOutlined /> 绑定新浪微博
|
|
|
+ </Button>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
+
|
|
|
+ <Form
|
|
|
+ form={form}
|
|
|
+ name="note_form"
|
|
|
+ onFinish={onFinish}
|
|
|
+ onFinishFailed={onFinishFailed}
|
|
|
+ autoComplete="off"
|
|
|
+ initialValues={{
|
|
|
+ content: null,
|
|
|
+ files: [],
|
|
|
+ jumpUrls: null
|
|
|
+ }}
|
|
|
+ >
|
|
|
+ <Modal
|
|
|
+ title="分享"
|
|
|
+ closable={{ 'aria-label': 'Custom Close Button' }}
|
|
|
+ open={isModalOpen}
|
|
|
+ onOk={handleOk}
|
|
|
+ onCancel={handleCancel}
|
|
|
+ >
|
|
|
+ <Form.Item
|
|
|
+ name="content"
|
|
|
+ rules={[{ required: true, message: '请输入笔记内容!' }]}
|
|
|
+ >
|
|
|
+ <TextArea
|
|
|
+ showCount
|
|
|
+ maxLength={100}
|
|
|
+ placeholder="disable resize"
|
|
|
+ style={{ height: 120, resize: 'none' }}
|
|
|
+ />
|
|
|
+ </Form.Item>
|
|
|
+ <Form.Item name="jumpUrls">
|
|
|
+ <Input placeholder="请输入点击图片跳转的链接没有则跳过" />
|
|
|
+ </Form.Item>
|
|
|
+ <div style={{ display: 'flex', alignItems: 'center', gap: '16px' }}>
|
|
|
+ <Form.Item name="files" noStyle>
|
|
|
+ <Upload
|
|
|
+ listType="picture-card"
|
|
|
+ fileList={fileList}
|
|
|
+ onChange={handleChange}
|
|
|
+ customRequest={customRequest}
|
|
|
+ >
|
|
|
+ {fileList.length >= 8 ? null : uploadButton}
|
|
|
+ </Upload>
|
|
|
+ </Form.Item>
|
|
|
+
|
|
|
+ <div style={{ flex: 1, display: 'flex', flexDirection: 'column', gap: '8px' }}>
|
|
|
+ {fileList.map(file => (
|
|
|
+ <div
|
|
|
+ key={file.uid}
|
|
|
+ style={{
|
|
|
+ display: 'flex',
|
|
|
+ alignItems: 'center',
|
|
|
+ gap: '8px',
|
|
|
+ padding: '4px 0'
|
|
|
+ }}
|
|
|
+ >
|
|
|
+ <Image width={24} src={file.url} preview={false} />
|
|
|
+ <span style={{ fontSize: '12px', color: '#666' }}>{file.name}</span>
|
|
|
+ </div>
|
|
|
+ ))}
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </Modal>
|
|
|
+ </Form>
|
|
|
</div>
|
|
|
)
|
|
|
}
|
|
|
+
|
|
|
export default Mine_Friend
|