From e64336660bce31a6f3544a4e569fbf377ebbf97f Mon Sep 17 00:00:00 2001 From: Esteban Date: Sat, 2 Mar 2024 02:10:23 -0500 Subject: [PATCH] re-add nano tips --- .../features/status/components/action_bar.jsx | 46 +- app/views/layouts/application.html.haml | 2 - config/deploy.rb | 2 +- public/nanopay.js | 803 ------------------ 4 files changed, 46 insertions(+), 807 deletions(-) delete mode 100644 public/nanopay.js diff --git a/app/javascript/mastodon/features/status/components/action_bar.jsx b/app/javascript/mastodon/features/status/components/action_bar.jsx index c243a49129eb4e..46b7cb33756842 100644 --- a/app/javascript/mastodon/features/status/components/action_bar.jsx +++ b/app/javascript/mastodon/features/status/components/action_bar.jsx @@ -24,6 +24,7 @@ import RepeatPrivateActiveIcon from '@/svg-icons/repeat_private_active.svg?react import { PERMISSION_MANAGE_USERS, PERMISSION_MANAGE_FEDERATION } from 'mastodon/permissions'; import { WithRouterPropTypes } from 'mastodon/utils/react_router'; +import api from '../api'; import { IconButton } from '../../../components/icon_button'; import DropdownMenuContainer from '../../../containers/dropdown_menu_container'; import { me } from '../../../initial_state'; @@ -105,6 +106,45 @@ class ActionBar extends PureComponent { this.props.onReblog(this.props.status, e); }; + handleTipClick = () => { + + const { status } = this.props; + + const id = status.getIn(['account', 'id']) + + api().get(`/api/v1/accounts/${id}`).then(response => { + + if (!response.data.fields || !response.data.fields.length) return window.alert('User does not have a nano address.') + + var raw_address = response.data.fields.find(a => a.value && a.value.includes('nano_')) + var nano_to_name = response.data.fields.find(a => a.value && (a.value.includes('ΣΏ.to/') || a.value.includes('nano.to/') || a.value.includes('xno.to/'))) + + if (raw_address) return window.location.href = `nano:${raw_address.value}`; + + if (nano_to_name) { + api().get('/api/v1/streaming/nano_known').then(known => { + console.log( response.data.fields ) + var name = nano_to_name.value.match(/href="([^"]*)"/)[1] + name = name.replace('https://', '').replace('http://', '') + name = name.split('/')[1] + var account = known.data.find(a => a.name.toLowerCase() === name.toLowerCase()) + if (account) return window.location.href = `nano:${account.address}` + return window.alert('This user has a Nano.to Name that is invalid or expired.') + }).catch((e) => { + console.log(e) + }) + } + + if (!raw_address && !nano_to_name) return window.alert('User does not have a nano address.') + + return false + + }).catch((e) => { + console.log(e) + }) + + }; + handleFavouriteClick = () => { this.props.onFavourite(this.props.status); }; @@ -315,7 +355,11 @@ class ActionBar extends PureComponent {
-
+ {/*
*/} + +
diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml index b7b7a4208ca94f..c7210736703a41 100755 --- a/app/views/layouts/application.html.haml +++ b/app/views/layouts/application.html.haml @@ -38,8 +38,6 @@ = stylesheet_link_tag custom_css_path, skip_pipeline: true, host: root_url, media: 'all' - %script{ src: '/nanopay.js' } - = yield :header_tags %body{ class: body_classes } diff --git a/config/deploy.rb b/config/deploy.rb index 9a34cc7530b739..dae5c42b793a9c 100644 --- a/config/deploy.rb +++ b/config/deploy.rb @@ -10,7 +10,7 @@ set :rbenv_ruby, File.read('.ruby-version').strip set :migration_role, :app -append :linked_files, '.env.production', 'public/nanopay.js' +# append :linked_files, '.env.production', 'public/nanopay.js' append :linked_files, '.env.production', 'public/nano-logo.png' append :linked_files, '.env.production', 'public/robots.txt' diff --git a/public/nanopay.js b/public/nanopay.js deleted file mode 100644 index 2f76025b295349..00000000000000 --- a/public/nanopay.js +++ /dev/null @@ -1,803 +0,0 @@ -// NanoPay 1.1.0 -// February 28, 2024 -// https://github.com/fwd/NanoPay -// (c) @nano2dev -// Released under MIT License -;(async () => { - - let original_config = false - let payment_success = false - let locked_content = {} - let rpc_checkout = {} - let wall_success = null - let desktop_width = 960 - window.check_interval = false - window.expiration_interval = false - - if (window.NanoPay === undefined) window.NanoPay = { version: '1.1.0', support: 'support@nano.to' } - - if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { - window.NanoPay.dark_mode = true - } - - let RPC = { - - get(endpoint) { - return new Promise((resolve) => { - var xhr = new XMLHttpRequest(); - xhr.open("GET", endpoint, true); - xhr.send(); - xhr.onload = function() { - resolve(JSON.parse(this.responseText)) - } - }) - }, - - post(endpoint, data) { - return new Promise((resolve) => { - var xhr = new XMLHttpRequest(); - xhr.open("POST", endpoint, true); - xhr.setRequestHeader('Content-Type', 'application/json'); - xhr.send(JSON.stringify(data)); - xhr.onload = function() { - resolve(JSON.parse(this.responseText)) - } - }) - }, - - } - - function addStyleIfNotExists(cssContent) { - var styles = document.head.getElementsByTagName('style'); - var styleExists = false; - for (var i = 0; i < styles.length; i++) { - if (styles[i].textContent.trim() === cssContent.trim()) { - styleExists = true; - break; - } - } - if (!styleExists) { - var style = document.createElement('style'); - style.textContent = cssContent; - document.head.appendChild(style); - } - } - - window.NanoPay.CopyToClipboard = function(text, el) { - navigator.clipboard.writeText(rpc_checkout[text]).then(function() { - var span = el.getElementsByTagName("span") - if (span) { - var default_text = span[0].innerText - span[0].innerText = 'Copied!' - setTimeout(() => span[0].innerText = default_text, 2000) - } - }, function() { - document.execCommand("copy"); - }) - } - - window.NanoPay.update_description = (text) => { - document.getElementById('nano-pay-description').innerText = text - } - - function countdownTimer(duration, onTick, onComplete) { - let timeLeft = duration; - window.expiration_interval = setInterval(() => { - const minutes = Math.floor(timeLeft / 60); - const seconds = timeLeft % 60; - if (timeLeft <= 0) { - clearInterval(window.expiration_interval); - onComplete(); - } else { - onTick(minutes, seconds); - timeLeft--; - } - }, 1000); - } - - window.NanoPay.onchange_select_one = (e) => { - plan = rpc_checkout.plans[e.value.split(',')[0]] - if (!plan) return alert("NanoPay: Checkout Error. Please contact support@nano.to with error code #109") - rpc_checkout.amount = plan.value - rpc_checkout.amount_raw = plan.value_raw - document.getElementById('nano-pay-amount-value').innerText = `${rpc_checkout.amount} ${e.value.split(',')[1]}` - document.getElementById('nano-pay-copy-clipboard-amount').innerText = `${ String(rpc_checkout.amount).length > 7 ? String(rpc_checkout.amount).slice(0, 7) + '..' : String(rpc_checkout.amount) } ${e.value.split(',')[1]}` - document.getElementById('nano-pay-qrcode-image').src = plan.qrcode - } - - window.NanoPay.onchange_custom_input_one = (e) => { - window.NanoPay.config.provided_alias = e.value - if (e.value && (window.innerWidth > desktop_width || window.NanoPay.config.qrcode)) document.getElementById('nano-pay-qrcode').style.display = 'flex' - if (!e.value) document.getElementById('nano-pay-qrcode').style.display = 'none' - } - - window.NanoPay.unlock_request = async (title, element, amount, address, notify, elementId) => { - if (!original_config) return - if (original_config.seriesId && original_config.seriesId !== elementId) return - if (original_config.notify && original_config.notify !== notify) return - if (original_config.element !== element) return - if (Number(original_config.amount) !== Number(amount)) return - if (original_config.address !== address) return - window.NanoPay.close() - window.NanoPay.open({ - title, - amount, - description: original_config.description, - address, - notify, - success: (block) => window.NanoPay.unlock_content(element, elementId, block) - }) - } - - function getStringBetween(string, start, end) { - var startIndex = string.indexOf(start); - if (startIndex === -1) return ''; - startIndex += start.length; - var endIndex = string.indexOf(end, startIndex); - if (endIndex === -1) return ''; - return string.substring(startIndex, endIndex); - } - - window.NanoPay.unlock_content = async (element, elementId, block, delay) => { - - if (!element) return - if (!payment_success) return - - setTimeout(() => { - - var all = document.querySelectorAll(element); - - for (var i=0, max=all.length; i < max; i++) { - if (original_config.decode) { - var body = getStringBetween(locked_content[i], 'PREMIUM-ARTICLE-A', '+HRT') - if (body) all[i].innerHTML = locked_content[i].replace('PREMIUM-ARTICLE-A' + body + '+HRT', atob(body)) - else all[i].innerHTML = locked_content[i] - } else { - all[i].innerHTML = locked_content[i] - } - all[i].style.position = null - all[i].classList.add("unlocked") - all[i].style.display = original_config.display || 'block' - } - - var locked = document.querySelectorAll('.nano-locked'); - - for (var i = 0, max = locked.length; i < max; i++) { - if ( locked[i] ) locked[i].remove() - } - - if (elementId) localStorage.setItem(elementId, true) - - if (wall_success) wall_success(block, element, elementId) - - }, delay === false ? 0 : 1900) - - } - - window.NanoPay.wall = async (config) => { - - config = config || {} - - if (!config.element) return console.error('NanoPay: No premium element provided:', config.element) - if (!config.address) return console.error('NanoPay: No address provided:', config.address) - if (!config.amount) return console.error('NanoPay: No price provided:', config.amount) - - if (config.endpoint || config.node) window.nano.rpc.endpoint = config.endpoint || config.node - if (config.debug) window.nano.debug = config.debug - if (config.success) window.user_success = config.success - - var all = document.querySelectorAll(config.element); - - if (config.success) wall_success = config.success - - original_config = config - - var buttonCSS = `.nano-pay-unlock-button { cursor: pointer;padding: 7px 25px;border-radius: 4px;margin: 15px 0 10px 0;display: flex;align-items: center;justify-content: center;background: #ffffff;font-family: Helvetica, 'Arial';letter-spacing: 1px;min-height: 48px; color: ${config.color || '#000'} } - .nano-pay-unlock-button img { max-width: 24px;width: auto;min-width: auto;margin: 0 8px 0 0!important;float: none; } - .nano-pay-free-read { text-align: center } - .nano-pay-free-read hr { margin: 20px 0 15px 0; }` - - addStyleIfNotExists(buttonCSS); - - for (var i=0, max=all.length; i < max; i++) { - - var item = all[i] - - var articleId = config.seriesId || window.location.pathname + '-' + item.tagName + '-' + i - - locked_content[i] = item.innerHTML - - if (localStorage.getItem(articleId)) { - payment_success = true - window.NanoPay.unlock_content(config.element, null, null, false) - return - } - - var code = `
${ config.button || 'Unlock with Nano' }
` - - if (config.free) { - payment_success = true - code += `

