mirror of
https://github.com/Funkoala14/CreatorCenter_OOIN.git
synced 2025-06-07 20:38:14 +08:00
353 lines
18 KiB
JavaScript
353 lines
18 KiB
JavaScript
import { createAsyncThunk, createSlice } from '@reduxjs/toolkit';
|
||
import api from '@/services/api';
|
||
import { setNotificationBarMessage } from './notificationBarSlice';
|
||
|
||
const mockTemplates = [
|
||
{
|
||
id: 1,
|
||
name: 'TikTok 达播',
|
||
type: 'initial',
|
||
platform: 'TikTok',
|
||
service: '直播 - 达播',
|
||
message: `Hi {tiktok id},
|
||
This is {sender name} from OOIN Media. We've been impressed by your amazing content on TikTok, and several of our partner brands are interested in collaborating with you on paid campaigns.
|
||
Could you please share your rate for a single TikTok video? Additionally, do you offer any bundle discounts if we're looking to collaborate on multiple videos?`,
|
||
},
|
||
{
|
||
id: 2,
|
||
name: 'TikTok 达播',
|
||
type: 'initial',
|
||
platform: 'TikTok',
|
||
service: '直播 - 达播',
|
||
message: `Hi {tiktok id},
|
||
This is {sender name} from OOIN Media. We've been impressed by your amazing content on TikTok, and several of our partner brands are interested in collaborating with you on paid campaigns.
|
||
Could you please share your rate for a single TikTok video? Additionally, do you offer any bundle discounts if we're looking to collaborate on multiple videos?`,
|
||
},
|
||
{
|
||
id: 3,
|
||
name: 'TikTok 达播',
|
||
type: 'initial',
|
||
platform: 'TikTok',
|
||
service: '直播 - 达播',
|
||
message: `Hi {tiktok id},
|
||
This is {sender name} from OOIN Media. We've been impressed by your amazing content on TikTok, and several of our partner brands are interested in collaborating with you on paid campaigns.
|
||
Could you please share your rate for a single TikTok video? Additionally, do you offer any bundle discounts if we're looking to collaborate on multiple videos?`,
|
||
},
|
||
{
|
||
id: 4,
|
||
name: 'TikTok 达播',
|
||
type: 'initial',
|
||
platform: 'TikTok',
|
||
service: '直播 - 达播',
|
||
message: `Hi {tiktok id},
|
||
This is {sender name} from OOIN Media. We've been impressed by your amazing content on TikTok, and several of our partner brands are interested in collaborating with you on paid campaigns.
|
||
Could you please share your rate for a single TikTok video? Additionally, do you offer any bundle discounts if we're looking to collaborate on multiple videos?`,
|
||
},
|
||
{
|
||
id: 5,
|
||
name: 'TikTok 达播',
|
||
type: 'initial',
|
||
platform: 'TikTok',
|
||
service: '直播 - 达播',
|
||
message: `Hi {tiktok id},
|
||
This is {sender name} from OOIN Media. We've been impressed by your amazing content on TikTok, and several of our partner brands are interested in collaborating with you on paid campaigns.
|
||
Could you please share your rate for a single TikTok video? Additionally, do you offer any bundle discounts if we're looking to collaborate on multiple videos?`,
|
||
},
|
||
{
|
||
id: 6,
|
||
name: 'TikTok 达播',
|
||
type: 'bargain',
|
||
platform: 'TikTok',
|
||
service: '直播 - 达播',
|
||
message: `Hi {tiktok id},
|
||
This is {sender name} from OOIN Media. We've been impressed by your amazing content on TikTok, and several of our partner brands are interested in collaborating with you on paid campaigns.
|
||
Could you please share your rate for a single TikTok video? Additionally, do you offer any bundle discounts if we're looking to collaborate on multiple videos?`,
|
||
},
|
||
{
|
||
id: 7,
|
||
name: 'TikTok 达播',
|
||
type: 'script',
|
||
platform: 'TikTok',
|
||
service: '直播 - 达播',
|
||
message: `Hi {tiktok id},
|
||
This is {sender name} from OOIN Media. We've been impressed by your amazing content on TikTok, and several of our partner brands are interested in collaborating with you on paid campaigns.
|
||
Could you please share your rate for a single TikTok video? Additionally, do you offer any bundle discounts if we're looking to collaborate on multiple videos?`,
|
||
},
|
||
{
|
||
id: 8,
|
||
name: 'TikTok 达播',
|
||
type: 'cooperation',
|
||
platform: 'TikTok',
|
||
service: '直播 - 达播',
|
||
message: `Hi {tiktok id},
|
||
This is {sender name} from OOIN Media. We've been impressed by your amazing content on TikTok, and several of our partner brands are interested in collaborating with you on paid campaigns.
|
||
Could you please share your rate for a single TikTok video? Additionally, do you offer any bundle discounts if we're looking to collaborate on multiple videos?`,
|
||
},
|
||
];
|
||
const mockInboxList = [
|
||
{
|
||
id: 1,
|
||
name: 'John',
|
||
avatar: 'https://api.dicebear.com/7.x/micah/svg?seed=1',
|
||
email: 'john.doe@example.com',
|
||
date: '2025-05-09 10:00:00',
|
||
status: 'unread',
|
||
message: 'Proident non lorem ex...',
|
||
unreadMessageCount: 0,
|
||
},
|
||
{
|
||
id: 2,
|
||
name: 'Jane',
|
||
avatar: 'https://api.dicebear.com/7.x/micah/svg?seed=2',
|
||
email: 'jane.doe@example.com',
|
||
date: '2025-05-09 10:00:00',
|
||
status: 'read',
|
||
message: 'Proident non lorem ex...',
|
||
unreadMessageCount: 2,
|
||
},
|
||
{
|
||
id: 3,
|
||
name: 'Michelle',
|
||
avatar: 'https://api.dicebear.com/7.x/micah/svg?seed=3',
|
||
email: 'michelle.doe@example.com',
|
||
date: '2025-05-05 10:00:00',
|
||
status: 'unread',
|
||
message: 'Proident non lorem ex...',
|
||
unreadMessageCount: 0,
|
||
},
|
||
{
|
||
id: 4,
|
||
name: 'Alex',
|
||
avatar: 'https://api.dicebear.com/7.x/micah/svg?seed=4',
|
||
email: 'alex.doe@example.com',
|
||
date: '2025-05-03 10:00:00',
|
||
status: 'read',
|
||
message: 'Proident non lorem ex...',
|
||
unreadMessageCount: 0,
|
||
},
|
||
];
|
||
|
||
const mockChatHistory = [
|
||
{
|
||
id: '7',
|
||
role: 'user',
|
||
content: '我想了解这个系统的功能',
|
||
created_at: '2025-03-21 03:33:49',
|
||
},
|
||
{
|
||
id: '8',
|
||
role: 'assistant',
|
||
content:
|
||
'当然!为了更好地帮助你,我需要了解你指的是哪个系统。你可以提供以下信息吗?\n\n1. **系统的名称**:你提到的系统具体叫什么名字? \n2. **系统的用途**:它是用于什么领域的?比如,是企业管理、教育、医疗、技术开发,还是其他? \n3. **你的具体需求**:你想了解系统的哪些功能?是整体功能概述,还是某个特定模块的功能? \n\n提供这些信息后,我可以更详细地为你解答!',
|
||
created_at: '2025-03-21 03:33:49',
|
||
},
|
||
{
|
||
id: '11',
|
||
role: 'user',
|
||
content: '操作系统的功能',
|
||
created_at: '2025-03-21 06:39:46',
|
||
},
|
||
{
|
||
id: '12',
|
||
role: 'assistant',
|
||
content:
|
||
'操作系统(Operating System,OS)是管理计算机硬件与软件资源的系统软件,为用户和应用程序提供接口,并协调和控制计算机系统的运行。其主要功能包括以下几个方面:\n\n---\n\n### 1. **进程管理**\n - **进程调度**:管理和分配CPU时间,决定哪个进程在何时运行。\n - **进程创建与终止**:创建、销毁和监控进程。\n - **进程同步**:协调多个进程的执行,避免冲突。\n - **进程通信**:提供进程间通信的机制。\n\n---\n\n### 2. **内存管理**\n - **内存分配与回收**:为程序和数据分配内存,并在程序结束时回收内存。\n - **内存保护**:防止一个进程访问另一个进程的内存空间。\n - **虚拟内存**:通过分页或分段技术扩展可用内存。\n - **地址映射**:将逻辑地址转换为物理地址。\n\n---\n\n### 3. **文件管理**\n - **文件存储与检索**:管理文件的存储位置和访问方式。\n - **目录管理**:组织文件的目录结构。\n - **文件保护**:控制文件的访问权限。\n - **磁盘管理**:管理磁盘空间和文件存储。\n\n---\n\n### 4. **设备管理**\n - **设备驱动**:管理与硬件设备的交互。\n - **设备分配**:分配和释放设备资源。\n - **缓冲与缓存**:提高设备访问效率。\n - **I/O控制**:管理输入输出操作。\n\n---\n\n### 5. **用户接口**\n - **命令行界面(CLI)**:通过文本命令与系统交互。\n - **图形用户界面(GUI)**:通过图形化界面与系统交互。\n - **应用程序接口(API)**:为应用程序提供系统调用接口。\n\n---\n\n### 6. **安全与保护**\n - **身份验证**:验证用户身份。\n - **访问控制**:限制用户对资源的访问权限。\n - **加密与解密**:保护数据安全。\n - **审计与日志**:记录系统活动,便于监控和追踪。\n\n---\n\n### 7. **网络管理**\n - **网络通信**:管理网络连接和数据传输。\n - **资源共享**:支持网络资源共享(如文件、打印机)。\n - **网络安全**:保护网络通信的安全性。\n\n---\n\n### 8. **系统性能监控**\n - **资源监控**:监控CPU、内存、磁盘等资源的使用情况。\n - **性能优化**:调整系统参数以提高性能。\n - **错误检测与恢复**:检测系统错误并尝试恢复。\n\n---\n\n### 9. **多用户支持**\n - **用户管理**:创建和管理用户账户。\n - **资源隔离**:确保不同用户的资源相互隔离。\n - **优先级管理**:为不同用户或任务分配优先级。\n\n---\n\n### 10. **时间管理**\n - **系统时钟**:维护系统时间。\n - **任务调度**:基于时间调度任务(如定时任务)。\n\n---\n\n操作系统通过这些功能,实现了对计算机资源的有效管理和高效利用,为用户和应用程序提供了稳定、可靠的环境。',
|
||
created_at: '2025-03-21 06:39:46',
|
||
},
|
||
{
|
||
id: '13',
|
||
role: 'user',
|
||
content:
|
||
'Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a, tellus. Phasellus viverra nulla ut metus varius laoreet. Quisque rutrum. Aenean imperdiet. Etiam ultricies nisi vel augue. Curabitur ullamcorper ultricies nisi. Nam eget dui. Etiam rhoncus. Maecenas tempus, tellus eget condimentum rhoncus, sem quam semper libero, sit amet adipiscing sem neque sed ipsum. Nam quam nunc, blandit vel, luctus pulvinar, hendrerit id, lorem. Maecenas nec odio et ante tincidunt tempus. Donec vitae sapien ut libero venenatis faucibus. Nullam quis ante. Etiam sit amet orci eget eros faucibus tincidunt. Duis leo. Sed fringilla mauris sit amet nibh. Donec sodales sagittis magna. Sed consequat, leo eget bibendum sodales, augue velit cursus nunc,',
|
||
created_at: '2025-03-22 06:39:46',
|
||
},
|
||
];
|
||
|
||
export const fetchInboxList = createAsyncThunk('inbox/fetchInboxList', async (query, { rejectWithValue }) => {
|
||
try {
|
||
const response = await api.get('/chat-history/get_negotiation_chats/', { params: query });
|
||
if (response.code === 200) {
|
||
return response.data;
|
||
} else {
|
||
throw new Error(response.message);
|
||
}
|
||
} catch (error) {
|
||
return rejectWithValue(error.message);
|
||
}
|
||
});
|
||
|
||
export const deleteConversation = createAsyncThunk(
|
||
'inbox/deleteConversation',
|
||
async (id, { rejectWithValue, dispatch }) => {
|
||
try {
|
||
const response = await api.delete('/chat-history/delete_conversation/', {
|
||
params: { conversation_id: id },
|
||
});
|
||
if (response.code === 200) {
|
||
dispatch(setNotificationBarMessage({ message: response.message, type: 'success' }));
|
||
dispatch(fetchInboxList({}));
|
||
return response.data;
|
||
}
|
||
throw new Error(response.message);
|
||
} catch (error) {
|
||
dispatch(setNotificationBarMessage({ message: error.message, type: 'error' }));
|
||
return rejectWithValue(error.message);
|
||
}
|
||
}
|
||
);
|
||
|
||
export const fetchChatHistory = createAsyncThunk('inbox/fetchChatHistory', async (id) => {
|
||
await new Promise((resolve) => setTimeout(resolve, 500));
|
||
return { chatHistory: mockChatHistory, chatId: id };
|
||
});
|
||
|
||
export const fetchTemplates = createAsyncThunk('inbox/fetchTemplates', async (query, { rejectWithValue }) => {
|
||
try {
|
||
const response = await api.get('/template/', { params: query });
|
||
if (response.code === 200) {
|
||
return response.data.results;
|
||
} else {
|
||
throw new Error(response.message);
|
||
}
|
||
} catch (error) {
|
||
return rejectWithValue(error.message);
|
||
}
|
||
});
|
||
|
||
export const editTemplateThunk = createAsyncThunk(
|
||
'inbox/editTemplate',
|
||
async (formData, { rejectWithValue, dispatch }) => {
|
||
try {
|
||
const response = await api.put(`/template/${formData.id}/`, formData);
|
||
if (response.code === 200) {
|
||
return response.data;
|
||
} else {
|
||
throw new Error(response.message);
|
||
}
|
||
} catch (error) {
|
||
dispatch(setNotificationBarMessage({ message: error.message, type: 'error' }));
|
||
return rejectWithValue(error.message);
|
||
}
|
||
}
|
||
);
|
||
|
||
export const addTemplateThunk = createAsyncThunk(
|
||
'inbox/addTemplate',
|
||
async (formData, { rejectWithValue, dispatch }) => {
|
||
try {
|
||
const response = await api.post('/template/', formData);
|
||
if (response.code === 200 || response.code === 201) {
|
||
return response.data;
|
||
} else {
|
||
throw new Error(response.message);
|
||
}
|
||
} catch (error) {
|
||
dispatch(setNotificationBarMessage({ message: error.message, type: 'error' }));
|
||
return rejectWithValue(error.message);
|
||
}
|
||
}
|
||
);
|
||
|
||
export const getTemplateDetail = createAsyncThunk('inbox/getTemplateDetail', async (id, { rejectWithValue }) => {
|
||
try {
|
||
const response = await api.get(`/template/${id}/`);
|
||
if (response.code === 200) {
|
||
return response.data;
|
||
} else {
|
||
throw new Error(response.message);
|
||
}
|
||
} catch (error) {
|
||
return rejectWithValue(error.message);
|
||
}
|
||
});
|
||
|
||
const initialState = {
|
||
inboxList: [],
|
||
inboxStatus: 'idle', // 'idle' | 'loading' | 'succeeded' | 'failed'
|
||
chatStatus: 'idle', // 'idle' | 'loading' | 'succeeded' | 'failed'
|
||
error: null,
|
||
selectedChat: {},
|
||
templates: [],
|
||
templatesStatus: 'idle', // 'idle' | 'loading' | 'succeeded' | 'failed'
|
||
};
|
||
|
||
const inboxSlice = createSlice({
|
||
name: 'inbox',
|
||
initialState,
|
||
reducers: {},
|
||
extraReducers: (builder) => {
|
||
builder
|
||
.addCase(fetchInboxList.pending, (state) => {
|
||
state.inboxStatus = 'loading';
|
||
})
|
||
.addCase(fetchInboxList.fulfilled, (state, action) => {
|
||
state.inboxStatus = 'succeeded';
|
||
state.inboxList = action.payload.results;
|
||
})
|
||
.addCase(fetchInboxList.rejected, (state, action) => {
|
||
state.inboxStatus = 'failed';
|
||
state.error = action.payload;
|
||
})
|
||
.addCase(fetchChatHistory.pending, (state) => {
|
||
state.chatStatus = 'loading';
|
||
})
|
||
.addCase(fetchChatHistory.fulfilled, (state, action) => {
|
||
state.chatStatus = 'succeeded';
|
||
const { chatHistory, chatId } = action.payload;
|
||
state.inboxList.forEach((item) => {
|
||
if (item.id === chatId) {
|
||
item.chatHistory = chatHistory;
|
||
}
|
||
});
|
||
state.selectedChat = { ...state.selectedChat, chatHistory };
|
||
})
|
||
.addCase(fetchChatHistory.rejected, (state, action) => {
|
||
state.chatStatus = 'failed';
|
||
state.error = action.payload;
|
||
})
|
||
.addCase(fetchTemplates.rejected, (state, action) => {
|
||
state.templatesStatus = 'failed';
|
||
state.error = action.payload;
|
||
})
|
||
.addCase(fetchTemplates.pending, (state) => {
|
||
state.templatesStatus = 'loading';
|
||
})
|
||
.addCase(fetchTemplates.fulfilled, (state, action) => {
|
||
state.templatesStatus = 'succeeded';
|
||
state.templates = action.payload;
|
||
})
|
||
.addCase(editTemplateThunk.pending, (state) => {
|
||
state.templatesStatus = 'loading';
|
||
})
|
||
.addCase(editTemplateThunk.fulfilled, (state, action) => {
|
||
state.templatesStatus = 'succeeded';
|
||
state.templates = action.payload;
|
||
})
|
||
.addCase(editTemplateThunk.rejected, (state, action) => {
|
||
state.templatesStatus = 'failed';
|
||
state.error = action.payload;
|
||
})
|
||
.addCase(addTemplateThunk.pending, (state) => {
|
||
state.templatesStatus = 'loading';
|
||
})
|
||
.addCase(addTemplateThunk.fulfilled, (state, action) => {
|
||
state.templatesStatus = 'succeeded';
|
||
state.templates = action.payload;
|
||
})
|
||
.addCase(addTemplateThunk.rejected, (state, action) => {
|
||
state.templatesStatus = 'failed';
|
||
state.error = action.payload;
|
||
})
|
||
.addCase(getTemplateDetail.fulfilled, (state, action) => {
|
||
const template = state.templates.find((item) => item.id === action.payload.id);
|
||
if (template) {
|
||
Object.assign(template, action.payload);
|
||
}
|
||
});
|
||
},
|
||
});
|
||
|
||
export const { selectChat, resetSelectedChat } = inboxSlice.actions;
|
||
|
||
export default inboxSlice.reducer;
|