diff --git a/packages/desktop-client/package.json b/packages/desktop-client/package.json index 06cac92b99829e9ca7a5aaeb25eb0975c63dc649..4aced71c86cee73f8e8e4cc5eed4c40d95e0ae12 100644 --- a/packages/desktop-client/package.json +++ b/packages/desktop-client/package.json @@ -6,7 +6,6 @@ "build" ], "devDependencies": { - "@jlongster/lively": "0.0.4", "@juggle/resize-observer": "^3.1.2", "@playwright/test": "^1.29.1", "@reach/listbox": "^0.11.2", diff --git a/packages/desktop-client/src/components/autocomplete/Autocomplete.js b/packages/desktop-client/src/components/autocomplete/Autocomplete.js index fee1ea234d470956293f9c9aecd5e0eb2b0dd91b..975c9ac4d532fc535a9e04aa0266fbab945271aa 100644 --- a/packages/desktop-client/src/components/autocomplete/Autocomplete.js +++ b/packages/desktop-client/src/components/autocomplete/Autocomplete.js @@ -1,13 +1,15 @@ import React, { useState, useRef, useEffect } from 'react'; -import lively from '@jlongster/lively'; import Downshift from 'downshift'; import { css } from 'glamor'; +import usePrevious from '../../hooks/usePrevious'; import Remove from '../../icons/v2/Remove'; import { colors } from '../../style'; import { View, Input, Tooltip, Button } from '../common'; +const inst = {}; + function findItem(strict, suggestions, value) { if (strict) { let idx = suggestions.findIndex(item => item.id === value); @@ -146,13 +148,11 @@ function onInputValueChange( props: { suggestions, onUpdate, - multi, highlightFirst, strict, filterSuggestions = defaultFilterSuggestions, getHighlightedIndex, }, - state: { isOpen }, }, value, changes, @@ -215,7 +215,7 @@ function onInputValueChange( } } -function onStateChange({ props, state, inst }, changes, stateAndHelpers) { +function onStateChange({ props, state }, changes) { if ( props.tableBehavior && changes.type === Downshift.stateChangeTypes.mouseUp @@ -259,7 +259,7 @@ function onStateChange({ props, state, inst }, changes, stateAndHelpers) { } function onSelect( - { props: { onSelect, clearAfterSelect, suggestions }, inst }, + { props: { onSelect, clearAfterSelect, suggestions } }, item, ) { if (onSelect) { @@ -280,10 +280,10 @@ function onSelect( onSelect(getItemId(item)); }, 0); } - return onSelectAfter(suggestions, clearAfterSelect, inst); + return onSelectAfter(suggestions, clearAfterSelect); } -function onSelectAfter(suggestions, clearAfterSelect, inst) { +function onSelectAfter(suggestions, clearAfterSelect) { if (clearAfterSelect) { return { value: '', @@ -291,9 +291,9 @@ function onSelectAfter(suggestions, clearAfterSelect, inst) { highlightedIndex: null, filteredSuggestions: suggestions, }; - } else if (inst.input) { - inst.input.setSelectionRange(0, 10000); } + + return { isOpen: false }; } function onChange({ props: { inputProps } }, e) { @@ -314,16 +314,7 @@ function onKeyDown( shouldSaveFromKey = defaultShouldSaveFromKey, strict, }, - state: { - selectedItem, - filteredSuggestions, - highlightedIndex, - originalItem, - isNulled, - isOpen, - value, - }, - inst, + state: { highlightedIndex, originalItem, isOpen, value }, }, e, ) { @@ -348,7 +339,7 @@ function onKeyDown( // Handle it ourselves e.stopPropagation(); onSelect(value); - return onSelectAfter(suggestions, clearAfterSelect, inst); + return onSelectAfter(suggestions, clearAfterSelect); } else { // No highlighted item, still allow the table to save the item // as `null`, even though we're allowing the table to move @@ -414,7 +405,7 @@ function defaultShouldSaveFromKey(e) { return e.code === 'Enter'; } -function onFocus({ inst, props: { inputProps = {}, openOnFocus = true } }, e) { +function onFocus({ props: { inputProps = {}, openOnFocus = true } }, e) { inputProps.onFocus && inputProps.onFocus(e); if (openOnFocus) { @@ -422,7 +413,7 @@ function onFocus({ inst, props: { inputProps = {}, openOnFocus = true } }, e) { } } -function onBlur({ inst, props, state: { selectedItem } }, e) { +function onBlur({ props, state: { selectedItem } }, e) { let { inputProps = {}, onSelect } = props; e.preventDownshiftDefault = true; @@ -454,26 +445,48 @@ function defaultItemToString(item) { return item ? getItemName(item) : ''; } -function _SingleAutocomplete({ - props: { +function SingleAutocomplete(props) { + const [curState, setState] = React.useState(() => getInitialState({ props })); + const { value, selectedItem, filteredSuggestions, highlightedIndex, isOpen } = + curState; + + const prevProps = usePrevious(props); + React.useEffect(() => { + if (!prevProps) return; + + const newState = componentWillReceiveProps( + { props: prevProps, state: curState }, + props, + ); + + if (newState) { + setState(Object.assign({}, curState, newState)); + } + }, [props, prevProps]); + + const updater = + operation => + (...arg) => { + const newState = Object.assign( + {}, + curState, + operation({ props, state: curState }, ...arg) || {}, + ); + setState(newState); + }; + + const { focused, embedded, containerProps, inputProps, - children, suggestions, tooltipStyle, - onItemClick, - strict, tooltipProps, renderInput = defaultRenderInput, renderItems = defaultRenderItems, itemToString = defaultItemToString, - }, - state: { value, selectedItem, filteredSuggestions, highlightedIndex, isOpen }, - updater, - inst, -}) { + } = props; const filtered = filteredSuggestions || suggestions; return ( @@ -490,10 +503,8 @@ function _SingleAutocomplete({ {({ getInputProps, getItemProps, - getRootProps, isOpen, inputValue, - selectedItem, highlightedIndex, }) => ( // Super annoying but it works best to return a div so we @@ -551,11 +562,6 @@ function _SingleAutocomplete({ ); } -const SingleAutocomplete = lively(_SingleAutocomplete, { - getInitialState, - componentWillReceiveProps, -}); - function MultiItem({ name, onRemove }) { return ( <View diff --git a/packages/desktop-client/src/hooks/useFeatureFlag.ts b/packages/desktop-client/src/hooks/useFeatureFlag.ts index d6e0d17e59e6c9328d32fc7ec715f733e27ba7a0..c379d5016b6a2b9cf55017f5068dcce4c37b8d12 100644 --- a/packages/desktop-client/src/hooks/useFeatureFlag.ts +++ b/packages/desktop-client/src/hooks/useFeatureFlag.ts @@ -1,7 +1,7 @@ import { useSelector } from 'react-redux'; const DEFAULT_FEATURE_FLAG_STATE: Record<string, boolean> = { - newAutocomplete: true, + newAutocomplete: false, syncAccount: false, goalTemplatesEnabled: false, }; diff --git a/upcoming-release-notes/916.md b/upcoming-release-notes/916.md new file mode 100644 index 0000000000000000000000000000000000000000..f44ac5079298e7352148be8c70fce36d6c69b068 --- /dev/null +++ b/upcoming-release-notes/916.md @@ -0,0 +1,6 @@ +--- +category: Maintenance +authors: [MatissJanis] +--- + +Remove `@jlongster/lively` dependency; refactor old autocomplete to not use it any more; disable new autocomplete diff --git a/yarn.lock b/yarn.lock index 1abbe8c90b9b50e612726835d1d850be487b2479..1dbedaa88fef6b0efc658f43a9643072ccd7b65b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -55,7 +55,6 @@ __metadata: version: 0.0.0-use.local resolution: "@actual-app/web@workspace:packages/desktop-client" dependencies: - "@jlongster/lively": 0.0.4 "@juggle/resize-observer": ^3.1.2 "@playwright/test": ^1.29.1 "@reach/listbox": ^0.11.2 @@ -2523,15 +2522,6 @@ __metadata: languageName: node linkType: hard -"@jlongster/lively@npm:0.0.4": - version: 0.0.4 - resolution: "@jlongster/lively@npm:0.0.4" - dependencies: - prop-types: ^15.6.0 - checksum: 1984cc66356da110cc7e6496c8b6c9bbfa0f20f94052e5131959a10ee63b2608f90a4e75549a27947c6f2a4ca580eaeb66d3eda5b7ca40b7c055ee76bb573b81 - languageName: node - linkType: hard - "@jlongster/sql.js@npm:^1.6.7": version: 1.6.7 resolution: "@jlongster/sql.js@npm:1.6.7"