diff --git a/hassio/src/addon-view/hassio-addon-dashboard.ts b/hassio/src/addon-view/hassio-addon-dashboard.ts index 4455982ecc..22e5bb32c9 100644 --- a/hassio/src/addon-view/hassio-addon-dashboard.ts +++ b/hassio/src/addon-view/hassio-addon-dashboard.ts @@ -17,7 +17,9 @@ import { HassioAddonDetails, } from "../../../src/data/hassio/addon"; import { extractApiErrorMessage } from "../../../src/data/hassio/common"; +import { setSupervisorOption } from "../../../src/data/hassio/supervisor"; import { Supervisor } from "../../../src/data/supervisor/supervisor"; +import { showConfirmationDialog } from "../../../src/dialogs/generic/show-dialog-box"; import "../../../src/layouts/hass-error-screen"; import "../../../src/layouts/hass-loading-screen"; import "../../../src/layouts/hass-tabs-subpage"; @@ -166,6 +168,42 @@ class HassioAddonDashboard extends LitElement { protected async firstUpdated(): Promise { if (this.route.path === "") { const requestedAddon = extractSearchParam("addon"); + const requestedAddonRepository = extractSearchParam("repository_url"); + if ( + requestedAddonRepository && + !this.supervisor.supervisor.addons_repositories.find( + (repo) => repo === requestedAddonRepository + ) + ) { + if ( + !(await showConfirmationDialog(this, { + title: this.supervisor.localize("my.add_addon_repository_title"), + text: this.supervisor.localize( + "my.add_addon_repository_description", + { addon: requestedAddon, repository: requestedAddonRepository } + ), + confirmText: this.supervisor.localize("common.add"), + dismissText: this.supervisor.localize("common.cancel"), + })) + ) { + this._error = this.supervisor.localize( + "my.error_repository_not_found" + ); + return; + } + + try { + await setSupervisorOption(this.hass, { + addons_repositories: [ + ...this.supervisor.supervisor.addons_repositories, + requestedAddonRepository, + ], + }); + } catch (err: any) { + this._error = extractApiErrorMessage(err); + } + } + if (requestedAddon) { const addonsInfo = await fetchHassioAddonsInfo(this.hass); const validAddon = addonsInfo.addons.some( diff --git a/hassio/src/hassio-my-redirect.ts b/hassio/src/hassio-my-redirect.ts index fc0e1c0808..526d6295e1 100644 --- a/hassio/src/hassio-my-redirect.ts +++ b/hassio/src/hassio-my-redirect.ts @@ -42,6 +42,9 @@ export const REDIRECTS: Redirects = { params: { addon: "string", }, + optional_params: { + repository_url: "url", + }, }, supervisor_ingress: { redirect: "/hassio/ingress", @@ -124,6 +127,14 @@ class HassioMyRedirect extends LitElement { } resultParams[key] = params[key]; }); + Object.entries(redirect.optional_params || {}).forEach(([key, type]) => { + if (params[key]) { + if (!this._checkParamType(type, params[key])) { + throw Error(); + } + resultParams[key] = params[key]; + } + }); return `?${createSearchParam(resultParams)}`; } diff --git a/src/data/hassio/supervisor.ts b/src/data/hassio/supervisor.ts index ec6434f545..55edd1cf9e 100644 --- a/src/data/hassio/supervisor.ts +++ b/src/data/hassio/supervisor.ts @@ -1,7 +1,7 @@ import { atLeastVersion } from "../../common/config/version"; import { HomeAssistant, PanelInfo } from "../../types"; import { SupervisorArch } from "../supervisor/supervisor"; -import { HassioAddonInfo, HassioAddonRepository } from "./addon"; +import { HassioAddonInfo } from "./addon"; import { hassioApiResultExtractor, HassioResponse } from "./common"; export type HassioHomeAssistantInfo = { @@ -23,7 +23,7 @@ export type HassioHomeAssistantInfo = { export type HassioSupervisorInfo = { addons: HassioAddonInfo[]; - addons_repositories: HassioAddonRepository[]; + addons_repositories: string[]; arch: SupervisorArch; channel: string; debug: boolean; diff --git a/src/panels/my/ha-panel-my.ts b/src/panels/my/ha-panel-my.ts index 836d3061f5..9883f6a20b 100644 --- a/src/panels/my/ha-panel-my.ts +++ b/src/panels/my/ha-panel-my.ts @@ -220,6 +220,9 @@ export interface Redirect { params?: { [key: string]: ParamType; }; + optional_params?: { + [key: string]: ParamType; + }; } @customElement("ha-panel-my") diff --git a/src/translations/en.json b/src/translations/en.json index c5be427d1b..e95c39cfac 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -4480,6 +4480,7 @@ "cancel": "[%key:ui::common::cancel%]", "yes": "[%key:ui::common::yes%]", "no": "[%key:ui::common::no%]", + "add": "[%key:supervisor::dialog::repositories::add%]", "description": "Description", "failed_to_restart_name": "Failed to restart {name}", "failed_to_update_name": "Failed to update {name}", @@ -4549,8 +4550,11 @@ "my": { "not_supported": "[%key:ui::panel::my::not_supported%]", "faq_link": "[%key:ui::panel::my::faq_link%]", + "add_addon_repository_title": "Missing add-on repository", + "add_addon_repository_description": "The addon ''{addon}'' is a part of the add-on repository ''{repository}'', this repository is missing on your system, do you want to add that now?", "error": "[%key:ui::panel::my::error%]", "error_addon_not_found": "Add-on not found", + "error_repository_not_found": "The required repository for this Add-on was not found", "error_addon_not_started": "The requested add-on is not running. Please start it first", "error_addon_not_installed": "The requested add-on is not installed. Please install it first", "error_addon_no_ingress": "The requested add-on does not support ingress"