dydx-v4-web/src/state/inputsSelectors.ts
James Jia - Test 4b86068d8f
Initial commit
2023-09-08 13:52:13 -07:00

114 lines
2.9 KiB
TypeScript

import { shallowEqual, useSelector } from 'react-redux';
import { createSelector } from 'reselect';
import type { RootState } from './_store';
/**
* @param state
* @returns TradeInputs
*/
export const getInputTradeData = (state: RootState) => state.inputs.tradeInputs;
/**
* @param state
* @returns Size data in TradeInputs
*/
export const getInputTradeSizeData = (state: RootState) => state.inputs.tradeInputs?.size;
/**
* @param state
* @returns AbacusOrderSide in TradeInputs
*/
export const getTradeSide = (state: RootState) => state.inputs.tradeInputs?.side;
/**
* @param state
* @returns TradeInputs options (config for what TradeInputFields to render)
*/
export const getInputTradeOptions = (state: RootState) => state.inputs.tradeInputs?.options;
/**
* @param state
* @returns ValidationErrors of the current Input type (Trade or Transfer)
*/
export const getInputErrors = (state: RootState) => state.inputs.inputErrors;
/**
* @param state
* @returns trade or closePosition transfer, depending on which form was last edited.
*/
export const getCurrentInput = (state: RootState) => state.inputs.current;
/**
* @param state
* @returns input errors for Trade
*/
export const getTradeInputErrors = (state: RootState) => {
const currentInput = state.inputs.current;
return currentInput === 'trade' ? getInputErrors(state) : [];
};
/**
* @param state
* @returns input errors for Transfer
*/
export const getTransferInputErrors = (state: RootState) => {
const currentInput = state.inputs.current;
return currentInput === 'transfer' ? getInputErrors(state) : [];
};
/**
* @param state
* @returns TransferInputs
*/
export const getTransferInputs = (state: RootState) => state.inputs.transferInputs;
/**
* @param state
* @returns ClosePositionInputs
*/
export const getInputClosePositionData = (state: RootState) => state.inputs.closePositionInputs;
/**
* @returns Data needed for the TradeForm (price, size, summary, input render options, and errors/input validation)
*/
export const useTradeFormData = () => {
return useSelector(
createSelector(
[getInputTradeData, getInputTradeOptions, getTradeInputErrors],
(tradeData, tradeOptions, tradeErrors) => {
const { price, size, summary } = tradeData || {};
const {
needsLimitPrice,
needsTrailingPercent,
needsTriggerPrice,
executionOptions,
needsGoodUntil,
needsPostOnly,
needsReduceOnly,
timeInForceOptions,
} = tradeOptions || {};
return {
price,
size,
summary,
needsLimitPrice,
needsTrailingPercent,
needsTriggerPrice,
executionOptions,
needsGoodUntil,
needsPostOnly,
needsReduceOnly,
timeInForceOptions,
tradeErrors,
};
}
),
shallowEqual
);
};