Skip to content

Commit 4f50d3e

Browse files
committed
feat(notifications): surface add-on migration notice
- pin the Navet custom panel migration notice above regular notifications - link users to the HACS custom panel setup steps - document the gradual add-on phase-out in setup docs
1 parent f54964d commit 4f50d3e

10 files changed

Lines changed: 81 additions & 15 deletions

File tree

README.md

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -102,11 +102,16 @@ Assistant custom panel at `/navet` with the bundled dashboard served by Home Ass
102102
Use this path when you want Navet inside Home Assistant itself. Use the add-on or Docker paths below
103103
only when you want a separately hosted Navet instance with shared runtime configuration.
104104

105+
Existing add-on users should migrate to the HACS custom panel when possible. The add-on remains
106+
available for now, but it will be phased out gradually as the custom panel becomes the primary Home
107+
Assistant integration path.
108+
105109
### Optional Home Assistant add-on
106110

107111
Use the add-on when you specifically want Navet hosted as a Home Assistant add-on with Ingress or
108112
direct access on port `8099`. For the normal Home Assistant sidebar panel experience, use the HACS
109-
custom panel flow above instead.
113+
custom panel flow above instead. New Home Assistant OS and Supervised installs should prefer the
114+
custom panel because the add-on is planned for gradual phase-out.
110115

111116
1. Add the Navet add-on repository to Home Assistant:
112117

@@ -132,13 +137,6 @@ custom panel flow above instead.
132137
5. Start the add-on and open Navet from the Home Assistant sidebar, or use the add-on's `8099`
133138
direct-access port for a dashboard view without the Home Assistant sidebar.
134139

135-
### Home Assistant dev add-on
136-
137-
For testing unreleased builds, run the **Publish Home Assistant Add-on** GitHub Actions workflow
138-
manually, then refresh the custom add-on repository in Home Assistant and install **Navet Dev**.
139-
The dev add-on uses the same options as the regular add-on, but pulls the `dev` add-on image tag
140-
from GitHub Container Registry.
141-
142140
Set `dashboard_config_url` to a Navet dashboard YAML export if you want fresh browsers or Home
143141
Assistant companion-app WebViews to bootstrap the same dashboard instead of starting from onboarding.
144142
After first launch, Docker and add-on deployments also keep the entered session and dashboard layout

docs/DOCKER_HOME_ASSISTANT_ADDON.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@ This means:
2424

2525
For Home Assistant OS and Supervised users, the HACS custom panel path is the recommended
2626
Home Assistant-native setup. The add-on remains supported for users who specifically want a
27-
separately hosted Navet instance through Ingress or direct port access.
27+
separately hosted Navet instance through Ingress or direct port access, but existing add-on users
28+
should migrate to the custom panel when possible because the add-on will be phased out gradually.
2829

2930
The custom panel deployment path is:
3031

@@ -133,7 +134,8 @@ authentication policy for that environment.
133134

134135
Use this option when you specifically want Navet hosted as a Home Assistant add-on with Ingress or
135136
direct access on port `8099`. For the normal Home Assistant sidebar panel experience, use the HACS
136-
custom panel integration instead.
137+
custom panel integration instead. New Home Assistant OS and Supervised installs should prefer the
138+
custom panel because this add-on path is planned for gradual phase-out.
137139

138140
### Files in This Repo
139141

src/app/features/notifications/components/notifications/index.tsx

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,11 +51,14 @@ export function NotificationPanel({ isOpen, onClose, triggerRefs = [] }: Notific
5151
deleteNotification,
5252
clearAll,
5353
} = useNotifications();
54+
const navetNotifications = notifications.filter(
55+
(notification) => notification.source === 'navet'
56+
);
5457
const updateNotifications = notifications.filter(
5558
(notification) => notification.source === 'update'
5659
);
5760
const regularNotifications = notifications.filter(
58-
(notification) => notification.source !== 'update'
61+
(notification) => notification.source !== 'update' && notification.source !== 'navet'
5962
);
6063

