update: 新闻素材页面添加全局选择

This commit is contained in:
LittleBoy 2024-12-23 22:01:15 +08:00
parent a5b8e9cd87
commit 7bf1378e90
6 changed files with 160 additions and 15 deletions

View File

@ -33,7 +33,8 @@
"react-player": "^2.16.0",
"react-router-dom": "^6.28.0",
"sass": "^1.81.0",
"tcplayer.js": "^5.2.0"
"tcplayer.js": "^5.2.0",
"zustand": "^5.0.2"
},
"devDependencies": {
"@types/file-saver": "^2.0.7",

136
src/hooks/useCache.ts Normal file
View File

@ -0,0 +1,136 @@
import {create} from "zustand"
type StoreInstance<T> = {
cache: T[];
clear: () => void;
set: (values: T[]) => void;
add: (value: T) => void;
remove: (value: T) => void
}
// function createStore<T>(set: Get<StoreApi<StoreInstance<Id>>, "setState", never>){
// return {
// data: [],
// set: (values: T[]) => {
// set(s=>{
//
// })
// // set()
// set({data: values})
// },
// clear: () => {
// set({data: []})
// },
// add: (id: Id) => {
// set((state) => ({
// data: [...state.data, id]
// }))
// },
// remove: (id: Id) => {
// set((state) => ({
// data: state.data.filter((item) => item != id)
// }))
// }
// }
// }
// export const useIndexIdCache = create<StoreInstance<Id>>((set) => {
// //createStore<Id>(set)
// return {
// data: [],
// xxx: () => {
// set(s => {
// s.data = [...s.data, 1]
// })
// }
// }
// });
export const useIndexArrayCache = create<StoreInstance<Id>>((set) => ({
cache: [],
set: (values: Id[]) => {
set({cache: values})
},
clear: () => {
set({cache: []})
},
add: (id: Id) => {
set((state) => ({
cache: [...(state.cache || []), id]
}))
},
remove: (id: Id) => {
set((state) => ({
cache: (state.cache || []).filter((item) => item != id)
}))
}
}))
//
// export const useCacheStore = create<{
// [dataKey: string]: Id[];
// clear: (key: string) => void;
// set: (key: string, value: Id[]) => void;
// add: (key: string, id: Id) => void;
// remove: (key: string, id: Id) => void
// }>((set) => ({
// data: {},
// clear: (key: string) => {
// set(s => {
// s[key] = []
// return s;
// })
// },
// set: (key: string, value: Id[]) => {
// set((s) => {
// s[key] = value
// return s;
// })
// },
// add: (key: string, id: Id) => {
// console.log(id, 'add cache', key)
// set((s) => {
// if (!s[key]) {
// s[key] = [];
// }
// s[key].push(id)
// return s;
// })
// },
// remove: (key: string, id: Id) => {
// set((s) => {
// if (!s[key]) {
// return s;
// }
// s[key] = s[key].filter((item) => item != id)
// return s;
// })
// }
// }))
//
// function useCache(key: 'index' | 'edit') {
// //{data,set,add,remove,clear}
// const store = useCacheStore()
//
// return {
// store,
// data: store[key],
// getCache: () => {
// // return cache.data[key] || []
// return store[key] || [];
// },
// setCache: (value: Id[]) => {
// store.set(key, value)
// },
// clearCache: () => {
// store.clear(key)
// },
// addCache: (id: Id, addSame = false) => {
// if (!addSame && store[key]?.includes(id)) return;
// console.log(id, 'add cache')
// store.add(key, id)
// },
// removeCache: (id: Id) => {
// store.remove(key, id)
// }
// }
// }
//
// export default useCache

View File

@ -1,18 +1,20 @@
import {App} from "antd";
import {showToast} from "@/components/message.ts";
import {useState} from "react";
import {push2article} from "@/service/api/news.ts";
import {IconArrowRight} from "@/components/icons";
import {useNavigate} from "react-router-dom";
import {useIndexArrayCache} from "@/hooks/useCache.ts";
export default function ButtonPushNews2Article(props: { ids: Id[]; }) {
const {modal} = App.useApp();
// const {modal} = App.useApp();
const [loading,setLoading] = useState(false)
const navigate = useNavigate();
const {set} = useIndexArrayCache();
const handlePush = () => {
setLoading(true)
push2article(props.ids).then(() => {
showToast('推送成功', 'success')
set([])
navigate('/edit')
}).catch(() => {
showToast('推送失败', 'error')
@ -26,12 +28,13 @@ export default function ButtonPushNews2Article(props: { ids: Id[]; }) {
showToast('请选择要推入编辑的新闻', 'warning')
return
}
modal.confirm({
title: '操作提示',
content: '是否确定推入素材编辑界面?',
onOk: handlePush,
centered: true
})
handlePush();
// modal.confirm({
// title: '操作提示',
// content: '是否确定推入素材编辑界面?',
// onOk: handlePush,
// centered: true
// })
}
return (
<button

View File

@ -23,7 +23,6 @@ const DEFAULT_STATE = {
}
export default function SearchPanel({onSearch}: SearchPanelProps) {
const tags = useArticleTags();
const [panelVisible, {set}] = useBoolean(false)
const [params, setParams] = useSetState<ApiArticleSearchParams>({
pagination,
time_flag:1
@ -127,7 +126,7 @@ export default function SearchPanel({onSearch}: SearchPanelProps) {
/>
<TimeSelect
className="w-[120px] ml-1"
value={params.time_flag || 1}
value={typeof(params.time_flag) != "undefined" ? params.time_flag : 1}
onChange={handleTimeFilter}
/>
</div>

View File

@ -12,13 +12,16 @@ import ButtonNewsDownload from "@/pages/news/components/button-news-download.tsx
import {clsx} from "clsx";
import InfiniteScroller, {InfiniteScrollerRef} from "@/components/scoller/infinite-scroller.tsx";
import ButtonToTop from "@/components/scoller/button-to-top.tsx";
import { useIndexArrayCache} from "@/hooks/useCache.ts";
export default function NewsIndex() {
const [params, setParams] = useState<ApiArticleSearchParams>({
pagination: {page: 1, limit: 12},time_flag:1
})
const [checkedId, setCheckedId] = useState<Id[]>([])
// const [checkedId, setCheckedId] = useState<Id[]>([])
const {cache:checkedId,set:setCheckedId} = useIndexArrayCache()
const [activeNews, setActiveNews] = useState<NewsInfo>()
const [state, setState] = useState<{
@ -32,8 +35,7 @@ export default function NewsIndex() {
onSuccess: (_data) => {
if (params.pagination.page === 1) {
setData(_data)
setCheckedId([])
setState({checkAll: false})
setState({checkAll: checkedId && _data.list && checkedId.length === _data.list.length})
} else {
setData({
pagination: _data.pagination,
@ -69,7 +71,6 @@ export default function NewsIndex() {
setCheckedId([...checkedId, id])
}
}
return (<div className={'container pb-5'}>
<SearchPanel onSearch={setParams}/>
{activeNews && <Modal

View File

@ -3513,3 +3513,8 @@ yocto-queue@^0.1.0:
version "0.1.0"
resolved "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"
integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==
zustand@^5.0.2:
version "5.0.2"
resolved "https://registry.npmmirror.com/zustand/-/zustand-5.0.2.tgz#f7595ada55a565f1fd6464f002a91e701ee0cfca"
integrity sha512-8qNdnJVJlHlrKXi50LDqqUNmUbuBjoKLrYQBnoChIbVph7vni+sY+YpvdjXG9YLd/Bxr6scMcR+rm5H3aSqPaw==