utils.js
1 import { differenceInSeconds } from "date-fns"; 2 3 export const convertHexToRGB = (hex) => { 4 // check if it's a rgba 5 if (hex.match("rgba")) { 6 let triplet = hex.slice(5).split(",").slice(0, -1).join(","); 7 return triplet; 8 } 9 10 let c; 11 if (/^#([A-Fa-f0-9]{3}){1,2}$/.test(hex)) { 12 c = hex.substring(1).split(""); 13 if (c.length === 3) { 14 c = [c[0], c[0], c[1], c[1], c[2], c[2]]; 15 } 16 c = "0x" + c.join(""); 17 18 return [(c >> 16) & 255, (c >> 8) & 255, c & 255].join(","); 19 } 20 }; 21 22 function currentYPosition(elm) { 23 if (!window && !elm) return; 24 25 if (elm) return elm.scrollTop; 26 // Firefox, Chrome, Opera, Safari 27 if (window.pageYOffset) return window.pageYOffset; 28 // Internet Explorer 6 - standards mode 29 if (document.documentElement && document.documentElement.scrollTop) 30 return document.documentElement.scrollTop; 31 // Internet Explorer 6, 7 and 8 32 if (document.body.scrollTop) return document.body.scrollTop; 33 return 0; 34 } 35 36 function elmYPosition(elm) { 37 var y = elm.offsetTop; 38 var node = elm; 39 while (node.offsetParent && node.offsetParent !== document.body) { 40 node = node.offsetParent; 41 y += node.offsetTop; 42 } 43 return y; 44 } 45 46 export function scrollTo(scrollableElement, elmID) { 47 var elm = document.getElementById(elmID); 48 49 if (!elmID || !elm) { 50 return; 51 } 52 53 var startY = currentYPosition(scrollableElement); 54 var stopY = elmYPosition(elm); 55 56 var distance = stopY > startY ? stopY - startY : startY - stopY; 57 if (distance < 100) { 58 scrollTo(0, stopY); 59 return; 60 } 61 var speed = Math.round(distance / 50); 62 if (speed >= 20) speed = 20; 63 var step = Math.round(distance / 25); 64 var leapY = stopY > startY ? startY + step : startY - step; 65 var timer = 0; 66 if (stopY > startY) { 67 for (var i = startY; i < stopY; i += step) { 68 setTimeout( 69 (function (leapY) { 70 return () => { 71 scrollableElement.scrollTo(0, leapY); 72 }; 73 })(leapY), 74 timer * speed 75 ); 76 leapY += step; 77 if (leapY > stopY) leapY = stopY; 78 timer++; 79 } 80 return; 81 } 82 for (let i = startY; i > stopY; i -= step) { 83 setTimeout( 84 (function (leapY) { 85 return () => { 86 scrollableElement.scrollTo(0, leapY); 87 }; 88 })(leapY), 89 timer * speed 90 ); 91 leapY -= step; 92 if (leapY < stopY) leapY = stopY; 93 timer++; 94 } 95 return false; 96 } 97 98 export function getTimeDifference(date) { 99 let difference = differenceInSeconds(new Date(), date); 100 101 if (difference < 60) return `${Math.floor(difference)} sec`; 102 else if (difference < 3600) return `${Math.floor(difference / 60)} min`; 103 else if (difference < 86400) return `${Math.floor(difference / 3660)} h`; 104 else if (difference < 86400 * 30) return `${Math.floor(difference / 86400)} d`; 105 else if (difference < 86400 * 30 * 12) return `${Math.floor(difference / 86400 / 30)} mon`; 106 else return `${(difference / 86400 / 30 / 12).toFixed(1)} y`; 107 }