Skip to content

Commit f975aeb

Browse files
authored
Merge pull request #152 from 1Hive/keep-changes-on-close
Keep changes on close
2 parents f48c966 + b21e1bf commit f975aeb

File tree

8 files changed

+130
-80
lines changed

8 files changed

+130
-80
lines changed

packages/react-app/src/components/field-input/address-field-input.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import { FieldInput } from './field-input';
99

1010
const TextInputStyled = styled(TextInput)`
1111
height: 40px;
12-
width: 380px;
12+
width: 370px;
1313
border-radius: 3px 0 0 3px;
1414
`;
1515

packages/react-app/src/components/field-input/amount-field-input.tsx

Lines changed: 51 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,10 @@
1-
import { TextInput, TokenBadge, _AutoComplete as AutoComplete, Tag } from '@1hive/1hive-ui';
1+
import {
2+
TextInput,
3+
TokenBadge,
4+
_AutoComplete as AutoComplete,
5+
Tag,
6+
IconEdit,
7+
} from '@1hive/1hive-ui';
28
import { parseUnits } from 'ethers/lib/utils';
39
import { connect } from 'formik';
410
import { noop } from 'lodash-es';
@@ -53,6 +59,11 @@ const AmountTokenWrapperStyled = styled.div`
5359
${(props: any) => (props.wide ? 'width:100%;' : '')}
5460
`;
5561

62+
const IconEditStyled = styled(IconEdit)`
63+
cursor: pointer;
64+
padding-left: ${GUpx()};
65+
`;
66+
5667
// #endregion
5768

