diff options
| author | secondl1ght <[email protected]> | 2022-10-25 18:01:56 -0600 |
|---|---|---|
| committer | secondl1ght <[email protected]> | 2022-10-25 18:01:56 -0600 |
| commit | a67b375473f1f40e1c0febfac16d7e36e0d72561 (patch) | |
| tree | 10a5fa750f2ccb53cff3510ab8fbbce108a35eb6 /src/lib | |
| parent | aa6debcd83c0b4067e0f8ce9a11d9c9ac02476ad (diff) | |
| parent | 5a5ea3ccc327ff52fb1c313998d90e4bfefea90a (diff) | |
| download | coinos-ui-a67b375473f1f40e1c0febfac16d7e36e0d72561.tar.gz coinos-ui-a67b375473f1f40e1c0febfac16d7e36e0d72561.zip | |
Merge branch 'master' of github.com:coinos/coinos-ui-v2
Diffstat (limited to 'src/lib')
| -rw-r--r-- | src/lib/socket.js | 9 | ||||
| -rw-r--r-- | src/lib/store.js | 14 | ||||
| -rw-r--r-- | src/lib/ticket.js | 31 | ||||
| -rw-r--r-- | src/lib/tickets.js | 52 | ||||
| -rw-r--r-- | src/lib/utils.js | 25 |
5 files changed, 123 insertions, 8 deletions
diff --git a/src/lib/socket.js b/src/lib/socket.js index 02d73a48..b385db9d 100644 --- a/src/lib/socket.js +++ b/src/lib/socket.js @@ -1,9 +1,10 @@ import { get } from 'svelte/store'; -import { invoices, newPayment, rate } from '$lib/store'; +import { invoices, newPayment, rate, user } from '$lib/store'; import { success } from '$lib/utils'; import { env } from '$env/dynamic/public'; const socketUrl = env.PUBLIC_SOCKET; +const btc = env.PUBLIC_BTC; let interval, socket, token; @@ -18,12 +19,14 @@ export const messages = (data) => ({ rate.set(data); }, - payment() { + async payment() { let { amount, invoice } = data; - console.log('INVOICE', invoice); + if (get(user).account_id !== data.account_id) return; + if (invoice) { invoices.set({ ...get(invoices), [invoice.uuid]: invoice }); } + newPayment.set(true); if (amount > 0) { success(`Received ${amount} sats!`); diff --git a/src/lib/store.js b/src/lib/store.js index c64ad39f..3174a86c 100644 --- a/src/lib/store.js +++ b/src/lib/store.js @@ -1,20 +1,24 @@ import { get, writable } from 'svelte/store'; import { browser } from '$app/environment'; -// creates a Svelte store synced to sessionStorage with the given key and default value -const persistSession = (key, defaultValue) => { +const persistSession = (key, defaultValue, expiry) => { + if (expiry && browser && new Date() - expiry > sessionStorage.getItem(key + 'time')) { + sessionStorage.removeItem(key); + } + let s = writable( browser && sessionStorage.getItem(key) && sessionStorage.getItem(key) !== 'undefined' ? JSON.parse(sessionStorage.getItem(key)) : defaultValue ); + expiry && browser && sessionStorage.setItem(key + 'time', Date.now()); + s.subscribe((v) => browser && sessionStorage.setItem(key, JSON.stringify(v))); return s; }; -// creates a Svelte store synced to localStorage with the given key and default value const persistLocal = (key, defaultValue) => { let s = writable( browser && localStorage.getItem(key) && localStorage.getItem(key) !== 'undefined' @@ -27,8 +31,9 @@ const persistLocal = (key, defaultValue) => { return s; }; -export const redirect = writable(); +export const loginRedirect = writable(); export const rate = writable(); +export const user = writable(); export const selectedRate = writable(); export const token = persistSession('token'); export const invoices = writable({}); @@ -37,3 +42,4 @@ export const colorTheme = writable('from-primary to-gradient'); export const tempProfileFiles = writable(); export const avatarUpload = writable(); export const bannerUpload = writable(); +export const pin = persistSession('pin', undefined, 5 * 60 * 1000); diff --git a/src/lib/ticket.js b/src/lib/ticket.js new file mode 100644 index 00000000..708c10f4 --- /dev/null +++ b/src/lib/ticket.js @@ -0,0 +1,31 @@ +import { auth, get, post } from '$lib/utils'; +import { env } from '$env/dynamic/private'; +import tickets from '$lib/tickets'; + +export const createTicket = async (cookies, username) => { + let { ticket } = await get('/ticket'); + + let { address } = await post( + '/invoice', + { invoice: { network: 'liquid' }, user: { username } }, + auth(cookies) + ); + + let { asset } = await post( + '/assets', + { + address, + name: `Launch Party Ticket ${ticket}`, + ticker: 'LPT', + precision: 0, + asset_amount: '1', + token_amount: 0, + domain: 'coinos.io', + filename: tickets[ticket] + }, + { authorization: `Bearer ${env.LAUNCH}` } + ); + + await post('/ticket', { asset }, { authorization: `Bearer ${env.LAUNCH}` }); + return asset; +}; diff --git a/src/lib/tickets.js b/src/lib/tickets.js new file mode 100644 index 00000000..b0ca0ac0 --- /dev/null +++ b/src/lib/tickets.js @@ -0,0 +1,52 @@ +export default [ + 'QmPbFkiXNuaQyfwD4W9GcXP7qWaNd6wFd9KCnJir5mes1J', + 'QmPVjvbaMxSJRpDxMLYTdUWQbknej1vYLckBQ2pAgxZgJN', + 'QmVasycSFzCYhyXrcvTE7mN3d6W78RFnrhzg5cRF6Dp6Zq', + 'QmTmnhjpTBjZdeHwXgT9Dftc3uWMW73qsZpZ5ECrTyiKKZ', + 'QmWDBiyVPyFkzUrEdvy7DSJe1rBQpene1m6quKAtyjBP6a', + 'QmcxxzQZwgG7SE9QbHNvoTiCi6Dhs9rrz9roqvxm2JQA88', + 'Qmd9ThEpXLLHimEzRUWEFrAGLSw5PAHzn2SmwfCnjNLwWt', + 'Qmc7pWw1yxc2ARBWitDMYiyPkWK61NsXXU8oYAQwNAvcx1', + 'QmX9Hgw1rMFUgBBuq8QfZZDzLjN5xCED19fwFdDeDDqwmr', + 'QmconCAyNyaagqKvvfKCbG7Eu8c6vCtkv2ivvxMoFN9YwA', + 'QmWbFmvViy5gx4JdD5sw5YJETet4ZQcXtYgijYnrsnSZ3a', + 'QmP6QiiJwoqkduZMqdd5e5htHZ4aYHCsvEu7WEEUknKYa5', + 'QmefHk8hvBUHsuKugntok5u75Q8i886cnPwsj4LZZB6uWg', + 'QmdrSDK5ByYHxc88hfDu8hQgK5XYFpXSfPorUXdyTbE437', + 'QmZ6ZycjRzYpsjnLm1Lfgk1fXXDdhcYRkyfmqYJZVGwADy', + 'QmSkBxS5yLPjB2VPs89oQRZANsoyodK6s8s52E8GKXr2zt', + 'QmSn8TCPwq3UZ1Z4eyko76CvQo2H2Hyef1NGboDQN22m5i', + 'QmP6CTH5zrKMzZwtjy7VaK9NXiq4Gw53kmuRjUbJjeovoe', + 'QmdwT4yvz9Xf8g3t6irKRoh3Wa7MwRQrcUJckQxyQe1Bc5', + 'QmcwuHH3bD5JExqjDvKqRQ3V5xEVGqs94qPNVDzaCqJa5a', + 'QmRfVduHwn8sXwSoyfgZpxSi8L7EjP4LMp6fmijo9VApDp', + 'Qmc4TGj1Ahbg9HJ9WDXDm2bXsNkT4zRDp8Wdw9wqqdEwuH', + 'QmY8uQiHMWA8ztf2wAurNFW7eiTHQEUiLTQ2vGceMwVqz3', + 'QmXiXbaD12F4mkbUSQcKhWshkPU4oi29cUawZGnPk86VVU', + 'QmZaiAGjvBZBw4suz33s9JQNzY2Kshean2mQQPCa6gKMQe', + 'Qme8bDSdzX7tanPYf672xXW8vPdkLkeSLqLzHJqidRXsYJ', + 'QmRJirjuUKgh2AMyBF4jNquaXHFPBtDJf3gKFC614hX7qu', + 'QmdRoSKSgabcrpekNBPB6T47RBtJnCETYE8ry2a3P37MUe', + 'QmXoqArruHSghrUGW35vVQHPknBG5Cj939iWWHHXU3B616', + 'QmYCxtDuoHLMAFhNpifUsLU9ptAeFKwyxSiSEJhDQLMZtN', + 'QmQZQBw8wgzUsrmVDEejdePK23AEJbk9aUracvxLPyHz2x', + 'QmSsbu7U3i62AQKuYqfisRo5E6nqdMZfHRKWYJgouaXDxD', + 'QmaP4adVQuWyqtN4QCXeYXj4nr19Je4EqsaTG1zM9ywqFS', + 'QmPPsvgfXsiN3wNqdAwHAhQVpw6SZWNpry9Na6R2Xb7zXY', + 'QmR7z6wQmcfZUvRsVK83GRRboyvwZEDQujLwumMY33nAit', + 'QmQXgkgorDLPUyQpFbW8aLUW6jioQjUKamtXw5UuNCttDg', + 'QmcwYBeXt1BPfdSrtSrXFpWctRZ7RDHvmKTttC5hPPTSzG', + 'QmTUexZnw3xPy3YVdUsqJALwTvy2qFax5b3QpJVMvTCJQb', + 'QmNLkYXFUvctpfeeDTZxruZE2f834EUnYMM6JJUeTcUB4J', + 'QmT7544UaTPgKFYMCpPE4unXphNGX71BLZBPKLkxAijSmj', + 'QmTpVR4dqX1QV4fae5pZ1ACtRcANHwEWCLwpMXFmwE95Sm', + 'Qmdfyps5fW8d8wstXMfpvpei2DTmaADBWgmxLT7e7uan4P', + 'QmUSK8byipYoG3H97QpmPrHw9vYrvHygyhkiM81XmaKyxS', + 'QmQUGRvp96LTw5i8Ly9f5LoMvUpeQHCLGNqC88KV74wEHK', + 'Qma693TFLh9Z1MeBFzhPHi6Yk4tmTcZY2jogwJ8cPkU2B4', + 'QmNu8FyMpmkFdbCXGRVG8mKJtMvvCoLP8LNzFsxBQwxQeS', + 'QmWZHE87PKujL1MGLuFgP3D12o5GQxYbvbeTRgr12f1XMu', + 'QmcZJn8gPGd3poS9yuiNJh6iP4cn9uy5fnypky71r4sSSw', + 'QmTwrAF4E9ucpdnrUZFj6EfrQamGv7Qyn7ceSx1DUQYceC', + 'QmexssxU5iTXypgNqrmrQwMDJnTNxyZUxor5wDLnwb5TZp' +]; diff --git a/src/lib/utils.js b/src/lib/utils.js index 54e965d9..7eeab648 100644 --- a/src/lib/utils.js +++ b/src/lib/utils.js @@ -9,6 +9,17 @@ export function scroll(section) { const base = browser ? '' : env.PUBLIC_COINOS_URL; +export const g = (url, fetch, headers) => + fetch(base + url, { headers }) + .then((r) => r.text()) + .then((body) => { + try { + return JSON.parse(body); + } catch (e) { + throw new Error(body); + } + }); + export const get = (url, headers = {}) => fetch(base + url, { headers }) .then((r) => r.text()) @@ -31,6 +42,8 @@ export const post = (url, body, headers) => { throw new Error(body); } + + if (body.error) throw body.error; if (body instanceof Error) throw body; if (body.name === 'Error') throw new Error(body.message); @@ -97,7 +110,17 @@ export const info = (m) => { export const login = async (user, cookies) => { let maxAge = 30 * 24 * 60 * 60; - let { token } = await post('/login', user); + let res = await fetch(base + '/login', { + method: 'POST', + body: JSON.stringify(user), + headers: { 'content-type': 'application/json', accept: 'application/json' } + }); + if (res.status === 401) { + let text = await res.text(); + if (text.startsWith('2fa')) throw new Error('2fa'); + } + + let { token } = await res.json(); if (!token) throw new Error('Login failed'); let expires = new Date(); |
