Skip to content

Commit 9c4c79f

Browse files
authored
Merge pull request #158 from BuildFire/fix/handle-deeplink
fix(deeplinks): handle deeplink data
2 parents 9d7c922 + fbb5284 commit 9c4c79f

File tree

2 files changed

+59
-25
lines changed

2 files changed

+59
-25
lines changed

widget/app.services.js

Lines changed: 35 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@
179179
if (currentTime) {
180180
lastAnalyticsTime = currentTime;
181181
}
182-
182+
183183
if (!analyticsTrackingInterval) {
184184
analyticsTrackingInterval = setInterval(() => {
185185
lastAnalyticsTime += 5;
@@ -251,7 +251,37 @@
251251
}
252252
}
253253

254-
return { getImageUrl }
254+
function decodeObject(obj) {
255+
if (typeof obj === 'string') return decodeURIComponent(obj);
256+
// If the input is not an object or is null, return it as is
257+
if (typeof obj !== 'object' || obj === null) {
258+
return obj;
259+
}
260+
261+
// If the input is an array, iterate over its elements
262+
if (Array.isArray(obj)) {
263+
return obj.map(item => decodeObject(item));
264+
}
265+
266+
// If the input is an object, iterate over its properties
267+
const decodedObj = {};
268+
for (const key in obj) {
269+
if (obj.hasOwnProperty(key)) {
270+
const value = obj[key];
271+
272+
// If the value is a string, decode it
273+
if (typeof value === 'string') {
274+
decodedObj[key] = decodeURIComponent(value);
275+
} else {
276+
// If the value is an object or array, recursively decode it
277+
decodedObj[key] = decodeObject(value);
278+
}
279+
}
280+
}
281+
return decodedObj;
282+
}
283+
284+
return { getImageUrl, decodeObject };
255285
}])
256286

257287
/**
@@ -274,11 +304,11 @@
274304
link.title = item.title;
275305
link.description = item.title + ", by " + item.author;
276306
link.imageUrl = item.image && item.image.url ? item.image.url : null;
277-
307+
278308
link.data = {
279309
link: item.guid,
280310
};
281-
311+
282312
buildfire.deeplink.generateUrl(link, (err, result) => {
283313
if (err) {
284314
console.error(err);
@@ -300,4 +330,4 @@
300330
share: _share
301331
};
302332
});
303-
})(window.angular, window.buildfire, window._);
333+
})(window.angular, window.buildfire, window._);

widget/controllers/widget.home.controller.js

Lines changed: 24 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
(function (angular) {
44
angular
55
.module('mediaCenterRSSPluginWidget')
6-
.controller('WidgetHomeCtrl', ['$scope', 'DataStore', 'Buildfire', 'FeedParseService', 'TAG_NAMES', 'ItemDetailsService', 'Location', '$filter', 'Underscore', '$rootScope', 'FEED_IMAGES', 'trackAnalyticsActions', 'utils',
6+
.controller('WidgetHomeCtrl', ['$scope', 'DataStore', 'Buildfire', 'FeedParseService', 'TAG_NAMES', 'ItemDetailsService', 'Location', '$filter', 'Underscore', '$rootScope', 'FEED_IMAGES', 'trackAnalyticsActions', 'utils',
77
function ($scope, DataStore, Buildfire, FeedParseService, TAG_NAMES, ItemDetailsService, Location, $filter, Underscore, $rootScope, FEED_IMAGES, trackAnalyticsActions, utils) {
88

99
if (window.device) {
@@ -37,7 +37,7 @@
3737
function extractItemFromFeeds(feeds = {}, itemId) {
3838
if (!feeds || typeof feeds !== 'object' || !itemId) return null;
3939
let itemData = null;
40-
40+
4141
Object.keys(feeds).forEach(key => {
4242
if (feeds[key].items && feeds[key].items.length) {
4343
let feedItem = feeds[key].items.find(el => el.guid == itemId);
@@ -49,7 +49,7 @@
4949
});
5050
return itemData;
5151
}
52-
52+
5353
$scope.deeplinkData = null;
5454
$scope.isDeeplinkItemOpened = false;
5555
$scope.first = true;
@@ -69,7 +69,7 @@
6969
...data.feed,
7070
guid: data.link,
7171
imageSrcUrl: data.feed.image_url ,
72-
pubDate: data.feed.publish_date
72+
pubDate: data.feed.publish_date
7373
};
7474
WidgetHome.proceedToItem(-1, item, pushToHistory);
7575
} else if (data.link) {
@@ -112,12 +112,12 @@
112112
}
113113
}
114114

115-
/**
115+
/**
116116
* Private variables
117117
*
118118
* @name _items used to hold RSS feed items and helps in lazy loading.
119-
* @type {object}
120-
* @private
119+
* @type {object}
120+
* @private
121121
*
122122
* @name limit used to load a number of items in list on scroll
123123
* @type {number}
@@ -178,12 +178,16 @@
178178
};
179179

180180
// show the deeplink skeleton if the deeplink is present
181-
buildfire.deeplink.getData(function (data) {
182-
if (!data) return;
181+
try {
182+
buildfire.deeplink.getData(function (data) {
183+
if (!data) return;
183184

184-
$scope.deeplinkData = data;
185-
toggleDeeplinkSkeleton(true);
186-
});
185+
$scope.deeplinkData = utils.decodeObject(data);
186+
toggleDeeplinkSkeleton(true);
187+
});
188+
} catch (e) {
189+
console.error('Error getting deeplink data', e);
190+
}
187191
buildfire.deeplink.onUpdate(function (data) {
188192
if (!data) return;
189193

@@ -194,7 +198,7 @@
194198
}
195199
});
196200

197-
/**
201+
/**
198202
* @name WidgetHome.data is used to hold user's data object which used throughout the app.
199203
* @type {object}
200204
*/
@@ -210,7 +214,7 @@
210214
*/
211215
WidgetHome.items = [];
212216

