secajs/src/public/javascript/offers.js

627 lines
21 KiB
JavaScript
Raw Normal View History

2025-02-22 01:53:14 +01:00
const buttonStartCreateOffer = document.getElementById(
'button-start-create-offer'
);
2025-02-28 15:53:40 +01:00
const buttonViewMyOffers = document.getElementById('button-view-my-offers');
2025-03-04 17:32:03 +01:00
const closeOffer = document.getElementById('close-offer');
const createOfferModalRoot = document.getElementById('create-offer-modal-root');
2025-02-28 15:53:40 +01:00
const viewMyOffersRoot = document.getElementById('view-my-offers-root');
2025-02-22 02:18:23 +01:00
const buyOrSellButtonGroup = document.getElementById(
'button-group-buy-or-sell'
);
const buyOrSellButtons = buyOrSellButtonGroup.querySelectorAll('button');
2025-02-25 16:42:49 +01:00
const buyButton = document.getElementById('button-buy-bitcoin');
const sellButton = document.getElementById('button-sell-bitcoin');
2025-02-22 02:18:23 +01:00
2025-02-23 00:22:34 +01:00
const premiumValue = document.getElementById('premium-value');
const buttonIncreasePremium = document.getElementById(
'button-increase-premium'
);
const buttonDecreasePremium = document.getElementById(
'button-decrease-premium'
);
2025-02-23 23:41:13 +01:00
const eurAmountInput = document.getElementById('input-eur-amount');
2025-02-24 11:20:24 +01:00
const btcAmountInput = document.getElementById('input-btc-amount');
2025-02-23 23:41:13 +01:00
2025-02-25 16:42:49 +01:00
const placeInput = document.getElementById('place-input');
const timeInput = document.getElementById('time-input');
2025-02-24 12:04:36 +01:00
const onchainCheckbox = document.getElementById('onchain-checkbox');
const lightningCheckbox = document.getElementById('lightning-checkbox');
2025-02-25 14:02:16 +01:00
2025-02-24 12:04:36 +01:00
const btcMethodCheckboxes = [onchainCheckbox, lightningCheckbox];
2025-02-25 17:09:20 +01:00
const myTrustedCheckbox = document.getElementById('my-trusted-checkbox');
const myTrustedTrustedCheckbox = document.getElementById(
2025-02-25 16:42:49 +01:00
'my-trusted-trusted-checkbox'
);
const allMembersCheckbox = document.getElementById('all-members-checkbox');
const bigNotesAcceptedCheckbox = document.getElementById(
'large-bills-checkbox'
);
2025-02-25 00:52:25 +01:00
const publishOfferButton = document.getElementById('button-submit-offer');
2025-02-27 17:36:22 +01:00
const offerCreatedPopup = document.getElementById('offer-created-confirmation');
2025-03-03 10:32:57 +01:00
const ownOffersContainer = document.getElementById('own-offers-container');
2025-03-04 17:32:03 +01:00
function toggleCreateOfferModal() {
createOfferModalRoot.classList.toggle('shown');
2025-02-22 02:18:23 +01:00
}
2025-02-28 15:53:40 +01:00
function toggleViewMyOffersPanel() {
viewMyOffersRoot.style.display =
viewMyOffersRoot.style.display === 'block' ? 'none' : 'block';
}
2025-02-23 00:22:34 +01:00
function modifyPremiumValue(delta) {
const regexExpression = /-*\d+/;
const numValue = parseInt(premiumValue.innerText.match(regexExpression)[0]);
const newValue = `${numValue + delta}%`;
premiumValue.innerText = newValue;
}
2025-02-22 22:33:51 +01:00
function toggleBuyOrSellButtonGroup() {
buyOrSellButtons.forEach((button) => {
if (button.classList.contains('selected')) {
button.classList.remove('selected');
} else {
button.classList.add('selected');
}
});
}
2025-02-24 11:20:24 +01:00
function readIntFromEurAmountInput() {
2025-02-23 23:41:13 +01:00
const eurAmountFieldValue = eurAmountInput.value;
2025-02-24 11:20:24 +01:00
const regularExpression = /([\d\s]+)/;
2025-02-23 23:41:13 +01:00
const matchResult = eurAmountFieldValue.match(regularExpression);
2025-02-24 11:20:24 +01:00
if (!matchResult) {
return null;
}
const numberString = matchResult[1];
const cleanInputNumber = parseInt(numberString.replace(/\s/gi, ''));
return cleanInputNumber;
}
function validateAndFormatEurAmountInput() {
const cleanInputNumber = readIntFromEurAmountInput();
2025-02-23 23:41:13 +01:00
eurAmountInput.classList.remove('input-is-valid', 'input-is-invalid');
2025-02-24 11:20:24 +01:00
if (cleanInputNumber) {
eurAmountInput.value = formatNumberWithSpaces(cleanInputNumber);
2025-02-23 23:41:13 +01:00
eurAmountInput.classList.add('input-is-valid');
return;
}
eurAmountInput.classList.add('input-is-invalid');
}
2025-02-24 11:20:24 +01:00
function updateBtcInput() {
const eurToSatRate = 1021;
const cleanEurAmount = readIntFromEurAmountInput();
const satsAmount = cleanEurAmount * eurToSatRate;
const formattedSatsAmount = formatNumberWithSpaces(satsAmount);
btcAmountInput.value = formattedSatsAmount;
}
2025-02-25 00:52:25 +01:00
function validateBitcoinMethodCheckboxes(clickedCheckbox) {
let checkedCount = btcMethodCheckboxes.filter((cb) => cb.checked).length;
if (checkedCount === 0) {
clickedCheckbox.checked = true;
2025-02-24 12:04:36 +01:00
}
}
2025-02-25 17:09:20 +01:00
async function publishOffer() {
2025-02-25 16:42:49 +01:00
let wants;
if (buyButton.classList.contains('selected')) {
wants = 'BTC';
}
if (sellButton.classList.contains('selected')) {
wants = 'EUR';
}
const premium = parseInt(premiumValue.innerText.match(/\d+/)[0]) / 100;
const trade_amount_eur = eurAmountInput.value;
const location_details = placeInput.value;
const time_availability_details = timeInput.value;
const is_onchain_accepted = onchainCheckbox.checked;
const is_lightning_accepted = lightningCheckbox.checked;
2025-02-25 17:09:20 +01:00
const show_offer_to_trusted = myTrustedCheckbox.checked;
const show_offer_to_trusted_trusted = myTrustedTrustedCheckbox.checked;
const show_offer_to_all_members = allMembersCheckbox.checked;
2025-02-25 16:42:49 +01:00
const are_big_notes_accepted = bigNotesAcceptedCheckbox.checked;
2025-02-25 14:01:25 +01:00
const offerDetails = {
2025-02-25 16:42:49 +01:00
wants,
premium,
trade_amount_eur,
location_details,
time_availability_details,
is_onchain_accepted,
is_lightning_accepted,
2025-02-25 17:09:20 +01:00
show_offer_to_trusted,
show_offer_to_trusted_trusted,
show_offer_to_all_members,
2025-02-25 16:42:49 +01:00
are_big_notes_accepted,
2025-02-25 14:01:25 +01:00
};
2025-02-25 16:42:49 +01:00
2025-02-25 17:09:20 +01:00
await fetch('/api/offer', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({ offerDetails }),
});
2025-02-27 17:36:22 +01:00
2025-02-27 18:26:36 +01:00
offerCreatedPopup.classList.remove('max-size-zero');
2025-02-27 17:36:22 +01:00
offerCreatedPopup.classList.add('revealed');
setTimeout(() => {
offerCreatedPopup.classList.remove('revealed');
}, 3000);
setTimeout(() => {
2025-02-27 18:26:36 +01:00
offerCreatedPopup.classList.add('max-size-zero');
}, 4000);
2025-03-04 17:32:03 +01:00
toggleCreateOfferModal();
2025-02-25 14:01:25 +01:00
}
2025-03-01 23:18:18 +01:00
class Offer {
constructor(offerData) {
this.uuid = offerData.uuid;
this.public_key = offerData.public_key;
this.wants = offerData.wants;
this.premium = offerData.premium;
this.trade_amount_eur = offerData.trade_amount_eur;
this.location_details = offerData.location_details;
this.time_availability_details = offerData.time_availability_details;
this.show_offer_to_trusted = offerData.show_offer_to_trusted;
this.show_offer_to_trusted_trusted =
offerData.show_offer_to_trusted_trusted;
this.show_offer_to_all_members = offerData.show_offer_to_all_members;
this.is_onchain_accepted = offerData.is_onchain_accepted;
this.is_lightning_accepted = offerData.is_lightning_accepted;
this.are_big_notes_accepted = offerData.are_big_notes_accepted;
this.created_at = offerData.created_at;
this.last_updated_at = offerData.last_updated_at;
}
2025-03-03 12:25:15 +01:00
buildHTML() {
const offerCard = document.createElement('div');
offerCard.classList.add('myoffer-card');
offerCard.classList.add('shadowed-round-area');
const tradeDescDiv = document.createElement('div');
tradeDescDiv.classList.add('trade-desc');
const youBuyText = document.createElement('p');
youBuyText.classList.add('offer-card-content-title');
youBuyText.innerText = 'Compras';
tradeDescDiv.append(youBuyText);
const youBuyData = document.createElement('p');
youBuyData.classList.add('offer-card-content-data');
if (this.wants === 'BTC') {
youBuyData.innerText = `${this.trade_amount_eur * 1021} sats`;
}
if (this.wants === 'EUR') {
youBuyData.innerText = `${this.trade_amount_eur}`;
}
tradeDescDiv.append(youBuyData);
const youSellText = document.createElement('p');
youSellText.id = 'you-sell-title';
youSellText.classList.add('offer-card-content-title');
youSellText.innerText = 'Vendes';
tradeDescDiv.append(youSellText);
const youSellData = document.createElement('p');
youSellData.classList.add('offer-card-content-data');
if (this.wants === 'BTC') {
youSellData.innerText = `${this.trade_amount_eur}`;
}
if (this.wants === 'EUR') {
youSellData.innerText = `${this.trade_amount_eur * 1021} sats`;
}
tradeDescDiv.append(youSellData);
const premiumDescDiv = document.createElement('div');
premiumDescDiv.classList.add('premium-desc');
const premiumTitle = document.createElement('p');
premiumTitle.classList.add('offer-card-content-title');
premiumTitle.innerText = 'Premium';
premiumDescDiv.append(premiumTitle);
const premiumData = document.createElement('p');
premiumData.classList.add('offer-card-content-data');
premiumData.innerText = `${this.premium * 100} %`;
premiumDescDiv.append(premiumData);
const offerPriceTitle = document.createElement('p');
offerPriceTitle.classList.add('offer-card-content-title');
offerPriceTitle.innerText = 'Precio oferta';
premiumDescDiv.append(offerPriceTitle);
const offerPriceData = document.createElement('p');
offerPriceData.classList.add('offer-card-content-data');
offerPriceData.innerText = `90000 €/BTC`;
premiumDescDiv.append(offerPriceData);
const marketPriceTitle = document.createElement('p');
marketPriceTitle.classList.add('offer-card-content-title');
marketPriceTitle.innerText = 'Precio mercado';
premiumDescDiv.append(marketPriceTitle);
const marketPriceData = document.createElement('p');
marketPriceData.innerText = `88000 €/BTC`;
premiumDescDiv.append(marketPriceData);
const whereDescDiv = document.createElement('div');
whereDescDiv.classList.add('where-desc');
2025-03-03 12:34:36 +01:00
const whereDescTitle = document.createElement('p');
whereDescTitle.classList.add('offer-card-content-title');
whereDescTitle.innerText = 'Dónde';
whereDescDiv.append(whereDescTitle);
const whereDescData = document.createElement('p');
2025-03-03 15:34:56 +01:00
whereDescData.classList.add('offer-long-text');
2025-03-03 12:34:36 +01:00
whereDescData.innerText = `${this.location_details}`;
whereDescDiv.append(whereDescData);
const whenDescDiv = document.createElement('div');
whenDescDiv.classList.add('when-desc');
const whenDescTitle = document.createElement('p');
whenDescTitle.classList.add('offer-card-content-title');
whenDescTitle.innerText = 'Cúando';
whenDescDiv.append(whenDescTitle);
const whenDescData = document.createElement('p');
2025-03-03 15:34:56 +01:00
whenDescData.classList.add('offer-long-text');
2025-03-03 12:34:36 +01:00
whenDescData.innerText = `${this.time_availability_details}`;
whenDescDiv.append(whenDescData);
2025-03-03 15:34:56 +01:00
const bitcoinMethodsDiv = document.createElement('div');
bitcoinMethodsDiv.classList.add('bitcoin-methods-desc');
const bitcoinMethodsTitle = document.createElement('p');
bitcoinMethodsTitle.classList.add('offer-card-content-title');
bitcoinMethodsTitle.innerText = 'Protocolos Bitcoin aceptados';
bitcoinMethodsDiv.append(bitcoinMethodsTitle);
const onchainAcceptedContainer = document.createElement('div');
2025-03-03 16:03:47 +01:00
onchainAcceptedContainer.classList.add('left-icon-checkboxed-field');
2025-03-03 15:34:56 +01:00
if (this.is_onchain_accepted) {
const onchainIcon = document.createElement('img');
onchainIcon.src = '/img/chains-lasecagold.svg';
const onchainText = document.createElement('p');
onchainText.innerText = 'Onchain';
const checkIcon = document.createElement('img');
checkIcon.src = '/img/circle-check-green.svg';
onchainAcceptedContainer.append(onchainIcon, onchainText, checkIcon);
} else {
const onchainIcon = document.createElement('img');
onchainIcon.src = '/img/chains-gray.svg';
const onchainText = document.createElement('p');
onchainText.innerText = 'Onchain';
const checkIcon = document.createElement('img');
checkIcon.src = '/img/circle-xmark-gray.svg';
onchainAcceptedContainer.append(onchainIcon, onchainText, checkIcon);
}
const lightningAcceptedContainer = document.createElement('div');
2025-03-03 16:03:47 +01:00
lightningAcceptedContainer.classList.add('left-icon-checkboxed-field');
2025-03-03 15:34:56 +01:00
if (this.is_lightning_accepted) {
const lightningIcon = document.createElement('img');
lightningIcon.src = '/img/bolt-lightning-lasecagold.svg';
const lightningText = document.createElement('p');
lightningText.innerText = 'Lightning';
const checkIcon = document.createElement('img');
checkIcon.src = '/img/circle-check-green.svg';
lightningAcceptedContainer.append(
lightningIcon,
lightningText,
checkIcon
);
} else {
const lightningIcon = document.createElement('img');
lightningIcon.src = '/img/bolt-lightning-gray.svg';
const lightningText = document.createElement('p');
lightningText.innerText = 'Lightning';
const checkIcon = document.createElement('img');
checkIcon.src = '/img/circle-xmark-gray.svg';
lightningAcceptedContainer.append(
lightningIcon,
lightningText,
checkIcon
);
}
bitcoinMethodsDiv.append(
onchainAcceptedContainer,
lightningAcceptedContainer
);
2025-03-03 16:03:47 +01:00
const visibilityDiv = document.createElement('div');
visibilityDiv.classList.add('visibility-desc');
const visibilityTitle = document.createElement('p');
visibilityTitle.classList.add('offer-card-content-title');
visibilityTitle.innerText = 'Visibilidad';
visibilityDiv.append(visibilityTitle);
const showOfferToTrustedContainer = document.createElement('div');
showOfferToTrustedContainer.classList.add('right-icon-checkboxed-field');
if (this.show_offer_to_trusted) {
const showOfferToTrustedIcon = document.createElement('img');
showOfferToTrustedIcon.src = '/img/user-lasecagold.svg';
const showOfferToTrustedText = document.createElement('p');
showOfferToTrustedText.innerText = 'Confiados';
const checkIcon = document.createElement('img');
checkIcon.src = '/img/circle-check-green.svg';
showOfferToTrustedContainer.append(
showOfferToTrustedIcon,
showOfferToTrustedText,
checkIcon
);
} else {
const showOfferToTrustedIcon = document.createElement('img');
showOfferToTrustedIcon.src = '/img/user-gray.svg';
const showOfferToTrustedText = document.createElement('p');
showOfferToTrustedText.innerText = 'Confiados';
const checkIcon = document.createElement('img');
checkIcon.src = '/img/circle-xmark-gray.svg';
showOfferToTrustedContainer.append(
showOfferToTrustedIcon,
showOfferToTrustedText,
checkIcon
);
}
const showOfferToTrustedTrustedContainer = document.createElement('div');
showOfferToTrustedTrustedContainer.classList.add(
'right-icon-checkboxed-field'
);
if (this.show_offer_to_trusted_trusted) {
const showOfferToTrustedTrustedIcon = document.createElement('img');
showOfferToTrustedTrustedIcon.src = '/img/user-group-lasecagold.svg';
const showOfferToTrustedTrustedText = document.createElement('p');
showOfferToTrustedTrustedText.innerText = 'Sus confiados';
const checkIcon = document.createElement('img');
checkIcon.src = '/img/circle-check-green.svg';
showOfferToTrustedTrustedContainer.append(
showOfferToTrustedTrustedIcon,
showOfferToTrustedTrustedText,
checkIcon
);
} else {
const showOfferToTrustedTrustedIcon = document.createElement('img');
showOfferToTrustedTrustedIcon.src = '/img/user-group-gray.svg';
const showOfferToTrustedTrustedText = document.createElement('p');
showOfferToTrustedTrustedText.innerText = 'Sus confiados';
const checkIcon = document.createElement('img');
checkIcon.src = '/img/circle-xmark-gray.svg';
showOfferToTrustedTrustedContainer.append(
showOfferToTrustedTrustedIcon,
showOfferToTrustedTrustedText,
checkIcon
);
}
const showOfferToAllMembersContainer = document.createElement('div');
showOfferToAllMembersContainer.classList.add('right-icon-checkboxed-field');
if (this.show_offer_to_all_members) {
const showOfferToAllMembersIcon = document.createElement('img');
showOfferToAllMembersIcon.src = '/img/many-users-lasecagold.svg';
const showOfferToAllMembersText = document.createElement('p');
showOfferToAllMembersText.innerText = 'Todos';
const checkIcon = document.createElement('img');
checkIcon.src = '/img/circle-check-green.svg';
showOfferToAllMembersContainer.append(
showOfferToAllMembersIcon,
showOfferToAllMembersText,
checkIcon
);
} else {
const showOfferToAllMembersIcon = document.createElement('img');
showOfferToAllMembersIcon.src = '/img/many-users-gray.svg';
const showOfferToAllMembersText = document.createElement('p');
showOfferToAllMembersText.innerText = 'Todos';
const checkIcon = document.createElement('img');
checkIcon.src = '/img/circle-xmark-gray.svg';
showOfferToAllMembersContainer.append(
showOfferToAllMembersIcon,
showOfferToAllMembersText,
checkIcon
);
}
visibilityDiv.append(
showOfferToTrustedContainer,
showOfferToTrustedTrustedContainer,
showOfferToAllMembersContainer
);
2025-03-03 17:09:07 +01:00
const otherOfferFeaturesDiv = document.createElement('div');
otherOfferFeaturesDiv.classList.add('other-desc');
const otherOfferFeaturesTitle = document.createElement('p');
otherOfferFeaturesTitle.classList.add('offer-card-content-title');
otherOfferFeaturesTitle.innerText = 'Otros';
otherOfferFeaturesDiv.append(otherOfferFeaturesTitle);
const areBigNotesAcceptedContainer = document.createElement('div');
areBigNotesAcceptedContainer.classList.add('left-icon-checkboxed-field');
if (this.are_big_notes_accepted) {
const areBigNotesAcceptedIcon = document.createElement('img');
areBigNotesAcceptedIcon.src = '/img/eur-bill-lasecagold.svg';
const areBigNotesAcceptedText = document.createElement('p');
2025-03-04 02:17:26 +01:00
areBigNotesAcceptedText.innerText = 'Billetes grandes';
2025-03-03 17:09:07 +01:00
const checkIcon = document.createElement('img');
checkIcon.src = '/img/circle-check-green.svg';
areBigNotesAcceptedContainer.append(
areBigNotesAcceptedIcon,
areBigNotesAcceptedText,
checkIcon
);
} else {
const areBigNotesAcceptedIcon = document.createElement('img');
areBigNotesAcceptedIcon.src = '/img/eur-bill-gray.svg';
const areBigNotesAcceptedText = document.createElement('p');
2025-03-04 02:17:26 +01:00
areBigNotesAcceptedText.innerText = 'Billetes grandes';
2025-03-03 17:09:07 +01:00
const checkIcon = document.createElement('img');
checkIcon.src = '/img/circle-xmark-gray.svg';
areBigNotesAcceptedContainer.append(
areBigNotesAcceptedIcon,
areBigNotesAcceptedText,
checkIcon
);
}
otherOfferFeaturesDiv.append(areBigNotesAcceptedContainer);
2025-03-04 02:17:26 +01:00
const actionButtonsArea = document.createElement('p');
actionButtonsArea.classList.add('offer-action-buttons-area');
const editActionArea = document.createElement('div');
editActionArea.classList.add('offer-action-area');
const editActionIcon = document.createElement('img');
editActionIcon.src = '/img/edit.svg';
const editActionText = document.createElement('p');
editActionText.innerText = 'Editar';
editActionArea.append(editActionIcon, editActionText);
const deleteActionArea = document.createElement('div');
deleteActionArea.classList.add('offer-action-area');
const deleteActionIcon = document.createElement('img');
deleteActionIcon.src = '/img/trash-can-darkred.svg';
const deleteActionText = document.createElement('p');
deleteActionText.innerText = 'Eliminar';
deleteActionArea.append(deleteActionIcon, deleteActionText);
actionButtonsArea.append(editActionArea, deleteActionArea);
2025-03-03 15:34:56 +01:00
offerCard.append(
tradeDescDiv,
premiumDescDiv,
whereDescDiv,
whenDescDiv,
2025-03-03 16:03:47 +01:00
bitcoinMethodsDiv,
2025-03-03 17:09:07 +01:00
visibilityDiv,
2025-03-04 02:17:26 +01:00
otherOfferFeaturesDiv,
actionButtonsArea
2025-03-03 15:34:56 +01:00
);
2025-03-03 12:25:15 +01:00
return offerCard;
}
2025-03-01 23:18:18 +01:00
}
class MyOffers {
2025-03-03 10:32:57 +01:00
constructor(ownOffersContainerElement) {
this.ownOffersContainerElement = ownOffersContainerElement;
2025-03-01 23:18:18 +01:00
this.offers = [];
}
async getOffersFromApi() {
const offersResponse = await fetch('/api/publickey-offers');
2025-03-04 15:26:07 +01:00
this.offers = [];
2025-03-01 23:18:18 +01:00
const offersData = (await offersResponse.json()).data;
if (offersResponse.ok) {
for (const record of offersData) {
this.offers.push(new Offer(record));
}
}
}
2025-03-03 10:32:57 +01:00
async render() {
2025-03-04 15:24:36 +01:00
if (this.offers.length === 0) {
2025-03-03 10:32:57 +01:00
this.ownOffersContainerElement.innerHTML =
'<p class="shadowed-round-area">Vaya, no hay nada por aquí...</p>';
return;
}
2025-03-03 12:25:15 +01:00
this.ownOffersContainerElement.innerHTML = '';
2025-03-03 10:32:57 +01:00
for (const someOffer of this.offers) {
2025-03-03 12:25:15 +01:00
this.ownOffersContainerElement.append(someOffer.buildHTML());
2025-03-03 10:32:57 +01:00
}
}
2025-03-01 23:18:18 +01:00
}
2025-02-24 11:20:24 +01:00
buttonStartCreateOffer.addEventListener('click', () => {
2025-03-04 17:32:03 +01:00
toggleCreateOfferModal();
2025-02-24 11:20:24 +01:00
});
2025-03-03 10:32:57 +01:00
buttonViewMyOffers.addEventListener('click', async () => {
await myOffers.getOffersFromApi();
await myOffers.render();
2025-02-28 15:53:40 +01:00
toggleViewMyOffersPanel();
});
2025-03-04 17:32:03 +01:00
closeOffer.addEventListener('click', () => {
toggleCreateOfferModal();
2025-02-24 11:20:24 +01:00
});
2025-02-22 22:33:51 +01:00
buyOrSellButtons.forEach((button) => {
button.addEventListener('click', () => {
toggleBuyOrSellButtonGroup();
});
});
2025-02-23 00:22:34 +01:00
buttonIncreasePremium.addEventListener('click', () => {
modifyPremiumValue(1);
});
buttonDecreasePremium.addEventListener('click', () => {
modifyPremiumValue(-1);
});
2025-02-23 23:41:13 +01:00
eurAmountInput.addEventListener('blur', () => {
validateAndFormatEurAmountInput();
2025-02-24 11:20:24 +01:00
updateBtcInput();
});
eurAmountInput.addEventListener('input', () => {
eurAmountInput.value = eurAmountInput.value.replace(/[^0-9]/g, '');
2025-02-25 00:38:13 +01:00
updateBtcInput();
2025-02-23 23:41:13 +01:00
});
2025-02-24 12:04:36 +01:00
2025-02-25 00:11:20 +01:00
for (const btcMethodCheckbox of btcMethodCheckboxes) {
2025-02-25 00:52:25 +01:00
btcMethodCheckbox.addEventListener('click', () => {
validateBitcoinMethodCheckboxes(btcMethodCheckbox);
2025-02-24 12:04:36 +01:00
});
}
2025-02-25 00:52:25 +01:00
2025-02-25 14:01:25 +01:00
publishOfferButton.addEventListener('click', () => {
publishOffer();
});
2025-02-25 00:52:25 +01:00
updateBtcInput();
2025-03-03 10:32:57 +01:00
const myOffers = new MyOffers(ownOffersContainer);