mirror of
https://github.com/home-assistant/frontend.git
synced 2026-04-20 09:34:56 +00:00
edd162df68df63e4ac93932ce48b141fa96b4ed5
* Use websocket subscription for calendar events Replace polling-based calendar event fetching with real-time websocket subscriptions. This leverages the new subscription API added in core to provide automatic updates when calendar events change, eliminating the need for periodic polling. The subscription pattern follows the same approach used for todo items, with proper lifecycle management and cleanup. Related: home-assistant/core#156340 Related: #27565 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * Fix calendar events not loading on initial render Remove premature subscription attempt in setConfig() that was failing because the date range wasn't available yet. The subscription now properly happens when the view-changed event fires from ha-full-calendar after initial render, which includes the necessary start/end dates. This ensures calendar events load immediately when the component is first displayed. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * Fix calendar subscription data format mismatch The websocket subscription returns event data with fields named start and end, but the frontend was expecting dtstart and dtend. This caused events to not display because the data wasn't being properly mapped. Now properly transform the subscription response format: - Subscription format: start/end/summary/description - Internal format: dtstart/dtend/summary/description This ensures both initial event loading and real-time updates work correctly. * Address PR review comments Fixes based on Copilot review feedback: 1. **Fixed race conditions**: Made _unsubscribeAll() async and await it before creating new subscriptions to prevent old subscription events from updating UI after new subscriptions are created. 2. **Added error handling**: All unsubscribe operations now catch errors to handle cases where subscriptions may have already been closed. 3. **Fixed type safety**: Replaced 'any' type with proper CalendarEventSubscriptionData type and added interface definition for subscription response data structure. 4. **Improved error tracking**: Calendar card now accumulates errors from multiple calendars instead of only showing the last error. 5. **Prevented duplicate subscriptions**: Added checks to unsubscribe existing subscriptions before creating new ones in both _subscribeCalendarEvents and _requestSelected. 6. **Fixed null handling**: Properly convert null values to undefined for CalendarEventData fields to match expected types. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * Extract event normalization to shared utility function Reduced code duplication by extracting the calendar event normalization logic from both hui-calendar-card.ts and ha-panel-calendar.ts into a shared utility function in calendar.ts. The normalizeSubscriptionEventData() function handles the conversion from subscription format (start/end) to internal format (dtstart/dtend) in a single, reusable location. This improves maintainability by ensuring consistent event normalization across all calendar components and reduces the risk of divergence. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * Address additional review comments Fixed remaining issues from code review: 1. **Added @state decorator to _errorCalendars**: Ensures proper reactivity in calendar card when errors occur or are cleared, triggering UI updates. 2. **Fixed error accumulation in panel calendar**: Panel now properly accumulates errors from multiple calendars similar to the card implementation, preventing previously failed calendars from being hidden when new errors occur. 3. **Removed duplicate subscription check**: Deleted redundant duplicate subscription prevention in _requestSelected() since _subscribeCalendarEvents() already handles this at lines 221-227. Note: The [nitpick] comment about loading states during await is a performance enhancement suggestion, not a required fix. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * Update src/panels/lovelace/cards/hui-calendar-card.ts Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update src/panels/lovelace/cards/hui-calendar-card.ts Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update src/panels/calendar/ha-panel-calendar.ts Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Refactor fetchCalendarEvents to use shared normalization utility Eliminated code duplication by reusing normalizeSubscriptionEventData() in fetchCalendarEvents(). After extracting date strings from the REST API response format, we now convert to a subscription-like format and pass it to the shared utility. This ensures consistent event normalization across both REST API and WebSocket subscription code paths, reducing maintenance burden and potential for divergence. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * Move date normalization into normalizeSubscriptionEventData The getCalendarDate helper is part of the normalization process and should be inside the normalization function. This makes normalizeSubscriptionEventData handle both REST API format (with dateTime/date objects) and subscription format (plain strings). Changes: - Moved getCalendarDate into normalizeSubscriptionEventData - Updated CalendarEventSubscriptionData to accept string | any for start/end - Made normalizeSubscriptionEventData return CalendarEvent | null for invalid dates - Simplified fetchCalendarEvents to use the shared normalization - Added null filtering in calendar card and panel event handlers 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * Replace any types with proper TypeScript types Added proper types for calendar event data: - CalendarDateValue: Union type for date values (string | {dateTime} | {date}) - CalendarEventRestData: Interface for REST API event responses - Updated fetchCalendarEvents to use CalendarEventRestData[] - Updated CalendarEventSubscriptionData to use CalendarDateValue - Updated getCalendarDate to use proper type guards with 'in' operator 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * Unify CalendarEventRestData and CalendarEventSubscriptionData Both interfaces had identical structures, so unified them into a single CalendarEventSubscriptionData interface that is used for both REST API responses and WebSocket subscription data. Changes: - Removed CalendarEventRestData interface - Updated fetchCalendarEvents to use CalendarEventSubscriptionData - Added documentation clarifying the interface is used for both APIs 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * PR comments * fix import * fix import --------- Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Bump home-assistant/actions from d56d093b9ab8d2105bc0cb6ee9bcc0ef4ec8b96d to 5752577ea7cc5aefb064b0b21432f18fe4d6ba90 (#51430)
…
…
Home Assistant Frontend
This is the repository for the official Home Assistant frontend.
Development
- Initial setup:
script/setup - Development: Instructions
- Production build:
script/build_frontend - Gallery:
cd gallery && script/develop_gallery
Frontend development
Classic environment
A complete guide can be found at the following link. It describes a short guide for the build of project.
License
Home Assistant is open-source and Apache 2 licensed. Feel free to browse the repository, learn and reuse parts in your own projects.
We use BrowserStack to test Home Assistant on a large variety of devices.
Description
Languages
TypeScript
98.8%
JavaScript
1.1%

