Skip to content

Commit bd5bd30

Browse files
authored
feat(feedback): Screenshot button error flow (#4757)
* Show an error if screenshot capture fails * Test error flow
1 parent 4610d7f commit bd5bd30

File tree

5 files changed

+23
-11
lines changed

5 files changed

+23
-11
lines changed

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

+5-1
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,11 @@ export class FeedbackWidget extends React.Component<FeedbackWidgetProps, Feedbac
257257
}
258258

259259
const screenshot = getCapturedScreenshot();
260-
if (screenshot) {
260+
if (screenshot === 'ErrorCapturingScreenshot') {
261+
setTimeout(async () => {
262+
feedbackAlertDialog(text.errorTitle, text.captureScreenshotError);
263+
}, 100);
264+
} else if (screenshot) {
261265
this._setCapturedScreenshot(screenshot);
262266
}
263267

packages/core/src/js/feedback/FeedbackWidget.types.ts

+5
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,11 @@ export interface FeedbackTextConfiguration {
159159
*/
160160
emailError?: string;
161161

162+
/**
163+
* The error message when the capture screenshot fails
164+
*/
165+
captureScreenshotError?: string;
166+
162167
/**
163168
* Message when there is a generic error
164169
*/

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

+5-5
Original file line numberDiff line numberDiff line change
@@ -8,26 +8,26 @@ import { defaultScreenshotButtonConfiguration } from './defaults';
88
import { defaultScreenshotButtonStyles } from './FeedbackWidget.styles';
99
import { getTheme } from './FeedbackWidget.theme';
1010
import type { ScreenshotButtonProps, ScreenshotButtonStyles, ScreenshotButtonTextConfiguration } from './FeedbackWidget.types';
11-
import { hideScreenshotButton, showFeedbackWidget, showScreenshotButton } from './FeedbackWidgetManager';
11+
import { hideScreenshotButton, showFeedbackWidget } from './FeedbackWidgetManager';
1212
import { screenshotIcon } from './icons';
1313
import { lazyLoadFeedbackIntegration } from './lazy';
1414

15-
let capturedScreenshot: Screenshot | undefined;
15+
let capturedScreenshot: Screenshot | 'ErrorCapturingScreenshot' | undefined;
1616

1717
const takeScreenshot = async (): Promise<void> => {
1818
hideScreenshotButton();
1919
setTimeout(async () => { // Delay capture to allow the button to hide
2020
const screenshots: Screenshot[] | null = await NATIVE.captureScreenshot();
2121
if (screenshots && screenshots.length > 0) {
2222
capturedScreenshot = screenshots[0];
23-
showFeedbackWidget();
2423
} else {
25-
showScreenshotButton();
24+
capturedScreenshot = 'ErrorCapturingScreenshot';
2625
}
26+
showFeedbackWidget();
2727
}, 100);
2828
};
2929

30-
export const getCapturedScreenshot = (): Screenshot | undefined => {
30+
export const getCapturedScreenshot = (): Screenshot | 'ErrorCapturingScreenshot' | undefined => {
3131
const screenshot = capturedScreenshot;
3232
capturedScreenshot = undefined;
3333
return screenshot;

packages/core/src/js/feedback/defaults.ts

+2
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ const TRIGGER_SCREENSHOT_LABEL = 'Take Screenshot';
1616
const ERROR_TITLE = 'Error';
1717
const FORM_ERROR = 'Please fill out all required fields.';
1818
const EMAIL_ERROR = 'Please enter a valid email address.';
19+
const CAPTURE_SCREENSHOT_ERROR = 'Error capturing screenshot. Please try again.';
1920
const SUCCESS_MESSAGE_TEXT = 'Thank you for your report!';
2021
const ADD_SCREENSHOT_LABEL = 'Add a screenshot';
2122
const CAPTURE_SCREENSHOT_LABEL = 'Take a screenshot';
@@ -79,6 +80,7 @@ export const defaultConfiguration: Partial<FeedbackWidgetProps> = {
7980
errorTitle: ERROR_TITLE,
8081
formError: FORM_ERROR,
8182
emailError: EMAIL_ERROR,
83+
captureScreenshotError: CAPTURE_SCREENSHOT_ERROR,
8284
successMessageText: SUCCESS_MESSAGE_TEXT,
8385
addScreenshotButtonLabel: ADD_SCREENSHOT_LABEL,
8486
removeScreenshotButtonLabel: REMOVE_SCREENSHOT_LABEL,

packages/core/test/feedback/ScreenshotButton.test.tsx

+6-5
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { getClient, setCurrentClient } from '@sentry/core';
22
import { fireEvent, render, waitFor } from '@testing-library/react-native';
33
import * as React from 'react';
4-
import { Text } from 'react-native';
4+
import { Alert, Text } from 'react-native';
55

66
import { FeedbackWidget } from '../../src/js/feedback/FeedbackWidget';
77
import type { ScreenshotButtonProps, ScreenshotButtonStyles } from '../../src/js/feedback/FeedbackWidget.types';
@@ -20,6 +20,8 @@ jest.mock('../../src/js/wrapper', () => ({
2020
},
2121
}));
2222

23+
jest.spyOn(Alert, 'alert');
24+
2325
const mockScreenshot: Screenshot = {
2426
filename: 'test-screenshot.png',
2527
contentType: 'image/png',
@@ -188,10 +190,10 @@ describe('ScreenshotButton', () => {
188190
});
189191
});
190192

191-
it('when the capture fails the capture button is still visible', async () => {
193+
it('when the capture fails an error message is shown', async () => {
192194
mockCaptureScreenshot.mockResolvedValue([]);
193195

194-
const { getByText, queryByText } = render(
196+
const { getByText } = render(
195197
<FeedbackWidgetProvider>
196198
<Text>App Components</Text>
197199
</FeedbackWidgetProvider>
@@ -213,8 +215,7 @@ describe('ScreenshotButton', () => {
213215
});
214216

215217
await waitFor(() => {
216-
const captureButton = queryByText('Take Screenshot');
217-
expect(captureButton).not.toBeNull();
218+
expect(Alert.alert).toHaveBeenCalledWith('Error', 'Error capturing screenshot. Please try again.');
218219
});
219220
});
220221
});

0 commit comments

Comments
 (0)