Definitions

Event Timeline

Note that some event timeline features are in Early Access, specifically the ones related to venue-type determination.

declare module "@sentiance-react-native/event-timeline" {
  import { EmitterSubscription } from "react-native";
  export type OccupantRoleFeedbackResult =
  | "ACCEPTED"
  | "TRANSPORT_IS_PROVISIONAL"
  | "TRANSPORT_TYPE_NOT_SUPPORTED"
  | "TRANSPORT_NOT_FOUND"
  | "TRANSPORT_NOT_YET_COMPLETE"
  | "FEEDBACK_ALREADY_PROVIDED"
  | "UNEXPECTED_ERROR";

  /**
   * @internal
   */
  const OCCUPANT_ROLE_FEEDBACK_VALUES = OCCUPANT_ROLE_VALUES.filter(
    (role): role is Exclude<OccupantRole, "UNAVAILABLE"> => role !== "UNAVAILABLE"
  );
  
  export type OccupantRoleFeedback = (typeof OCCUPANT_ROLE_FEEDBACK_VALUES)[number];
  
  export interface SentianceFeedback {
    submitOccupantRoleFeedback(transportId: string, occupantRoleFeedback: OccupantRoleFeedback): Promise<OccupantRoleFeedbackResult>;
  }
  
  /**
   * Represents an occurrence of an event that was detected for a user.
   */
  export interface Event {
    /**
     * The unique identifier of the event.
     */
    id: string;
    /**
     * An ISO 8601 representation of the start time of the event.
     */
    startTime: string;
    /**
     * The start epoch time of the event, in milliseconds.
     */
    startTimeEpoch: number;
    /**
     * An ISO 8601 representation of the last update time of the event.
     */
    lastUpdateTime: string;
    /**
     * The last update epoch time of the event, in milliseconds.
     */
    lastUpdateTimeEpoch: number;
    /**
     * An ISO 8601 representation of the end time of the event if the event has ended, otherwise it is `null`.
     */
    endTime: string | null;
    /**
     * The end epoch time of the event in milliseconds if the event has ended, otherwise it is `null`.
     */
    endTimeEpoch: number | null;
    /**
     * the duration of the event in seconds if it has ended, otherwise returns it is `null`.
     */
    durationInSeconds: number | null;
    /**
     * The event type. Based on this type, you can determine whether the event is a transport or a stationary etc...
     */
    type: EventType;
    /**
     * Indicates whether the event is provisional.
     *
     * <p>A provisional event is identified based on real-time detections, but may change in the near future
     * as more data is collected and processed, to filter out unwanted artifacts.
     * For example, a provisional car transport may get identified, followed by a provisional bus transport.
     * After the full trip is complete, these provisional events may get merged into a single final car event.</p>
     *
     * <p>Final events are generated independently of the provisional events, and have unique event IDs. They are
     * not linked to the provisional events they may resemble, replace, or overlap with.</p>
     *
     * <p>Currently, provisional events apply only to 'transport' types, as the SDK tries to determine the mode of
     * transport in (near) real time. When the full trip is complete (e.g. the user becomes stationary),
     * the collected data is reprocessed to produce a more accurate and cleaned up list of transport events.</p>
     */
    isProvisional: boolean;
    // stationary event fields
    /**
     * The location where the user is stationary at.
     */
    location: GeoLocation | null;
    /**
     * The venue of this stationary.
     */
    venue: Venue | null;
    // transport event fields
    /**
     * The mode of transportation if the event is a transport, `null` otherwise.
     */
    transportMode: TransportMode | null;
    /**
     * The waypoints collected during the transport if the event is a transport, empty otherwise.
     */
    waypoints: Waypoint[];
    /**
     * The distance travelled during the transport in meters. If the distance cannot be computed then it is `null`.
     */
    distance?: number; // in meters
    /**
     * The set of tags that you have previously set (if any) for this transport, if the event is a transport - empty otherwise.
     * @see {SentianceEventTimeline.setTransportTags}
     */
    transportTags: TransportTags;
    /**
     * The detected user occupant role.
     */
    occupantRole: OccupantRole;
  }
  
  export interface GeoLocation {
    latitude: number;
    longitude: number;
    accuracy: number;
  }
  
  export interface Venue {
    location: GeoLocation | null;
    significance: VenueSignificance;
    type: VenueType;
  }
  
