aboutsummaryrefslogtreecommitdiff
path: root/src/client/views/collections/collectionFreeForm/CollectionFreeFormRemoteCursors.tsx
blob: 036745ecac8108101632eec2e386aa7ca5cb7aaa (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
import { computed } from "mobx";
import { observer } from "mobx-react";
import { CollectionViewProps, CursorEntry } from "../CollectionSubView";
import "./CollectionFreeFormView.scss";
import React = require("react");
import v5 = require("uuid/v5");
import { CurrentUserUtils } from "../../../../server/authentication/models/current_user_utils";

@observer
export class CollectionFreeFormRemoteCursors extends React.Component<CollectionViewProps> {
    protected getCursors(): CursorEntry[] {
        let doc = this.props.Document;
        let id = CurrentUserUtils.id;
        let cursors = doc.GetList(KeyStore.Cursors, [] as CursorEntry[]);
        let notMe = cursors.filter(entry => entry.Data[0][0] !== id);
        return id ? notMe : [];
    }

    private crosshairs?: HTMLCanvasElement;
    drawCrosshairs = (backgroundColor: string) => {
        if (this.crosshairs) {
            let c = this.crosshairs;
            let ctx = c.getContext('2d');
            if (ctx) {
                ctx.fillStyle = backgroundColor;
                ctx.fillRect(0, 0, 20, 20);

                ctx.fillStyle = "black";
                ctx.lineWidth = 0.5;

                ctx.beginPath();

                ctx.moveTo(10, 0);
                ctx.lineTo(10, 8);

                ctx.moveTo(10, 20);
                ctx.lineTo(10, 12);

                ctx.moveTo(0, 10);
                ctx.lineTo(8, 10);

                ctx.moveTo(20, 10);
                ctx.lineTo(12, 10);

                ctx.stroke();

                // ctx.font = "10px Arial";
                // ctx.fillText(CurrentUserUtils.email[0].toUpperCase(), 10, 10);
            }
        }
    }
    @computed
    get sharedCursors() {
        return this.getCursors().map(entry => {
            if (entry.Data.length > 0) {
                let id = entry.Data[0][0];
                let email = entry.Data[0][1];
                let point = entry.Data[1];
                this.drawCrosshairs("#" + v5(id, v5.URL).substring(0, 6).toUpperCase() + "22");
                return (
                    <div key={id} className="collectionFreeFormRemoteCursors-cont"
                        style={{ transform: `translate(${point[0] - 10}px, ${point[1] - 10}px)` }}
                    >
                        <canvas className="collectionFreeFormRemoteCursors-canvas"
                            ref={(el) => { if (el) this.crosshairs = el; }}
                            width={20}
                            height={20}
                        />
                        <p className="collectionFreeFormRemoteCursors-symbol">
                            {email[0].toUpperCase()}
                        </p>
                    </div>
                );
            }
        });
    }

    render() {
        return this.sharedCursors;
    }
}