diff options
| author | Adam Soltys <[email protected]> | 2023-01-24 23:53:19 -0800 |
|---|---|---|
| committer | Adam Soltys <[email protected]> | 2023-01-24 23:53:19 -0800 |
| commit | 32176742969796afdede9840c1c68a9343ec21af (patch) | |
| tree | 32d918546638ecbc8dbd15ae63b7aedf1d299a30 /src | |
| parent | 9e933e6e11f4bec490010664a54a185a3c53ee42 (diff) | |
| download | coinos-ui-32176742969796afdede9840c1c68a9343ec21af.tar.gz coinos-ui-32176742969796afdede9840c1c68a9343ec21af.zip | |
editable numpad values
Diffstat (limited to 'src')
| -rw-r--r-- | src/components/Numpad.svelte | 97 | ||||
| -rw-r--r-- | src/lib/utils.js | 2 |
2 files changed, 95 insertions, 4 deletions
diff --git a/src/components/Numpad.svelte b/src/components/Numpad.svelte index a4cdb50f..e688cc6e 100644 --- a/src/components/Numpad.svelte +++ b/src/components/Numpad.svelte @@ -10,6 +10,8 @@ export let amountFiat = amount ? amount * ($selectedRate / sats) : 0; + let arrow = '<'; + let amountSats = amount; let loading = false; @@ -85,13 +87,102 @@ } } }; + + function getCaretPosition(editableDiv) { + var caretPos = 0, + sel, + range; + if (window.getSelection) { + sel = window.getSelection(); + if (sel.rangeCount) { + range = sel.getRangeAt(0); + if (range.commonAncestorContainer.parentNode == editableDiv) { + caretPos = range.endOffset; + } + } + } else if (document.selection && document.selection.createRange) { + range = document.selection.createRange(); + if (range.parentElement() == editableDiv) { + var tempEl = document.createElement('span'); + editableDiv.insertBefore(tempEl, editableDiv.firstChild); + var tempRange = range.duplicate(); + tempRange.moveToElementText(tempEl); + tempRange.setEndPoint('EndToEnd', range); + caretPos = tempRange.text.length; + } + } + return caretPos; + } + + $: html = fiat ? f(amountFiat, currency) : s(amountSats); + + let prev = ''; + + let input = (e) => { + if (html.length > 12) return (html = prev); + if (prev === '0' && html.length === 2) { + prev = ''; + html = html.replace('0', ''); + } + + let sel = getSelection(); + let i = sel.focusOffset; + + if (!fiat) amountSats = parseInt(html.replace(/,/g, '')); + if (!amountSats) amountSats = null; + if (amountSats > sats) amountSats = sats; + + setTimeout(() => { + let p = prev.split(',')[0].length; + if (html.length > prev.length && p === 3) i++; + if (html.length < prev.length && p === 1 && i > 1) i--; + + let node = e.target.childNodes[0]; + let range = document.createRange(); + + range.setStart(node, i); + range.setEnd(node, i); + + let sel = getSelection(); + sel.removeAllRanges(); + sel.addRange(range); + + prev = html; + }, 0); + }; + + let focus = (e) => { + let range = document.createRange(); + range.selectNodeContents(e.target); + let sel = getSelection(); + sel.removeAllRanges(); + sel.addRange(range); + }; </script> <div class="flex justify-center items-center mb-3 px-3"> <div class="space-y-5"> <div class="text-center"> - <div class="text-5xl md:text-6xl font-semibold tracking-widest mb-1"> - {fiat ? `${symbol}${amountFiat}` : '⚡️' + amountSatsFormatted} + <div class="text-5xl md:text-6xl font-semibold tracking-widest flex justify-center"> + {#if fiat} + <div class="my-auto">{symbol}</div> + <div + contenteditable + bind:innerHTML={amountFiat} + on:focus={focus} + on:input={input} + class="outline-none" + /> + {:else} + <div>⚡️</div> + <div + contenteditable + bind:innerHTML={html} + on:focus={focus} + on:input={input} + class="outline-none" + /> + {/if} </div> <span class="text-secondary mr-1">{fiat ? amountSatsConverted : amountFiatConverted}</span> <button @@ -112,7 +203,7 @@ <div class="grid grid-cols-3 gap-2 w-[300px] mx-auto"> {#each numPad as value} - {#if value === '<'} + {#if value === arrow} <button type="button" class="bg-primary rounded-xl py-4 px-8 font-semibold active:bg-black active:text-white flex justify-center items-center hover:opacity-80" diff --git a/src/lib/utils.js b/src/lib/utils.js index 179aecc6..e6325e9f 100644 --- a/src/lib/utils.js +++ b/src/lib/utils.js @@ -161,7 +161,7 @@ export const sat = (s) => { '⚡️' + (parseInt(s) > 0 ? new Intl.NumberFormat('en-US', { maximumFractionDigits: 1 }).format(s / Math.pow(1000, d)) + - ['', 'K', 'M', 'G'][d] + ['', 'K', 'M', 'G', 'T', 'P'][d] : 0 ).toString() ); |