  export type VenueType =
    | "UNKNOWN"
    | "DRINK_DAY"
    | "DRINK_EVENING"
    | "EDUCATION_INDEPENDENT"
    | "EDUCATION_PARENTS"
    | "HEALTH"
    | "INDUSTRIAL"
    | "LEISURE_BEACH"
    | "LEISURE_DAY"
    | "LEISURE_EVENING"
    | "LEISURE_MUSEUM"
    | "LEISURE_NATURE"
    | "LEISURE_PARK"
    | "OFFICE"
    | "RELIGION"
    | "RESIDENTIAL"
    | "RESTO_MID"
    | "RESTO_SHORT"
    | "SHOP_LONG"
    | "SHOP_SHORT"
    | "SPORT"
    | "SPORT_ATTEND"
    | "TRAVEL_BUS"
    | "TRAVEL_CONFERENCE"
    | "TRAVEL_FILL"
    | "TRAVEL_HOTEL"
    | "TRAVEL_LONG"
    | "TRAVEL_SHORT"
  
  export type VenueSignificance =
    | "UNKNOWN"
    | "HOME"
    | "WORK"
    | "POINT_OF_INTEREST";
  
  export type EventType =
    | "UNKNOWN"
    | "STATIONARY"
    | "OFF_THE_GRID"
    | "IN_TRANSPORT";
  
  export type TransportMode =
    | "UNKNOWN"
    | "BICYCLE"
    | "WALKING"
    | "RUNNING"
    | "TRAM"
    | "TRAIN"
    | "CAR"
    | "BUS"
    | "MOTORCYCLE";
  
  /**
   * @internal
   */
  export const OCCUPANT_ROLE_VALUES = [
    "DRIVER",
    "PASSENGER",
    "UNAVAILABLE"
  ] as const;
  
  export type OccupantRole = (typeof OCCUPANT_ROLE_VALUES)[number];
  
  export interface Waypoint {
    latitude: number;
    longitude: number;
    accuracy: number;   // in meters
    timestamp: number;  // UTC epoch time in milliseconds
    speedInMps?: number;  // in meters per second
    speedLimitInMps?: number;  // in meters per second
    hasUnlimitedSpeedLimit: boolean;
    isSpeedLimitInfoSet: boolean;
    isSynthetic: boolean;
  }
  
  export type TransportTags = { [key: string]: string };
  
  export declare const getTimelineUpdates: (afterEpochTimeMs: number, includeProvisionalEvents?: boolean) => Promise<Event[]>;
  export declare const getTimelineEvents: (fromEpochTimeMs: number, toEpochTimeMs: number, includeProvisionalEvents?: boolean) => Promise<Event[]>;
  export declare const getTimelineEvent: (eventId: string) => Promise<Event | null>;
  export declare const setTransportTags: (tags: TransportTags) => Promise<void>;
  export declare const addTimelineUpdateListener: (listener: TimelineUpdateListener, includeProvisionalEvents?: boolean) => Promise<EmitterSubscription>;
  export declare const submitOccupantRoleFeedback: (transportId: string, occupantRoleFeedback: OccupantRoleFeedback) => Promise<OccupantRoleFeedbackResult>;
  
  export interface SentianceEventTimeline {
    /**
     * Returns all updated events in the event timeline after the specified date, sorted by the last update time.
     *
     * @remarks
     * This method returns all events that started after `afterEpochTimeMs`, but it may also return events
     * that started before `afterEpochTimeMs`, if they were updated afterward. The returned result is not
     * necessarily the complete list of events that were captured by the SDK from the result's first event until the
     * last, because events that were not updated will be excluded. To get a complete and ordered list of
     * events for a given date range, use {@link getTimelineEvents} instead.
     *
     * You can use this method along with {@link addTimelineUpdateListener} to stay
     * up to date with the latest events in the timeline. For example, to make sure you don't miss out on timeline
     * updates, you can first set an update listener, then follow up by using this method to query for potential
     * updates since the last update you received.
     *
     * @param afterEpochTimeMs - The timestamp (in milliseconds) to retrieve updates from. The specified timestamp is **exclusive**.
     * @param includeProvisionalEvents - Optional parameter. Set to `true` if you want to include provisional events. Default is `false`.
     *
     * @returns A Promise that resolves with an array of Event objects that occurred in the specified time range.
     * If no events are found, an empty array is returned.
     *
     * @example
     * ```typescript
     * import timeline from "@sentiance-react-native/event-timeline";
     *
     * // Get timeline updates including provisional events from one hour ago
     * const oneHourAgo = Date.now() - (60 * 60 * 1000);
     * const events = await timeline.getTimelineUpdates(oneHourAgo, true);
     * ```
     */
    getTimelineUpdates(
      afterEpochTimeMs: number,
      includeProvisionalEvents?: boolean
    ): Promise<Event[]>;
  
