TryGhost/Ghost

View on GitHub
ghost/admin/app/services/media-queries.js

Summary

Maintainability
A
0 mins
Test Coverage
import Evented from '@ember/object/evented';
import Service from '@ember/service';
import classic from 'ember-classic-decorator';
import {run} from '@ember/runloop';

const MEDIA_QUERIES = {
    maxWidth600: '(max-width: 600px)',
    isMobile: '(max-width: 800px)',
    maxWidth900: '(max-width: 900px)',
    maxWidth1000: '(max-width: 1000px)'
};

@classic
export default class MediaQueriesService extends Service.extend(Evented) {
    init() {
        super.init(...arguments);
        this._handlers = [];
        this.loadQueries(MEDIA_QUERIES);
    }

    loadQueries(queries) {
        Object.keys(queries).forEach((key) => {
            this.loadQuery(key, queries[key]);
        });
    }

    loadQuery(key, queryString) {
        let query = window.matchMedia(queryString);

        this.set(key, query.matches);

        let handler = run.bind(this, () => {
            let lastValue = this.get(key);
            let newValue = query.matches;
            if (lastValue !== newValue) {
                this.set(key, newValue);
                this.trigger('change', key, newValue);
            }
        });
        query.addListener(handler);
        this._handlers.push([query, handler]);
    }

    willDestroy() {
        this._handlers.forEach(([query, handler]) => {
            query.removeListener(handler);
        });
        super.willDestroy(...arguments);
    }
}