Skip to content

Commit ce3b58a

Browse files
feat(feedback): Add warning when auto injected widget can't be shown (#4578)
1 parent cdc3945 commit ce3b58a

File tree

2 files changed

+52
-2
lines changed

2 files changed

+52
-2
lines changed

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

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,17 +22,33 @@ class FeedbackWidgetManager {
2222
this._setVisibility = setVisibility;
2323
}
2424

25+
/**
26+
* For testing purposes only.
27+
*/
28+
public static reset(): void {
29+
this._isVisible = false;
30+
this._setVisibility = undefined;
31+
}
32+
2533
public static show(): void {
2634
if (this._setVisibility) {
2735
this._isVisible = true;
2836
this._setVisibility(true);
37+
} else {
38+
// This message should be always shown otherwise it's not possible to use the widget.
39+
// eslint-disable-next-line no-console
40+
console.warn('[Sentry] FeedbackWidget requires `Sentry.wrap(RootComponent)` to be called before `showFeedbackWidget()`.');
2941
}
3042
}
3143

3244
public static hide(): void {
3345
if (this._setVisibility) {
3446
this._isVisible = false;
3547
this._setVisibility(false);
48+
} else {
49+
// This message should be always shown otherwise it's not possible to use the widget.
50+
// eslint-disable-next-line no-console
51+
console.warn('[Sentry] FeedbackWidget requires `Sentry.wrap(RootComponent)` before interacting with the widget.');
3652
}
3753
}
3854

@@ -211,4 +227,8 @@ const showFeedbackWidget = (): void => {
211227
FeedbackWidgetManager.show();
212228
};
213229

214-
export { showFeedbackWidget, FeedbackWidgetProvider };
230+
const resetFeedbackWidgetManager = (): void => {
231+
FeedbackWidgetManager.reset();
232+
};
233+
234+
export { showFeedbackWidget, FeedbackWidgetProvider, resetFeedbackWidgetManager };

packages/core/test/feedback/FeedbackWidgetManager.test.tsx

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,29 @@ import * as React from 'react';
44
import { Text } from 'react-native';
55

66
import { defaultConfiguration } from '../../src/js/feedback/defaults';
7-
import { FeedbackWidgetProvider, showFeedbackWidget } from '../../src/js/feedback/FeedbackWidgetManager';
7+
import { FeedbackWidgetProvider, resetFeedbackWidgetManager, showFeedbackWidget } from '../../src/js/feedback/FeedbackWidgetManager';
88
import { feedbackIntegration } from '../../src/js/feedback/integration';
99
import { isModalSupported } from '../../src/js/feedback/utils';
1010

1111
jest.mock('../../src/js/feedback/utils', () => ({
1212
isModalSupported: jest.fn(),
1313
}));
1414

15+
const consoleWarnSpy = jest.spyOn(console, 'warn');
16+
1517
const mockedIsModalSupported = isModalSupported as jest.MockedFunction<typeof isModalSupported>;
1618

1719
beforeEach(() => {
1820
logger.error = jest.fn();
1921
});
2022

2123
describe('FeedbackWidgetManager', () => {
24+
25+
beforeEach(() => {
26+
consoleWarnSpy.mockReset();
27+
resetFeedbackWidgetManager();
28+
});
29+
2230
it('showFeedbackWidget displays the form when FeedbackWidgetProvider is used', () => {
2331
mockedIsModalSupported.mockReturnValue(true);
2432
const { getByText, getByTestId } = render(
@@ -93,4 +101,26 @@ describe('FeedbackWidgetManager', () => {
93101
expect(getByText('Custom Submit Button')).toBeTruthy(); // overridden value
94102
expect(getByPlaceholderText(defaultConfiguration.messagePlaceholder)).toBeTruthy(); // default configuration value
95103
});
104+
105+
it('showFeedbackWidget warns about missing feedback provider', () => {
106+
mockedIsModalSupported.mockReturnValue(true);
107+
108+
showFeedbackWidget();
109+
110+
expect(consoleWarnSpy).toHaveBeenLastCalledWith('[Sentry] FeedbackWidget requires `Sentry.wrap(RootComponent)` to be called before `showFeedbackWidget()`.');
111+
});
112+
113+
it('showFeedbackWidget does not warn about missing feedback provider when FeedbackWidgetProvider is used', () => {
114+
mockedIsModalSupported.mockReturnValue(true);
115+
116+
render(
117+
<FeedbackWidgetProvider>
118+
<Text>App Components</Text>
119+
</FeedbackWidgetProvider>
120+
);
121+
122+
showFeedbackWidget();
123+
124+
expect(consoleWarnSpy).not.toHaveBeenCalled();
125+
});
96126
});

0 commit comments

Comments
 (0)