UNPKG

instantjob-recruiter-client

Version:

a set of tools for creating an instantjob recruiter react client

235 lines (190 loc) 7.19 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck'); var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); var _createClass2 = require('babel-runtime/helpers/createClass'); var _createClass3 = _interopRequireDefault(_createClass2); var _keys = require('babel-runtime/core-js/object/keys'); var _keys2 = _interopRequireDefault(_keys); var _promise = require('babel-runtime/core-js/promise'); var _promise2 = _interopRequireDefault(_promise); var _extends2 = require('babel-runtime/helpers/extends'); var _extends3 = _interopRequireDefault(_extends2); var _stringify = require('babel-runtime/core-js/json/stringify'); var _stringify2 = _interopRequireDefault(_stringify); exports.make_url = make_url; require('whatwg-fetch'); var _superagent = require('superagent'); var _superagent2 = _interopRequireDefault(_superagent); var _constants = require('common/constants'); var _store = require('common/store'); var _store2 = _interopRequireDefault(_store); var _utilities = require('common/utilities'); var _auto_bind = require('common/auto_bind'); var _auto_bind2 = _interopRequireDefault(_auto_bind); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function make_url(endpoint) { return _constants.api_path + '/' + endpoint + '.json?'; } var authentication_headers = function authentication_headers() { var token = _store2.default.getState().authentication.token; if (token) { return { 'Authorization': 'Bearer ' + token }; } return {}; }; var requestWithMethod = function requestWithMethod(method, endpoint) { var data = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; var options = { method: method }; var params = ""; if (method == 'GET' && data !== null) { for (var key in data) { params += encodeURIComponent(key) + "=" + encodeURIComponent(data[key]) + "&"; } data = null; } options.headers = authentication_headers(); if (data !== null) { options.body = (0, _stringify2.default)(data); options.headers = (0, _extends3.default)({}, options.headers, { 'Accept': 'application/json', 'Content-Type': 'application/json' }); } var request_url = '' + make_url(endpoint) + params; return fetch(request_url, options).catch(function (error) { return new _promise2.default(function (resolve, reject) { _constants.DEV && console.log(method, request_url, data); _constants.DEV && console.log(error); return reject(error); }); }).then(function (response) { return new _promise2.default(function (resolve, reject) { if (response == null || response.error || (0, _utilities.array_contains)([400, 404, 422, 500], response.status)) { reject(response); } else if (response.status != 204) { response.json().then(function (responseObject) { if (responseObject == null || responseObject.error || (0, _utilities.array_contains)([400, 404, 422, 500], responseObject.status)) { reject(responseObject); } else { resolve(responseObject); } }).catch(function (error) { return reject(error); }); } else { resolve(response); } }); }); }; var request = { get: function get(endpoint, params, callback) { return requestWithMethod('GET', endpoint, params, callback); }, post: function post(endpoint, data, callback) { return requestWithMethod('POST', endpoint, data, callback); }, put: function put(endpoint, data, callback) { return requestWithMethod('PUT', endpoint, data, callback); }, delete: function _delete(endpoint, data, callback) { return requestWithMethod('DELETE', endpoint, data, callback); }, asynchronous: function asynchronous(endpoint, data) { return new _promise2.default(function (resolve, reject) { var poll_result = function poll_result(asynchronous_request_id) { return requestWithMethod('GET', 'asynchronous_requests/' + asynchronous_request_id).then(function (asynchronous_request) { switch (asynchronous_request.status) { case "pending": setTimeout(function () { return poll_result(asynchronous_request_id); }, 1000); break; case "completed": resolve(JSON.parse(asynchronous_request.result)); break; default: reject(asynchronous_request); } }); }; requestWithMethod('POST', endpoint, data).then(function (response) { return setTimeout(function () { return poll_result(response.asynchronous_request_id); }, 1000); }); }); }, get_paginated: function get_paginated(endpoint) { var data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; var callback = arguments[2]; return new _promise2.default(function (resolve, reject) { var request_page = function request_page(page) { return requestWithMethod('GET', endpoint, (0, _extends3.default)({}, data, { page: page })).then(function (page_results) { if (page_results.length == 0) { resolve(); } else { callback(page_results); request_page(page + 1); } }).catch(reject); }; request_page(1); }); }, upload: function upload(endpoint, file, data) { // request won't start if `then` is not called var request = _superagent2.default.put(make_url(endpoint)).set(authentication_headers()).accept('json').attach('file', file); return (0, _keys2.default)(data).reduce(function (request, key) { return request.field(key, data[key]); }, request); }, delayed_put: function delayed_put(endpoint, data) { return new _promise2.default(function (resolve, reject) { var delayed_request = delayed_requests[endpoint]; if (delayed_request && !delayed_request.completed) { resolve = delayed_request.cancel(resolve); } delayed_requests[endpoint] = new DelayedRequest(function () { return request.put(endpoint, data); }, resolve, reject); }); } }; var delayed_requests = {}; var DelayedRequest = function () { function DelayedRequest(request, resolve, reject) { (0, _classCallCheck3.default)(this, DelayedRequest); this.request = request; this.resolve = resolve; this.reject = reject; (0, _auto_bind2.default)(this); setTimeout(this.run, 2 * 1000); } (0, _createClass3.default)(DelayedRequest, [{ key: 'run', value: function run() { this.completed = true; if (!this.canceled) { this.request().then(this.resolve, this.reject); } } }, { key: 'cancel', value: function cancel(resolve) { var _this = this; this.canceled = true; return function () { resolve.apply(undefined, arguments); _this.resolve.apply(_this, arguments); }; } }]); return DelayedRequest; }(); exports.default = request;