5869
type Props = {
@@ -70,6 +81,7 @@ type Props = {
7081
maxDecimals?: number;
7182
disabled?: boolean;
7283
wide?: boolean;
84+
tokenEditable?: boolean;
7385
};
7486

7587
function AmountFieldInput({
@@ -87,35 +99,29 @@ function AmountFieldInput({
8799
maxDecimals,
88100
disabled = false,
89101
wide = false,
102+
tokenEditable = false,
90103
}: Props) {
91-
const { defaultToken, type } = getNetwork();
104+
const { type } = getNetwork();
92105
const [decimalsCount, setDecimalsCount] = useState(maxDecimals);
93106
const [tokens, setTokens] = useState<TokenModel[]>([]);
94107
const [searchTerm, setSearchTerm] = useState<string>();
95108
const [amount, setAmount] = useState<number | undefined>(value?.parsedAmount ?? 0);
96-
const [token, setToken] = useState<TokenModel>(value?.token ?? defaultToken);
109+
const [token, setToken] = useState<TokenModel | undefined>(value?.token);
97110
const [availableTokens, setAvailableTokens] = useState<TokenModel[]>([]);
98111
const { walletAddress } = useWallet();
99112

100113
const autoCompleteRef: React.Ref<any> = useRef(null);
101114

102115
useEffect(() => {
103-
const fetchAvailableTokens = async () => {
104-
const networkDefaultTokens = (NETWORK_TOKENS[type] as TokenModel[]) ?? [];
105-
const questsUsedTokens = await fetchRewardTokens();
106-
setAvailableTokens(
107-
arrayDistinctBy([...networkDefaultTokens, ...questsUsedTokens], (x) => x.token),
116+
if (!token)
117+
document.addEventListener(
118+
'focusin',
119+
() => {
120+
if (walletAddress && isEdit && tokenEditable) fetchAvailableTokens();
121+
},
122+
true,
108123
);
109-
};
110-
111-
document.addEventListener(
112-
'focusin',
113-
() => {
114-
if (walletAddress && isEdit && !value?.token) fetchAvailableTokens();
115-
},
116-
true,
117-
);
118-
}, [walletAddress, document.activeElement]);
124+
}, [walletAddress, isEdit, tokenEditable, token]);
119125

120126
useEffect(() => {
121127
if (availableTokens.length) {
@@ -146,31 +152,46 @@ function AmountFieldInput({
146152

147153
useEffect(() => {
148154
setAmount(value?.parsedAmount ?? 0);
149-
setToken(value?.token ?? defaultToken);
155+
setToken(value?.token);
150156
}, [value]);
151157

158+
const fetchAvailableTokens = async () => {
159+
const networkDefaultTokens = (NETWORK_TOKENS[type] as TokenModel[]) ?? [];
160+
const questsUsedTokens = await fetchRewardTokens();
161+
setAvailableTokens(
162+
arrayDistinctBy([...networkDefaultTokens, ...questsUsedTokens], (x) => x.token),
163+
);
164+
};
165+
152166
const onAmountChange = (e: any) => {
153167
const newAmount = e.target.value;
154168
setAmount(newAmount);
155169
if (token && e.target.value !== '') {
156-
const nextValue = {
170+
applyChanges({
157171
token: {
158172
...token,
159173
amount: parseUnits(newAmount.toString(), token.decimals).toString(),
160174
},
161175
parsedAmount: +newAmount,
162-
};
163-
if (formik) formik.setFieldValue(id, nextValue);
164-
else onChange(nextValue);
176+
});
165177
}
166178
};
167179

168180
const onTokenChange = (i: number) => {
169181
const newToken = tokens[i];
170182
autoCompleteRef.current.value = newToken.symbol;
171183
setSearchTerm(undefined);
172-
setToken(newToken);
173-
const nextValue = { token: newToken, parsedAmount: amount };
184+
applyChanges({ token: newToken, parsedAmount: amount });
185+
};
186+
187+
const onTokenEditClick = () => {
188+
fetchAvailableTokens();
189+
applyChanges({ token: undefined, parsedAmount: amount });
190+
};
191+
192+
const applyChanges = (nextValue: Partial<TokenAmountModel>) => {
193+
setToken(nextValue.token);
194+
setAmount(nextValue.parsedAmount);
174195
if (formik) formik.setFieldValue(id, nextValue);
175196
else onChange(nextValue);
176197
};
@@ -205,12 +226,8 @@ function AmountFieldInput({
205226
)}
206227
</Outset>
207228
)}
208-
{value?.token.token ? (
209-
<TokenBadgeStyled
210-
symbol={value.token.symbol}
211-
address={value.token.token}
212-
networkType="private"
213-
/>
229+
{token?.token ? (
230+
<TokenBadgeStyled symbol={token?.symbol} address={token?.token} networkType="private" />
214231
) : (
215232
<AutoCompleteWrapperStyled>
216233
<AutoComplete
@@ -232,6 +249,9 @@ function AmountFieldInput({
232249
/>
233250
</AutoCompleteWrapperStyled>
234251
)}
252+
{tokenEditable && isEdit && token && (
253+
<IconEditStyled onClick={onTokenEditClick} size="medium" />
254+
)}
235255
</AmountTokenWrapperStyled>
236256
)}
237257
</FieldInput>

packages/react-app/src/components/field-input/date-field-input.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ const InputStyled = styled.input`
1515
background-color: ${({ background }: any) => background};
1616
height: 40px;
1717
padding: ${GUpx()};
18+
font-size: 14px;
1819
&:focus-visible {
1920
border: 1px solid ${(props: any) => props.focusBorderColor};
2021
outline: none;

packages/react-app/src/components/modals/quest-modal.tsx

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
import { Button, IconPlus } from '@1hive/1hive-ui';
22
import { noop } from 'lodash-es';
33
import { useEffect, useState } from 'react';
4-
import { ENUM_QUEST_VIEW_MODE } from 'src/constants';
4+
import { ENUM_QUEST_STATE, ENUM_QUEST_VIEW_MODE } from 'src/constants';
55
import { QuestModel } from 'src/models/quest.model';
66
import { GUpx } from 'src/utils/css.util';
77
import styled from 'styled-components';
88
import * as QuestService from 'src/services/quest.service';
9+
import { IN_A_WEEK_IN_MS } from 'src/utils/date.utils';
910
import Quest from '../quest';
1011
import ModalBase, { ModalCallback } from './modal-base';
1112
import { useQuestsContext } from '../../contexts/quests.context';
@@ -32,7 +33,12 @@ export default function QuestModal({
3233
const [opened, setOpened] = useState(false);
3334
const [buttonLabel, setButtonLabel] = useState('');
3435
const { setNewQuest } = useQuestsContext();
35-
36+
const [questData, setQuestData] = useState(
37+
data ?? {
38+
expireTimeMs: IN_A_WEEK_IN_MS + 24 * 36000,
39+
state: ENUM_QUEST_STATE.Draft,
40+
},
41+
);
3642
const onOpenButtonClick = () => {
3743
setOpened(true);
3844
};
@@ -99,7 +105,11 @@ export default function QuestModal({
99105
isOpen={opened}
100106
onClose={() => closeModal(false)}
101107
>
102-
<Quest questMode={questMode} data={data} onSave={(x) => fetchNewQuest(x)} />
108+
<Quest
109+
questMode={questMode}
110+
dataState={{ questData, setQuestData }}
111+
onSave={(x) => fetchNewQuest(x)}
112+
/>
103113
</ModalBase>
104114
);
105115
}

0 commit comments

Comments
 (0)