From bd4d80f5b1a2c1c34be77ee680486ef504ed6ad5 Mon Sep 17 00:00:00 2001 From: Kirill Goncharov Date: Thu, 3 Sep 2020 18:21:59 +0300 Subject: [PATCH 01/14] Frontend: Fix font config --- vue-app/src/styles/_fonts.scss | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/vue-app/src/styles/_fonts.scss b/vue-app/src/styles/_fonts.scss index a92fc3c0b..7b9dc5488 100644 --- a/vue-app/src/styles/_fonts.scss +++ b/vue-app/src/styles/_fonts.scss @@ -2,7 +2,15 @@ @font-face { font-family: 'Glacial Indifference'; - src: url('assets/fonts/GlacialIndifference-Regular.otf') format('otf'); - font-weight: medium; font-style: normal; + font-weight: normal; + src: url('~@/assets/fonts/GlacialIndifference-Regular.otf') format('opentype'); } + +@font-face { + font-family: 'Glacial Indifference'; + font-style: normal; + font-weight: bold; + src: url('~@/assets/fonts/GlacialIndifference-Bold.otf') format('opentype'); +} + From 54d3667e4b830f8beb3e680d689d6916b998da05 Mon Sep 17 00:00:00 2001 From: Kirill Goncharov Date: Thu, 3 Sep 2020 18:23:05 +0300 Subject: [PATCH 02/14] Frontend: Switch router to hash mode The 'history' mode doesn't work well with relative urls. --- vue-app/src/router/index.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/vue-app/src/router/index.ts b/vue-app/src/router/index.ts index fe292a017..7cc7ff7ad 100644 --- a/vue-app/src/router/index.ts +++ b/vue-app/src/router/index.ts @@ -8,18 +8,17 @@ Vue.use(VueRouter) const routes = [ { path: '/', - name: 'Home', + name: 'home', component: Home, }, { path: '/about', - name: 'About', + name: 'about', component: About, }, ] const router = new VueRouter({ - mode: 'history', base: window.location.pathname, routes, }) From e72d7ed66f94acd0a60df210237276f122a8bc56 Mon Sep 17 00:00:00 2001 From: Kirill Goncharov Date: Thu, 3 Sep 2020 19:08:59 +0300 Subject: [PATCH 03/14] Frontend: Add project page --- vue-app/src/App.vue | 11 +++-- vue-app/src/api/projects.ts | 43 ++++++++++++------ vue-app/src/components/ProjectItem.vue | 7 ++- vue-app/src/router/index.ts | 6 +++ vue-app/src/views/About.vue | 11 ++++- vue-app/src/views/Home.vue | 7 +-- vue-app/src/views/Project.vue | 62 ++++++++++++++++++++++++++ 7 files changed, 123 insertions(+), 24 deletions(-) create mode 100644 vue-app/src/views/Project.vue diff --git a/vue-app/src/App.vue b/vue-app/src/App.vue index 01fc74d56..2345ca68f 100644 --- a/vue-app/src/App.vue +++ b/vue-app/src/App.vue @@ -45,6 +45,11 @@ html { color: $text-color; } +a { + color: $text-color; + text-decoration: none; +} + .btn { background-color: $button-color; border: none; @@ -130,13 +135,13 @@ html { flex-grow: 1; padding: $content-space; - h1 { - border-bottom: $border; + .content-heading { + display: block; font-family: 'Glacial Indifference', sans-serif; font-size: 14px; font-weight: normal; letter-spacing: 6px; - margin: 0 0 $content-space; + margin: 0; padding-bottom: $content-space; text-transform: uppercase; } diff --git a/vue-app/src/api/projects.ts b/vue-app/src/api/projects.ts index c3a6c783b..4baa468df 100644 --- a/vue-app/src/api/projects.ts +++ b/vue-app/src/api/projects.ts @@ -1,3 +1,6 @@ +import { Event } from 'ethers' +import { isAddress } from '@ethersproject/address' + import { factory, ipfsGatewayUrl } from './core' export interface Project { @@ -8,22 +11,36 @@ export interface Project { index: number; } +function decodeRecipientAdded(event: Event): Project { + const args = event.args as any // eslint-disable-line @typescript-eslint/no-explicit-any + const metadata = JSON.parse(args._metadata) + return { + address: args._fundingAddress, + name: metadata.name, + description: metadata.description, + imageUrl: `${ipfsGatewayUrl}${metadata.imageHash}`, + index: args._index.toNumber(), + } +} + export async function getProjects(): Promise { const recipientFilter = factory.filters.RecipientAdded() const events = await factory.queryFilter(recipientFilter, 0) const projects: Project[] = [] - events.forEach(event => { - if (!event.args) { - return - } - const metadata = JSON.parse(event.args._metadata) - projects.push({ - address: event.args._fundingAddress, - name: metadata.name, - description: metadata.description, - imageUrl: `${ipfsGatewayUrl}${metadata.imageHash}`, - index: event.args._index.toNumber(), - }) - }) + for (const event of events) { + projects.push(decodeRecipientAdded(event)) + } return projects } + +export async function getProject(address: string): Promise { + if (!isAddress(address)) { + return null + } + const recipientFilter = factory.filters.RecipientAdded(address) + const events = await factory.queryFilter(recipientFilter, 0) + if (events.length === 1) { + return decodeRecipientAdded(events[0]) + } + return null +} diff --git a/vue-app/src/components/ProjectItem.vue b/vue-app/src/components/ProjectItem.vue index 976f7e4b8..ad50628bb 100644 --- a/vue-app/src/components/ProjectItem.vue +++ b/vue-app/src/components/ProjectItem.vue @@ -2,7 +2,12 @@
-
{{ project.name }}
+ + {{ project.name }} +
{{ project.description }}
{{ project.description }}
@@ -13,7 +20,9 @@ import Vue from 'vue' import Component from 'vue-class-component' +import { CART_MAX_SIZE } from '@/api/contributions' import { Project, getProject } from '@/api/projects' +import { ADD_CART_ITEM } from '@/store/mutation-types' @Component({ name: 'ProjectView', @@ -31,6 +40,14 @@ export default class ProjectView extends Vue { this.$router.push({ name: 'home' }) } } + + canContribute() { + return this.$store.state.cart.length < CART_MAX_SIZE + } + + contribute() { + this.$store.commit(ADD_CART_ITEM, { ...this.project, amount: 0 }) + } } @@ -52,6 +69,12 @@ export default class ProjectView extends Vue { font-weight: bold; font-size: 40px; letter-spacing: -0.015em; + margin: $content-space 0; +} + +.contribute-btn { + margin: 0 0 $content-space; + width: 300px; } .project-description { From 25362cca0f453043de1a96cc7f3194878d12a42a Mon Sep 17 00:00:00 2001 From: Kirill Goncharov Date: Fri, 4 Sep 2020 01:21:36 +0300 Subject: [PATCH 06/14] Frontend: Load round info on every page --- vue-app/src/App.vue | 13 ++++++++++- vue-app/src/components/Cart.vue | 3 +-- vue-app/src/components/ProjectListItem.vue | 2 +- vue-app/src/views/Home.vue | 27 ++++++++-------------- vue-app/src/views/Project.vue | 2 -- 5 files changed, 24 insertions(+), 23 deletions(-) diff --git a/vue-app/src/App.vue b/vue-app/src/App.vue index 2345ca68f..4e7968a33 100644 --- a/vue-app/src/App.vue +++ b/vue-app/src/App.vue @@ -18,15 +18,26 @@ diff --git a/vue-app/src/components/Cart.vue b/vue-app/src/components/Cart.vue index 0e763c6bb..232e49426 100644 --- a/vue-app/src/components/Cart.vue +++ b/vue-app/src/components/Cart.vue @@ -108,7 +108,7 @@ export default class Cart extends Vue { }, 0) } - async contribute() { + contribute() { this.$modal.show( ContributionModal, { }, @@ -122,7 +122,6 @@ export default class Cart extends Vue { } - From deb8c4129e904be7657aa3117b9b014efb3bd6e9 Mon Sep 17 00:00:00 2001 From: Kirill Goncharov Date: Fri, 4 Sep 2020 12:37:04 +0300 Subject: [PATCH 07/14] Frontend: Move loader styles to main stylesheet --- vue-app/src/App.vue | 32 ++++++++++++++++++-- vue-app/src/components/ContributionModal.vue | 32 +------------------- 2 files changed, 31 insertions(+), 33 deletions(-) diff --git a/vue-app/src/App.vue b/vue-app/src/App.vue index 4e7968a33..c822a2d79 100644 --- a/vue-app/src/App.vue +++ b/vue-app/src/App.vue @@ -54,6 +54,8 @@ body { html { background-color: $bg-primary-color; color: $text-color; + font-family: Inter, sans-serif; + font-size: 14px; } a { @@ -85,8 +87,6 @@ a { #app { display: flex; - font-family: Inter, sans-serif; - font-size: 14px; height: 100%; } @@ -166,4 +166,32 @@ a { min-width: 300px; width: 20%; } + +.loader { + display: block; + width: 40px; + height: 40px; + margin: 20px auto; +} + +.loader:after { + content: " "; + display: block; + width: 32px; + height: 32px; + margin: 4px; + border-radius: 50%; + border: 6px solid #fff; + border-color: #fff transparent #fff transparent; + animation: loader 1.2s linear infinite; +} + +@keyframes loader { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(360deg); + } +} diff --git a/vue-app/src/components/ContributionModal.vue b/vue-app/src/components/ContributionModal.vue index 717b47ace..99445f45d 100644 --- a/vue-app/src/components/ContributionModal.vue +++ b/vue-app/src/components/ContributionModal.vue @@ -154,40 +154,10 @@ export default class ContributionModal extends Vue { .modal-body { background-color: $bg-light-color; - font-family: Inter, sans-serif; - font-size: 14px; - padding: 10px 20px 20px; + padding: 20px; text-align: center; } -.loader { - display: block; - width: 40px; - height: 40px; - margin: 20px auto; -} - -.loader:after { - content: " "; - display: block; - width: 32px; - height: 32px; - margin: 4px; - border-radius: 50%; - border: 6px solid #fff; - border-color: #fff transparent #fff transparent; - animation: loader 1.2s linear infinite; -} - -@keyframes loader { - 0% { - transform: rotate(0deg); - } - 100% { - transform: rotate(360deg); - } -} - .hex { background-color: #666; font-family: monospace; From 86df727a1893ef3eff672d4b74501bd63bf58a3c Mon Sep 17 00:00:00 2001 From: Kirill Goncharov Date: Fri, 4 Sep 2020 13:48:08 +0300 Subject: [PATCH 08/14] Frontend: Allow to claim allocated funds --- vue-app/.eslintrc.js | 1 + vue-app/src/App.vue | 9 ++ vue-app/src/components/Cart.vue | 8 +- vue-app/src/components/ClaimModal.vue | 94 ++++++++++++++++++++ vue-app/src/components/ContributionModal.vue | 16 ++-- vue-app/src/utils/maci.ts | 36 +++++++- vue-app/src/views/Project.vue | 34 ++++++- 7 files changed, 180 insertions(+), 18 deletions(-) create mode 100644 vue-app/src/components/ClaimModal.vue diff --git a/vue-app/.eslintrc.js b/vue-app/.eslintrc.js index 2d306d5dd..930dd967d 100644 --- a/vue-app/.eslintrc.js +++ b/vue-app/.eslintrc.js @@ -28,6 +28,7 @@ module.exports = { 'error', 'never', ], + '@typescript-eslint/no-explicit-any': 'off', 'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off', 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off', }, diff --git a/vue-app/src/App.vue b/vue-app/src/App.vue index c822a2d79..560d94a16 100644 --- a/vue-app/src/App.vue +++ b/vue-app/src/App.vue @@ -63,6 +63,15 @@ a { text-decoration: none; } +.input { + background-color: $bg-light-color; + border: 2px solid $button-color; + border-radius: 2px; + box-sizing: border-box; + color: $text-color; + padding: 7px; +} + .btn { background-color: $button-color; border: none; diff --git a/vue-app/src/components/Cart.vue b/vue-app/src/components/Cart.vue index 232e49426..631f3cac6 100644 --- a/vue-app/src/components/Cart.vue +++ b/vue-app/src/components/Cart.vue @@ -9,7 +9,7 @@ @@ -173,13 +173,7 @@ $project-image-size: 50px; padding-left: $project-image-size + 15px; .contribution-amount { - background-color: $bg-light-color; - border: 2px solid $button-color; - border-radius: 2px; - box-sizing: border-box; - color: white; font-size: 12px; - padding: 7px; width: 60%; } diff --git a/vue-app/src/components/ClaimModal.vue b/vue-app/src/components/ClaimModal.vue new file mode 100644 index 000000000..127bcec9f --- /dev/null +++ b/vue-app/src/components/ClaimModal.vue @@ -0,0 +1,94 @@ + + + + + diff --git a/vue-app/src/components/ContributionModal.vue b/vue-app/src/components/ContributionModal.vue index 99445f45d..8fbc7c00b 100644 --- a/vue-app/src/components/ContributionModal.vue +++ b/vue-app/src/components/ContributionModal.vue @@ -1,20 +1,20 @@