UNPKG

expo-quanta

Version:

Quanta.js/Expo: Expo SDK for Quanta Tools

301 lines (214 loc) 6.51 kB
# Quanta.js for Expo A lightweight analytics and screen tracking SDK for React Native and Expo applications. Track screen views, session durations, and handle app state transitions with minimal setup. ## Installation ```bash # Using npm npm install expo-quanta # Using pnpm pnpm install expo-quanta # Using yarn yarn add expo-quanta ``` ## Set AppID You can either call ```ts import { Quanta } from "expo-quanta"; Quanta.initialize("your app id"); ``` in your App's initialization routine, or you can add ```diff { "expo": { "name": "MyApp", "slug": "my-app", "version": "1.0.0", "extra": { + "QuantaId": "your app id" } } } ``` to your app's `app.json` file. ## Requirements The following Expo modules are required: - expo-secure-store - expo-device - expo-constants - expo-localization - expo-application ## Basic Usage ### Track Screen Views Use the `useQuanta` hook to track user time spent on screens: ```jsx import React from "react"; import { View, Text } from "react-native"; import { useQuanta } from "expo-quanta"; function HomeScreen() { useQuanta("HomeScreen", { someOther: "args" }); return ( <View> <Text>Welcome to Home Screen</Text> </View> ); } ``` ## API Reference ### useQuanta Hook The simplest way to track screen views in functional components. This hook automatically handles tracking when a component mounts and unmounts. #### Usage ```jsx import React from "react"; import { View, Text } from "react-native"; import { useQuanta } from "expo-quanta"; function HomeScreen() { // Track this screen with optional metadata useQuanta("HomeScreen", { category: "main", feature: "dashboard" }); return ( <View> <Text>Welcome to Home Screen</Text> </View> ); } ``` #### Parameters - `screenId: string` - Identifier for the screen being tracked - `args?: Record<string, string>` - Optional metadata for the screen view (default: `{}`) The hook automatically: - Starts tracking when the component mounts - Records the time spent on the screen - Handles app background/foreground transitions - Ends tracking when the component unmounts - Sends analytics data to Quanta ### useScreenTracking Hook The more advanced hook for tracking screen views and time spent on each screen, providing greater control over tracking. #### Methods ##### `startScreenView(screenId: string, args?: Record<string, string>)` Start tracking a screen view. ```javascript const { startScreenView, endScreenView } = useScreenTracking(); // Start tracking a screen const handle = startScreenView("ProductDetailsScreen", { productId: "123", category: "electronics", }); // Later, in cleanup: return () => { endScreenView(handle); }; ``` ##### `endScreenView(handle: any)` End tracking a screen view. ```javascript const { startScreenView, endScreenView } = useScreenTracking(); // Example in a useEffect useEffect(() => { const handle = startScreenView("MyScreen", { param: "value" }); return () => { endScreenView(handle); }; }, [startScreenView, endScreenView]); ``` ### SessionStorageService Handles persisting and retrieving session data. ```javascript import { SessionStorageService } from "expo-quanta"; // Check for crash evidence (sessions from previous runs) const hasCrash = await SessionStorageService.hasCrashEvidence(); if (hasCrash) { console.log("App crashed during previous session"); } // Clear all stored sessions await SessionStorageService.clearSessions(); ``` ### Quanta Class Static methods for core analytics. ```javascript import { Quanta } from "expo-quanta"; // Initialize Quanta.initialize("your-project-id"); // Track an event Quanta.log("button_click"); Quanta.log("purchased", { productId: "123" }); ``` ## Advanced Usage ### Handling App Background/Foreground Transitions The `useScreenTracking` hook automatically handles app state transitions, pausing sessions when the app goes to the background and resuming when it returns to the foreground. ### Usage with useEffect For more control over screen tracking, use `useScreenTracking` with `useEffect`: ```javascript import { useScreenTracking } from "expo-quanta"; function MyScreen() { const { startScreenView, endScreenView } = useScreenTracking(); useEffect(() => { const handle = startScreenView("MyScreenName", { customProperty: "value" }); return () => { endScreenView(handle); }; }, [startScreenView, endScreenView]); return ( <View> <Text>My Screen Content</Text> </View> ); } ``` ### Crash Recovery Session data is periodically persisted and can be retrieved after an app crash: ```javascript import { SessionStorageService } from "expo-quanta"; async function checkForCrash() { if (await SessionStorageService.hasCrashEvidence()) { // Get stored sessions from previous run const previousSessions = await SessionStorageService.getStoredSessions(); console.log("Recovered sessions:", previousSessions); // Process crash data // ... // Clear stored sessions await SessionStorageService.clearSessions(); } } ``` ### Custom Session Persistence You can control session persistence timing for special cases: ```javascript const { startScreenView, endScreenView } = useScreenTracking(); // For important screens, you might want to ensure session data is persisted immediately async function navigateToCheckout() { // Track current screen with handle const handle = startScreenView("ProductScreen"); // Later when navigating away endScreenView(handle); // Start tracking checkout process const checkoutHandle = startScreenView("CheckoutScreen"); // Navigate to checkout navigation.navigate("Checkout"); } ``` ## Troubleshooting ### Sessions Not Being Tracked Make sure you're properly using the hooks: ```javascript // For simple cases, use useQuanta useQuanta("MyScreen", { property: "value" }); // For more control, use useScreenTracking with useEffect const { startScreenView, endScreenView } = useScreenTracking(); useEffect(() => { const handle = startScreenView("MyScreen", { property: "value" }); return () => { endScreenView(handle); }; }, [startScreenView, endScreenView]); ``` ### Missing Device Information Ensure you have all the required Expo modules installed and set up correctly in your app.json: ```json "expo": { "plugins": [ "expo-secure-store", "expo-device", "expo-constants", "expo-localization", "expo-application" ] } ```