Files
bakery-ia/frontend/src/contexts/SubscriptionEventsContext.tsx

57 lines
1.7 KiB
TypeScript
Raw Normal View History

2025-10-29 06:58:05 +01:00
import React, { createContext, useContext, useState, useCallback, useEffect } from 'react';
interface SubscriptionEventsContextType {
subscriptionVersion: number;
notifySubscriptionChanged: () => void;
subscribeToChanges: (callback: () => void) => () => void;
}
const SubscriptionEventsContext = createContext<SubscriptionEventsContextType | undefined>(undefined);
export const SubscriptionEventsProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => {
const [subscriptionVersion, setSubscriptionVersion] = useState(0);
2025-11-01 21:35:03 +01:00
const subscribersRef = React.useRef<Set<() => void>>(new Set());
2025-10-29 06:58:05 +01:00
const notifySubscriptionChanged = useCallback(() => {
setSubscriptionVersion(prev => prev + 1);
2025-11-01 21:35:03 +01:00
2025-10-29 06:58:05 +01:00
// Notify all subscribers
2025-11-01 21:35:03 +01:00
subscribersRef.current.forEach(callback => {
2025-10-29 06:58:05 +01:00
try {
callback();
} catch (error) {
console.warn('Error notifying subscription change subscriber:', error);
}
});
2025-11-01 21:35:03 +01:00
}, []); // Empty dependency array - function is now stable
2025-10-29 06:58:05 +01:00
const subscribeToChanges = useCallback((callback: () => void) => {
2025-11-01 21:35:03 +01:00
subscribersRef.current.add(callback);
2025-10-29 06:58:05 +01:00
// Return unsubscribe function
return () => {
2025-11-01 21:35:03 +01:00
subscribersRef.current.delete(callback);
2025-10-29 06:58:05 +01:00
};
}, []);
const value = {
subscriptionVersion,
notifySubscriptionChanged,
subscribeToChanges
};
return (
<SubscriptionEventsContext.Provider value={value}>
{children}
</SubscriptionEventsContext.Provider>
);
};
export const useSubscriptionEvents = () => {
const context = useContext(SubscriptionEventsContext);
if (context === undefined) {
throw new Error('useSubscriptionEvents must be used within a SubscriptionEventsProvider');
}
return context;
};