Skip to content

Commit 92e7a14

Browse files
authored
OCT-1488 Fix focus after each character in lock/unlock (#91)
1 parent 4965c91 commit 92e7a14

File tree

6 files changed

+36
-14
lines changed

6 files changed

+36
-14
lines changed

client/cypress/e2e/earn.cy.ts

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,22 @@ Object.values(viewports).forEach(({ device, viewportWidth, viewportHeight, isDes
8888
cy.get('[data-test=ModalGlmLock__overflow]').should('exist');
8989
});
9090

91+
it('Wallet connected: inputs allow to type multiple characters without focus problems', () => {
92+
/**
93+
* In EarnGlmLock there are multiple autofocus rules set.
94+
* This test checks if user is still able to type without any autofocus disruption.
95+
*/
96+
connectWallet();
97+
cy.get('[data-test=BoxGlmLock__Button]').click();
98+
cy.get('[data-test=ModalGlmLock]').should('be.visible');
99+
cy.get('[data-test=InputsCryptoFiat__InputText--crypto]').should('have.focus');
100+
cy.get('[data-test=InputsCryptoFiat__InputText--crypto]').clear().type('100');
101+
cy.get('[data-test=InputsCryptoFiat__InputText--crypto]').should('have.value', '100');
102+
cy.get('[data-test=EarnGlmLockTabs__tab--1]').click();
103+
cy.get('[data-test=InputsCryptoFiat__InputText--crypto]').clear().type('100');
104+
cy.get('[data-test=InputsCryptoFiat__InputText--crypto]').should('have.value', '100');
105+
});
106+
91107
it('Wallet connected: "ModalGlmLock" - changing tabs keep focus on first input', () => {
92108
connectWallet();
93109
cy.get('[data-test=BoxGlmLock__Button]').click();
@@ -160,7 +176,9 @@ Object.values(viewports).forEach(({ device, viewportWidth, viewportHeight, isDes
160176

161177
cy.get('[data-test=BoxGlmLock__Button]').click();
162178
cy.get('[data-test=EarnGlmLockTabs__tab--1]').click();
163-
cy.get('[data-test=InputsCryptoFiat__InputText--crypto]').clear().type(`${amountToUnlock}`);
179+
cy.get('[data-test=InputsCryptoFiat__InputText--crypto]')
180+
.clear()
181+
.type(`${amountToUnlock}`);
164182
cy.get('[data-test=GlmLockTabs__Button]').should('have.text', 'Unlock');
165183
cy.get('[data-test=GlmLockTabs__Button]').click();
166184
cy.get('[data-test=GlmLockTabs__Button]').should('have.text', 'Waiting for confirmation');

client/src/components/Earn/EarnGlmLock/EarnGlmLockTabs/EarnGlmLockTabs.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,7 @@ const EarnGlmLockTabs: FC<EarnGlmLockTabsProps> = ({
155155
)}
156156
</div>
157157
}
158+
mode={currentMode}
158159
onChange={onSetValue}
159160
onInputsFocusChange={onInputsFocusChange}
160161
/>

client/src/components/Earn/EarnGlmLock/EarnGlmLockTabsInputs/EarnGlmLockTabsInputs.tsx

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,14 @@ import EarnGlmLockTabsInputsProps from './types';
1616
const EarnGlmLockTabsInputs = forwardRef<HTMLInputElement, EarnGlmLockTabsInputsProps>(
1717
(
1818
{
19+
areInputsDisabled,
20+
cryptoCurrency,
21+
dataTest = 'InputsCryptoFiat',
1922
error,
20-
label,
2123
inputCryptoProps,
22-
cryptoCurrency,
24+
label,
25+
mode,
2326
onChange,
24-
areInputsDisabled,
25-
dataTest = 'InputsCryptoFiat',
2627
onInputsFocusChange = () => {},
2728
},
2829
ref,
@@ -42,9 +43,9 @@ const EarnGlmLockTabsInputs = forwardRef<HTMLInputElement, EarnGlmLockTabsInputs
4243
const isAnyInputFocused = useDeferredValue(isCryptoInputFocused || isFiatInputFocused);
4344

4445
const inputCryptoPropsLabel = isCryptoMainValueDisplay
45-
? { ...inputCryptoProps, error, label }
46+
? { ...inputCryptoProps, error, label, mode }
4647
: { ...inputCryptoProps, error };
47-
const inputFiatPropsLabel = isCryptoMainValueDisplay ? { error } : { error, label };
48+
const inputFiatPropsLabel = isCryptoMainValueDisplay ? { error } : { error, label, mode };
4849

4950
const cryptoFiatRatio = cryptoValues?.[cryptoCurrency][displayCurrency || 'usd'] || 1;
5051

@@ -124,7 +125,7 @@ const EarnGlmLockTabsInputs = forwardRef<HTMLInputElement, EarnGlmLockTabsInputs
124125
onFocus={() => setIsCryptoInputFocused(true)}
125126
placeholder="0.00"
126127
shouldAutoFocusAndSelect={isCryptoMainValueDisplay}
127-
shouldAutoFocusAndSelectOnLabelChange
128+
shouldAutoFocusAndSelectOnModeChange
128129
variant="simple"
129130
{...inputCryptoPropsLabel}
130131
/>
@@ -142,7 +143,7 @@ const EarnGlmLockTabsInputs = forwardRef<HTMLInputElement, EarnGlmLockTabsInputs
142143
onFocus={() => setIsFiatInputFocused(true)}
143144
placeholder="0.00"
144145
shouldAutoFocusAndSelect={!isCryptoMainValueDisplay}
145-
shouldAutoFocusAndSelectOnLabelChange
146+
shouldAutoFocusAndSelectOnModeChange
146147
suffix={displayCurrency.toUpperCase()}
147148
value={fiat}
148149
{...inputFiatPropsLabel}

client/src/components/Earn/EarnGlmLock/EarnGlmLockTabsInputs/types.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { CurrentMode } from 'components/Earn/EarnGlmLock/types';
12
import InputTextProps from 'components/ui/InputText/types';
23
import { CryptoCurrency } from 'types/cryptoCurrency';
34

@@ -13,6 +14,7 @@ export default interface EarnGlmLockTabsInputsProps {
1314
value: InputTextProps['value'];
1415
};
1516
label: InputTextProps['label'];
17+
mode: CurrentMode;
1618
onChange: (value: string) => void;
1719
onInputsFocusChange?: (isAnyInputFocused: boolean) => void;
1820
}

client/src/components/ui/InputText/InputText.tsx

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ const InputText = forwardRef<HTMLInputElement, InputTextProps>(
1919
isDisabled,
2020
isErrorInlineVisible = true,
2121
label,
22+
mode,
2223
onChange,
2324
onClear,
2425
suffix,
@@ -29,7 +30,7 @@ const InputText = forwardRef<HTMLInputElement, InputTextProps>(
2930
showLoader = false,
3031
dataTest = 'InputText',
3132
shouldAutoFocusAndSelect = true,
32-
shouldAutoFocusAndSelectOnLabelChange,
33+
shouldAutoFocusAndSelectOnModeChange,
3334
...rest
3435
},
3536
ref,
@@ -68,9 +69,7 @@ const InputText = forwardRef<HTMLInputElement, InputTextProps>(
6869
inputProps.ref,
6970
shouldAutoFocusAndSelect,
7071
// eslint-disable-next-line react-hooks/exhaustive-deps
71-
...(shouldAutoFocusAndSelectOnLabelChange
72-
? [shouldAutoFocusAndSelectOnLabelChange, label]
73-
: []),
72+
...(shouldAutoFocusAndSelectOnModeChange ? [shouldAutoFocusAndSelectOnModeChange, mode] : []),
7473
]);
7574

7675
return (

client/src/components/ui/InputText/types.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,15 @@ export default interface InputTextProps {
1313
isDisabled?: boolean;
1414
isErrorInlineVisible?: boolean;
1515
label?: string | ReactNode;
16+
mode?: string;
1617
name?: string;
1718
onBlur?: FocusEventHandler<HTMLInputElement>;
1819
onChange?: (event: ChangeEvent<HTMLInputElement>) => void;
1920
onClear?: () => void;
2021
onFocus?: FocusEventHandler<HTMLInputElement>;
2122
placeholder?: string;
2223
shouldAutoFocusAndSelect?: boolean;
23-
shouldAutoFocusAndSelectOnLabelChange?: boolean;
24+
shouldAutoFocusAndSelectOnModeChange?: boolean;
2425
showLoader?: boolean;
2526
suffix?: string;
2627
suffixClassName?: string;

0 commit comments

Comments
 (0)