Fix table focus taking over auth and filter and sort (#478)
This commit is contained in:
@ -167,7 +167,7 @@ function DropdownButton({
|
|||||||
|
|
||||||
const onButtonClick = () => {
|
const onButtonClick = () => {
|
||||||
setIsUnfolded && setIsUnfolded(!isUnfolded);
|
setIsUnfolded && setIsUnfolded(!isUnfolded);
|
||||||
setCaptureHotkeyTypeInFocus(!isUnfolded);
|
setCaptureHotkeyTypeInFocus((isPreviousUnfolded) => !isPreviousUnfolded);
|
||||||
};
|
};
|
||||||
|
|
||||||
const onOutsideClick = () => {
|
const onOutsideClick = () => {
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
import { ChangeEvent, useCallback, useState } from 'react';
|
import { ChangeEvent, useCallback, useState } from 'react';
|
||||||
import styled from '@emotion/styled';
|
import styled from '@emotion/styled';
|
||||||
|
import { useRecoilState } from 'recoil';
|
||||||
|
|
||||||
import {
|
import {
|
||||||
FilterableFieldsType,
|
FilterableFieldsType,
|
||||||
@ -7,6 +8,7 @@ import {
|
|||||||
FilterOperandType,
|
FilterOperandType,
|
||||||
SelectedFilterType,
|
SelectedFilterType,
|
||||||
} from '@/filters-and-sorts/interfaces/filters/interface';
|
} from '@/filters-and-sorts/interfaces/filters/interface';
|
||||||
|
import { captureHotkeyTypeInFocusState } from '@/hotkeys/states/captureHotkeyTypeInFocusState';
|
||||||
import { SearchResultsType, useSearch } from '@/search/services/search';
|
import { SearchResultsType, useSearch } from '@/search/services/search';
|
||||||
import { humanReadableDate } from '@/utils/utils';
|
import { humanReadableDate } from '@/utils/utils';
|
||||||
|
|
||||||
@ -31,6 +33,9 @@ export const FilterDropdownButton = <TData extends FilterableFieldsType>({
|
|||||||
onFilterRemove,
|
onFilterRemove,
|
||||||
}: OwnProps<TData>) => {
|
}: OwnProps<TData>) => {
|
||||||
const [isUnfolded, setIsUnfolded] = useState(false);
|
const [isUnfolded, setIsUnfolded] = useState(false);
|
||||||
|
const [, setCaptureHotkeyTypeInFocus] = useRecoilState(
|
||||||
|
captureHotkeyTypeInFocusState,
|
||||||
|
);
|
||||||
|
|
||||||
const [selectedEntityId, setSelectedEntityId] = useState<string | null>(null);
|
const [selectedEntityId, setSelectedEntityId] = useState<string | null>(null);
|
||||||
|
|
||||||
@ -127,6 +132,7 @@ export const FilterDropdownButton = <TData extends FilterableFieldsType>({
|
|||||||
operand: selectedFilterOperand,
|
operand: selectedFilterOperand,
|
||||||
});
|
});
|
||||||
setIsUnfolded(false);
|
setIsUnfolded(false);
|
||||||
|
setCaptureHotkeyTypeInFocus(false);
|
||||||
setSelectedFilter(undefined);
|
setSelectedFilter(undefined);
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
|
|||||||
@ -1,9 +1,11 @@
|
|||||||
import { useCallback, useState } from 'react';
|
import { useCallback, useState } from 'react';
|
||||||
|
import { useRecoilState } from 'recoil';
|
||||||
|
|
||||||
import {
|
import {
|
||||||
SelectedSortType,
|
SelectedSortType,
|
||||||
SortType,
|
SortType,
|
||||||
} from '@/filters-and-sorts/interfaces/sorts/interface';
|
} from '@/filters-and-sorts/interfaces/sorts/interface';
|
||||||
|
import { captureHotkeyTypeInFocusState } from '@/hotkeys/states/captureHotkeyTypeInFocusState';
|
||||||
|
|
||||||
import DropdownButton from './DropdownButton';
|
import DropdownButton from './DropdownButton';
|
||||||
|
|
||||||
@ -21,6 +23,9 @@ export function SortDropdownButton<SortField>({
|
|||||||
onSortSelect,
|
onSortSelect,
|
||||||
}: OwnProps<SortField>) {
|
}: OwnProps<SortField>) {
|
||||||
const [isUnfolded, setIsUnfolded] = useState(false);
|
const [isUnfolded, setIsUnfolded] = useState(false);
|
||||||
|
const [, setCaptureHotkeyTypeInFocus] = useRecoilState(
|
||||||
|
captureHotkeyTypeInFocusState,
|
||||||
|
);
|
||||||
|
|
||||||
const [isOptionUnfolded, setIsOptionUnfolded] = useState(false);
|
const [isOptionUnfolded, setIsOptionUnfolded] = useState(false);
|
||||||
|
|
||||||
@ -36,8 +41,9 @@ export function SortDropdownButton<SortField>({
|
|||||||
|
|
||||||
const resetState = useCallback(() => {
|
const resetState = useCallback(() => {
|
||||||
setIsOptionUnfolded(false);
|
setIsOptionUnfolded(false);
|
||||||
|
setCaptureHotkeyTypeInFocus(false);
|
||||||
setSelectedSortDirection('asc');
|
setSelectedSortDirection('asc');
|
||||||
}, []);
|
}, [setCaptureHotkeyTypeInFocus]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<DropdownButton
|
<DropdownButton
|
||||||
@ -53,6 +59,7 @@ export function SortDropdownButton<SortField>({
|
|||||||
key={index}
|
key={index}
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
setSelectedSortDirection(option);
|
setSelectedSortDirection(option);
|
||||||
|
setCaptureHotkeyTypeInFocus(false);
|
||||||
setIsOptionUnfolded(false);
|
setIsOptionUnfolded(false);
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
@ -73,6 +80,7 @@ export function SortDropdownButton<SortField>({
|
|||||||
key={index + 1}
|
key={index + 1}
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
setIsUnfolded(false);
|
setIsUnfolded(false);
|
||||||
|
setCaptureHotkeyTypeInFocus(false);
|
||||||
onSortItemSelect(sort);
|
onSortItemSelect(sort);
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
|
|||||||
@ -12,6 +12,7 @@ import { Modal } from '@/auth/components/ui/Modal';
|
|||||||
import { Title } from '@/auth/components/ui/Title';
|
import { Title } from '@/auth/components/ui/Title';
|
||||||
import { authFlowUserEmailState } from '@/auth/states/authFlowUserEmailState';
|
import { authFlowUserEmailState } from '@/auth/states/authFlowUserEmailState';
|
||||||
import { isMockModeState } from '@/auth/states/isMockModeState';
|
import { isMockModeState } from '@/auth/states/isMockModeState';
|
||||||
|
import { captureHotkeyTypeInFocusState } from '@/hotkeys/states/captureHotkeyTypeInFocusState';
|
||||||
import { PrimaryButton } from '@/ui/components/buttons/PrimaryButton';
|
import { PrimaryButton } from '@/ui/components/buttons/PrimaryButton';
|
||||||
import { SecondaryButton } from '@/ui/components/buttons/SecondaryButton';
|
import { SecondaryButton } from '@/ui/components/buttons/SecondaryButton';
|
||||||
import { TextInput } from '@/ui/components/inputs/TextInput';
|
import { TextInput } from '@/ui/components/inputs/TextInput';
|
||||||
@ -25,6 +26,9 @@ const StyledContentContainer = styled.div`
|
|||||||
`;
|
`;
|
||||||
|
|
||||||
export function Index() {
|
export function Index() {
|
||||||
|
const [, setCaptureHotkeyTypeInFocus] = useRecoilState(
|
||||||
|
captureHotkeyTypeInFocusState,
|
||||||
|
);
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
const theme = useTheme();
|
const theme = useTheme();
|
||||||
const [, setMockMode] = useRecoilState(isMockModeState);
|
const [, setMockMode] = useRecoilState(isMockModeState);
|
||||||
@ -55,7 +59,8 @@ export function Index() {
|
|||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
setMockMode(true);
|
setMockMode(true);
|
||||||
}, [navigate, setMockMode]);
|
setCaptureHotkeyTypeInFocus(true);
|
||||||
|
}, [navigate, setMockMode, setCaptureHotkeyTypeInFocus]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
|
|||||||
@ -12,6 +12,7 @@ import { Title } from '@/auth/components/ui/Title';
|
|||||||
import { useAuth } from '@/auth/hooks/useAuth';
|
import { useAuth } from '@/auth/hooks/useAuth';
|
||||||
import { authFlowUserEmailState } from '@/auth/states/authFlowUserEmailState';
|
import { authFlowUserEmailState } from '@/auth/states/authFlowUserEmailState';
|
||||||
import { isMockModeState } from '@/auth/states/isMockModeState';
|
import { isMockModeState } from '@/auth/states/isMockModeState';
|
||||||
|
import { captureHotkeyTypeInFocusState } from '@/hotkeys/states/captureHotkeyTypeInFocusState';
|
||||||
import { PrimaryButton } from '@/ui/components/buttons/PrimaryButton';
|
import { PrimaryButton } from '@/ui/components/buttons/PrimaryButton';
|
||||||
import { TextInput } from '@/ui/components/inputs/TextInput';
|
import { TextInput } from '@/ui/components/inputs/TextInput';
|
||||||
import { Companies } from '~/pages/companies/Companies';
|
import { Companies } from '~/pages/companies/Companies';
|
||||||
@ -37,6 +38,9 @@ const StyledErrorContainer = styled.div`
|
|||||||
export function PasswordLogin() {
|
export function PasswordLogin() {
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
const [, setMockMode] = useRecoilState(isMockModeState);
|
const [, setMockMode] = useRecoilState(isMockModeState);
|
||||||
|
const [, setCaptureHotkeyTypeInFocus] = useRecoilState(
|
||||||
|
captureHotkeyTypeInFocusState,
|
||||||
|
);
|
||||||
|
|
||||||
const prefillPassword =
|
const prefillPassword =
|
||||||
process.env.NODE_ENV === 'development' ? 'applecar2025' : '';
|
process.env.NODE_ENV === 'development' ? 'applecar2025' : '';
|
||||||
@ -53,11 +57,19 @@ export function PasswordLogin() {
|
|||||||
try {
|
try {
|
||||||
await login(authFlowUserEmail, internalPassword);
|
await login(authFlowUserEmail, internalPassword);
|
||||||
setMockMode(false);
|
setMockMode(false);
|
||||||
|
setCaptureHotkeyTypeInFocus(false);
|
||||||
navigate('/');
|
navigate('/');
|
||||||
} catch (err: any) {
|
} catch (err: any) {
|
||||||
setFormError(err.message);
|
setFormError(err.message);
|
||||||
}
|
}
|
||||||
}, [authFlowUserEmail, internalPassword, login, navigate, setMockMode]);
|
}, [
|
||||||
|
authFlowUserEmail,
|
||||||
|
internalPassword,
|
||||||
|
login,
|
||||||
|
navigate,
|
||||||
|
setMockMode,
|
||||||
|
setCaptureHotkeyTypeInFocus,
|
||||||
|
]);
|
||||||
|
|
||||||
useHotkeys(
|
useHotkeys(
|
||||||
'enter',
|
'enter',
|
||||||
|
|||||||
Reference in New Issue
Block a user