Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add manage collectibles feature #25

Merged
merged 3 commits into from
Aug 13, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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 @@ -37,6 +37,10 @@ export type TokensVisibility = {
[key: string]: boolean;
};

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

export type AddCustomTokenData = {
token: EnsureDefined<NetworkContractToken, 'chainId'>;
};
Expand All @@ -51,6 +55,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: {
Copy link
Contributor Author

@ryanml ryanml Aug 9, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I need to confirm what these should be

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 @@ -467,6 +467,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
Loading