diff options
| author | Adam Soltys <[email protected]> | 2022-10-13 23:32:21 -0700 |
|---|---|---|
| committer | Adam Soltys <[email protected]> | 2022-10-13 23:33:36 -0700 |
| commit | 87fc33dfa162554b540dfb640ba1c1f66f9132d2 (patch) | |
| tree | df2174a4e119113d57b04447c4f05ce8b7a64a01 | |
| parent | 775cfb5859d676af0c0cae8e144b6dfb06ba1caf (diff) | |
| download | coinos-ui-87fc33dfa162554b540dfb640ba1c1f66f9132d2.tar.gz coinos-ui-87fc33dfa162554b540dfb640ba1c1f66f9132d2.zip | |
card payments
| -rw-r--r-- | package.json | 1 | ||||
| -rw-r--r-- | pnpm-lock.yaml | 131 | ||||
| -rw-r--r-- | src/routes/+layout.server.js | 1 | ||||
| -rw-r--r-- | src/routes/[username]/+page.server.js | 1 | ||||
| -rw-r--r-- | src/routes/launch/+page.svelte | 1 | ||||
| -rw-r--r-- | src/routes/pay/+page.server.js | 37 | ||||
| -rw-r--r-- | src/routes/pay/+page.svelte | 102 | ||||
| -rw-r--r-- | src/routes/user/+server.js | 1 |
8 files changed, 223 insertions, 52 deletions
diff --git a/package.json b/package.json index 808e5761..783edda5 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,6 @@ "bip21": "^2.0.3", "bitcoin-address-validation": "^2.2.1", "bolt11": "^1.4.0", - "cookie": "^0.5.0", "date-fns": "^2.29.3", "leaflet": "^1.9.1", "leaflet.markercluster": "^1.5.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 644cca0e..7e9ce090 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,6 +1,7 @@ lockfileVersion: 5.4 specifiers: + '@stripe/stripe-js': ^1.41.0 '@sveltejs/adapter-node': next '@sveltejs/kit': 1.0.0-next.505 '@zerodevx/svelte-toast': ^0.7.2 @@ -18,16 +19,19 @@ specifiers: qr-code-styling: 1.6.0-rc.1 qr-scanner: ^1.4.1 screenfull: ^6.0.2 + stripe: ^10.14.0 svelte: ^3.50.1 svelte-outclick: ^3.1.0 svelte-pincode: ^2.1.2 svelte-preprocess: ^4.10.7 + svelte-stripe: ^0.0.19 sveltekit-i18n: ^2.2.2 tailwindcss: ^3.1.8 vite: ^3.1.4 devDependencies: - '@sveltejs/adapter-node': 1.0.0-next.96 + '@stripe/stripe-js': 1.41.0 + '@sveltejs/adapter-node': 1.0.0-next.98 '@sveltejs/kit': [email protected][email protected] '@zerodevx/svelte-toast': 0.7.2 autoprefixer: [email protected] @@ -44,10 +48,12 @@ devDependencies: qr-code-styling: 1.6.0-rc.1 qr-scanner: 1.4.1 screenfull: 6.0.2 + stripe: 10.14.0 svelte: 3.50.1 svelte-outclick: 3.1.0 svelte-pincode: 2.1.2 svelte-preprocess: 4.10.7_r763xggw3my2ousygwguxmp6ru + svelte-stripe: 0.0.19 sveltekit-i18n: [email protected] tailwindcss: [email protected] vite: 3.1.4 @@ -97,39 +103,48 @@ packages: resolution: {integrity: sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==} dev: true - /@rollup/plugin-commonjs/[email protected]: - resolution: {integrity: sha512-//NdP6iIwPbMTcazYsiBMbJW7gfmpHom33u1beiIoHDEM0Q9clvtQB1T0efvMqHeKsGohiHo97BCPCkBXdscwg==} - engines: {node: '>= 12.0.0'} + /@rollup/plugin-commonjs/[email protected]: + resolution: {integrity: sha512-JbrTRyDNtLQj/rhl7RFUuYXwQ2fac+33oLDAu2k++WD95zweyo28UAomLVA0JMGx4vmCa7Nw4T6k/1F6lelExg==} + engines: {node: '>=14.0.0'} peerDependencies: - rollup: ^2.68.0 + rollup: ^2.68.0||^3.0.0 + peerDependenciesMeta: + rollup: + optional: true dependencies: - '@rollup/pluginutils': [email protected] + '@rollup/pluginutils': 4.2.1 commondir: 1.0.1 estree-walker: 2.0.2 - glob: 7.2.3 + glob: 8.0.3 is-reference: 1.2.1 - magic-string: 0.25.9 - resolve: 1.22.1 + magic-string: 0.26.5 rollup: 2.79.1 dev: true - /@rollup/plugin-json/[email protected]: - resolution: {integrity: sha512-yfLbTdNS6amI/2OpmbiBoW12vngr5NW2jCJVZSBEz+H5KfUJZ2M7sDjk0U6GOOdCWFVScShte29o9NezJ53TPw==} + /@rollup/plugin-json/[email protected]: + resolution: {integrity: sha512-LsWDA5wJs/ggzakVuKQhZo7HPRcQZgBa3jWIVxQSFxaRToUGNi8ZBh3+k/gQ+1eInVYJgn4WBRCUkmoDrmmGzw==} + engines: {node: '>=14.0.0'} peerDependencies: - rollup: ^1.20.0 || ^2.0.0 + rollup: ^1.20.0||^2.0.0||^3.0.0 + peerDependenciesMeta: + rollup: + optional: true dependencies: - '@rollup/pluginutils': [email protected] + '@rollup/pluginutils': 4.2.1 rollup: 2.79.1 dev: true - /@rollup/plugin-node-resolve/[email protected]: - resolution: {integrity: sha512-5G2niJroNCz/1zqwXtk0t9+twOSDlG00k1Wfd7bkbbXmwg8H8dvgHdIWAun53Ps/rckfvOC7scDBjuGFg5OaWw==} - engines: {node: '>= 10.0.0'} + /@rollup/plugin-node-resolve/[email protected]: + resolution: {integrity: sha512-iwJbzfTzlzDDQcGmkS7EkCKwe2kSkdBrjX87Fy/KrNjr6UNnLpod0t6X66e502LRe5JJCA4FFqrEscWPnZAkig==} + engines: {node: '>=14.0.0'} peerDependencies: - rollup: ^2.78.0 + rollup: ^2.78.0||^3.0.0 + peerDependenciesMeta: + rollup: + optional: true dependencies: - '@rollup/pluginutils': [email protected] - '@types/resolve': 1.17.1 + '@rollup/pluginutils': 4.2.1 + '@types/resolve': 1.20.2 deepmerge: 4.2.2 is-builtin-module: 3.2.0 is-module: 1.0.0 @@ -137,18 +152,6 @@ packages: rollup: 2.79.1 dev: true - /@rollup/pluginutils/[email protected]: - resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==} - engines: {node: '>= 8.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0 - dependencies: - '@types/estree': 0.0.39 - estree-walker: 1.0.1 - picomatch: 2.3.1 - rollup: 2.79.1 - dev: true - /@rollup/pluginutils/4.2.1: resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} engines: {node: '>= 8.0.0'} @@ -157,12 +160,16 @@ packages: picomatch: 2.3.1 dev: true - /@sveltejs/adapter-node/1.0.0-next.96: - resolution: {integrity: sha512-tIHaRolUYy2PiHl4RUWaOsYxEjK5lN9501qzCzFbYr/uoLnZcnPGSXNJICwX0AX9AUkV6cvkZey6bLbUQcwH0Q==} + /@stripe/stripe-js/1.41.0: + resolution: {integrity: sha512-9cbv1CO/fF37qDiHFCxkRgSJjlIZLV0bl+m6zu4dUObRnfYq5bpczCByOvhiSWtbrKqNhYL1j+otPSogRfSqGw==} + dev: true + + /@sveltejs/adapter-node/1.0.0-next.98: + resolution: {integrity: sha512-eo89sswzm3ntZJgaQzz2MneqMqBfQWQj6b8VtImlHeq2AB+RSodippmKY0RyPcIJ0hJqdDc4DubU7XMDKkoTew==} dependencies: - '@rollup/plugin-commonjs': [email protected] - '@rollup/plugin-json': [email protected] - '@rollup/plugin-node-resolve': [email protected] + '@rollup/plugin-commonjs': [email protected] + '@rollup/plugin-json': [email protected] + '@rollup/plugin-node-resolve': [email protected] rollup: 2.79.1 dev: true @@ -242,10 +249,6 @@ packages: resolution: {integrity: sha512-COUnqfB2+ckwXXSFInsFdOAWQzCCx+a5hq2ruyj+Vjund94RJQd4LG2u9hnvJrTgunKAaax7ancBYlDrNYxA0g==} dev: true - /@types/estree/0.0.39: - resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} - dev: true - /@types/estree/1.0.0: resolution: {integrity: sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==} dev: true @@ -262,10 +265,8 @@ packages: resolution: {integrity: sha512-SnHmG9wN1UVmagJOnyo/qkk0Z7gejYxOYYmaAwr5u2yFYfsupN3sg10kyzN8Hep/2zbHxCnsumxOoRIRMBwKCg==} dev: true - /@types/resolve/1.17.1: - resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} - dependencies: - '@types/node': 18.8.0 + /@types/resolve/1.20.2: + resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} dev: true /@types/sass/1.43.1: @@ -410,6 +411,12 @@ packages: concat-map: 0.0.1 dev: true + /brace-expansion/2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + dependencies: + balanced-match: 1.0.2 + dev: true + /braces/3.0.2: resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} engines: {node: '>=8'} @@ -826,10 +833,6 @@ packages: engines: {node: '>=6'} dev: true - /estree-walker/1.0.1: - resolution: {integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==} - dev: true - /estree-walker/2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} dev: true @@ -926,6 +929,17 @@ packages: path-is-absolute: 1.0.1 dev: true + /glob/8.0.3: + resolution: {integrity: sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==} + engines: {node: '>=12'} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 5.1.0 + once: 1.4.0 + dev: true + /globalyzer/0.1.0: resolution: {integrity: sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==} dev: true @@ -1117,6 +1131,13 @@ packages: brace-expansion: 1.1.11 dev: true + /minimatch/5.1.0: + resolution: {integrity: sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==} + engines: {node: '>=10'} + dependencies: + brace-expansion: 2.0.1 + dev: true + /minimist/1.2.6: resolution: {integrity: sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==} dev: true @@ -1518,6 +1539,14 @@ packages: min-indent: 1.0.1 dev: true + /stripe/10.14.0: + resolution: {integrity: sha512-cXqUdZvrU20KElhLjzw/kW5t2SLLUENqeEftaiQXLogkUdNHyz/L12S4WHmQ8h0KHHFhxO39I7Q9GkJO1MMzzw==} + engines: {node: ^8.1 || >=10.*} + dependencies: + '@types/node': 18.8.0 + qs: 6.11.0 + dev: true + /supports-preserve-symlinks-flag/1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} @@ -1591,6 +1620,12 @@ packages: svelte: 3.50.1 dev: true + /svelte-stripe/0.0.19: + resolution: {integrity: sha512-Q0C/MxthhSV7TFdBTz3qsYxvbYVFsoeP42mMVrYUpizhASR7HwmF+N1YBNOCWM8Ttk/RAegY/4AqJVNHb4fDkQ==} + dependencies: + '@stripe/stripe-js': 1.41.0 + dev: true + /svelte/3.50.1: resolution: {integrity: sha512-bS4odcsdj5D5jEg6riZuMg5NKelzPtmsCbD9RG+8umU03TeNkdWnP6pqbCm0s8UQNBkqk29w/Bdubn3C+HWSwA==} engines: {node: '>= 8'} diff --git a/src/routes/+layout.server.js b/src/routes/+layout.server.js index 84e5ce5c..7f6e8801 100644 --- a/src/routes/+layout.server.js +++ b/src/routes/+layout.server.js @@ -1,5 +1,4 @@ import { error, redirect } from '@sveltejs/kit'; -import cookie from 'cookie'; import { protectedRoutes } from '$lib/utils'; import { get, post, auth } from '$lib/utils'; import { env } from '$env/dynamic/public'; diff --git a/src/routes/[username]/+page.server.js b/src/routes/[username]/+page.server.js index d6f2978c..0840161a 100644 --- a/src/routes/[username]/+page.server.js +++ b/src/routes/[username]/+page.server.js @@ -1,4 +1,3 @@ -import cookie from 'cookie'; import { get, post } from '$lib/utils'; export async function load({ params }) { diff --git a/src/routes/launch/+page.svelte b/src/routes/launch/+page.svelte index 6bd7067e..5e519eff 100644 --- a/src/routes/launch/+page.svelte +++ b/src/routes/launch/+page.svelte @@ -28,6 +28,7 @@ <h1 class="mb-4 text-4xl font-bold leading-none tracking-tight text-gray-800"> Coinos Launch Party! </h1> + <p class="leading-normal mb-2"> Come join us at our launch party celebrating 10 years in business! </p> diff --git a/src/routes/pay/+page.server.js b/src/routes/pay/+page.server.js new file mode 100644 index 00000000..1393eecc --- /dev/null +++ b/src/routes/pay/+page.server.js @@ -0,0 +1,37 @@ +let stripe = 'https://api.stripe.com/v1'; + +export const actions = { + default: async ({ request }) => { + let form = await request.formData(); + + let headers = new Headers(); + headers.set( + 'Authorization', + 'Basic ' + new Buffer('sk_test_mBv5bAeAhiYSDYFZJNsDwjht:').toString('base64') + ); + + let body = new URLSearchParams({ + 'card[number]': form.get('number'), + 'card[exp_month]': form.get('expiry').slice(0, 2), + 'card[exp_year]': form.get('expiry').slice(-2), + 'card[cvc]': form.get('cvc') + }); + + let method = 'POST'; + + let { id: source } = await fetch(`${stripe}/tokens`, { body, headers, method }).then((r) => + r.json() + ); + + body = new URLSearchParams({ + amount: 600, + currency: 'cad', + source, + description: 'launch ticket' + }); + + let r = await fetch(`${stripe}/charges`, { body, headers, method }).then((r) => r.json()); + + console.log(r); + } +}; diff --git a/src/routes/pay/+page.svelte b/src/routes/pay/+page.svelte new file mode 100644 index 00000000..3b428511 --- /dev/null +++ b/src/routes/pay/+page.svelte @@ -0,0 +1,102 @@ +<script> + let number; +</script> + +<form method="POST" class="flex flex-wrap gap-3 w-full p-5"> + <label class="relative w-full flex flex-col"> + <span class="font-bold mb-3">Card number</span> + <input + class="rounded-md peer pl-12 pr-2 py-2 border-2 border-gray-200 placeholder-gray-300" + type="text" + name="number" + placeholder="0000 0000 0000" + /> + <svg + xmlns="http://www.w3.org/2000/svg" + class="absolute bottom-0 left-0 -mb-0.5 transform translate-x-1/2 -translate-y-1/2 text-black peer-placeholder-shown:text-gray-300 h-6 w-6" + fill="none" + viewBox="0 0 24 24" + stroke="currentColor" + > + <path + stroke-linecap="round" + stroke-linejoin="round" + stroke-width="2" + d="M3 10h18M7 15h1m4 0h1m-7 4h12a3 3 0 003-3V8a3 3 0 00-3-3H6a3 3 0 00-3 3v8a3 3 0 003 3z" + /> + </svg> + </label> + + <label class="relative flex-1 flex flex-col"> + <span class="font-bold mb-3">Expire date</span> + <input + class="rounded-md peer pl-12 pr-2 py-2 border-2 border-gray-200 placeholder-gray-300" + type="text" + name="expiry" + placeholder="MM/YY" + /> + <svg + xmlns="http://www.w3.org/2000/svg" + class="absolute bottom-0 left-0 -mb-0.5 transform translate-x-1/2 -translate-y-1/2 text-black peer-placeholder-shown:text-gray-300 h-6 w-6" + fill="none" + viewBox="0 0 24 24" + stroke="currentColor" + > + <path + stroke-linecap="round" + stroke-linejoin="round" + stroke-width="2" + d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z" + /> + </svg> + </label> + + <label class="relative flex-1 flex flex-col"> + <span class="font-bold flex items-center gap-3 mb-3"> + CVC/CVV + <span class="relative group"> + <span + class="hidden group-hover:flex justify-center items-center px-2 py-1 text-xs absolute -right-2 transform translate-x-full -translate-y-1/2 w-max top-1/2 bg-black text-white" + > + 3-digit number on the back of your card</span + > + <svg + xmlns="http://www.w3.org/2000/svg" + class="h-4 w-4" + fill="none" + viewBox="0 0 24 24" + stroke="currentColor" + > + <path + stroke-linecap="round" + stroke-linejoin="round" + stroke-width="2" + d="M8.228 9c.549-1.165 2.03-2 3.772-2 2.21 0 4 1.343 4 3 0 1.4-1.278 2.575-3.006 2.907-.542.104-.994.54-.994 1.093m0 3h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z" + /> + </svg> + </span> + </span> + <input + class="rounded-md peer pl-12 pr-2 py-2 border-2 border-gray-200 placeholder-gray-300" + type="text" + name="cvc" + placeholder="•••" + /> + <svg + xmlns="http://www.w3.org/2000/svg" + class="absolute bottom-0 left-0 -mb-0.5 transform translate-x-1/2 -translate-y-1/2 text-black peer-placeholder-shown:text-gray-300 h-6 w-6" + fill="none" + viewBox="0 0 24 24" + stroke="currentColor" + > + <path + stroke-linecap="round" + stroke-linejoin="round" + stroke-width="2" + d="M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z" + /> + </svg> + </label> + + <button type="submit">Submit</button> +</form> diff --git a/src/routes/user/+server.js b/src/routes/user/+server.js index c9490984..b9c37e6e 100644 --- a/src/routes/user/+server.js +++ b/src/routes/user/+server.js @@ -1,5 +1,4 @@ import { auth, post } from '$lib/utils'; -import cookie from 'cookie'; export async function PUT({ cookies, request }) { let user = await request.json(); |
