Skip to content

Commit 139158b

Browse files
Added custom dimension property in media tracking
1 parent ed195da commit 139158b

File tree

6 files changed

+79
-13
lines changed

6 files changed

+79
-13
lines changed

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -286,14 +286,14 @@ trackMediaEvent function use to monitor user interactions with media content, su
286286
| mediaHeight | The resolution height of the media in pixels. Only recommended being set for videos. |
287287
| mediaFullScreen| Should be 0 or 1 and defines whether the media is currently viewed in full screen. Only recommended being set for videos. |
288288
| mediaSE | An optional comma separated list of which positions within a media a user has played. For example if the user has viewed position 5s, 10s, 15s and 35s, then you would need to send 5,10,15,35. We recommend to round to the next 5 seconds and not send a value for each second. Internally, Matomo may round to the next 15 or 30 seconds. For performance optimisation we recommend not sending the same position twice. Meaning if you have sent ma_se=10 there is no need to send later ma_se=10,20 but instead only ma_se=20. |
289-
289+
| dimensions| Dimension contains a key and a value, and where the key is a custom dimension key created on the Matomo dashboard and the value should be a string, you'll need to ensure that the dimensions array is processed correctly. [create custom dimension](https://matomo.org/faq/reporting-tools/create-track-and-manage-custom-dimensions/)
290290

291291

292292
#### Examples
293293

294294
```js
295295

296-
trackMediaEvent({siteId:"siteid",mediaId:"unique id",mediaTitle:"video media play track",playerName:"test 08",mediaType:MediaType.VIDEO,mediaResource:"http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4",mediaStatus:"100",mediaLength:"100",mediaFullScreen:"1",mediaHeight:"720",mediaWidth:"1080",mediaProgress:"100"});
296+
trackMediaEvent({siteId:"siteid",mediaId:"unique id",mediaTitle:"video media play track",playerName:"test 08",mediaType:MediaType.VIDEO,mediaResource:"http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4",mediaStatus:"100",mediaLength:"100",mediaFullScreen:"1",mediaHeight:"720",mediaWidth:"1080",mediaProgress:"100", dimensions:[{key:"dimension1",value:JSON.stringify({"email": "[email protected]","instanceType": "VIDEO","videoId": "cf7fad2e-fae4-4c49-9924-ad9a2a7c50de",})}]});
297297

298298
```
299299

