ebt-vue3
Version:
Vue3 Library for SuttaCentral Voice EBT-Sites
105 lines (93 loc) • 2.57 kB
JavaScript
import {
DBG,
DBG_VIEWPORT, DBG_KEY,
APP_BAR_H,
} from './defines.mjs';
export default class Utils {
static assignTyped(dst, initial, src=initial) {
let keys = Object.keys(initial);
keys.forEach(k=>{
let value = src[k];
if (value !== undefined) {
let type = typeof initial[k];
if (type === 'number') {
dst[k] = Number(value);
} else if (initial[k] instanceof Date) {
dst[k] = new Date(value);
} else if (type === 'boolean') {
dst[k] = `${value}` !== 'false' && value != null;
} else if (initial[k] instanceof Array) {
dst[k] = [...value];
} else {
dst[k] = `${value}`;
}
}
});
return dst;
}
static logLine(...args) {
let line = [];
for (let i = 0; i < args.length; i++) {
let arg = args[i];
let text = `${arg}`;
if (text === '[object Object]') {
try {
text = JSON.stringify(arg);
} catch (e) {
text = `![${e.message}]`;
}
}
line.push(text);
}
return line.join(' ');
}
static elementInViewport(elt, opts={}) {
const msg = "Utils.elementInViewport()";
const dbg = DBG_VIEWPORT;
const dbgv = dbg && DBG.VERBOSE;
const {
root = document.documentElement,
zone = 80,
} = opts;
const rect = elt?.getBoundingClientRect();
const { window } = globalThis;
if (window == null) {
dbgv && console.log(msg, '[1]!window');
return false;
}
const viewBottom = (window.innerHeight || root.clientHeight);
const viewRight = (window.innerWidth || root.clientWidth);
if (!rect) {
dbg && console.log(msg, '[2]!rect');
return false;
}
if (rect.bottom < 0) {
dbg && console.log(msg, '[3]!bottom');
return false;
}
if (rect.right < 0) {
dbg && console.log(msg, '[4]!right');
return false;
}
if (rect.top > viewBottom*zone/100 - APP_BAR_H) {
dbg && console.log(msg, `[5]!top${zone}`);
return false;
}
if (rect.left > viewRight) {
dbg && console.log(msg, '[6]!left');
return false;
}
dbgv && console.log(msg, '[7]in view');
return true;
}
static async updateClipboard(newClip) {
let msg = 'Utils.updateClipboard()';
let dbg = DBG_KEY;
try {
await navigator.clipboard.writeText(newClip);
dbg && console.log(msg, '[1]copied', newClip);
} catch (e) {
console.warn(msg, '[2]failed', e);
}
}
}