vue3-use-hooks
Version:
102 lines (101 loc) • 3.4 kB
JavaScript
import { ref as d, readonly as w, onMounted as v, watchEffect as L, onUnmounted as b, computed as g, watch as S } from "vue";
function C(n) {
const e = d(n), o = (r) => {
e.value = r;
};
return [w(e), o];
}
const h = (n = "en") => {
const e = d(n);
return {
camelCase: (a) => a.replace(/(?:^\w|[A-Z]|\b\w)/g, function(s, c) {
return c === 0 ? s.toLocaleLowerCase(e) : s.toLocaleUpperCase(e);
}).replace(/\s+/g, ""),
kebabCase: (a) => a.match(/[A-Z]{2,}(?=[A-Z][a-z]+[0-9]*|\b)|[A-Z]?[a-z]+[0-9]*|[A-Z]|[0-9]+/g).map((s) => s.toLocaleLowerCase(e)).join("-"),
pascalCase: (a) => a.replace(/\w\S*/g, (s) => s.charAt(0).toLocaleUpperCase(e) + s.substr(1).toLocaleLowerCase(e)),
upperCase: (a) => a.toLocaleUpperCase(e),
lowerCase: (a) => a.toLocaleLowerCase(e),
sentenceCase: (a) => a.toLocaleLowerCase(e).replace(/(^\s*\w|[.!?]\s*\w)/g, (s) => s.toLocaleUpperCase(e)),
capitalizeCase: (a) => {
const s = a.replace(/[-_](\w)/g, (c, f) => f.toLocaleUpperCase(e));
return s[0].toLocaleUpperCase(e) + s.slice(1);
}
};
}, M = (n = {}, e = !1) => {
const [o, r] = C(e), [l, i] = C(n);
return { visible: o, setVisible: r, current: l, openModal: (t) => {
i(t), r(!0);
}, closeModal: () => {
r(!1), i();
} };
}, y = (n, e = "") => {
const o = d(null), r = () => {
const t = localStorage.getItem(n);
if (t !== null) {
o.value = l(t);
return;
}
o.value = e;
}, l = (t) => {
let a = null;
try {
a = JSON.parse(t);
} catch {
a = t;
}
return a;
}, i = (t) => {
t.key === n && (o.value = t.newValue ? l(t.newValue) : null);
};
let p = !1;
return typeof window < "u" && (r(), p = !0), v(() => {
p || r(), window.addEventListener("storage", i, !0);
}), L(() => {
o.value && localStorage.setItem(n, JSON.stringify(o.value));
}), b(() => {
window.removeEventListener("storage", i);
}), {
value: o,
remove: () => {
try {
localStorage.removeItem(n), o.value = null;
} catch (t) {
console.error(t);
}
}
};
}, A = (n = null) => {
const e = d(n), o = d([]), r = g(() => /(?:<iframe[^>]*)(?:(?:\/>)|(?:>.*?<\/iframe>))/.test(e.value) || /(?:<blockquote[^>]*)(?:(?:\/>)|(?:>.*?<\/blockquote>))/.test(e.value)), l = (t = e.value) => {
const s = new DOMParser().parseFromString(t, "text/html");
for (const c of s.body.childNodes) {
if (c.tagName === "SCRIPT")
return c.src;
c.innerHTML && c.innerHTML.includes("<script") && l(c.innerHTML);
}
return null;
}, i = (t) => t.remove(), p = ({ async: t = !0, defer: a = !1, id: s, src: c }) => {
const f = document.getElementById(s);
f && i(f);
const u = document.createElement("script");
u.type = "text/javascript", u.id = s, u.src = c, u.async = t, u.defer = a, document.body.insertAdjacentElement("afterend", u), u.addEventListener("load", () => {
window.instgrm && window.instgrm.Embeds.process();
}), o.value = [...o.value, u];
}, m = () => {
e.value = null, o.value.map((t) => i(t)), o.value = [];
};
return v(() => {
e.value && p({ id: "id", src: l(e.value) });
}), S(n, (t) => {
t && p({ id: "id", src: l(t) });
}), {
isEmbedBlock: r,
clear: m
};
};
export {
A as useEmbed,
y as useLocalStorage,
M as useModal,
C as useState,
h as useStringCase
};