56 lines
1.6 KiB
JavaScript
56 lines
1.6 KiB
JavaScript
import { Controller } from "@hotwired/stimulus"
|
|
|
|
function hexToBytes (hex) {
|
|
let bytes = []
|
|
for (let c = 0; c < hex.length; c += 2) {
|
|
bytes.push(parseInt(hex.substr(c, 2), 16))
|
|
}
|
|
return bytes
|
|
}
|
|
|
|
// Connects to data-controller="settings--nostr-pubkey"
|
|
export default class extends Controller {
|
|
static targets = [ "noExtension", "setPubkey", "pubkeyBech32Input" ]
|
|
static values = { userAddress: String, pubkeyHex: String, sharedSecret: String }
|
|
|
|
connect () {
|
|
if (window.nostr) {
|
|
if (this.hasSetPubkeyTarget) {
|
|
this.setPubkeyTarget.disabled = false
|
|
}
|
|
} else {
|
|
this.noExtensionTarget.classList.remove("hidden")
|
|
}
|
|
}
|
|
|
|
async setPubkey () {
|
|
this.setPubkeyTarget.disabled = true
|
|
|
|
try {
|
|
const signedEvent = await window.nostr.signEvent({
|
|
created_at: Math.floor(Date.now() / 1000),
|
|
kind: 1,
|
|
tags: [],
|
|
content: `Connect my public key to ${this.userAddressValue} (confirmation ${this.sharedSecretValue})`
|
|
})
|
|
|
|
const res = await fetch("/settings/set_nostr_pubkey", {
|
|
method: "POST", credentials: "include", headers: {
|
|
"Accept": "application/json", 'Content-Type': 'application/json',
|
|
"X-CSRF-Token": this.csrfToken
|
|
}, body: JSON.stringify({ signed_event: signedEvent })
|
|
});
|
|
|
|
window.location.reload()
|
|
} catch (error) {
|
|
console.warn('Unable to verify pubkey:', error.message)
|
|
this.setPubkeyTarget.disabled = false
|
|
}
|
|
}
|
|
|
|
get csrfToken () {
|
|
const element = document.head.querySelector('meta[name="csrf-token"]')
|
|
return element.getAttribute("content")
|
|
}
|
|
}
|