write: move reply and write-new-text note to write.ts
parent
9a34d4f31e
commit
976ea21d52
@ -0,0 +1,154 @@
|
||||
import {signEvent} from 'nostr-tools';
|
||||
import {elemShrink, updateElemHeight} from './utils/dom';
|
||||
import {powEvent} from './system';
|
||||
import {config} from './settings';
|
||||
import {publish} from './relays';
|
||||
|
||||
// form used to write and publish textnotes for replies and new notes
|
||||
const writeForm = document.querySelector('#writeForm') as HTMLFormElement;
|
||||
const writeInput = document.querySelector('textarea[name="message"]') as HTMLTextAreaElement;
|
||||
|
||||
// overlay for writing new text notes
|
||||
const publishView = document.querySelector('#newNote') as HTMLElement;
|
||||
|
||||
const openWriteView = () => {
|
||||
publishView.append(writeForm);
|
||||
if (writeInput.value.trimRight()) {
|
||||
writeInput.style.removeProperty('height');
|
||||
}
|
||||
requestAnimationFrame(() => {
|
||||
updateElemHeight(writeInput);
|
||||
writeInput.focus();
|
||||
});
|
||||
publishView.removeAttribute('hidden');
|
||||
};
|
||||
|
||||
export const closePublishView = () => publishView.hidden = true;
|
||||
|
||||
export const togglePublishView = () => {
|
||||
if (publishView.hidden) {
|
||||
localStorage.removeItem('reply_to'); // should it forget old replyto context?
|
||||
openWriteView();
|
||||
} else {
|
||||
publishView.hidden = true;
|
||||
}
|
||||
};
|
||||
|
||||
const closeWriteInput = () => writeInput.blur();
|
||||
|
||||
export const openWriteInput = (
|
||||
button: HTMLElement,
|
||||
id: string,
|
||||
) => {
|
||||
appendReplyForm(button.closest('.buttons') as HTMLElement);
|
||||
localStorage.setItem('reply_to', id);
|
||||
};
|
||||
|
||||
export const toggleWriteInput = (
|
||||
button: HTMLElement,
|
||||
id: string,
|
||||
) => {
|
||||
if (id && localStorage.getItem('reply_to') === id) {
|
||||
closeWriteInput();
|
||||
return;
|
||||
}
|
||||
appendReplyForm(button.closest('.buttons') as HTMLElement);
|
||||
localStorage.setItem('reply_to', id);
|
||||
};
|
||||
|
||||
// const updateWriteInputHeight = () => updateElemHeight(writeInput);
|
||||
|
||||
writeInput.addEventListener('focusout', () => {
|
||||
const reply_to = localStorage.getItem('reply_to');
|
||||
if (reply_to && writeInput.value === '') {
|
||||
writeInput.addEventListener('transitionend', (event) => {
|
||||
if (!reply_to || reply_to === localStorage.getItem('reply_to') && !writeInput.style.height) { // should prob use some class or data-attr instead of relying on height
|
||||
writeForm.after(elemShrink(writeInput));
|
||||
writeForm.remove();
|
||||
localStorage.removeItem('reply_to');
|
||||
}
|
||||
}, {once: true});
|
||||
}
|
||||
});
|
||||
|
||||
// document.body.addEventListener('keyup', (e) => {
|
||||
// if (e.key === 'Escape') {
|
||||
// hideNewMessage(true);
|
||||
// }
|
||||
// });
|
||||
|
||||
const sendStatus = document.querySelector('#sendstatus') as HTMLElement;
|
||||
const publishBtn = document.querySelector('#publish') as HTMLButtonElement;
|
||||
const onSendError = (err: Error) => sendStatus.textContent = err.message;
|
||||
|
||||
writeForm.addEventListener('submit', async (e) => {
|
||||
e.preventDefault();
|
||||
const privatekey = localStorage.getItem('private_key');
|
||||
if (!config.pubkey || !privatekey) {
|
||||
return onSendError(new Error('no pubkey/privatekey'));
|
||||
}
|
||||
const content = writeInput.value.trimRight();
|
||||
if (!content) {
|
||||
return onSendError(new Error('message is empty'));
|
||||
}
|
||||
const replyTo = localStorage.getItem('reply_to');
|
||||
const close = () => {
|
||||
sendStatus.textContent = '';
|
||||
writeInput.value = '';
|
||||
writeInput.style.removeProperty('height');
|
||||
publishBtn.disabled = true;
|
||||
if (replyTo) {
|
||||
localStorage.removeItem('reply_to');
|
||||
publishView.append(writeForm);
|
||||
}
|
||||
publishView.hidden = true;
|
||||
};
|
||||
const tags = replyTo ? [['e', replyTo]] : []; // , eventRelayMap[replyTo][0]
|
||||
const newEvent = await powEvent({
|
||||
kind: 1,
|
||||
content,
|
||||
pubkey: config.pubkey,
|
||||
tags,
|
||||
created_at: Math.floor(Date.now() * 0.001),
|
||||
}, {
|
||||
difficulty: config.difficulty,
|
||||
statusElem: sendStatus,
|
||||
timeout: config.timeout,
|
||||
}).catch(console.warn);
|
||||
if (!newEvent) {
|
||||
close();
|
||||
return;
|
||||
}
|
||||
const sig = signEvent(newEvent, privatekey);
|
||||
// TODO validateEvent
|
||||
if (sig) {
|
||||
sendStatus.textContent = 'publishing…';
|
||||
publish({...newEvent, sig}, (relay, error) => {
|
||||
if (error) {
|
||||
return console.log(error, relay);
|
||||
}
|
||||
console.info(`publish request sent to ${relay}`);
|
||||
close();
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
writeInput.addEventListener('input', () => {
|
||||
publishBtn.disabled = !writeInput.value.trimRight();
|
||||
updateElemHeight(writeInput);
|
||||
});
|
||||
|
||||
writeInput.addEventListener('blur', () => sendStatus.textContent = '');
|
||||
|
||||
function appendReplyForm(el: HTMLElement) {
|
||||
writeForm.before(elemShrink(writeInput));
|
||||
writeInput.blur();
|
||||
writeInput.style.removeProperty('height');
|
||||
el.after(writeForm);
|
||||
if (writeInput.value && !writeInput.value.trimRight()) {
|
||||
writeInput.value = '';
|
||||
} else {
|
||||
requestAnimationFrame(() => updateElemHeight(writeInput));
|
||||
}
|
||||
requestAnimationFrame(() => writeInput.focus());
|
||||
}
|
Loading…
Reference in New Issue