拆分reducer; 整理目录

dev/chat
Lei OT 1 year ago
parent 4552d0ad58
commit 2b6cf70f48

@ -1,4 +1,4 @@
import initialState from '@/stores/Conversations/initialState'; import initialState from '@/records/ConversationState';
const NAME_SPACE = 'CONVERSATION/'; const NAME_SPACE = 'CONVERSATION/';

@ -1,14 +1,13 @@
import { useEffect } from 'react'; import { useEffect } from 'react';
import { useParams } from 'react-router-dom'; import { Layout, Spin } from 'antd';
import { Layout, Avatar, Flex, Typography, Spin } from 'antd'; import MessagesHeader from './Components/MessagesHeader';
import Messages from './Components/Messages'; import Messages from './Components/Messages';
import InputBox from './Components/InputBox'; import InputBox from './Components/InputBox';
import ConversationsList from './Components/ConversationsList'; import ConversationsList from './Components/ConversationsList';
import CustomerProfile from './Components/CustomerProfile'; import CustomerProfile from './Components/CustomerProfile';
import LocalTimeClock from './Components/LocalTimeClock';
import { useConversationContext } from '@/stores/Conversations/ConversationContext'; import { useConversationState, useConversationDispatch } from '@/stores/ConversationContext';
import { sentNewMessage } from '@/stores/Conversations/ConversationActions'; import { sentNewMessage } from '@/actions/ConversationActions';
import { sentMsgTypeMapped } from '@/lib/msgUtils'; import { sentMsgTypeMapped } from '@/lib/msgUtils';
import './Conversations.css'; import './Conversations.css';
@ -22,7 +21,8 @@ const { Sider, Content, Header, Footer } = Layout;
const ChatWindow = () => { const ChatWindow = () => {
const { loginUser } = useAuthContext(); const { loginUser } = useAuthContext();
const { userId } = loginUser; const { userId } = loginUser;
const { dispatch, websocket, errors, currentConversation } = useConversationContext(); const { websocket, errors } = useConversationState();
const dispatch = useConversationDispatch();
console.log(errors, 'errors;;;;;;;;;;;;;;;;;;;;;;;;'); console.log(errors, 'errors;;;;;;;;;;;;;;;;;;;;;;;;');
useEffect(() => { useEffect(() => {
@ -50,19 +50,7 @@ const ChatWindow = () => {
<Content style={{ maxHeight: 'calc(100vh - 198px)', height: 'calc(100vh - 198px)' }}> <Content style={{ maxHeight: 'calc(100vh - 198px)', height: 'calc(100vh - 198px)' }}>
<Layout className='h-full'> <Layout className='h-full'>
<Header className='ant-layout-sider-light ant-card p-1 h-auto'> <Header className='ant-layout-sider-light ant-card p-1 h-auto'>
<Flex gap={16}> <MessagesHeader />
{currentConversation.customer_name && <Avatar src={`https://api.dicebear.com/7.x/avataaars/svg?seed=${currentConversation.customer_name}`} />}
<Flex flex={'1'} justify='space-between'>
<Flex vertical={true} justify='space-between'>
<Typography.Text strong>{currentConversation.customer_name}</Typography.Text>
<Typography.Text>{currentConversation.whatsapp_phone_number}</Typography.Text>
</Flex>
<Flex vertical={true} justify='space-between'>
<Typography.Text>{/* <LocalTimeClock /> <Typography.Text strong>{order?.location} </Typography.Text> */}</Typography.Text>
{/* <Typography.Text>{customerDateTime}</Typography.Text> */}
</Flex>
</Flex>
</Flex>
</Header> </Header>
<Content style={{ maxHeight: '74vh', height: '74vh' }}> <Content style={{ maxHeight: '74vh', height: '74vh' }}>
<div className='h-full overflow-y-auto'> <div className='h-full overflow-y-auto'>

@ -1,8 +1,8 @@
import { useRef, useEffect, useState } from 'react'; import { useRef, useEffect, useState } from 'react';
import { useParams, useNavigate } from "react-router-dom"; import { useParams, useNavigate } from "react-router-dom";
import { List, Avatar, Flex } from 'antd'; import { List, Avatar, Flex } from 'antd';
import { useConversationContext } from '@/stores/Conversations/ConversationContext'; import { useConversationState, useConversationDispatch } from '@/stores/ConversationContext';
import { fetchCustomerProfile, receivedCustomerProfile, setCurrentConversation, addConversationList, setActiveConversations } from '@/stores/Conversations/ConversationActions' import { fetchCustomerProfile, receivedCustomerProfile, setCurrentConversation, addConversationList, setActiveConversations } from '@/actions/ConversationActions'
import { ChatList } from 'react-chat-elements'; import { ChatList } from 'react-chat-elements';
import { isEmpty, pick } from '@/utils/utils'; import { isEmpty, pick } from '@/utils/utils';
import { v4 as uuid } from 'uuid'; import { v4 as uuid } from 'uuid';
@ -12,7 +12,8 @@ import { v4 as uuid } from 'uuid';
const Conversations = (() => { const Conversations = (() => {
const { order_sn } = useParams(); const { order_sn } = useParams();
const navigate = useNavigate(); const navigate = useNavigate();
const { dispatch, conversationsList, } = useConversationContext(); const {conversationsList} = useConversationState();
const dispatch = useConversationDispatch();
const [chatlist, setChatlist] = useState([]); const [chatlist, setChatlist] = useState([]);
useEffect(() => { useEffect(() => {
setChatlist( setChatlist(

@ -1,6 +1,6 @@
import { Card, Flex, Avatar, Typography, Radio, Button, Table } from 'antd'; import { Card, Flex, Avatar, Typography, Radio, Button, Table } from 'antd';
import { useAuthContext } from '@/stores/AuthContext.js'; import { useAuthContext } from '@/stores/AuthContext.js';
import { useConversationContext } from '@/stores/Conversations/ConversationContext'; import { useConversationState } from '@/stores/ConversationContext';
import { HomeOutlined, LoadingOutlined, SettingFilled, SmileOutlined, SyncOutlined, PhoneOutlined, MailOutlined, WhatsAppOutlined, SmileTwoTone } from '@ant-design/icons'; import { HomeOutlined, LoadingOutlined, SettingFilled, SmileOutlined, SyncOutlined, PhoneOutlined, MailOutlined, WhatsAppOutlined, SmileTwoTone } from '@ant-design/icons';
import CreatePayment from './CreatePayment'; import CreatePayment from './CreatePayment';
@ -22,7 +22,7 @@ const orderStatus = [
const { Meta } = Card; const { Meta } = Card;
const CustomerProfile = (() => { const CustomerProfile = (() => {
const { errors, customerOrderProfile: orderInfo } = useConversationContext(); const { customerOrderProfile: orderInfo } = useConversationState();
const { loginUser: currentUser } = useAuthContext(); const { loginUser: currentUser } = useAuthContext();
const { quotes, contact, last_contact, ...order } = orderInfo; const { quotes, contact, last_contact, ...order } = orderInfo;

@ -1,14 +1,14 @@
import React, { useEffect, useState } from 'react'; import React, { useEffect, useState } from 'react';
import { Input, Button, Tabs, List, Space, Popover, Flex } from 'antd'; import { Input, Button, Tabs, List, Space, Popover, Flex } from 'antd';
// import { Input } from 'react-chat-elements'; // import { Input } from 'react-chat-elements';
import { useConversationContext } from '@/stores/Conversations/ConversationContext'; import { useConversationState } from '@/stores/ConversationContext';
import { LikeOutlined, MessageOutlined, StarOutlined, SendOutlined, PlusOutlined, PlusCircleOutlined } from '@ant-design/icons'; import { LikeOutlined, MessageOutlined, StarOutlined, SendOutlined, PlusOutlined, PlusCircleOutlined } from '@ant-design/icons';
import { cloneDeep, getNestedValue, isEmpty } from '@/utils/utils'; import { cloneDeep, getNestedValue, isEmpty } from '@/utils/utils';
import { v4 as uuid } from 'uuid'; import { v4 as uuid } from 'uuid';
import { whatsappTemplatesParamMapped } from '@/lib/msgUtils'; import { whatsappTemplatesParamMapped } from '@/lib/msgUtils';
const InputBox = ({ onSend }) => { const InputBox = ({ onSend }) => {
const { dispatch, currentConversation, templates } = useConversationContext(); const { currentConversation, templates } = useConversationState();
const [textContent, setTextContent] = useState(''); const [textContent, setTextContent] = useState('');
const talkabled = !isEmpty(currentConversation.sn); const talkabled = !isEmpty(currentConversation.sn);

@ -1,6 +1,6 @@
import { useEffect, useState } from 'react'; import { useEffect, useState } from 'react';
import { Typography } from 'antd'; import { Typography } from 'antd';
import { useConversationContext } from '@/stores/Conversations/ConversationContext'; import { useConversationState } from '@/stores/ConversationContext';
import dayjs from 'dayjs'; import dayjs from 'dayjs';
import utc from 'dayjs/plugin/utc'; import utc from 'dayjs/plugin/utc';
import timezone from 'dayjs/plugin/timezone'; import timezone from 'dayjs/plugin/timezone';
@ -9,7 +9,7 @@ dayjs.extend(utc);
dayjs.extend(timezone); dayjs.extend(timezone);
const LocalTimeClock = ((props) => { const LocalTimeClock = ((props) => {
const { customerOrderProfile: orderInfo } = useConversationContext(); const { customerOrderProfile: orderInfo } = useConversationState();
const [customerDateTime, setCustomerDateTime] = useState(); const [customerDateTime, setCustomerDateTime] = useState();

@ -1,10 +1,10 @@
import { useEffect, useState, useRef } from 'react'; import { useEffect, useState, useRef } from 'react';
import { List, Avatar, Timeline, Image } from 'antd'; import { List, Avatar, Timeline, Image } from 'antd';
import { MessageBox } from 'react-chat-elements'; import { MessageBox } from 'react-chat-elements';
import { useConversationContext } from '@/stores/Conversations/ConversationContext'; import { useConversationState } from '@/stores/ConversationContext';
const Messages = (() => { const Messages = (() => {
const { activeConversations, currentConversation } = useConversationContext(); const { activeConversations, currentConversation } = useConversationState();
const messagesList = activeConversations[currentConversation.sn] || []; const messagesList = activeConversations[currentConversation.sn] || [];
console.log('messagesList----------------------------------------------------', messagesList); console.log('messagesList----------------------------------------------------', messagesList);

@ -0,0 +1,27 @@
import { createContext, useContext, useEffect, useState } from 'react';
import { useConversationState } from '@/stores/ConversationContext';
import { Flex, Typography, Avatar } from 'antd';
import LocalTimeClock from './LocalTimeClock';
const MessagesHeader = () => {
const { currentConversation } = useConversationState();
return (
<>
<Flex gap={16}>
{currentConversation.customer_name && <Avatar src={`https://api.dicebear.com/7.x/avataaars/svg?seed=${currentConversation.customer_name}`} />}
<Flex flex={'1'} justify='space-between'>
<Flex vertical={true} justify='space-between'>
<Typography.Text strong>{currentConversation.customer_name}</Typography.Text>
<Typography.Text>{currentConversation.whatsapp_phone_number}</Typography.Text>
</Flex>
<Flex vertical={true} justify='space-between'>
<Typography.Text>{/* <LocalTimeClock /> <Typography.Text strong>{order?.location} </Typography.Text> */}</Typography.Text>
{/* <Typography.Text>{customerDateTime}</Typography.Text> */}
</Flex>
</Flex>
</Flex>
</>
);
};
export default MessagesHeader;

@ -1,9 +1,9 @@
import { createContext, useContext, useEffect, useState } from 'react'; import { createContext, useContext, useEffect, useState } from 'react';
import { Popover, Flex, Button, List, Popconfirm } from 'antd'; import { Popover, Flex, Button, List, Popconfirm } from 'antd';
import { useConversationContext } from '@/stores/Conversations/ConversationContext'; import { useConversationState } from '@/stores/ConversationContext';
const QuotesHistory = ((props) => { const QuotesHistory = ((props) => {
const { customerOrderProfile: orderInfo } = useConversationContext(); const { customerOrderProfile: orderInfo } = useConversationState();
const { quotes, ...order } = orderInfo; const { quotes, ...order } = orderInfo;
const [open, setOpen] = useState(false); const [open, setOpen] = useState(false);

@ -1,6 +1,6 @@
import { useContext, useReducer, useEffect } from 'react'; import { useContext, useReducer, useEffect } from 'react';
import { ConversationContext, ConversationStateContext, ConversationDispatchContext } from '@/stores/Conversations/ConversationContext'; import { ConversationStateContext, ConversationDispatchContext } from '@/stores/ConversationContext';
import ConversationReducer from '@/stores/Conversations/ConversationReducer'; import ConversationReducer from '@/reducers/ConversationReducer';
import { import {
initWebsocket, initWebsocket,
addError, addError,
@ -11,8 +11,8 @@ import {
setActiveConversations, setActiveConversations,
updateMessageItem, updateMessageItem,
receivedNewMessage, receivedNewMessage,
} from '@/stores/Conversations/ConversationActions'; } from '@/actions/ConversationActions';
import initialState from '@/stores/Conversations/initialState'; import initialState from '@/records/ConversationState';
import { AuthContext } from '@/stores/AuthContext'; import { AuthContext } from '@/stores/AuthContext';
@ -86,12 +86,12 @@ const ConversationProvider = ({ children }) => {
} }
console.log('handleMessage*******************'); console.log('handleMessage*******************');
}; };
return <ConversationContext.Provider value={{ ...state, dispatch }}>{children}</ConversationContext.Provider>; // return <ConversationContext.Provider value={{ ...state, dispatch }}>{children}</ConversationContext.Provider>;
// return ( return (
// <ConversationDispatchContext.Provider value={dispatch}> <ConversationStateContext.Provider value={{ ...state }}>
// <ConversationStateContext.Provider value={{...state}}>{children}</ConversationStateContext.Provider> <ConversationDispatchContext.Provider value={dispatch}>{children}</ConversationDispatchContext.Provider>
// </ConversationDispatchContext.Provider> </ConversationStateContext.Provider>
// ); );
}; };
export default ConversationProvider; export default ConversationProvider;

Loading…
Cancel
Save