- 新增 React + TDesign 管理端(sau_web_react),替代历史 Vue 前端 - 后端接入 11 平台登录/发布(视频+图文),check_cookie 扩展全平台 - 异步发布任务 + 实时进度监控 + 发布日志 - Open API 开放体系(API Key 鉴权 + 7 个开放接口 + API 文档页) - 账号单/批量校验与批量删除 - 全局配置(登录方式 + 发布静默模式) - 统一浏览器为系统 Chrome,品牌文案统一为 EveryPublish
48 lines
1.3 KiB
TypeScript
48 lines
1.3 KiB
TypeScript
import { createSlice, createAsyncThunk, PayloadAction } from '@reduxjs/toolkit';
|
|
import { RootState } from '../store';
|
|
import { getMaterials as fetchMaterials, IMaterial } from 'services/material';
|
|
|
|
const namespace = 'material';
|
|
|
|
interface IMaterialState {
|
|
loading: boolean;
|
|
materials: IMaterial[];
|
|
}
|
|
|
|
const initialState: IMaterialState = {
|
|
loading: false,
|
|
materials: [],
|
|
};
|
|
|
|
export const loadMaterials = createAsyncThunk(namespace + '/loadMaterials', async () => {
|
|
return await fetchMaterials();
|
|
});
|
|
|
|
const materialSlice = createSlice({
|
|
name: namespace,
|
|
initialState,
|
|
reducers: {
|
|
setMaterials: (state, action: PayloadAction<IMaterial[]>) => {
|
|
state.materials = action.payload;
|
|
},
|
|
},
|
|
extraReducers: (builder) => {
|
|
builder
|
|
.addCase(loadMaterials.pending, (state) => {
|
|
state.loading = true;
|
|
})
|
|
.addCase(loadMaterials.fulfilled, (state, action) => {
|
|
state.loading = false;
|
|
state.materials = action.payload;
|
|
})
|
|
.addCase(loadMaterials.rejected, (state) => {
|
|
state.loading = false;
|
|
});
|
|
},
|
|
});
|
|
|
|
export const { setMaterials } = materialSlice.actions;
|
|
export const selectMaterials = (state: RootState) => state.material.materials;
|
|
export const selectMaterialLoading = (state: RootState) => state.material.loading;
|
|
export default materialSlice.reducer;
|