Skip to content

Commit a9f72ec

Browse files
peterBrxwnturtledreamsijunaid
authored
Report feedback widget manually (#242)
* Report Feedback Widget Manually * removing unused functions * feedback module has been added. * added changelog entry * Updated changelog * deleted d.ts file * added react native module to countly state * changed return type * deprecated old calls * rounding up * Update Feedback.js changed some names and definitions * Update CHANGELOG.md * Update Feedback.js * Updated SDK version to 23.8.0 * Update Feedback.js --------- Co-authored-by: turtledreams <[email protected]> Co-authored-by: ijunaid <[email protected]>
1 parent bbad4dc commit a9f72ec

File tree

9 files changed

+535
-100
lines changed

9 files changed

+535
-100
lines changed

CHANGELOG.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,14 @@
1+
## 23.8.0
2+
* Added new Feedback interface (`Countly.feedback`) on the SDK interface that exposes the calls for feedback widgets.
3+
* Added Manual Reporting feature for the Feedback Widgets. This includes two new methods under the new Feedback interface:
4+
* 'getFeedbackWidgetData'
5+
* 'reportFeedbackWidgetManually'
6+
7+
* Fixed bug on Android devices for unhandled promise rejection on `getRemoteConfigValueForKeyP`.
8+
9+
* Underlying Android SDK version is 23.8.2
10+
* Underlying iOS SDK version is 23.8.2
11+
112
## 23.6.1
213
* Fixed bug for Android devices where "getRemoteConfigValueForKey" and "getRemoteConfigValueForKeyP" methods would return the RCData object.
314

Countly.js

Lines changed: 123 additions & 95 deletions
Large diffs are not rendered by default.

CountlyReactNative.podspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
Pod::Spec.new do |s|
22
s.name = 'CountlyReactNative'
3-
s.version = '23.6.1'
3+
s.version = '23.8.0'
44
s.license = {
55
:type => 'COMMUNITY',
66
:text => <<-LICENSE

CountlyState.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
const CountlyState = {};
2+
3+
CountlyState.isInitialized = false
4+
CountlyState.CountlyReactNative = null;
5+
6+
export default CountlyState;

Feedback.js

Lines changed: 156 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,156 @@
1+
const Feedback = {};
2+
/**
3+
* Get a list of available feedback widgets as an array of objects.
4+
* @param {callback listener} onFinished - returns (retrievedWidgets, error)
5+
* @return {Object} Object {error: String or Null, data: Array or null }
6+
*/
7+
async function getAvailableFeedbackWidgets(onFinished) {
8+
if (!Feedback.state.isInitialized) {
9+
const message = "'init' must be called before 'getAvailableFeedbackWidgets'";
10+
Feedback.instance.logError('getAvailableFeedbackWidgets', message);
11+
return { error: message, data: null };
12+
}
13+
14+
let result = null;
15+
let error = null;
16+
try {
17+
result = await Feedback.state.CountlyReactNative.getFeedbackWidgets();
18+
} catch (e) {
19+
error = e.message;
20+
}
21+
if (onFinished) {
22+
onFinished(result, error);
23+
}
24+
return { error: error, data: result };
25+
}
26+
27+
/**
28+
* Present a chosen feedback widget
29+
*
30+
* @param {Object} feedbackWidget - feedback Widget with id, type and name
31+
* @param {String} closeButtonText - text for cancel/close button
32+
* @param {callback listener} widgetShownCallback - Callback to be executed when feedback widget is displayed
33+
* @param {callback listener} widgetClosedCallback - Callback to be executed when feedback widget is closed
34+
*
35+
* @return {Object} Object {error: String or null}
36+
*/
37+
function presentFeedbackWidget(feedbackWidget, closeButtonText, widgetShownCallback, widgetClosedCallback) {
38+
if (!Feedback.state.isInitialized) {
39+
const message = "'init' must be called before 'presentFeedbackWidget'";
40+
Feedback.instance.logError('presentFeedbackWidget', msg);
41+
return { error: message };
42+
}
43+
let message = null;
44+
if (!feedbackWidget) {
45+
message = 'feedbackWidget should not be null or undefined';
46+
Feedback.instance.logError('presentFeedbackWidget', message);
47+
return { error: message };
48+
}
49+
if (!feedbackWidget.id) {
50+
message = 'FeedbackWidget id should not be null or empty';
51+
Feedback.instance.logError('presentFeedbackWidget', message);
52+
return { error: message };
53+
}
54+
if (!feedbackWidget.type) {
55+
message = 'FeedbackWidget type should not be null or empty';
56+
Feedback.instance.logError('presentFeedbackWidget', message);
57+
return { error: message };
58+
}
59+
if (typeof closeButtonText !== 'string') {
60+
closeButtonText = '';
61+
Feedback.instance.logWarning('presentFeedbackWidget', `unsupported data type of closeButtonText : '${typeof args}'`);
62+
}
63+
64+
if (widgetShownCallback) {
65+
_widgetShownCallback = eventEmitter.addListener(widgetShownCallbackName, () => {
66+
widgetShownCallback();
67+
_widgetShownCallback.remove();
68+
});
69+
}
70+
if (widgetClosedCallback) {
71+
_widgetClosedCallback = eventEmitter.addListener(widgetClosedCallbackName, () => {
72+
widgetClosedCallback();
73+
_widgetClosedCallback.remove();
74+
});
75+
}
76+
77+
feedbackWidget.name = feedbackWidget.name || '';
78+
closeButtonText = closeButtonText || '';
79+
Feedback.state.CountlyReactNative.presentFeedbackWidget([feedbackWidget.id, feedbackWidget.type, feedbackWidget.name, closeButtonText]);
80+
return { error: null };
81+
}
82+
83+
/**
84+
* Get a feedback widget's data as an Object.
85+
* @param {Object} widgetInfo - widget to get data for. You should get this from 'getAvailableFeedbackWidgets' method.
86+
* @param {callback listener} onFinished - returns (Object retrievedWidgetData, error)
87+
* @return {Object} Object {error: String, data: Object or null}
88+
*/
89+
async function getFeedbackWidgetData(widgetInfo, onFinished) {
90+
if (!Feedback.state.isInitialized) {
91+
const message = "'initWithConfig' must be called before 'getFeedbackWidgetData'";
92+
Feedback.instance.logError('getFeedbackWidgetData', message);
93+
onFinished(null, message);
94+
return { error: message, data: null };
95+
}
96+
const widgetId = widgetInfo.id;
97+
const widgetType = widgetInfo.type;
98+
Feedback.instance.logInfo('getFeedbackWidgetData', 'Calling "getFeedbackWidgetData" with Type:[' + widgetType + ']');
99+
const args = [];
100+
args.push(widgetId);
101+
args.push(widgetType);
102+
args.push(widgetInfo.name);
103+
let result = null;
104+
let error = null;
105+
try {
106+
result = await Feedback.state.CountlyReactNative.getFeedbackWidgetData(args);
107+
} catch (e) {
108+
error = e.message;
109+
}
110+
if (onFinished) {
111+
onFinished(result, error);
112+
}
113+
return { error: error, data: result };
114+
}
115+
116+
/**
117+
* Report manually for a feedback widget.
118+
* @param {Object} widgetInfo - the widget you are targeting. You should get this from 'getAvailableFeedbackWidgets' method.
119+
* @param {Object} widgetData - data of that widget. You should get this from 'getFeedbackWidgetData' method.
120+
* @param {Object} widgetResult - Information you want to report.
121+
* @return {Object} Object {error: String}
122+
*/
123+
function reportFeedbackWidgetManually(widgetInfo, widgetData, widgetResult) {
124+
if (!Feedback.state.isInitialized) {
125+
const message = "'initWithConfig' must be called before 'reportFeedbackWidgetManually'";
126+
Feedback.instance.logError('reportFeedbackWidgetManually', message);
127+
return { error: message };
128+
}
129+
const widgetId = widgetInfo.id;
130+
const widgetType = widgetInfo.type;
131+
Feedback.instance.logInfo('reportFeedbackWidgetManually', 'Calling "reportFeedbackWidgetManually" with Type:[' + widgetType + ']');
132+
const widgetInfoList = [];
133+
widgetInfoList.push(widgetId);
134+
widgetInfoList.push(widgetType);
135+
widgetInfoList.push(widgetInfo.name);
136+
137+
const args = [];
138+
args.push(widgetInfoList);
139+
args.push(widgetData);
140+
args.push(widgetResult);
141+
142+
let error = null;
143+
try {
144+
Feedback.state.CountlyReactNative.reportFeedbackWidgetManually(args);
145+
} catch (e) {
146+
error = e.message;
147+
}
148+
return { error: error };
149+
}
150+
151+
Feedback.getAvailableFeedbackWidgets = getAvailableFeedbackWidgets;
152+
Feedback.presentFeedbackWidget = presentFeedbackWidget;
153+
Feedback.getFeedbackWidgetData = getFeedbackWidgetData;
154+
Feedback.reportFeedbackWidgetManually = reportFeedbackWidgetManually;
155+
156+
export default Feedback;

0 commit comments

Comments
 (0)