gocodebox/lifterlms

View on GitHub
assets/js/app/llms-achievements.js

Summary

Maintainability
A
35 mins
Test Coverage
/**
 * Front End Achievements
 *
 * @package LifterLMS/Scripts
 *
 * @since 3.14.0
 * @version 6.10.2
 */

LLMS.Achievements = {

    /**
     * Init
     *
     * @since 3.14.0
     * @since 4.5.1 Fix conditional loading check.
     *
     * @return {void}
     */
    init: function() {

        if ( $( '.llms-achievement' ).length ) {

            var self = this;

            $( function() {
                self.bind();
                self.maybe_open();
            } );
        }

    },

    /**
     * Bind DOM events
     *
     * @since 3.14.0
     *
     * @return {void}
     */
    bind: function() {

        var self = this;

        $( '.llms-achievement' ).each( function() {

            self.create_modal( $( this ) );

        } );

        $( '.llms-achievement' ).on( 'click', function() {

            var $this  = $( this ),
                id     = 'achievement-' + $this.attr( 'data-id' ),
                $modal = $( '#' + id );

            if ( ! $modal.length ) {
                self.create_modal( $this );
            }

            $modal.iziModal( 'open' );

        } );

    },

    /**
     * Creates modal a modal for an achievement
     *
     * @since 3.14.0
     *
     * @param obj $el The jQuery selector for the modal card.
     * @return {void}
     */
    create_modal: function( $el ) {

        var id     = 'achievement-' + $el.attr( 'data-id' ),
            $modal = $( '#' + id );

        if ( ! $modal.length ) {
            $modal = $( '<div class="llms-achievement-modal" id="' + id + '" />' );
            $( 'body' ).append( $modal );
        }

        $modal.iziModal( {
            headerColor: '#3a3a3a',
            group: 'achievements',
            history: true,
            loop: true,
            overlayColor: 'rgba( 0, 0, 0, 0.6 )',
            transitionIn: 'fadeInDown',
            transitionOut: 'fadeOutDown',
            width: 340,
            onOpening: function( modal ) {

                modal.setTitle( $el.find( '.llms-achievement-title' ).html() );
                modal.setSubtitle( $el.find( '.llms-achievement-date' ).html() );
                modal.setContent( '<div class="llms-achievement">' + $el.html() + '</div>' );

            },

            onClosing: function() {
                window.history.pushState( '', document.title, window.location.pathname + window.location.search );
            },

        } );

    },

    /**
     * On page load, opens a modal if the URL contains an achievement in the location hash
     *
     * @since 3.14.0
     * @since 6.10.2 Sanitize achievement IDs before using window.location.hash to trigger the modal open.
     *
     * @return {void}
     */
    maybe_open: function() {

        let hash = window.location.hash.split( '-' );
        if ( 2 !== hash.length ) {
            return;
        }

        hash[1] = parseInt( hash[1] );
        if ( '#achievement-' !== hash[0] || ! Number.isInteger( hash[1] ) ) {
            return;
        }

        const a = document.querySelector( `a[href="${ hash.join( '-' ) }"]` )
        if ( ! a ) {
            return;
        }

        a.click();

    }

};