Skip to content

Commit

Permalink
feat: add manage collectibles feature (#25)
Browse files Browse the repository at this point in the history
Signed-off-by: ryanml <[email protected]>
Co-authored-by: vvava <[email protected]>
  • Loading branch information
ryanml and vvava authored Aug 13, 2024
1 parent ce79553 commit 09373dc
Show file tree
Hide file tree
Showing 20 changed files with 383 additions and 41 deletions.
1 change: 1 addition & 0 deletions src/background/connections/extensionConnection/models.ts
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ export enum ExtensionRequest {
SEND_SUBMIT = 'send_submit',

SETTINGS_GET = 'settings_get',
SETTINGS_UPDATE_COLLECTIBLES_VISIBILITY = 'settings_update_collectibles_visibility',
SETTINGS_UPDATE_CURRENCY = 'settings_update_currency',
SETTINGS_UPDATE_SHOW_NO_BALANCE = 'settings_update_show_no_balance',
SETTINGS_UPDATE_THEME = 'settings_update_theme',
Expand Down
5 changes: 5 additions & 0 deletions src/background/connections/extensionConnection/registry.ts
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ import { GetWalletDetailsHandler } from '@src/background/services/wallet/handler
import { registry } from 'tsyringe';
import { UpdateCurrencyHandler } from '../../services/settings/handlers/updateCurrencySelection';
import { UpdateTokensVisiblityHandler } from '../../services/settings/handlers/updateTokensVisibility';
import { UpdateCollectiblesVisibilityHandler } from '../../services/settings/handlers/updateCollectiblesVisibility';
import { NetworksUpdatedEvents } from '@src/background/services/network/events/networksUpdatedEvent';
import { NetworkUpdatedEvents } from '@src/background/services/network/events/networkUpdatedEvent';
import { UpdateBalancesForNetworkHandler } from '@src/background/services/balances/handlers/updateBalancesForNetwork';
Expand Down Expand Up @@ -235,6 +236,10 @@ import { UnifiedBridgeTrackTransfer } from '@src/background/services/unifiedBrid
{ token: 'ExtensionRequestHandler', useToken: UpdateCurrencyHandler },
{ token: 'ExtensionRequestHandler', useToken: UpdateThemeHandler },
{ token: 'ExtensionRequestHandler', useToken: UpdateTokensVisiblityHandler },
{
token: 'ExtensionRequestHandler',
useToken: UpdateCollectiblesVisibilityHandler,
},
{ token: 'ExtensionRequestHandler', useToken: ResetExtensionStateHandler },
{ token: 'ExtensionRequestHandler', useToken: GetTokenPriceHandler },
{ token: 'ExtensionRequestHandler', useToken: GetHistoryHandler },
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,7 @@ describe('src/background/services/balances/BalancesServiceAVM.ts', () => {
showTokensWithoutBalances: false,
theme: ThemeVariant.DARK,
tokensVisibility: {},
collectiblesVisibility: {},
analyticsConsent: AnalyticsConsent.Approved,
language: Languages.EN,
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@ describe('src/background/services/balances/BalancesServicePVM.ts', () => {
showTokensWithoutBalances: false,
theme: ThemeVariant.DARK,
tokensVisibility: {},
collectiblesVisibility: {},
analyticsConsent: AnalyticsConsent.Approved,
language: Languages.EN,
});
Expand Down
24 changes: 24 additions & 0 deletions src/background/services/settings/SettingService.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import {
SettingsState,
ThemeVariant,
TokensVisibility,
CollectiblesVisibility,
} from './models';
import { changeLanguage } from 'i18next';
import { isTokenSupported } from '../tokens/utils/isTokenSupported';
Expand Down Expand Up @@ -67,6 +68,7 @@ describe('background/services/settings/SettingsService.ts', () => {
showTokensWithoutBalances: true,
theme: ThemeVariant.DARK,
tokensVisibility: {},
collectiblesVisibility: {},
analyticsConsent: AnalyticsConsent.Denied,
language: Languages.DE,
};
Expand All @@ -76,6 +78,7 @@ describe('background/services/settings/SettingsService.ts', () => {
showTokensWithoutBalances: false,
theme: ThemeVariant.DARK,
tokensVisibility: {},
collectiblesVisibility: {},
analyticsConsent: AnalyticsConsent.Approved,
language: Languages.DE,
};
Expand Down Expand Up @@ -342,6 +345,27 @@ describe('background/services/settings/SettingsService.ts', () => {
});
});

describe('setCollectiblesVisibility', () => {
const visibility: CollectiblesVisibility = {
'0x00000': false,
};
it('should save the new value for collectible visibility properly', async () => {
const eventListener = jest.fn();
service.addListener(SettingsEvents.SETTINGS_UPDATED, eventListener);
await service.setCollectiblesVisibility(visibility);
expect(eventListener).toHaveBeenCalledWith({
...storedSettings,
collectiblesVisibility: visibility,
});
});

it('should emit only the language if it fails to save', async () => {
await expectToOnlyEmitLanguageAfterFailedOperation(async () => {
await service.setCollectiblesVisibility(visibility);
});
});
});

describe('setLanguage', () => {
it('should save the new value for language properly', async () => {
const eventListener = jest.fn();
Expand Down
10 changes: 10 additions & 0 deletions src/background/services/settings/SettingsService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import {
SettingsEvents,
SETTINGS_UNENCRYPTED_STORAGE_KEY,
TokensVisibility,
CollectiblesVisibility,
AnalyticsConsent,
} from './models';
import { SettingsState, SETTINGS_STORAGE_KEY, ThemeVariant } from './models';
Expand All @@ -25,6 +26,7 @@ const DEFAULT_SETTINGS_STATE: SettingsState = {
showTokensWithoutBalances: false,
theme: ThemeVariant.DARK,
tokensVisibility: {},
collectiblesVisibility: {},
analyticsConsent: AnalyticsConsent.Approved,
language: Languages.EN,
};
Expand Down Expand Up @@ -181,6 +183,14 @@ export class SettingsService implements OnStorageReady, OnLock {
});
}

async setCollectiblesVisibility(visibility: CollectiblesVisibility) {
const settings = await this.getSettings();
await this.saveSettings({
...settings,
collectiblesVisibility: visibility,
});
}

async setLanguage(language: Languages) {
changeLanguage(language);
const settings = await this.getSettings();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import { ExtensionRequest } from '@src/background/connections/extensionConnection/models';
import { ExtensionRequestHandler } from '@src/background/connections/models';
import { injectable } from 'tsyringe';
import { CollectiblesVisibility } from '../models';
import { SettingsService } from '../SettingsService';

type HandlerType = ExtensionRequestHandler<
ExtensionRequest.SETTINGS_UPDATE_COLLECTIBLES_VISIBILITY,
true,
[collectiblesVisibility: CollectiblesVisibility]
>;

@injectable()
export class UpdateCollectiblesVisibilityHandler implements HandlerType {
method = ExtensionRequest.SETTINGS_UPDATE_COLLECTIBLES_VISIBILITY as const;

constructor(private settingsService: SettingsService) {}

handle: HandlerType['handle'] = async ({ request }) => {
const [collectiblesVisibility] = request.params;

await this.settingsService.setCollectiblesVisibility(
collectiblesVisibility
);

return {
...request,
result: true,
};
};
}
5 changes: 5 additions & 0 deletions src/background/services/settings/models.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,10 @@ export type TokensVisibility = {
[key: string]: boolean;
};

export type CollectiblesVisibility = {
[key: string]: boolean;
};

export type AddCustomTokenData = {
token: EnsureDefined<NetworkContractToken, 'chainId'>;
};
Expand All @@ -53,6 +57,7 @@ export interface SettingsState {
showTokensWithoutBalances: boolean;
theme: ThemeVariant;
tokensVisibility: TokensVisibility;
collectiblesVisibility: CollectiblesVisibility;
analyticsConsent: AnalyticsConsent;
language: Languages;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ describe('background/services/storage/schemaMigrations/migrations/settings_v2',
showTokensWithoutBalances: false,
theme: ThemeVariant.DARK,
tokensVisibility: {},
collectiblesVisibility: {},
analyticsConsent: true,
language: Languages.EN,
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import {
Languages,
ThemeVariant,
TokensVisibility,
CollectiblesVisibility,
} from '@src/background/services/settings/models';
import { NetworkContractToken } from '@avalabs/core-chains-sdk';

Expand All @@ -16,6 +17,7 @@ type PreviousSchema = {
showTokensWithoutBalances?: boolean;
theme?: ThemeVariant;
tokensVisibility?: TokensVisibility;
collectiblesVisibility?: CollectiblesVisibility;
analyticsConsent?: boolean;
language?: Languages;
};
Expand Down
36 changes: 36 additions & 0 deletions src/contexts/SettingsProvider.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { ExtensionRequest } from '@src/background/connections/extensionConnectio
import {
TokenType,
TokenWithBalance,
NftTokenWithBalance,
} from '@src/background/services/balances/models';
import { LockWalletHandler } from '@src/background/services/lock/handlers/lockWallet';
import { settingsUpdatedEventListener } from '@src/background/services/settings/events/listeners';
Expand All @@ -12,6 +13,7 @@ import { UpdateCurrencyHandler } from '@src/background/services/settings/handler
import { UpdateShowNoBalanceHandler } from '@src/background/services/settings/handlers/updateShowTokensNoBalance';
import { UpdateThemeHandler } from '@src/background/services/settings/handlers/updateTheme';
import { UpdateTokensVisiblityHandler } from '@src/background/services/settings/handlers/updateTokensVisibility';
import { UpdateCollectiblesVisibilityHandler } from '@src/background/services/settings/handlers/updateCollectiblesVisibility';
import {
Languages,
SettingsState,
Expand Down Expand Up @@ -40,6 +42,10 @@ type SettingsFromProvider = SettingsState & {
toggleShowTokensWithoutBalanceSetting(): Promise<true>;
toggleTokenVisibility(token: TokenWithBalance): Promise<true | undefined>;
getTokenVisibility(token: TokenWithBalance): boolean;
toggleCollectibleVisibility(
token: NftTokenWithBalance
): Promise<true | undefined>;
getCollectibleVisibility(token: NftTokenWithBalance): boolean;
updateTheme(theme: ThemeVariant): Promise<boolean>;
currencyFormatter(value: number): string;
setAnalyticsConsent(consent: boolean): Promise<boolean>;
Expand Down Expand Up @@ -139,6 +145,34 @@ export function SettingsContextProvider({ children }: { children: any }) {
[settings?.tokensVisibility]
);

async function toggleCollectibleVisibility(nft: NftTokenWithBalance) {
const key = nft.address;
const collectiblesVisibility = settings?.collectiblesVisibility ?? {};
return request<UpdateCollectiblesVisibilityHandler>({
method: ExtensionRequest.SETTINGS_UPDATE_COLLECTIBLES_VISIBILITY,
params: [
{
...collectiblesVisibility,
[key]:
collectiblesVisibility[key] !== undefined
? !collectiblesVisibility[key]
: false,
},
],
});
}

const getCollectibleVisibility = useCallback(
(nft: NftTokenWithBalance) => {
const key = nft.address;
const collectiblesVisibility = settings?.collectiblesVisibility ?? {};
return (
collectiblesVisibility[key] || collectiblesVisibility[key] === undefined
);
},
[settings?.collectiblesVisibility]
);

function updateTheme(theme: ThemeVariant) {
return request<UpdateThemeHandler>({
method: ExtensionRequest.SETTINGS_UPDATE_THEME,
Expand Down Expand Up @@ -170,6 +204,8 @@ export function SettingsContextProvider({ children }: { children: any }) {
toggleShowTokensWithoutBalanceSetting,
getTokenVisibility,
toggleTokenVisibility,
getCollectibleVisibility,
toggleCollectibleVisibility,
updateTheme,
currencyFormatter,
setAnalyticsConsent,
Expand Down
11 changes: 11 additions & 0 deletions src/hooks/useIsFunctionAvailable.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ export enum FunctionNames {
FEATURE = 'Feature', // Default when function name is unknown or not included
KEYSTONE = 'Keystone',
MANAGE_TOKEN = 'ManageTokens',
MANAGE_COLLECTIBLES = 'ManageCollectibles',
RECEIVE = 'Receive',
SEND = 'Send',
SWAP = 'Swap',
Expand Down Expand Up @@ -114,6 +115,16 @@ const disabledFeatures: Record<string, BlacklistConfig> = {
],
complexChecks: [],
},
ManageCollectibles: {
networks: [
ChainId.BITCOIN,
ChainId.AVALANCHE_P,
ChainId.AVALANCHE_TEST_P,
ChainId.AVALANCHE_X,
ChainId.AVALANCHE_TEST_X,
],
complexChecks: [],
},
Receive: {
networks: [],
complexChecks: [
Expand Down
1 change: 1 addition & 0 deletions src/localization/locales/en/translation.json
Original file line number Diff line number Diff line change
Expand Up @@ -468,6 +468,7 @@
"Malicious Application": "Malicious Application",
"Manage": "Manage",
"Manage Accounts": "Manage Accounts",
"Manage Collectibles": "Manage Collectibles",
"Manage Networks": "Manage Networks",
"Manage Tokens": "Manage Tokens",
"Manually Create New Wallet": "Manually Create New Wallet",
Expand Down
Loading

0 comments on commit 09373dc

Please sign in to comment.