| import { useState, useEffect } from 'react'; | |
| import { getFeatureFlags, markFeatureViewed, type Feature } from '~/lib/api/features'; | |
| const VIEWED_FEATURES_KEY = 'bolt_viewed_features'; | |
| const getViewedFeatures = (): string[] => { | |
| try { | |
| const stored = localStorage.getItem(VIEWED_FEATURES_KEY); | |
| return stored ? JSON.parse(stored) : []; | |
| } catch { | |
| return []; | |
| } | |
| }; | |
| const setViewedFeatures = (featureIds: string[]) => { | |
| try { | |
| localStorage.setItem(VIEWED_FEATURES_KEY, JSON.stringify(featureIds)); | |
| } catch (error) { | |
| console.error('Failed to persist viewed features:', error); | |
| } | |
| }; | |
| export const useFeatures = () => { | |
| const [hasNewFeatures, setHasNewFeatures] = useState(false); | |
| const [unviewedFeatures, setUnviewedFeatures] = useState<Feature[]>([]); | |
| const [viewedFeatureIds, setViewedFeatureIds] = useState<string[]>(() => getViewedFeatures()); | |
| useEffect(() => { | |
| const checkNewFeatures = async () => { | |
| try { | |
| const features = await getFeatureFlags(); | |
| const unviewed = features.filter((feature) => !viewedFeatureIds.includes(feature.id)); | |
| setUnviewedFeatures(unviewed); | |
| setHasNewFeatures(unviewed.length > 0); | |
| } catch (error) { | |
| console.error('Failed to check for new features:', error); | |
| } | |
| }; | |
| checkNewFeatures(); | |
| }, [viewedFeatureIds]); | |
| const acknowledgeFeature = async (featureId: string) => { | |
| try { | |
| await markFeatureViewed(featureId); | |
| const newViewedIds = [...viewedFeatureIds, featureId]; | |
| setViewedFeatureIds(newViewedIds); | |
| setViewedFeatures(newViewedIds); | |
| setUnviewedFeatures((prev) => prev.filter((feature) => feature.id !== featureId)); | |
| setHasNewFeatures(unviewedFeatures.length > 1); | |
| } catch (error) { | |
| console.error('Failed to acknowledge feature:', error); | |
| } | |
| }; | |
| const acknowledgeAllFeatures = async () => { | |
| try { | |
| await Promise.all(unviewedFeatures.map((feature) => markFeatureViewed(feature.id))); | |
| const newViewedIds = [...viewedFeatureIds, ...unviewedFeatures.map((f) => f.id)]; | |
| setViewedFeatureIds(newViewedIds); | |
| setViewedFeatures(newViewedIds); | |
| setUnviewedFeatures([]); | |
| setHasNewFeatures(false); | |
| } catch (error) { | |
| console.error('Failed to acknowledge all features:', error); | |
| } | |
| }; | |
| return { hasNewFeatures, unviewedFeatures, acknowledgeFeature, acknowledgeAllFeatures }; | |
| }; | |