UNPKG

@promokit/react

Version:

React components for PromoKit marketing infrastructure

394 lines (319 loc) 9.97 kB
# @promokit/react React components for PromoKit - Marketing infrastructure for developers. ## Installation ```bash npm install @promokit/react ``` ## Quick Start Simply import and use any component with your API key - no provider wrapper needed! ```jsx import { Waitlist } from '@promokit/react'; function App() { return ( <Waitlist projectId="your-project-id" apiKey="your-api-key" theme="dark" referralReward="Skip the line" onSignup={(email) => console.log('New signup:', email)} /> ); } ``` ## Components All components are **plug-and-play** - just pass your API credentials as props! ### Waitlist Create viral waitlists with referral mechanics: ```jsx import { Waitlist } from '@promokit/react'; function MyWaitlist() { return ( <Waitlist projectId="your-project-id" apiKey="your-api-key" theme="dark" // 'light', 'dark', or 'auto' referralReward="Skip 10 spots in line" onSignup={(email, referralCode) => { console.log('New signup:', email, referralCode); // Track with your analytics analytics.track('waitlist_signup', { email, referralCode }); }} onError={(error) => { console.error('Waitlist error:', error); // Show user-friendly error message }} customStyles={{ backgroundColor: '#1a1a1a', borderRadius: '16px' }} className="my-custom-class" /> ); } ``` **Props:** - `projectId` (string, required) - Your project ID - `apiKey` (string, required) - Your PromoKit API key - `theme` ('light' | 'dark' | 'auto', optional) - Color theme, defaults to 'dark' - `referralReward` (string, optional) - Text describing referral reward, defaults to 'Skip the line' - `customStyles` (React.CSSProperties, optional) - Custom CSS styles - `onSignup` (function, optional) - Callback when user signs up: `(email: string, referralCode?: string) => void` - `onError` (function, optional) - Error handler: `(error: Error) => void` - `className` (string, optional) - Additional CSS classes ### TestimonialWall Display customer testimonials and reviews: ```jsx import { TestimonialWall } from '@promokit/react'; function MyTestimonials() { return ( <TestimonialWall productId="your-project-id" apiKey="your-api-key" layout="masonry" // 'grid', 'masonry', or 'carousel' theme="auto" maxItems={12} autoRefresh={true} showRating={true} onTestimonialClick={(testimonial) => { console.log('Clicked testimonial:', testimonial); // Handle testimonial click }} className="testimonials-container" /> ); } ``` **Props:** - `productId` (string, required) - Your project ID - `apiKey` (string, required) - Your PromoKit API key - `layout` ('grid' | 'masonry' | 'carousel', optional) - Layout style, defaults to 'grid' - `theme` ('light' | 'dark' | 'auto', optional) - Color theme, defaults to 'dark' - `autoRefresh` (boolean, optional) - Auto-refresh testimonials every 30 seconds, defaults to false - `maxItems` (number, optional) - Maximum testimonials to display, defaults to 12 - `showRating` (boolean, optional) - Show star ratings, defaults to true - `onTestimonialClick` (function, optional) - Click handler: `(testimonial: Testimonial) => void` - `className` (string, optional) - Additional CSS classes ### ChangelogFeed Show product updates and changelogs: ```jsx import { ChangelogFeed } from '@promokit/react'; function MyChangelog() { return ( <ChangelogFeed projectId="your-project-id" apiKey="your-api-key" theme="light" showSubscribe={true} compact={false} maxItems={10} onVersionClick={(entry) => { console.log('Clicked version:', entry); // Handle version click }} className="changelog-feed" /> ); } ``` **Props:** - `projectId` (string, required) - Your project ID - `apiKey` (string, required) - Your PromoKit API key - `theme` ('light' | 'dark' | 'auto', optional) - Color theme, defaults to 'dark' - `showSubscribe` (boolean, optional) - Show email subscription form, defaults to true - `compact` (boolean, optional) - Compact layout without full content, defaults to false - `maxItems` (number, optional) - Maximum entries to display, defaults to 10 - `onVersionClick` (function, optional) - Click handler: `(entry: ChangelogEntry) => void` - `className` (string, optional) - Additional CSS classes ## Styling ### Theme Support All components support three theme modes: - `'light'` - Light theme - `'dark'` - Dark theme - `'auto'` - Automatically detects user's system preference ### Custom Styles Pass custom styles via the `customStyles` prop: ```jsx <Waitlist projectId="your-project-id" apiKey="your-api-key" customStyles={{ backgroundColor: 'var(--your-bg-color)', borderRadius: '12px', boxShadow: '0 4px 6px rgba(0, 0, 0, 0.1)', maxWidth: '400px' }} /> ``` ### CSS Classes Add custom CSS classes for additional styling: ```jsx <Waitlist projectId="your-project-id" apiKey="your-api-key" className="my-waitlist-styles custom-border" /> ``` ```css .my-waitlist-styles { border: 2px solid #8b5cf6; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); } .custom-border { border-radius: 20px; } ``` ## Provider Pattern (Optional) For better organization, you can wrap your components in a `PromoProvider`: ```jsx import { PromoProvider, Waitlist, TestimonialWall } from '@promokit/react'; function App() { return ( <PromoProvider config={{ apiKey: 'your-api-key' }}> <Waitlist projectId="your-project-id" /> <TestimonialWall productId="your-product-id" /> </PromoProvider> ); } ``` When using `PromoProvider`, you don't need to pass `apiKey` to individual components. ## Referral System The referral system is handled centrally by PromoKit.pro. Here's how it works: ### Basic Setup 1. **User joins waitlist**: Component calls PromoKit API with optional referral code 2. **PromoKit generates referral URL**: `https://promokit.pro?ref=ABC123` 3. **User shares link**: Referral tracking happens automatically ### Detecting Referrals Use the `useReferral` hook to detect referral codes from URLs: ```jsx import { useReferral, Waitlist } from '@promokit/react'; function MyWaitlist() { const { referralCode, isLoaded } = useReferral(); if (!isLoaded) return <div>Loading...</div>; return ( <Waitlist projectId="your-project-id" apiKey="your-api-key" referralCode={referralCode} onSignup={(email, newReferralCode) => { console.log('Signup with referral:', referralCode); console.log('User received code:', newReferralCode); }} /> ); } ``` ### URL Parameters The `useReferral` hook automatically detects these URL parameters: - `?ref=ABC123` - Standard referral code - `?referral=ABC123` - Alternative referral parameter - `?invite=ABC123` - Invitation code ### Full Example ```jsx import { useReferral, Waitlist } from '@promokit/react'; function App() { const { referralCode, isLoaded, referralData } = useReferral({ persistent: true, // Store referral for future visits trackAnalytics: true // Auto-track with analytics tools }); return ( <div> {isLoaded && ( <Waitlist projectId="your-project-id" apiKey="your-api-key" referralCode={referralCode} onSignup={(email, newReferralCode) => { // Track the signup if (referralCode) { analytics.track('Referral Signup', { referrer_code: referralCode, new_user_code: newReferralCode, email }); } }} /> )} </div> ); } ``` ## TypeScript Support All components come with full TypeScript definitions: ```typescript interface WaitlistProps { projectId: string; apiKey?: string; theme?: 'light' | 'dark' | 'auto'; referralReward?: string; referralCode?: string; customStyles?: React.CSSProperties; onSignup?: (email: string, referralCode?: string) => void; onError?: (error: Error) => void; showDetailedErrors?: boolean; enableRetry?: boolean; className?: string; } interface TestimonialWallProps { productId: string; apiKey?: string; layout?: 'grid' | 'masonry' | 'carousel'; theme?: 'light' | 'dark' | 'auto'; autoRefresh?: boolean; maxItems?: number; showRating?: boolean; onTestimonialClick?: (testimonial: Testimonial) => void; onError?: (error: Error) => void; showDetailedErrors?: boolean; enableRetry?: boolean; className?: string; } interface ChangelogFeedProps { projectId: string; apiKey?: string; theme?: 'light' | 'dark' | 'auto'; showSubscribe?: boolean; compact?: boolean; maxItems?: number; onVersionClick?: (entry: ChangelogEntry) => void; onError?: (error: Error) => void; showDetailedErrors?: boolean; enableRetry?: boolean; className?: string; } ``` ## Error Handling All components include comprehensive error handling: ```jsx <Waitlist projectId="your-project-id" apiKey="your-api-key" showDetailedErrors={true} // Show detailed error messages enableRetry={true} // Show retry button on errors onError={(error) => { // Handle errors (e.g., show toast notification) if (error.status === 409) { toast.error('Email already on waitlist'); } else { toast.error('Something went wrong'); } }} /> ``` ## Next.js Support PromoKit works seamlessly with Next.js: ```jsx import dynamic from 'next/dynamic'; // Dynamically import to avoid SSR issues const Waitlist = dynamic(() => import('@promokit/react').then(mod => ({ default: mod.Waitlist })), { ssr: false }); export default function HomePage() { return ( <div> <h1>Join our waitlist</h1> <Waitlist projectId="your-project-id" apiKey="your-api-key" /> </div> ); } ```