A version written into a manifest is written into every manifest that wants it, which is how eslint came to exist in a hundred and four forms across this estate and how a package came to resolve twice at run time. The catalog moves the number out of the manifest: a manifest names the package, the workspace names the version. Four are held below their latest because the newer release cannot be used, and the reason is recorded rather than the version alone: @noble/hashes 2 renamed every subpath the web3 stack imports, @splinetool/runtime 2 depends on a package that was never published, @dynamic-labs 5.4.1 the same, and react-resizable-panels 3 points its types condition at the bundle.
@hanzo/react
React components and hooks for Insights analytics integration.
Installation
npm install @hanzo/react @hanzo/insights
Usage
Setting up the Provider
Wrap your application with InsightsProvider to make the Insights client available throughout your app:
import { InsightsProvider } from '@hanzo/react'
function App() {
return (
<InsightsProvider apiKey="<YOUR_PROJECT_API_KEY>" options={{ api_host: 'https://us.i.insights.hanzo.ai' }}>
<YourApp />
</InsightsProvider>
)
}
Or pass an existing Insights client instance:
import insights from '@hanzo/insights'
import { InsightsProvider } from '@hanzo/react'
// Initialize your client
insights.init('<YOUR_PROJECT_API_KEY>', { api_host: 'https://us.i.insights.hanzo.ai' })
function App() {
return (
<InsightsProvider client={insights}>
<YourApp />
</InsightsProvider>
)
}
Hooks
useInsights
Access the Insights client instance to capture events, identify users, etc.
import { useInsights } from '@hanzo/react'
function MyComponent() {
const insights = useInsights()
const handleClick = () => {
insights.capture('button_clicked', { button_name: 'signup' })
}
return <button onClick={handleClick}>Sign Up</button>
}
useFeatureFlagEnabled
Check if a feature flag is enabled for the current user.
import { useFeatureFlagEnabled } from '@hanzo/react'
function MyComponent() {
const isEnabled = useFeatureFlagEnabled('new-feature')
if (isEnabled) {
return <NewFeature />
}
return <OldFeature />
}
By default the hook returns boolean | undefined, where undefined means the flags haven't loaded yet or the flag is absent. Pass a defaultValue to use instead of undefined in those cases — the return type then narrows to boolean:
// false until proven enabled
const isEnabled = useFeatureFlagEnabled('new-feature', false)
useFeatureFlagVariantKey
Get the variant key for a multivariate feature flag.
import { useFeatureFlagVariantKey } from '@hanzo/react'
function MyComponent() {
const variant = useFeatureFlagVariantKey('experiment-flag')
if (variant === 'control') {
return <ControlVariant />
}
if (variant === 'test') {
return <TestVariant />
}
return null
}
useFeatureFlagPayload
Get the payload associated with a feature flag.
import { useFeatureFlagPayload } from '@hanzo/react'
function MyComponent() {
const payload = useFeatureFlagPayload('feature-with-payload')
return <div>Config: {JSON.stringify(payload)}</div>
}
useActiveFeatureFlags
Get all active feature flags for the current user.
import { useActiveFeatureFlags } from '@hanzo/react'
function MyComponent() {
const activeFlags = useActiveFeatureFlags()
return (
<ul>
{activeFlags?.map((flag) => (
<li key={flag}>{flag}</li>
))}
</ul>
)
}
Components
InsightsFeature
A component that renders content based on a feature flag's value. Automatically tracks feature views and interactions.
import { InsightsFeature } from '@hanzo/react'
function MyComponent() {
return (
<InsightsFeature flag="new-cta" fallback={<OldButton />}>
<NewButton />
</InsightsFeature>
)
}
// With variant matching
function MyComponent() {
return (
<InsightsFeature flag="experiment" match="test" fallback={<ControlVersion />}>
<TestVersion />
</InsightsFeature>
)
}
// With payload as render function
function MyComponent() {
return (
<InsightsFeature flag="banner-config">
{(payload) => <Banner title={payload.title} color={payload.color} />}
</InsightsFeature>
)
}
InsightsErrorBoundary
An error boundary that captures React errors and reports them to Insights.
import { InsightsErrorBoundary } from '@hanzo/react'
function App() {
return (
<InsightsProvider apiKey="<YOUR_PROJECT_API_KEY>">
<InsightsErrorBoundary>
<YourApp />
</InsightsErrorBoundary>
</InsightsProvider>
)
}
Please see the main Insights docs.