feature update
--added lazy loading to transactions and notifications -- adding transaction details page
This commit is contained in:
parent
f0f475ba0e
commit
718950c1c4
@ -1630,7 +1630,6 @@ smCopy.innerHTML = `
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
</style>
|
|
||||||
<section class="copy">
|
<section class="copy">
|
||||||
<p class="copy-content"></p>
|
<p class="copy-content"></p>
|
||||||
<button part="button" class="copy-button" title="copy">
|
<button part="button" class="copy-button" title="copy">
|
||||||
|
|||||||
92
css/main.css
92
css/main.css
@ -29,6 +29,7 @@ body * {
|
|||||||
--foreground-color: rgb(250, 252, 255);
|
--foreground-color: rgb(250, 252, 255);
|
||||||
--danger-color: rgb(255, 75, 75);
|
--danger-color: rgb(255, 75, 75);
|
||||||
--green: #1cad59;
|
--green: #1cad59;
|
||||||
|
--yellow: #f3a600;
|
||||||
scrollbar-width: thin;
|
scrollbar-width: thin;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -42,6 +43,7 @@ body[data-theme=dark] * {
|
|||||||
--foreground-color: rgb(20, 20, 20);
|
--foreground-color: rgb(20, 20, 20);
|
||||||
--danger-color: rgb(255, 106, 106);
|
--danger-color: rgb(255, 106, 106);
|
||||||
--green: #00E676;
|
--green: #00E676;
|
||||||
|
--yellow: #ffd13a;
|
||||||
}
|
}
|
||||||
|
|
||||||
p {
|
p {
|
||||||
@ -522,6 +524,11 @@ details[open] > summary .icon {
|
|||||||
transition: -webkit-transform 0.3s;
|
transition: -webkit-transform 0.3s;
|
||||||
transition: transform 0.3s;
|
transition: transform 0.3s;
|
||||||
transition: transform 0.3s, -webkit-transform 0.3s;
|
transition: transform 0.3s, -webkit-transform 0.3s;
|
||||||
|
-webkit-user-select: none;
|
||||||
|
-moz-user-select: none;
|
||||||
|
-ms-user-select: none;
|
||||||
|
user-select: none;
|
||||||
|
-webkit-tap-highlight-color: transparent;
|
||||||
}
|
}
|
||||||
.nav-item--active .icon {
|
.nav-item--active .icon {
|
||||||
fill: var(--accent-color);
|
fill: var(--accent-color);
|
||||||
@ -592,19 +599,21 @@ details[open] > summary .icon {
|
|||||||
|
|
||||||
#recent_transactions_container {
|
#recent_transactions_container {
|
||||||
display: grid;
|
display: grid;
|
||||||
gap: 1rem;
|
|
||||||
margin: 1.5rem 0;
|
margin: 1.5rem 0;
|
||||||
|
padding-bottom: 5rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.activity-card {
|
.activity-card {
|
||||||
display: grid;
|
display: grid;
|
||||||
gap: 0.8rem;
|
padding: 1rem 0;
|
||||||
-webkit-box-align: center;
|
gap: 0.4rem 1rem;
|
||||||
-ms-flex-align: center;
|
border-radius: 0.5rem;
|
||||||
align-items: center;
|
-webkit-box-align: start;
|
||||||
grid-template-columns: auto minmax(0, 1fr) auto;
|
-ms-flex-align: start;
|
||||||
|
align-items: flex-start;
|
||||||
color: inherit;
|
color: inherit;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
|
grid-template-columns: auto minmax(0, 1fr) auto;
|
||||||
}
|
}
|
||||||
.activity-card__icon {
|
.activity-card__icon {
|
||||||
display: -webkit-box;
|
display: -webkit-box;
|
||||||
@ -635,32 +644,74 @@ details[open] > summary .icon {
|
|||||||
color: rgba(var(--text-color), 0.8);
|
color: rgba(var(--text-color), 0.8);
|
||||||
}
|
}
|
||||||
|
|
||||||
#all_responses_list {
|
#notifications,
|
||||||
padding: 1.5rem 1.5rem 5rem 1.5rem;
|
#transactions {
|
||||||
|
padding-bottom: 5rem;
|
||||||
|
}
|
||||||
|
#notifications .activity-card,
|
||||||
|
#transactions .activity-card {
|
||||||
|
padding: 1rem 1.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.activity-card--request {
|
||||||
|
grid-template-areas: "icon . amount" "icon time .";
|
||||||
|
}
|
||||||
|
.activity-card--request .activity-card__icon {
|
||||||
|
grid-area: icon;
|
||||||
|
}
|
||||||
|
.activity-card--request .activity-card__time {
|
||||||
|
grid-area: time;
|
||||||
|
}
|
||||||
|
.activity-card--request .activity-card__amount {
|
||||||
|
grid-area: amount;
|
||||||
|
text-align: end;
|
||||||
|
}
|
||||||
|
.activity-card--request .activity-card__status:not(:empty) {
|
||||||
|
text-transform: uppercase;
|
||||||
|
letter-spacing: 0.05em;
|
||||||
|
font-size: 0.7rem;
|
||||||
|
border-radius: 0.2rem;
|
||||||
|
padding: 0.3rem 0.4rem;
|
||||||
|
font-weight: 500;
|
||||||
|
color: rgba(0, 0, 0, 0.7);
|
||||||
|
}
|
||||||
|
.activity-card--request .activity-card__status:not(:empty).success {
|
||||||
|
color: var(--green);
|
||||||
|
background-color: rgba(0, 230, 118, 0.1);
|
||||||
|
}
|
||||||
|
.activity-card--request .activity-card__status:not(:empty).failed {
|
||||||
|
color: var(--danger-color);
|
||||||
|
background-color: rgba(255, 75, 75, 0.1);
|
||||||
|
}
|
||||||
|
.activity-card--request .activity-card__status:not(:empty).pending {
|
||||||
|
color: var(--yellow);
|
||||||
|
background-color: rgba(255, 252, 75, 0.1);
|
||||||
}
|
}
|
||||||
|
|
||||||
.activity-card--response {
|
.activity-card--response {
|
||||||
-webkit-box-align: start;
|
grid-template-areas: "icon . time" "icon description description";
|
||||||
-ms-flex-align: start;
|
|
||||||
align-items: flex-start;
|
|
||||||
gap: 0.2rem 0.8rem;
|
|
||||||
border-radius: 0.5rem;
|
|
||||||
grid-template-areas: "icon . time" "icon . time";
|
|
||||||
}
|
}
|
||||||
.activity-card--response .activity-card__icon {
|
.activity-card--response .activity-card__icon {
|
||||||
grid-area: icon;
|
grid-area: icon;
|
||||||
}
|
}
|
||||||
.activity-card--response .activity-card__description {
|
.activity-card--response .activity-card__description {
|
||||||
|
grid-area: description;
|
||||||
font-size: 0.8rem;
|
font-size: 0.8rem;
|
||||||
color: rgba(var(--text-color), 0.8);
|
color: rgba(var(--text-color), 0.8);
|
||||||
}
|
}
|
||||||
.activity-card--response .activity-card__time {
|
.activity-card--response .activity-card__time {
|
||||||
grid-area: time;
|
grid-area: time;
|
||||||
}
|
}
|
||||||
.activity-card--response .success .icon {
|
|
||||||
|
.success .icon {
|
||||||
fill: var(--green);
|
fill: var(--green);
|
||||||
}
|
}
|
||||||
.activity-card--response .failed .icon {
|
|
||||||
|
.pending .icon {
|
||||||
|
fill: var(--yellow);
|
||||||
|
}
|
||||||
|
|
||||||
|
.failed .icon {
|
||||||
fill: var(--danger-color);
|
fill: var(--danger-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -730,6 +781,9 @@ details[open] > summary .icon {
|
|||||||
height: 80%;
|
height: 80%;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.nav-item--active {
|
||||||
|
background-color: var(--accent-color--light);
|
||||||
|
}
|
||||||
.nav-item:not(:last-of-type) {
|
.nav-item:not(:last-of-type) {
|
||||||
margin-bottom: 0.5rem;
|
margin-bottom: 0.5rem;
|
||||||
}
|
}
|
||||||
@ -784,13 +838,15 @@ details[open] > summary .icon {
|
|||||||
background: rgba(var(--text-color), 0.5);
|
background: rgba(var(--text-color), 0.5);
|
||||||
}
|
}
|
||||||
|
|
||||||
.nav-item {
|
.nav-item,
|
||||||
|
.interact {
|
||||||
-webkit-transition: background-color 0.3s, -webkit-transform 0.3s;
|
-webkit-transition: background-color 0.3s, -webkit-transform 0.3s;
|
||||||
transition: background-color 0.3s, -webkit-transform 0.3s;
|
transition: background-color 0.3s, -webkit-transform 0.3s;
|
||||||
transition: background-color 0.3s, transform 0.3s;
|
transition: background-color 0.3s, transform 0.3s;
|
||||||
transition: background-color 0.3s, transform 0.3s, -webkit-transform 0.3s;
|
transition: background-color 0.3s, transform 0.3s, -webkit-transform 0.3s;
|
||||||
}
|
}
|
||||||
.nav-item:hover {
|
.nav-item:hover,
|
||||||
|
.interact:hover {
|
||||||
background-color: var(--accent-color--light);
|
background-color: var(--accent-color--light);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
2
css/main.min.css
vendored
2
css/main.min.css
vendored
File diff suppressed because one or more lines are too long
@ -25,15 +25,16 @@ body {
|
|||||||
--foreground-color: rgb(250, 252, 255);
|
--foreground-color: rgb(250, 252, 255);
|
||||||
--danger-color: rgb(255, 75, 75);
|
--danger-color: rgb(255, 75, 75);
|
||||||
--green: #1cad59;
|
--green: #1cad59;
|
||||||
|
--yellow: #f3a600;
|
||||||
scrollbar-width: thin;
|
scrollbar-width: thin;
|
||||||
}
|
}
|
||||||
|
|
||||||
color: rgba(var(--text-color), 1);
|
color: rgba(var(--text-color), 1);
|
||||||
background: rgba(var(--background-color), 1);
|
background: rgba(var(--background-color), 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
body[data-theme='dark'] {
|
body[data-theme='dark'] {
|
||||||
|
|
||||||
&,
|
&,
|
||||||
* {
|
* {
|
||||||
--accent-color: rgb(170, 190, 255);
|
--accent-color: rgb(170, 190, 255);
|
||||||
@ -44,6 +45,7 @@ body[data-theme='dark'] {
|
|||||||
--foreground-color: rgb(20, 20, 20);
|
--foreground-color: rgb(20, 20, 20);
|
||||||
--danger-color: rgb(255, 106, 106);
|
--danger-color: rgb(255, 106, 106);
|
||||||
--green: #00E676;
|
--green: #00E676;
|
||||||
|
--yellow: #ffd13a;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -471,6 +473,8 @@ details {
|
|||||||
border-radius: 0.5rem;
|
border-radius: 0.5rem;
|
||||||
color: inherit;
|
color: inherit;
|
||||||
transition: transform 0.3s;
|
transition: transform 0.3s;
|
||||||
|
user-select: none;
|
||||||
|
-webkit-tap-highlight-color: transparent;
|
||||||
&--active{
|
&--active{
|
||||||
.icon{
|
.icon{
|
||||||
fill: var(--accent-color);
|
fill: var(--accent-color);
|
||||||
@ -525,16 +529,18 @@ details {
|
|||||||
}
|
}
|
||||||
#recent_transactions_container{
|
#recent_transactions_container{
|
||||||
display: grid;
|
display: grid;
|
||||||
gap: 1rem;
|
|
||||||
margin: 1.5rem 0;
|
margin: 1.5rem 0;
|
||||||
|
padding-bottom: 5rem;
|
||||||
}
|
}
|
||||||
.activity-card{
|
.activity-card{
|
||||||
display: grid;
|
display: grid;
|
||||||
gap: 0.8rem;
|
padding: 1rem 0;
|
||||||
align-items: center;
|
gap: 0.4rem 1rem;
|
||||||
grid-template-columns: auto minmax(0, 1fr) auto;
|
border-radius: 0.5rem;
|
||||||
|
align-items: flex-start;
|
||||||
color: inherit;
|
color: inherit;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
|
grid-template-columns: auto minmax(0, 1fr) auto;
|
||||||
&__icon{
|
&__icon{
|
||||||
display: flex;
|
display: flex;
|
||||||
align-content: center;
|
align-content: center;
|
||||||
@ -559,33 +565,74 @@ details {
|
|||||||
color: rgba(var(--text-color), 0.8);
|
color: rgba(var(--text-color), 0.8);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#all_responses_list{
|
#notifications,
|
||||||
padding: 1.5rem 1.5rem 5rem 1.5rem;
|
#transactions{
|
||||||
|
padding-bottom: 5rem;
|
||||||
|
.activity-card{
|
||||||
|
padding: 1rem 1.5rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.activity-card--request{
|
||||||
|
grid-template-areas: 'icon . amount' 'icon time .';
|
||||||
|
.activity-card__icon{
|
||||||
|
grid-area: icon;
|
||||||
|
}
|
||||||
|
.activity-card__time{
|
||||||
|
grid-area: time;
|
||||||
|
}
|
||||||
|
.activity-card__amount{
|
||||||
|
grid-area: amount;
|
||||||
|
text-align: end;
|
||||||
|
}
|
||||||
|
.activity-card__status:not(:empty){
|
||||||
|
text-transform: uppercase;
|
||||||
|
letter-spacing: 0.05em;
|
||||||
|
font-size: 0.7rem;
|
||||||
|
border-radius: 0.2rem;
|
||||||
|
padding: 0.3rem 0.4rem;
|
||||||
|
font-weight: 500;
|
||||||
|
color: rgba($color: #000000, $alpha: 0.7);
|
||||||
|
&.success{
|
||||||
|
color: var(--green);
|
||||||
|
background-color: rgb(0, 230, 118, 0.1);
|
||||||
|
}
|
||||||
|
&.failed{
|
||||||
|
color: var(--danger-color);
|
||||||
|
background-color: rgb(255, 75, 75, 0.1);
|
||||||
|
}
|
||||||
|
&.pending{
|
||||||
|
color: var(--yellow);
|
||||||
|
background-color: rgba(255, 252, 75, 0.1);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
.activity-card--response{
|
.activity-card--response{
|
||||||
align-items: flex-start;
|
grid-template-areas: 'icon . time' 'icon description description';
|
||||||
gap: 0.2rem 0.8rem;
|
|
||||||
border-radius: 0.5rem;
|
|
||||||
grid-template-areas: 'icon . time' 'icon . time';
|
|
||||||
.activity-card__icon{
|
.activity-card__icon{
|
||||||
grid-area: icon;
|
grid-area: icon;
|
||||||
}
|
}
|
||||||
.activity-card__description{
|
.activity-card__description{
|
||||||
|
grid-area: description;
|
||||||
font-size: 0.8rem;
|
font-size: 0.8rem;
|
||||||
color: rgba(var(--text-color), 0.8);
|
color: rgba(var(--text-color), 0.8);
|
||||||
}
|
}
|
||||||
.activity-card__time{
|
.activity-card__time{
|
||||||
grid-area: time;
|
grid-area: time;
|
||||||
}
|
}
|
||||||
.success{
|
}
|
||||||
.icon{
|
.success{
|
||||||
fill: var(--green);
|
.icon{
|
||||||
}
|
fill: var(--green);
|
||||||
}
|
}
|
||||||
.failed{
|
}
|
||||||
.icon{
|
.pending{
|
||||||
fill: var(--danger-color);
|
.icon{
|
||||||
}
|
fill: var(--yellow);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.failed{
|
||||||
|
.icon{
|
||||||
|
fill: var(--danger-color);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#user_section{
|
#user_section{
|
||||||
@ -639,7 +686,7 @@ details {
|
|||||||
}
|
}
|
||||||
.nav-item{
|
.nav-item{
|
||||||
&--active{
|
&--active{
|
||||||
// background-color: var(--accent-color--light);
|
background-color: var(--accent-color--light);
|
||||||
}
|
}
|
||||||
&:not(:last-of-type){
|
&:not(:last-of-type){
|
||||||
margin-bottom: 0.5rem;
|
margin-bottom: 0.5rem;
|
||||||
@ -694,7 +741,8 @@ details {
|
|||||||
background: rgba(var(--text-color), 0.5);
|
background: rgba(var(--text-color), 0.5);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.nav-item{
|
.nav-item,
|
||||||
|
.interact{
|
||||||
transition: background-color 0.3s, transform 0.3s;
|
transition: background-color 0.3s, transform 0.3s;
|
||||||
&:hover{
|
&:hover{
|
||||||
background-color: var(--accent-color--light);
|
background-color: var(--accent-color--light);
|
||||||
|
|||||||
225
index.html
225
index.html
@ -182,9 +182,12 @@
|
|||||||
<p class="empty-state">No transactions so far. Confirmed transactions will be shown here.</p>
|
<p class="empty-state">No transactions so far. Confirmed transactions will be shown here.</p>
|
||||||
</section>
|
</section>
|
||||||
</div>
|
</div>
|
||||||
<div id="transactions" class="sub-page hide-completely"></div>
|
|
||||||
<div id="notifications" class="sub-page hide-completely">
|
<div id="notifications" class="sub-page hide-completely">
|
||||||
<div id="all_responses_list" class="observe-empty-state grid gap-1-5"></div>
|
<div id="all_responses_list" class="observe-empty-state grid"></div>
|
||||||
|
<p class="empty-state">No notifications so far.</p>
|
||||||
|
</div>
|
||||||
|
<div id="transactions" class="sub-page hide-completely">
|
||||||
|
<div id="all_requests_list" class="observe-empty-state grid"></div>
|
||||||
<p class="empty-state">No notifications so far.</p>
|
<p class="empty-state">No notifications so far.</p>
|
||||||
</div>
|
</div>
|
||||||
<div id="settings" class="sub-page hide-completely">
|
<div id="settings" class="sub-page hide-completely">
|
||||||
@ -208,14 +211,29 @@
|
|||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
</article>
|
</article>
|
||||||
<article id="transaction" class="page hide-completely">
|
<article id="transaction" class="page hide-completely page-layout">
|
||||||
|
<div id="transaction_top" class="grid gap-1-5 card">
|
||||||
|
<button class="icon-button" onclick="history.back()">
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" class="icon" viewBox="0 0 20 20" fill="currentColor">
|
||||||
|
<path fill-rule="evenodd" d="M9.707 16.707a1 1 0 01-1.414 0l-6-6a1 1 0 010-1.414l6-6a1 1 0 011.414 1.414L5.414 9H17a1 1 0 110 2H5.414l4.293 4.293a1 1 0 010 1.414z" clip-rule="evenodd" />
|
||||||
|
</svg>
|
||||||
|
</button>
|
||||||
|
<div id="transaction_detail__icon"></div>
|
||||||
|
<div class="grid gap-0-5">
|
||||||
|
<div id="transaction_detail__type"></div>
|
||||||
|
<div id="transaction_detail__amount"></div>
|
||||||
|
</div>
|
||||||
|
<time id="transaction_detail__time"></time>
|
||||||
|
<sm-button id="transaction_action_button" variant="primary"></sm-button>
|
||||||
|
</div>
|
||||||
</article>
|
</article>
|
||||||
<template id="activity_template">
|
<template id="request_template">
|
||||||
<a class="activity-card interact">
|
<a class="activity-card activity-card--request interact">
|
||||||
<div class="activity-card__icon"></div>
|
<div class="activity-card__icon"></div>
|
||||||
<div class="activity-card__title"></div>
|
<div class="activity-card__title"></div>
|
||||||
<time class="activity-card__time"></time>
|
<time class="activity-card__time"></time>
|
||||||
|
<h4 class="activity-card__amount"></h4>
|
||||||
|
<span class="activity-card__status"></span>
|
||||||
</a>
|
</a>
|
||||||
</template>
|
</template>
|
||||||
<template id="response_template">
|
<template id="response_template">
|
||||||
@ -487,14 +505,19 @@
|
|||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
|
||||||
let lastPage
|
const pagesData = {
|
||||||
|
openedPages: []
|
||||||
|
}
|
||||||
|
|
||||||
|
let responseLoader
|
||||||
|
let requestLoader
|
||||||
async function showPage(targetPage, options = {}) {
|
async function showPage(targetPage, options = {}) {
|
||||||
const { firstLoad, hashChange } = options
|
const { firstLoad, hashChange } = options
|
||||||
let pageId
|
let pageId
|
||||||
let searchParams
|
let searchParams
|
||||||
let params
|
let params
|
||||||
if (targetPage === '') {
|
if (targetPage === '') {
|
||||||
pageId = 'homepage'
|
pageId = 'dashboard'
|
||||||
}else {
|
}else {
|
||||||
if(targetPage.includes('/')){
|
if(targetPage.includes('/')){
|
||||||
if (targetPage.includes('?')) {
|
if (targetPage.includes('?')) {
|
||||||
@ -525,6 +548,9 @@
|
|||||||
getRef('generated_flo_id').value = floID
|
getRef('generated_flo_id').value = floID
|
||||||
getRef('generated_private_key').value = privKey
|
getRef('generated_private_key').value = privKey
|
||||||
break;
|
break;
|
||||||
|
case 'transaction':
|
||||||
|
const {requestId} = params
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
document.querySelector('.page:not(.hide-completely)')?.classList.add('hide-completely')
|
document.querySelector('.page:not(.hide-completely)')?.classList.add('hide-completely')
|
||||||
getRef(pageId)?.classList.remove('hide-completely')
|
getRef(pageId)?.classList.remove('hide-completely')
|
||||||
@ -540,7 +566,6 @@
|
|||||||
duration: 300,
|
duration: 300,
|
||||||
easing: 'ease'
|
easing: 'ease'
|
||||||
})
|
})
|
||||||
lastPage = pageId
|
|
||||||
}else if(appSubPages.includes(pageId)){
|
}else if(appSubPages.includes(pageId)){
|
||||||
switch (pageId) {
|
switch (pageId) {
|
||||||
case 'dashboard':
|
case 'dashboard':
|
||||||
@ -553,8 +578,21 @@
|
|||||||
.catch(error => notify(error, 'error'))
|
.catch(error => notify(error, 'error'))
|
||||||
break;
|
break;
|
||||||
case 'notifications':
|
case 'notifications':
|
||||||
renderResponses()
|
if(pagesData.openedPages.includes(pageId)){
|
||||||
break
|
responseLoader.reset()
|
||||||
|
}else{
|
||||||
|
responseLoader = new LazyLoader('#all_responses_list', getArrayOfObj(bank_app.viewAllResponses()).reverse(), render.responseCard, {batchSize: 10})
|
||||||
|
responseLoader.init()
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'transactions':
|
||||||
|
if(pagesData.openedPages.includes(pageId)){
|
||||||
|
requestLoader.reset()
|
||||||
|
}else{
|
||||||
|
requestLoader = new LazyLoader('#all_requests_list', getRequests(), render.requestCard, {batchSize: 10})
|
||||||
|
requestLoader.init()
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
if(getRef('homepage').classList.contains('hide-completely')){
|
if(getRef('homepage').classList.contains('hide-completely')){
|
||||||
document.querySelector('.page:not(.hide-completely)')?.classList.add('hide-completely')
|
document.querySelector('.page:not(.hide-completely)')?.classList.add('hide-completely')
|
||||||
@ -579,13 +617,85 @@
|
|||||||
easing: 'ease'
|
easing: 'ease'
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
pagesData.lastPage = pageId
|
||||||
|
if(!pagesData.openedPages.includes(pageId)){
|
||||||
|
pagesData.openedPages.push(pageId)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
</script>
|
// class based lazy loading
|
||||||
|
class LazyLoader{
|
||||||
|
constructor(container, arrayOfElements, renderFn, options = {}){
|
||||||
|
const {batchSize = 10} = options
|
||||||
|
this.arrayOfElements = arrayOfElements
|
||||||
|
this.renderFn = renderFn
|
||||||
|
this.intersectionObserver
|
||||||
|
|
||||||
|
this.batchSize = batchSize
|
||||||
|
|
||||||
|
this.lazyContainer = document.querySelector(container)
|
||||||
|
|
||||||
|
this.render = this.render.bind(this)
|
||||||
|
this.init = this.init.bind(this)
|
||||||
|
this.clear = this.clear.bind(this)
|
||||||
|
}
|
||||||
|
init(){
|
||||||
|
this.intersectionObserver = new IntersectionObserver((entries, observer) => {
|
||||||
|
entries.forEach(entry => {
|
||||||
|
if(entry.isIntersecting){
|
||||||
|
observer.disconnect()
|
||||||
|
this.render({lazyLoad: true})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},{
|
||||||
|
threshold: 0.3
|
||||||
|
})
|
||||||
|
this.mutationObserver = new MutationObserver(mutationList => {
|
||||||
|
mutationList.forEach(mutation => {
|
||||||
|
if (mutation.type === 'childList') {
|
||||||
|
if (mutation.addedNodes.length) {
|
||||||
|
this.intersectionObserver.observe(this.lazyContainer.lastElementChild)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
this.mutationObserver.observe(this.lazyContainer, {
|
||||||
|
childList: true,
|
||||||
|
})
|
||||||
|
this.render()
|
||||||
|
console.log(this.arrayOfElements.length)
|
||||||
|
}
|
||||||
|
render(options = {}) {
|
||||||
|
let {lazyLoad = false} = options
|
||||||
|
const frag = document.createDocumentFragment();
|
||||||
|
if(lazyLoad){
|
||||||
|
this.updateStartIndex = this.updateEndIndex
|
||||||
|
this.updateEndIndex = this.arrayOfElements.length > this.updateEndIndex + this.batchSize ? this.updateEndIndex + this.batchSize : this.arrayOfElements.length
|
||||||
|
}else{
|
||||||
|
this.intersectionObserver.disconnect()
|
||||||
|
this.lazyContainer.innerHTML = ``;
|
||||||
|
this.updateStartIndex = 0
|
||||||
|
this.updateEndIndex = this.arrayOfElements.length > this.batchSize ? this.batchSize : this.arrayOfElements.length
|
||||||
|
}
|
||||||
|
for (let index = this.updateStartIndex; index < this.updateEndIndex; index++) {
|
||||||
|
frag.append(this.renderFn(this.arrayOfElements[index]))
|
||||||
|
}
|
||||||
|
this.lazyContainer.append(frag)
|
||||||
|
}
|
||||||
|
clear(){
|
||||||
|
this.intersectionObserver.disconnect()
|
||||||
|
this.mutationObserver.disconnect()
|
||||||
|
this.lazyContainer.innerHTML = ``;
|
||||||
|
}
|
||||||
|
reset(){
|
||||||
|
this.render()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
<script id="ui_functions">
|
<script id="ui_functions">
|
||||||
const render = {
|
const render = {
|
||||||
activityCard(activityDetails = {}){
|
requestCard(activityDetails = {}){
|
||||||
const {requestID, amount, rtype, timestamp, status} = activityDetails
|
const {requestID, amount, rtype, timestamp, status} = activityDetails
|
||||||
const card = getRef('activity_template').content.cloneNode(true).firstElementChild
|
const card = getRef('request_template').content.cloneNode(true).firstElementChild
|
||||||
let icon
|
let icon
|
||||||
let action = ''
|
let action = ''
|
||||||
switch(rtype){
|
switch(rtype){
|
||||||
@ -603,22 +713,29 @@
|
|||||||
icon = `
|
icon = `
|
||||||
<svg class="icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M15.61,8.68H8.39L3.37,15a5.18,5.18,0,0,0,.19,4.27h0A5.06,5.06,0,0,0,8.06,22h7.88a5.06,5.06,0,0,0,4.5-2.77h0A5.18,5.18,0,0,0,20.63,15Z"/><path d="M8.35,6.77h7.26l.88-1.2a1.12,1.12,0,0,0-1.18-1.75h0a1.16,1.16,0,0,1-.92-.18l-.28-.21a3.64,3.64,0,0,0-4.22,0h0a1.14,1.14,0,0,1-1,.16l-.22-.06A1.13,1.13,0,0,0,7.43,5.19Z"/></svg>
|
<svg class="icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M15.61,8.68H8.39L3.37,15a5.18,5.18,0,0,0,.19,4.27h0A5.06,5.06,0,0,0,8.06,22h7.88a5.06,5.06,0,0,0,4.5-2.77h0A5.18,5.18,0,0,0,20.63,15Z"/><path d="M8.35,6.77h7.26l.88-1.2a1.12,1.12,0,0,0-1.18-1.75h0a1.16,1.16,0,0,1-.92-.18l-.28-.21a3.64,3.64,0,0,0-4.22,0h0a1.14,1.14,0,0,1-1,.16l-.22-.06A1.13,1.13,0,0,0,7.43,5.19Z"/></svg>
|
||||||
`
|
`
|
||||||
action = 'Get loan of'
|
action = 'Get loan'
|
||||||
break
|
break
|
||||||
case 'closeLoan':
|
case 'closeLoan':
|
||||||
icon = ``
|
icon = ``
|
||||||
action = 'Repay loan of'
|
action = 'Repay loan'
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
card.setAttribute('href', `#/transaction?requestID=${requestID}`)
|
card.setAttribute('href', `#/transaction?requestID=${requestID}`)
|
||||||
card.querySelector('.activity-card__icon').innerHTML = icon
|
card.querySelector('.activity-card__icon').innerHTML = icon
|
||||||
card.querySelector('.activity-card__title').textContent = `${action} ${amount} (${status})`
|
card.querySelector('.activity-card__title').textContent = action
|
||||||
card.querySelector('.activity-card__time').textContent = getFormatedTime(timestamp, true)
|
card.querySelector('.activity-card__time').textContent = getFormatedTime(timestamp, true)
|
||||||
|
card.querySelector('.activity-card__amount').textContent = `₹${amount}`
|
||||||
|
card.querySelector('.activity-card__status').classList.add(status)
|
||||||
|
card.querySelector('.activity-card__status').textContent = status
|
||||||
return card
|
return card
|
||||||
},
|
},
|
||||||
responseCard(responseDetails){
|
responseCard(responseDetails){
|
||||||
const {requestID, reason = 'none', rtype, status = 'pending', timestamp} = responseDetails
|
const {id, requestID, reason = 'none', rtype, status = 'pending'} = responseDetails
|
||||||
const {amount = undefined, index = undefined} = bank_app.viewAllRequests()[requestID]
|
let {amount = undefined, index = undefined} = bank_app.viewAllRequests()[requestID]
|
||||||
|
if(!amount){
|
||||||
|
amount = bank_app.accounts[index].amount
|
||||||
|
}
|
||||||
|
const timestamp = id.split('_')[0]
|
||||||
const card = getRef('response_template').content.cloneNode(true).firstElementChild
|
const card = getRef('response_template').content.cloneNode(true).firstElementChild
|
||||||
let icon
|
let icon
|
||||||
let action = ''
|
let action = ''
|
||||||
@ -627,7 +744,7 @@
|
|||||||
action = 'deposit'
|
action = 'deposit'
|
||||||
break
|
break
|
||||||
case 'closeDeposit':
|
case 'closeDeposit':
|
||||||
action = 'withdraw'
|
action = 'withdrawal'
|
||||||
break
|
break
|
||||||
case 'openLoan':
|
case 'openLoan':
|
||||||
action = 'loan'
|
action = 'loan'
|
||||||
@ -684,59 +801,22 @@
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
let updateStartIndex = 0
|
function getArrayOfObj(obj) {
|
||||||
let updateEndIndex = 0
|
const arrayOfObj = []
|
||||||
const intersectionObserver = new IntersectionObserver((entries, observer) => {
|
for (key in obj) {
|
||||||
entries.forEach(entry => {
|
arrayOfObj.push({id: key, ...obj[key]});
|
||||||
if(entry.isIntersecting){
|
|
||||||
observer.disconnect()
|
|
||||||
renderFilteredUpdates({lazyLoad: true})
|
|
||||||
}
|
|
||||||
})
|
|
||||||
},{
|
|
||||||
threshold: 0.3
|
|
||||||
})
|
|
||||||
function renderResponses(options = {}) {
|
|
||||||
let {lazyLoad = false} = options
|
|
||||||
const frag = document.createDocumentFragment();
|
|
||||||
const allResponses = bank_app.viewAllResponses()
|
|
||||||
const updates = []
|
|
||||||
for (key in allResponses) {
|
|
||||||
updates.push({id: key, ...allResponses[key]});
|
|
||||||
}
|
|
||||||
if(lazyLoad){
|
|
||||||
updateStartIndex = updateEndIndex
|
|
||||||
updateEndIndex = updates.length > updateEndIndex + 10 ? updateEndIndex + 10 : updates.length
|
|
||||||
}else{
|
|
||||||
intersectionObserver.disconnect()
|
|
||||||
getRef('all_responses_list').innerHTML = ``;
|
|
||||||
updateStartIndex = 0
|
|
||||||
updateEndIndex = updates.length > 10 ? 10 : updates.length
|
|
||||||
}
|
|
||||||
for (let index = updateStartIndex; index < updateEndIndex; index++) {
|
|
||||||
const {id} = updates[index]
|
|
||||||
const responseDetails = {
|
|
||||||
...updates[index],
|
|
||||||
responseID: id,
|
|
||||||
timestamp: id.split('_')[0],
|
|
||||||
}
|
|
||||||
frag.append(render.responseCard(responseDetails))
|
|
||||||
}
|
|
||||||
getRef('all_responses_list').append(frag)
|
|
||||||
if(updateEndIndex !== updates.length && getRef('all_responses_list').lastElementChild){
|
|
||||||
intersectionObserver.observe(getRef('all_responses_list').lastElementChild)
|
|
||||||
}
|
}
|
||||||
|
return arrayOfObj
|
||||||
}
|
}
|
||||||
function renderRecentTransactions() {
|
function getRequests() {
|
||||||
const activityFrag = document.createDocumentFragment()
|
|
||||||
const transactions = bank_app.viewAllRequests()
|
const transactions = bank_app.viewAllRequests()
|
||||||
const responses = bank_app.viewAllResponses()
|
const responses = bank_app.viewAllResponses()
|
||||||
let index = 0
|
const requests = []
|
||||||
for (const key in transactions) {
|
for (const key in transactions) {
|
||||||
if(index > 5){
|
let {amount, rtype, index} = transactions[key]
|
||||||
break
|
if(!amount){
|
||||||
|
amount = bank_app.accounts[index].amount
|
||||||
}
|
}
|
||||||
const {amount, rtype} = transactions[key]
|
|
||||||
const transactionDetails = {
|
const transactionDetails = {
|
||||||
amount,
|
amount,
|
||||||
rtype,
|
rtype,
|
||||||
@ -744,9 +824,16 @@
|
|||||||
timestamp: key.split('_')[0],
|
timestamp: key.split('_')[0],
|
||||||
status: requestResponsePairs[key] ? responses[requestResponsePairs[key]].status : 'pending'
|
status: requestResponsePairs[key] ? responses[requestResponsePairs[key]].status : 'pending'
|
||||||
}
|
}
|
||||||
activityFrag.append(render.activityCard(transactionDetails))
|
requests.push(transactionDetails)
|
||||||
index++
|
|
||||||
}
|
}
|
||||||
|
return requests.reverse()
|
||||||
|
}
|
||||||
|
function renderRecentTransactions() {
|
||||||
|
const activityFrag = document.createDocumentFragment()
|
||||||
|
const recentRequests = getRequests().splice(0, 5)
|
||||||
|
recentRequests.forEach(request => {
|
||||||
|
activityFrag.append(render.requestCard(request))
|
||||||
|
})
|
||||||
getRef('recent_transactions_container').innerHTML = ''
|
getRef('recent_transactions_container').innerHTML = ''
|
||||||
getRef('recent_transactions_container').append(activityFrag)
|
getRef('recent_transactions_container').append(activityFrag)
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user