Skip to content

Commit e84c6bb

Browse files
authored
Merge 449a803 into 0588552
2 parents 0588552 + 449a803 commit e84c6bb

File tree

6 files changed

+55
-4
lines changed

6 files changed

+55
-4
lines changed

packages/core/src/js/feedback/FeedbackForm.styles.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ const defaultStyles: FeedbackFormStyles = {
1515
fontSize: 24,
1616
fontWeight: 'bold',
1717
marginBottom: 20,
18-
textAlign: 'center',
18+
textAlign: 'left',
19+
flex: 1,
1920
color: FORGROUND_COLOR,
2021
},
2122
label: {
@@ -57,6 +58,14 @@ const defaultStyles: FeedbackFormStyles = {
5758
color: FORGROUND_COLOR,
5859
fontSize: 16,
5960
},
61+
titleContainer: {
62+
flexDirection: 'row',
63+
width: '100%',
64+
},
65+
sentryLogo: {
66+
width: 40,
67+
height: 40,
68+
},
6069
};
6170

6271
export default defaultStyles;

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

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import * as React from 'react';
44
import type { KeyboardTypeOptions } from 'react-native';
55
import {
66
Alert,
7+
Image,
78
Keyboard,
89
KeyboardAvoidingView,
910
SafeAreaView,
@@ -15,6 +16,7 @@ import {
1516
View
1617
} from 'react-native';
1718

19+
import { sentryLogo } from './branding';
1820
import { defaultConfiguration } from './defaults';
1921
import defaultStyles from './FeedbackForm.styles';
2022
import type { FeedbackFormProps, FeedbackFormState, FeedbackFormStyles,FeedbackGeneralConfiguration, FeedbackTextConfiguration } from './FeedbackForm.types';
@@ -104,7 +106,16 @@ export class FeedbackForm extends React.Component<FeedbackFormProps, FeedbackFor
104106
<ScrollView>
105107
<TouchableWithoutFeedback onPress={Keyboard.dismiss}>
106108
<View style={styles.container}>
107-
<Text style={styles.title}>{text.formTitle}</Text>
109+
<View style={styles.titleContainer}>
110+
<Text style={styles.title}>{text.formTitle}</Text>
111+
{config.showBranding && (
112+
<Image
113+
source={{ uri: sentryLogo }}
114+
style={styles.sentryLogo}
115+
testID='sentry-logo'
116+
/>
117+
)}
118+
</View>
108119

109120
{config.showName && (
110121
<>

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

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
1-
import type { TextStyle, ViewStyle } from 'react-native';
1+
import type { ImageStyle, TextStyle, ViewStyle } from 'react-native';
22

3+
/**
4+
* The props for the feedback form
5+
*/
36
export interface FeedbackFormProps extends FeedbackGeneralConfiguration, FeedbackTextConfiguration, FeedbackCallbacks {
47
styles?: FeedbackFormStyles;
58
}
@@ -8,6 +11,13 @@ export interface FeedbackFormProps extends FeedbackGeneralConfiguration, Feedbac
811
* General feedback configuration
912
*/
1013
export interface FeedbackGeneralConfiguration {
14+
/**
15+
* Show the Sentry branding
16+
*
17+
* @default true
18+
*/
19+
showBranding?: boolean;
20+
1121
/**
1222
* Should the email field be required?
1323
*/
@@ -128,6 +138,9 @@ export interface FeedbackCallbacks {
128138
onFormClose?: () => void;
129139
}
130140

141+
/**
142+
* The styles for the feedback form
143+
*/
131144
export interface FeedbackFormStyles {
132145
container?: ViewStyle;
133146
title?: TextStyle;
@@ -138,8 +151,13 @@ export interface FeedbackFormStyles {
138151
submitText?: TextStyle;
139152
cancelButton?: ViewStyle;
140153
cancelText?: TextStyle;
154+
titleContainer?: ViewStyle;
155+
sentryLogo?: ImageStyle;
141156
}
142157

158+
/**
159+
* The state of the feedback form
160+
*/
143161
export interface FeedbackFormState {
144162
isVisible: boolean;
145163
name: string;
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
/**
2+
* Base64 encoded PNG image of the Sentry logo (source https://sentry.io/branding/)
3+
*/
4+
export const sentryLogo =
5+
'data:image/png;base64,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';

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ export const defaultConfiguration: Partial<FeedbackFormProps> = {
2929
},
3030

3131
// FeedbackGeneralConfiguration
32+
showBranding: true,
3233
isEmailRequired: false,
3334
shouldValidateEmail: true,
3435
isNameRequired: false,

packages/core/test/feedback/FeedbackForm.test.tsx

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,10 @@ describe('FeedbackForm', () => {
4646
});
4747

4848
it('renders correctly', () => {
49-
const { getByPlaceholderText, getByText } = render(<FeedbackForm {...defaultProps} />);
49+
const { getByPlaceholderText, getByText, getByTestId } = render(<FeedbackForm {...defaultProps} />);
5050

5151
expect(getByText(defaultProps.formTitle)).toBeTruthy();
52+
expect(getByTestId('sentry-logo')).toBeTruthy(); // default showBranding is true
5253
expect(getByText(defaultProps.nameLabel)).toBeTruthy();
5354
expect(getByPlaceholderText(defaultProps.namePlaceholder)).toBeTruthy();
5455
expect(getByText(defaultProps.emailLabel)).toBeTruthy();
@@ -59,6 +60,12 @@ describe('FeedbackForm', () => {
5960
expect(getByText(defaultProps.cancelButtonLabel)).toBeTruthy();
6061
});
6162

63+
it('does not render the sentry logo when showBranding is false', () => {
64+
const { queryByTestId } = render(<FeedbackForm {...defaultProps} showBranding={false} />);
65+
66+
expect(queryByTestId('sentry-logo')).toBeNull();
67+
});
68+
6269
it('name and email are prefilled when sentry user is set', () => {
6370
const { getByPlaceholderText } = render(<FeedbackForm {...defaultProps} />);
6471

0 commit comments

Comments
 (0)