feat(themes): sidebar notice when an installed theme has an update (#1041)

* feat(themes): sidebar notice when an installed theme has an update

Adds a dismissible sidebar pill (sibling of the What's New banner) shown
while an installed community theme has a newer version in the store. Clicking
opens Settings -> Themes; dismiss hides it until a new update changes the set.

The theme registry is now refreshed from source once per app launch instead
of only when the Theme Store tab is opened, so newly published themes and
updates surface without a manual refresh -- and feed this notice.

* docs: add CHANGELOG entry for PR #1041

* feat(themes): in-place update control on installed theme cards

Themes with a newer version in the store now show a centered update icon on
their card in Settings -> Themes; clicking it fetches and reinstalls in place.
Extracts the shared installThemeFromRegistry helper (fetch -> validate ->
install) used by both the store list and the card control, and surfaces the
full registry entry from useThemeUpdates so the card can update directly.
This commit is contained in:
Psychotoxical
2026-06-09 01:02:32 +02:00
committed by GitHub
parent c6298d8c25
commit cfc9419de7
23 changed files with 422 additions and 29 deletions
+4
View File
@@ -34,4 +34,8 @@ export const sidebar = {
collapsePlaylists: 'Playlists einklappen',
more: 'Mehr',
feelingLucky: 'Glücks-Mix',
themeUpdatesTitle: 'Theme-Updates',
themeUpdatesTooltip: 'Theme-Updates verfügbar',
themeUpdatesDismiss: 'Ausblenden',
};
+4
View File
@@ -38,4 +38,8 @@ export const sidebar = {
collapsePlaylists: 'Collapse playlists',
more: 'More',
feelingLucky: 'Lucky Mix',
themeUpdatesTitle: 'Theme updates',
themeUpdatesTooltip: 'Theme updates available',
themeUpdatesDismiss: 'Dismiss',
};
+4
View File
@@ -35,4 +35,8 @@ export const sidebar = {
collapsePlaylists: 'Colapsar listas',
more: 'Más',
feelingLucky: 'Mezcla Suerte',
themeUpdatesTitle: 'Actualizaciones de temas',
themeUpdatesTooltip: 'Hay actualizaciones de temas',
themeUpdatesDismiss: 'Descartar',
};
+4
View File
@@ -34,4 +34,8 @@ export const sidebar = {
collapsePlaylists: 'Réduire les playlists',
more: 'Plus',
feelingLucky: 'Mix Chance',
themeUpdatesTitle: 'Mises à jour de thèmes',
themeUpdatesTooltip: 'Mises à jour de thèmes disponibles',
themeUpdatesDismiss: 'Masquer',
};
+4
View File
@@ -34,4 +34,8 @@ export const sidebar = {
collapsePlaylists: 'Skjul spillelister',
more: 'Mer',
feelingLucky: 'Lykkemiks',
themeUpdatesTitle: 'Temaoppdateringer',
themeUpdatesTooltip: 'Temaoppdateringer tilgjengelig',
themeUpdatesDismiss: 'Lukk',
};
+4
View File
@@ -34,4 +34,8 @@ export const sidebar = {
collapsePlaylists: 'Afspeellijsten inklappen',
more: 'Meer',
feelingLucky: 'Geluksmix',
themeUpdatesTitle: 'Thema-updates',
themeUpdatesTooltip: 'Thema-updates beschikbaar',
themeUpdatesDismiss: 'Sluiten',
};
+4
View File
@@ -36,4 +36,8 @@ export const sidebar = {
collapsePlaylists: 'Restrânge playlisturi',
more: 'Mai mult',
feelingLucky: 'Mix Norocos',
themeUpdatesTitle: 'Actualizări de teme',
themeUpdatesTooltip: 'Actualizări de teme disponibile',
themeUpdatesDismiss: 'Închide',
};
+4
View File
@@ -37,4 +37,8 @@ export const sidebar = {
collapsePlaylists: 'Свернуть плейлисты',
more: 'Ещё',
feelingLucky: 'Мне повезёт',
themeUpdatesTitle: 'Обновления тем',
themeUpdatesTooltip: 'Доступны обновления тем',
themeUpdatesDismiss: 'Скрыть',
};
+4
View File
@@ -34,4 +34,8 @@ export const sidebar = {
collapsePlaylists: '收起播放列表',
more: '更多',
feelingLucky: '好运混音',
themeUpdatesTitle: '主题更新',
themeUpdatesTooltip: '有可用的主题更新',
themeUpdatesDismiss: '忽略',
};