Compare commits
1 Commits
main
...
validation
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c0a00acdc6 |
@ -8,5 +8,5 @@ export const AVAILABLE_ENVIRONMENTS =
|
|||||||
|
|
||||||
export const CURRENT_ABACUS_DEPLOYMENT = import.meta.env.MODE === 'production' ? 'TESTNET' : 'DEV';
|
export const CURRENT_ABACUS_DEPLOYMENT = import.meta.env.MODE === 'production' ? 'TESTNET' : 'DEV';
|
||||||
export const ENVIRONMENT_CONFIG_MAP = environments.environments;
|
export const ENVIRONMENT_CONFIG_MAP = environments.environments;
|
||||||
export type DydxNetwork = keyof typeof ENVIRONMENT_CONFIG_MAP;
|
export type DydxNetwork = (typeof AVAILABLE_ENVIRONMENTS.environments)[number];
|
||||||
export const DEFAULT_APP_ENVIRONMENT = AVAILABLE_ENVIRONMENTS.default as DydxNetwork;
|
export const DEFAULT_APP_ENVIRONMENT = AVAILABLE_ENVIRONMENTS.default as DydxNetwork;
|
||||||
|
|||||||
@ -10,6 +10,7 @@ import { useLocalStorage } from '@/hooks';
|
|||||||
import { initializeLocalization } from '@/state/app';
|
import { initializeLocalization } from '@/state/app';
|
||||||
|
|
||||||
import abacusStateManager from '@/lib/abacus';
|
import abacusStateManager from '@/lib/abacus';
|
||||||
|
import { validateAgainstAvailableEnvironments } from '@/lib/network';
|
||||||
|
|
||||||
export const useInitializePage = () => {
|
export const useInitializePage = () => {
|
||||||
const dispatch = useDispatch();
|
const dispatch = useDispatch();
|
||||||
@ -18,6 +19,7 @@ export const useInitializePage = () => {
|
|||||||
const [localStorageNetwork] = useLocalStorage<DydxNetwork>({
|
const [localStorageNetwork] = useLocalStorage<DydxNetwork>({
|
||||||
key: LocalStorageKey.SelectedNetwork,
|
key: LocalStorageKey.SelectedNetwork,
|
||||||
defaultValue: DEFAULT_APP_ENVIRONMENT,
|
defaultValue: DEFAULT_APP_ENVIRONMENT,
|
||||||
|
validateFn: validateAgainstAvailableEnvironments,
|
||||||
});
|
});
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
|||||||
@ -9,6 +9,8 @@ import { useAccounts, useLocalStorage } from '@/hooks';
|
|||||||
import { setSelectedNetwork } from '@/state/app';
|
import { setSelectedNetwork } from '@/state/app';
|
||||||
import { getSelectedNetwork } from '@/state/appSelectors';
|
import { getSelectedNetwork } from '@/state/appSelectors';
|
||||||
|
|
||||||
|
import { validateAgainstAvailableEnvironments } from '@/lib/network';
|
||||||
|
|
||||||
export const useSelectedNetwork = (): {
|
export const useSelectedNetwork = (): {
|
||||||
switchNetwork: (network: DydxNetwork) => void;
|
switchNetwork: (network: DydxNetwork) => void;
|
||||||
selectedNetwork: DydxNetwork;
|
selectedNetwork: DydxNetwork;
|
||||||
@ -20,6 +22,7 @@ export const useSelectedNetwork = (): {
|
|||||||
const [, setLocalStorageNetwork] = useLocalStorage<DydxNetwork>({
|
const [, setLocalStorageNetwork] = useLocalStorage<DydxNetwork>({
|
||||||
key: LocalStorageKey.SelectedNetwork,
|
key: LocalStorageKey.SelectedNetwork,
|
||||||
defaultValue: DEFAULT_APP_ENVIRONMENT,
|
defaultValue: DEFAULT_APP_ENVIRONMENT,
|
||||||
|
validateFn: validateAgainstAvailableEnvironments,
|
||||||
});
|
});
|
||||||
|
|
||||||
const switchNetwork = useCallback(
|
const switchNetwork = useCallback(
|
||||||
|
|||||||
38
src/lib/__test__/network.spec.ts
Normal file
38
src/lib/__test__/network.spec.ts
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
import environments from '../../../public/configs/env.json';
|
||||||
|
|
||||||
|
import { validateAgainstAvailableEnvironments } from '../network';
|
||||||
|
|
||||||
|
describe('validateAgainstAvailableEnvironments', () => {
|
||||||
|
describe('production environment', () => {
|
||||||
|
beforeAll(() => {
|
||||||
|
jest.mock('../../constants/networks', () => ({
|
||||||
|
AVAILABLE_ENVIRONMENTS: {
|
||||||
|
environments: [],
|
||||||
|
default: 'dydxprotocol-testnet-dydx',
|
||||||
|
}, //environments.deployments.TESTNET,
|
||||||
|
}));
|
||||||
|
});
|
||||||
|
|
||||||
|
afterAll(() => {
|
||||||
|
jest.unmock('../../constants/networks');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('Returns true for valid environments', () => {
|
||||||
|
expect(validateAgainstAvailableEnvironments('dydxprotocol-testnet-dydx')).toEqual(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('Returns false for invalid environments', () => {
|
||||||
|
expect(validateAgainstAvailableEnvironments('dydxprotocol-dev')).toEqual(false);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('staging environment', () => {
|
||||||
|
it('Returns true for valid environments', () => {
|
||||||
|
expect(validateAgainstAvailableEnvironments('dydxprotocol-dev')).toEqual(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('Returns false for invalid environments', () => {
|
||||||
|
expect(validateAgainstAvailableEnvironments('INVALID')).toEqual(false);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
@ -45,11 +45,15 @@ describe('getStringsForDateTimeDiff', () => {
|
|||||||
|
|
||||||
describe('getStringsForTimeInterval', () => {
|
describe('getStringsForTimeInterval', () => {
|
||||||
it.each([
|
it.each([
|
||||||
[Duration.fromObject({ months: 2 }), '2', 'MONTHS_ABBREVIATED'],
|
[Duration.fromObject({ months: 2 }), '2', 'APP.GENERAL.TIME_STRINGS.MONTHS_ABBREVIATED'],
|
||||||
[Duration.fromObject({ weeks: 3, days: 2 }), '3', 'WEEKS_ABBREVIATED'],
|
[Duration.fromObject({ weeks: 3, days: 2 }), '3', 'APP.GENERAL.TIME_STRINGS.WEEKS_ABBREVIATED'],
|
||||||
[Duration.fromObject({ days: 5, hours: 12 }), '6', 'DAYS_ABBREVIATED'],
|
[Duration.fromObject({ days: 5, hours: 12 }), '6', 'APP.GENERAL.TIME_STRINGS.DAYS_ABBREVIATED'],
|
||||||
[Duration.fromObject({ hours: 8, minutes: 30 }), '9', 'HOURS_ABBREVIATED'],
|
[
|
||||||
[Duration.fromObject({ minutes: 45 }), '45', 'MINUTES_ABBREVIATED'],
|
Duration.fromObject({ hours: 8, minutes: 30 }),
|
||||||
|
'9',
|
||||||
|
'APP.GENERAL.TIME_STRINGS.HOURS_ABBREVIATED',
|
||||||
|
],
|
||||||
|
[Duration.fromObject({ minutes: 45 }), '45', 'APP.GENERAL.TIME_STRINGS.MINUTES_ABBREVIATED'],
|
||||||
])(
|
])(
|
||||||
'returns the correct timeString and unitStringKey',
|
'returns the correct timeString and unitStringKey',
|
||||||
(timeInterval, expectedTimeString, expectedUnitStringKey) => {
|
(timeInterval, expectedTimeString, expectedUnitStringKey) => {
|
||||||
4
src/lib/network.ts
Normal file
4
src/lib/network.ts
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
import { AVAILABLE_ENVIRONMENTS, type DydxNetwork } from '@/constants/networks';
|
||||||
|
|
||||||
|
export const validateAgainstAvailableEnvironments = (value: DydxNetwork) =>
|
||||||
|
AVAILABLE_ENVIRONMENTS.environments.includes(value);
|
||||||
@ -10,7 +10,7 @@ export const getTimestamp = (value?: BigNumberish | null) =>
|
|||||||
? value
|
? value
|
||||||
: typeof value === 'string'
|
: typeof value === 'string'
|
||||||
? new Date(value).getTime()
|
? new Date(value).getTime()
|
||||||
: new Date(value.toString()).getTime()
|
: new Date(value.toNumber()).getTime()
|
||||||
: undefined;
|
: undefined;
|
||||||
|
|
||||||
export const getStringsForDateTimeDiff = (dateTime: DateTime) => {
|
export const getStringsForDateTimeDiff = (dateTime: DateTime) => {
|
||||||
@ -77,4 +77,4 @@ export const formatSeconds = (seconds: number) => {
|
|||||||
const minutes = Math.floor(seconds / 60);
|
const minutes = Math.floor(seconds / 60);
|
||||||
const remainingSeconds = seconds % 60;
|
const remainingSeconds = seconds % 60;
|
||||||
return `${getTimeString(minutes)}:${getTimeString(remainingSeconds)}`;
|
return `${getTimeString(minutes)}:${getTimeString(remainingSeconds)}`;
|
||||||
}
|
};
|
||||||
|
|||||||
@ -6,6 +6,7 @@ import { LocalStorageKey } from '@/constants/localStorage';
|
|||||||
import { DEFAULT_APP_ENVIRONMENT, type DydxNetwork } from '@/constants/networks';
|
import { DEFAULT_APP_ENVIRONMENT, type DydxNetwork } from '@/constants/networks';
|
||||||
|
|
||||||
import { getLocalStorage } from '@/lib/localStorage';
|
import { getLocalStorage } from '@/lib/localStorage';
|
||||||
|
import { validateAgainstAvailableEnvironments } from '@/lib/network';
|
||||||
|
|
||||||
export interface AppState {
|
export interface AppState {
|
||||||
apiState: AbacusApiState | undefined;
|
apiState: AbacusApiState | undefined;
|
||||||
@ -19,6 +20,7 @@ const initialState: AppState = {
|
|||||||
selectedNetwork: getLocalStorage({
|
selectedNetwork: getLocalStorage({
|
||||||
key: LocalStorageKey.SelectedNetwork,
|
key: LocalStorageKey.SelectedNetwork,
|
||||||
defaultValue: DEFAULT_APP_ENVIRONMENT,
|
defaultValue: DEFAULT_APP_ENVIRONMENT,
|
||||||
|
validateFn: validateAgainstAvailableEnvironments,
|
||||||
}),
|
}),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user