BuyPanel.svelte 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. <!--NAO ESTA MAIS SENDO UTILIZADO-->
  2. <script>
  3. import { createEventDispatcher } from 'svelte';
  4. export let referencePrice;
  5. export let tokens = [];
  6. const dispatch = createEventDispatcher();
  7. let tab = 'market';
  8. let amountFiat = '';
  9. let limitPrice = '';
  10. let selectedTokenId = tokens?.[0]?.id ?? null;
  11. function formatBRL(n) {
  12. return new Intl.NumberFormat('pt-BR', { style: 'currency', currency: 'BRL' }).format(Number(n || 0));
  13. }
  14. function formatEasyToken(n) {
  15. return new Intl.NumberFormat('pt-BR', { minimumFractionDigits: 0, maximumFractionDigits: 0 }).format(Math.floor(Number(n || 0)));
  16. }
  17. $: selectedToken = tokens.find(t => t.id === selectedTokenId);
  18. $: refPriceByToken = selectedToken?.price ?? referencePrice;
  19. $: priceUsed = tab === 'limit' ? Number(limitPrice) : Number(refPriceByToken);
  20. $: computedEasyTokenRaw = (Number(amountFiat) && priceUsed) ? Number(amountFiat) / priceUsed : 0;
  21. $: computedEasyToken = Math.floor(computedEasyTokenRaw);
  22. function confirm() {
  23. const price = priceUsed;
  24. const total = Number(amountFiat);
  25. if (!price || !total) return;
  26. const amount = computedEasyToken;
  27. if (!amount) return;
  28. dispatch('confirm', { type: tab, price, amount, total, tokenId: selectedToken?.id });
  29. amountFiat = '';
  30. limitPrice = '';
  31. }
  32. </script>
  33. <div class="bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg shadow-sm">
  34. <div class="px-5 py-4 border-b border-gray-200 dark:border-gray-700 flex items-center justify-between">
  35. <h3 class="text-base font-semibold text-gray-800 dark:text-gray-100">Comprar</h3>
  36. <div class="inline-flex rounded-md border border-gray-200 dark:border-gray-600 overflow-hidden">
  37. <button class={`px-3 py-1.5 text-sm ${tab === 'market' ? 'bg-green-600 text-white' : 'bg-white dark:bg-gray-800 text-gray-700 dark:text-gray-300'}`} on:click={() => (tab = 'market')}>Mercado</button>
  38. <button class={`px-3 py-1.5 text-sm border-l border-gray-200 dark:border-gray-600 ${tab === 'limit' ? 'bg-green-600 text-white' : 'bg-white dark:bg-gray-800 text-gray-700 dark:text-gray-300'}`} on:click={() => (tab = 'limit')}>Limitada</button>
  39. </div>
  40. </div>
  41. <div class="p-5 space-y-4">
  42. <div>
  43. <label class="block text-sm font-medium text-gray-700 dark:text-gray-300">Tipo de EasyToken</label>
  44. <select bind:value={selectedTokenId} class="mt-1 block w-full rounded border border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-700/70 text-gray-900 dark:text-gray-200 px-3 py-2 focus:outline-none focus:ring-2 focus:ring-blue-500">
  45. {#each tokens as t}
  46. <option value={t.id}>{t.label || t.name}</option>
  47. {/each}
  48. </select>
  49. </div>
  50. {#if tab === 'limit'}
  51. <div>
  52. <label class="block text-sm font-medium text-gray-700 dark:text-gray-300">Preço limite (R$)</label>
  53. <input type="number" min="0" step="0.01" bind:value={limitPrice} class="mt-1 block w-full rounded border border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-700/70 text-gray-900 dark:text-gray-200 px-3 py-2 focus:outline-none focus:ring-2 focus:ring-blue-500" />
  54. </div>
  55. {/if}
  56. <div class="grid grid-cols-1 sm:grid-cols-2 gap-4">
  57. <div>
  58. <label class="block text-sm font-medium text-gray-700 dark:text-gray-300">EasyCoin (R$)</label>
  59. <input type="number" min="0" step="0.01" bind:value={amountFiat} class="mt-1 block w-full rounded border border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-700/70 text-gray-900 dark:text-gray-200 px-3 py-2 focus:outline-none focus:ring-2 focus:ring-blue-500" />
  60. </div>
  61. <div>
  62. <label class="block text-sm font-medium text-gray-700 dark:text-gray-300">EasyToken (inteiros)</label>
  63. <input value={formatEasyToken(computedEasyToken || 0)} readonly class="mt-1 block w-full rounded border border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-700/40 text-gray-900 dark:text-gray-200 px-3 py-2" />
  64. </div>
  65. </div>
  66. <div class="grid grid-cols-1 sm:grid-cols-2 gap-4">
  67. <div>
  68. <label class="block text-sm font-medium text-gray-700 dark:text-gray-300">EasyToken a receber</label>
  69. <input value={formatEasyToken(computedEasyToken || 0)} readonly class="mt-1 block w-full rounded border border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-700/40 text-gray-900 dark:text-gray-200 px-3 py-2" />
  70. </div>
  71. <div>
  72. <label class="block text-sm font-medium text-gray-700 dark:text-gray-300">Preço de referência</label>
  73. <input value={refPriceByToken ? formatBRL(refPriceByToken) : '—'} readonly class="mt-1 block w-full rounded border border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-700/40 text-gray-900 dark:text-gray-200 px-3 py-2" />
  74. </div>
  75. </div>
  76. <div class="flex justify-end">
  77. <button class="px-4 py-2 rounded bg-green-600 hover:bg-green-700 text-white focus:outline-none focus:ring-2 focus:ring-green-500" on:click={confirm}>Confirmar</button>
  78. </div>
  79. </div>
  80. </div>