@@ -369,7 +369,7 @@ trackCampaign("Home screen","https://example.com/?mtm_campaign=2020_august_promo
369369
| [disableTracking](#disabletracking) | - |||||
370370
| [enableTracking](#enabletracking) | - |||||
371371
| [setLogger](#setlogger) | - |||||
372-
| [trackMediaEvent](#trackmediaevent) | siteId: String, mediaId: String, mediaTitle: String, playerName: String, mediaType: String, mediaResource: String, mediaStatus: String,mediaLength?:String, mediaProgress?:String, mediaTTP?: String, mediaWidth?: String, mediaHeight?: String, mediaSE?: String, mediaFullScreen?:String |||||
372+
| [trackMediaEvent](#trackmediaevent) | siteId: String, mediaId: String, mediaTitle: String, playerName: String, mediaType: String, mediaResource: String, mediaStatus: String,mediaLength?:String, mediaProgress?:String, mediaTTP?: String, mediaWidth?: String, mediaHeight?: String, mediaSE?: String, mediaFullScreen?:String, dimensions : [object] |||||
373373
| [trackCampaign](#trackcampaign) | title: String, campaignUrl: String |||||
374374

375375

android/src/main/java/com/logicwind/reactnativematomotracker/ReactNativeMatomoTrackerModule.kt

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,12 @@ import android.util.Log
1010
import com.facebook.react.bridge.ReactApplicationContext
1111
import com.facebook.react.bridge.ReactContextBaseJavaModule
1212
import com.facebook.react.bridge.ReactMethod
13+
import com.facebook.react.bridge.ReadableArray
1314
import okhttp3.MediaType.Companion.toMediaType
1415
import okhttp3.OkHttpClient
1516
import okhttp3.Request
1617
import okhttp3.RequestBody.Companion.toRequestBody
18+
import org.json.JSONObject
1719
import org.matomo.sdk.Matomo
1820
import org.matomo.sdk.Tracker
1921
import org.matomo.sdk.TrackerBuilder
@@ -259,8 +261,8 @@ class ReactNativeMatomoTrackerModule(reactContext: ReactApplicationContext) :
259261
mediaWidth: String,
260262
mediaHeight: String,
261263
mediaSE: String,
262-
mediaFullScreen:String
263-
264+
mediaFullScreen:String,
265+
dimensions: ReadableArray
264266
) {
265267

266268
if(siteId.isNotEmpty() && tracker!=null){
@@ -272,6 +274,17 @@ class ReactNativeMatomoTrackerModule(reactContext: ReactApplicationContext) :
272274
TrackHelper.track().event(mediaType, "stop").name(mediaTitle).with(tracker)
273275
trackDispatch()
274276
}
277+
278+
fun convertJsonString(jsonString: String): JSONObject? {
279+
return try {
280+
JSONObject(jsonString)
281+
} catch (e: Exception) {
282+
e.printStackTrace()
283+
null
284+
}
285+
}
286+
287+
275288
val baseUrl = tracker?.apiUrl
276289
val userAgent = getUserAgent(context)
277290
var query = "idsite=${encode(siteId)}" +
@@ -285,6 +298,26 @@ class ReactNativeMatomoTrackerModule(reactContext: ReactApplicationContext) :
285298
"&ma_st=${encode(mediaStatus)}"+
286299
"&_id=${encode(tracker?.visitorId.toString())}"
287300

301+
if (dimensions.size() > 0) {
302+
for (i in 0 until dimensions.size()) {
303+
val dimension = dimensions.getMap(i)
304+
val key = dimension?.getString("key")
305+
val value = dimension?.getString("value")
306+
307+
if (key != null && value != null) {
308+
try {
309+
val jsonObject = JSONObject(value)
310+
val jsonValueString = jsonObject.toString()
311+
TrackHelper.track().screen("/media").dimension(i+1,value).with(tracker)
312+
trackDispatch()
313+
} catch (e: Exception) {
314+
TrackHelper.track().screen("/media").dimension(i+1,value).with(tracker)
315+
trackDispatch()
316+
}
317+
}
318+
}
319+
}
320+
288321
if(mediaLength.isNotEmpty()){
289322
query=query+ "&ma_le=${encode(mediaLength)}";
290323
}
@@ -330,6 +363,7 @@ class ReactNativeMatomoTrackerModule(reactContext: ReactApplicationContext) :
330363

331364
client.newCall(request).execute().use { response ->
332365
val responseCode = response.code
366+
println("responseCode : $responseCode")
333367
}
334368
}catch (e:Exception){
335369
Log.e(TAG, "error : ${e.message}")

example/src/App.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,11 @@ export default function App() {
185185
<Pressable
186186
style={styles.button}
187187
onPress={() => {
188-
trackMediaEvent({ siteId: "siteId", mediaId: Date.now.toString(), mediaTitle: "video media play track", playerName: "test 08", mediaType: MediaType.VIDEO, mediaResource: "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4", mediaStatus: "100", mediaLength: "100", mediaFullScreen: "1", mediaHeight: "720", mediaWidth: "1080", mediaProgress: "100" });
188+
trackMediaEvent({ siteId: "siteId", mediaId: Date.now.toString(), mediaTitle: "video media play track", playerName: "test 08", mediaType: MediaType.VIDEO, mediaResource: "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4", mediaStatus: "100", mediaLength: "100", mediaFullScreen: "1", mediaHeight: "720", mediaWidth: "1080", mediaProgress: "100",
189+
dimensions:[{key:"dimension1",value:JSON.stringify({"email": "[email protected]",
190+
"instanceType": "VIDEO",
191+
"videoId": "cf7fad2e-fae4-4c49-9924-ad9a2a7c50de",})}]
192+
});
189193
}}
190194
>
191195
<Text style={styles.buttonText}>Video Play Stop</Text>

ios/ReactNativeMatomoTracker.mm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ @interface RCT_EXTERN_MODULE(ReactNativeMatomoTracker, NSObject)
4141

4242
RCT_EXTERN_METHOD(trackCampaign:(NSString *)title withCampaignUrl:(NSString *)campaignUrl)
4343

44-
RCT_EXTERN_METHOD(trackMedia:(NSString *)siteId withMediaId:(NSString *)mediaId withMediaTitle:(NSString *)mediaTitle withPlayerName:(NSString *)playerName withMediaType:(NSString *)mediaType withMediaResource:(NSString *)mediaResource withMediaStatus:(NSString *)mediaStatus withMediaLength:(NSString *)mediaLength withMediaProgress:(NSString *)mediaProgress withMediaTTP:(NSString *)mediaTTP withMediaWidth:(NSString *)mediaWidth withMediaHeight:(NSString *)mediaHeight withMediaSE:(NSString *)mediaSE withMediaFullScreen:(NSString *)mediaFullScreen)
44+
RCT_EXTERN_METHOD(trackMedia:(NSString *)siteId withMediaId:(NSString *)mediaId withMediaTitle:(NSString *)mediaTitle withPlayerName:(NSString *)playerName withMediaType:(NSString *)mediaType withMediaResource:(NSString *)mediaResource withMediaStatus:(NSString *)mediaStatus withMediaLength:(NSString *)mediaLength withMediaProgress:(NSString *)mediaProgress withMediaTTP:(NSString *)mediaTTP withMediaWidth:(NSString *)mediaWidth withMediaHeight:(NSString *)mediaHeight withMediaSE:(NSString *)mediaSE withMediaFullScreen:(NSString *)mediaFullScreen withDimensions:(NSArray<NSDictionary *> *)dimensions)
4545

4646

4747

ios/ReactNativeMatomoTracker.swift

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -155,8 +155,9 @@ class ReactNativeMatomoTracker: NSObject {
155155
}
156156

157157
}
158+
158159

159-
@objc(trackMedia:withMediaId:withMediaTitle:withPlayerName:withMediaType:withMediaResource:withMediaStatus:withMediaLength:withMediaProgress:withMediaTTP:withMediaWidth:withMediaHeight:withMediaSE:withMediaFullScreen:)
160+
@objc(trackMedia:withMediaId:withMediaTitle:withPlayerName:withMediaType:withMediaResource:withMediaStatus:withMediaLength:withMediaProgress:withMediaTTP:withMediaWidth:withMediaHeight:withMediaSE:withMediaFullScreen:withDimensions:)
160161
func trackMediaEvent(
161162
siteId: String,
162163
mediaId: String,
@@ -171,7 +172,8 @@ class ReactNativeMatomoTracker: NSObject {
171172
mediaWidth: String,
172173
mediaHeight: String,
173174
mediaSE: String,
174-
mediaFullScreen:String
175+
mediaFullScreen:String,
176+
dimensions:[NSDictionary]
175177
) {
176178
if(!siteId.isEmpty && matomoTracker != nil)
177179
{
@@ -196,7 +198,7 @@ class ReactNativeMatomoTracker: NSObject {
196198
uid = ""
197199
}
198200

199-
201+
200202
let baseUrl = baseURL
201203
var query = "idsite=\(encodeParameter(value: siteId))" +
202204
"&rec=1" +
@@ -210,8 +212,31 @@ class ReactNativeMatomoTracker: NSObject {
210212
"&cid=\(encodeParameter(value: _id))" +
211213
"&uid=\(encodeParameter(value: uid))"
212214

215+
if(!dimensions.isEmpty){
213216

217+
for dimension in dimensions {
218+
if let key = dimension["key"] as? String, let value = dimension["value"] as? String {
219+
// Attempt to parse the JSON value
220+
if let data = value.data(using: .utf8),
221+
let jsonObject = try? JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] {
222+
// Convert jsonObject to a string or handle as needed
223+
let jsonValueString = jsonObject.map { "\($0.key)=\($0.value)" }.joined(separator: ",")
224+
query += "&\(key)=\(encodeParameter(value: jsonValueString))"
225+
} else {
226+
query += "&\(key)=\(encodeParameter(value: value))"
227+
}
228+
}
229+
}
230+
231+
}
214232

233+
// if(!customVariable.isEmpty){
234+
//
235+
// let encodedCustomVariable = encodeParameter(value: customVariable)
236+
// print("customVariable \(encodedCustomVariable)")
237+
// query=query+"&_cvar=\(encodedCustomVariable)";
238+
// }
239+
//
215240
if(!mediaLength.isEmpty){
216241
query=query+"&ma_le=\(encodeParameter(value: mediaLength))";
217242
}

src/index.tsx

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ export function trackCampaign(title:String,campaignUrl:String) {
8383
}
8484

8585
export function trackMediaEvent(
86-
{siteId,mediaId,mediaTitle,playerName,mediaType,mediaResource,mediaStatus,mediaLength="",mediaProgress="",mediaTTP="",mediaWidth="",mediaHeight="",mediaSE="",mediaFullScreen=""}:{
86+
{siteId,mediaId,mediaTitle,playerName,mediaType,mediaResource,mediaStatus,mediaLength="",mediaProgress="",mediaTTP="",mediaWidth="",mediaHeight="",mediaSE="",mediaFullScreen="",dimensions=[]}:{
8787
siteId: String,
8888
mediaId: String,
8989
mediaTitle: String,
@@ -97,8 +97,11 @@ export function trackMediaEvent(
9797
mediaWidth?: String,
9898
mediaHeight?: String,
9999
mediaSE?: String,
100-
mediaFullScreen?:String}): Promise<number> {
101-
return ReactNativeMatomoTracker.trackMedia(siteId,mediaId,mediaTitle,playerName,mediaType,mediaResource,mediaStatus,mediaLength,mediaProgress,mediaTTP,mediaWidth,mediaHeight,mediaSE,mediaFullScreen);
100+
mediaFullScreen?:String,
101+
customVariable?:String,
102+
dimensions?: Array<Object>
103+
}): Promise<number> {
104+
return ReactNativeMatomoTracker.trackMedia(siteId,mediaId,mediaTitle,playerName,mediaType,mediaResource,mediaStatus,mediaLength,mediaProgress,mediaTTP,mediaWidth,mediaHeight,mediaSE,mediaFullScreen,dimensions);
102105
}
103106

104107
export const MediaType = { VIDEO: 'video',AUDIO:"audio"};

0 commit comments

Comments
 (0)