Skip to content

Commit

Permalink
Implemented redux store for user auth status, implemented fetch/retry…
Browse files Browse the repository at this point in the history
… using tokens (if present).

diff --git a/dist/bundle.js b/dist/bundle.js
index eb14ca4..fd2fae7 100644
--- a/dist/bundle.js
+++ b/dist/bundle.js
@@ -60,7 +60,7 @@
 /******/ 	__webpack_require__.p = "";
 /******/
 /******/ 	// Load entry module and return exports
-/******/ 	return __webpack_require__(__webpack_require__.s = 163);
+/******/ 	return __webpack_require__(__webpack_require__.s = 177);
 /******/ })
 /************************************************************************/
 /******/ ([
@@ -95,14 +95,14 @@ if (process.env.NODE_ENV !== 'production') {
   // By explicitly using `prop-types` you are opting into new development behavior.
   // http://fb.me/prop-types-in-prod
   var throwOnDirectAccess = true;
-  module.exports = __webpack_require__(165)(isValidElement, throwOnDirectAccess);
+  module.exports = __webpack_require__(179)(isValidElement, throwOnDirectAccess);
 } else {
   // By explicitly using `prop-types` you are opting into new production behavior.
   // http://fb.me/prop-types-in-prod
-  module.exports = __webpack_require__(168)();
+  module.exports = __webpack_require__(182)();
 }

-/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(16)))
+/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(11)))

 /***/ }),
 /* 2 */
@@ -170,7 +170,7 @@ if (process.env.NODE_ENV !== 'production') {

 module.exports = warning;

-/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(16)))
+/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(11)))

 /***/ }),
 /* 3 */
@@ -229,13 +229,13 @@ var invariant = function(condition, format, a, b, c, d, e, f) {

 module.exports = invariant;

-/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(16)))
+/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(11)))

 /***/ }),
 /* 4 */
 /***/ (function(module, exports, __webpack_require__) {

-module.exports = { "default": __webpack_require__(198), __esModule: true };
+module.exports = { "default": __webpack_require__(234), __esModule: true };

 /***/ }),
 /* 5 */
