UNPKG

@salad-labs/loopz-typescript

Version:
178 lines 6.96 kB
"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