UNPKG

phx-react

Version:

PHX REACT

137 lines 5.8 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.useMainwrapRealtimeCounts = void 0; const tslib_1 = require("tslib"); const react_1 = require("react"); const socket_io_client_1 = require("socket.io-client"); const required_action_api_1 = require("../components/require-action/required-action-api"); const getEnvPublic_1 = tslib_1.__importDefault(require("../../Func/getEnvPublic")); const INAPP_NOTI_SOCKET_CONFIG = { namespace: '/core-socket', path: '/core-socket', joinRoomEvent: 'join_room', realtimeEvent: 'inapp-noti-count', }; const INAPP_NOTI_ROOM_ID = { realtime: 'inapp-noti-count', }; const isRecord = (value) => typeof value === 'object' && value !== null; const getPublicHostname = async () => { const response = await (0, getEnvPublic_1.default)(); return isRecord(response) && typeof response.HOSTNAME === 'string' ? response.HOSTNAME : undefined; }; const getDashboardCountPayload = (payload) => { if (!isRecord(payload) || !isRecord(payload.data)) return undefined; return isRecord(payload.data.dashboard) ? payload.data.dashboard : undefined; }; const getUnreadCount = (payload) => { const dashboardPayload = getDashboardCountPayload(payload); return dashboardPayload && typeof dashboardPayload.unread_count === 'number' ? dashboardPayload.unread_count : undefined; }; const parseDashboardRequiredActionPayload = (payload) => { const dashboardPayload = getDashboardCountPayload(payload); const counts = dashboardPayload && isRecord(dashboardPayload.required_action_count) ? dashboardPayload.required_action_count : {}; return (0, required_action_api_1.parseRequiredActionPayload)({ counts }); }; const getPayloadUserId = (payload) => { if (!isRecord(payload)) return undefined; const userId = Number(payload.user_id); return Number.isFinite(userId) ? userId : undefined; }; const isPayloadForCurrentUser = (payload, currentUserId) => { const payloadUserId = getPayloadUserId(payload); if (!payloadUserId) return true; return payloadUserId === currentUserId; }; const getSocketHeaders = (accessToken, hostname) => ({ authorization: `Bearer ${accessToken}`, ...(hostname ? { hostname } : {}), module: 'inapp-noti', }); const joinRealtimeRooms = (socket) => { socket.emit(INAPP_NOTI_SOCKET_CONFIG.joinRoomEvent, { roomId: INAPP_NOTI_ROOM_ID.realtime, }); }; const bindRealtimeSocketEvents = ({ currentUserId, onConnectionChange, onRequiredAction, onUnreadCount, socket, }) => { socket.on('connect', () => { onConnectionChange === null || onConnectionChange === void 0 ? void 0 : onConnectionChange(true); joinRealtimeRooms(socket); }); socket.on('connect_error', () => { onConnectionChange === null || onConnectionChange === void 0 ? void 0 : onConnectionChange(false); }); socket.on('disconnect', () => { onConnectionChange === null || onConnectionChange === void 0 ? void 0 : onConnectionChange(false); }); socket.io.on('reconnect', () => { onConnectionChange === null || onConnectionChange === void 0 ? void 0 : onConnectionChange(true); }); socket.on(INAPP_NOTI_SOCKET_CONFIG.realtimeEvent, (payload) => { if (!isPayloadForCurrentUser(payload, currentUserId)) { return; } onUnreadCount(getUnreadCount(payload)); onRequiredAction(parseDashboardRequiredActionPayload(payload)); }); }; const setupRealtimeSocket = async ({ accessToken, currentUserId, onConnectionChange, onRequiredAction, onUnreadCount, }) => { const socketUrl = `${process.env.NEXT_PUBLIC_API_GATEWAY}${INAPP_NOTI_SOCKET_CONFIG.namespace}`; const hostname = await getPublicHostname(); const socket = (0, socket_io_client_1.io)(socketUrl, { path: INAPP_NOTI_SOCKET_CONFIG.path, extraHeaders: getSocketHeaders(accessToken, hostname), }); bindRealtimeSocketEvents({ currentUserId, onConnectionChange, onRequiredAction, onUnreadCount, socket, }); return socket; }; const useMainwrapRealtimeCounts = ({ accessToken, currentUserId, enabled, onConnectionChange, onRequiredAction, onUnreadCount, }) => { (0, react_1.useEffect)(() => { if (!enabled || !accessToken || !currentUserId) { onConnectionChange === null || onConnectionChange === void 0 ? void 0 : onConnectionChange(false); return; } let socket = null; let isDisposed = false; const connectSocket = async () => { try { if (isDisposed) return; const nextSocket = await setupRealtimeSocket({ accessToken, currentUserId, onConnectionChange, onRequiredAction, onUnreadCount, }); if (isDisposed) { nextSocket.disconnect(); return; } socket = nextSocket; } catch (_a) { onConnectionChange === null || onConnectionChange === void 0 ? void 0 : onConnectionChange(false); } }; void connectSocket(); return () => { isDisposed = true; onConnectionChange === null || onConnectionChange === void 0 ? void 0 : onConnectionChange(false); socket === null || socket === void 0 ? void 0 : socket.disconnect(); }; }, [enabled, accessToken, currentUserId, onConnectionChange, onRequiredAction, onUnreadCount]); }; exports.useMainwrapRealtimeCounts = useMainwrapRealtimeCounts; //# sourceMappingURL=use-mainwrap-realtime-counts.js.map