Skip to content

Commit f882e54

Browse files
authored
Merge e63ee11 into 2135c96
2 parents 2135c96 + e63ee11 commit f882e54

File tree

2 files changed

+89
-4
lines changed

2 files changed

+89
-4
lines changed

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

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

36+
private static _didSubmitForm: boolean = false;
37+
private static _savedState: Omit<FeedbackWidgetState, 'isVisible'> = {
38+
name: '',
39+
email: '',
40+
description: '',
41+
filename: undefined,
42+
attachment: undefined,
43+
};
44+
3645
public constructor(props: FeedbackWidgetProps) {
3746
super(props);
3847

@@ -45,9 +54,11 @@ export class FeedbackWidget extends React.Component<FeedbackWidgetProps, Feedbac
4554

4655
this.state = {
4756
isVisible: true,
48-
name: currentUser.useSentryUser.name,
49-
email: currentUser.useSentryUser.email,
50-
description: '',
57+
name: FeedbackWidget._savedState.name || currentUser.useSentryUser.name,
58+
email: FeedbackWidget._savedState.email || currentUser.useSentryUser.email,
59+
description: FeedbackWidget._savedState.description || '',
60+
filename: FeedbackWidget._savedState.filename || undefined,
61+
attachment: FeedbackWidget._savedState.attachment || undefined,
5162
};
5263
}
5364

@@ -92,9 +103,10 @@ export class FeedbackWidget extends React.Component<FeedbackWidgetProps, Feedbac
92103
this.setState({ isVisible: false });
93104
}
94105
captureFeedback(userFeedback, attachments ? { attachments } : undefined);
95-
onSubmitSuccess({ name: trimmedName, email: trimmedEmail, message: trimmedDescription, attachments: undefined });
106+
onSubmitSuccess({ name: trimmedName, email: trimmedEmail, message: trimmedDescription, attachments: attachments });
96107
Alert.alert(text.successMessageText);
97108
onFormSubmitted();
109+
FeedbackWidget._didSubmitForm = true;
98110
} catch (error) {
99111
const errorString = `Feedback form submission failed: ${error}`;
100112
onSubmitError(new Error(errorString));
@@ -152,6 +164,18 @@ export class FeedbackWidget extends React.Component<FeedbackWidgetProps, Feedbac
152164
}
153165
}
154166

167+
/**
168+
* Save the state before unmounting the component.
169+
*/
170+
public componentWillUnmount(): void {
171+
if (FeedbackWidget._didSubmitForm) {
172+
this._clearFormState();
173+
FeedbackWidget._didSubmitForm = false;
174+
} else {
175+
this._saveFormState();
176+
}
177+
}
178+
155179
/**
156180
* Renders the feedback form screen.
157181
*/
@@ -259,4 +283,18 @@ export class FeedbackWidget extends React.Component<FeedbackWidgetProps, Feedbac
259283
</SafeAreaView>
260284
);
261285
}
286+
287+
private _saveFormState = (): void => {
288+
FeedbackWidget._savedState = { ...this.state };
289+
};
290+
291+
private _clearFormState = (): void => {
292+
FeedbackWidget._savedState = {
293+
name: '',
294+
email: '',
295+
description: '',
296+
filename: undefined,
297+
attachment: undefined,
298+
};
299+
};
262300
}

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

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -354,4 +354,51 @@ describe('FeedbackWidget', () => {
354354

355355
expect(mockOnFormClose).toHaveBeenCalled();
356356
});
357+
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+
373+
it('onCancel the input is saved and restored when the form reopens', async () => {
374+
const { getByPlaceholderText, getByText, unmount } = render(<FeedbackWidget {...defaultProps} />);
375+
376+
fireEvent.changeText(getByPlaceholderText(defaultProps.namePlaceholder), 'John Doe');
377+
fireEvent.changeText(getByPlaceholderText(defaultProps.emailPlaceholder), '[email protected]');
378+
fireEvent.changeText(getByPlaceholderText(defaultProps.messagePlaceholder), 'This is a feedback message.');
379+
380+
fireEvent.press(getByText(defaultProps.cancelButtonLabel));
381+
unmount();
382+
const { queryByPlaceholderText } = render(<FeedbackWidget {...defaultProps} />);
383+
384+
expect(queryByPlaceholderText(defaultProps.namePlaceholder).props.value).toBe('John Doe');
385+
expect(queryByPlaceholderText(defaultProps.emailPlaceholder).props.value).toBe('[email protected]');
386+
expect(queryByPlaceholderText(defaultProps.messagePlaceholder).props.value).toBe('This is a feedback message.');
387+
});
388+
389+
it('onSubmit the saved input is cleared and not restored when the form reopens', async () => {
390+
const { getByPlaceholderText, getByText, unmount } = render(<FeedbackWidget {...defaultProps} />);
391+
392+
fireEvent.changeText(getByPlaceholderText(defaultProps.namePlaceholder), 'John Doe');
393+
fireEvent.changeText(getByPlaceholderText(defaultProps.emailPlaceholder), '[email protected]');
394+
fireEvent.changeText(getByPlaceholderText(defaultProps.messagePlaceholder), 'This is a feedback message.');
395+
396+
fireEvent.press(getByText(defaultProps.submitButtonLabel));
397+
unmount();
398+
const { queryByPlaceholderText } = render(<FeedbackWidget {...defaultProps} />);
399+
400+
expect(queryByPlaceholderText(defaultProps.namePlaceholder).props.value).toBe('Test User');
401+
expect(queryByPlaceholderText(defaultProps.emailPlaceholder).props.value).toBe('[email protected]');
402+
expect(queryByPlaceholderText(defaultProps.messagePlaceholder).props.value).toBe('');
403+
});
357404
});

0 commit comments

Comments
 (0)