import React, { useEffect, useState, useReducer } from 'react'; import { PageContainer } from '@ant-design/pro-layout'; import { Row, Col, Space, Button, Input, Table, Card, Select, message, Tooltip, Image, Tag, } from 'antd'; import { getPlate, getPosts, enablePosts } from '@/services/tieba'; import { useClassify } from '@/hooks/tieba/index'; import type { initstateType, actionType } from './data'; import DetailModal from './modal'; import { Record } from 'immutable'; const request = (url: string): Promise => { return new Promise((resolve, reject) => { const xhr = new XMLHttpRequest(); xhr.open('GET', url, false); xhr.onreadystatechange = function () { if (xhr.readyState === 4 && xhr.status === 200) { resolve(xhr.response); } else { reject(new Error('置换contenturl出错')); } }; xhr.send(); }).catch((e) => e); }; const sendRequest = async (url: string) => await request(url); const initstate: initstateType = { curPage: 1, barId: '', categoryId: '', label: '', type: 0, }; const reduce: React.Reducer = (state, action): initstateType => { const { type, value } = action; switch (type) { case 'reload': return { ...state, barId: '', categoryId: '', label: '' }; case 'barId': return { ...state, barId: value }; case 'curPage': return { ...state, curPage: value }; case 'categoryId': return { ...state, categoryId: value }; case 'label': return { ...state, label: value }; case 'type': return { ...state, type: value }; default: throw new Error('posts/index.tsx => reduce 参数 action 下, type类型不存在'); } }; const Posts: React.FC = () => { const [plateList, setPlateList] = useState([]); const [postsList, setPostsList] = useState([]); const classIfy = useClassify(); const [total, setTotal] = useState(0); const [queryParams, dispatch] = useReducer(reduce, initstate); const [visible, setVissible] = useState(false); const [detailData, setDetailData] = useState({}); const [loading, setLoading] = useState(false); useEffect(() => { GetPlate(); GetPosts(); }, []); useEffect(() => { GetPosts(); }, [queryParams.curPage]); // 获取贴吧板块 const GetPlate = async (): Promise => { const { code, data } = await getPlate({ curPage: queryParams.curPage, pageSize: 10 }); if (code === 0) { const { records } = data; setPlateList(records); } }; // 获取帖子 const GetPosts = async (): Promise => { setLoading(true); const { code, data } = await getPosts(queryParams); setLoading(false); if (code === 0) { const { records, total: Total } = data; // eslint-disable-next-line no-plusplus for (let i = 0; i < records.length; i++) { // eslint-disable-next-line no-await-in-loop // records[i].content = records[i].contentUrl && await sendRequest(records[i]?.contentUrl) } console.log(records, 'recordsrecordsrecords'); setPostsList(records); setTotal(Total); } }; // 封禁帖子 const EnablePosts = async (record: Record): Promise => { const $par = { id: record.id, enable: record.enable ? 0 : 1, type: queryParams.type, }; const { code } = await enablePosts($par); if (code === 0) { message.success('操作成功'); } GetPosts(); }; // 打开弹窗 const openModal = (record: Record): void => { setVissible(true); setDetailData(record); }; // 关闭弹窗 const closeModal = (): void => setVissible(false); // 选择barId const changeBarId = (value: string): void => dispatch({ type: 'barId', value }); // 填写标题 const changeLabel = (e: React.ChangeEvent) => dispatch({ type: 'label', value: e.target.value }); return ( record.id} loading={loading} style={{ marginTop: 20 }} dataSource={postsList} pagination={{ total, onChange: (page) => dispatch({ type: 'curPage', value: page }) }} > ( {text} )} /> ) => ( {record.content} )} > ) => ( {record.authorName} {/* {record.createTime} */} )} /> ) => ( /pages/article/index.... )} /> ) => ( openModal(record)}>查看 EnablePosts(record)}>{record.enable ? '封禁' : '解封'} )} />
{/* 详情弹窗 */}
); }; export default Posts;