diff --git a/lib/web/controllers/manifest_controller.ex b/lib/web/controllers/manifest_controller.ex new file mode 100644 index 000000000..37b11b613 --- /dev/null +++ b/lib/web/controllers/manifest_controller.ex @@ -0,0 +1,52 @@ +defmodule Mobilizon.Web.ManifestController do + use Mobilizon.Web, :controller + + alias Mobilizon.Config + alias Mobilizon.Medias.Media + + @spec manifest(Plug.Conn.t(), any) :: Plug.Conn.t() + def manifest(conn, _params) do + favicons = case Config.instance_favicon() do + %Media{file: %{url: url}, metadata: metadata} -> + [Map.merge( + %{ + src: url, + }, + case metadata do + %{width: width} -> %{sizes: "#{width}x#{width}"} + _ -> %{} + end + )] + _ -> [ + %{ + src: "./img/icons/android-chrome-512x512.png", + sizes: "512x512", + type: "image/png" + }, + %{ + src: "./img/icons/android-chrome-192x192.png", + sizes: "192x192", + type: "image/png" + } + ] + end + json(conn, %{ + name: Config.instance_name(), + start_url: "/", + scope: "/", + display: "standalone", + background_color: "#ffffff", + theme_color: "#ffd599", + orientation: "portrait-primary", + icons: favicons + }) + end + + @spec favicon(Plug.Conn.t(), any) :: Plug.Conn.t() + def favicon(conn, _params) do + case Config.instance_favicon() do + %Media{file: %{url: url}} -> redirect(conn, external: url) + _ -> redirect(conn, to: "/img/icons/favicon.ico") + end + end +end diff --git a/lib/web/mobilizon_web.ex b/lib/web/mobilizon_web.ex index a1f97a6e3..b59e38043 100644 --- a/lib/web/mobilizon_web.ex +++ b/lib/web/mobilizon_web.ex @@ -19,7 +19,7 @@ defmodule Mobilizon.Web do def static_paths, do: - ~w(index.html manifest.json manifest.webmanifest service-worker.js css fonts img js favicon.ico robots.txt assets) + ~w(index.html service-worker.js css fonts img js robots.txt assets) def controller do quote do diff --git a/lib/web/router.ex b/lib/web/router.ex index 131c44125..40b10e9f1 100644 --- a/lib/web/router.ex +++ b/lib/web/router.ex @@ -113,6 +113,12 @@ defmodule Mobilizon.Web.Router do get("/nodeinfo/:version", NodeInfoController, :nodeinfo) end + scope "/", Mobilizon.Web do + get("/manifest.webmanifest", ManifestController, :manifest) + get("/manifest.json", ManifestController, :manifest) + get("/favicon.ico", ManifestController, :favicon) + end + scope "/", Mobilizon.Web do pipe_through(:activity_pub_and_html) pipe_through(:activity_pub_signature) diff --git a/lib/web/templates/page/index.html.heex b/lib/web/templates/page/index.html.heex index 620bb39fd..cee55f61e 100644 --- a/lib/web/templates/page/index.html.heex +++ b/lib/web/templates/page/index.html.heex @@ -1,36 +1,40 @@ - - - - - - - - - - - <%= if root?(assigns) do %> - - - - <% end %> - <%= tags(assigns) || assigns.tags %> - <%= Vite.vite_client() %> - <%= Vite.vite_snippet("src/main.ts") %> - - - -
- - + + + + + + + + + + + + + <%= if root?(assigns) do %> + + + + <% end %> + <%= tags(assigns) || assigns.tags %> + <%= Vite.vite_client() %> + <%= Vite.vite_snippet("src/main.ts") %> + + + + +
+ + + diff --git a/lib/web/views/page_view.ex b/lib/web/views/page_view.ex index 288b8a4fc..0c1f8f6e0 100644 --- a/lib/web/views/page_view.ex +++ b/lib/web/views/page_view.ex @@ -6,6 +6,7 @@ defmodule Mobilizon.Web.PageView do use Mobilizon.Web, :view alias Mobilizon.Actors.Actor + alias Mobilizon.Config alias Mobilizon.Discussions.{Comment, Discussion} alias Mobilizon.Events.Event alias Mobilizon.Posts.Post @@ -91,4 +92,23 @@ defmodule Mobilizon.Web.PageView do def root?(assigns) do assigns |> Map.get(:conn, %{request_path: "/"}) |> Map.get(:request_path, "/") == "/" end + + defp favicon do + case Config.instance_favicon() do + %{file: %{url: url}, metadata: metadata} -> %{ + src: url, + sizes: case metadata do + %{width: width} -> "#{width}x#{width}" + _ -> "any" + end + } + _ -> %{ + src: "/img/icons/apple-touch-icon-152x152.png", + sizes: "152x152" + } + end + end + + def favicon_url, do: Map.get(favicon(), :src) + def favicon_sizes, do: Map.get(favicon(), :sizes) end diff --git a/public/favicon.ico b/public/img/icons/favicon.ico similarity index 100% rename from public/favicon.ico rename to public/img/icons/favicon.ico