0.2.0 • Published 3 years ago
@rogu/tracker-runtime v0.2.0
@rogu/tracker-runtime
This is a runtime library for @rogu/tracker-codegen. However, you still need to setup the provider manually to make it works.
Overview
Tracker Provider
Tracker Provider is a collection of modules that act as a container for your tracking service.
module __Your_Tracking_Service__ = {
type t;
let handler: t => unit
}
Full Example
module Firebase = {
type t = [ | `firebase];
let handler = properties => {
fun
| `firebase => {
Firebase.Analytics.make().logEvent(.
properties##eventType,
properties##context,
);
};
};
};
module Internal = {
type t = [ | `internal];
let transform = properties =>
Js.Json.[
("clientTimestamp", string @@ Js.Date.toString @@ Js.Date.make()),
("appVersion", string("0.0")),
("clientDevice", string("WEB")),
("clientOS", string("")),
("clientOSVersion", string("")),
("context", properties##context),
("deviceId", string("")),
("eventType", string @@ properties##eventType),
("eventVersion", number(0.0)),
("cookiesId", string @@ Session.make()),
("isLogged", boolean @@ false),
("memberId", string @@ UOC.get()),
("sessionId", string @@ Session.make()),
]
|> Js.Dict.fromList
|> Js.Json.object_
|> Js.Json.stringify;
let handler = properties =>
fun
| `internal => {
Bs_fetch.(
fetchWithInit(
Config.config.apiEndpoint ++ "/event/tracker",
RequestInit.make(
~method_=Post,
~body=BodyInit.make @@ transform(properties),
(),
),
)
)
|> ignore;
};
};
Tracker Module
This is the main module where you need to compose between the code from code generator and your own provider implementation.
module Make = RgTracker.Runtime.Make(LMS__Tracker);
include Make({
type t = [ TrackerProvider.Internal.t | TrackerProvider.Firebase.t];
let required = [|`internal|];
let handler = properties =>
fun
| `internal as provider => TrackerProvider.Internal.handler(properties, provider)
| `firebase as provider => TrackerProvider.Firebase.handler(properties, provider);
});
After you setup those two modules. You can use tracker as followings:
[@react.component]
let make = () => {
<Button onPress={_ => Tracker.make(`generatedEvent(some_payload))}>
</Button>
}
That code will only fire internal
since it's the only required tracker to track.
However, if you want to track internal and firebase. You can do followings:
[@react.component]
let make = () => {
<Button onPress={_ => Tracker.make(~providers=[|`firebase|],`generatedEvent(some_payload))}>
</Button>
}