From 3b0c9a8a3282eb3c04123985a0512592fe0affae Mon Sep 17 00:00:00 2001
From: bob <bcz@cs.brown.edu>
Date: Fri, 1 Feb 2019 11:33:59 -0500
Subject: added lightbox for images

---
 src/views/nodes/ImageBox.tsx | 82 ++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 82 insertions(+)
 create mode 100644 src/views/nodes/ImageBox.tsx

(limited to 'src/views/nodes/ImageBox.tsx')

diff --git a/src/views/nodes/ImageBox.tsx b/src/views/nodes/ImageBox.tsx
new file mode 100644
index 000000000..5c0db6cab
--- /dev/null
+++ b/src/views/nodes/ImageBox.tsx
@@ -0,0 +1,82 @@
+import { action, IReactionDisposer, reaction } from "mobx";
+import { baseKeymap } from "prosemirror-commands";
+import { history, redo, undo } from "prosemirror-history";
+import { keymap } from "prosemirror-keymap";
+import { schema } from "prosemirror-schema-basic";
+import { EditorState, Transaction } from "prosemirror-state";
+import { EditorView } from "prosemirror-view";
+import { Document } from "../../fields/Document";
+import { Opt } from "../../fields/Field";
+import { Key, KeyStore } from "../../fields/Key";
+import { TextField } from "../../fields/TextField";
+import { SelectionManager } from "../../util/SelectionManager";
+import { DocumentView, DocumentFieldViewProps } from "./DocumentView";
+import "./ImageBox.scss";
+import React = require("react")
+import Lightbox from 'react-image-lightbox';
+import 'react-image-lightbox/style.css'; // This only needs to be imported once in your app
+
+interface ImageBoxState {
+    photoIndex: number,
+    isOpen: boolean,
+};
+
+export class ImageBox extends React.Component<DocumentFieldViewProps, ImageBoxState> {
+
+    public static LayoutString() { return "<ImageBox doc={Document} containingDocumentView={ContainingDocumentView} fieldKey={DataKey} />"; }
+    private _ref: React.RefObject<HTMLDivElement>;
+    private _wasSelected: boolean = false;
+
+    constructor(props: DocumentFieldViewProps) {
+        super(props);
+
+        this._ref = React.createRef();
+        this.state = {
+            photoIndex: 0,
+            isOpen: false,
+        };
+    }
+
+    componentDidMount() {
+    }
+
+    componentWillUnmount() {
+    }
+
+    onPointerDown = (e: React.PointerEvent): void => {
+        const { containingDocumentView } = this.props;
+        this._wasSelected = SelectionManager.IsSelected(containingDocumentView);
+        let me = this;
+        if (e.buttons === 1 && SelectionManager.IsSelected(me.props.containingDocumentView)) {
+            e.stopPropagation();
+        }
+    }
+
+    render() {
+        const images = [this.props.doc.GetTextField(this.props.fieldKey, ""),];
+        var lightbox = () => {
+            const { photoIndex } = this.state;
+            if (this.state.isOpen && SelectionManager.IsSelected(this.props.containingDocumentView)) {
+                return (<Lightbox
+                    mainSrc={images[photoIndex]}
+                    nextSrc={photoIndex + 1 < images.length ? images[(photoIndex + 1) % images.length] : undefined}
+                    prevSrc={photoIndex - 1 > 0 ? images[(photoIndex + images.length - 1) % images.length] : undefined}
+                    onCloseRequest={() => this.setState({ isOpen: false })}
+                    onMovePrevRequest={() =>
+                        this.setState({ photoIndex: (photoIndex + images.length - 1) % images.length, })
+                    }
+                    onMoveNextRequest={() =>
+                        this.setState({ photoIndex: (photoIndex + 1) % images.length, })
+                    }
+                />)
+            }
+        }
+        return (
+            <div className="imageBox-cont" onPointerDown={this.onPointerDown} ref={this._ref} >
+                <button className="imageBox-button" type="button" onClick={() => this.setState({ isOpen: this._wasSelected })}>
+                    <img src={images[0]} width="100%" alt="Image not found" />
+                </button>
+                {lightbox()}
+            </div>)
+    }
+}
\ No newline at end of file
-- 
cgit v1.2.3-70-g09d2

