UNPKG

visitory-sdk

Version:

Feature flags and analytics SDK for Visitory

292 lines (257 loc) 7.32 kB
StatsIG SDK A TypeScript/JavaScript SDK for feature flags and analytics, with first-class React support. Installation bashnpm install @your-org/statsig-sdk # or yarn add @your-org/statsig-sdk Quick Start Vanilla JavaScript/TypeScript typescriptimport { initialize, checkFeatureFlag, trackCustomEvent } from '@your-org/statsig-sdk' // Initialize the SDK initialize({ apiKey: 'your-api-key', userAttributes: { age: 28, country: 'US', subscription_tier: 'premium' } }) // Check feature flags const result = await checkFeatureFlag('new-feature') if (result.enabled) { console.log('Feature enabled for segments:', result.matchedSegments) // Show new feature } // Track events trackCustomEvent('button_clicked', { button: 'sign-up', page: '/landing' }) React tsximport React from 'react' import { StatsigProvider, useFeatureFlag, FeatureFlag } from '@your-org/statsig-sdk' // 1. Wrap your app with StatsigProvider function App() { return ( <StatsigProvider config={{ apiKey: 'your-api-key', userAttributes: { age: 28, country: 'US', subscription_tier: 'premium' } }} > <Dashboard /> </StatsigProvider> ) } // 2. Use feature flags in components function Dashboard() { const { enabled, loading } = useFeatureFlag('new-dashboard') if (loading) return <div>Loading...</div> return ( <div> {enabled ? <NewDashboard /> : <OldDashboard />} {/* Or use the component */} <FeatureFlag flagKey="premium-features" fallback={<UpgradePrompt />}> <PremiumFeatures /> </FeatureFlag> </div> ) } Core Concepts User Attributes Instead of user IDs, this SDK uses user attributes to determine feature flag eligibility based on segments you create in your dashboard. typescriptconst userAttributes = { age: 25, // Number country: 'US', // String subscription_tier: 'premium', // String device_type: 'mobile', // String signup_date: '2024-01-15' // String (dates) } Segments Create segments in your dashboard with criteria like: age > 25 (users older than 25) country = "US" (US users) subscription_tier in "premium,enterprise" (premium users) Feature Flags Feature flags are associated with segments. When you check a flag, the SDK evaluates your user attributes against segment criteria. API Reference Core Functions initialize(config: StatsigConfig) Initialize the SDK with your configuration. typescriptinterface StatsigConfig { apiKey: string // Your project API key baseUrl?: string // Custom API endpoint userAttributes?: Record<string, any> // Default user attributes sessionId?: string // Custom session ID } checkFeatureFlag(flagKey: string, userAttributes?: Record<string, any>) Check if a feature flag is enabled. typescriptconst result = await checkFeatureFlag('new-checkout', { subscription_tier: 'premium' }) // Returns: { enabled: boolean, matchedSegments?: string[], reason?: string } trackCustomEvent(eventName: string, properties?: Record<string, any>) Track a custom event. typescriptawait trackCustomEvent('purchase_completed', { amount: 99.99, currency: 'USD', item_count: 3 }) React Hooks useFeatureFlag(flagKey: string, userAttributes?: Record<string, any>) Hook for checking feature flags with loading states. tsxconst { enabled, loading, matchedSegments } = useFeatureFlag('new-feature') useTracking() Hook for tracking events. tsximport { useTracking } from '@your-org/statsig-sdk' const { trackClick, trackPageView, trackCustomEvent } = useTracking() const handleClick = () => { trackClick('hero-button', { variant: 'blue' }) } useUserAttributes() Hook for managing user attributes. tsximport { useUserAttributes } from '@your-org/statsig-sdk' const { updateAttributes, getAttributes } = useUserAttributes() // Update when user logs in useEffect(() => { updateAttributes({ age: user.age, subscription_tier: user.plan }) }, [user]) React Components <FeatureFlag> Conditional rendering based on feature flags. tsx<FeatureFlag flagKey="premium-features" userAttributes={{ subscription_tier: 'premium' }} fallback={<UpgradePrompt />} loading={<Spinner />} > <PremiumContent /> > </FeatureFlag> > withFeatureFlag(flagKey, userAttributes?)(Component) > Higher-order component for feature flags. > tsxconst BetaFeature = withFeatureFlag('beta-features')(MyComponent) > Advanced Usage > Dynamic User Attributes > Update user attributes as your app state changes: > tsximport { useUserAttributes } from '@your-org/statsig-sdk' function UserProfile({ user }) { const { updateAttributes } = useUserAttributes() useEffect(() => { updateAttributes({ age: user.age, country: user.country, subscription_tier: user.plan, days_since_signup: Math.floor((Date.now() - user.createdAt) / (1000 _ 60 _ 60 \* 24)) }) }, [user]) return <div>...</div> } A/B Testing tsxconst { variant } = useVariant('homepage-test', ['control', 'variant-a', 'variant-b']) switch (variant) { case 'variant-a': return <HeroVariantA /> case 'variant-b': return <HeroVariantB /> default: return <HeroControl /> } Page View Tracking with React Router tsximport { useLocation } from 'react-router-dom' import { useTracking } from '@your-org/statsig-sdk' function PageTracker() { const location = useLocation() const { trackPageView } = useTracking() useEffect(() => { trackPageView(location.pathname) }, [location]) return null } Error Handling tsxconst { enabled, loading, error } = useFeatureFlag('risky-feature') if (error) { // Flag evaluation failed, use safe default return <SafeDefault /> } Environment Setup Environment Variables bash# .env REACT_APP_STATSIG_API_KEY=your_api_key_here REACT_APP_STATSIG_BASE_URL=https://your-app.vercel.app TypeScript Support The SDK is written in TypeScript and includes full type definitions. typescriptimport type { StatsigConfig, FeatureFlagResult } from '@your-org/statsig-sdk' Examples E-commerce tsxfunction CheckoutButton({ cart }) { const { enabled: expressCheckout } = useFeatureFlag('express-checkout') const { trackCustomEvent } = useTracking() const handleCheckout = () => { trackCustomEvent('checkout_started', { cart_value: cart.total, checkout_type: expressCheckout ? 'express' : 'standard' }) } return expressCheckout ? ( <button onClick={handleCheckout} className="express"> Express Checkout </button> ) : ( <button onClick={handleCheckout}> Proceed to Checkout </button> ) } User Onboarding tsxfunction Onboarding({ user }) { const { enabled: newOnboarding } = useFeatureFlag('new-onboarding-flow', { signup_date: user.signupDate, account_type: user.type }) return newOnboarding ? <NewOnboardingFlow /> : <ClassicOnboarding /> } Feature Rollout tsxfunction BetaFeatures() { const { enabled: betaAccess } = useFeatureFlag('beta-program', { subscription_tier: 'enterprise', beta_opt_in: true }) if (!betaAccess) { return ( <div> <h2>Beta Features</h2> <p>Join our beta program to access cutting-edge features!</p> <button>Request Beta Access</button> </div> ) } return <BetaProgramDashboard /> } Building and Publishing Development bashnpm run dev # Watch mode npm run build # Production build npm run test # Run tests npm run lint # Lint code Publishing bashnpm run build npm publish Browser Support Chrome/Edge 88+ Firefox 85+ Safari 14+ Node.js 16+ License MIT Support For questions and support, please refer to the main platform documentation or create an issue in the repository.