CFE-4 Merging from develop
This commit is contained in:
67
src/lib/app/contexts/socket.jsx
Normal file
67
src/lib/app/contexts/socket.jsx
Normal file
@@ -0,0 +1,67 @@
|
||||
import {createContext, useEffect, useMemo, useRef, useState} from "react";
|
||||
import {io} from "socket.io-client";
|
||||
import useUser from "@/lib/app/hooks/useUser";
|
||||
import {useTranslations} from "next-intl";
|
||||
import {toast} from "react-toastify";
|
||||
import PowerIcon from "@mui/icons-material/Power";
|
||||
import PowerOffIcon from "@mui/icons-material/PowerOff";
|
||||
|
||||
export const SocketContext = createContext()
|
||||
|
||||
export const SocketProvider = ({children}) => {
|
||||
const {user, isAuth} = useUser()
|
||||
const [connectionError, setConnectionError] = useState(false)
|
||||
const socketToastId = useRef(null);
|
||||
const t = useTranslations()
|
||||
const socket = useMemo(() => io(process.env.NEXT_PUBLIC_SERVER_SOCKET_URL, {
|
||||
autoConnect: false,
|
||||
auth: {
|
||||
token: ""
|
||||
}
|
||||
}), [])
|
||||
|
||||
useEffect(() => {
|
||||
if (isAuth) {
|
||||
socket.auth.token = user.telephone_id
|
||||
return
|
||||
}
|
||||
socket.auth.token = ''
|
||||
}, [isAuth]);
|
||||
|
||||
useEffect(() => {
|
||||
const connectErrorHandler = () => {
|
||||
setConnectionError(true)
|
||||
}
|
||||
const connectHandler = () => {
|
||||
setConnectionError(false)
|
||||
}
|
||||
socket.on("connect_error", connectErrorHandler);
|
||||
socket.on("connect", connectHandler);
|
||||
|
||||
return () => {
|
||||
socket.off("connect_error", connectErrorHandler);
|
||||
socket.off("connect", connectHandler);
|
||||
}
|
||||
}, []);
|
||||
|
||||
useEffect(() => {
|
||||
if (!connectionError) {
|
||||
toast.update(socketToastId.current, {
|
||||
type: toast.TYPE.SUCCESS,
|
||||
render: t('socket_is_connect_message'),
|
||||
autoClose: 2000,
|
||||
closeButton: true,
|
||||
closeOnClick: true,
|
||||
icon: <PowerIcon/>
|
||||
});
|
||||
return
|
||||
}
|
||||
socketToastId.current = toast.warn(t('socket_is_not_connect_message'), {
|
||||
draggable: false,
|
||||
autoClose: false, closeButton: false, closeOnClick: false, icon: <PowerOffIcon/>
|
||||
})
|
||||
|
||||
}, [connectionError]);
|
||||
|
||||
return <SocketContext.Provider value={{socket}}>{children}</SocketContext.Provider>
|
||||
}
|
||||
@@ -75,7 +75,7 @@ export const UserProvider = ({children}) => {
|
||||
headers: {authorization: `Bearer ${state.token}`},
|
||||
})
|
||||
.then(({data}) => {
|
||||
if (typeof callback === "function") callback(data);
|
||||
if (typeof callback === "function") callback(data.data);
|
||||
})
|
||||
.catch(error => {
|
||||
if (error.response) {
|
||||
|
||||
@@ -1,29 +1,5 @@
|
||||
import {useEffect, useState} from "react";
|
||||
|
||||
function getNetworkConnection() {
|
||||
return (
|
||||
navigator.connection ||
|
||||
navigator.mozConnection ||
|
||||
navigator.webkitConnection ||
|
||||
null
|
||||
);
|
||||
}
|
||||
|
||||
function getNetworkConnectionInfo() {
|
||||
const connection = getNetworkConnection();
|
||||
if (!connection) {
|
||||
return {};
|
||||
}
|
||||
return {
|
||||
rtt: connection.rtt,
|
||||
type: connection.type,
|
||||
saveData: connection.saveData,
|
||||
downLink: connection.downLink,
|
||||
downLinkMax: connection.downLinkMax,
|
||||
effectiveType: connection.effectiveType,
|
||||
};
|
||||
}
|
||||
|
||||
function useNetwork() {
|
||||
const [state, setState] = useState(() => {
|
||||
return {
|
||||
@@ -51,7 +27,7 @@ function useNetwork() {
|
||||
window.removeEventListener("offline", handleOffline);
|
||||
};
|
||||
}, []);
|
||||
|
||||
|
||||
return state;
|
||||
}
|
||||
|
||||
|
||||
10
src/lib/app/hooks/useSocket.jsx
Normal file
10
src/lib/app/hooks/useSocket.jsx
Normal file
@@ -0,0 +1,10 @@
|
||||
import {useContext} from "react";
|
||||
import {SocketContext} from "@/lib/app/contexts/socket";
|
||||
|
||||
const useSocket = () => {
|
||||
const {socket} = useContext(SocketContext)
|
||||
|
||||
return socket
|
||||
}
|
||||
|
||||
export default useSocket
|
||||
31
src/lib/callWidget/contexts/answers.jsx
Normal file
31
src/lib/callWidget/contexts/answers.jsx
Normal file
@@ -0,0 +1,31 @@
|
||||
import {createContext, useReducer, useState} from "react";
|
||||
|
||||
const reducer = (state, action) => {
|
||||
switch (action.type) {
|
||||
case "CHANGE_ACTIVE_TAB":
|
||||
return state.map((answer, index) => action.newValue === index ? {...answer, active: true} : {
|
||||
...answer,
|
||||
active: false
|
||||
});
|
||||
case "CHANGE_LIST":
|
||||
return [...action.newList]
|
||||
default:
|
||||
return state;
|
||||
}
|
||||
}
|
||||
export const AnswersContext = createContext()
|
||||
export const AnswersProvider = ({children}) => {
|
||||
const [openCallDialog, setOpenCallDialog] = useState(false)
|
||||
const [activeTab, setActiveTab] = useState(0)
|
||||
const [state, dispatch] = useReducer(reducer, []);
|
||||
|
||||
return <AnswersContext.Provider
|
||||
value={{
|
||||
openCallDialog,
|
||||
setOpenCallDialog,
|
||||
state,
|
||||
dispatch,
|
||||
activeTab,
|
||||
setActiveTab
|
||||
}}>{children}</AnswersContext.Provider>
|
||||
}
|
||||
38
src/lib/callWidget/hooks/useAnswers.jsx
Normal file
38
src/lib/callWidget/hooks/useAnswers.jsx
Normal file
@@ -0,0 +1,38 @@
|
||||
import {useContext} from "react";
|
||||
import {AnswersContext} from "@/lib/callWidget/contexts/answers";
|
||||
|
||||
const useAnswers = () => {
|
||||
const {state, dispatch, activeTab, setActiveTab} = useContext(AnswersContext)
|
||||
|
||||
const changeActiveTabAnswers = (newValue) => {
|
||||
dispatch({type: 'CHANGE_ACTIVE_TAB', newValue})
|
||||
setActiveTab(newValue)
|
||||
}
|
||||
|
||||
const newAnswerTab = (data) => {
|
||||
const newAnswer = {
|
||||
id: data.id,
|
||||
phone_number: data.phone_number,
|
||||
active: true
|
||||
}
|
||||
const newList = [...state, newAnswer]
|
||||
dispatch({type: 'CHANGE_LIST', newList})
|
||||
changeActiveTabAnswers(newList.length - 1)
|
||||
}
|
||||
|
||||
const closeAnswerTab = (id) => {
|
||||
const index = state.findIndex(answer => answer.id === id)
|
||||
const newIndex = index === 0 ? 0 : index - 1
|
||||
const newList = [...state]
|
||||
newList.splice(index, 1);
|
||||
if (newList.length !== 0) {
|
||||
newList[newIndex].active = true
|
||||
setActiveTab(newIndex)
|
||||
}
|
||||
dispatch({type: 'CHANGE_LIST', newList})
|
||||
}
|
||||
|
||||
return {answersList: state, activeTab, setActiveTab, changeActiveTabAnswers, closeAnswerTab, newAnswerTab}
|
||||
}
|
||||
|
||||
export default useAnswers
|
||||
10
src/lib/callWidget/hooks/useCallDialog.jsx
Normal file
10
src/lib/callWidget/hooks/useCallDialog.jsx
Normal file
@@ -0,0 +1,10 @@
|
||||
import {useContext} from "react";
|
||||
import {AnswersContext} from "@/lib/callWidget/contexts/answers";
|
||||
|
||||
const useCallDialog = () => {
|
||||
const {openCallDialog, setOpenCallDialog} = useContext(AnswersContext)
|
||||
|
||||
return {openCallDialog, setOpenCallDialog}
|
||||
}
|
||||
|
||||
export default useCallDialog
|
||||
Reference in New Issue
Block a user