Skip to content

Commit

Permalink
fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
voloshinskii committed Apr 11, 2024
1 parent f621392 commit d0e6bb9
Show file tree
Hide file tree
Showing 10 changed files with 147 additions and 118 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,13 @@ export class TonPriceDependency extends DependencyPrototype<
super(tk.tonPrice.state, (state) => ({ ton: state.ton, currency: state.currency }));
}

protected shouldEmit(
prev: Pick<PricesState, 'ton' | 'currency'>,
cur: Pick<PricesState, 'ton' | 'currency'>,
) {
return prev.ton !== cur.ton;
}

setWallet(wallet) {
this.dataProvider = wallet.tonPrice.state;
super.setWallet(wallet);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ export class DependencyPrototype<
protected unsubscribe?: () => void;
protected latestSnapshot: TSelected;

protected shouldEmit(prev: any, cur: any): boolean {
protected shouldEmit(prev: TSelected, cur: TSelected): boolean {
return !shallow(cur, prev);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,10 @@ export class InscriptionsContentProvider extends ContentProviderPrototype<{
name = Providers.Inscriptions;
renderPriority = -2;

constructor() {
constructor(tonPrice: TonPriceDependency, inscriptions: InscriptionsDependency) {
super({
inscriptions: new InscriptionsDependency(),
tonPrice: new TonPriceDependency(),
inscriptions,
tonPrice,
});
}

Expand Down
12 changes: 8 additions & 4 deletions packages/mobile/src/tabs/Wallet/content-providers/staking.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,15 @@ export class StakingContentProvider extends ContentProviderPrototype<{
name = Providers.Staking;
renderPriority = 0;

constructor() {
constructor(
tonPrice: TonPriceDependency,
jettonBalances: JettonBalancesDependency,
staking: StakingDependency,
) {
super({
tonPrice: new TonPriceDependency(),
jettonBalances: new JettonBalancesDependency(),
staking: new StakingDependency(),
tonPrice,
jettonBalances,
staking,
});
}

Expand Down
15 changes: 10 additions & 5 deletions packages/mobile/src/tabs/Wallet/content-providers/tokens.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,17 @@ export class TokensContentProvider extends ContentProviderPrototype<{
name = Providers.Tokens;
renderPriority = 0;

constructor() {
constructor(
tonPrice: TonPriceDependency,
stakingJettons: StakingJettonsDependency,
tokenApproval: TokenApprovalDependency,
jettonBalances: JettonBalancesDependency,
) {
super({
tonPrice: new TonPriceDependency(),
tokenApproval: new TokenApprovalDependency(),
stakingJettons: new StakingJettonsDependency(),
jettonBalances: new JettonBalancesDependency(),
tonPrice,
tokenApproval,
stakingJettons,
jettonBalances,
});
}

Expand Down
4 changes: 2 additions & 2 deletions packages/mobile/src/tabs/Wallet/content-providers/ton.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,8 @@ export class TONContentProvider extends ContentProviderPrototype<{
name = Providers.TON;
renderPriority = 999;

constructor() {
super({ tonPrice: new TonPriceDependency(), balances: new TonBalancesDependency() });
constructor(tonPrice: TonPriceDependency, balances: TonBalancesDependency) {
super({ tonPrice, balances });
}

get itemsArray() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ import { CellItemToRender } from './types';
import { Wallet } from '$wallet/Wallet';
import { tk } from '$wallet';
import { DependencyPrototype } from '../dependencies/utils/prototype';
import debounce from 'lodash/debounce';

type Subscriber = () => void;

Expand All @@ -19,14 +18,10 @@ export class ContentProviderPrototype<
protected wallet: Wallet = tk.wallet;
public subscribers = new Set<Subscriber>();

protected debounceEmitSubscribers = debounce(() => {
this.emitSubscribers();
}, 20);

constructor(protected deps: T = {} as T) {
Object.values(deps).map((dep) => {
dep.subscribe(() => {
this.debounceEmitSubscribers();
this.emitSubscribers();
});
});
}
Expand All @@ -52,15 +47,6 @@ export class ContentProviderPrototype<
return this.itemsArray.map((item) => this.makeCellItemFromData(item));
}

setWallet(wallet: Wallet) {
this.wallet = wallet;
Object.values(this.deps).map((dep) => {
dep.setWallet(wallet);
});

this.emitSubscribers();
}

makeCellItemFromData(data: any): CellItemToRender {
return {
key: 'key',
Expand Down
111 changes: 104 additions & 7 deletions packages/mobile/src/tabs/Wallet/content-providers/utils/receiver.ts
Original file line number Diff line number Diff line change
@@ -1,22 +1,119 @@
import { ContentProviderPrototype } from './prototype';
import debounce from 'lodash/debounce';
import { TonPriceDependency } from '../dependencies/tonPrice';
import { TONContentProvider } from '../ton';
import { TonBalancesDependency } from '../dependencies/tonBalances';
import { CellItemToRender } from './types';
import { TokensContentProvider } from '../tokens';
import { StakingJettonsDependency } from '../dependencies/stakingJettons';
import { TokenApprovalDependency } from '../dependencies/tokenApproval';
import { JettonBalancesDependency } from '../dependencies/jettons';
import { Wallet } from '$wallet/Wallet';
import { StakingContentProvider } from '../staking';
import { StakingDependency } from '../dependencies/staking';
import { InscriptionsContentProvider } from '../inscriptions';
import { InscriptionsDependency } from '../dependencies/inscriptions';
import { NamespacedLogger, logger } from '$logger';
import BigNumber from 'bignumber.js';

type Subscriber = () => void;
type Subscriber = (cells: CellItemToRender[]) => void;

export class WalletContentReceiver {
private subscribedTo = new Map<string, () => void>();
private subscribers = new Set<Subscriber>();

private debouncedEmit = debounce(() => {
this.subscribers.forEach((subscriber) => {
subscriber();
private logger: NamespacedLogger;

private tonPrice = new TonPriceDependency();
private tonBalances = new TonBalancesDependency();
private stakingJettons = new StakingJettonsDependency();
private tokenApproval = new TokenApprovalDependency();
private jettonBalances = new JettonBalancesDependency();
private staking = new StakingDependency();
private inscriptions = new InscriptionsDependency();

private depsList = [
this.tonPrice,
this.tonBalances,
this.stakingJettons,
this.tokenApproval,
this.jettonBalances,
this.staking,
this.inscriptions,
];

private providersList: ContentProviderPrototype<any>[] = [
new TONContentProvider(this.tonPrice, this.tonBalances),
new TokensContentProvider(
this.tonPrice,
this.stakingJettons,
this.tokenApproval,
this.jettonBalances,
),
new StakingContentProvider(this.tonPrice, this.jettonBalances, this.staking),
new InscriptionsContentProvider(this.tonPrice, this.inscriptions),
];

constructor() {
this.subscribeToProvidersChanges(this.providersList);
this.logger = logger.extend('WalletListContent');
}

public setWallet(wallet: Wallet) {
this.logger.debug('provide wallet to deps');
this.depsList.forEach((provider) => {
provider.setWallet(wallet);
});
}

public sortCellItems(cellItems: CellItemToRender[]): CellItemToRender[] {
let content: CellItemToRender[] = cellItems;

content = content.sort((a, b) => {
const comparedPriority = b.renderPriority - a.renderPriority;

if (comparedPriority !== 0) {
return comparedPriority;
}

if (!a.fiatRate && b.fiatRate) {
return 1;
}
if (a.fiatRate && !b.fiatRate) {
return -1;
}

if (!a.fiatRate && !b.fiatRate) {
return 0;
}

return new BigNumber(b.fiatRate.total.raw).comparedTo(a.fiatRate.total.raw);
});
}, 20);

constructor(private providersList: ContentProviderPrototype<any>[]) {
this.subscribeToProvidersChanges(providersList);
const firstTokenElement = content[0] as CellItemToRender;
const lastTokenElement = content[content.length - 1] as CellItemToRender;

// Make list; set corners
if (firstTokenElement) {
firstTokenElement.isFirst = true;
lastTokenElement.isLast = true;
}

return content;
}

get cellItems() {
return this.sortCellItems(
this.providersList.flatMap((provider) => provider.cellItems),
);
}

private debouncedEmit = debounce(() => {
this.subscribers.forEach((subscriber) => {
subscriber(this.cellItems);
});
}, 50);

private subscribeToProvidersChanges(provider: ContentProviderPrototype<any>[]) {
provider.forEach((provider) => {
const unsubscribe = provider.subscribe(() => {
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,84 +1,30 @@
import { useCallback, useEffect, useRef, useState } from 'react';
import { useEffect, useState } from 'react';
import { CellItemToRender } from './types';
import BigNumber from 'bignumber.js';
import { useInstance } from '$hooks/useInstance';
import { WalletContentReceiver } from './receiver';
import { useContentProvider } from './useContentProvider';
import { TONContentProvider } from '../ton';
import { InscriptionsContentProvider } from '../inscriptions';
import { StakingContentProvider } from '../staking';
import { TokensContentProvider } from '../tokens';
import { tk } from '$wallet';

export const usePreparedWalletContent = () => {
const tonContentProvider = useContentProvider(() => new TONContentProvider());
const tokensContentProvider = useContentProvider(() => new TokensContentProvider());
const stakingContentProvider = useContentProvider(() => new StakingContentProvider());
const inscriptionsContentProvider = useContentProvider(
() => new InscriptionsContentProvider(),
);
const providers = useRef([
tonContentProvider,
tokensContentProvider,
stakingContentProvider,
inscriptionsContentProvider,
]).current;

const providersReceiver = useInstance(() => new WalletContentReceiver(providers));
const providersReceiver = useInstance(() => new WalletContentReceiver());
const [preparedContent, setPreparedContent] = useState<CellItemToRender[]>([]);

const getPreparedContent = useCallback(() => {
let content: CellItemToRender[] = [];

providers.map((provider) => {
content.push(...provider.cellItems);
});

content = content.sort((a, b) => {
const comparedPriority = b.renderPriority - a.renderPriority;

if (comparedPriority !== 0) {
return comparedPriority;
}

if (!a.fiatRate && b.fiatRate) {
return 1;
}
if (a.fiatRate && !b.fiatRate) {
return -1;
}

if (!a.fiatRate && !b.fiatRate) {
return 0;
}

return new BigNumber(b.fiatRate.total.raw).comparedTo(a.fiatRate.total.raw);
useEffect(() => {
return tk.onChangeWallet(() => {
providersReceiver.setWallet(tk.wallet);
});

const firstTokenElement = content[0] as CellItemToRender;
const lastTokenElement = content[content.length - 1] as CellItemToRender;

// Make list; set corners
if (firstTokenElement) {
firstTokenElement.isFirst = true;
lastTokenElement.isLast = true;
}

return content;

// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);
}, [providersReceiver]);

useEffect(() => {
const unsubscribe = providersReceiver.subscribe(() => {
setPreparedContent(getPreparedContent());
const unsubscribe = providersReceiver.subscribe((cells) => {
setPreparedContent(cells);
});

setPreparedContent(getPreparedContent());
setPreparedContent(providersReceiver.cellItems);

return () => {
unsubscribe();
};
}, [getPreparedContent, providersReceiver]);
}, [providersReceiver]);

return preparedContent;
};

0 comments on commit d0e6bb9

Please sign in to comment.