UNPKG

@logsnag/next

Version:

LogSnag client for Next applications

232 lines (183 loc) 5.65 kB
<div align="center"> <img src="https://logsnag.com/og-image.png" alt="LogSnag"/> <br> <h1>@logsnag/next</h1> <p>Clear, Simple, Effective Product Analytics for SaaS.</p> <a href="https://www.npmjs.com/package/@logsnag/next"><img src="https://img.shields.io/npm/v/@logsnag/next" alt="NPM Version"></a> <a href="https://discord.gg/dY3pRxgWua"><img src="https://img.shields.io/discord/922560704454750245?color=%237289DA&label=Discord" alt="Discord"></a> <a href="https://docs.logsnag.com"><img src="https://img.shields.io/badge/Docs-LogSnag" alt="Documentation"></a> <br> <br> </div> ## Installation ### Using npm ```bash npm install @logsnag/next ``` ### Using yarn ```bash yarn add @logsnag/next ``` ### Using pnpm ```bash pnpm add @logsnag/next ``` ## Usage The usage depends on whether you are using the app directory structure or the pages directory structure. > Set your token's scope to `public` in the LogSnag dashboard **App Directory:** In the app directory, you need to import the LogSnagProvider as a head element in your root layout component: ```tsx import { LogSnagProvider } from '@logsnag/next'; export default function RootLayout({ children }: { children: React.ReactNode; }) { return ( <html lang="en"> <head> <LogSnagProvider token='<TOKEN_NAME>' project='<PROJECT_NAME>' /> {/* Other head elements */} </head> <body> {/* Your layout */} <main>{children}</main> </body> </html> ); } ``` For setting the user id in server components, use the `SetUserIdServerComponent`: ```tsx import { SetUserIdServerComponent } from '@logsnag/next'; export default function Page() { const userId: string | null = 'user-123'; return ( <> {/* Your page content */} <SetUserIdServerComponent userId={userId} /> </> ); } ``` **Pages Directory:** In the pages directory, you can wrap your app with the LogSnagProvider, similar to how you would do in a React application: ```tsx import { LogSnagProvider } from '@logsnag/next'; export default function App({ Component, pageProps }: AppProps) { return ( <LogSnagProvider token='<TOKEN_NAME>' project='<PROJECT_NAME>'> {/* Your app content */} <Component {...pageProps} /> </LogSnagProvider> ); } ``` ## Hooks The `useLogSnag` hook can be used across your client components and provides the following methods: - `track(options: TrackOptions)`: Track custom events. - `identify(options: IdentifyOptions)`: Identify user traits. - `setUserId(userId: string | null)`: Set the user id for the current user. If the user is not logged in, pass null. - `clearUserId()`: Clear the user id for the current user. - `setDebug(flag: boolean = true)`: Set debug mode for logging. **Usage:** ```tsx import { useLogSnag } from '@logsnag/next'; export function Component() { // Get the hooks const { setUserId, track, identify } = useLogSnag(); // Set the user id when a user logs in setUserId('user-123'); // Track an event track({ channel: "payments", event: "New Subscription", user_id: "user-123", // optional when set using setUserId icon: "💰", notify: true, tags: { plan: "premium", cycle: "monthly", trial: false } }); // Identify user traits (e.g., name, email, plan, etc.) identify({ user_id: "user-123", // optional when set using setUserId properties: { name: "John Doe", email: "john@doe.com", plan: "premium", } }); // Rest of your component } ``` These hooks have the same usage as their counterparts in the [@logsnag/react](https://www.npmjs.com/package/@logsnag/react) package. ## Tracking Events You can also track events directly from HTML elements using data attributes: ```jsx <button data-event="Upgraded Plan" data-user-id="user-123" // optional (optional when set using setUserId) data-channel="billing" // optional (defaults to "events") data-icon=":moneybag:" // optional data-tag-plan="Pro" // optional data-tag-period="Monthly" // optional data-tag-price="9.99" // optional > Upgrade to Pro </button> ``` In this example, when the button is clicked, an event named "Upgraded Plan" will be tracked with the specified tags. ## Server-side Usage with Next For server-side usage, you can use LogSnag from `@logsnag/next/server` It behaves similarly to [`@logsnag/node`](https://www.npmjs.com/package/@logsnag/node) > Use a different token for server-side usage and set its scope to `private` in the LogSnag dashboard. ```typescript import { LogSnag } from '@logsnag/next/server'; // Initialize LogSnag const logsnag = new LogSnag({ token: '<TOKEN>', project: '<PROJECT_NAME>', }); // Use it in your server-side code // Track an event await logsnag.track({ channel: "payments", event: "New Subscription", user_id: "user-123", icon: "💰", notify: true, tags: { plan: "premium", cycle: "monthly", trial: false } }); // Identify a user await logsnag.identify({ user_id: "user-123", properties: { name: "John Doe", email: "john@doe.com", plan: "premium", } }); // Track an insight await logsnag.insight.track({ title: "User Count", value: "100", icon: "👨", }); // Increment an insight value await logsnag.insight.increment({ title: "User Count", value: 1, icon: "👨", }); ``` ## API Documentation For more information about the LogSnag API, see: [docs.logsnag.com](https://docs.logsnag.com) ## Support If you encounter any problems or issues, please contact us at [shayan@logsnag.com](mailto:shayan@logsnag.com)