@@ -261,7 +261,7 @@ exports.default = function (instance, Constructor) {

 exports.__esModule = true;

-var _defineProperty = __webpack_require__(115);
+var _defineProperty = __webpack_require__(130);

 var _defineProperty2 = _interopRequireDefault(_defineProperty);

@@ -294,7 +294,7 @@ exports.default = function () {

 exports.__esModule = true;

-var _typeof2 = __webpack_require__(116);
+var _typeof2 = __webpack_require__(131);

 var _typeof3 = _interopRequireDefault(_typeof2);

@@ -317,15 +317,15 @@ exports.default = function (self, call) {

 exports.__esModule = true;

-var _setPrototypeOf = __webpack_require__(226);
+var _setPrototypeOf = __webpack_require__(262);

 var _setPrototypeOf2 = _interopRequireDefault(_setPrototypeOf);

-var _create = __webpack_require__(230);
+var _create = __webpack_require__(266);

 var _create2 = _interopRequireDefault(_create);

-var _typeof2 = __webpack_require__(116);
+var _typeof2 = __webpack_require__(131);

 var _typeof3 = _interopRequireDefault(_typeof2);

@@ -356,7 +356,7 @@ exports.default = function (subClass, superClass) {

 exports.__esModule = true;

-var _defineProperty = __webpack_require__(115);
+var _defineProperty = __webpack_require__(130);

 var _defineProperty2 = _interopRequireDefault(_defineProperty);

@@ -457,6 +457,196 @@ var BICYCLING_LAYER = (exports.BICYCLING_LAYER =

 /***/ }),
 /* 11 */
+/***/ (function(module, exports) {
+
+// shim for using process in browser
+var process = module.exports = {};
+
+// cached from whatever global is present so that test runners that stub it
+// don't break things.  But we need to wrap it in a try catch in case it is
+// wrapped in strict mode code which doesn't define any globals.  It's inside a
+// function because try/catches deoptimize in certain engines.
+
+var cachedSetTimeout;
+var cachedClearTimeout;
+
+function defaultSetTimout() {
+    throw new Error('setTimeout has not been defined');
+}
+function defaultClearTimeout () {
+    throw new Error('clearTimeout has not been defined');
+}
+(function () {
+    try {
+        if (typeof setTimeout === 'function') {
+            cachedSetTimeout = setTimeout;
+        } else {
+            cachedSetTimeout = defaultSetTimout;
+        }
+    } catch (e) {
+        cachedSetTimeout = defaultSetTimout;
+    }
+    try {
+        if (typeof clearTimeout === 'function') {
+            cachedClearTimeout = clearTimeout;
+        } else {
+            cachedClearTimeout = defaultClearTimeout;
+        }
+    } catch (e) {
+        cachedClearTimeout = defaultClearTimeout;
+    }
+} ())
+function runTimeout(fun) {
+    if (cachedSetTimeout === setTimeout) {
+        //normal enviroments in sane situations
+        return setTimeout(fun, 0);
+    }
+    // if setTimeout wasn't available but was latter defined
+    if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
+        cachedSetTimeout = setTimeout;
+        return setTimeout(fun, 0);
+    }
+    try {
+        // when when somebody has screwed with setTimeout but no I.E. maddness
+        return cachedSetTimeout(fun, 0);
+    } catch(e){
+        try {
+            // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
+            return cachedSetTimeout.call(null, fun, 0);
+        } catch(e){
+            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error
+            return cachedSetTimeout.call(this, fun, 0);
+        }
+    }
+
+
+}
+function runClearTimeout(marker) {
+    if (cachedClearTimeout === clearTimeout) {
+        //normal enviroments in sane situations
+        return clearTimeout(marker);
+    }
+    // if clearTimeout wasn't available but was latter defined
+    if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
+        cachedClearTimeout = clearTimeout;
+        return clearTimeout(marker);
+    }
+    try {
+        // when when somebody has screwed with setTimeout but no I.E. maddness
+        return cachedClearTimeout(marker);
+    } catch (e){
+        try {
+            // When we are in I.E. but the script has been evaled so I.E. doesn't  trust the global object when called normally
+            return cachedClearTimeout.call(null, marker);
+        } catch (e){
+            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
+            // Some versions of I.E. have different rules for clearTimeout vs setTimeout
+            return cachedClearTimeout.call(this, marker);
+        }
+    }
+
+
+
+}
+var queue = [];
+var draining = false;
+var currentQueue;
+var queueIndex = -1;
+
+function cleanUpNextTick() {
+    if (!draining || !currentQueue) {
+        return;
+    }
+    draining = false;
+    if (currentQueue.length) {
+        queue = currentQueue.concat(queue);
+    } else {
+        queueIndex = -1;
+    }
+    if (queue.length) {
+        drainQueue();
+    }
+}
+
+function drainQueue() {
+    if (draining) {
+        return;
+    }
+    var timeout = runTimeout(cleanUpNextTick);
+    draining = true;
+
+    var len = queue.length;
+    while(len) {
+        currentQueue = queue;
+        queue = [];
+        while (++queueIndex < len) {
+            if (currentQueue) {
+                currentQueue[queueIndex].run();
+            }
+        }
+        queueIndex = -1;
+        len = queue.length;
+    }
+    currentQueue = null;
+    draining = false;
+    runClearTimeout(timeout);
+}
+
+process.nextTick = function (fun) {
+    var args = new Array(arguments.length - 1);
+    if (arguments.length > 1) {
+        for (var i = 1; i < arguments.length; i++) {
+            args[i - 1] = arguments[i];
+        }
+    }
+    queue.push(new Item(fun, args));
+    if (queue.length === 1 && !draining) {
+        runTimeout(drainQueue);
+    }
+};
+
+// v8 likes predictible objects
+function Item(fun, array) {
+    this.fun = fun;
+    this.array = array;
+}
+Item.prototype.run = function () {
+    this.fun.apply(null, this.array);
+};
+process.title = 'browser';
+process.browser = true;
+process.env = {};
+process.argv = [];
+process.version = ''; // empty string to avoid regexp issues
+process.versions = {};
+
+function noop() {}
+
+process.on = noop;
+process.addListener = noop;
+process.once = noop;
+process.off = noop;
+process.removeListener = noop;
+process.removeAllListeners = noop;
+process.emit = noop;
+process.prependListener = noop;
+process.prependOnceListener = noop;
+
+process.listeners = function (name) { return [] }
+
+process.binding = function (name) {
+    throw new Error('process.binding is not supported');
+};
+
+process.cwd = function () { return '/' };
+process.chdir = function (dir) {
+    throw new Error('process.chdir is not supported');
+};
+process.umask = function() { return 0; };
+
+
+/***/ }),
+/* 12 */
 /***/ (function(module, exports, __webpack_require__) {

 "use strict";
@@ -466,27 +656,27 @@ Object.defineProperty(exports, "__esModule", {
   value: true,
 })

-var _bind2 = __webpack_require__(44)
+var _bind2 = __webpack_require__(47)

 var _bind3 = _interopRequireDefault(_bind2)

-var _isFunction2 = __webpack_require__(45)
+var _isFunction2 = __webpack_require__(48)

 var _isFunction3 = _interopRequireDefault(_isFunction2)

-var _reduce3 = __webpack_require__(284)
+var _reduce3 = __webpack_require__(317)

 var _reduce4 = _interopRequireDefault(_reduce3)

-var _forEach2 = __webpack_require__(360)
+var _forEach2 = __webpack_require__(393)

 var _forEach3 = _interopRequireDefault(_forEach2)

-var _lowerFirst2 = __webpack_require__(362)
+var _lowerFirst2 = __webpack_require__(395)

 var _lowerFirst3 = _interopRequireDefault(_lowerFirst2)

-var _has2 = __webpack_require__(369)
+var _has2 = __webpack_require__(402)

 var _has3 = _interopRequireDefault(_has2)

@@ -598,10 +788,10 @@ function unregisterEvent(registered) {

 /***/ }),
-/* 12 */
+/* 13 */
 /***/ (function(module, exports, __webpack_require__) {

-var freeGlobal = __webpack_require__(127);
+var freeGlobal = __webpack_require__(142);

 /** Detect free variable `self`. */
 var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
@@ -613,7 +803,7 @@ module.exports = root;

 /***/ }),
-/* 13 */
+/* 14 */
 /***/ (function(module, exports) {

 var core = module.exports = { version: '2.5.1' };
@@ -621,7 +811,7 @@ if (typeof __e == 'number') __e = core; // eslint-disable-line no-undef

 /***/ }),
-/* 14 */
+/* 15 */
 /***/ (function(module, exports) {

 /**
@@ -653,11 +843,11 @@ module.exports = isArray;

 /***/ }),
-/* 15 */
+/* 16 */
 /***/ (function(module, exports, __webpack_require__) {

-var store = __webpack_require__(72)('wks');
-var uid = __webpack_require__(41);
+var store = __webpack_require__(80)('wks');
+var uid = __webpack_require__(44);
 var Symbol = __webpack_require__(17).Symbol;
 var USE_SYMBOL = typeof Symbol == 'function';

@@ -670,214 +860,24 @@ $exports.store = store;

 /***/ }),
-/* 16 */
+/* 17 */
 /***/ (function(module, exports) {

-// shim for using process in browser
-var process = module.exports = {};
+// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028
+var global = module.exports = typeof window != 'undefined' && window.Math == Math
+  ? window : typeof self != 'undefined' && self.Math == Math ? self
+  // eslint-disable-next-line no-new-func
+  : Function('return this')();
+if (typeof __g == 'number') __g = global; // eslint-disable-line no-undef

-// cached from whatever global is present so that test runners that stub it
-// don't break things.  But we need to wrap it in a try catch in case it is
-// wrapped in strict mode code which doesn't define any globals.  It's inside a
-// function because try/catches deoptimize in certain engines.

-var cachedSetTimeout;
-var cachedClearTimeout;
-
-function defaultSetTimout() {
-    throw new Error('setTimeout has not been defined');
-}
-function defaultClearTimeout () {
-    throw new Error('clearTimeout has not been defined');
-}
-(function () {
-    try {
-        if (typeof setTimeout === 'function') {
-            cachedSetTimeout = setTimeout;
-        } else {
-            cachedSetTimeout = defaultSetTimout;
-        }
-    } catch (e) {
-        cachedSetTimeout = defaultSetTimout;
-    }
-    try {
-        if (typeof clearTimeout === 'function') {
-            cachedClearTimeout = clearTimeout;
-        } else {
-            cachedClearTimeout = defaultClearTimeout;
-        }
-    } catch (e) {
-        cachedClearTimeout = defaultClearTimeout;
-    }
-} ())
-function runTimeout(fun) {
-    if (cachedSetTimeout === setTimeout) {
-        //normal enviroments in sane situations
-        return setTimeout(fun, 0);
-    }
-    // if setTimeout wasn't available but was latter defined
-    if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
-        cachedSetTimeout = setTimeout;
-        return setTimeout(fun, 0);
-    }
-    try {
-        // when when somebody has screwed with setTimeout but no I.E. maddness
-        return cachedSetTimeout(fun, 0);
-    } catch(e){
-        try {
-            // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
-            return cachedSetTimeout.call(null, fun, 0);
-        } catch(e){
-            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error
-            return cachedSetTimeout.call(this, fun, 0);
-        }
-    }
-
-
-}
-function runClearTimeout(marker) {
-    if (cachedClearTimeout === clearTimeout) {
-        //normal enviroments in sane situations
-        return clearTimeout(marker);
-    }
-    // if clearTimeout wasn't available but was latter defined
-    if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
-        cachedClearTimeout = clearTimeout;
-        return clearTimeout(marker);
-    }
-    try {
-        // when when somebody has screwed with setTimeout but no I.E. maddness
-        return cachedClearTimeout(marker);
-    } catch (e){
-        try {
-            // When we are in I.E. but the script has been evaled so I.E. doesn't  trust the global object when called normally
-            return cachedClearTimeout.call(null, marker);
-        } catch (e){
-            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
-            // Some versions of I.E. have different rules for clearTimeout vs setTimeout
-            return cachedClearTimeout.call(this, marker);
-        }
-    }
-
-
-
-}
-var queue = [];
-var draining = false;
-var currentQueue;
-var queueIndex = -1;
-
-function cleanUpNextTick() {
-    if (!draining || !currentQueue) {
-        return;
-    }
-    draining = false;
-    if (currentQueue.length) {
-        queue = currentQueue.concat(queue);
-    } else {
-        queueIndex = -1;
-    }
-    if (queue.length) {
-        drainQueue();
-    }
-}
-
-function drainQueue() {
-    if (draining) {
-        return;
-    }
-    var timeout = runTimeout(cleanUpNextTick);
-    draining = true;
-
-    var len = queue.length;
-    while(len) {
-        currentQueue = queue;
-        queue = [];
-        while (++queueIndex < len) {
-            if (currentQueue) {
-                currentQueue[queueIndex].run();
-            }
-        }
-        queueIndex = -1;
-        len = queue.length;
-    }
-    currentQueue = null;
-    draining = false;
-    runClearTimeout(timeout);
-}
-
-process.nextTick = function (fun) {
-    var args = new Array(arguments.length - 1);
-    if (arguments.length > 1) {
-        for (var i = 1; i < arguments.length; i++) {
-            args[i - 1] = arguments[i];
-        }
-    }
-    queue.push(new Item(fun, args));
-    if (queue.length === 1 && !draining) {
-        runTimeout(drainQueue);
-    }
-};
-
-// v8 likes predictible objects
-function Item(fun, array) {
-    this.fun = fun;
-    this.array = array;
-}
-Item.prototype.run = function () {
-    this.fun.apply(null, this.array);
-};
-process.title = 'browser';
-process.browser = true;
-process.env = {};
-process.argv = [];
-process.version = ''; // empty string to avoid regexp issues
-process.versions = {};
-
-function noop() {}
-
-process.on = noop;
-process.addListener = noop;
-process.once = noop;
-process.off = noop;
-process.removeListener = noop;
-process.removeAllListeners = noop;
-process.emit = noop;
-process.prependListener = noop;
-process.prependOnceListener = noop;
-
-process.listeners = function (name) { return [] }
-
-process.binding = function (name) {
-    throw new Error('process.binding is not supported');
-};
-
-process.cwd = function () { return '/' };
-process.chdir = function (dir) {
-    throw new Error('process.chdir is not supported');
-};
-process.umask = function() { return 0; };
-
-
-/***/ }),
-/* 17 */
-/***/ (function(module, exports) {
-
-// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028
-var global = module.exports = typeof window != 'undefined' && window.Math == Math
-  ? window : typeof self != 'undefined' && self.Math == Math ? self
-  // eslint-disable-next-line no-new-func
-  : Function('return this')();
-if (typeof __g == 'number') __g = global; // eslint-disable-line no-undef
-
-
-/***/ }),
-/* 18 */
-/***/ (function(module, exports, __webpack_require__) {
+/***/ }),
+/* 18 */
+/***/ (function(module, exports, __webpack_require__) {

 var global = __webpack_require__(17);
-var core = __webpack_require__(13);
-var ctx = __webpack_require__(73);
+var core = __webpack_require__(14);
+var ctx = __webpack_require__(81);
 var hide = __webpack_require__(24);
 var PROTOTYPE = 'prototype';

@@ -943,8 +943,8 @@ module.exports = $export;
 /***/ (function(module, exports, __webpack_require__) {

 var anObject = __webpack_require__(25);
-var IE8_DOM_DEFINE = __webpack_require__(113);
-var toPrimitive = __webpack_require__(74);
+var IE8_DOM_DEFINE = __webpack_require__(128);
+var toPrimitive = __webpack_require__(82);
 var dP = Object.defineProperty;

 exports.f = __webpack_require__(21) ? Object.defineProperty : function defineProperty(O, P, Attributes) {
@@ -984,8 +984,8 @@ module.exports = !__webpack_require__(26)(function () {
 /* 22 */
 /***/ (function(module, exports, __webpack_require__) {

-var baseIsNative = __webpack_require__(236),
-    getValue = __webpack_require__(241);
+var baseIsNative = __webpack_require__(272),
+    getValue = __webpack_require__(277);

 /**
  * Gets the native function at `key` of `object`.
@@ -1045,7 +1045,7 @@ module.exports = isObject;
 /***/ (function(module, exports, __webpack_require__) {

 var dP = __webpack_require__(19);
-var createDesc = __webpack_require__(32);
+var createDesc = __webpack_require__(33);
 module.exports = __webpack_require__(21) ? function (object, key, value) {
   return dP.f(object, key, createDesc(1, value));
 } : function (object, key, value) {
@@ -1058,7 +1058,7 @@ module.exports = __webpack_require__(21) ? function (object, key, value) {
 /* 25 */
 /***/ (function(module, exports, __webpack_require__) {

-var isObject = __webpack_require__(31);
+var isObject = __webpack_require__(32);
 module.exports = function (it) {
   if (!isObject(it)) throw TypeError(it + ' is not an object!');
   return it;
@@ -1083,8 +1083,8 @@ module.exports = function (exec) {
 /***/ (function(module, exports, __webpack_require__) {

 // to indexed object, toObject with fallback for non-array-like ES3 strings
-var IObject = __webpack_require__(121);
-var defined = __webpack_require__(70);
+var IObject = __webpack_require__(136);
+var defined = __webpack_require__(78);
 module.exports = function (it) {
   return IObject(defined(it));
 };
@@ -1265,6 +1265,25 @@ var createPath = function createPath(location) {

 /***/ }),
 /* 31 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__components_Provider__ = __webpack_require__(203);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__components_connectAdvanced__ = __webpack_require__(117);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__connect_connect__ = __webpack_require__(205);
+/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "Provider", function() { return __WEBPACK_IMPORTED_MODULE_0__components_Provider__["b"]; });
+/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "createProvider", function() { return __WEBPACK_IMPORTED_MODULE_0__components_Provider__["a"]; });
+/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "connectAdvanced", function() { return __WEBPACK_IMPORTED_MODULE_1__components_connectAdvanced__["a"]; });
+/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "connect", function() { return __WEBPACK_IMPORTED_MODULE_2__connect_connect__["a"]; });
+
+
+
+
+
+
+/***/ }),
+/* 32 */
 /***/ (function(module, exports) {

 module.exports = function (it) {
@@ -1273,7 +1292,7 @@ module.exports = function (it) {

 /***/ }),
-/* 32 */
+/* 33 */
 /***/ (function(module, exports) {

 module.exports = function (bitmap, value) {
@@ -1287,14 +1306,14 @@ module.exports = function (bitmap, value) {

 /***/ }),
-/* 33 */
+/* 34 */
 /***/ (function(module, exports) {

 module.exports = {};

 /***/ }),
-/* 34 */
+/* 35 */
 /***/ (function(module, exports) {

 /**
@@ -1321,12 +1340,12 @@ module.exports = identity;

 /***/ }),
-/* 35 */
+/* 36 */
 /***/ (function(module, exports, __webpack_require__) {

-var Symbol = __webpack_require__(46),
-    getRawTag = __webpack_require__(237),
-    objectToString = __webpack_require__(238);
+var Symbol = __webpack_require__(49),
+    getRawTag = __webpack_require__(273),
+    objectToString = __webpack_require__(274);

 /** `Object#toString` result references. */
 var nullTag = '[object Null]',
@@ -1355,36 +1374,36 @@ module.exports = baseGetTag;

 /***/ }),
-/* 36 */
+/* 37 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {

 "use strict";
 Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__BrowserRouter__ = __webpack_require__(164);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__BrowserRouter__ = __webpack_require__(178);
 /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "BrowserRouter", function() { return __WEBPACK_IMPORTED_MODULE_0__BrowserRouter__["a"]; });
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__HashRouter__ = __webpack_require__(170);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__HashRouter__ = __webpack_require__(184);
 /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "HashRouter", function() { return __WEBPACK_IMPORTED_MODULE_1__HashRouter__["a"]; });
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__Link__ = __webpack_require__(99);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__Link__ = __webpack_require__(106);
 /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "Link", function() { return __WEBPACK_IMPORTED_MODULE_2__Link__["a"]; });
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__MemoryRouter__ = __webpack_require__(172);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__MemoryRouter__ = __webpack_require__(186);
 /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "MemoryRouter", function() { return __WEBPACK_IMPORTED_MODULE_3__MemoryRouter__["a"]; });
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__NavLink__ = __webpack_require__(174);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__NavLink__ = __webpack_require__(188);
 /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "NavLink", function() { return __WEBPACK_IMPORTED_MODULE_4__NavLink__["a"]; });
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__Prompt__ = __webpack_require__(177);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__Prompt__ = __webpack_require__(191);
 /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "Prompt", function() { return __WEBPACK_IMPORTED_MODULE_5__Prompt__["a"]; });
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__Redirect__ = __webpack_require__(178);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__Redirect__ = __webpack_require__(192);
 /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "Redirect", function() { return __WEBPACK_IMPORTED_MODULE_6__Redirect__["a"]; });
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__Route__ = __webpack_require__(101);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__Route__ = __webpack_require__(108);
 /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "Route", function() { return __WEBPACK_IMPORTED_MODULE_7__Route__["a"]; });
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__Router__ = __webpack_require__(65);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__Router__ = __webpack_require__(68);
 /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "Router", function() { return __WEBPACK_IMPORTED_MODULE_8__Router__["a"]; });
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__StaticRouter__ = __webpack_require__(183);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__StaticRouter__ = __webpack_require__(197);
 /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "StaticRouter", function() { return __WEBPACK_IMPORTED_MODULE_9__StaticRouter__["a"]; });
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_10__Switch__ = __webpack_require__(184);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_10__Switch__ = __webpack_require__(198);
 /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "Switch", function() { return __WEBPACK_IMPORTED_MODULE_10__Switch__["a"]; });
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_11__matchPath__ = __webpack_require__(185);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_11__matchPath__ = __webpack_require__(199);
 /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "matchPath", function() { return __WEBPACK_IMPORTED_MODULE_11__matchPath__["a"]; });
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_12__withRouter__ = __webpack_require__(186);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_12__withRouter__ = __webpack_require__(200);
 /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "withRouter", function() { return __WEBPACK_IMPORTED_MODULE_12__withRouter__["a"]; });

@@ -1414,7 +1433,7 @@ Object.defineProperty(__webpack_exports__, "__esModule", { value: true });

 /***/ }),
-/* 37 */
+/* 38 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {

 "use strict";
@@ -1533,11 +1552,11 @@ Router.childContextTypes = {
 /* harmony default export */ __webpack_exports__["a"] = (Router);

 /***/ }),
-/* 38 */
+/* 39 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {

 "use strict";
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_path_to_regexp__ = __webpack_require__(175);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_path_to_regexp__ = __webpack_require__(189);
 /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_path_to_regexp___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_path_to_regexp__);

@@ -1610,14 +1629,14 @@ var matchPath = function matchPath(pathname) {
 /* harmony default export */ __webpack_exports__["a"] = (matchPath);

 /***/ }),
-/* 39 */
+/* 40 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {

 "use strict";
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return createLocation; });
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return locationsAreEqual; });
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_resolve_pathname__ = __webpack_require__(96);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_value_equal__ = __webpack_require__(97);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_resolve_pathname__ = __webpack_require__(103);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_value_equal__ = __webpack_require__(104);
 /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__PathUtils__ = __webpack_require__(30);
 var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };

@@ -1686,18 +1705,75 @@ var locationsAreEqual = function locationsAreEqual(a, b) {
 };

 /***/ }),
-/* 40 */
+/* 41 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+const SET_LOGIN_SUCCESS = 'SET_LOGIN_SUCCESS';
+const SET_LOGOUT_SUCCESS = 'SET_LOGOUT_SUCCESS';
+function login(username) {
+    return (dispatch) => {
+        dispatch(setLoginSuccess(true));
+    };
+}
+exports.login = login;
+;
+function logout() {
+    return (dispatch) => {
+        dispatch(setLoginSuccess(false));
+    };
+}
+exports.logout = logout;
+;
+function setLoginSuccess(isLoginSuccess) {
+    return {
+        type: SET_LOGIN_SUCCESS,
+        isLoginSuccess
+    };
+}
+function reducer(state = { isLoginSuccess: false }, action) {
+    switch (action.type) {
+        case SET_LOGIN_SUCCESS:
+            return Object.assign({}, state, {
+                isLoginSuccess: action.isLoginSuccess
+            });
+        case SET_LOGOUT_SUCCESS:
+            return Object.assign({}, state, {
+                isLoginSuccess: action.isLoginSuccess
+            });
+        default: return state;
+    }
+}
+exports.default = reducer;
+;
+
+
+/***/ }),
+/* 42 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+const BASEURL = 'http://localhost:5000';
+exports.BASEURL = BASEURL;
+
+
+/***/ }),
+/* 43 */
 /***/ (function(module, exports, __webpack_require__) {

 // 7.1.13 ToObject(argument)
-var defined = __webpack_require__(70);
+var defined = __webpack_require__(78);
 module.exports = function (it) {
   return Object(defined(it));
 };

 /***/ }),
-/* 41 */
+/* 44 */
 /***/ (function(module, exports) {

 var id = 0;
@@ -1708,12 +1784,12 @@ module.exports = function (key) {

 /***/ }),
-/* 42 */
+/* 45 */
 /***/ (function(module, exports, __webpack_require__) {

 // 19.1.2.14 / 15.2.3.14 Object.keys(O)
-var $keys = __webpack_require__(120);
-var enumBugKeys = __webpack_require__(79);
+var $keys = __webpack_require__(135);
+var enumBugKeys = __webpack_require__(87);

 module.exports = Object.keys || function keys(O) {
   return $keys(O, enumBugKeys);
@@ -1721,20 +1797,20 @@ module.exports = Object.keys || function keys(O) {

 /***/ }),
-/* 43 */
+/* 46 */
 /***/ (function(module, exports) {

 exports.f = {}.propertyIsEnumerable;

 /***/ }),
-/* 44 */
+/* 47 */
 /***/ (function(module, exports, __webpack_require__) {

-var baseRest = __webpack_require__(84),
-    createWrap = __webpack_require__(242),
-    getHolder = __webpack_require__(89),
-    replaceHolders = __webpack_require__(49);
+var baseRest = __webpack_require__(92),
+    createWrap = __webpack_require__(278),
+    getHolder = __webpack_require__(97),
+    replaceHolders = __webpack_require__(52);

 /** Used to compose bitmasks for function metadata. */
 var WRAP_BIND_FLAG = 1,
@@ -1791,10 +1867,10 @@ module.exports = bind;

 /***/ }),
-/* 45 */
+/* 48 */
 /***/ (function(module, exports, __webpack_require__) {

-var baseGetTag = __webpack_require__(35),
+var baseGetTag = __webpack_require__(36),
     isObject = __webpack_require__(23);

 /** `Object#toString` result references. */
@@ -1834,10 +1910,10 @@ module.exports = isFunction;

 /***/ }),
-/* 46 */
+/* 49 */
 /***/ (function(module, exports, __webpack_require__) {

-var root = __webpack_require__(12);
+var root = __webpack_require__(13);

 /** Built-in value references. */
 var Symbol = root.Symbol;
@@ -1846,10 +1922,10 @@ module.exports = Symbol;

 /***/ }),
-/* 47 */
+/* 50 */
 /***/ (function(module, exports, __webpack_require__) {

-var baseCreate = __webpack_require__(86),
+var baseCreate = __webpack_require__(94),
     isObject = __webpack_require__(23);

 /**
@@ -1889,7 +1965,7 @@ module.exports = createCtor;

 /***/ }),
-/* 48 */
+/* 51 */
 /***/ (function(module, exports) {

 /** Used as references for various `Number` constants. */
@@ -1917,7 +1993,7 @@ module.exports = isIndex;

 /***/ }),
-/* 49 */
+/* 52 */
 /***/ (function(module, exports) {

 /** Used as the internal argument placeholder. */
@@ -1952,10 +2028,10 @@ module.exports = replaceHolders;

 /***/ }),
-/* 50 */
+/* 53 */
 /***/ (function(module, exports, __webpack_require__) {

-var baseGetTag = __webpack_require__(35),
+var baseGetTag = __webpack_require__(36),
     isObjectLike = __webpack_require__(28);

 /** `Object#toString` result references. */
@@ -1987,12 +2063,12 @@ module.exports = isSymbol;

 /***/ }),
-/* 51 */
+/* 54 */
 /***/ (function(module, exports, __webpack_require__) {

-var arrayLikeKeys = __webpack_require__(289),
-    baseKeys = __webpack_require__(296),
-    isArrayLike = __webpack_require__(52);
+var arrayLikeKeys = __webpack_require__(322),
+    baseKeys = __webpack_require__(329),
+    isArrayLike = __webpack_require__(55);

 /**
  * Creates an array of the own enumerable property names of `object`.
@@ -2030,11 +2106,11 @@ module.exports = keys;

 /***/ }),
-/* 52 */
+/* 55 */
 /***/ (function(module, exports, __webpack_require__) {

-var isFunction = __webpack_require__(45),
-    isLength = __webpack_require__(91);
+var isFunction = __webpack_require__(48),
+    isLength = __webpack_require__(98);

 /**
  * Checks if `value` is array-like. A value is considered array-like if it's
@@ -2069,14 +2145,14 @@ module.exports = isArrayLike;

 /***/ }),
-/* 53 */
+/* 56 */
 /***/ (function(module, exports, __webpack_require__) {

-var listCacheClear = __webpack_require__(303),
-    listCacheDelete = __webpack_require__(304),
-    listCacheGet = __webpack_require__(305),
-    listCacheHas = __webpack_require__(306),
-    listCacheSet = __webpack_require__(307);
+var listCacheClear = __webpack_require__(336),
+    listCacheDelete = __webpack_require__(337),
+    listCacheGet = __webpack_require__(338),
+    listCacheHas = __webpack_require__(339),
+    listCacheSet = __webpack_require__(340);

 /**
  * Creates an list cache object.
@@ -2107,10 +2183,10 @@ module.exports = ListCache;

 /***/ }),
-/* 54 */
+/* 57 */
 /***/ (function(module, exports, __webpack_require__) {

-var eq = __webpack_require__(55);
+var eq = __webpack_require__(58);

 /**
  * Gets the index at which the `key` is found in `array` of key-value pairs.
@@ -2134,7 +2210,7 @@ module.exports = assocIndexOf;

 /***/ }),
-/* 55 */
+/* 58 */
 /***/ (function(module, exports) {

 /**
@@ -2177,7 +2253,7 @@ module.exports = eq;

 /***/ }),
-/* 56 */
+/* 59 */
 /***/ (function(module, exports, __webpack_require__) {

 var getNative = __webpack_require__(22);
@@ -2189,10 +2265,10 @@ module.exports = nativeCreate;

 /***/ }),
-/* 57 */
+/* 60 */
 /***/ (function(module, exports, __webpack_require__) {

-var isKeyable = __webpack_require__(321);
+var isKeyable = __webpack_require__(354);

 /**
  * Gets the data for `map`.
@@ -2213,10 +2289,10 @@ module.exports = getMapData;

 /***/ }),
-/* 58 */
+/* 61 */
 /***/ (function(module, exports, __webpack_require__) {

-var isSymbol = __webpack_require__(50);
+var isSymbol = __webpack_require__(53);

 /** Used as references for various `Number` constants. */
 var INFINITY = 1 / 0;
@@ -2240,13 +2316,13 @@ module.exports = toKey;

 /***/ }),
-/* 59 */
+/* 62 */
 /***/ (function(module, exports) {

 module.exports = ReactDOM;

 /***/ }),
-/* 60 */
+/* 63 */
 /***/ (function(module, exports, __webpack_require__) {

 "use strict";
@@ -2288,7 +2364,7 @@ emptyFunction.thatReturnsArgument = function (arg) {
 module.exports = emptyFunction;

 /***/ }),
-/* 61 */
+/* 64 */
 /***/ (function(module, exports, __webpack_require__) {

 "use strict";
@@ -2345,10 +2421,10 @@ function invariant(condition, format, a, b, c, d, e, f) {
 }

 module.exports = invariant;
-/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(16)))
+/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(11)))

 /***/ }),
-/* 62 */
+/* 65 */
 /***/ (function(module, exports, __webpack_require__) {

 "use strict";
@@ -2367,7 +2443,7 @@ module.exports = ReactPropTypesSecret;

 /***/ }),
-/* 63 */
+/* 66 */
 /***/ (function(module, exports, __webpack_require__) {

 "use strict";
@@ -2378,11 +2454,11 @@ exports.locationsAreEqual = exports.createLocation = undefined;

 var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };

-var _resolvePathname = __webpack_require__(96);
+var _resolvePathname = __webpack_require__(103);

 var _resolvePathname2 = _interopRequireDefault(_resolvePathname);

-var _valueEqual = __webpack_require__(97);
+var _valueEqual = __webpack_require__(104);

 var _valueEqual2 = _interopRequireDefault(_valueEqual);

@@ -2451,7 +2527,7 @@ var locationsAreEqual = exports.locationsAreEqual = function locationsAreEqual(a
 };

 /***/ }),
-/* 64 */
+/* 67 */
 /***/ (function(module, exports, __webpack_require__) {

 "use strict";
@@ -2542,18 +2618,18 @@ var createTransitionManager = function createTransitionManager() {
 exports.default = createTransitionManager;

 /***/ }),
-/* 65 */
+/* 68 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {

 "use strict";
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_react_router_es_Router__ = __webpack_require__(37);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_react_router_es_Router__ = __webpack_require__(38);
 // Written in this round about way for babel-transform-imports

 /* harmony default export */ __webpack_exports__["a"] = (__WEBPACK_IMPORTED_MODULE_0_react_router_es_Router__["a" /* default */]);

 /***/ }),
-/* 66 */
+/* 69 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {

 "use strict";
@@ -2565,7 +2641,7 @@ exports.default = createTransitionManager;
 /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_react__);
 /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_prop_types__ = __webpack_require__(1);
 /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_prop_types__);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__matchPath__ = __webpack_require__(38);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__matchPath__ = __webpack_require__(39);
 var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };

 function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
@@ -2702,7 +2778,7 @@ Route.childContextTypes = {
 /* harmony default export */ __webpack_exports__["a"] = (Route);

 /***/ }),
-/* 67 */
+/* 70 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {

 "use strict";
@@ -2787,28 +2863,255 @@ var createTransitionManager = function createTransitionManager() {
 /* harmony default export */ __webpack_exports__["a"] = (createTransitionManager);

 /***/ }),
-/* 68 */
+/* 71 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+/**
+ * Copyright 2015, Yahoo! Inc.
+ * Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms.
+ */
+
+
+var REACT_STATICS = {
+    childContextTypes: true,
+    contextTypes: true,
+    defaultProps: true,
+    displayName: true,
+    getDefaultProps: true,
+    mixins: true,
+    propTypes: true,
+    type: true
+};
+
+var KNOWN_STATICS = {
+  name: true,
+  length: true,
+  prototype: true,
+  caller: true,
+  callee: true,
+  arguments: true,
+  arity: true
+};
+
+var defineProperty = Object.defineProperty;
+var getOwnPropertyNames = Object.getOwnPropertyNames;
+var getOwnPropertySymbols = Object.getOwnPropertySymbols;
+var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
+var getPrototypeOf = Object.getPrototypeOf;
+var objectPrototype = getPrototypeOf && getPrototypeOf(Object);
+
+module.exports = function hoistNonReactStatics(targetComponent, sourceComponent, blacklist) {
+    if (typeof sourceComponent !== 'string') { // don't hoist over string (html) components
+
+        if (objectPrototype) {
+            var inheritedComponent = getPrototypeOf(sourceComponent);
+            if (inheritedComponent && inheritedComponent !== objectPrototype) {
+                hoistNonReactStatics(targetComponent, inheritedComponent, blacklist);
+            }
+        }
+
+        var keys = getOwnPropertyNames(sourceComponent);
+
+        if (getOwnPropertySymbols) {
+            keys = keys.concat(getOwnPropertySymbols(sourceComponent));
+        }
+
+        for (var i = 0; i < keys.length; ++i) {
+            var key = keys[i];
+            if (!REACT_STATICS[key] && !KNOWN_STATICS[key] && (!blacklist || !blacklist[key])) {
+                var descriptor = getOwnPropertyDescriptor(sourceComponent, key);
+                try { // Avoid failures from read-only properties
+                    defineProperty(targetComponent, key, descriptor);
+                } catch (e) {}
+            }
+        }
+
+        return targetComponent;
+    }
+
+    return targetComponent;
+};
+
+
+/***/ }),
+/* 72 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony export (immutable) */ __webpack_exports__["a"] = warning;
+/**
+ * Prints a warning in the console if it exists.
+ *
+ * @param {String} message The warning message.
+ * @returns {void}
+ */
+function warning(message) {
+  /* eslint-disable no-console */
+  if (typeof console !== 'undefined' && typeof console.error === 'function') {
+    console.error(message);
+  }
+  /* eslint-enable no-console */
+  try {
+    // This error was thrown as a convenience so that if you enable
+    // "break on all exceptions" in your console,
+    // it would pause the execution at this line.
+    throw new Error(message);
+    /* eslint-disable no-empty */
+  } catch (e) {}
+  /* eslint-enable no-empty */
+}
+
+/***/ }),
+/* 73 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__baseGetTag_js__ = __webpack_require__(208);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__getPrototype_js__ = __webpack_require__(213);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__isObjectLike_js__ = __webpack_require__(215);
+
+
+
+
+/** `Object#toString` result references. */
+var objectTag = '[object Object]';
+
+/** Used for built-in method references. */
+var funcProto = Function.prototype,
+    objectProto = Object.prototype;
+
+/** Used to resolve the decompiled source of functions. */
+var funcToString = funcProto.toString;
+
+/** Used to check objects for own properties. */
+var hasOwnProperty = objectProto.hasOwnProperty;
+
+/** Used to infer the `Object` constructor. */
+var objectCtorString = funcToString.call(Object);
+
+/**
+ * Checks if `value` is a plain object, that is, an object created by the
+ * `Object` constructor or one with a `[[Prototype]]` of `null`.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.8.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.
+ * @example
+ *
+ * function Foo() {
+ *   this.a = 1;
+ * }
+ *
+ * _.isPlainObject(new Foo);
+ * // => false
+ *
+ * _.isPlainObject([1, 2, 3]);
+ * // => false
+ *
+ * _.isPlainObject({ 'x': 0, 'y': 0 });
+ * // => true
+ *
+ * _.isPlainObject(Object.create(null));
+ * // => true
+ */
+function isPlainObject(value) {
+  if (!Object(__WEBPACK_IMPORTED_MODULE_2__isObjectLike_js__["a" /* default */])(value) || Object(__WEBPACK_IMPORTED_MODULE_0__baseGetTag_js__["a" /* default */])(value) != objectTag) {
+    return false;
+  }
+  var proto = Object(__WEBPACK_IMPORTED_MODULE_1__getPrototype_js__["a" /* default */])(value);
+  if (proto === null) {
+    return true;
+  }
+  var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;
+  return typeof Ctor == 'function' && Ctor instanceof Ctor &&
+    funcToString.call(Ctor) == objectCtorString;
+}
+
+/* harmony default export */ __webpack_exports__["a"] = (isPlainObject);
+
+
+/***/ }),
+/* 74 */
+/***/ (function(module, exports) {
+
+var g;
+
+// This works in non-strict mode
+g = (function() {
+	return this;
+})();
+
+try {
+	// This works if eval is allowed (see CSP)
+	g = g || Function("return this")() || (1,eval)("this");
+} catch(e) {
+	// This works if the window reference is available
+	if(typeof window === "object")
+		g = window;
+}
+
+// g can still be undefined, but nothing to do about it...
+// We return undefined, instead of nothing here, so it's
+// easier to handle this case. if(!global) { ...}
+
+module.exports = g;
+
+
+/***/ }),
+/* 75 */
+/***/ (function(module, exports) {
+
+module.exports = function(module) {
+	if(!module.webpackPolyfill) {
+		module.deprecate = function() {};
+		module.paths = [];
+		// module.parent = undefined by default
+		if(!module.children) module.children = [];
+		Object.defineProperty(module, "loaded", {
+			enumerable: true,
+			get: function() {
+				return module.l;
+			}
+		});
+		Object.defineProperty(module, "id", {
+			enumerable: true,
+			get: function() {
+				return module.i;
+			}
+		});
+		module.webpackPolyfill = 1;
+	}
+	return module;
+};
+
+
+/***/ }),
+/* 76 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {

 "use strict";
 Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__MemoryRouter__ = __webpack_require__(100);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__MemoryRouter__ = __webpack_require__(107);
 /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "MemoryRouter", function() { return __WEBPACK_IMPORTED_MODULE_0__MemoryRouter__["a"]; });
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Prompt__ = __webpack_require__(102);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Prompt__ = __webpack_require__(109);
 /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "Prompt", function() { return __WEBPACK_IMPORTED_MODULE_1__Prompt__["a"]; });
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__Redirect__ = __webpack_require__(103);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__Redirect__ = __webpack_require__(110);
 /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "Redirect", function() { return __WEBPACK_IMPORTED_MODULE_2__Redirect__["a"]; });
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__Route__ = __webpack_require__(66);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__Route__ = __webpack_require__(69);
 /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "Route", function() { return __WEBPACK_IMPORTED_MODULE_3__Route__["a"]; });
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__Router__ = __webpack_require__(37);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__Router__ = __webpack_require__(38);
 /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "Router", function() { return __WEBPACK_IMPORTED_MODULE_4__Router__["a"]; });
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__StaticRouter__ = __webpack_require__(105);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__StaticRouter__ = __webpack_require__(112);
 /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "StaticRouter", function() { return __WEBPACK_IMPORTED_MODULE_5__StaticRouter__["a"]; });
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__Switch__ = __webpack_require__(106);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__Switch__ = __webpack_require__(113);
 /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "Switch", function() { return __WEBPACK_IMPORTED_MODULE_6__Switch__["a"]; });
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__matchPath__ = __webpack_require__(38);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__matchPath__ = __webpack_require__(39);
 /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "matchPath", function() { return __WEBPACK_IMPORTED_MODULE_7__matchPath__["a"]; });
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__withRouter__ = __webpack_require__(107);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__withRouter__ = __webpack_require__(114);
 /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "withRouter", function() { return __WEBPACK_IMPORTED_MODULE_8__withRouter__["a"]; });

@@ -2830,18 +3133,26 @@ Object.defineProperty(__webpack_exports__, "__esModule", { value: true });

 /***/ }),
