@amplitude/wizard 1.0.0-beta.2 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +171 -74
- package/dist/bin.js +338 -222
- package/dist/src/lib/agent-interface.js +64 -9
- package/dist/src/lib/agent-runner.js +1 -10
- package/dist/src/lib/api.d.ts +22 -4
- package/dist/src/lib/api.js +114 -12
- package/dist/src/lib/commandments.js +14 -1
- package/dist/src/lib/constants.d.ts +6 -5
- package/dist/src/lib/constants.js +13 -13
- package/dist/src/lib/credential-resolution.d.ts +45 -0
- package/dist/src/lib/credential-resolution.js +311 -0
- package/dist/src/lib/exit-codes.d.ts +10 -0
- package/dist/src/lib/exit-codes.js +12 -0
- package/dist/src/lib/health-checks/statuspage.d.ts +1 -0
- package/dist/src/lib/health-checks/statuspage.js +5 -1
- package/dist/src/lib/mode-config.d.ts +14 -0
- package/dist/src/lib/mode-config.js +14 -0
- package/dist/src/lib/session-checkpoint.d.ts +27 -0
- package/dist/src/lib/session-checkpoint.js +134 -0
- package/dist/src/lib/wizard-session.d.ts +44 -1
- package/dist/src/lib/wizard-session.js +70 -14
- package/dist/src/lib/wizard-tools.js +19 -4
- package/dist/src/steps/add-mcp-server-to-clients/clients/claude.d.ts +3 -0
- package/dist/src/steps/add-mcp-server-to-clients/clients/claude.js +6 -0
- package/dist/src/steps/add-mcp-server-to-clients/clients/cursor.js +3 -1
- package/dist/src/ui/agent-ui.d.ts +91 -0
- package/dist/src/ui/agent-ui.js +277 -0
- package/dist/src/ui/logging-ui.js +1 -1
- package/dist/src/ui/tui/App.d.ts +12 -0
- package/dist/src/ui/tui/App.js +29 -18
- package/dist/src/ui/tui/components/AmplitudeLogo.js +16 -17
- package/dist/src/ui/tui/components/AmplitudeTextLogo.d.ts +0 -2
- package/dist/src/ui/tui/components/AmplitudeTextLogo.js +53 -18
- package/dist/src/ui/tui/components/BrailleSpinner.d.ts +8 -0
- package/dist/src/ui/tui/components/BrailleSpinner.js +15 -0
- package/dist/src/ui/tui/components/ConsoleView.d.ts +8 -11
- package/dist/src/ui/tui/components/ConsoleView.js +51 -34
- package/dist/src/ui/tui/components/HeaderBar.d.ts +12 -0
- package/dist/src/ui/tui/components/HeaderBar.js +17 -0
- package/dist/src/ui/tui/components/JourneyStepper.d.ts +16 -0
- package/dist/src/ui/tui/components/JourneyStepper.js +83 -0
- package/dist/src/ui/tui/components/KeyHintBar.d.ts +19 -0
- package/dist/src/ui/tui/components/KeyHintBar.js +20 -0
- package/dist/src/ui/tui/console-commands.d.ts +1 -2
- package/dist/src/ui/tui/console-commands.js +48 -7
- package/dist/src/ui/tui/flows.d.ts +1 -1
- package/dist/src/ui/tui/flows.js +1 -1
- package/dist/src/ui/tui/hooks/useAsyncEffect.d.ts +15 -0
- package/dist/src/ui/tui/hooks/useAsyncEffect.js +35 -0
- package/dist/src/ui/tui/hooks/useWizardStore.d.ts +9 -0
- package/dist/src/ui/tui/hooks/useWizardStore.js +11 -0
- package/dist/src/ui/tui/ink-ui.js +1 -1
- package/dist/src/ui/tui/primitives/DissolveTransition.js +4 -5
- package/dist/src/ui/tui/primitives/EventPlanViewer.d.ts +3 -1
- package/dist/src/ui/tui/primitives/EventPlanViewer.js +8 -3
- package/dist/src/ui/tui/primitives/ProgressList.js +1 -1
- package/dist/src/ui/tui/primitives/SlashCommandInput.js +19 -4
- package/dist/src/ui/tui/primitives/SplitView.d.ts +2 -1
- package/dist/src/ui/tui/primitives/SplitView.js +10 -2
- package/dist/src/ui/tui/primitives/TabContainer.js +10 -2
- package/dist/src/ui/tui/primitives/index.d.ts +0 -1
- package/dist/src/ui/tui/primitives/index.js +0 -1
- package/dist/src/ui/tui/router.js +1 -1
- package/dist/src/ui/tui/screen-registry.d.ts +0 -7
- package/dist/src/ui/tui/screen-registry.js +13 -4
- package/dist/src/ui/tui/screens/ActivationOptionsScreen.d.ts +2 -2
- package/dist/src/ui/tui/screens/ActivationOptionsScreen.js +8 -8
- package/dist/src/ui/tui/screens/AuthScreen.js +57 -27
- package/dist/src/ui/tui/screens/ChecklistScreen.d.ts +2 -12
- package/dist/src/ui/tui/screens/ChecklistScreen.js +22 -33
- package/dist/src/ui/tui/screens/DataIngestionCheckScreen.d.ts +3 -12
- package/dist/src/ui/tui/screens/DataIngestionCheckScreen.js +109 -39
- package/dist/src/ui/tui/screens/DataSetupScreen.d.ts +3 -3
- package/dist/src/ui/tui/screens/DataSetupScreen.js +17 -10
- package/dist/src/ui/tui/screens/IntroScreen.d.ts +5 -3
- package/dist/src/ui/tui/screens/IntroScreen.js +132 -41
- package/dist/src/ui/tui/screens/LoginScreen.d.ts +1 -1
- package/dist/src/ui/tui/screens/LoginScreen.js +4 -4
- package/dist/src/ui/tui/screens/LogoutScreen.d.ts +4 -2
- package/dist/src/ui/tui/screens/LogoutScreen.js +17 -5
- package/dist/src/ui/tui/screens/McpScreen.d.ts +4 -4
- package/dist/src/ui/tui/screens/McpScreen.js +25 -17
- package/dist/src/ui/tui/screens/OutageScreen.d.ts +1 -1
- package/dist/src/ui/tui/screens/OutageScreen.js +5 -5
- package/dist/src/ui/tui/screens/OutroScreen.d.ts +5 -0
- package/dist/src/ui/tui/screens/OutroScreen.js +21 -14
- package/dist/src/ui/tui/screens/RegionSelectScreen.js +15 -13
- package/dist/src/ui/tui/screens/RunScreen.d.ts +7 -5
- package/dist/src/ui/tui/screens/RunScreen.js +102 -157
- package/dist/src/ui/tui/screens/SettingsOverrideScreen.d.ts +1 -1
- package/dist/src/ui/tui/screens/SettingsOverrideScreen.js +6 -5
- package/dist/src/ui/tui/screens/SetupScreen.d.ts +1 -1
- package/dist/src/ui/tui/screens/SetupScreen.js +7 -7
- package/dist/src/ui/tui/screens/SlackScreen.d.ts +2 -2
- package/dist/src/ui/tui/screens/SlackScreen.js +60 -35
- package/dist/src/ui/tui/session-constants.d.ts +41 -0
- package/dist/src/ui/tui/session-constants.js +38 -0
- package/dist/src/ui/tui/start-tui.d.ts +3 -1
- package/dist/src/ui/tui/start-tui.js +14 -10
- package/dist/src/ui/tui/store.d.ts +2 -1
- package/dist/src/ui/tui/store.js +33 -7
- package/dist/src/ui/tui/styles.d.ts +75 -19
- package/dist/src/ui/tui/styles.js +101 -19
- package/dist/src/ui/tui/utils/classify-error.d.ts +14 -0
- package/dist/src/ui/tui/utils/classify-error.js +90 -0
- package/dist/src/ui/tui/utils/diagnostics.d.ts +21 -0
- package/dist/src/ui/tui/utils/diagnostics.js +72 -0
- package/dist/src/ui/tui/utils/with-retry.d.ts +12 -0
- package/dist/src/ui/tui/utils/with-retry.js +32 -0
- package/dist/src/ui/tui/utils/with-timeout.d.ts +10 -0
- package/dist/src/ui/tui/utils/with-timeout.js +24 -0
- package/dist/src/utils/ampli-settings.d.ts +1 -1
- package/dist/src/utils/ampli-settings.js +15 -5
- package/dist/src/utils/api-key-store.js +5 -5
- package/dist/src/utils/atomic-write.d.ts +15 -0
- package/dist/src/utils/atomic-write.js +34 -0
- package/dist/src/utils/setup-utils.js +2 -2
- package/dist/src/utils/token-refresh.d.ts +22 -0
- package/dist/src/utils/token-refresh.js +79 -0
- package/dist/src/utils/wizard-abort.js +6 -1
- package/package.json +6 -6
- package/skills/instrumentation/add-analytics-instrumentation/SKILL.md +142 -0
- package/skills/instrumentation/diff-intake/SKILL.md +128 -0
- package/skills/instrumentation/discover-analytics-patterns/SKILL.md +185 -0
- package/skills/instrumentation/discover-event-surfaces/SKILL.md +322 -0
- package/skills/instrumentation/discover-event-surfaces/references/best-practices.md +563 -0
- package/skills/instrumentation/instrument-events/SKILL.md +169 -0
- package/skills/instrumentation/instrument-events/references/best-practices.md +563 -0
- package/skills/integration/integration-android/SKILL.md +49 -0
- package/skills/integration/integration-android/references/EXAMPLE.md +1977 -0
- package/skills/integration/integration-android/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-android/references/analytics.md +1778 -0
- package/skills/integration/integration-android/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-android/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-android/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-android/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-angular/SKILL.md +49 -0
- package/skills/integration/integration-angular/references/EXAMPLE.md +899 -0
- package/skills/integration/integration-angular/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-angular/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-angular/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-angular/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-angular/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-angular/references/browser-sdk-2.md +4680 -0
- package/skills/integration/integration-astro-hybrid/SKILL.md +56 -0
- package/skills/integration/integration-astro-hybrid/references/EXAMPLE.md +1095 -0
- package/skills/integration/integration-astro-hybrid/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-astro-hybrid/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-astro-hybrid/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-astro-hybrid/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-astro-hybrid/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-astro-hybrid/references/browser-sdk-2.md +4680 -0
- package/skills/integration/integration-astro-ssr/SKILL.md +52 -0
- package/skills/integration/integration-astro-ssr/references/EXAMPLE.md +1106 -0
- package/skills/integration/integration-astro-ssr/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-astro-ssr/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-astro-ssr/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-astro-ssr/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-astro-ssr/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-astro-ssr/references/browser-sdk-2.md +4680 -0
- package/skills/integration/integration-astro-static/SKILL.md +49 -0
- package/skills/integration/integration-astro-static/references/EXAMPLE.md +910 -0
- package/skills/integration/integration-astro-static/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-astro-static/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-astro-static/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-astro-static/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-astro-static/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-astro-static/references/browser-sdk-2.md +4680 -0
- package/skills/integration/integration-astro-view-transitions/SKILL.md +51 -0
- package/skills/integration/integration-astro-view-transitions/references/EXAMPLE.md +979 -0
- package/skills/integration/integration-astro-view-transitions/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-astro-view-transitions/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-astro-view-transitions/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-astro-view-transitions/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-astro-view-transitions/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-astro-view-transitions/references/browser-sdk-2.md +4680 -0
- package/skills/integration/integration-django/SKILL.md +57 -0
- package/skills/integration/integration-django/references/EXAMPLE.md +1005 -0
- package/skills/integration/integration-django/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-django/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-django/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-django/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-django/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-django/references/python.md +1424 -0
- package/skills/integration/integration-expo/SKILL.md +53 -0
- package/skills/integration/integration-expo/references/EXAMPLE.md +1291 -0
- package/skills/integration/integration-expo/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-expo/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-expo/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-expo/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-expo/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-expo/references/react-native-sdk.md +2819 -0
- package/skills/integration/integration-fastapi/SKILL.md +57 -0
- package/skills/integration/integration-fastapi/references/EXAMPLE.md +1389 -0
- package/skills/integration/integration-fastapi/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-fastapi/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-fastapi/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-fastapi/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-fastapi/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-fastapi/references/python.md +1424 -0
- package/skills/integration/integration-flask/SKILL.md +56 -0
- package/skills/integration/integration-flask/references/EXAMPLE.md +1130 -0
- package/skills/integration/integration-flask/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-flask/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-flask/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-flask/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-flask/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-flask/references/python.md +1424 -0
- package/skills/integration/integration-javascript_node/SKILL.md +54 -0
- package/skills/integration/integration-javascript_node/references/EXAMPLE.md +365 -0
- package/skills/integration/integration-javascript_node/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-javascript_node/references/analytics.md +1778 -0
- package/skills/integration/integration-javascript_node/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-javascript_node/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-javascript_node/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-javascript_node/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-javascript_web/SKILL.md +58 -0
- package/skills/integration/integration-javascript_web/references/EXAMPLE.md +451 -0
- package/skills/integration/integration-javascript_web/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-javascript_web/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-javascript_web/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-javascript_web/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-javascript_web/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-javascript_web/references/browser-sdk-2.md +4680 -0
- package/skills/integration/integration-laravel/SKILL.md +52 -0
- package/skills/integration/integration-laravel/references/EXAMPLE.md +2039 -0
- package/skills/integration/integration-laravel/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-laravel/references/analytics.md +1778 -0
- package/skills/integration/integration-laravel/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-laravel/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-laravel/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-laravel/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-nextjs-app-router/SKILL.md +54 -0
- package/skills/integration/integration-nextjs-app-router/references/EXAMPLE.md +673 -0
- package/skills/integration/integration-nextjs-app-router/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-nextjs-app-router/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-nextjs-app-router/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-nextjs-app-router/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-nextjs-app-router/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-nextjs-app-router/references/browser-sdk-2.md +4680 -0
- package/skills/integration/integration-nextjs-pages-router/SKILL.md +54 -0
- package/skills/integration/integration-nextjs-pages-router/references/EXAMPLE.md +735 -0
- package/skills/integration/integration-nextjs-pages-router/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-nextjs-pages-router/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-nextjs-pages-router/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-nextjs-pages-router/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-nextjs-pages-router/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-nextjs-pages-router/references/browser-sdk-2.md +4680 -0
- package/skills/integration/integration-nuxt-3.6/SKILL.md +46 -0
- package/skills/integration/integration-nuxt-3.6/references/EXAMPLE.md +8422 -0
- package/skills/integration/integration-nuxt-3.6/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-nuxt-3.6/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-nuxt-3.6/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-nuxt-3.6/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-nuxt-3.6/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-nuxt-3.6/references/browser-sdk-2.md +4680 -0
- package/skills/integration/integration-nuxt-4/SKILL.md +46 -0
- package/skills/integration/integration-nuxt-4/references/EXAMPLE.md +8670 -0
- package/skills/integration/integration-nuxt-4/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-nuxt-4/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-nuxt-4/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-nuxt-4/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-nuxt-4/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-nuxt-4/references/browser-sdk-2.md +4680 -0
- package/skills/integration/integration-python/SKILL.md +53 -0
- package/skills/integration/integration-python/references/EXAMPLE.md +445 -0
- package/skills/integration/integration-python/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-python/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-python/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-python/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-python/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-python/references/python.md +1424 -0
- package/skills/integration/integration-react-native/SKILL.md +49 -0
- package/skills/integration/integration-react-native/references/EXAMPLE.md +2253 -0
- package/skills/integration/integration-react-native/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-react-native/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-react-native/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-react-native/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-react-native/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-react-native/references/react-native-sdk.md +2819 -0
- package/skills/integration/integration-react-react-router-6/SKILL.md +53 -0
- package/skills/integration/integration-react-react-router-6/references/EXAMPLE.md +570 -0
- package/skills/integration/integration-react-react-router-6/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-react-react-router-6/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-react-react-router-6/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-react-react-router-6/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-react-react-router-6/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-react-react-router-6/references/browser-sdk-2.md +4680 -0
- package/skills/integration/integration-react-react-router-7-data/SKILL.md +53 -0
- package/skills/integration/integration-react-react-router-7-data/references/EXAMPLE.md +830 -0
- package/skills/integration/integration-react-react-router-7-data/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-react-react-router-7-data/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-react-react-router-7-data/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-react-react-router-7-data/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-react-react-router-7-data/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-react-react-router-7-data/references/browser-sdk-2.md +4680 -0
- package/skills/integration/integration-react-react-router-7-declarative/SKILL.md +53 -0
- package/skills/integration/integration-react-react-router-7-declarative/references/EXAMPLE.md +609 -0
- package/skills/integration/integration-react-react-router-7-declarative/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-react-react-router-7-declarative/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-react-react-router-7-declarative/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-react-react-router-7-declarative/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-react-react-router-7-declarative/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-react-react-router-7-declarative/references/browser-sdk-2.md +4680 -0
- package/skills/integration/integration-react-react-router-7-framework/SKILL.md +53 -0
- package/skills/integration/integration-react-react-router-7-framework/references/EXAMPLE.md +1081 -0
- package/skills/integration/integration-react-react-router-7-framework/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-react-react-router-7-framework/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-react-react-router-7-framework/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-react-react-router-7-framework/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-react-react-router-7-framework/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-react-react-router-7-framework/references/browser-sdk-2.md +4680 -0
- package/skills/integration/integration-react-tanstack-router-code-based/SKILL.md +57 -0
- package/skills/integration/integration-react-tanstack-router-code-based/references/EXAMPLE.md +659 -0
- package/skills/integration/integration-react-tanstack-router-code-based/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-react-tanstack-router-code-based/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-react-tanstack-router-code-based/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-react-tanstack-router-code-based/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-react-tanstack-router-code-based/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-react-tanstack-router-code-based/references/browser-sdk-2.md +4680 -0
- package/skills/integration/integration-react-tanstack-router-file-based/SKILL.md +57 -0
- package/skills/integration/integration-react-tanstack-router-file-based/references/EXAMPLE.md +777 -0
- package/skills/integration/integration-react-tanstack-router-file-based/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-react-tanstack-router-file-based/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-react-tanstack-router-file-based/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-react-tanstack-router-file-based/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-react-tanstack-router-file-based/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-react-tanstack-router-file-based/references/browser-sdk-2.md +4680 -0
- package/skills/integration/integration-react-vite/SKILL.md +53 -0
- package/skills/integration/integration-react-vite/references/EXAMPLE.md +542 -0
- package/skills/integration/integration-react-vite/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-react-vite/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-react-vite/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-react-vite/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-react-vite/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-react-vite/references/browser-sdk-2.md +4680 -0
- package/skills/integration/integration-ruby/SKILL.md +50 -0
- package/skills/integration/integration-ruby/references/EXAMPLE.md +420 -0
- package/skills/integration/integration-ruby/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-ruby/references/analytics.md +1778 -0
- package/skills/integration/integration-ruby/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-ruby/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-ruby/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-ruby/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-ruby-on-rails/SKILL.md +55 -0
- package/skills/integration/integration-ruby-on-rails/references/EXAMPLE.md +1013 -0
- package/skills/integration/integration-ruby-on-rails/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-ruby-on-rails/references/analytics.md +1778 -0
- package/skills/integration/integration-ruby-on-rails/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-ruby-on-rails/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-ruby-on-rails/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-ruby-on-rails/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-sveltekit/SKILL.md +47 -0
- package/skills/integration/integration-sveltekit/references/EXAMPLE.md +14121 -0
- package/skills/integration/integration-sveltekit/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-sveltekit/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-sveltekit/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-sveltekit/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-sveltekit/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-sveltekit/references/browser-sdk-2.md +4680 -0
- package/skills/integration/integration-swift/SKILL.md +49 -0
- package/skills/integration/integration-swift/references/EXAMPLE.md +660 -0
- package/skills/integration/integration-swift/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-swift/references/analytics.md +1778 -0
- package/skills/integration/integration-swift/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-swift/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-swift/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-swift/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-tanstack-start/SKILL.md +58 -0
- package/skills/integration/integration-tanstack-start/references/EXAMPLE.md +998 -0
- package/skills/integration/integration-tanstack-start/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-tanstack-start/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-tanstack-start/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-tanstack-start/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-tanstack-start/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-tanstack-start/references/browser-sdk-2.md +4680 -0
- package/skills/integration/integration-vue-3/SKILL.md +46 -0
- package/skills/integration/integration-vue-3/references/EXAMPLE.md +846 -0
- package/skills/integration/integration-vue-3/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-vue-3/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-vue-3/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-vue-3/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-vue-3/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-vue-3/references/browser-sdk-2.md +4680 -0
- package/skills/taxonomy/amplitude-quickstart-taxonomy-agent/SKILL.md +228 -0
- package/dist/src/ui/tui/components/TitleBar.d.ts +0 -8
- package/dist/src/ui/tui/components/TitleBar.js +0 -27
- package/dist/src/ui/tui/primitives/KagiSmallWebViewer.d.ts +0 -7
- package/dist/src/ui/tui/primitives/KagiSmallWebViewer.js +0 -101
- package/dist/src/utils/anthropic-status.d.ts +0 -17
- package/dist/src/utils/anthropic-status.js +0 -51
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: integration-react-tanstack-router-code-based
|
|
3
|
+
description: >-
|
|
4
|
+
Amplitude integration for React applications using TanStack Router with
|
|
5
|
+
code-based routing
|
|
6
|
+
metadata:
|
|
7
|
+
author: Amplitude
|
|
8
|
+
version: dev
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Amplitude integration for React with TanStack Router (code-based)
|
|
12
|
+
|
|
13
|
+
This skill helps you add Amplitude analytics to React with TanStack Router (code-based) applications.
|
|
14
|
+
|
|
15
|
+
## Workflow
|
|
16
|
+
|
|
17
|
+
Follow these steps in order to complete the integration:
|
|
18
|
+
|
|
19
|
+
1. `basic-integration-1.0-begin.md` - Amplitude Setup - Begin ← **Start here**
|
|
20
|
+
2. `basic-integration-1.1-edit.md` - Amplitude Setup - Edit
|
|
21
|
+
3. `basic-integration-1.2-revise.md` - Amplitude Setup - Revise
|
|
22
|
+
4. `basic-integration-1.3-conclude.md` - Amplitude Setup - Conclusion
|
|
23
|
+
|
|
24
|
+
## Reference files
|
|
25
|
+
|
|
26
|
+
- `references/EXAMPLE.md` - React with TanStack Router (code-based) example project code
|
|
27
|
+
- `references/browser-sdk-2.md` - Or install unified SDK to get access to all Amplitude products
|
|
28
|
+
- `references/amplitude-quickstart.md` - Amplitude documentation for Amplitude Quickstart
|
|
29
|
+
- `references/basic-integration-1.0-begin.md` - Amplitude setup - begin
|
|
30
|
+
- `references/basic-integration-1.1-edit.md` - Amplitude setup - edit
|
|
31
|
+
- `references/basic-integration-1.2-revise.md` - Amplitude setup - revise
|
|
32
|
+
- `references/basic-integration-1.3-conclude.md` - Amplitude setup - conclusion
|
|
33
|
+
|
|
34
|
+
The example project shows the target implementation pattern. Consult the documentation for API details.
|
|
35
|
+
|
|
36
|
+
## Key principles
|
|
37
|
+
|
|
38
|
+
- **Environment variables**: Always use environment variables for Amplitude keys. Never hardcode them.
|
|
39
|
+
- **Minimal changes**: Add Amplitude code alongside existing integrations. Don't replace or restructure existing code.
|
|
40
|
+
- **Match the example**: Your implementation should follow the example project's patterns as closely as possible.
|
|
41
|
+
|
|
42
|
+
## Framework guidelines
|
|
43
|
+
|
|
44
|
+
- For feature flags, use the Amplitude Experiment React SDK hooks (useVariantValue, useExperiment) — they handle loading states and async fetch automatically
|
|
45
|
+
- Add analytics track calls in event handlers where user actions occur, NOT in useEffect reacting to state changes
|
|
46
|
+
- Do NOT use useEffect for data transformation - calculate derived values during render instead
|
|
47
|
+
- Do NOT use useEffect to respond to user events - put that logic in the event handler itself
|
|
48
|
+
- Do NOT use useEffect to chain state updates - calculate all related updates together in the event handler
|
|
49
|
+
- Do NOT use useEffect to notify parent components - call the parent callback alongside setState in the event handler
|
|
50
|
+
- To reset component state when a prop changes, pass the prop as the component's key instead of using useEffect
|
|
51
|
+
- useEffect is ONLY for synchronizing with external systems (non-React widgets, browser APIs, network subscriptions)
|
|
52
|
+
- Use TanStack Router's built-in navigation events for pageview tracking instead of useEffect
|
|
53
|
+
- Initialize Amplitude once in the root component defined in either the file-based convention (__root.tsx) or code-based convention (wherever createRootRoute() is called) so all child routes have access to the Amplitude client
|
|
54
|
+
|
|
55
|
+
## Identifying users
|
|
56
|
+
|
|
57
|
+
Identify users during login and signup events. Refer to the example code and documentation for the correct identify pattern for this framework. Call `amplitude.setUserId(userId)` to associate events with a known user, and use `amplitude.identify()` with an `Identify` object to set user properties. If both frontend and backend code exist, pass a consistent user/device ID via custom request headers to maintain event correlation.
|
|
@@ -0,0 +1,659 @@
|
|
|
1
|
+
# Amplitude React with TanStack Router (code-based) Example Project
|
|
2
|
+
|
|
3
|
+
Repository: https://github.com/amplitude/context-hub
|
|
4
|
+
Path: basics/react-tanstack-router-code-based
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## README.md
|
|
9
|
+
|
|
10
|
+
# Amplitude TanStack Router Example (Code-Based Routing)
|
|
11
|
+
|
|
12
|
+
This is a React and [TanStack Router](https://tanstack.com/router) example demonstrating Amplitude integration with product analytics and event tracking. This example uses **code-based routing** where routes are defined programmatically.
|
|
13
|
+
|
|
14
|
+
### Amplitude SDKs
|
|
15
|
+
|
|
16
|
+
The client uses the [Browser Unified SDK (npm)](https://amplitude.com/docs/sdks/analytics/browser/browser-unified-sdk#unified-sdk-npm): [`@amplitude/unified`](https://www.npmjs.com/package/@amplitude/unified) with `initAll` once in `main.tsx`. [Initialize the Unified SDK](https://amplitude.com/docs/sdks/analytics/browser/browser-unified-sdk#initialize-the-unified-sdk) documents that call as initializing every product bundled with Unified npm; see [configuration](https://amplitude.com/docs/sdks/analytics/browser/browser-unified-sdk#configuration). The `experiment` block is **Feature Experiment** (`@amplitude/experiment-js-client`). Amplitude’s [product support table](https://amplitude.com/docs/sdks/analytics/browser/browser-unified-sdk#product-support-by-installation-method) lists **Web Experiment** (`@amplitude/experiment-tag`, including the visual editor) for the [CDN unified script](https://amplitude.com/docs/sdks/analytics/browser/browser-unified-sdk#unified-script-cdn), not Unified **npm**.
|
|
17
|
+
|
|
18
|
+
When you add a backend or API, send events with [`@amplitude/analytics-node`](https://www.npmjs.com/package/@amplitude/analytics-node).
|
|
19
|
+
|
|
20
|
+
## Features
|
|
21
|
+
|
|
22
|
+
- **Product Analytics**: Track user events and behaviors
|
|
23
|
+
- **User Authentication**: Demo login system with Amplitude user identification
|
|
24
|
+
- **Client-side Tracking**: Examples of client-side tracking methods
|
|
25
|
+
|
|
26
|
+
## Getting Started
|
|
27
|
+
|
|
28
|
+
### 1. Install Dependencies
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
npm install
|
|
32
|
+
# or
|
|
33
|
+
pnpm install
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### 2. Configure Environment Variables
|
|
37
|
+
|
|
38
|
+
Create a `.env` file in the root directory:
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
VITE_PUBLIC_AMPLITUDE_API_KEY=your_amplitude_api_key
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Get your Amplitude API key from your [Amplitude project settings](https://app.amplitude.com).
|
|
45
|
+
|
|
46
|
+
### 3. Run the Development Server
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
npm run dev
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
Open [http://localhost:3000](http://localhost:3000) with your browser to see the app.
|
|
53
|
+
|
|
54
|
+
## Key Integration Points
|
|
55
|
+
|
|
56
|
+
### Client-side initialization (main.tsx)
|
|
57
|
+
|
|
58
|
+
```typescript
|
|
59
|
+
import * as amplitude from '@amplitude/unified';
|
|
60
|
+
|
|
61
|
+
void amplitude.initAll(import.meta.env.VITE_PUBLIC_AMPLITUDE_API_KEY);
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### User identification (contexts/AuthContext.tsx)
|
|
65
|
+
|
|
66
|
+
```typescript
|
|
67
|
+
import * as amplitude from '@amplitude/unified';
|
|
68
|
+
import { Identify } from '@amplitude/unified';
|
|
69
|
+
|
|
70
|
+
amplitude.setUserId(username);
|
|
71
|
+
const identifyObj = new Identify();
|
|
72
|
+
identifyObj.set('username', username);
|
|
73
|
+
amplitude.identify(identifyObj);
|
|
74
|
+
amplitude.track('User Logged In', { username });
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### Event tracking
|
|
78
|
+
|
|
79
|
+
```typescript
|
|
80
|
+
amplitude.track('Burrito Considered', {
|
|
81
|
+
total_considerations: user.burritoConsiderations + 1,
|
|
82
|
+
username: user.username,
|
|
83
|
+
});
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
## Learn More
|
|
87
|
+
|
|
88
|
+
- [Amplitude Documentation](https://amplitude.com/docs)
|
|
89
|
+
- [TanStack Router Documentation](https://tanstack.com/router/latest)
|
|
90
|
+
- [Amplitude Browser SDK](https://amplitude.com/docs/sdks/analytics/browser/browser-sdk-2)
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## .env.example
|
|
95
|
+
|
|
96
|
+
```example
|
|
97
|
+
VITE_PUBLIC_AMPLITUDE_API_KEY=
|
|
98
|
+
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
## .prettierignore
|
|
104
|
+
|
|
105
|
+
```
|
|
106
|
+
package-lock.json
|
|
107
|
+
pnpm-lock.yaml
|
|
108
|
+
yarn.lock
|
|
109
|
+
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
---
|
|
113
|
+
|
|
114
|
+
## index.html
|
|
115
|
+
|
|
116
|
+
```html
|
|
117
|
+
<!DOCTYPE html>
|
|
118
|
+
<html lang="en">
|
|
119
|
+
<head>
|
|
120
|
+
<meta charset="UTF-8" />
|
|
121
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
122
|
+
<link rel="icon" href="/favicon.ico" />
|
|
123
|
+
<meta name="theme-color" content="#000000" />
|
|
124
|
+
<meta
|
|
125
|
+
name="description"
|
|
126
|
+
content="React TanStack Router code-based routing example"
|
|
127
|
+
/>
|
|
128
|
+
<link rel="apple-touch-icon" href="/logo192.png" />
|
|
129
|
+
<link rel="manifest" href="/manifest.json" />
|
|
130
|
+
<title>React TanStack Router - Code-Based</title>
|
|
131
|
+
</head>
|
|
132
|
+
<body>
|
|
133
|
+
<div id="app"></div>
|
|
134
|
+
<script type="module" src="/src/main.tsx"></script>
|
|
135
|
+
</body>
|
|
136
|
+
</html>
|
|
137
|
+
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
142
|
+
## prettier.config.js
|
|
143
|
+
|
|
144
|
+
```js
|
|
145
|
+
// @ts-check
|
|
146
|
+
|
|
147
|
+
/** @type {import('prettier').Config} */
|
|
148
|
+
const config = {
|
|
149
|
+
semi: false,
|
|
150
|
+
singleQuote: true,
|
|
151
|
+
trailingComma: "all",
|
|
152
|
+
};
|
|
153
|
+
|
|
154
|
+
export default config;
|
|
155
|
+
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
---
|
|
159
|
+
|
|
160
|
+
## public/robots.txt
|
|
161
|
+
|
|
162
|
+
```txt
|
|
163
|
+
# https://www.robotstxt.org/robotstxt.html
|
|
164
|
+
User-agent: *
|
|
165
|
+
Disallow:
|
|
166
|
+
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
---
|
|
170
|
+
|
|
171
|
+
## src/contexts/AuthContext.tsx
|
|
172
|
+
|
|
173
|
+
```tsx
|
|
174
|
+
import * as amplitude from '@amplitude/unified';
|
|
175
|
+
import { Identify } from '@amplitude/unified';
|
|
176
|
+
import { createContext, useContext, useState } from 'react';
|
|
177
|
+
import type { ReactNode } from 'react';
|
|
178
|
+
|
|
179
|
+
interface User {
|
|
180
|
+
username: string;
|
|
181
|
+
burritoConsiderations: number;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
interface AuthContextType {
|
|
185
|
+
user: User | null;
|
|
186
|
+
login: (username: string, password: string) => Promise<boolean>;
|
|
187
|
+
logout: () => void;
|
|
188
|
+
incrementBurritoConsiderations: () => void;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
const AuthContext = createContext<AuthContextType | undefined>(undefined);
|
|
192
|
+
|
|
193
|
+
const users: Map<string, User> = new Map();
|
|
194
|
+
|
|
195
|
+
export function AuthProvider({ children }: { children: ReactNode }) {
|
|
196
|
+
// Use lazy initializer to read from localStorage only once on mount
|
|
197
|
+
const [user, setUser] = useState<User | null>(() => {
|
|
198
|
+
if (typeof window === 'undefined') return null;
|
|
199
|
+
|
|
200
|
+
const storedUsername = localStorage.getItem('currentUser');
|
|
201
|
+
if (storedUsername) {
|
|
202
|
+
const existingUser = users.get(storedUsername);
|
|
203
|
+
if (existingUser) {
|
|
204
|
+
return existingUser;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
return null;
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
const login = (username: string, password: string): Promise<boolean> => {
|
|
211
|
+
if (!username || !password) {
|
|
212
|
+
return Promise.resolve(false);
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
// Get or create user in local map
|
|
216
|
+
let localUser = users.get(username);
|
|
217
|
+
const isNewUser = !localUser;
|
|
218
|
+
|
|
219
|
+
if (!localUser) {
|
|
220
|
+
localUser = { username, burritoConsiderations: 0 };
|
|
221
|
+
users.set(username, localUser);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
setUser(localUser);
|
|
225
|
+
localStorage.setItem('currentUser', username);
|
|
226
|
+
|
|
227
|
+
// Identify user in Amplitude using username as user ID
|
|
228
|
+
amplitude.setUserId(username);
|
|
229
|
+
const identifyObj = new Identify();
|
|
230
|
+
identifyObj.set('username', username);
|
|
231
|
+
amplitude.identify(identifyObj);
|
|
232
|
+
|
|
233
|
+
// Capture login event
|
|
234
|
+
amplitude.track('User Logged In', {
|
|
235
|
+
username,
|
|
236
|
+
isNewUser,
|
|
237
|
+
});
|
|
238
|
+
|
|
239
|
+
return Promise.resolve(true);
|
|
240
|
+
};
|
|
241
|
+
|
|
242
|
+
const logout = () => {
|
|
243
|
+
// Capture logout event before resetting
|
|
244
|
+
amplitude.track('User Logged Out');
|
|
245
|
+
amplitude.reset();
|
|
246
|
+
|
|
247
|
+
setUser(null);
|
|
248
|
+
localStorage.removeItem('currentUser');
|
|
249
|
+
};
|
|
250
|
+
|
|
251
|
+
const incrementBurritoConsiderations = () => {
|
|
252
|
+
if (user) {
|
|
253
|
+
user.burritoConsiderations++;
|
|
254
|
+
users.set(user.username, user);
|
|
255
|
+
setUser({ ...user });
|
|
256
|
+
}
|
|
257
|
+
};
|
|
258
|
+
|
|
259
|
+
return (
|
|
260
|
+
<AuthContext.Provider value={{ user, login, logout, incrementBurritoConsiderations }}>
|
|
261
|
+
{children}
|
|
262
|
+
</AuthContext.Provider>
|
|
263
|
+
);
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
export function useAuth() {
|
|
267
|
+
const context = useContext(AuthContext);
|
|
268
|
+
if (context === undefined) {
|
|
269
|
+
throw new Error('useAuth must be used within an AuthProvider');
|
|
270
|
+
}
|
|
271
|
+
return context;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
---
|
|
277
|
+
|
|
278
|
+
## src/main.tsx
|
|
279
|
+
|
|
280
|
+
```tsx
|
|
281
|
+
import { StrictMode, useState } from 'react'
|
|
282
|
+
import ReactDOM from 'react-dom/client'
|
|
283
|
+
import {
|
|
284
|
+
Link,
|
|
285
|
+
Outlet,
|
|
286
|
+
RouterProvider,
|
|
287
|
+
createRootRoute,
|
|
288
|
+
createRoute,
|
|
289
|
+
createRouter,
|
|
290
|
+
useNavigate,
|
|
291
|
+
} from '@tanstack/react-router'
|
|
292
|
+
import { TanStackRouterDevtoolsPanel } from '@tanstack/react-router-devtools'
|
|
293
|
+
import { TanStackDevtools } from '@tanstack/react-devtools'
|
|
294
|
+
import * as amplitude from '@amplitude/unified'
|
|
295
|
+
|
|
296
|
+
import { AuthProvider, useAuth } from './contexts/AuthContext'
|
|
297
|
+
import './styles.css'
|
|
298
|
+
import reportWebVitals from './reportWebVitals'
|
|
299
|
+
|
|
300
|
+
// Initialize Amplitude
|
|
301
|
+
void amplitude.initAll(import.meta.env.VITE_PUBLIC_AMPLITUDE_API_KEY)
|
|
302
|
+
|
|
303
|
+
// ============================================================================
|
|
304
|
+
// Root Route
|
|
305
|
+
// ============================================================================
|
|
306
|
+
|
|
307
|
+
const rootRoute = createRootRoute({
|
|
308
|
+
component: RootComponent,
|
|
309
|
+
})
|
|
310
|
+
|
|
311
|
+
function RootComponent() {
|
|
312
|
+
return (
|
|
313
|
+
<AuthProvider>
|
|
314
|
+
<Header />
|
|
315
|
+
<main>
|
|
316
|
+
<Outlet />
|
|
317
|
+
</main>
|
|
318
|
+
<TanStackDevtools
|
|
319
|
+
config={{
|
|
320
|
+
position: 'bottom-right',
|
|
321
|
+
}}
|
|
322
|
+
plugins={[
|
|
323
|
+
{
|
|
324
|
+
name: 'Tanstack Router',
|
|
325
|
+
render: <TanStackRouterDevtoolsPanel />,
|
|
326
|
+
},
|
|
327
|
+
]}
|
|
328
|
+
/>
|
|
329
|
+
</AuthProvider>
|
|
330
|
+
)
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
// ============================================================================
|
|
334
|
+
// Header Component
|
|
335
|
+
// ============================================================================
|
|
336
|
+
|
|
337
|
+
function Header() {
|
|
338
|
+
const { user, logout } = useAuth()
|
|
339
|
+
|
|
340
|
+
return (
|
|
341
|
+
<header className="header">
|
|
342
|
+
<div className="header-container">
|
|
343
|
+
<nav>
|
|
344
|
+
<Link to="/">Home</Link>
|
|
345
|
+
{user && (
|
|
346
|
+
<>
|
|
347
|
+
<Link to="/burrito">Burrito Consideration</Link>
|
|
348
|
+
<Link to="/profile">Profile</Link>
|
|
349
|
+
</>
|
|
350
|
+
)}
|
|
351
|
+
</nav>
|
|
352
|
+
<div className="user-section">
|
|
353
|
+
{user ? (
|
|
354
|
+
<>
|
|
355
|
+
<span>Welcome, {user.username}!</span>
|
|
356
|
+
<button onClick={logout} className="btn-logout">
|
|
357
|
+
Logout
|
|
358
|
+
</button>
|
|
359
|
+
</>
|
|
360
|
+
) : (
|
|
361
|
+
<span>Not logged in</span>
|
|
362
|
+
)}
|
|
363
|
+
</div>
|
|
364
|
+
</div>
|
|
365
|
+
</header>
|
|
366
|
+
)
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
// ============================================================================
|
|
370
|
+
// Index Route (Home Page)
|
|
371
|
+
// ============================================================================
|
|
372
|
+
|
|
373
|
+
const indexRoute = createRoute({
|
|
374
|
+
getParentRoute: () => rootRoute,
|
|
375
|
+
path: '/',
|
|
376
|
+
component: Home,
|
|
377
|
+
})
|
|
378
|
+
|
|
379
|
+
function Home() {
|
|
380
|
+
const { user, login } = useAuth()
|
|
381
|
+
const [username, setUsername] = useState('')
|
|
382
|
+
const [password, setPassword] = useState('')
|
|
383
|
+
const [error, setError] = useState('')
|
|
384
|
+
|
|
385
|
+
const handleSubmit = async (e: React.FormEvent) => {
|
|
386
|
+
e.preventDefault()
|
|
387
|
+
setError('')
|
|
388
|
+
|
|
389
|
+
try {
|
|
390
|
+
const success = await login(username, password)
|
|
391
|
+
if (success) {
|
|
392
|
+
setUsername('')
|
|
393
|
+
setPassword('')
|
|
394
|
+
} else {
|
|
395
|
+
setError('Please provide both username and password')
|
|
396
|
+
}
|
|
397
|
+
} catch (err) {
|
|
398
|
+
console.error('Login failed:', err)
|
|
399
|
+
setError('An error occurred during login')
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
if (user) {
|
|
404
|
+
return (
|
|
405
|
+
<div className="container">
|
|
406
|
+
<h1>Welcome back, {user.username}!</h1>
|
|
407
|
+
<p>You are now logged in. Feel free to explore:</p>
|
|
408
|
+
<ul>
|
|
409
|
+
<li>Consider the potential of burritos</li>
|
|
410
|
+
<li>View your profile and statistics</li>
|
|
411
|
+
</ul>
|
|
412
|
+
</div>
|
|
413
|
+
)
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
return (
|
|
417
|
+
<div className="container">
|
|
418
|
+
<h1>Welcome to Burrito Consideration App</h1>
|
|
419
|
+
<p>Please sign in to begin your burrito journey</p>
|
|
420
|
+
|
|
421
|
+
<form onSubmit={handleSubmit} className="form">
|
|
422
|
+
<div className="form-group">
|
|
423
|
+
<label htmlFor="username">Username:</label>
|
|
424
|
+
<input
|
|
425
|
+
type="text"
|
|
426
|
+
id="username"
|
|
427
|
+
value={username}
|
|
428
|
+
onChange={(e) => setUsername(e.target.value)}
|
|
429
|
+
placeholder="Enter any username"
|
|
430
|
+
/>
|
|
431
|
+
</div>
|
|
432
|
+
|
|
433
|
+
<div className="form-group">
|
|
434
|
+
<label htmlFor="password">Password:</label>
|
|
435
|
+
<input
|
|
436
|
+
type="password"
|
|
437
|
+
id="password"
|
|
438
|
+
value={password}
|
|
439
|
+
onChange={(e) => setPassword(e.target.value)}
|
|
440
|
+
placeholder="Enter any password"
|
|
441
|
+
/>
|
|
442
|
+
</div>
|
|
443
|
+
|
|
444
|
+
{error && <p className="error">{error}</p>}
|
|
445
|
+
|
|
446
|
+
<button type="submit" className="btn-primary">
|
|
447
|
+
Sign In
|
|
448
|
+
</button>
|
|
449
|
+
</form>
|
|
450
|
+
|
|
451
|
+
<p className="note">
|
|
452
|
+
Note: This is a demo app. Use any username and password to sign in.
|
|
453
|
+
</p>
|
|
454
|
+
</div>
|
|
455
|
+
)
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
// ============================================================================
|
|
459
|
+
// Burrito Route
|
|
460
|
+
// ============================================================================
|
|
461
|
+
|
|
462
|
+
const burritoRoute = createRoute({
|
|
463
|
+
getParentRoute: () => rootRoute,
|
|
464
|
+
path: '/burrito',
|
|
465
|
+
component: BurritoPage,
|
|
466
|
+
})
|
|
467
|
+
|
|
468
|
+
function BurritoPage() {
|
|
469
|
+
const { user, incrementBurritoConsiderations } = useAuth()
|
|
470
|
+
const navigate = useNavigate()
|
|
471
|
+
const [hasConsidered, setHasConsidered] = useState(false)
|
|
472
|
+
|
|
473
|
+
// Redirect to home if not logged in
|
|
474
|
+
if (!user) {
|
|
475
|
+
navigate({ to: '/' })
|
|
476
|
+
return null
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
const handleConsideration = () => {
|
|
480
|
+
incrementBurritoConsiderations()
|
|
481
|
+
setHasConsidered(true)
|
|
482
|
+
setTimeout(() => setHasConsidered(false), 2000)
|
|
483
|
+
|
|
484
|
+
// Capture burrito consideration event
|
|
485
|
+
amplitude.track('Burrito Considered', {
|
|
486
|
+
total_considerations: user.burritoConsiderations + 1,
|
|
487
|
+
username: user.username,
|
|
488
|
+
})
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
return (
|
|
492
|
+
<div className="container">
|
|
493
|
+
<h1>Burrito consideration zone</h1>
|
|
494
|
+
<p>Take a moment to truly consider the potential of burritos.</p>
|
|
495
|
+
|
|
496
|
+
<div style={{ textAlign: 'center' }}>
|
|
497
|
+
<button onClick={handleConsideration} className="btn-burrito">
|
|
498
|
+
I have considered the burrito potential
|
|
499
|
+
</button>
|
|
500
|
+
|
|
501
|
+
{hasConsidered && (
|
|
502
|
+
<p className="success">
|
|
503
|
+
Thank you for your consideration! Count: {user.burritoConsiderations}
|
|
504
|
+
</p>
|
|
505
|
+
)}
|
|
506
|
+
</div>
|
|
507
|
+
|
|
508
|
+
<div className="stats">
|
|
509
|
+
<h3>Consideration stats</h3>
|
|
510
|
+
<p>Total considerations: {user.burritoConsiderations}</p>
|
|
511
|
+
</div>
|
|
512
|
+
</div>
|
|
513
|
+
)
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
// ============================================================================
|
|
517
|
+
// Profile Route
|
|
518
|
+
// ============================================================================
|
|
519
|
+
|
|
520
|
+
const profileRoute = createRoute({
|
|
521
|
+
getParentRoute: () => rootRoute,
|
|
522
|
+
path: '/profile',
|
|
523
|
+
component: ProfilePage,
|
|
524
|
+
})
|
|
525
|
+
|
|
526
|
+
function ProfilePage() {
|
|
527
|
+
const { user } = useAuth()
|
|
528
|
+
const navigate = useNavigate()
|
|
529
|
+
|
|
530
|
+
// Redirect to home if not logged in
|
|
531
|
+
if (!user) {
|
|
532
|
+
navigate({ to: '/' })
|
|
533
|
+
return null
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
return (
|
|
537
|
+
<div className="container">
|
|
538
|
+
<h1>User Profile</h1>
|
|
539
|
+
|
|
540
|
+
<div className="stats">
|
|
541
|
+
<h2>Your Information</h2>
|
|
542
|
+
<p>
|
|
543
|
+
<strong>Username:</strong> {user.username}
|
|
544
|
+
</p>
|
|
545
|
+
<p>
|
|
546
|
+
<strong>Burrito Considerations:</strong> {user.burritoConsiderations}
|
|
547
|
+
</p>
|
|
548
|
+
</div>
|
|
549
|
+
|
|
550
|
+
<div style={{ marginTop: '2rem' }}>
|
|
551
|
+
<h3>Your Burrito Journey</h3>
|
|
552
|
+
{user.burritoConsiderations === 0 ? (
|
|
553
|
+
<p>
|
|
554
|
+
You haven't considered any burritos yet. Visit the Burrito
|
|
555
|
+
Consideration page to start!
|
|
556
|
+
</p>
|
|
557
|
+
) : user.burritoConsiderations === 1 ? (
|
|
558
|
+
<p>You've considered the burrito potential once. Keep going!</p>
|
|
559
|
+
) : user.burritoConsiderations < 5 ? (
|
|
560
|
+
<p>You're getting the hang of burrito consideration!</p>
|
|
561
|
+
) : user.burritoConsiderations < 10 ? (
|
|
562
|
+
<p>You're becoming a burrito consideration expert!</p>
|
|
563
|
+
) : (
|
|
564
|
+
<p>You are a true burrito consideration master!</p>
|
|
565
|
+
)}
|
|
566
|
+
</div>
|
|
567
|
+
</div>
|
|
568
|
+
)
|
|
569
|
+
}
|
|
570
|
+
|
|
571
|
+
// ============================================================================
|
|
572
|
+
// Route Tree & Router Setup
|
|
573
|
+
// ============================================================================
|
|
574
|
+
|
|
575
|
+
const routeTree = rootRoute.addChildren([indexRoute, burritoRoute, profileRoute])
|
|
576
|
+
|
|
577
|
+
const router = createRouter({
|
|
578
|
+
routeTree,
|
|
579
|
+
context: {},
|
|
580
|
+
defaultPreload: 'intent',
|
|
581
|
+
scrollRestoration: true,
|
|
582
|
+
defaultStructuralSharing: true,
|
|
583
|
+
defaultPreloadStaleTime: 0,
|
|
584
|
+
})
|
|
585
|
+
|
|
586
|
+
// Register the router instance for type safety
|
|
587
|
+
declare module '@tanstack/react-router' {
|
|
588
|
+
interface Register {
|
|
589
|
+
router: typeof router
|
|
590
|
+
}
|
|
591
|
+
}
|
|
592
|
+
|
|
593
|
+
// ============================================================================
|
|
594
|
+
// Render the App
|
|
595
|
+
// ============================================================================
|
|
596
|
+
|
|
597
|
+
const rootElement = document.getElementById('app')
|
|
598
|
+
if (rootElement && !rootElement.innerHTML) {
|
|
599
|
+
const root = ReactDOM.createRoot(rootElement)
|
|
600
|
+
root.render(
|
|
601
|
+
<StrictMode>
|
|
602
|
+
<RouterProvider router={router} />
|
|
603
|
+
</StrictMode>,
|
|
604
|
+
)
|
|
605
|
+
}
|
|
606
|
+
|
|
607
|
+
// If you want to start measuring performance in your app, pass a function
|
|
608
|
+
// to log results (for example: reportWebVitals(console.log))
|
|
609
|
+
// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
|
|
610
|
+
reportWebVitals()
|
|
611
|
+
|
|
612
|
+
```
|
|
613
|
+
|
|
614
|
+
---
|
|
615
|
+
|
|
616
|
+
## src/reportWebVitals.ts
|
|
617
|
+
|
|
618
|
+
```ts
|
|
619
|
+
const reportWebVitals = (onPerfEntry?: () => void) => {
|
|
620
|
+
if (onPerfEntry && onPerfEntry instanceof Function) {
|
|
621
|
+
import('web-vitals').then(({ onCLS, onINP, onFCP, onLCP, onTTFB }) => {
|
|
622
|
+
onCLS(onPerfEntry)
|
|
623
|
+
onINP(onPerfEntry)
|
|
624
|
+
onFCP(onPerfEntry)
|
|
625
|
+
onLCP(onPerfEntry)
|
|
626
|
+
onTTFB(onPerfEntry)
|
|
627
|
+
})
|
|
628
|
+
}
|
|
629
|
+
}
|
|
630
|
+
|
|
631
|
+
export default reportWebVitals
|
|
632
|
+
|
|
633
|
+
```
|
|
634
|
+
|
|
635
|
+
---
|
|
636
|
+
|
|
637
|
+
## vite.config.ts
|
|
638
|
+
|
|
639
|
+
```ts
|
|
640
|
+
import { URL, fileURLToPath } from 'node:url'
|
|
641
|
+
|
|
642
|
+
import tailwindcss from '@tailwindcss/vite'
|
|
643
|
+
import { defineConfig } from 'vite'
|
|
644
|
+
import viteReact from '@vitejs/plugin-react'
|
|
645
|
+
|
|
646
|
+
// https://vitejs.dev/config/
|
|
647
|
+
export default defineConfig({
|
|
648
|
+
plugins: [viteReact(), tailwindcss()],
|
|
649
|
+
resolve: {
|
|
650
|
+
alias: {
|
|
651
|
+
'@': fileURLToPath(new URL('./src', import.meta.url)),
|
|
652
|
+
},
|
|
653
|
+
},
|
|
654
|
+
})
|
|
655
|
+
|
|
656
|
+
```
|
|
657
|
+
|
|
658
|
+
---
|
|
659
|
+
|