Skip to content

Commit b3ea2b2

Browse files
authored
feat(feedback): Show selected screenshot (#4545)
* Save form state for unsubmitted data * Show selected screenshot * Omit isVisible from state * Save/clear form state on unmount * Pass the missing attachment parameter in the onSubmitSuccess * Use instance variable for _didSubmitForm * Fixes lint issue * Fix merge issue
1 parent 51dc070 commit b3ea2b2

File tree

4 files changed

+180
-120
lines changed

4 files changed

+180
-120
lines changed

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

+13-1
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,20 @@ const defaultStyles: FeedbackWidgetStyles = {
4545
backgroundColor: '#eee',
4646
padding: 15,
4747
borderRadius: 5,
48-
marginBottom: 20,
4948
alignItems: 'center',
49+
flex: 1,
50+
},
51+
screenshotContainer: {
52+
flexDirection: 'row',
53+
alignItems: 'center',
54+
width: '100%',
55+
marginBottom: 20,
56+
},
57+
screenshotThumbnail: {
58+
width: 50,
59+
height: 50,
60+
borderRadius: 5,
61+
marginRight: 10,
5062
},
5163
screenshotText: {
5264
color: '#333',

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

+25-13
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ export class FeedbackWidget extends React.Component<FeedbackWidgetProps, Feedbac
3939
description: '',
4040
filename: undefined,
4141
attachment: undefined,
42+
attachmentUri: undefined,
4243
};
4344

4445
private _didSubmitForm: boolean = false;
@@ -60,6 +61,7 @@ export class FeedbackWidget extends React.Component<FeedbackWidgetProps, Feedbac
6061
description: FeedbackWidget._savedState.description || '',
6162
filename: FeedbackWidget._savedState.filename || undefined,
6263
attachment: FeedbackWidget._savedState.attachment || undefined,
64+
attachmentUri: FeedbackWidget._savedState.attachmentUri || undefined,
6365
};
6466
}
6567

@@ -144,24 +146,25 @@ export class FeedbackWidget extends React.Component<FeedbackWidgetProps, Feedbac
144146
const imageUri = result.assets[0].uri;
145147
NATIVE.getDataFromUri(imageUri).then((data) => {
146148
if (data != null) {
147-
this.setState({ filename, attachment: data });
149+
this.setState({ filename, attachment: data, attachmentUri: imageUri });
148150
} else {
149151
logger.error('Failed to read image data from uri:', imageUri);
150152
}
151153
})
152-
.catch((error) => {
153-
logger.error('Failed to read image data from uri:', imageUri, 'error: ', error);
154-
});
154+
.catch((error) => {
155+
logger.error('Failed to read image data from uri:', imageUri, 'error: ', error);
156+
});
155157
}
156158
} else {
157159
// Defaulting to the onAddScreenshot callback
158160
const { onAddScreenshot } = { ...defaultConfiguration, ...this.props };
159161
onAddScreenshot((filename: string, attachement: Uint8Array) => {
160-
this.setState({ filename, attachment: attachement });
162+
// TODO: Add support for image uri when using onAddScreenshot
163+
this.setState({ filename, attachment: attachement, attachmentUri: undefined });
161164
});
162165
}
163166
} else {
164-
this.setState({ filename: undefined, attachment: undefined });
167+
this.setState({ filename: undefined, attachment: undefined, attachmentUri: undefined });
165168
}
166169
}
167170

@@ -262,13 +265,21 @@ export class FeedbackWidget extends React.Component<FeedbackWidgetProps, Feedbac
262265
multiline
263266
/>
264267
{(config.enableScreenshot || imagePickerConfiguration.imagePicker) && (
265-
<TouchableOpacity style={styles.screenshotButton} onPress={this.onScreenshotButtonPress}>
266-
<Text style={styles.screenshotText}>
267-
{!this.state.filename && !this.state.attachment
268-
? text.addScreenshotButtonLabel
269-
: text.removeScreenshotButtonLabel}
270-
</Text>
271-
</TouchableOpacity>
268+
<View style={styles.screenshotContainer}>
269+
{this.state.attachmentUri && (
270+
<Image
271+
source={{ uri: this.state.attachmentUri }}
272+
style={styles.screenshotThumbnail}
273+
/>
274+
)}
275+
<TouchableOpacity style={styles.screenshotButton} onPress={this.onScreenshotButtonPress}>
276+
<Text style={styles.screenshotText}>
277+
{!this.state.filename && !this.state.attachment
278+
? text.addScreenshotButtonLabel
279+
: text.removeScreenshotButtonLabel}
280+
</Text>
281+
</TouchableOpacity>
282+
</View>
272283
)}
273284
<TouchableOpacity style={styles.submitButton} onPress={this.handleFeedbackSubmit}>
274285
<Text style={styles.submitText}>{text.submitButtonLabel}</Text>
@@ -296,6 +307,7 @@ export class FeedbackWidget extends React.Component<FeedbackWidgetProps, Feedbac
296307
description: '',
297308
filename: undefined,
298309
attachment: undefined,
310+
attachmentUri: undefined,
299311
};
300312
};
301313
}

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

+3
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,8 @@ export interface FeedbackWidgetStyles {
237237
cancelButton?: ViewStyle;
238238
cancelText?: TextStyle;
239239
screenshotButton?: ViewStyle;
240+
screenshotContainer?: ViewStyle;
241+
screenshotThumbnail?: ImageStyle;
240242
screenshotText?: TextStyle;
241243
titleContainer?: ViewStyle;
242244
sentryLogo?: ImageStyle;
@@ -252,4 +254,5 @@ export interface FeedbackWidgetState {
252254
description: string;
253255
filename?: string;
254256
attachment?: string | Uint8Array;
257+
attachmentUri?: string;
255258
}

0 commit comments

Comments
 (0)