213-
/**
217+
/**
214218
* @name WidgetHome.busy is used to disable ng-infinite scroll when more data not available to show.
215219
* @type {boolean}
216220
*/
@@ -287,13 +291,13 @@
287291
isInit = false;
288292

289293
function checkFeedEquality(currentItems, fetchedItems) {
290-
294+
291295
if (!currentItems[0] || !currentItems[0].guid) return false;
292296

293297
var sameLength = currentItems.length === fetchedItems.length;
294298
var firstItemUnchanged = currentItems[0].guid === fetchedItems[0].guid;
295299
var lastItemUnchanged = currentItems[currentItems.length - 1].guid === fetchedItems[fetchedItems.length - 1].guid;
296-
300+
297301
return sameLength && firstItemUnchanged && lastItemUnchanged;
298302
}
299303
};
@@ -452,7 +456,7 @@
452456
WidgetHome.loading = true;
453457
if (!$scope.$$phase) $scope.$digest();
454458
}
455-
459+
456460
WidgetHome.fetchFeedResults(feed).then((result) => {
457461
let isChanged = !WidgetHome.checkFeedEquality(WidgetHome.feedsCache[feed.id].items ?? [], result.data.items);
458462
WidgetHome.feedsCache[feed.id] = {
@@ -466,7 +470,7 @@
466470

467471
if (isChanged) WidgetHome.renderFeedItems();
468472
WidgetHome.loading = false;
469-
473+
470474
if (Object.keys(WidgetHome.feedsData).length === WidgetHome.data.content.feeds.length) WidgetHome.dataTotallyLoaded = true;
471475

472476
if (!$scope.$$phase) $scope.$digest();
@@ -548,7 +552,7 @@
548552
if (WidgetHome.isItems) {
549553
WidgetHome.loading = false;
550554
}
551-
555+
552556
WidgetHome.handleInitialParsing();
553557
}).catch((err) => {
554558
console.error(err)
@@ -789,4 +793,4 @@
789793

790794
}
791795
]);
792-
})(window.angular);
796+
})(window.angular);

0 commit comments

Comments
 (0)