Files
socialhose-php/frontend/app/common/Common.js
T
2022-12-09 08:36:26 -06:00

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)
})
}