main

mattermost/focalboard

Last updated at: 29/12/2023 09:40

withWebSockets.tsx

TLDR

This file defines a React component called WithWebSockets that initializes a WebSocket connection and handles authentication. It takes a set of optional properties and renders its children.

Methods

This file does not contain any methods.

Classes

This file does not contain any classes.

// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
import React, {useEffect} from 'react'

import wsClient, {MMWebSocketClient} from '../wsclient'
import {Utils} from '../utils'

type Props = {
    userId?: string
    manifest?: {
        id: string
        version: string
    }
    webSocketClient?: MMWebSocketClient
    children: React.ReactNode
}

// WithWebSockets component initialises the websocket connection if
// it's not yet running and subscribes to the current team
const WithWebSockets = (props: Props): React.ReactElement => {
    const queryString = new URLSearchParams(window.location.search)

    useEffect(() => {
        // if the websocket client was already connected, do nothing
        if (wsClient.state !== 'init') {
            return
        }

        // this is a temporary solution to disable websocket
        // connections on legacy routes, as there is no such thing as
        // an anonymous websocket connection
        if (Utils.isFocalboardLegacy()) {
            return
        }

        if (!Utils.isFocalboardPlugin()) {
            const token = localStorage.getItem('focalboardSessionId') || queryString.get('r') || ''
            if (token) {
                wsClient.authenticate(token)
            }
            wsClient.open()
            return
        }

        if (!props.webSocketClient) {
            Utils.logWarn('Trying to initialise Boards websocket in plugin mode without base connection. Aborting')
            return
        }

        if (!props.manifest?.id || !props.manifest?.version) {
            Utils.logError('Trying to initialise Boards websocket in plugin mode with an incomplete manifest. Aborting')
            return
        }

        wsClient.initPlugin(props.manifest?.id, props.manifest?.version, props.webSocketClient)
        wsClient.open()
    }, [props.webSocketClient])

    useEffect(() => {
        // if we're running on a plugin instance or we don't have a
        // user yet, do nothing
        if (Utils.isFocalboardPlugin() || !props.userId) {
            return
        }

        const token = localStorage.getItem('focalboardSessionId') || queryString.get('r') || ''
        if (wsClient.token !== token) {
            wsClient.authenticate(token)
        }
    }, [props.userId])

    return (
        <>
            {props.children}
        </>
    )
}

export default WithWebSockets