From 3b208e3d051e46b7f1744351d9a5bf94638a24d2 Mon Sep 17 00:00:00 2001 From: Evan Kaloudis Date: Thu, 16 Mar 2023 20:13:36 -0400 Subject: [PATCH 1/5] ActivityFilter: add toggle for Unpaid --- stores/ActivityStore.ts | 14 ++++++++++++++ views/Activity/ActivityFilter.tsx | 7 +++++++ 2 files changed, 21 insertions(+) diff --git a/stores/ActivityStore.ts b/stores/ActivityStore.ts index 9c7cd5e8a..99b1135f1 100644 --- a/stores/ActivityStore.ts +++ b/stores/ActivityStore.ts @@ -20,6 +20,7 @@ interface ActivityFilter { channels: boolean; sent: boolean; received: boolean; + unpaid: boolean; minimumAmount: number; startDate: any; endDate: any; @@ -38,6 +39,7 @@ export default class ActivityStore { channels: true, sent: true, received: true, + unpaid: true, startDate: null, endDate: null }; @@ -145,6 +147,7 @@ export default class ActivityStore { channels: true, sent: true, received: true, + unpaid: true, minimumAmount: 0, startDate: null, endDate: null @@ -215,6 +218,17 @@ export default class ActivityStore { ); } + if (filters.unpaid == false) { + filteredActivity = filteredActivity.filter( + (activity: any) => + !( + activity.model === + localeString('views.Invoice.title') && + !activity.isPaid + ) + ); + } + if (filters.minimumAmount > 0) { filteredActivity = filteredActivity.filter( (activity: any) => diff --git a/views/Activity/ActivityFilter.tsx b/views/Activity/ActivityFilter.tsx index 4fc6e3f38..79d9392d3 100644 --- a/views/Activity/ActivityFilter.tsx +++ b/views/Activity/ActivityFilter.tsx @@ -67,6 +67,7 @@ export default class ActivityFilter extends React.Component< channels, sent, received, + unpaid, minimumAmount, startDate, endDate @@ -246,6 +247,12 @@ export default class ActivityFilter extends React.Component< var: 'received', type: 'Toggle' }, + { + label: localeString('views.Wallet.Invoices.unpaid'), + value: unpaid, + var: 'unpaid', + type: 'Toggle' + }, { label: localeString('views.ActivityFilter.minimumAmount'), value: minimumAmount, From 16efd527b0a9dbd4496c2d03853d540913ccb493 Mon Sep 17 00:00:00 2001 From: Evan Kaloudis Date: Thu, 16 Mar 2023 20:15:02 -0400 Subject: [PATCH 2/5] ActivityFilter: remove toggle for Channels --- stores/ActivityStore.ts | 13 ------------- views/Activity/ActivityFilter.tsx | 7 ------- 2 files changed, 20 deletions(-) diff --git a/stores/ActivityStore.ts b/stores/ActivityStore.ts index 99b1135f1..5a17afd41 100644 --- a/stores/ActivityStore.ts +++ b/stores/ActivityStore.ts @@ -17,7 +17,6 @@ interface ActivityFilter { [index: string]: any; lightning: boolean; onChain: boolean; - channels: boolean; sent: boolean; received: boolean; unpaid: boolean; @@ -36,7 +35,6 @@ export default class ActivityStore { @observable public filters: ActivityFilter = { lightning: true, onChain: true, - channels: true, sent: true, received: true, unpaid: true, @@ -144,7 +142,6 @@ export default class ActivityStore { this.filters = { lightning: true, onChain: true, - channels: true, sent: true, received: true, unpaid: true, @@ -161,16 +158,6 @@ export default class ActivityStore { this.filters = filters; let filteredActivity = this.activity; - if (filters.channels == false) { - filteredActivity = filteredActivity.filter( - (activity: any) => - !( - activity.model === - localeString('general.transaction') && - activity.getAmount == 0 - ) - ); - } if (filters.lightning == false) { filteredActivity = filteredActivity.filter( diff --git a/views/Activity/ActivityFilter.tsx b/views/Activity/ActivityFilter.tsx index 79d9392d3..ac7077633 100644 --- a/views/Activity/ActivityFilter.tsx +++ b/views/Activity/ActivityFilter.tsx @@ -64,7 +64,6 @@ export default class ActivityFilter extends React.Component< const { lightning, onChain, - channels, sent, received, unpaid, @@ -229,12 +228,6 @@ export default class ActivityFilter extends React.Component< var: 'onChain', type: 'Toggle' }, - { - label: localeString('views.Wallet.Wallet.channels'), - value: channels, - var: 'channels', - type: 'Toggle' - }, { label: localeString('general.sent'), value: sent, From a178e1a0d35a1498d44574951e8288132e3a905d Mon Sep 17 00:00:00 2001 From: Evan Kaloudis Date: Fri, 17 Mar 2023 17:01:58 -0400 Subject: [PATCH 3/5] ActivityFilter: save filters to persistent storage --- stores/ActivityStore.ts | 72 ++++++++++++++++++++----------- views/Activity/Activity.tsx | 18 ++++---- views/Activity/ActivityFilter.tsx | 20 +++++++-- 3 files changed, 74 insertions(+), 36 deletions(-) diff --git a/stores/ActivityStore.ts b/stores/ActivityStore.ts index 5a17afd41..9c3ac6c2a 100644 --- a/stores/ActivityStore.ts +++ b/stores/ActivityStore.ts @@ -1,4 +1,6 @@ import { action, observable } from 'mobx'; +import EncryptedStorage from 'react-native-encrypted-storage'; + // LN import Payment from './../models/Payment'; import Invoice from './../models/Invoice'; @@ -13,7 +15,9 @@ import TransactionsStore from './TransactionsStore'; import { localeString } from './../utils/LocaleUtils'; import BackendUtils from './../utils/BackendUtils'; -interface ActivityFilter { +const STORAGE_KEY = 'zeus-activity-filters'; + +export interface Filter { [index: string]: any; lightning: boolean; onChain: boolean; @@ -25,6 +29,17 @@ interface ActivityFilter { endDate: any; } +export const DEFAULT_FILTERS = { + lightning: true, + onChain: true, + sent: true, + received: true, + unpaid: true, + minimumAmount: 0, + startDate: null, + endDate: null +}; + export default class ActivityStore { @observable public loading = false; @observable public error = false; @@ -32,15 +47,7 @@ export default class ActivityStore { @observable public filteredActivity: Array< Invoice | Payment | Transaction > = []; - @observable public filters: ActivityFilter = { - lightning: true, - onChain: true, - sent: true, - received: true, - unpaid: true, - startDate: null, - endDate: null - }; + @observable public filters: Filter = DEFAULT_FILTERS; settingsStore: SettingsStore; paymentsStore: PaymentsStore; invoicesStore: InvoicesStore; @@ -58,6 +65,15 @@ export default class ActivityStore { this.invoicesStore = invoicesStore; } + @action + public resetFilters = async () => { + this.filters = DEFAULT_FILTERS; + await EncryptedStorage.setItem( + STORAGE_KEY, + JSON.stringify(this.filters) + ); + }; + @action public setAmountFilter = (filter: any) => { this.filters.minimumAmount = filter; @@ -138,21 +154,27 @@ export default class ActivityStore { }; @action - public resetFilters = async () => { - this.filters = { - lightning: true, - onChain: true, - sent: true, - received: true, - unpaid: true, - minimumAmount: 0, - startDate: null, - endDate: null - }; - }; + public async getFilters() { + this.loading = true; + try { + // Retrieve the credentials + const filters: any = await EncryptedStorage.getItem(STORAGE_KEY); + if (filters) { + this.filters = JSON.parse(filters); + } else { + console.log('No activity filters stored'); + } + } catch (error) { + console.log("Keychain couldn't be accessed!", error); + } finally { + this.loading = false; + } + + return this.filters; + } @action - public setFilters = async (filters: any) => { + public setFilters = async (filters: Filter) => { this.loading = true; this.filters = filters; @@ -237,11 +259,13 @@ export default class ActivityStore { this.filteredActivity = filteredActivity; + await EncryptedStorage.setItem(STORAGE_KEY, JSON.stringify(filters)); + this.loading = false; }; @action - public getActivityAndFilter = async (filters: any = this.filters) => { + public getActivityAndFilter = async (filters: Filter = this.filters) => { await this.getActivity(); await this.setFilters(filters); }; diff --git a/views/Activity/Activity.tsx b/views/Activity/Activity.tsx index 248d3c593..86fb16213 100644 --- a/views/Activity/Activity.tsx +++ b/views/Activity/Activity.tsx @@ -12,14 +12,14 @@ import { inject, observer } from 'mobx-react'; import Amount from '../../components/Amount'; import LoadingIndicator from '../../components/LoadingIndicator'; -import { localeString } from './../../utils/LocaleUtils'; -import BackendUtils from './../../utils/BackendUtils'; -import { themeColor } from './../../utils/ThemeUtils'; +import { localeString } from '../../utils/LocaleUtils'; +import BackendUtils from '../../utils/BackendUtils'; +import { themeColor } from '../../utils/ThemeUtils'; -import ActivityStore from './../../stores/ActivityStore'; -import SettingsStore from './../../stores/SettingsStore'; +import ActivityStore from '../../stores/ActivityStore'; +import SettingsStore from '../../stores/SettingsStore'; -import Filter from './../../assets/images/SVG/Filter On.svg'; +import Filter from '../../assets/images/SVG/Filter On.svg'; interface ActivityProps { navigation: any; @@ -35,9 +35,9 @@ export default class Activity extends React.Component { async UNSAFE_componentWillMount() { const { ActivityStore, SettingsStore } = this.props; - const { getActivityAndFilter, resetFilters } = ActivityStore; - await resetFilters(); - getActivityAndFilter(); + const { getActivityAndFilter, getFilters } = ActivityStore; + const filters = await getFilters(); + await getActivityAndFilter(filters); if (SettingsStore.implementation === 'lightning-node-connect') { this.subscribeEvents(); } diff --git a/views/Activity/ActivityFilter.tsx b/views/Activity/ActivityFilter.tsx index ac7077633..47fbb783e 100644 --- a/views/Activity/ActivityFilter.tsx +++ b/views/Activity/ActivityFilter.tsx @@ -2,13 +2,14 @@ import * as React from 'react'; import { FlatList, StyleSheet, Text, View } from 'react-native'; import { Button, Header, Icon, ListItem } from 'react-native-elements'; import { inject, observer } from 'mobx-react'; +import { isEqual } from 'lodash'; import DatePicker from 'react-native-date-picker'; import { localeString } from './../../utils/LocaleUtils'; import { themeColor } from './../../utils/ThemeUtils'; -import ActivityStore from './../../stores/ActivityStore'; +import ActivityStore, { DEFAULT_FILTERS } from './../../stores/ActivityStore'; import Switch from './../../components/Switch'; import TextInput from './../../components/TextInput'; @@ -264,12 +265,20 @@ export default class ActivityFilter extends React.Component< } ]; + const ClearButton = () => ( + ActivityStore.resetFilters()} + color={themeColor('text')} + underlayColor="transparent" + /> + ); + return (
+ ) + } backgroundColor={themeColor('background')} containerStyle={{ borderBottomWidth: 0 From a587a0ba0730602ecceec6e4348ebd097556cbd6 Mon Sep 17 00:00:00 2001 From: Evan Kaloudis Date: Sat, 18 Mar 2023 10:50:22 -0400 Subject: [PATCH 4/5] Use back arrow to navigate back from Activity and ActivityFilter views --- views/Activity/Activity.tsx | 2 +- views/Activity/ActivityFilter.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/views/Activity/Activity.tsx b/views/Activity/Activity.tsx index 86fb16213..f1da58bf2 100644 --- a/views/Activity/Activity.tsx +++ b/views/Activity/Activity.tsx @@ -117,7 +117,7 @@ export default class Activity extends React.Component { const CloseButton = () => ( navigation.navigate('Wallet')} color={themeColor('text')} underlayColor="transparent" diff --git a/views/Activity/ActivityFilter.tsx b/views/Activity/ActivityFilter.tsx index 47fbb783e..f6e877d1f 100644 --- a/views/Activity/ActivityFilter.tsx +++ b/views/Activity/ActivityFilter.tsx @@ -75,7 +75,7 @@ export default class ActivityFilter extends React.Component< const CloseButton = () => ( navigation.navigate('Activity', { refresh: true }) } From 19d8d91d53aad3718dd6e858c1de53d979054270 Mon Sep 17 00:00:00 2001 From: Evan Kaloudis Date: Sat, 18 Mar 2023 17:08:12 -0400 Subject: [PATCH 5/5] ActivityFilter: make writing of filters more reliable --- views/Activity/ActivityFilter.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/views/Activity/ActivityFilter.tsx b/views/Activity/ActivityFilter.tsx index 23e405f8d..dd0ced0f5 100644 --- a/views/Activity/ActivityFilter.tsx +++ b/views/Activity/ActivityFilter.tsx @@ -275,7 +275,7 @@ export default class ActivityFilter extends React.Component< const ClearButton = () => ( ActivityStore.resetFilters()} + onPress={async () => await ActivityStore.resetFilters()} color={themeColor('text')} underlayColor="transparent" /> @@ -330,12 +330,12 @@ export default class ActivityFilter extends React.Component< > { + onValueChange={async () => { const newFilters: any = filters; const index = `${item.var}`; newFilters[index] = !filters[index]; - setFilters(newFilters); + await setFilters(newFilters); }} />