-/* 69 */
+/* 77 */
 /***/ (function(module, exports, __webpack_require__) {

 "use strict";

 Object.defineProperty(exports, "__esModule", { value: true });
-const BASEURL = 'http://localhost:5000';
-exports.BASEURL = BASEURL;
+function storeTokens(tokens, remember) {
+    if (tokens === undefined)
+        return;
+    let storage = remember ? localStorage : sessionStorage;
+    let access_token_key = 'access_token';
+    let refresh_token_key = 'refresh_token';
+    storage.setItem(access_token_key, tokens.access_token);
+    storage.setItem(refresh_token_key, tokens.refresh_token);
+}
+exports.storeTokens = storeTokens;

 /***/ }),
-/* 70 */
+/* 78 */
 /***/ (function(module, exports) {

 // 7.2.1 RequireObjectCoercible(argument)
@@ -2852,18 +3163,18 @@ module.exports = function (it) {

 /***/ }),
-/* 71 */
+/* 79 */
 /***/ (function(module, exports, __webpack_require__) {

-var shared = __webpack_require__(72)('keys');
-var uid = __webpack_require__(41);
+var shared = __webpack_require__(80)('keys');
+var uid = __webpack_require__(44);
 module.exports = function (key) {
   return shared[key] || (shared[key] = uid(key));
 };

 /***/ }),
-/* 72 */
+/* 80 */
 /***/ (function(module, exports, __webpack_require__) {

 var global = __webpack_require__(17);
@@ -2875,11 +3186,11 @@ module.exports = function (key) {

 /***/ }),
-/* 73 */
+/* 81 */
 /***/ (function(module, exports, __webpack_require__) {

 // optional / simple context binding
-var aFunction = __webpack_require__(201);
+var aFunction = __webpack_require__(237);
 module.exports = function (fn, that, length) {
   aFunction(fn);
   if (that === undefined) return fn;
@@ -2901,11 +3212,11 @@ module.exports = function (fn, that, length) {

 /***/ }),
-/* 74 */
+/* 82 */
 /***/ (function(module, exports, __webpack_require__) {

 // 7.1.1 ToPrimitive(input [, PreferredType])
-var isObject = __webpack_require__(31);
+var isObject = __webpack_require__(32);
 // instead of the ES6 spec version, we didn't implement @@toPrimitive case
 // and the second argument - flag - preferred type is a string
 module.exports = function (it, S) {
@@ -2919,7 +3230,7 @@ module.exports = function (it, S) {

 /***/ }),
-/* 75 */
+/* 83 */
 /***/ (function(module, exports) {

 // 7.1.4 ToInteger
@@ -2931,34 +3242,34 @@ module.exports = function (it) {

 /***/ }),
-/* 76 */
+/* 84 */
 /***/ (function(module, exports) {

 module.exports = true;

 /***/ }),
-/* 77 */
+/* 85 */
 /***/ (function(module, exports, __webpack_require__) {

 // 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])
 var anObject = __webpack_require__(25);
-var dPs = __webpack_require__(208);
-var enumBugKeys = __webpack_require__(79);
-var IE_PROTO = __webpack_require__(71)('IE_PROTO');
+var dPs = __webpack_require__(244);
+var enumBugKeys = __webpack_require__(87);
+var IE_PROTO = __webpack_require__(79)('IE_PROTO');
 var Empty = function () { /* empty */ };
 var PROTOTYPE = 'prototype';

 // Create object with fake `null` prototype: use iframe Object with cleared prototype
 var createDict = function () {
   // Thrash, waste and sodomy: IE GC bug
-  var iframe = __webpack_require__(114)('iframe');
+  var iframe = __webpack_require__(129)('iframe');
   var i = enumBugKeys.length;
   var lt = '<';
   var gt = '>';
   var iframeDocument;
   iframe.style.display = 'none';
-  __webpack_require__(211).appendChild(iframe);
+  __webpack_require__(247).appendChild(iframe);
   iframe.src = 'javascript:'; // eslint-disable-line no-script-url
   // createDict = iframe.contentWindow.Object;
   // html.removeChild(iframe);
@@ -2985,7 +3296,7 @@ module.exports = Object.create || function create(O, Properties) {

 /***/ }),
-/* 78 */
+/* 86 */
 /***/ (function(module, exports) {

 var toString = {}.toString;
@@ -2996,7 +3307,7 @@ module.exports = function (it) {

 /***/ }),
-/* 79 */
+/* 87 */
 /***/ (function(module, exports) {

 // IE 8- don't enum bug keys
@@ -3006,12 +3317,12 @@ module.exports = (

 /***/ }),
-/* 80 */
+/* 88 */
 /***/ (function(module, exports, __webpack_require__) {

 var def = __webpack_require__(19).f;
 var has = __webpack_require__(20);
-var TAG = __webpack_require__(15)('toStringTag');
+var TAG = __webpack_require__(16)('toStringTag');

 module.exports = function (it, tag, stat) {
   if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { configurable: true, value: tag });
@@ -3019,20 +3330,20 @@ module.exports = function (it, tag, stat) {

 /***/ }),
-/* 81 */
+/* 89 */
 /***/ (function(module, exports, __webpack_require__) {

-exports.f = __webpack_require__(15);
+exports.f = __webpack_require__(16);

 /***/ }),
-/* 82 */
+/* 90 */
 /***/ (function(module, exports, __webpack_require__) {

 var global = __webpack_require__(17);
-var core = __webpack_require__(13);
-var LIBRARY = __webpack_require__(76);
-var wksExt = __webpack_require__(81);
+var core = __webpack_require__(14);
+var LIBRARY = __webpack_require__(84);
+var wksExt = __webpack_require__(89);
 var defineProperty = __webpack_require__(19).f;
 module.exports = function (name) {
   var $Symbol = core.Symbol || (core.Symbol = LIBRARY ? {} : global.Symbol || {});
@@ -3041,19 +3352,19 @@ module.exports = function (name) {

 /***/ }),
-/* 83 */
+/* 91 */
 /***/ (function(module, exports) {

 exports.f = Object.getOwnPropertySymbols;

 /***/ }),
-/* 84 */
+/* 92 */
 /***/ (function(module, exports, __webpack_require__) {

-var identity = __webpack_require__(34),
-    overRest = __webpack_require__(233),
-    setToString = __webpack_require__(125);
+var identity = __webpack_require__(35),
+    overRest = __webpack_require__(269),
+    setToString = __webpack_require__(140);

 /**
  * The base implementation of `_.rest` which doesn't validate or coerce arguments.
@@ -3071,7 +3382,7 @@ module.exports = baseRest;

 /***/ }),
-/* 85 */
+/* 93 */
 /***/ (function(module, exports) {

 /**
@@ -3098,7 +3409,7 @@ module.exports = apply;

 /***/ }),
-/* 86 */
+/* 94 */
 /***/ (function(module, exports, __webpack_require__) {

 var isObject = __webpack_require__(23);
@@ -3134,11 +3445,11 @@ module.exports = baseCreate;

 /***/ }),
-/* 87 */
+/* 95 */
 /***/ (function(module, exports, __webpack_require__) {

-var baseCreate = __webpack_require__(86),
-    baseLodash = __webpack_require__(88);
+var baseCreate = __webpack_require__(94),
+    baseLodash = __webpack_require__(96);

 /** Used as references for the maximum length and index of an array. */
 var MAX_ARRAY_LENGTH = 4294967295;
@@ -3168,7 +3479,7 @@ module.exports = LazyWrapper;

 /***/ }),
-/* 88 */
+/* 96 */
 /***/ (function(module, exports) {

 /**
@@ -3184,7 +3495,7 @@ module.exports = baseLodash;

 /***/ }),
-/* 89 */
+/* 97 */
 /***/ (function(module, exports) {

 /**
@@ -3203,35 +3514,7 @@ module.exports = getHolder;

 /***/ }),
-/* 90 */
-/***/ (function(module, exports) {
-
-module.exports = function(module) {
-	if(!module.webpackPolyfill) {
-		module.deprecate = function() {};
-		module.paths = [];
-		// module.parent = undefined by default
-		if(!module.children) module.children = [];
-		Object.defineProperty(module, "loaded", {
-			enumerable: true,
-			get: function() {
-				return module.l;
-			}
-		});
-		Object.defineProperty(module, "id", {
-			enumerable: true,
-			get: function() {
-				return module.i;
-			}
-		});
-		module.webpackPolyfill = 1;
-	}
-	return module;
-};
-
-
-/***/ }),
-/* 91 */
+/* 98 */
 /***/ (function(module, exports) {

 /** Used as references for various `Number` constants. */
@@ -3272,11 +3555,11 @@ module.exports = isLength;

 /***/ }),
-/* 92 */
+/* 99 */
 /***/ (function(module, exports, __webpack_require__) {

 var getNative = __webpack_require__(22),
-    root = __webpack_require__(12);
+    root = __webpack_require__(13);

 /* Built-in method references that are verified to be native. */
 var Map = getNative(root, 'Map');
@@ -3285,14 +3568,14 @@ module.exports = Map;

 /***/ }),
-/* 93 */
+/* 100 */
 /***/ (function(module, exports, __webpack_require__) {

-var mapCacheClear = __webpack_require__(313),
-    mapCacheDelete = __webpack_require__(320),
-    mapCacheGet = __webpack_require__(322),
-    mapCacheHas = __webpack_require__(323),
-    mapCacheSet = __webpack_require__(324);
+var mapCacheClear = __webpack_require__(346),
+    mapCacheDelete = __webpack_require__(353),
+    mapCacheGet = __webpack_require__(355),
+    mapCacheHas = __webpack_require__(356),
+    mapCacheSet = __webpack_require__(357);

 /**
  * Creates a map cache object to store key-value pairs.
@@ -3323,11 +3606,11 @@ module.exports = MapCache;

 /***/ }),
-/* 94 */
+/* 101 */
 /***/ (function(module, exports, __webpack_require__) {

-var isArray = __webpack_require__(14),
-    isSymbol = __webpack_require__(50);
+var isArray = __webpack_require__(15),
+    isSymbol = __webpack_require__(53);

 /** Used to match property names within property paths. */
 var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,
@@ -3358,7 +3641,7 @@ module.exports = isKey;

 /***/ }),
-/* 95 */
+/* 102 */
 /***/ (function(module, exports, __webpack_require__) {

 "use strict";
@@ -3372,7 +3655,7 @@ module.exports = isKey;

-var emptyFunction = __webpack_require__(60);
+var emptyFunction = __webpack_require__(63);

 /**
  * Similar to invariant but only logs a warning if the condition is not met.
@@ -3424,10 +3707,10 @@ if (process.env.NODE_ENV !== 'production') {
 }

 module.exports = warning;
-/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(16)))
+/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(11)))

 /***/ }),
-/* 96 */
+/* 103 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {

 "use strict";
@@ -3504,7 +3787,7 @@ function resolvePathname(to) {
 /* harmony default export */ __webpack_exports__["default"] = (resolvePathname);

 /***/ }),
-/* 97 */
+/* 104 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {

 "use strict";
@@ -3549,7 +3832,7 @@ function valueEqual(a, b) {
 /* harmony default export */ __webpack_exports__["default"] = (valueEqual);

 /***/ }),
-/* 98 */
+/* 105 */
 /***/ (function(module, exports, __webpack_require__) {

 "use strict";
@@ -3610,7 +3893,7 @@ var isExtraneousPopstateEvent = exports.isExtraneousPopstateEvent = function isE
 };

 /***/ }),
-/* 99 */
+/* 106 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {

 "use strict";
@@ -3720,7 +4003,7 @@ Link.contextTypes = {
 /* harmony default export */ __webpack_exports__["a"] = (Link);

 /***/ }),
-/* 100 */
+/* 107 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {

 "use strict";
@@ -3730,9 +4013,9 @@ Link.contextTypes = {
 /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
 /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_prop_types__ = __webpack_require__(1);
 /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_prop_types__);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_history_createMemoryHistory__ = __webpack_require__(173);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_history_createMemoryHistory__ = __webpack_require__(187);
 /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_history_createMemoryHistory___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_history_createMemoryHistory__);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__Router__ = __webpack_require__(37);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__Router__ = __webpack_require__(38);
 function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

 function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
@@ -3787,18 +4070,18 @@ MemoryRouter.propTypes = {
 /* harmony default export */ __webpack_exports__["a"] = (MemoryRouter);

 /***/ }),
-/* 101 */
+/* 108 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {

 "use strict";
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_react_router_es_Route__ = __webpack_require__(66);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_react_router_es_Route__ = __webpack_require__(69);
 // Written in this round about way for babel-transform-imports

 /* harmony default export */ __webpack_exports__["a"] = (__WEBPACK_IMPORTED_MODULE_0_react_router_es_Route__["a" /* default */]);

 /***/ }),
-/* 102 */
+/* 109 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {

 "use strict";
@@ -3889,7 +4172,7 @@ Prompt.contextTypes = {
 /* harmony default export */ __webpack_exports__["a"] = (Prompt);

 /***/ }),
-/* 103 */
+/* 110 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {

 "use strict";
@@ -3901,7 +4184,7 @@ Prompt.contextTypes = {
 /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_warning___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_warning__);
 /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_invariant__ = __webpack_require__(3);
 /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_invariant___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_invariant__);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4_history__ = __webpack_require__(179);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4_history__ = __webpack_require__(193);
 function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

 function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
@@ -3997,7 +4280,7 @@ Redirect.contextTypes = {
 /* harmony default export */ __webpack_exports__["a"] = (Redirect);

 /***/ }),
