diff --git a/lib/graphql/resolvers/admin.ex b/lib/graphql/resolvers/admin.ex index 76be369bc..15878e4ca 100644 --- a/lib/graphql/resolvers/admin.ex +++ b/lib/graphql/resolvers/admin.ex @@ -267,7 +267,7 @@ defmodule Mobilizon.GraphQL.Resolvers.Admin do context: %{current_user: %User{role: role}} }) when is_admin(role) do - with {:ok, res} <- Admin.save_settings("instance", args), + with {:ok, res} <- Admin.save_settings("instance", IO.inspect(args, label: "SAVE_ARGS")), res <- res |> Enum.map(fn {key, val} -> @@ -309,6 +309,18 @@ defmodule Mobilizon.GraphQL.Resolvers.Admin do get_media_setting(parent, %{group: "instance", name: "instance_logo"}, resolution) end + @spec get_instance_favicon(any(), any(), Absinthe.Resolution.t()) :: + {:ok, Media.t() | nil} | {:error, String.t()} + def get_instance_favicon(parent, _args, resolution) do + get_media_setting(parent, %{group: "instance", name: "instance_favicon"}, resolution) + end + + @spec get_default_picture(any(), any(), Absinthe.Resolution.t()) :: + {:ok, Media.t() | nil} | {:error, String.t()} + def get_default_picture(parent, _args, resolution) do + get_media_setting(parent, %{group: "instance", name: "default_picture"}, resolution) + end + @spec update_user(any, map(), Absinthe.Resolution.t()) :: {:error, :invalid_argument | :user_not_found | binary | Ecto.Changeset.t()} | {:ok, Mobilizon.Users.User.t()} diff --git a/lib/graphql/resolvers/config.ex b/lib/graphql/resolvers/config.ex index 8d57bad63..f054e98b2 100644 --- a/lib/graphql/resolvers/config.ex +++ b/lib/graphql/resolvers/config.ex @@ -35,10 +35,20 @@ defmodule Mobilizon.GraphQL.Resolvers.Config do end @spec instance_logo(any(), map(), Absinthe.Resolution.t()) :: {:ok, Media.t()} - def instance_logo(_parent, _locale, _resolution) do + def instance_logo(_parent, _params, _resolution) do {:ok, MediaResolver.transform_media(Config.instance_logo())} end + @spec instance_favicon(any(), map(), Absinthe.Resolution.t()) :: {:ok, Media.t()} + def instance_favicon(_parent, _params, _resolution) do + {:ok, MediaResolver.transform_media(Config.instance_favicon())} + end + + @spec default_picture(any(), map(), Absinthe.Resolution.t()) :: {:ok, Media.t()} + def default_picture(_parent, _params, _resolution) do + {:ok, MediaResolver.transform_media(Config.default_picture())} + end + @spec terms(any(), map(), Absinthe.Resolution.t()) :: {:ok, map()} def terms(_parent, %{locale: locale}, _resolution) do type = Config.instance_terms_type() @@ -107,6 +117,8 @@ defmodule Mobilizon.GraphQL.Resolvers.Config do slogan: Config.instance_slogan(), languages: Config.instance_languages(), instance_logo: Config.instance_logo(), + instance_favicon: Config.instance_favicon(), + default_picture: Config.default_picture(), anonymous: %{ participation: %{ allowed: Config.anonymous_participation?(), diff --git a/lib/graphql/schema/admin.ex b/lib/graphql/schema/admin.ex index 133e06d0e..ce2b55106 100644 --- a/lib/graphql/schema/admin.ex +++ b/lib/graphql/schema/admin.ex @@ -128,6 +128,14 @@ defmodule Mobilizon.GraphQL.Schema.AdminType do description: "The instance's logo", resolve: &Admin.get_instance_logo/3 ) + field(:instance_favicon, :media, + description: "The instance's favicon", + resolve: &Admin.get_instance_favicon/3 + ) + field(:default_picture, :media, + description: "The default picture", + resolve: &Admin.get_default_picture/3 + ) field(:instance_privacy_policy, :string, description: "The instance's privacy policy body text" @@ -422,6 +430,14 @@ defmodule Mobilizon.GraphQL.Schema.AdminType do description: "The instance's logo, either as an object or directly the ID of an existing media" ) + arg(:instance_favicon, :media_input, + description: + "The instance's favicon, either as an object or directly the ID of an existing media" + ) + arg(:default_picture, :media_input, + description: + "The default picture, either as an object or directly the ID of an existing media" + ) arg(:instance_terms, :string, description: "The instance's terms body text") arg(:instance_terms_type, :instance_terms_type, description: "The instance's terms type") diff --git a/lib/graphql/schema/config.ex b/lib/graphql/schema/config.ex index 7d4c9166e..52e5c0749 100644 --- a/lib/graphql/schema/config.ex +++ b/lib/graphql/schema/config.ex @@ -63,6 +63,14 @@ defmodule Mobilizon.GraphQL.Schema.ConfigType do resolve(&Config.instance_logo/3) end + field(:instance_favicon, :media, description: "The instance's favicon") do + resolve(&Config.instance_favicon/3) + end + + field(:default_picture, :media, description: "The default picture") do + resolve(&Config.default_picture/3) + end + field(:privacy, :privacy, description: "The instance's privacy policy") do arg(:locale, :string, default_value: "en", diff --git a/lib/mobilizon/admin/admin.ex b/lib/mobilizon/admin/admin.ex index 2ca501578..aadba94b4 100644 --- a/lib/mobilizon/admin/admin.ex +++ b/lib/mobilizon/admin/admin.ex @@ -180,7 +180,9 @@ defmodule Mobilizon.Admin do @spec save_settings(String.t(), map()) :: {:ok, any} | {:error, any} def save_settings(group, args) do - {medias, values} = Map.split(args, [:instance_logo]) + {medias, values} = Map.split(args, [:instance_logo, :instance_favicon, :default_picture]) + IO.inspect(medias, label: "MEDIAS") + IO.inspect(values, label: "VALUES") Multi.new() |> do_save_media_setting(group, medias) diff --git a/lib/mobilizon/config.ex b/lib/mobilizon/config.ex index 93b2e55f0..b39a81f09 100644 --- a/lib/mobilizon/config.ex +++ b/lib/mobilizon/config.ex @@ -79,17 +79,16 @@ defmodule Mobilizon.Config do def instance_slogan, do: config_cached_value("instance", "instance_slogan") @spec instance_logo :: Media.t() | nil - def instance_logo, - do: - config_cached_value( - "instance", - "instance_logo" - ) + def instance_logo, do: config_cached_value( "instance", "instance_logo") + + @spec instance_favicon :: Media.t() | nil + def instance_favicon, do: config_cached_value( "instance", "instance_favicon") + + @spec default_picture :: Media.t() | nil + def default_picture, do: config_cached_value( "instance", "default_picture") @spec contact :: String.t() | nil - def contact do - config_cached_value("instance", "contact") - end + def contact, do: config_cached_value("instance", "contact") @spec instance_terms(String.t()) :: String.t() def instance_terms(locale \\ "en") do diff --git a/schema.graphql b/schema.graphql index 1d99f3ef0..0f947952b 100644 --- a/schema.graphql +++ b/schema.graphql @@ -169,6 +169,15 @@ type Config { "The instance's slogan" slogan: String + "The instance's logo" + instanceLogo: Media + + "The instance's favicon" + instanceFavicon: Media + + "The default picture" + defaultPicture: Media + "The instance's contact details" contact: String @@ -1881,6 +1890,12 @@ type RootMutationType { "The instance's logo" instanceLogo: MediaInput + "The instance's favicon" + instanceFavicon: MediaInput + + "The default picture" + defaultPicture: MediaInput + "The instance's terms body text" instanceTerms: String @@ -3702,7 +3717,13 @@ type AdminSettings { contact: String "The instance's logo" - instanceLogo: MediaInput + instanceLogo: Media + + "The instance's favicon" + instanceFavicon: Media + + "The default picture" + defaultPicture: Media "The instance's terms body text" instanceTerms: String diff --git a/src/components/Image/LazyImageWrapper.vue b/src/components/Image/LazyImageWrapper.vue index b30a027ae..b6dd6c4cf 100644 --- a/src/components/Image/LazyImageWrapper.vue +++ b/src/components/Image/LazyImageWrapper.vue @@ -11,8 +11,11 @@