${ config.free_text ? config.free_text : 'Free Read' }
` - } - - all[i].innerHTML = code - - item.style.display = config.display || 'block' - - } - - } - - window.NanoPay.close = (element) => { - document.body.style.overflow = 'auto'; - if (document.getElementById('nano-pay')) document.getElementById('nano-pay').remove() - clearInterval(window.check_interval) - window.check_interval = false - clearInterval(window.expiration_interval) - window.expiration_interval = false - payment_success = false - rpc_checkout = null - } - - window.NanoPay.cancel = async (element) => { - document.body.style.overflow = 'auto'; - document.getElementById('nano-pay').remove() - clearInterval(window.check_interval) - window.check_interval = false - clearInterval(window.expiration_interval) - window.expiration_interval = false - if (window.NanoPay.config && window.NanoPay.config.cancel) { - if ( window.NanoPay.config.cancel && window.NanoPay.config.cancel.constructor.name === 'AsyncFunction' ) await window.NanoPay.config.cancel() - if ( window.NanoPay.config.cancel && window.NanoPay.config.cancel.constructor.name !== 'AsyncFunction' ) window.NanoPay.config.cancel() - } - } - - window.NanoPay.submit = async (config) => { - - if (window.NanoPay.config && window.NanoPay.config.submit) { - - var body = { - address: rpc_checkout.address, - amount: rpc_checkout.amount, - amount_raw: rpc_checkout.amount_raw, - alias: window.NanoPay.config.provided_alias, - email: window.NanoPay.config.contact_email, - shipping: window.NanoPay.config.mailing_address, - } - - var submit = window.NanoPay.config.submit - - if ( submit.constructor.name === 'AsyncFunction' ) await submit(body) - if ( submit.constructor.name !== 'AsyncFunction' ) submit(body) - - return - - } else { - - if (window.NanoPay.config.require_alias && !window.NanoPay.config.provided_alias) return alert('Address alias required.') - if (window.NanoPay.config.contact && !window.NanoPay.config.contact_email) return alert('Email address required.') - if (window.NanoPay.config.shipping && !window.NanoPay.config.mailing_address) return alert('Shipping address required.') - - window.open(`nano:${rpc_checkout.address}?amount=${rpc_checkout.amount_raw}`, '_self') - - } - - } - - window.NanoPay.open = async (config) => { - - config = config || window.NanoPay.config - - if (typeof config === 'string' && config.includes('el-')) { - config = window.NanoPay.el[Number(config.replace('el-', ''))] - } - - if (!window.NanoPay.config && config) window.NanoPay.config = config - - var background = config.background || (window.NanoPay.dark_mode ? '#353535' : 'rgb(247, 247, 247)') - var backdrop_background = config.backdrop || (window.NanoPay.dark_mode ? '#1f1e1ee0' : 'rgb(142 142 142 / 93%)') - var text_color = config.text || (window.NanoPay.dark_mode ? '#FFF' : '#000') - var position = config.position || 'bottom' - var button = config.button || 'Open' - var symbol = config.symbol || 'NANO' - var description = config.description || config.text || config.note || config.memo || 'TOTAL' - var address = config.address - var amount = config.amount ? Number(config.amount) : undefined - var random = config.random || config.random === false || config.random === "false" ? config.random : true - var notify = config.notify - var line_items = config.line_items || config.items || config.products - var currency = config.currency - var public_key = config.public_key || config.key - var custom_css = config.css || config.custom_css - var qrcode = config.qr || config.qrcode - var node = config.node || config.rpc || config.endpoint || 'https://rpc.nano.to' - var checkout = config.checkout || config.url - var wallet = config.wallet ? config.wallet.toLowerCase() : 'natrium' - var get_alias = config.alias || config.get_alias - var get_name = config.claim || config.lease || config.name || config.get_name - var disclaimer = config.disclaimer - var expiration = config.timeout || config.expiration || config.time || config.time - - var wallets = { - nault: { image: 'https://pay.nano.to/img/nault.png', name: 'Nault' }, - natrium: { image: 'https://pay.nano.to/img/natrium.png', name: 'Natrium' }, - nautilus: { image: 'https://pay.nano.to/img/nautilus.png', name: 'Nautilus' }, - cake: { image: 'https://pay.nano.to/img/cake.png', name: 'Cake Wallet' }, - } - - var strings = { - line_items: config.strings && config.strings.line_items ? config.strings.line_items : (config.line_items && config.line_items.length > 1 ? 'Items' : 'Item'), - email: config.strings && config.strings.email ? config.strings.email : 'Email', - shipping: config.strings && config.strings.shipping ? config.strings.shipping : 'Shipping', - tax: config.strings && config.strings.tax ? config.strings.tax : 'Sales Tax', - subtotal: config.strings && config.strings.subtotal ? config.strings.subtotal : 'Subtotal', - button: config.strings && config.strings.button ? config.strings.button : 'Pay with Nano', - quantity: config.strings && config.strings.quantity ? config.strings.quantity : 'Amount', - alias: config.strings && config.strings.alias ? config.strings.alias : 'Your Alias', - account: config.strings && config.strings.account ? config.strings.account : 'Account', - } - - if (!wallets[wallet]) return alert("NanoPay: Invalid wallet option. Supported: natrium, nault, nautilus, cake.") - - if (config.contact === "false") config.contact = false - - if (checkout) { - - var checkout_url = checkout.replace('https://api.nano.to/checkout/', '') - - rpc_checkout = (await RPC.get(`https://api.nano.to/checkout/${checkout_url}`, { headers: { 'nano-app': `fwd/nano-pay:${window.NanoPay.version}` } })) - - if (rpc_checkout.plans) { - var default_plan = config.default || config.plan || 1 - rpc_checkout.amount = rpc_checkout.plans[default_plan].value - rpc_checkout.amount_raw = rpc_checkout.plans[default_plan].value_raw - rpc_checkout.qrcode = rpc_checkout.plans[default_plan].qrcode - } - - if (rpc_checkout.description) description = rpc_checkout.description - if (rpc_checkout.symbol) window.NanoPay.config.symbol = rpc_checkout.symbol - if (rpc_checkout.shipping) window.NanoPay.config.shipping = rpc_checkout.shipping - if (rpc_checkout.contact) window.NanoPay.config.contact = rpc_checkout.contact - - } else { - - if (get_name) { - - rpc_checkout = (await RPC.post('https://api.nano.to', { - action: 'get_name', - username: get_name, - qrcode: true - })) - - if (rpc_checkout.available === false) { - config.disclaimer = 'Username taken. Only original owner can add time.' - } - - if (rpc_checkout.error) return alert("NanoPay: " + rpc_checkout.message || rpc_checkout.error) - - var default_plan = 1 - rpc_checkout.amount = rpc_checkout.plans[default_plan].value - rpc_checkout.amount_raw = rpc_checkout.plans[default_plan].value_raw - rpc_checkout.qrcode = rpc_checkout.plans[default_plan].qrcode - description = description || `@${rpc_checkout.lease.replace('@', '')}` - strings.quantity = 'Duration' - - } else if (get_alias) { - - rpc_checkout = (await RPC.post('https://api.nano.to', { - action: 'get_alias', - amount: config.amount, - address: config.address - })) - - if (rpc_checkout.error) return alert("NanoPay: " + rpc_checkout.message || rpc_checkout.error) - - window.NanoPay.config.require_alias = true - - if (!config.disclaimer) config.disclaimer = 'The address you pay with now, will be associated with this alias. If already registered, alias will be updated.' - - if (!config.memo && !config.note) description = 'Register Alias' - - } else { - - if (!address) return alert("NanoPay: Address or Username required.") - - if (!amount && !line_items) return alert("NanoPay: Amount or line_items required.") - - if (line_items) { - if (!Array.isArray(line_items) || line_items && !line_items.find(a => a && a.price)) return alert("NanoPay: Invalid line_items. Example: [ { name: 'T-Shirt', price: 5 } ] ") - } - - rpc_checkout = (await RPC.post(node, { - action: "checkout", - line_items, - shipping: Number(config.shipping) ? config.shipping : 0, - currency, - address, - amount, - random, - notify, - public_key - }, { headers: { 'nano-app': `fwd/nano-pay:${window.NanoPay.version}` } })) - - } - - } - - if (!rpc_checkout.amount_raw) { - return alert("NanoPay: " + rpc_checkout.message || 'Checkout Error. Please contact support@nano.to with error code #112') - } - - // looks better - if (!config.position && window.innerWidth > desktop_width) { - position = 'top' - if (!config.wallet) wallet = 'nault' - } - - if (!config.button) button = button + ' ' + wallets[wallet].name - - var cssContent = ` - #nano-pay { font-family: sans-serif; font-family: 'Arial'; position: fixed;width: 100%;z-index: 9999;left: 0;top: 0;right: 0;bottom: 0;display: flex;align-items: center;justify-content: center;flex-direction: column;font-size: 15px; } - - #nano-pay-backdrop { background: ${backdrop_background}; width: 100%; height: 100%; } - - #nano-pay-body { width: 100%;max-width: 420px;display: flex;flex-direction: column;justify-content: center;align-items: center;background:${background}; position: absolute;transition: all 0.3s ease 0s;color:${text_color};box-shadow: 1px 1px 7px #0003; letter-spacing: 0.2px; bottom: ${position === 'bottom' ? '-100%' : 'auto'}; top: ${position === 'top' ? '-100%' : 'auto'} } - - #nano-pay-header { display: flex; align-items: center; } - #nano-pay-header > img { max-width: 22px; } - #nano-pay-header > span { display: block;margin-left: 4px;font-size: 106%; } - #nano-pay-header-container { box-sizing: border-box; width: 100%;display: flex;align-items: center;justify-content: space-between;padding: 14px;border-bottom: 1px solid ${ window.NanoPay.dark_mode ? '#ffffff08' : '#0000000f' }; } - #nano-pay-cancel { color: #1f9ce9 } - - #nano-pay-shipping { box-sizing: border-box; display: flex;justify-content: start;width: 100%;padding: 15px 14px;border-bottom: 1px solid ${ window.NanoPay.dark_mode ? '#ffffff08' : '#0000000f' };position: relative;align-items: center; } - #nano-pay-shipping svg { max-width: 23px;fill: #1f9ce9;position: absolute;right: 5px;top: 0px;bottom: 0;margin: auto; } - #nano-pay-shipping-label { text-transform: uppercase; letter-spacing: 0.7px; opacity: 0.5; min-width: 90px; font-size: 90% } - - #nano-pay-contact { box-sizing: border-box; display: flex;justify-content: start;width: 100%;padding: 15px 14px;border-bottom: 1px solid ${ window.NanoPay.dark_mode ? '#ffffff08' : '#0000000f' };position: relative;align-items: center; } - #nano-pay-contact-label { text-transform: uppercase; letter-spacing: 0.7px; opacity: 0.5; min-width: 90px; font-size: 90% } - #nano-pay-contact svg { max-width: 23px;fill: #1f9ce9;position: absolute;right: 5px;top: 0px;bottom: 0;margin: auto; } - - #nano-pay-details { box-sizing: border-box; display: flex;justify-content: start;width: 100%;padding: 15px 14px;border-bottom: 1px solid ${ window.NanoPay.dark_mode ? '#ffffff08' : '#0000000f' };position: relative;align-items: start; } - - #nano-pay-details-spacer { text-transform: uppercase; letter-spacing: 0.5px; opacity: 0.5; min-width: 90px; } - #nano-pay-details-labels { font-family: sans-serif; text-transform: uppercase;opacity: 0.5;font-size: 95%;line-height: 17px;letter-spacing: 0.8px; } - #nano-pay-details-labels > div, #nano-pay-details-values > div { margin: 3px 0; } - #nano-pay-details-values { text-transform: uppercase;opacity: 1;font-size: 90%;line-height: 17px;letter-spacing: 0.8px; margin-left: auto; } - - #nano-pay-submit { cursor: pointer; display: flex; flex-direction: column; align-items: center; margin: 15px 0 18px 0; text-decoration: none; color: inherit; text-align: center; } - - #nano-pay-submit span { margin-top: 10px; display: block; opacity: 0.7; font-size: 85%; } - - #nano-pay-qrcode { display: flex;width: 100%;justify-content: center;border-bottom: 1px solid ${ window.NanoPay.dark_mode ? '#ffffff08' : '#0000000f' };padding-bottom: 20px; align-items: center; flex-direction: column } - #nano-pay-qrcode-image {max-width: 140px; margin-top: 20px; border-bottom: 1px solid ${ window.NanoPay.dark_mode ? '#ffffff08' : '#0000000f' }; background: #FFF; padding: 5px; border-radius: 5px;} - - #nano-pay-select-one, #nano-pay-custom-input-one { color: inherit; max-width: 285px; min-width: 135px; background: transparent; border: 1px solid ${ window.NanoPay.dark_mode ? '#ffffff12' : '#00000045' }; height: 30px; border-radius: 5px; padding: 0 3px; } - - #nano-pay-custom-input-one { min-width: 230px; } - - #nano-pay-disclaimer { justify-content: center; word-break: break-word; box-sizing: border-box; display: flex; padding: 10px 20px;background: ${ window.NanoPay.dark_mode ? '#484848' : '#e4e4e4' }; text-align: center;font-size: 14px;width: 100%; } - - #nano-pay-copy-address { display: flex } - - .nano-pay-copy-clipboard { background: ${ window.NanoPay.dark_mode ? '#484848' : '#e4e4e4' }; display: flex; min-width: 160px; align-items: center; justify-content: center; padding: 5px; border-radius: 5px; margin: 15px 5px 0 10px; cursor: pointer; zoom: 0.9 } - - .nano-pay-copy-clipboard svg { max-width: 15px; margin-left: 10px; ${ window.NanoPay.dark_mode ? 'filter: invert(1)' : '' } } - - ${custom_css} - - `; - - if (position === 'bottom') { - cssContent += `#nano-pay-body { - top: auto; - bottom: -100%; - border-bottom-left-radius: 0; - border-bottom-right-radius: 0; - border-top-left-radius: 5px; - border-top-right-radius: 5px; - }` - } - - if (position === 'center') { - cssContent += `#nano-pay-body { top: auto; bottom: auto; border-bottom-left-radius: 5px; border-bottom-right-radius: 5px; border-top-left-radius: 5px; border-top-right-radius: 5px; }` - } - - if (position === 'top') { - cssContent += `#nano-pay-body { top: -100%; bottom: auto; border-bottom-left-radius: 5px; border-bottom-right-radius: 5px; border-top-left-radius: 0; border-top-right-radius: 0; }` - } - - addStyleIfNotExists(cssContent); - - window.NanoPay.config.contact_email = config.email || localStorage.getItem('nano-pay-contact-email') - window.NanoPay.config.mailing_address = config.mailing_address || localStorage.getItem('nano-pay-mailing-address') - - var template = ` -
- -
- -
- -
-
- - ${config.title || 'Pay'} -
- -
Cancel
-
- -
-
${strings.quantity}
-
- -
-
- -
-
${strings.alias}*
-
- -
-
- -
-
${strings.account}
-
${ config.address && config.address.includes('nano_') ? ( config.address.slice(0, 12) + '...' + config.address.slice(58, 999) ) : config.address }
-
- -
-
${strings.line_items}
-
${config.line_items ? config.line_items.map(a => a.title || a.name).join(', ') : ''}
-
- -
-
${strings.email}
-
${window.NanoPay.config.contact_email || 'N/A'}
- -
- -
-
${strings.shipping}
-
${window.NanoPay.config.mailing_address || 'N/A'}
- -
- - -
-
-
-
${strings.subtotal}
-
${strings.shipping}
-
-
${description}
-
-
-
${rpc_checkout.subtotal} ${symbol}
-
${rpc_checkout.shipping} ${symbol}
-
-
${rpc_checkout.amount} ${symbol}
-
-
- -
-
${config.disclaimer}
-
- - - - - - - ${button} - - -
-
` - - document.body.innerHTML += template; - - setTimeout(() => { - document.body.style.overflow = 'hidden'; - if (position === 'top') document.getElementById('nano-pay-body').style.top = "0"; - if (position === 'top' || position === 'center') document.getElementById('nano-pay-body').style.bottom = "auto"; - if (position === 'bottom') document.getElementById('nano-pay-body').style.bottom = "0"; - }, 50) - - if (qrcode !== false) { - if (window.innerWidth > desktop_width || qrcode) { - var qr_interval = setInterval(async () => { - if (window.NanoPay.config.require_alias && !window.NanoPay.config.provided_alias) return - if (window.NanoPay.config.shipping && !window.NanoPay.config.mailing_address) return - if (window.NanoPay.config.contact && !window.NanoPay.config.contact_email) return - document.getElementById('nano-pay-qrcode').style.display = "flex" - document.getElementById('nano-pay-qrcode-image').src = rpc_checkout.qrcode - clearInterval(qr_interval) - }, 100) - } - } - - var checks = 0 - var checking = false - var viewing_page = true - var required_information = false - - if (document.visibilityState) { - document.addEventListener('visibilitychange', function() { - if (document.visibilityState === 'visible') { - viewing_page = true - if (window.check_interval) check_payment() - } else { - viewing_page = false - } - }) - } - - var delay = 5000 - - function do_success(block) { - if (block && block.block) { - var success_el = document.getElementById('nano-pay-submit-image') - var success_text = document.getElementById('nano-pay-submit-text') - success_el.src = 'https://pay.nano.to/img/success.gif?v=3' - success_text.innerText = 'Success' - if (config.success) { - setTimeout(async () => { - payment_success = true - if ( config.success.constructor.name === 'AsyncFunction' ) await config.success(block) - if ( config.success.constructor.name !== 'AsyncFunction' ) config.success(block) - }, 100) - } - setTimeout(() => window.NanoPay.close(), 2000) - clearInterval(window.check_interval) - return - } - } - - async function check_payment() { - if (!rpc_checkout || !window.NanoPay.config || window.NanoPay.config.debug) return - if (window.NanoPay.config.require_alias && !window.NanoPay.config.provided_alias) return - if (window.NanoPay.config.shipping && !window.NanoPay.config.mailing_address) return - if (window.NanoPay.config.contact && !window.NanoPay.config.contact_email) return - if (!viewing_page) return - if (checking) return - checking = true - var block = (await RPC.post(rpc_checkout.check, { - note: window.NanoPay.config.note || window.NanoPay.config.memo || window.NanoPay.config.title, - source: window.location.origin, - shipping: window.NanoPay.config.mailing_address, - email: window.NanoPay.config.contact_email, - alias: window.NanoPay.config.provided_alias, - }, { headers: { 'nano-app': `fwd/nano-pay:${window.NanoPay.version}` } } )) - checking = false - do_success(block) - } - - window.check_interval = setInterval(async () => { - if (checks < 60) { - await check_payment() - } else { - clearInterval(window.check_interval) - } - }, delay) - - if (expiration && Number(expiration)) { - countdownTimer(Number(expiration), (minutes, seconds) => { - window.NanoPay.update_description(`${description} (${minutes}:${Number(seconds) < 10 ? '0' + seconds : seconds})`) - }, async () => { - if ( window.NanoPay.config.expired && window.NanoPay.config.expired.constructor.name === 'AsyncFunction' ) await window.NanoPay.config.expired() - if ( window.NanoPay.config.expired && window.NanoPay.config.expired.constructor.name !== 'AsyncFunction' ) window.NanoPay.config.expired() - window.NanoPay.close() - }) - } - - } - - window.NanoPay.configMailingAddress = async () => { - var shipping = window.prompt('Shipping Address: ') - if (shipping) { - if (window.NanoPay.config.localstorage !== false) localStorage.setItem('nano-pay-mailing-address', shipping) - if (window.NanoPay.config && window.NanoPay.config.shippingChange) { - if ( window.NanoPay.config.shippingChange && window.NanoPay.config.shippingChange.constructor.name === 'AsyncFunction' ) { - var async_return = await window.NanoPay.config.shippingChange(shipping) - if (!async_return) return - if (typeof async_return === 'string') address = async_return - } - if ( window.NanoPay.config.shippingChange && window.NanoPay.config.shippingChange.constructor.name !== 'AsyncFunction' ) { - var sync_return = window.NanoPay.config.shippingChange(shipping) - if (!sync_return) return - if (typeof sync_return === 'string') address = sync_return - } - } - window.NanoPay.config.mailing_address = shipping - document.getElementById('nano-pay-user-mailing-address').innerText = shipping - document.getElementById('nano-pay-user-mailing-address').style.opacity = '1' - } - } - - window.NanoPay.configEmailAddress = () => { - const validateEmail = (email) => { - return email.match( - /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/ - ); - } - var email = window.prompt('Email Address: ') - if (email) { - if (!validateEmail(email)) { - return alert('Invalid email address. Try again.') - } - if (window.NanoPay.config.localstorage !== false) localStorage.setItem('nano-pay-contact-email', email) - window.NanoPay.config.contact_email = email - document.getElementById('nano-pay-user-contact-email').innerText = email - document.getElementById('nano-pay-user-contact-email').style.opacity = '1' - } - } - - window.NanoPay.init = async (config) => { - - config = config || {} - - var all = document.querySelectorAll(config.element || '[data-amount]'); - - if (all.length) { - - window.NanoPay.el = {} - - var buttonCssContent = `.nano-pay-button { cursor: pointer;padding: 7px 25px;border-radius: 4px;margin: 15px 0 10px 0;display: flex;align-items: center;justify-content: center;background: #ffffff;font-family: Helvetica, 'Arial';letter-spacing: 1px;min-height: 48px; color: ${config.color || '#000'} } .nano-pay-button img { max-width: 24px;width: auto;min-width: auto;margin: 0 8px 0 0!important;float: none; }` - - addStyleIfNotExists(buttonCssContent); - - for (var i=0, max=all.length; i < max; i++) { - - var item = all[i] - - config = { - title: item.getAttribute('data-title'), - amount: item.getAttribute('data-amount'), - address: item.getAttribute('data-address') || item.getAttribute('data-name'), - shipping: item.getAttribute('data-shipping') || false, - contact: item.getAttribute('data-email') || item.getAttribute('data-contact') || false, - position: item.getAttribute('data-position') || false, - button: item.getAttribute('data-button') || false, - notify: item.getAttribute('data-notify') || false, - random: item.getAttribute('data-random') || true, - currency: item.getAttribute('data-currency') || false, - debug: item.getAttribute('data-debug') || false, - key: item.getAttribute('data-key') || item.getAttribute('data-public_key') || item.getAttribute('data-public-key') || false, - } - - var original_text = all[i].innerText - - all[i].innerHTML = '' - - let code = `
${ original_text || strings.button }
` - - item.innerHTML += code - - window.NanoPay.el[i] = config - - } - - } else { - window.NanoPay.config = config - } - - } - -})(); - -if (document.querySelectorAll('[data-amount]').length) window.NanoPay.init() \ No newline at end of file