Skip to main content

@gasket/data Examples

This document provides working examples for all exported functions from @gasket/data.

gasketData()

Client-side function to retrieve Gasket data from the DOM. This function looks for a script tag with id GasketData and parses its JSON content.

Fetch Wrapper Pattern

Best practice is to use gasketData() in utility functions rather than directly in React components:

import { gasketData } from '@gasket/data';

async function fetchSomeData() {
// Must be called in the browser
if (typeof window !== 'undefined') {
const data = gasketData();
return fetch(`${data.apiUrl}/some-endpoint`);
}
throw new Error('gasketData() can only be called in the browser');
}

// Usage
async function loadUserData() {
const response = await fetchSomeData();
return response.json();
}

The best practice for React components is to use the useGasketData hook from @gasket/nextjs. Note that this requires withGasketDataProvider to be set up in your app:

'use client';
// app/components/ClientConfig.js
import { useGasketData } from '@gasket/nextjs';

export default function ClientConfig() {
const data = useGasketData();

return (
<div>
<h1>Welcome to {data.appName || 'My App'}</h1>
<p>API URL: {data.apiUrl || 'Not configured'}</p>
<p>Environment: {data.env || 'Unknown'}</p>
</div>
);
}

Note: The useGasketData hook requires withGasketDataProvider to be configured in your app. See the @gasket/nextjs documentation for setup instructions.

App Router Client Component (Alternative)

If you need to use gasketData() directly, use App Router with 'use client' directive:

'use client';
// app/components/ClientConfig.js
import { gasketData } from '@gasket/data';

export default function ClientConfig() {
const data = gasketData();

return (
<div>
<h1>Welcome to {data.appName || 'My App'}</h1>
<p>API URL: {data.apiUrl || 'Not configured'}</p>
<p>Environment: {data.env || 'Unknown'}</p>
</div>
);
}

resolveGasketData(gasket, req)

Universal function that works on both client and server. On the client, it calls gasketData(). On the server, it calls gasket.actions.getPublicGasketData(req).

Next.js getInitialProps (Page Router)

This example shows resolveGasketData working universally - it runs on the server for first requests, then in the browser for client-side routing.

// pages/profile.js
import { resolveGasketData } from '@gasket/data';
import gasket from '../gasket.js';

export default function ProfilePage({ user, gasketData }) {
return (
<div>
<h1>Welcome, {user.name}</h1>
<p>API URL: {gasketData.apiUrl}</p>
<p>Environment: {gasketData.env}</p>
</div>
);
}

ProfilePage.getInitialProps = async ({ req }) => {
// resolveGasketData automatically handles:
// - Server-side: calls gasket.actions.getPublicGasketData(req)
// - Client-side: calls gasketData() from DOM (req will be undefined)
const data = await resolveGasketData(gasket, req);

// Fetch user data using the API URL from Gasket data
// Note: In real apps, consider using a fetch abstraction that handles SSR
const apiUrl = data.apiUrl || 'http://localhost:3000';
const userResponse = await fetch(`${apiUrl}/user`);
const user = await userResponse.json();

return {
user,
gasketData: data
};
};

Server-Side Usage in Middleware

// middleware/data-middleware.js
import { resolveGasketData } from '@gasket/data';

export default function dataMiddleware(gasket) {
return async (req, res, next) => {
try {
const data = await resolveGasketData(gasket, req);
console.log(data);
next();
} catch (error) {
console.error('Failed to resolve Gasket data:', error);
next(error);
}
};
}

In a Next.js API Route

// pages/api/config.js
import { resolveGasketData } from '@gasket/data';
import gasket from '../../gasket.js';

export default async function handler(req, res) {
const data = await resolveGasketData(gasket, req);

res.json({
apiUrl: data.apiUrl,
version: data.version,
environment: data.env
});
}

Server Component (Next.js App Router)

// app/components/ServerComponent.js
import { resolveGasketData } from '@gasket/data';
import { request } from '@gasket/nextjs/request';
import gasket from '../gasket.js';

export default async function ServerComponent() {
const req = await request();
const data = await resolveGasketData(gasket, req);

return (
<div>
<h2>Server Config</h2>
<p>API URL: {data.apiUrl}</p>
<p>Environment: {data.env}</p>
</div>
);
}

Common Patterns

Conditional Rendering Based on Data

'use client';
import { useGasketData } from '@gasket/nextjs';

function ConditionalFeature() {
const data = useGasketData();
const { features = {}, env } = data || {};

// Only show in development or when beta features are enabled
if (env !== 'development' && !features?.showBetaFeatures) {
return null;
}

// BetaFeature is a placeholder component for demonstration purposes
return <BetaFeature />;
}

Alternative with Direct gasketData

'use client';
import { gasketData } from '@gasket/data';

function ConditionalFeature() {
const data = gasketData();
const { features = {}, env } = data || {};

// Only show in development or when beta features are enabled
if (env !== 'development' && !features?.showBetaFeatures) {
return null;
}

// BetaFeature is a placeholder component for demonstration purposes
return <BetaFeature />;
}