How to Check if Customer is Logged In on Frontend in Magento 2.1

frontendmagento2

How to check that customer is logged in?
In authentication-popup.js I found following code:

define([..., 'Magento_Customer/js/customer-data',...], 
    function(..., customerData, ...) {
        return Component.extend({
            ...
            /** Is login form enabled for current customer */
            isActive: function () {
                var customer = customerData.get('customer');
                return customer() == false;
            },
        });
    }
);

I copied it to my module, but it seems like isn't works, it still returns false after login.

Any ideas?

Env:
– Magento 2.1.1
– Magento/blank theme

Best Answer

Magento 2.1.1 has an issue when full page cache is disabled - customer data isn't updating after success login. Details

Also sometimes customer data can be still not loaded (waiting for response), so in order to catch this case I prepared following code:

/**
 * This file will check that customer is logged in
 */
define(
    ['jquery', 'Magento_Customer/js/customer-data'],
    function ($, customerData) {
        'use strict';

        var getCustomerInfo = function () {
            var customer = customerData.get('customer');

            return customer();
        };

        var isLoggedIn = function (customerInfo) {
            customerInfo = customerInfo || getCustomerInfo();

            return customerInfo && customerInfo.firstname;
        };

        return function () {
            var deferred = $.Deferred();
            var customerInfo = getCustomerInfo();

            if (customerInfo && customerInfo.data_id) {
                deferred.resolve(isLoggedIn(customerInfo));
            } else {
                customerData.reload(['customer'], false)
                    .done(function () {
                        deferred.resolve(isLoggedIn());
                    })
                    .fail(function () {
                        deferred.reject();
                    });
            }

            return deferred;
        };
    }
);
Related Topic