141 lines
4.1 KiB
JavaScript
141 lines
4.1 KiB
JavaScript
import $ from 'jquery'
|
|
import config from '../appConfig'
|
|
|
|
export const parseSearchDays = function (date) {
|
|
const period = date.slice(-1)
|
|
const dateNum = parseInt(date)
|
|
|
|
if (period === 'd') {
|
|
return dateNum
|
|
} else {
|
|
let daysCount = 0
|
|
|
|
for (let i = 0; i <= dateNum; i++) {
|
|
const date = new Date(new Date().setFullYear(new Date().getFullYear() - i))
|
|
daysCount += date.getFullYear() % 4 === 0 ? 366 : 365
|
|
console.log(daysCount)
|
|
}
|
|
return daysCount
|
|
}
|
|
}
|
|
|
|
export const makeStickySidebar = function ({component, sidebarSelector, footerSelector, sidebarTopMargin, sidebarBottomMargin}) {
|
|
const sidebarEl = $(sidebarSelector)
|
|
const footerEl = $(footerSelector)
|
|
const sidebarTopPos = parseInt(sidebarEl.css('top'))
|
|
const sidebarBottomPos = parseInt(sidebarEl.css('bottom'))
|
|
|
|
let windowHeight = $(window).height()
|
|
let docScrollTop = $(document).scrollTop()
|
|
|
|
$(window).on('resize', function () {
|
|
windowHeight = $(window).height() //recalc win height
|
|
_updateSidebarPosition()
|
|
})
|
|
|
|
$(window).on('scroll', function () {
|
|
docScrollTop = $(document).scrollTop() //recalc scroll top
|
|
_updateSidebarPosition()
|
|
})
|
|
|
|
_updateSidebarPosition()
|
|
|
|
function _updateSidebarPosition () {
|
|
const footerTop = footerEl.offset().top
|
|
const windowBottomPos = docScrollTop + windowHeight
|
|
// check if document scrollTop position cross sidebar top position with margin
|
|
//if so we set sidebar top position to its margin value
|
|
if (docScrollTop < sidebarTopPos - sidebarTopMargin) {
|
|
sidebarEl.css('top', sidebarTopPos - docScrollTop)
|
|
} else {
|
|
sidebarEl.css('top', sidebarTopMargin)
|
|
}
|
|
//fixing overlapping on footer
|
|
if (windowBottomPos >= footerTop + sidebarBottomMargin) {
|
|
sidebarEl.css('bottom', sidebarBottomPos - footerTop + windowBottomPos)
|
|
} else {
|
|
sidebarEl.css('bottom', sidebarBottomPos)
|
|
}
|
|
}
|
|
|
|
component.componentWillUnmount = function () {
|
|
$(window).off('resize')
|
|
$(window).off('scroll')
|
|
}
|
|
|
|
return _updateSidebarPosition
|
|
}
|
|
|
|
//default handler - returns errors field from server response or throw error with given text
|
|
const defaultApiErrorHandler = (jqXHR, transKey = 'unknown', message = 'Unknown error') => {
|
|
if (jqXHR.status === 402) {
|
|
return []
|
|
}
|
|
|
|
if (jqXHR.responseJSON && jqXHR.responseJSON.errors && jqXHR.responseJSON.errors.length) {
|
|
return jqXHR.responseJSON.errors
|
|
} else {
|
|
return [{type: 'error', transKey: transKey, message: message}]
|
|
}
|
|
}
|
|
|
|
export const createApi = (httpMethod, url,
|
|
{
|
|
urlData = false,
|
|
inputData = (payload) => JSON.stringify(payload),
|
|
resolveData = (response) => response,
|
|
rejectData = (defHandler, jqXHR) => { return defHandler(jqXHR) }
|
|
} = {}
|
|
) => {
|
|
return (token, payload, ...args) => {
|
|
let requestUrl = url
|
|
if (typeof urlData === 'function') {
|
|
const urlParams = urlData(payload, ...args)
|
|
console.log('%c urlParams=' + JSON.stringify(urlParams), 'color: green')
|
|
requestUrl = url.replace(/\{(.*?)\}/g, function (match, field) {
|
|
return urlParams[field]
|
|
})
|
|
}
|
|
|
|
return new Promise((resolve, reject) => {
|
|
let ajaxOptions = {
|
|
type: httpMethod,
|
|
url: config.apiUrl + requestUrl,
|
|
dataType: 'json',
|
|
contentType: 'application/json',
|
|
data: inputData(payload),
|
|
success: function (data) {
|
|
resolve(resolveData(data))
|
|
},
|
|
error: function (jqXHR, textStatus, errorThrown) {
|
|
console.log(`%c [API Error] HTTP ${jqXHR.status}, ${errorThrown}`, 'background: red; color: yellow')
|
|
reject(rejectData(defaultApiErrorHandler, jqXHR, textStatus, errorThrown))
|
|
}
|
|
}
|
|
|
|
if (token) {
|
|
ajaxOptions.headers = {
|
|
Authorization: 'Bearer ' + token
|
|
}
|
|
}
|
|
|
|
// Used for backend debugging :)
|
|
if (__DEV__) {
|
|
ajaxOptions['xhrFields'] = {
|
|
withCredentials: true
|
|
}
|
|
}
|
|
|
|
$.ajax(ajaxOptions)
|
|
})
|
|
}
|
|
}
|
|
|
|
export const mockApi = (fakeData, timeout = 2000) => () => {
|
|
return new Promise((resolve) => {
|
|
setTimeout(() => {
|
|
resolve(fakeData)
|
|
}, timeout)
|
|
})
|
|
}
|