6164
useEffect(() => {
@@ -103,6 +106,19 @@ export function NotificationPanel({ isOpen, onClose, triggerRefs = [] }: Notific
103106
<NotificationEmptyState />
104107
) : (
105108
<div className="p-3">
109+
{navetNotifications.length > 0 ? (
110+
<NotificationSection
111+
title={t('notifications.section.important')}
112+
notifications={navetNotifications}
113+
dividerClassName={surface.dividerClassName}
114+
onPrimaryAction={runPrimaryAction}
115+
onDelete={deleteNotification}
116+
theme={theme}
117+
primaryColor={primaryColor}
118+
formatTimestamp={formatRelativeTimestamp}
119+
/>
120+
) : null}
121+
106122
{updateNotifications.length > 0 ? (
107123
<NotificationSection
108124
title={t('notifications.section.updates')}
@@ -113,6 +129,7 @@ export function NotificationPanel({ isOpen, onClose, triggerRefs = [] }: Notific
113129
theme={theme}
114130
primaryColor={primaryColor}
115131
formatTimestamp={formatRelativeTimestamp}
132+
className={navetNotifications.length > 0 ? 'mt-4' : undefined}
116133
/>
117134
) : null}
118135

@@ -126,7 +143,11 @@ export function NotificationPanel({ isOpen, onClose, triggerRefs = [] }: Notific
126143
theme={theme}
127144
primaryColor={primaryColor}
128145
formatTimestamp={formatRelativeTimestamp}
129-
className={updateNotifications.length > 0 ? 'mt-4' : undefined}
146+
className={
147+
navetNotifications.length > 0 || updateNotifications.length > 0
148+
? 'mt-4'
149+
: undefined
150+
}
130151
/>
131152
) : null}
132153
</div>

src/app/features/notifications/components/notifications/use-notification-list.ts

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,14 @@ import { shallow } from 'zustand/shallow';
33
import { selectUpdateDomainEntities } from '@/app/hooks/ha-domain-entity-maps';
44
import { useHomeAssistant } from '@/app/hooks/use-home-assistant';
55
import { useI18n } from '@/app/i18n';
6+
import { isHomeAssistantPanelMode } from '@/app/runtime/app-mode';
67
import { homeAssistantSelectors } from '@/app/stores/selectors';
78
import type { HaNotificationData } from './use-ha-notification-data';
89
import type { Notification } from './use-notifications';
910

11+
const ADDON_PHASE_OUT_NOTIFICATION_ID = 'navet:addon-phase-out';
12+
const ADDON_PHASE_OUT_NOTIFICATION_TIMESTAMP = new Date('2026-05-19T00:00:00Z');
13+
1014
const inferNotificationType = (
1115
entityId: string,
1216
attributes: Record<string, unknown>
@@ -58,10 +62,26 @@ export function useNotificationList({
5862
const updateEntities = useHomeAssistant(selectUpdateDomainEntities, shallow);
5963

6064
return useMemo<Notification[]>(() => {
65+
const navetNotifications: Notification[] = !isHomeAssistantPanelMode()
66+
? [
67+
{
68+
id: ADDON_PHASE_OUT_NOTIFICATION_ID,
69+
notificationId: ADDON_PHASE_OUT_NOTIFICATION_ID,
70+
source: 'navet',
71+
type: 'warning',
72+
title: t('notifications.navet.addonPhaseOut.title'),
73+
message: t('notifications.navet.addonPhaseOut.message'),
74+
timestamp: ADDON_PHASE_OUT_NOTIFICATION_TIMESTAMP,
75+
read: readNotifications.includes(ADDON_PHASE_OUT_NOTIFICATION_ID),
76+
},
77+
]
78+
: [];
79+
6180
if (
6281
!hassEntitiesHydrated &&
6382
persistentNotifications.length === 0 &&
64-
repairIssues.length === 0
83+
repairIssues.length === 0 &&
84+
navetNotifications.length === 0
6585
) {
6686
return [];
6787
}
@@ -211,7 +231,12 @@ export function useNotificationList({
211231
};
212232
});
213233

214-
return [...livePersistentNotifications, ...liveRepairNotifications, ...updateNotifications]
234+
return [
235+
...navetNotifications,
236+
...livePersistentNotifications,
237+
...liveRepairNotifications,
238+
...updateNotifications,
239+
]
215240
.filter((notification) => !hiddenNotifications.includes(notification.id))
216241
.sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime());
217242
}, [

src/app/features/notifications/components/notifications/use-notifications.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ export interface Notification {
1111
timestamp: Date;
1212
read: boolean;
1313
notificationId: string;
14-
source: 'persistent_notification' | 'update' | 'repair';
14+
source: 'persistent_notification' | 'update' | 'repair' | 'navet';
1515
isBusy?: boolean;
1616
progress?: number | null;
1717
statusLabel?: string;

src/app/i18n/messages/de.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -774,6 +774,7 @@ export const deMessages = {
774774
'notifications.action.hide': 'Ausblenden',
775775
'notifications.action.delete': 'Löschen',
776776
'notifications.title': 'Benachrichtigungen',
777+
'notifications.section.important': 'Wichtig',
777778
'notifications.section.updates': 'Updates',
778779
'notifications.section.notifications': 'Benachrichtigungen',
779780
'notifications.header.markAllRead': 'Alle als gelesen markieren',
@@ -795,6 +796,9 @@ export const deMessages = {
795796
'notifications.update.installingProgress': 'Installiere {progress}%',
796797
'notifications.update.installing': 'Update wird installiert...',
797798
'notifications.update.readyToInstall': 'Bereit zur Installation von {version}',
799+
'notifications.navet.addonPhaseOut.title': 'Navet zum Custom Panel wechseln',
800+
'notifications.navet.addonPhaseOut.message':
801+
'Das Home Assistant Add-on wird schrittweise eingestellt. Installiere Navet uber HACS als Custom Panel fur den einfacheren, empfohlenen Installationsweg. [Setup-Schritte ansehen](https://github.com/awesomestvi/navet#home-assistant-custom-panel-with-hacs).',
798802
'media.readyToPlay': 'Bereit zum Abspielen',
799803
'weather.today': 'Heute',
800804
'weather.dayFallback': 'Tag {day}',

src/app/i18n/messages/en.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -760,6 +760,7 @@ export const enMessages = {
760760
'notifications.action.hide': 'Hide',
761761
'notifications.action.delete': 'Delete',
762762
'notifications.title': 'Notifications',
763+
'notifications.section.important': 'Important',
763764
'notifications.section.updates': 'Updates',
764765
'notifications.section.notifications': 'Notifications',
765766
'notifications.header.markAllRead': 'Mark all read',
@@ -780,6 +781,9 @@ export const enMessages = {
780781
'notifications.update.installingProgress': 'Installing {progress}%',
781782
'notifications.update.installing': 'Installing update...',
782783
'notifications.update.readyToInstall': 'Ready to install {version}',
784+
'notifications.navet.addonPhaseOut.title': 'Move Navet to the custom panel',
785+
'notifications.navet.addonPhaseOut.message':
786+
'The Home Assistant add-on will be phased out gradually. Install Navet through HACS as a custom panel for the easier, recommended setup path. [View setup steps](https://github.com/awesomestvi/navet#home-assistant-custom-panel-with-hacs).',
783787
'media.readyToPlay': 'Ready to play',
784788
'weather.today': 'Today',
785789
'weather.dayFallback': 'Day {day}',

src/app/i18n/messages/es.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -774,6 +774,7 @@ export const esMessages = {
774774
'notifications.action.hide': 'Ocultar',
775775
'notifications.action.delete': 'Eliminar',
776776
'notifications.title': 'Notificaciones',
777+
'notifications.section.important': 'Importante',
777778
'notifications.section.updates': 'Actualizaciones',
778779
'notifications.section.notifications': 'Notificaciones',
779780
'notifications.header.markAllRead': 'Marcar todo como leído',
@@ -794,6 +795,9 @@ export const esMessages = {
794795
'notifications.update.installingProgress': 'Instalando {progress}%',
795796
'notifications.update.installing': 'Instalando actualizacion...',
796797
'notifications.update.readyToInstall': 'Listo para instalar {version}',
798+
'notifications.navet.addonPhaseOut.title': 'Mueve Navet al panel personalizado',
799+
'notifications.navet.addonPhaseOut.message':
800+
'El add-on de Home Assistant se retirara gradualmente. Instala Navet mediante HACS como panel personalizado para usar la ruta de instalacion mas sencilla y recomendada. [Ver pasos de configuracion](https://github.com/awesomestvi/navet#home-assistant-custom-panel-with-hacs).',
797801
'media.readyToPlay': 'Listo para reproducir',
798802
'weather.today': 'Hoy',
799803
'weather.dayFallback': 'Día {day}',

src/app/i18n/messages/fr.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -775,6 +775,7 @@ export const frMessages = {
775775
'notifications.action.hide': 'Masquer',
776776
'notifications.action.delete': 'Supprimer',
777777
'notifications.title': 'Notifications',
778+
'notifications.section.important': 'Important',
778779
'notifications.section.updates': 'Mises à jour',
779780
'notifications.section.notifications': 'Notifications',
780781
'notifications.header.markAllRead': 'Tout marquer comme lu',
@@ -795,6 +796,9 @@ export const frMessages = {
795796
'notifications.update.installingProgress': 'Installation {progress}%',
796797
'notifications.update.installing': 'Installation de la mise a jour...',
797798
'notifications.update.readyToInstall': 'Pret a installer {version}',
799+
'notifications.navet.addonPhaseOut.title': 'Deplacer Navet vers le panneau personnalise',
800+
'notifications.navet.addonPhaseOut.message':
801+
'Le module complementaire Home Assistant sera progressivement abandonne. Installez Navet via HACS comme panneau personnalise pour utiliser le parcours recommande, plus simple. [Voir les etapes de configuration](https://github.com/awesomestvi/navet#home-assistant-custom-panel-with-hacs).',
798802
'media.readyToPlay': 'Pret a lire',
799803
'weather.today': 'Aujourd’hui',
800804
'weather.dayFallback': 'Jour {day}',

src/app/i18n/messages/sv.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -766,6 +766,7 @@ export const svMessages = {
766766
'notifications.action.hide': 'Dölj',
767767
'notifications.action.delete': 'Ta bort',
768768
'notifications.title': 'Notiser',
769+
'notifications.section.important': 'Viktigt',
769770
'notifications.section.updates': 'Uppdateringar',
770771
'notifications.section.notifications': 'Notiser',
771772
'notifications.header.markAllRead': 'Markera alla som lästa',
@@ -785,6 +786,9 @@ export const svMessages = {
785786
'notifications.update.installingProgress': 'Installerar {progress}%',
786787
'notifications.update.installing': 'Installerar uppdatering...',
787788
'notifications.update.readyToInstall': 'Redo att installera {version}',
789+
'notifications.navet.addonPhaseOut.title': 'Flytta Navet till den anpassade panelen',
790+
'notifications.navet.addonPhaseOut.message':
791+
'Home Assistant-tillagget fasas ut gradvis. Installera Navet via HACS som en anpassad panel for den enklare, rekommenderade vagen. [Visa installationsstegen](https://github.com/awesomestvi/navet#home-assistant-custom-panel-with-hacs).',
788792
'media.readyToPlay': 'Redo att spela',
789793
'weather.today': 'I dag',
790794
'weather.dayFallback': 'Dag {day}',

0 commit comments

Comments
 (0)