artbox_basket.ts 3.52 KB
///<reference path="node_modules/@types/jquery/index.d.ts" />
class ArtboxBasket {
    private _items;
    private _language;
    private _defaults: Object = {
        language: 'ru',
        url: 'basket',
        initError: 'Basket cannot be init',
        modalSelector: '.basket_modal',
        cartSelector: '.basket_wrapper',
        initCallback: function () {
        }
    };
    private _settings: Object = {};

    get items() {
        return this._items;
    }

    get language() {
        if (this._language === undefined) {
            let language_attr = $('html').attr('lang');
            if (language_attr !== undefined) {
                let language = language_attr.substr(0, 2);
                if (language.length == 2) {
                    this._language = language;
                } else {
                    this._language = this._settings['language'];
                }
            } else {
                this._language = this._settings['language'];
            }
        }
        return this._language;
    }

    constructor(settings: Object = {},) {
        this._settings = ArtboxBasket.mergeObjects(this._defaults, settings);
        if (settings['language'] !== undefined) {
            this._language = settings['language'];
        }
        this.init(this._settings['initCallback']);
    }

    public init(callback) {
        $.get(this.getLanguagePath() + this._settings['url'], function (data) {
            this._items = data.basket;
            console.log(callback);
            callback(data);
        }.bind(this), 'json').fail(function () {
            console.error(this._settings['initError']);
        }.bind(this));
    }

    public add(variant_id, count, callback): JQueryPromise<JQueryXHR> {
        return $.post(this.getLanguagePath() + this._settings['url'] + '/add?variant_id=' + variant_id + '&count=' + count, function (data) {
            this._items = data.basket;
            if (callback !== undefined) {
                callback(data);
            }
        }.bind(this), 'json').fail(function (xhr, status, error) {
            console.error(error);
        });
    }

    public set(variant_id, count, callback): JQueryPromise<JQueryXHR> {
        return $.post(this.getLanguagePath() + this._settings['url'] + '/set?variant_id=' + variant_id + '&count=' + count, function (data) {
            this._items = data.basket;
            if (callback !== undefined) {
                callback(data);
            }
        }.bind(this), 'json').fail(function (xhr, status, error) {
            console.error(error);
        });
    }

    public remove(variant_id, callback): JQueryPromise<JQueryXHR> {
        return $.post(this.getLanguagePath() + this._settings['url'] + '/remove?variant_id=' + variant_id, function (data) {
            this._items = data.basket;
            if (callback !== undefined) {
                callback(data);
            }
        }.bind(this), 'json').fail(function (xhr, status, error) {
            console.error(error);
        });
    }



    get count(): number {
        return Object.keys(this._items).length;
    }

    private static mergeObjects(obj1: Object, obj2: Object): Object {
        let obj = {};
        for (let attribute in obj1) {
            obj[attribute] = obj1[attribute];
        }
        for (let attribute in obj2) {
            obj[attribute] = obj2[attribute];
        }
        return obj;
    }

    private getLanguagePath(): string {
        if (this.language) {
            return '/' + this.language + '/';
        } else {
            return '/';
        }
    }
}