From abbc34d0846f2be8cab76a0736d6b4c141d7be8e Mon Sep 17 00:00:00 2001 From: Christian Bedon Date: Fri, 27 Sep 2024 11:49:04 -0500 Subject: [PATCH 01/10] feat: my kiva carousel component for borrower status card --- .../stories/BorrowerStatusCarousel.stories.js | 39 ++++ src/components/MyKiva/BorrowerCarousel.vue | 167 ++++++++++++++++++ src/graphql/query/myKiva.graphql | 39 ++++ 3 files changed, 245 insertions(+) create mode 100644 .storybook/stories/BorrowerStatusCarousel.stories.js create mode 100644 src/components/MyKiva/BorrowerCarousel.vue diff --git a/.storybook/stories/BorrowerStatusCarousel.stories.js b/.storybook/stories/BorrowerStatusCarousel.stories.js new file mode 100644 index 0000000000..0d41c4dbcd --- /dev/null +++ b/.storybook/stories/BorrowerStatusCarousel.stories.js @@ -0,0 +1,39 @@ +import BorrowerCarousel from '#src/components/MyKiva/BorrowerCarousel.vue'; +import { mockLoansArray } from '../utils'; +import apolloStoryMixin from "../mixins/apollo-story-mixin"; +import cookieStoreStoryMixin from '../mixins/cookie-store-story-mixin'; + +export default { + title: 'MyKiva/BorrowerCarousel', + component: BorrowerCarousel, +}; + +const mockLoans = mockLoansArray(3); + +const queryResult = { + data: { + lend: { + loan: mockLoans[0] + } + } +}; + +const story = (args = {}) => { + const template = (_args, { argTypes }) => ({ + props: Object.keys(argTypes), + components: { BorrowerCarousel }, + mixins: [apolloStoryMixin({ queryResult }), cookieStoreStoryMixin()], + setup() { return { args }; }, + template: ` + + `, + }); + template.args = args; + return template; +}; + +export const Default = story({ loans: [mockLoans[0], mockLoans[1], mockLoans[2]] }); +export const OneLoan = story({ loans: [mockLoans[0]] }); +export const MoreThanLimit = story({ loans: [...mockLoans, mockLoans[0]] }); +export const NoActiveLoans = story({ loans: [mockLoans[0], mockLoans[1], mockLoans[2]], hasActiveLoans: false }); +export const Empty = story({ loans: [] }); diff --git a/src/components/MyKiva/BorrowerCarousel.vue b/src/components/MyKiva/BorrowerCarousel.vue new file mode 100644 index 0000000000..482583299a --- /dev/null +++ b/src/components/MyKiva/BorrowerCarousel.vue @@ -0,0 +1,167 @@ + + + + + diff --git a/src/graphql/query/myKiva.graphql b/src/graphql/query/myKiva.graphql index a922a4d4b1..0efc1f9286 100644 --- a/src/graphql/query/myKiva.graphql +++ b/src/graphql/query/myKiva.graphql @@ -1,6 +1,45 @@ query ftdQuery { my { id + loans(limit: 10) { + values { + id + name + gender + image { + id + url + hash + } + geocode { + city + state + country { + name + isoCode + region + } + } + plannedExpirationDate + terms { + currency + currencyFullName + lossLiabilityNonpayment + lossLiabilityCurrencyExchange + loanAmount + disbursalDate + disbursalAmount + flexibleFundraisingEnabled + lenderRepaymentTerm + expectedPayments { + amount + localAmount + dueToKivaDate + effectiveDate + } + } + } + } lender { id name From 894d4c557bfcbf3c09c404822f60228ce748fb86 Mon Sep 17 00:00:00 2001 From: Christian Bedon Date: Fri, 27 Sep 2024 14:46:37 -0500 Subject: [PATCH 02/10] feat: get active loans --- src/components/MyKiva/BorrowerCarousel.vue | 2 +- src/graphql/query/myKiva.graphql | 1 + src/pages/Portfolio/MyKiva/MyKivaPage.vue | 7 +++++++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/components/MyKiva/BorrowerCarousel.vue b/src/components/MyKiva/BorrowerCarousel.vue index 482583299a..3300b7b2d1 100644 --- a/src/components/MyKiva/BorrowerCarousel.vue +++ b/src/components/MyKiva/BorrowerCarousel.vue @@ -33,7 +33,7 @@ - + View all diff --git a/src/graphql/query/myKiva.graphql b/src/graphql/query/myKiva.graphql index 0efc1f9286..862b07abf1 100644 --- a/src/graphql/query/myKiva.graphql +++ b/src/graphql/query/myKiva.graphql @@ -6,6 +6,7 @@ query ftdQuery { id name gender + status image { id url diff --git a/src/pages/Portfolio/MyKiva/MyKivaPage.vue b/src/pages/Portfolio/MyKiva/MyKivaPage.vue index d77b517298..0d68fb9fa1 100644 --- a/src/pages/Portfolio/MyKiva/MyKivaPage.vue +++ b/src/pages/Portfolio/MyKiva/MyKivaPage.vue @@ -9,6 +9,7 @@ @show-navigation="handleShowNavigation" /> + @@ -19,6 +20,7 @@ import MyKivaNavigation from '#src/components/MyKiva/MyKivaNavigation'; import myKivaQuery from '#src/graphql/query/myKiva.graphql'; import MyKivaHero from '#src/components/MyKiva/MyKivaHero'; import MyKivaProfile from '#src/components/MyKiva/MyKivaProfile'; +import { isLoanFundraising } from '#src/util/loanUtils'; const MY_KIVA_EXP_KEY = 'my_kiva_page'; @@ -36,6 +38,7 @@ export default { lender: null, showNavigation: false, userInfo: {}, + loans: [], }; }, apollo: { @@ -44,6 +47,7 @@ export default { result(result) { this.userInfo = result.data?.my ?? {}; this.lender = result.data?.my?.lender ?? null; + this.loans = result.data?.my?.loans ?? []; }, }, computed: { @@ -56,6 +60,9 @@ export default { lenderImageUrl() { return this.lender?.image?.url ?? ''; }, + hasActiveLoans() { + return this.loans?.some(loan => loan.status === 'repaying' || isLoanFundraising(loan)); + } }, methods: { handleShowNavigation() { From d1f80c2d3f1822cc0a91a2b3f8c7986318cb9d3e Mon Sep 17 00:00:00 2001 From: Christian Bedon Date: Fri, 27 Sep 2024 15:22:43 -0500 Subject: [PATCH 03/10] fix: lint --- src/components/MyKiva/BorrowerCarousel.vue | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/components/MyKiva/BorrowerCarousel.vue b/src/components/MyKiva/BorrowerCarousel.vue index 3300b7b2d1..6aec880c28 100644 --- a/src/components/MyKiva/BorrowerCarousel.vue +++ b/src/components/MyKiva/BorrowerCarousel.vue @@ -158,10 +158,12 @@ const singleSlideWidth = computed(() => { max-width: 520px; } } + :deep(.borrower-carousel) div.kv-carousel__controls { @apply tw-hidden; } -:deep(.tabs) div[role="tablist"] { + +:deep(.tabs) div[role=tablist] { @apply md:tw-gap-3.5; } From 9971d6d0a1ee306777f27168104dc7f680fa0a1e Mon Sep 17 00:00:00 2001 From: Christian Bedon Date: Tue, 1 Oct 2024 15:46:56 -0500 Subject: [PATCH 04/10] fix: reactive loans --- src/components/MyKiva/BorrowerCarousel.vue | 29 ++++++++++++---------- src/graphql/query/myKiva.graphql | 8 +++++- src/pages/Portfolio/MyKiva/MyKivaPage.vue | 7 +++--- 3 files changed, 27 insertions(+), 17 deletions(-) diff --git a/src/components/MyKiva/BorrowerCarousel.vue b/src/components/MyKiva/BorrowerCarousel.vue index 6aec880c28..674364ebc4 100644 --- a/src/components/MyKiva/BorrowerCarousel.vue +++ b/src/components/MyKiva/BorrowerCarousel.vue @@ -10,7 +10,7 @@ -

+

{{ title }}

diff --git a/src/pages/Portfolio/MyKiva/MyKivaPage.vue b/src/pages/Portfolio/MyKiva/MyKivaPage.vue index 2b010ff645..c5a415718c 100644 --- a/src/pages/Portfolio/MyKiva/MyKivaPage.vue +++ b/src/pages/Portfolio/MyKiva/MyKivaPage.vue @@ -9,7 +9,7 @@ @show-navigation="handleShowNavigation" /> - + @@ -21,7 +21,6 @@ import myKivaQuery from '#src/graphql/query/myKiva.graphql'; import MyKivaHero from '#src/components/MyKiva/MyKivaHero'; import MyKivaProfile from '#src/components/MyKiva/MyKivaProfile'; import MyKivaBorrowerCarousel from '#src/components/MyKiva/BorrowerCarousel'; -import { isLoanFundraising } from '#src/util/loanUtils'; import { ref, @@ -47,6 +46,10 @@ const handleShowNavigation = () => { $kvTrackEvent('SecondaryNav top level', 'click', 'MyKiva-Settings-icon'); }; +const handleSelectedLoan = () => { + // TODO: work with updates +}; + apollo.query({ query: myKivaQuery }) .then(result => { userInfo.value = result.data?.my ?? {}; @@ -54,10 +57,6 @@ apollo.query({ query: myKivaQuery }) loans.value = result.data?.my?.loans?.values ?? []; }); -const hasActiveLoans = computed(() => { - return loans.value.some(loan => loan?.status === 'repaying' || isLoanFundraising(loan)); -}); - onMounted(() => { trackExperimentVersion( apollo, From b730d3bcb1d3007513b67b37804dc756604c90d4 Mon Sep 17 00:00:00 2001 From: Christian Bedon Date: Wed, 2 Oct 2024 14:10:25 -0500 Subject: [PATCH 06/10] fix: definition of completed loans --- src/components/MyKiva/BorrowerCarousel.vue | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/components/MyKiva/BorrowerCarousel.vue b/src/components/MyKiva/BorrowerCarousel.vue index c6a0441b21..cd927267c4 100644 --- a/src/components/MyKiva/BorrowerCarousel.vue +++ b/src/components/MyKiva/BorrowerCarousel.vue @@ -102,7 +102,8 @@ import { } from 'vue'; import { PAYING_BACK, - REFUNDED, + ENDED, + DEFAULTED } from '#src/api/fixtures/LoanStatusEnum'; import BorrowerStatusCard from './BorrowerStatusCard'; @@ -190,7 +191,7 @@ const singleSlideWidth = computed(() => { }); const hasCompletedBorrowers = computed(() => { - return loans.value.some(loan => loan?.status === REFUNDED); + return loans.value.some(loan => loan?.status === ENDED || loan?.status === DEFAULTED); }); onMounted(() => { From c90519714c2684210a23251939ee4be77573b631 Mon Sep 17 00:00:00 2001 From: Christian Bedon Date: Thu, 3 Oct 2024 14:43:07 -0500 Subject: [PATCH 07/10] fix: style issues and loading placeholder --- src/components/MyKiva/BorrowerCarousel.vue | 44 +++++++++++++------- src/components/MyKiva/BorrowerStatusCard.vue | 12 +++--- src/pages/Portfolio/MyKiva/MyKivaPage.vue | 3 +- 3 files changed, 37 insertions(+), 22 deletions(-) diff --git a/src/components/MyKiva/BorrowerCarousel.vue b/src/components/MyKiva/BorrowerCarousel.vue index cd927267c4..9c175d73e7 100644 --- a/src/components/MyKiva/BorrowerCarousel.vue +++ b/src/components/MyKiva/BorrowerCarousel.vue @@ -1,19 +1,25 @@