Fix/debounce company card onchange (#580)

* Add internal state and debounce for editable text card

* Use debounce for date fields too

* Update refetch

* Nit
This commit is contained in:
Emilien Chauvet
2023-07-10 18:19:46 -07:00
committed by GitHub
parent 03c6d1f19d
commit 1c8aaff39d
5 changed files with 30 additions and 6 deletions

View File

@ -83,7 +83,7 @@ export function Board({
useEffect(() => { useEffect(() => {
setBoardItems(initialItems); setBoardItems(initialItems);
}, [initialItems, setBoardItems]); }, [initialItems, setBoardItems, boardItems]);
useEffect(() => { useEffect(() => {
if (isInitialBoardLoaded) return; if (isInitialBoardLoaded) return;

View File

@ -1,4 +1,5 @@
import { useCallback, useState } from 'react'; import { useCallback, useState } from 'react';
import { getOperationName } from '@apollo/client/utilities';
import { useRecoilState } from 'recoil'; import { useRecoilState } from 'recoil';
import { v4 as uuidv4 } from 'uuid'; import { v4 as uuidv4 } from 'uuid';
@ -13,6 +14,7 @@ import {
useCreateOnePipelineProgressMutation, useCreateOnePipelineProgressMutation,
} from '~/generated/graphql'; } from '~/generated/graphql';
import { GET_PIPELINES } from '../queries';
import { boardColumnsState } from '../states/boardColumnsState'; import { boardColumnsState } from '../states/boardColumnsState';
import { boardItemsState } from '../states/boardItemsState'; import { boardItemsState } from '../states/boardItemsState';
@ -28,7 +30,9 @@ export function NewButton({ pipelineId, columnId }: OwnProps) {
const [board, setBoard] = useRecoilState(boardColumnsState); const [board, setBoard] = useRecoilState(boardColumnsState);
const [boardItems, setBoardItems] = useRecoilState(boardItemsState); const [boardItems, setBoardItems] = useRecoilState(boardItemsState);
const [createOnePipelineProgress] = useCreateOnePipelineProgressMutation(); const [createOnePipelineProgress] = useCreateOnePipelineProgressMutation({
refetchQueries: [getOperationName(GET_PIPELINES) ?? ''],
});
const onEntitySelect = useCallback( const onEntitySelect = useCallback(
async (company: Pick<Company, 'id' | 'name' | 'domainName'>) => { async (company: Pick<Company, 'id' | 'name' | 'domainName'>) => {
setIsCreatingCard(false); setIsCreatingCard(false);

View File

@ -21,6 +21,7 @@ type Items = { [key: string]: Item };
export function useBoard(pipelineId: string) { export function useBoard(pipelineId: string) {
const pipelines = useGetPipelinesQuery({ const pipelines = useGetPipelinesQuery({
variables: { where: { id: { equals: pipelineId } } }, variables: { where: { id: { equals: pipelineId } } },
skip: pipelineId === '',
}); });
const pipelineStages = pipelines.data?.findManyPipeline[0]?.pipelineStages; const pipelineStages = pipelines.data?.findManyPipeline[0]?.pipelineStages;
const orderedPipelineStages = pipelineStages const orderedPipelineStages = pipelineStages

View File

@ -1,5 +1,8 @@
import { useMemo, useState } from 'react';
import { BoardCardEditableField } from '@/ui/board-card-field/components/BoardCardEditableField'; import { BoardCardEditableField } from '@/ui/board-card-field/components/BoardCardEditableField';
import { InplaceInputDateDisplayMode } from '@/ui/inplace-inputs/components/InplaceInputDateDisplayMode'; import { InplaceInputDateDisplayMode } from '@/ui/inplace-inputs/components/InplaceInputDateDisplayMode';
import { debounce } from '@/utils/debounce';
import { BoardCardEditableFieldDateEditMode } from './BoardCardEditableFieldDateEditMode'; import { BoardCardEditableFieldDateEditMode } from './BoardCardEditableFieldDateEditMode';
@ -14,11 +17,21 @@ export function BoardCardEditableFieldDate({
onChange, onChange,
editModeHorizontalAlign, editModeHorizontalAlign,
}: OwnProps) { }: OwnProps) {
const [internalValue, setInternalValue] = useState(value);
const debouncedOnChange = useMemo(() => {
return debounce(onChange, 200);
}, [onChange]);
return ( return (
<BoardCardEditableField <BoardCardEditableField
editModeHorizontalAlign={editModeHorizontalAlign} editModeHorizontalAlign={editModeHorizontalAlign}
editModeContent={ editModeContent={
<BoardCardEditableFieldDateEditMode value={value} onChange={onChange} /> <BoardCardEditableFieldDateEditMode
value={internalValue}
onChange={(date: Date) => {
setInternalValue(date);
debouncedOnChange(date);
}}
/>
} }
nonEditModeContent={<InplaceInputDateDisplayMode value={value} />} nonEditModeContent={<InplaceInputDateDisplayMode value={value} />}
></BoardCardEditableField> ></BoardCardEditableField>

View File

@ -1,8 +1,9 @@
import { ChangeEvent } from 'react'; import { ChangeEvent, useMemo, useState } from 'react';
import { BoardCardEditableField } from '@/ui/board-card-field/components/BoardCardEditableField'; import { BoardCardEditableField } from '@/ui/board-card-field/components/BoardCardEditableField';
import { InplaceInputTextDisplayMode } from '@/ui/inplace-inputs/components/InplaceInputTextDisplayMode'; import { InplaceInputTextDisplayMode } from '@/ui/inplace-inputs/components/InplaceInputTextDisplayMode';
import { InplaceInputTextEditMode } from '@/ui/inplace-inputs/components/InplaceInputTextEditMode'; import { InplaceInputTextEditMode } from '@/ui/inplace-inputs/components/InplaceInputTextEditMode';
import { debounce } from '@/utils/debounce';
type OwnProps = { type OwnProps = {
placeholder?: string; placeholder?: string;
@ -17,6 +18,10 @@ export function BoardCardEditableFieldText({
onChange, onChange,
editModeHorizontalAlign, editModeHorizontalAlign,
}: OwnProps) { }: OwnProps) {
const [internalValue, setInternalValue] = useState(value);
const debouncedOnChange = useMemo(() => {
return debounce(onChange, 200);
}, [onChange]);
return ( return (
<BoardCardEditableField <BoardCardEditableField
editModeHorizontalAlign={editModeHorizontalAlign} editModeHorizontalAlign={editModeHorizontalAlign}
@ -24,9 +29,10 @@ export function BoardCardEditableFieldText({
<InplaceInputTextEditMode <InplaceInputTextEditMode
placeholder={placeholder || ''} placeholder={placeholder || ''}
autoFocus autoFocus
value={value} value={internalValue}
onChange={(event: ChangeEvent<HTMLInputElement>) => { onChange={(event: ChangeEvent<HTMLInputElement>) => {
onChange(event.target.value); setInternalValue(event.target.value);
debouncedOnChange(event.target.value);
}} }}
/> />
} }