Pour tout problème contactez-nous par mail : support@froggit.fr | La FAQ :grey_question: | Rejoignez-nous sur le Chat :speech_balloon:

Skip to content
Snippets Groups Projects
image-carousel.js 3.55 KiB
Newer Older
peter_rabbit's avatar
peter_rabbit committed
"use strict";
peter_rabbit's avatar
peter_rabbit committed
class ImageCarousel {
    constructor(props) {
        this.props = props;
Pierre Jarriges's avatar
Pierre Jarriges committed
        this.id = this.props.images.join("").replace(/[\s\./]/g, "");
peter_rabbit's avatar
peter_rabbit committed
        this.state = {
            showImageIndex: 0,
            fullscreen: false,
peter_rabbit's avatar
peter_rabbit committed
        };
        this.RUN_INTERVAL = 5000;
peter_rabbit's avatar
peter_rabbit committed
        this.props.images.length > 1 && this.run();
        this.toggle_fullscreen = this.toggle_fullscreen.bind(this);
peter_rabbit's avatar
peter_rabbit committed
    }

    run() {
Pierre Jarriges's avatar
Pierre Jarriges committed
        const runningInterval = setInterval(() => {
peter_rabbit's avatar
peter_rabbit committed
            let { showImageIndex } = this.state;
            const { images } = this.props;
            this.state.showImageIndex = showImageIndex < images.length - 1 ? ++showImageIndex : 0;
            this.refresh();
peter_rabbit's avatar
peter_rabbit committed
        }, this.RUN_INTERVAL);
Pierre Jarriges's avatar
Pierre Jarriges committed

        obj2htm.registerAsyncSubscription(this.id, function () {
            clearInterval(runningInterval);
Pierre Jarriges's avatar
Pierre Jarriges committed
        });

        this.runningInterval = runningInterval;
peter_rabbit's avatar
peter_rabbit committed
    }

    set_image_index(i) {
peter_rabbit's avatar
peter_rabbit committed
        clearInterval(this.runningInterval);
        this.state.showImageIndex = i;
        this.refresh();
peter_rabbit's avatar
peter_rabbit committed
    }


    toggle_fullscreen() {
        this.state.fullscreen = !this.state.fullscreen;
        document.getElementById(this.id).classList.toggle("fullscreen");
        document.body.style.overflow = this.state.fullscreen ? "hidden" : "initial";

        if (this.state.fullscreen) {
            window.addEventListener("keydown", this.toggle_fullscreen);
        } else {
            window.removeEventListener("keydown", this.toggle_fullscreen);
        }
    }

    refresh() {
        obj2htm.subRender(this.render_image(), document.getElementById(this.id + "-img-element"), {
            mode: "replace",
        });
        obj2htm.subRender(this.render_bullets(), document.getElementById(this.id + "-bullets"), {
peter_rabbit's avatar
peter_rabbit committed
            mode: "replace",
        });
        obj2htm.subRender(this.render_fullscreen_button(), document.getElementById(this.id + "-fullscreen-btn"), {
            mode: "replace",
        });
peter_rabbit's avatar
peter_rabbit committed
    }

    render_image() {
        return {
            tag: "img",
            id: this.id + "-img-element",
            property: "image",
            alt: `image carousel ${this.props.images[this.state.showImageIndex].replace(/\.[A-Za-z]+/, "")}`,
            src: this.props.images[this.state.showImageIndex],
        };
    }

    render_bullets() {
        return this.props.images.length > 1 ? {
            tag: "div",
            id: this.id + "-bullets",
            class: "carousel-bullets",
            contents: this.props.images.map((_, i) => {
                const active = this.state.showImageIndex === i;
                return {
                    tag: "span",
                    class: `bullet ${active ? "active" : ""}`,
                    onclick: this.set_image_index.bind(this, i),
                };
            }),
        } : { tag: "span" };
    }

    render_fullscreen_button() {
        return {
            tag: "button",
            id: this.id + "-fullscreen-btn",
            class: `toggle-fullscreen-button ${this.state.fullscreen ? "to-small" : "to-full"}`,
            contents: this.state.fullscreen ? "" : "",
            onclick: e => {
                e.stopImmediatePropagation();
                this.toggle_fullscreen();
peter_rabbit's avatar
peter_rabbit committed
    render() {
        return {
            tag: "div",
            id: this.id,
            class: "image-carousel",
            contents: [
                this.render_image(),
                this.render_bullets(),
                this.render_fullscreen_button(),
peter_rabbit's avatar
peter_rabbit committed
            ],
        };
    }
}

module.exports = ImageCarousel;