fix: Address Copilot review feedback on event subscriptions

Add error handling and documentation to event subscriptions based on
Copilot review feedback.

Changes:
- Added try-catch blocks to all event callbacks for graceful error handling
- Added comments documenting that subscriptions persist for app lifetime
- Improved JSDoc for onPatternDeleted function with lifecycle details
- Added error logging to help debug potential issues

Benefits:
- Prevents silent failures in event callbacks
- Clear documentation about subscription lifecycle
- Better developer experience with error messages

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
Jan-Henrik Bruhn 2025-12-27 17:45:22 +01:00
parent 20e9fa13e7
commit 9299f5aed9
4 changed files with 47 additions and 9 deletions

View file

@ -28,9 +28,17 @@ export const useEventStore = create<EventState>((set) => ({
})); }));
/** /**
* Subscribe to pattern deleted event * Subscribe to the pattern deleted event.
* @param callback - Function to call when event is emitted *
* @returns Unsubscribe function * The subscription remains active until the returned unsubscribe function is called.
* If the unsubscribe function is not called, the listener will persist for the
* lifetime of the event store (typically the lifetime of the application).
*
* Call the returned unsubscribe function when the listener is no longer needed,
* especially for short-lived components or non-module-level subscriptions.
*
* @param callback - Function to call when the event is emitted.
* @returns Unsubscribe function that removes the listener when invoked.
*/ */
export const onPatternDeleted = (callback: () => void): (() => void) => { export const onPatternDeleted = (callback: () => void): (() => void) => {
let prevCount = useEventStore.getState().patternDeletedCount; let prevCount = useEventStore.getState().patternDeletedCount;

View file

@ -194,7 +194,17 @@ export const useMachineCacheStore = create<MachineCacheState>((set, get) => ({
}, },
})); }));
// Subscribe to pattern deleted event // Subscribe to pattern deleted event.
// This subscription is intended to persist for the lifetime of the application,
// so the unsubscribe function returned by `onPatternDeleted` is intentionally
// not stored or called.
onPatternDeleted(() => { onPatternDeleted(() => {
try {
useMachineCacheStore.getState().clearResumeState(); useMachineCacheStore.getState().clearResumeState();
} catch (error) {
console.error(
"[MachineCacheStore] Failed to clear resume state on pattern deleted event:",
error,
);
}
}); });

View file

@ -128,7 +128,17 @@ export const useMachineUploadStore = create<MachineUploadState>((set) => ({
}, },
})); }));
// Subscribe to pattern deleted event // Subscribe to pattern deleted event.
// This subscription is intended to persist for the lifetime of the application,
// so the unsubscribe function returned by `onPatternDeleted` is intentionally
// not stored or called.
onPatternDeleted(() => { onPatternDeleted(() => {
try {
useMachineUploadStore.getState().reset(); useMachineUploadStore.getState().reset();
} catch (error) {
console.error(
"[MachineUploadStore] Failed to reset on pattern deleted event:",
error,
);
}
}); });

View file

@ -123,7 +123,17 @@ export const useUploadedPatternOffset = () =>
export const usePatternRotation = () => export const usePatternRotation = () =>
usePatternStore((state) => state.patternRotation); usePatternStore((state) => state.patternRotation);
// Subscribe to pattern deleted event // Subscribe to pattern deleted event.
// This subscription is intended to persist for the lifetime of the application,
// so the unsubscribe function returned by `onPatternDeleted` is intentionally
// not stored or called.
onPatternDeleted(() => { onPatternDeleted(() => {
try {
usePatternStore.getState().clearUploadedPattern(); usePatternStore.getState().clearUploadedPattern();
} catch (error) {
console.error(
"[PatternStore] Failed to clear uploaded pattern on pattern deleted event:",
error,
);
}
}); });