Newer
Older
bathroom-plugin / mattermost / webapp / src / index.jsx
import React from 'react';

class BathroomComponent extends React.Component
{
    constructor(props)
    {
        super(props);
        this.state = {doors:{}};
    }
    componentDidMount()
    {
        Registry.registerWebSocketEventHandler("custom_com.mattermost.bathroom_updated", this.updateDoors.bind(this));
        this.updateDoors();
    }
    componentWillUnmount()
    {
        Registry.unregisterWebSocketEventHandler("custom_com.mattermost.bathroom_updated");
    }
    async updateDoors(msg)
    {
        var url = Store.getState().entities.general.config.SiteURL + "/plugins/com.mattermost.bathroom/status";
        var res = await fetch(url);
        var json = await res.json();
        this.setState({"doors":json});
    }
    render()
    {
        if (!this.state.doors) return;
        var columns = 6;
        var keys = Object.keys(this.state.doors).sort();
        var width = (Math.floor(100 / columns)) + "%";
        var widthPx = "23px";
        var elems = [];
        var row = [];
        for (var i = 0; i < keys.length /*(Math.floor(keys.length / 6) + 1) * 6*/; i++)
        {
            var img = null;
            if (i < keys.length)
            {
                var door = this.state.doors[keys[i]];
                var imgFile = null;
                switch (door)
                {
                    default:
                    case "unknown":
                        imgFile = "/static/emoji/2753.png";
                        break;
                    case "open":
                        imgFile = "/static/emoji/1f6bd.png";
                        break;
                    case "closed":
                        imgFile = "/static/emoji/26d4-fe0f.png";
                        break;
                }
                img = <img src={imgFile} width="100%" style={{"padding":"2px"}}/>
            }
            row.push(<td width={widthPx}>{img}</td>);
            if (i % columns == columns - 1 || i == keys.length - 1)
            {
                elems.push(<React.Fragment>{[...row]}</React.Fragment>);
                row.length = 0;
            }
        }
        return (
            //<table width="100%">
            <div style={{"text-align": "center", width:"100%", "padding-top":"10px"}}>
            <table style={{"margin-left":"auto", "margin-right":"auto"}}>
            {elems}
            </table>
            </div>
        );
    }
}

var Registry = null;
var Store = null;

class BathroomMonitorPlugin
{
    initialize(registry, store)
    {
        Registry = registry;
        Store = store;
        registry.registerLeftSidebarHeaderComponent(BathroomComponent);
    }
}

window.registerPlugin('com.mattermost.bathroom', new BathroomMonitorPlugin());