aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib
diff options
context:
space:
mode:
authorsecondl1ght <[email protected]>2022-10-25 18:01:56 -0600
committersecondl1ght <[email protected]>2022-10-25 18:01:56 -0600
commita67b375473f1f40e1c0febfac16d7e36e0d72561 (patch)
tree10a5fa750f2ccb53cff3510ab8fbbce108a35eb6 /src/lib
parentaa6debcd83c0b4067e0f8ce9a11d9c9ac02476ad (diff)
parent5a5ea3ccc327ff52fb1c313998d90e4bfefea90a (diff)
downloadcoinos-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.js9
-rw-r--r--src/lib/store.js14
-rw-r--r--src/lib/ticket.js31
-rw-r--r--src/lib/tickets.js52
-rw-r--r--src/lib/utils.js25
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();