diff --git a/app/src/pages/onboarding/Onboarding.tsx b/app/src/pages/onboarding/Onboarding.tsx index cec4421ba..59e16dece 100644 --- a/app/src/pages/onboarding/Onboarding.tsx +++ b/app/src/pages/onboarding/Onboarding.tsx @@ -4,6 +4,7 @@ import { useCoreState } from '../../providers/CoreStateProvider'; import { referralApi } from '../../services/api/referralApi'; import { userApi } from '../../services/api/userApi'; import { getDefaultEnabledTools } from '../../utils/toolDefinitions'; +import BetaBanner from './components/BetaBanner'; import ContextGatheringStep from './steps/ContextGatheringStep'; import ReferralApplyStep from './steps/ReferralApplyStep'; import SkillsStep from './steps/SkillsStep'; @@ -208,7 +209,10 @@ const Onboarding = ({ onComplete, onDefer }: OnboardingProps) => { )} -
{renderStep()}
+
+ + {renderStep()} +
); }; diff --git a/app/src/pages/onboarding/components/BetaBanner.tsx b/app/src/pages/onboarding/components/BetaBanner.tsx new file mode 100644 index 000000000..1a0f87c15 --- /dev/null +++ b/app/src/pages/onboarding/components/BetaBanner.tsx @@ -0,0 +1,61 @@ +import { useState } from 'react'; + +const DISMISSED_KEY = 'openhuman_beta_banner_dismissed'; + +const BetaBanner = () => { + const [visible, setVisible] = useState(() => { + try { + return localStorage.getItem(DISMISSED_KEY) !== 'true'; + } catch { + return true; + } + }); + + if (!visible) return null; + + const handleDismiss = () => { + try { + localStorage.setItem(DISMISSED_KEY, 'true'); + } catch { + // localStorage unavailable — dismiss for this session only + } + setVisible(false); + }; + + return ( +
+ {/* Beta pill */} + + Beta + + + {/* Message */} +

+ OpenHuman is in beta — you may hit rough edges. Your feedback helps us ship faster. +

+ + {/* Dismiss */} + +
+ ); +}; + +export default BetaBanner;