drupal-react-oauth-provider
Version:
Drupal React Oauth Provider and Hooks for REST / JSONAPI etc.
90 lines (89 loc) • 4.23 kB
JavaScript
;
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;