Docs
Integrations
React Router

React Router Integration

Mount FeatureDropProvider above route switching so state survives navigation.

src/main.tsx
import React from 'react'
import ReactDOM from 'react-dom/client'
import { BrowserRouter, Routes, Route } from 'react-router-dom'
import { LocalStorageAdapter } from 'featuredrop'
import { ChangelogWidget, FeatureDropProvider, Tour } from 'featuredrop/react'
import { manifest } from './featuredrop.manifest'
 
const tourSteps = [
  { id: 'nav', target: '#main-nav', title: 'Navigation', content: 'Find updates in the left nav.' }
]
 
function AppShell() {
  return (
    <FeatureDropProvider
      manifest={manifest}
      storage={new LocalStorageAdapter({ prefix: 'featuredrop' })}
      appVersion={__APP_VERSION__}
    >
      <ChangelogWidget />
      <Tour id="first-session-tour" steps={tourSteps} />
 
      <Routes>
        <Route path="/" element={<DashboardPage />} />
        <Route path="/settings" element={<SettingsPage />} />
      </Routes>
    </FeatureDropProvider>
  )
}
 
ReactDOM.createRoot(document.getElementById('root')!).render(
  <BrowserRouter>
    <AppShell />
  </BrowserRouter>
)

Common mistakes

  • Mounting provider inside page components (state resets per route)
  • Recreating adapters every render
  • Mounting cross-route tours too low in the tree

Use one provider per app shell unless you intentionally need isolated state.