Skip to content

Commit 59f2f57

Browse files
committed
Save/clear form state on unmount
1 parent 1efb23e commit 59f2f57

File tree

2 files changed

+39
-9
lines changed

2 files changed

+39
-9
lines changed

packages/core/src/js/feedback/FeedbackWidget.tsx

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ export class FeedbackWidget extends React.Component<FeedbackWidgetProps, Feedbac
3333
...defaultConfiguration
3434
}
3535

36+
private static _didSubmitForm: boolean = false;
3637
private static _savedState: Omit<FeedbackWidgetState, 'isVisible'> = {
3738
name: '',
3839
email: '',
@@ -103,7 +104,7 @@ export class FeedbackWidget extends React.Component<FeedbackWidgetProps, Feedbac
103104
onSubmitSuccess({ name: trimmedName, email: trimmedEmail, message: trimmedDescription, attachments: undefined });
104105
Alert.alert(text.successMessageText);
105106
onFormSubmitted();
106-
this._clearFormState();
107+
FeedbackWidget._didSubmitForm = true;
107108
} catch (error) {
108109
const errorString = `Feedback form submission failed: ${error}`;
109110
onSubmitError(new Error(errorString));
@@ -140,7 +141,7 @@ export class FeedbackWidget extends React.Component<FeedbackWidgetProps, Feedbac
140141
const imageUri = result.assets[0].uri;
141142
NATIVE.getDataFromUri(imageUri).then((data) => {
142143
if (data != null) {
143-
this.setState({ filename, attachment: data }, this._saveFormState);
144+
this.setState({ filename, attachment: data });
144145
} else {
145146
logger.error('Failed to read image data from uri:', imageUri);
146147
}
@@ -153,11 +154,23 @@ export class FeedbackWidget extends React.Component<FeedbackWidgetProps, Feedbac
153154
// Defaulting to the onAddScreenshot callback
154155
const { onAddScreenshot } = { ...defaultConfiguration, ...this.props };
155156
onAddScreenshot((filename: string, attachement: Uint8Array) => {
156-
this.setState({ filename, attachment: attachement }, this._saveFormState);
157+
this.setState({ filename, attachment: attachement });
157158
});
158159
}
159160
} else {
160-
this.setState({ filename: undefined, attachment: undefined }, this._saveFormState);
161+
this.setState({ filename: undefined, attachment: undefined });
162+
}
163+
}
164+
165+
/**
166+
* Save the state before unmounting the component.
167+
*/
168+
public componentWillUnmount(): void {
169+
if (FeedbackWidget._didSubmitForm) {
170+
this._clearFormState();
171+
FeedbackWidget._didSubmitForm = false;
172+
} else {
173+
this._saveFormState();
161174
}
162175
}
163176

@@ -210,7 +223,7 @@ export class FeedbackWidget extends React.Component<FeedbackWidgetProps, Feedbac
210223
style={styles.input}
211224
placeholder={text.namePlaceholder}
212225
value={name}
213-
onChangeText={(value) => this.setState({ name: value }, this._saveFormState)}
226+
onChangeText={(value) => this.setState({ name: value })}
214227
/>
215228
</>
216229
)}
@@ -226,7 +239,7 @@ export class FeedbackWidget extends React.Component<FeedbackWidgetProps, Feedbac
226239
placeholder={text.emailPlaceholder}
227240
keyboardType={'email-address' as KeyboardTypeOptions}
228241
value={email}
229-
onChangeText={(value) => this.setState({ email: value }, this._saveFormState)}
242+
onChangeText={(value) => this.setState({ email: value })}
230243
/>
231244
</>
232245
)}
@@ -239,7 +252,7 @@ export class FeedbackWidget extends React.Component<FeedbackWidgetProps, Feedbac
239252
style={[styles.input, styles.textArea]}
240253
placeholder={text.messagePlaceholder}
241254
value={description}
242-
onChangeText={(value) => this.setState({ description: value }, this._saveFormState)}
255+
onChangeText={(value) => this.setState({ description: value })}
243256
multiline
244257
/>
245258
{(config.enableScreenshot || imagePickerConfiguration.imagePicker) && (

packages/core/test/feedback/FeedbackWidget.test.tsx

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -355,14 +355,30 @@ describe('FeedbackWidget', () => {
355355
expect(mockOnFormClose).toHaveBeenCalled();
356356
});
357357

358+
it('onUnmount the input is saved and restored when the form reopens', async () => {
359+
const { getByPlaceholderText, unmount } = render(<FeedbackWidget {...defaultProps} />);
360+
361+
fireEvent.changeText(getByPlaceholderText(defaultProps.namePlaceholder), 'John Doe');
362+
fireEvent.changeText(getByPlaceholderText(defaultProps.emailPlaceholder), '[email protected]');
363+
fireEvent.changeText(getByPlaceholderText(defaultProps.messagePlaceholder), 'This is a feedback message.');
364+
365+
unmount();
366+
const { queryByPlaceholderText } = render(<FeedbackWidget {...defaultProps} />);
367+
368+
expect(queryByPlaceholderText(defaultProps.namePlaceholder).props.value).toBe('John Doe');
369+
expect(queryByPlaceholderText(defaultProps.emailPlaceholder).props.value).toBe('[email protected]');
370+
expect(queryByPlaceholderText(defaultProps.messagePlaceholder).props.value).toBe('This is a feedback message.');
371+
});
372+
358373
it('onCancel the input is saved and restored when the form reopens', async () => {
359-
const { getByPlaceholderText, getByText } = render(<FeedbackWidget {...defaultProps} />);
374+
const { getByPlaceholderText, getByText, unmount } = render(<FeedbackWidget {...defaultProps} />);
360375

361376
fireEvent.changeText(getByPlaceholderText(defaultProps.namePlaceholder), 'John Doe');
362377
fireEvent.changeText(getByPlaceholderText(defaultProps.emailPlaceholder), '[email protected]');
363378
fireEvent.changeText(getByPlaceholderText(defaultProps.messagePlaceholder), 'This is a feedback message.');
364379

365380
fireEvent.press(getByText(defaultProps.cancelButtonLabel));
381+
unmount();
366382
const { queryByPlaceholderText } = render(<FeedbackWidget {...defaultProps} />);
367383

368384
expect(queryByPlaceholderText(defaultProps.namePlaceholder).props.value).toBe('John Doe');
@@ -371,13 +387,14 @@ describe('FeedbackWidget', () => {
371387
});
372388

373389
it('onSubmit the saved input is cleared and not restored when the form reopens', async () => {
374-
const { getByPlaceholderText, getByText } = render(<FeedbackWidget {...defaultProps} />);
390+
const { getByPlaceholderText, getByText, unmount } = render(<FeedbackWidget {...defaultProps} />);
375391

376392
fireEvent.changeText(getByPlaceholderText(defaultProps.namePlaceholder), 'John Doe');
377393
fireEvent.changeText(getByPlaceholderText(defaultProps.emailPlaceholder), '[email protected]');
378394
fireEvent.changeText(getByPlaceholderText(defaultProps.messagePlaceholder), 'This is a feedback message.');
379395

380396
fireEvent.press(getByText(defaultProps.submitButtonLabel));
397+
unmount();
381398
const { queryByPlaceholderText } = render(<FeedbackWidget {...defaultProps} />);
382399

383400
expect(queryByPlaceholderText(defaultProps.namePlaceholder).props.value).toBe('Test User');

0 commit comments

Comments
 (0)