Add HACS, Themes
This commit is contained in:
106
custom_components/hacs/tasks/setup_frontend.py
Normal file
106
custom_components/hacs/tasks/setup_frontend.py
Normal file
@@ -0,0 +1,106 @@
|
||||
""""Starting setup task: Frontend"."""
|
||||
from __future__ import annotations
|
||||
|
||||
from aiohttp import web
|
||||
from homeassistant.components.http import HomeAssistantView
|
||||
from homeassistant.core import HomeAssistant
|
||||
|
||||
from ..base import HacsBase
|
||||
from ..const import DOMAIN
|
||||
from ..enums import HacsStage
|
||||
from ..hacs_frontend import locate_dir
|
||||
from ..hacs_frontend.version import VERSION as FE_VERSION
|
||||
from .base import HacsTask
|
||||
|
||||
URL_BASE = "/hacsfiles"
|
||||
|
||||
|
||||
async def async_setup_task(hacs: HacsBase, hass: HomeAssistant) -> Task:
|
||||
"""Set up this task."""
|
||||
return Task(hacs=hacs, hass=hass)
|
||||
|
||||
|
||||
class Task(HacsTask):
|
||||
"""Setup the HACS frontend."""
|
||||
|
||||
stages = [HacsStage.SETUP]
|
||||
|
||||
async def async_execute(self) -> None:
|
||||
"""Execute the task."""
|
||||
|
||||
# Register themes
|
||||
self.hass.http.register_static_path(f"{URL_BASE}/themes", self.hass.config.path("themes"))
|
||||
|
||||
# Register frontend
|
||||
if self.hacs.configuration.frontend_repo_url:
|
||||
self.task_logger(
|
||||
self.hacs.log.warning,
|
||||
"Frontend development mode enabled. Do not run in production!",
|
||||
)
|
||||
self.hass.http.register_view(HacsFrontendDev())
|
||||
else:
|
||||
#
|
||||
self.hass.http.register_static_path(
|
||||
f"{URL_BASE}/frontend", locate_dir(), cache_headers=False
|
||||
)
|
||||
|
||||
# Custom iconset
|
||||
self.hass.http.register_static_path(
|
||||
f"{URL_BASE}/iconset.js", str(self.hacs.integration_dir / "iconset.js")
|
||||
)
|
||||
if "frontend_extra_module_url" not in self.hass.data:
|
||||
self.hass.data["frontend_extra_module_url"] = set()
|
||||
self.hass.data["frontend_extra_module_url"].add(f"{URL_BASE}/iconset.js")
|
||||
|
||||
# Register www/community for all other files
|
||||
use_cache = self.hacs.core.lovelace_mode == "storage"
|
||||
self.task_logger(
|
||||
self.hacs.log.info,
|
||||
f"{self.hacs.core.lovelace_mode} mode, cache for /hacsfiles/: {use_cache}",
|
||||
)
|
||||
|
||||
self.hass.http.register_static_path(
|
||||
URL_BASE,
|
||||
self.hass.config.path("www/community"),
|
||||
cache_headers=use_cache,
|
||||
)
|
||||
|
||||
self.hacs.frontend_version = FE_VERSION
|
||||
|
||||
# Add to sidepanel if needed
|
||||
if DOMAIN not in self.hass.data.get("frontend_panels", {}):
|
||||
self.hass.components.frontend.async_register_built_in_panel(
|
||||
component_name="custom",
|
||||
sidebar_title=self.hacs.configuration.sidepanel_title,
|
||||
sidebar_icon=self.hacs.configuration.sidepanel_icon,
|
||||
frontend_url_path=DOMAIN,
|
||||
config={
|
||||
"_panel_custom": {
|
||||
"name": "hacs-frontend",
|
||||
"embed_iframe": True,
|
||||
"trust_external": False,
|
||||
"js_url": f"/hacsfiles/frontend/entrypoint.js?hacstag={FE_VERSION}",
|
||||
}
|
||||
},
|
||||
require_admin=True,
|
||||
)
|
||||
|
||||
|
||||
class HacsFrontendDev(HomeAssistantView):
|
||||
"""Dev View Class for HACS."""
|
||||
|
||||
requires_auth = False
|
||||
name = "hacs_files:frontend"
|
||||
url = r"/hacsfiles/frontend/{requested_file:.+}"
|
||||
|
||||
async def get(self, request, requested_file): # pylint: disable=unused-argument
|
||||
"""Handle HACS Web requests."""
|
||||
hacs: HacsBase = request.app["hass"].data.get(DOMAIN)
|
||||
requested = requested_file.split("/")[-1]
|
||||
request = await hacs.session.get(f"{hacs.configuration.frontend_repo_url}/{requested}")
|
||||
if request.status == 200:
|
||||
result = await request.read()
|
||||
response = web.Response(body=result)
|
||||
response.headers["Content-Type"] = "application/javascript"
|
||||
|
||||
return response
|
||||
Reference in New Issue
Block a user