    /**
     * Returns timeline events, such as transport and stationary events, that were captured during the specified
     * time range. The events are ordered from oldest to newest.
     *
     * @remarks
     * Events that were captured outside the specified date range are not returned, even if they were updated
     * during this date range. To get all updates, regardless of when an event was captured, use the
     * {@link getTimelineUpdates} function instead.
     *
     * @param fromEpochTimeMs - The start timestamp (in milliseconds, inclusive) of the time range.
     * @param toEpochTimeMs - The end timestamp (in milliseconds, inclusive) of the time range.
     * @param includeProvisionalEvents - Optional parameter. Set to `true` if you want to include provisional events. Default is `false`.
     *
     * @returns A Promise that resolves with an array of Event objects that occurred in the specified time range.
     * If no events are found, an empty array is returned.
     *
     * @example
     * ```typescript
     * import eventTimeline from "@sentiance-react-native/event-timeline";
     *
     * // Get all timeline events including provisional ones
     * const events = await eventTimeline.getTimelineEvents(0, Date.now(), true);
     * ```
     */
    getTimelineEvents(
      fromEpochTimeMs: number,
      toEpochTimeMs: number,
      includeProvisionalEvents?: boolean
    ): Promise<Event[]>;
  
    /**
     * Returns the timeline event with the specified ID.
     *
     * @param eventId - The ID of the event to query.
     *
     * @returns A Promise that resolves with a matching {@link Event} object, or `null` if no such event exists.
     *
     * @example
     * ```typescript
     * import eventTimeline from "@sentiance-react-native/event-timeline";
     * const event: Event | null = await eventTimeline.getTimelineEvent("some_event_id");
     * ```
     */
    getTimelineEvent(eventId: string): Promise<Event | null>;
  
    /**
     * Sets a listener that is invoked when the event timeline is updated. The listener receives the updated
     * events. An update can be triggered by the start of a new event, and the update or end of an existing one.
     * Every invocation of the listener will deliver an event that has a {@link Event.lastUpdateTimeEpoch | last update time}
     * that is equal to or greater than the previously delivered event's {@link Event.lastUpdateTimeEpoch | last update time}.
     *
     * @remarks
     * You can use this function along with {@link getTimelineUpdates} to stay up to date with the latest
     * events in the timeline. For example, to make sure you don't miss out on timeline updates, you can first set an
     * update listener using this method, then follow up by calling {@link getTimelineUpdates} to query for
     * potential updates since the last update you received.
     *
     * @param onTimelineUpdated - The callback to receive event timeline updates.
     * @param includeProvisionalEvents - Optional parameter. Set to `true` if you want to include provisional events. Default is `false`.
     *
     * @returns A Promise that resolves with a subscription object that you can use to remove the set listener.
     *
     * @example
     * ```typescript
     * import timeline from "@sentiance-react-native/event-timeline";
     *
     * // Set a timeline updater listener for non-provisional updates
     * const subscription = await timeline.addTimelineUpdateListener(
     *     (event) => console.log(event)
     * );
     *
     * // Remove the listener
     * await subscription.remove();
     * ```
     */
    addTimelineUpdateListener(
      onTimelineUpdated: (event: Event) => void,
      includeProvisionalEvents?: boolean
    ): Promise<EmitterSubscription>;
  
    /**
     * Sets the tags that will be assigned to a detected transport.
     *
     * @remarks
     * The provided tags will be assigned to a transport at the moment the transport ends. When you
     * receive an {@link Event} representing the ended transport, it will include these tags.
     *
     * The supplied tags are persisted and applied to future transports, even after the app is restarted.
     * By calling this method again, you will replace the tags that will be assigned to future transports.
     *
     * You can include up to 6 tags (key-value pairs), and each tag component (key or value) must
     * be at most 256 characters.
     *
     * @example Setting custom transport tags
     * ```typescript
     * try {
     *   await SentianceEventTimeline.setTransportTags({
     *    key1: "value1",
     *    key2: "value2"
     *   });
     *   console.log('Transport tags have been set.');
     * } catch (error) {
     *   if (error instanceof TransportTagsError) {
     *     console.error(`Failed to set transport tags: ${error.message}`);
     *   } else {
     *     console.error(`Error: ${error.message}`);
     *   }
     * }
     * ```
     *
     * @param tags The transport tags to set
     *
     * @throws TransportTaggingError if the supplied tags count is more than 6, or if one of the tag components exceeds
     * the 256 characters limit.
     */
    setTransportTags(tags: TransportTags): Promise<void>;
  
    sentianceFeedback: SentianceFeedback;
  }
  
  /**
   * @deprecated Use SentianceEventTimeline instead.
   */
  export type EventTimelineApi = SentianceEventTimeline;
  
  declare const module: SentianceEventTimeline;
  export default module;
}

Last updated