diff --git a/src/components/TemplateList.jsx b/src/components/TemplateList.jsx index 9a009f0..9ac12c3 100644 --- a/src/components/TemplateList.jsx +++ b/src/components/TemplateList.jsx @@ -3,7 +3,7 @@ import { Button } from 'react-bootstrap'; import { useSelector } from 'react-redux'; import Spinning from './Spinning'; -export default function TemplateList({ activeTab }) { +export default function TemplateList({ activeTab, openModal, setFormData }) { const { templates, templatesStatus } = useSelector((state) => state.inbox); // 如果正在加载,显示加载中 if (templatesStatus === 'loading') { @@ -16,6 +16,17 @@ export default function TemplateList({ activeTab }) { ); } + const handleEdit = (template) => { + setFormData({ + id: template.id, + mission: template.type, + platform: template.platform, + service: template.service, + template: template.message, + }); + openModal(); + } + return (
{templates.map((template) => ( @@ -37,7 +48,7 @@ export default function TemplateList({ activeTab }) { - {template.name}
- diff --git a/src/pages/InboxTemplate.jsx b/src/pages/InboxTemplate.jsx index 0b7ef5e..c84550a 100644 --- a/src/pages/InboxTemplate.jsx +++ b/src/pages/InboxTemplate.jsx @@ -1,13 +1,21 @@ -import { Button } from 'react-bootstrap'; +import { Button, Form, Modal } from 'react-bootstrap'; import SearchBar from '../components/SearchBar'; -import { Plus } from 'lucide-react'; +import { Footprints, Plus } from 'lucide-react'; import React, { useEffect, useState } from 'react'; import { useDispatch } from 'react-redux'; -import { fetchTemplates } from '../store/slices/inboxSlice'; +import { addTemplateApi, editTemplateApi, fetchTemplates } from '../store/slices/inboxSlice'; import TemplateList from '../components/TemplateList'; export default function InboxTemplate() { const [activeTab, setActiveTab] = useState('all'); + const [showAddTemplateModal, setShowAddTemplateModal] = useState(false); + const [showEditTemplateModal, setShowEditTemplateModal] = useState(false); + const [formData, setFormData] = useState({ + mission: '', + platform: '', + service: '', + template: '', + }); const dispatch = useDispatch(); useEffect(() => { @@ -18,7 +26,7 @@ export default function InboxTemplate() {
- @@ -58,7 +66,138 @@ export default function InboxTemplate() { 合作追踪
- + setShowEditTemplateModal(true)} + setFormData={setFormData} + /> + setShowAddTemplateModal(false)} + type='add' + formData={formData} + setFormData={setFormData} + /> + setShowEditTemplateModal(false)} + type='edit' + formData={formData} + setFormData={setFormData} + /> ); } + +function AddTemplateModal({ show, formData, setFormData, handleClose, type = 'add' }) { + const dispatch = useDispatch(); + + const handleChange = (e) => { + setFormData({ + ...formData, + [e.target.name]: e.target.value, + }); + }; + + const handleSubmit = () => { + console.log(formData); + if(type === 'add') { + dispatch(addTemplateApi(formData)); + } else { + dispatch(editTemplateApi(formData)); + } + }; + + useEffect(() => { + }, [formData]); + + return ( + + + {type === 'add' ? 'Add Template' : 'Edit Template'} + + +
+ + Mission + + + + + + + + + + Platform + + + + + + + + + + 合作模式 + + + + + + + + + + + Template + + +
+
+ + + + +
+ ); +} diff --git a/src/store/slices/inboxSlice.js b/src/store/slices/inboxSlice.js index ce8ad1a..3f4f10e 100644 --- a/src/store/slices/inboxSlice.js +++ b/src/store/slices/inboxSlice.js @@ -191,6 +191,25 @@ export const fetchTemplates = createAsyncThunk('inbox/fetchTemplates', async (ty return mockTemplates.filter((item) => item.type === type); }); +export const editTemplateApi = createAsyncThunk('inbox/editTemplate', async (formData) => { + await new Promise((resolve) => setTimeout(resolve, 500)); + const {id, ...rest} = formData; + const index = mockTemplates.findIndex((item) => item.id === id); + mockTemplates[index] = { ...mockTemplates[index], ...rest }; + return mockTemplates; +}); + +export const addTemplateApi = createAsyncThunk('inbox/addTemplate', async (formData) => { + await new Promise((resolve) => setTimeout(resolve, 500)); + const newTemplate = { + id: mockTemplates.length + 1, + message: formData.template, + ...formData, + }; + const newTemplates = [...mockTemplates, newTemplate]; + return newTemplates; +}); + const initialState = { inboxList: [], inboxStatus: 'idle', // 'idle' | 'loading' | 'succeeded' | 'failed' @@ -252,6 +271,29 @@ const inboxSlice = createSlice({ .addCase(fetchTemplates.fulfilled, (state, action) => { state.templatesStatus = 'succeeded'; state.templates = action.payload; + }) + .addCase(editTemplateApi.pending, (state) => { + state.templatesStatus = 'loading'; + }) + .addCase(editTemplateApi.fulfilled, (state, action) => { + state.templatesStatus = 'succeeded'; + state.templates = action.payload; + }) + .addCase(editTemplateApi.rejected, (state, action) => { + state.templatesStatus = 'failed'; + state.error = action.error.message; + }) + .addCase(addTemplateApi.pending, (state) => { + state.templatesStatus = 'loading'; + }) + .addCase(addTemplateApi.fulfilled, (state, action) => { + console.log(action.payload); + state.templatesStatus = 'succeeded'; + state.templates = action.payload; + }) + .addCase(addTemplateApi.rejected, (state, action) => { + state.templatesStatus = 'failed'; + state.error = action.error.message; }); }, });