webCryptoGenerateId = async (str) => {
const hashBuffer = await crypto.subtle.digest('SHA-1', new TextEncoder('utf-8').encode(str))
const hashArray = Array.from(new Uint8Array(hashBuffer))
return hashArray
.map((byte) => byte.toString(16).padStart(2, '0'))
.join('')
.slice(0, 16)
}