@salad-labs/loopz-typescript
Version:
The Official Loopz TypeScript SDK
178 lines • 6.96 kB
JavaScript
"use client";
import React, { useCallback, useEffect, useRef, useState, } from "react";
import { useLoopz, useLoopzAuth } from "../hooks";
import { LoopzChatContext } from "../context/loopzchatcontext";
export const LoopzChatProvider = ({ autoConnect, autoSync, syncingTime, children }) => {
const { instance, initialized } = useLoopz();
const { isAuthenticated, account } = useLoopzAuth();
const hasStartedConnection = useRef(false);
const hasStartedSynchronization = useRef(false);
const chatStatusRef = useRef();
const [chatStatus, setChatStatus] = useState({
canChat: false,
isConnecting: false,
isConnected: false,
isSyncing: false,
isSynced: false,
});
const setCanChat = useCallback((canChat) => setChatStatus((cs) => (Object.assign(Object.assign({}, cs), { canChat }))), []);
const setIsConnected = useCallback((isConnected) => setChatStatus((cs) => (Object.assign(Object.assign({}, cs), { isConnected }))), []);
const setIsSynced = useCallback((isSynced) => setChatStatus((cs) => (Object.assign(Object.assign({}, cs), { isSynced }))), []);
const setIsSyncing = useCallback((isSyncing) => setChatStatus((cs) => (Object.assign(Object.assign({}, cs), { isSyncing }))), []);
const setIsConnecting = useCallback((isConnecting) => setChatStatus((cs) => (Object.assign(Object.assign({}, cs), { isConnecting }))), []);
useEffect(() => {
if (!initialized)
return;
setCanChat(instance.chat.clientCanChat());
instance.chat.on("canChat", ({ canChat }) => {
setCanChat(canChat); //<- this setCanChat is the function of this hook, it's not the setCanChat of the chat object instance
}, true //we prevent more than one adding of the listener
);
if (account) {
account.on("onSignupCompleted", () => {
setCanChat(instance.chat.clientCanChat()); //it should be true since this event is called after the authentication. Authentication on signup turns the value of _canChat to true
}, true);
}
}, [initialized, instance, account]);
useEffect(() => {
if (!initialized ||
!isAuthenticated ||
!autoConnect ||
chatStatus.isConnected ||
!chatStatus.canChat ||
hasStartedConnection.current)
return;
hasStartedConnection.current = true;
setChatStatus({
canChat: true,
isConnecting: true,
isConnected: false,
isSyncing: false,
isSynced: false,
});
instance.chat
.connect()
.then(() => setChatStatus({
canChat: true,
isConnecting: false,
isConnected: true,
isSyncing: autoSync !== null && autoSync !== void 0 ? autoSync : false,
isSynced: false,
}))
.catch((error) => {
console.log(error);
hasStartedConnection.current = false;
setChatStatus({
canChat: false,
isConnecting: false,
isConnected: false,
isSyncing: false,
isSynced: false,
});
});
}, [
initialized,
isAuthenticated,
autoConnect,
chatStatus,
instance,
autoSync,
]);
useEffect(() => {
if (!initialized ||
!chatStatus.isConnected ||
chatStatus.isSynced ||
!account ||
hasStartedSynchronization.current)
return;
hasStartedSynchronization.current = true;
if (!autoSync)
return setChatStatus({
canChat: true,
isConnecting: false,
isConnected: true,
isSyncing: false,
isSynced: false,
});
if (account.signupCompleted) {
if (syncingTime)
instance.chat.setSyncingTime(syncingTime);
instance.chat
.sync()
.then(() => setChatStatus({
canChat: true,
isConnecting: false,
isConnected: true,
isSyncing: false,
isSynced: true,
}))
.catch(() => {
hasStartedSynchronization.current = false;
setChatStatus({
canChat: true,
isConnecting: false,
isConnected: true,
isSyncing: false,
isSynced: false,
});
});
}
else {
account.on("onSignupCompleted", () => {
if (syncingTime)
instance.chat.setSyncingTime(syncingTime);
instance.chat
.sync()
.then(() => setChatStatus({
canChat: true,
isConnecting: false,
isConnected: true,
isSyncing: false,
isSynced: true,
}))
.catch(() => {
hasStartedSynchronization.current = false;
setChatStatus({
canChat: true,
isConnecting: false,
isConnected: true,
isSyncing: false,
isSynced: false,
});
});
}, true);
}
}, [initialized, chatStatus, autoSync, syncingTime, instance, account]);
useEffect(() => {
if (!initialized)
return;
const handleDisconnect = () => {
hasStartedConnection.current = false;
hasStartedSynchronization.current = false;
setChatStatus({
canChat: false,
isConnecting: false,
isConnected: false,
isSyncing: false,
isSynced: false,
});
};
instance.chat.on("disconnect", handleDisconnect);
return () => instance.chat.off("disconnect", handleDisconnect);
}, [initialized, instance]);
useEffect(() => {
if (autoConnect || !autoSync)
return;
console.warn("[LoopzProvider]: chatConfig.autoSync has no effect because chatConfig.autoConnect is false");
}, [autoConnect, autoSync]);
useEffect(() => {
chatStatusRef.current = Object.assign(Object.assign({}, chatStatus), { isAuthenticated });
}, [chatStatus, isAuthenticated]);
return (React.createElement(LoopzChatContext.Provider, { value: Object.assign(Object.assign({}, chatStatus), { chatStatusRef,
setCanChat,
setIsConnected,
setIsSynced,
setIsSyncing,
setIsConnecting }) }, children));
};
//# sourceMappingURL=loopzchatprovider.js.map