Spaces:
Running
Running
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 }; | |
}; | |