989ab5a432
* Add useDeviceList hook Signed-off-by: Ajay Bura <ajbura@gmail.com> * Add isCrossVerified func to matrixUtil Signed-off-by: Ajay Bura <ajbura@gmail.com> * Add className prop in sidebar avatar comp Signed-off-by: Ajay Bura <ajbura@gmail.com> * Add unverified session indicator in sidebar Signed-off-by: Ajay Bura <ajbura@gmail.com> * Add info card component Signed-off-by: Ajay Bura <ajbura@gmail.com> * Add css variables Signed-off-by: Ajay Bura <ajbura@gmail.com> * Add cross signin status hook Signed-off-by: Ajay Bura <ajbura@gmail.com> * Add hasCrossSigninAccountData function Signed-off-by: Ajay Bura <ajbura@gmail.com> * Add cross signin info card in device manage component Signed-off-by: Ajay Bura <ajbura@gmail.com> * Add cross signing and key backup component Signed-off-by: Ajay Bura <ajbura@gmail.com> * Fix typo Signed-off-by: Ajay Bura <ajbura@gmail.com> * WIP Signed-off-by: Ajay Bura <ajbura@gmail.com> * Add cross singing dialogs Signed-off-by: Ajay Bura <ajbura@gmail.com> * Add cross signing set/reset Signed-off-by: Ajay Bura <ajbura@gmail.com> * Add SecretStorageAccess component Signed-off-by: Ajay Bura <ajbura@gmail.com> * Add key backup Signed-off-by: Ajay Bura <ajbura@gmail.com> * WIP * WIP * WIP * WIP * Show progress when restoring key backup * Add SSSS and key backup
134 lines
3.4 KiB
JavaScript
134 lines
3.4 KiB
JavaScript
/* eslint-disable max-classes-per-file */
|
|
export function bytesToSize(bytes) {
|
|
const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];
|
|
if (bytes === 0) return 'n/a';
|
|
const i = parseInt(Math.floor(Math.log(bytes) / Math.log(1024)), 10);
|
|
if (i === 0) return `${bytes} ${sizes[i]}`;
|
|
return `${(bytes / (1024 ** i)).toFixed(1)} ${sizes[i]}`;
|
|
}
|
|
|
|
export function diffMinutes(dt2, dt1) {
|
|
let diff = (dt2.getTime() - dt1.getTime()) / 1000;
|
|
diff /= 60;
|
|
return Math.abs(Math.round(diff));
|
|
}
|
|
|
|
export function isInSameDay(dt2, dt1) {
|
|
return (
|
|
dt2.getFullYear() === dt1.getFullYear()
|
|
&& dt2.getMonth() === dt1.getMonth()
|
|
&& dt2.getDate() === dt1.getDate()
|
|
);
|
|
}
|
|
|
|
/**
|
|
* @param {Event} ev
|
|
* @param {string} [targetSelector] element selector for Element.matches([selector])
|
|
*/
|
|
export function getEventCords(ev, targetSelector) {
|
|
let boxInfo;
|
|
|
|
const path = ev.nativeEvent.composedPath();
|
|
const target = targetSelector
|
|
? path.find((element) => element.matches?.(targetSelector))
|
|
: null;
|
|
if (target) {
|
|
boxInfo = target.getBoundingClientRect();
|
|
} else {
|
|
boxInfo = ev.target.getBoundingClientRect();
|
|
}
|
|
|
|
return {
|
|
x: boxInfo.x,
|
|
y: boxInfo.y,
|
|
width: boxInfo.width,
|
|
height: boxInfo.height,
|
|
detail: ev.detail,
|
|
};
|
|
}
|
|
|
|
export function abbreviateNumber(number) {
|
|
if (number > 99) return '99+';
|
|
return number;
|
|
}
|
|
|
|
export class Debounce {
|
|
constructor() {
|
|
this.timeoutId = null;
|
|
}
|
|
|
|
/**
|
|
* @param {function} func - callback function
|
|
* @param {number} wait - wait in milliseconds to call func
|
|
* @returns {func} debounceCallback - to pass arguments to func callback
|
|
*/
|
|
_(func, wait) {
|
|
const that = this;
|
|
return function debounceCallback(...args) {
|
|
clearTimeout(that.timeoutId);
|
|
that.timeoutId = setTimeout(() => {
|
|
func.apply(this, args);
|
|
that.timeoutId = null;
|
|
}, wait);
|
|
};
|
|
}
|
|
}
|
|
|
|
export class Throttle {
|
|
constructor() {
|
|
this.timeoutId = null;
|
|
}
|
|
|
|
/**
|
|
* @param {function} func - callback function
|
|
* @param {number} wait - wait in milliseconds to call func
|
|
* @returns {function} throttleCallback - to pass arguments to func callback
|
|
*/
|
|
_(func, wait) {
|
|
const that = this;
|
|
return function throttleCallback(...args) {
|
|
if (that.timeoutId !== null) return;
|
|
that.timeoutId = setTimeout(() => {
|
|
func.apply(this, args);
|
|
that.timeoutId = null;
|
|
}, wait);
|
|
};
|
|
}
|
|
}
|
|
|
|
export function getUrlPrams(paramName) {
|
|
const queryString = window.location.search;
|
|
const urlParams = new URLSearchParams(queryString);
|
|
return urlParams.get(paramName);
|
|
}
|
|
|
|
export function getScrollInfo(target) {
|
|
const scroll = {};
|
|
scroll.top = Math.round(target.scrollTop);
|
|
scroll.height = Math.round(target.scrollHeight);
|
|
scroll.viewHeight = Math.round(target.offsetHeight);
|
|
scroll.isScrollable = scroll.height > scroll.viewHeight;
|
|
return scroll;
|
|
}
|
|
|
|
export function avatarInitials(text) {
|
|
return [...text][0];
|
|
}
|
|
|
|
export function copyToClipboard(text) {
|
|
if (navigator.clipboard) {
|
|
navigator.clipboard.writeText(text);
|
|
} else {
|
|
const host = document.body;
|
|
const copyInput = document.createElement('input');
|
|
copyInput.style.position = 'fixed';
|
|
copyInput.style.opacity = '0';
|
|
copyInput.value = text;
|
|
host.append(copyInput);
|
|
|
|
copyInput.select();
|
|
copyInput.setSelectionRange(0, 99999);
|
|
document.execCommand('Copy');
|
|
copyInput.remove();
|
|
}
|
|
}
|