UNPKG

drupal-react-oauth-provider

Version:
90 lines (89 loc) 4.23 kB
"use strict"; var __assign = (this && this.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.DrupalProvider = exports.DrupalContext = void 0; var jsx_runtime_1 = require("react/jsx-runtime"); var react_1 = __importDefault(require("react")); var refreshToken_1 = require("./util/refreshToken"); exports.DrupalContext = react_1.default.createContext({ url: '', }); var DrupalProvider = function (_a) { var children = _a.children, config = _a.config; var _b = react_1.default.useState(new Headers({ 'Content-Type': 'application/json', Accept: 'application/json' })), headers = _b[0], setHeaders = _b[1]; var _c = react_1.default.useState(localStorage.getItem('token') !== null ? JSON.parse(localStorage.getItem('token')) : null), token = _c[0], setToken = _c[1]; var _d = react_1.default.useState(false), _isAuthenticated = _d[0], setIsAuthenticated = _d[1]; /** * This function will add headers for useAPI(), useLazyAPI(). */ var addHeaders = function (key, value) { var newHeaders = headers; newHeaders.delete(key); // toDo - Crutch? Checks should be enough? newHeaders.append(key, value); setHeaders(newHeaders); }; /** * This function will remove headers for useAPI(), useLazyAPI(). */ var removeHeaders = function (key) { var newHeaders = headers; newHeaders.delete(key); setHeaders(newHeaders); }; var getHeaders = function () { return headers; }; // We are setting tokens from outside React because of rules of hooks. Handler needed for state to work correctly. var handleSetToken = function (newToken) { newToken.date = Math.floor(Date.now() / 1000); newToken.expirationDate = newToken.date + newToken.expires_in; localStorage.setItem('token', JSON.stringify(newToken)); setIsAuthenticated(true); setToken(newToken); addHeaders('Authorization', "".concat(newToken.token_type, " ").concat(newToken.access_token)); addHeaders('Content-Type', 'application/json'); }; var logoutUser = function () { localStorage.clear(); setToken(null); setIsAuthenticated(false); removeHeaders('Authorization'); removeHeaders('Content-Type'); }; // Store oauth settings in localStorage var storeOauthSettings = function (oauthSettings) { localStorage.setItem('oauthSettings', JSON.stringify(oauthSettings)); }; // Refresh token if it is expired when app is opened. react_1.default.useEffect(function () { if (!token || _isAuthenticated) return; if (token.expirationDate > Math.floor(Date.now() / 1000)) { addHeaders('Authorization', "".concat(token.token_type, " ").concat(token.access_token)); addHeaders('Content-Type', 'application/json'); setIsAuthenticated(true); } if (token.expirationDate < Math.floor(Date.now() / 1000)) { // Ok to call this non async as the state will update (0, refreshToken_1.refreshToken)({ handleSetToken: handleSetToken, }); } }, [token]); return ((0, jsx_runtime_1.jsx)(exports.DrupalContext.Provider, __assign({ value: __assign(__assign({}, config), { // includes url token: token, handleSetToken: handleSetToken, _isAuthenticated: _isAuthenticated, storeOauthSettings: storeOauthSettings, getHeaders: getHeaders, addHeaders: addHeaders, removeHeaders: removeHeaders, logoutUser: logoutUser }) }, { children: children }))); }; exports.DrupalProvider = DrupalProvider;