-/* 104 */
+/* 111 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {

 "use strict";
@@ -4063,7 +4346,7 @@ var isExtraneousPopstateEvent = function isExtraneousPopstateEvent(event) {
 };

 /***/ }),
-/* 105 */
+/* 112 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {

 "use strict";
@@ -4077,7 +4360,7 @@ var isExtraneousPopstateEvent = function isExtraneousPopstateEvent(event) {
 /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_prop_types__);
 /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4_history_PathUtils__ = __webpack_require__(29);
 /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4_history_PathUtils___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4_history_PathUtils__);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__Router__ = __webpack_require__(37);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__Router__ = __webpack_require__(38);
 var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var s…
  • Loading branch information
andersfischernielsen committed Nov 14, 2017
1 parent 87c536a commit 67f456b
Show file tree
Hide file tree
Showing 16 changed files with 6,631 additions and 4,216 deletions.
10,538 changes: 6,361 additions & 4,177 deletions dist/bundle.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion dist/bundle.js.map

Large diffs are not rendered by default.

48 changes: 48 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 4 additions & 0 deletions package.json
Expand Up @@ -18,11 +18,15 @@
"react-google-maps": "^9.2.0"
},
"devDependencies": {
"@types/react-redux": "^5.0.12",
"@types/react-router": "^4.0.16",
"@types/react-router-dom": "^4.2.0",
"awesome-typescript-loader": "^3.2.3",
"react-redux": "^5.0.6",
"react-router": "^4.2.0",
"react-router-dom": "^4.2.2",
"redux": "^3.7.2",
"redux-thunk": "^2.2.0",
"source-map-loader": "^0.2.3",
"typescript": "^2.5.3",
"webpack": "^3.8.1",
Expand Down
Binary file modified src/.DS_Store
Binary file not shown.
52 changes: 52 additions & 0 deletions src/FetchHelper.ts
@@ -0,0 +1,52 @@
import { Tokens, storeTokens } from './LoginHelper';
import { BASEURL } from './config';

export async function fetchWithToken(url: string) {
let local = localStorage.length > 0;
let session = sessionStorage.length > 0;
var keys : Tokens;

if (local || session) {
let storage = local ? localStorage : sessionStorage;
keys = getTokensFromStorage(storage);
}

let getTokenURL = (url:string) =>
(local || session) ? url + `?access_token=${keys.access_token}` : url;

let headers = new Headers({
"Content-Type": "application/json",
"Accept": "application/json",
"Access-Control-Allow-Origin": "no-cors"
});

let options : any = {
headers: headers
};

//Try to get (with tokens if present).
let initialResponse = await fetch(getTokenURL(url));
if (initialResponse.status === 401) {
//If no tokens are present, return received 401.
if (!local && !session) return initialResponse;

//Attempt to refresh tokens.
options.method = 'POST'
options.body = JSON.stringify({ refresh_token: keys.refresh_token });
let refreshResponse = await fetch(BASEURL + '/refreshtoken');
if (refreshResponse.status !== 200) return refreshResponse;

//Save tokens, retry call.
let json = await refreshResponse.json() as Tokens;
storeTokens(json, session !== undefined)
return await fetch(getTokenURL(url));
}
else return initialResponse;
}

function getTokensFromStorage(storage: Storage): Tokens {
return {
access_token: storage.getItem('access_token'),
refresh_token: storage.getItem('refresh_token')
};
}
6 changes: 3 additions & 3 deletions src/components/login/LoginHelper.ts → src/LoginHelper.ts
@@ -1,8 +1,8 @@
export function storeTokens(tokens:Tokens, username: string, remember: boolean) {
export function storeTokens(tokens:Tokens, remember: boolean) {
if (tokens === undefined) return;
let storage = remember ? localStorage : sessionStorage;
let access_token_key = `${username}:access_token`;
let refresh_token_key = `${username}:refresh_token`;
let access_token_key = 'access_token';
let refresh_token_key = 'refresh_token';
storage.setItem(access_token_key, tokens.access_token);
storage.setItem(refresh_token_key, tokens.refresh_token);
}
Expand Down
25 changes: 20 additions & 5 deletions src/components/Header.tsx
@@ -1,12 +1,20 @@
import * as React from 'react'
import { Link } from 'react-router-dom'
import { Logout } from './login/Logout';
import { connect } from 'react-redux';
import { logout, Store } from '../redux/reducer';

interface HeaderState {
interface HeaderProps {
loggedIn: boolean
}

export class Header extends React.Component<{}, HeaderState> {
export class HeaderComponent extends React.Component<HeaderProps, {}> {
renderLoginLogout(loggedIn: boolean) {
if (loggedIn) return <li className="nav-item"><Logout /></li>;
return <li className="nav-item"><Link className="nav-link" to='/login'>Log in</Link></li>;
}


render() { return (
<header>
<nav className="nav navbar navbar-expand-lg">
Expand All @@ -15,12 +23,19 @@ export class Header extends React.Component<{}, HeaderState> {
<div className="collapse navbar-collapse">
<ul className="navbar-nav">
<li className="nav-item"><Link className="nav-link" to='/signup'>Sign up</Link></li>
<li className="nav-item"><Link className="nav-link" to='/login'>Log in</Link></li>
<li className="nav-item"><Logout /></li>
{ this.renderLoginLogout(this.props.loggedIn) }
</ul>
</div>
</nav>
</header>
);
}
}
}

const mapStateToProps = (state:Store) => {
return {
loggedIn: state.isLoginSuccess
};
}

export const Header = connect(mapStateToProps)(HeaderComponent);
39 changes: 30 additions & 9 deletions src/components/login/Login.tsx
@@ -1,21 +1,28 @@
import * as React from "react";
import { Redirect } from "react-router";
import { BASEURL } from '../../config'
import { Tokens, storeTokens } from './LoginHelper'
import { connect } from 'react-redux';
import { Tokens, storeTokens } from './../../LoginHelper'
import { login, Store } from '../../redux/reducer';

export interface ILoginState {
export interface LoginState {
username: string,
password: string,
remember: boolean,
shouldRedirect: boolean
loggedIn: boolean
}

export class Login extends React.Component<{}, ILoginState> {
interface LoginProps {
loggedIn: boolean,
login: any
}

class LoginComponent extends React.Component<LoginProps, LoginState> {
constructor(props:any) {
super(props);
this.handleSubmit = this.handleSubmit.bind(this);
this.handleChange = this.handleChange.bind(this);
this.state = {username: undefined, password: undefined, remember: false, shouldRedirect: false};
this.state = {username: undefined, password: undefined, remember: false, loggedIn: false};
}

async handleSubmit(event:any) {
Expand All @@ -36,8 +43,8 @@ export class Login extends React.Component<{}, ILoginState> {
let response = await fetch(BASEURL + '/auth', options);
if (response.status == 401) return;
let json = await response.json() as Tokens;
storeTokens(json, this.state.username, this.state.remember);
this.setState((prev, props) => ({shouldRedirect: true}));
storeTokens(json, this.state.remember);
this.props.login(this.state.username);
} catch {

}
Expand All @@ -50,7 +57,7 @@ export class Login extends React.Component<{}, ILoginState> {
}

render() {
if (this.state.shouldRedirect === true) return (<Redirect to={`user/${this.state.username}`} />);
if (this.props.loggedIn) return (<Redirect to={`user/${this.state.username}`} />);
return (
<div>
<h1>Login</h1>
Expand All @@ -65,4 +72,18 @@ export class Login extends React.Component<{}, ILoginState> {
</div>
);
}
}
}

const mapStateToProps = (state:Store) => {
return {
loggedIn: state.isLoginSuccess
};
}

const mapDispatchToProps = (dispatch:any) => {
return {
login: (username:string) => dispatch(login(username))
};
}

export const Login = connect(mapStateToProps, mapDispatchToProps)(LoginComponent);
36 changes: 28 additions & 8 deletions src/components/login/Logout.tsx
@@ -1,27 +1,47 @@
import * as React from 'react'
import { Redirect, Link } from 'react-router-dom'

import { connect } from 'react-redux';
import { logout, Store } from '../../redux/reducer';

interface LogoutState {
redirect: boolean;
loggedOut: boolean;
}

interface LogoutProps {
loggedOut: boolean,
logout: any
}

export class Logout extends React.Component<{}, LogoutState> {
export class LogoutComponent extends React.Component<any, LogoutState> {
constructor() {
super();
let cookiesPresent = localStorage.length > 0 || sessionStorage.length > 0;
this.clearStorage = this.clearStorage.bind(this);
this.state = {redirect: false};
this.state = {loggedOut: false};
}

clearStorage() {
localStorage.clear();
sessionStorage.clear();
this.setState({redirect: true});
this.props.logout();
this.setState({loggedOut: true});
}

render() {
if (this.state.redirect) return (<Redirect to='/' />);
if (this.state.loggedOut || this.props.loggedOut) return (<Redirect to='/' />);
return (<Link className="nav-link" to='' onClick={this.clearStorage}>Log out</Link>);
}
}
}

const mapStateToProps = (state:Store) => {
return {
loggedOut: !state.isLoginSuccess
};
}

const mapDispatchToProps = (dispatch:any) => {
return {
logout: () => dispatch(logout())
};
}

export const Logout = connect(mapStateToProps, mapDispatchToProps)(LogoutComponent);

0 comments on commit 67f456b

Please sign in to comment.