Merge branch 'features/flavour-switching' into 'develop'
[MastoAPI] Add switching of frontend flavours See merge request pleroma/pleroma!807
This commit is contained in:
commit
c23bd05737
|
@ -94,3 +94,17 @@ Request parameters can be passed via [query strings](https://en.wikipedia.org/wi
|
||||||
|
|
||||||
## `/api/pleroma/admin/`…
|
## `/api/pleroma/admin/`…
|
||||||
See [Admin-API](Admin-API.md)
|
See [Admin-API](Admin-API.md)
|
||||||
|
|
||||||
|
## `/api/v1/pleroma/flavour/:flavour`
|
||||||
|
* Method `POST`
|
||||||
|
* Authentication: required
|
||||||
|
* Response: JSON string. Returns the user flavour or the default one on success, otherwise returns `{"error": "error_msg"}`
|
||||||
|
* Example response: "glitch"
|
||||||
|
* Note: This is intended to be used only by mastofe
|
||||||
|
|
||||||
|
## `/api/v1/pleroma/flavour`
|
||||||
|
* Method `GET`
|
||||||
|
* Authentication: required
|
||||||
|
* Response: JSON string. Returns the user flavour or the default one.
|
||||||
|
* Example response: "glitch"
|
||||||
|
* Note: This is intended to be used only by mastofe
|
||||||
|
|
|
@ -35,6 +35,7 @@ defmodule Pleroma.User.Info do
|
||||||
field(:hide_followers, :boolean, default: false)
|
field(:hide_followers, :boolean, default: false)
|
||||||
field(:hide_follows, :boolean, default: false)
|
field(:hide_follows, :boolean, default: false)
|
||||||
field(:pinned_activities, {:array, :string}, default: [])
|
field(:pinned_activities, {:array, :string}, default: [])
|
||||||
|
field(:flavour, :string, default: nil)
|
||||||
|
|
||||||
# Found in the wild
|
# Found in the wild
|
||||||
# ap_id -> Where is this used?
|
# ap_id -> Where is this used?
|
||||||
|
@ -187,6 +188,14 @@ def mastodon_settings_update(info, settings) do
|
||||||
|> validate_required([:settings])
|
|> validate_required([:settings])
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def mastodon_flavour_update(info, flavour) do
|
||||||
|
params = %{flavour: flavour}
|
||||||
|
|
||||||
|
info
|
||||||
|
|> cast(params, [:flavour])
|
||||||
|
|> validate_required([:flavour])
|
||||||
|
end
|
||||||
|
|
||||||
def set_source_data(info, source_data) do
|
def set_source_data(info, source_data) do
|
||||||
params = %{source_data: source_data}
|
params = %{source_data: source_data}
|
||||||
|
|
||||||
|
|
|
@ -1051,6 +1051,8 @@ def index(%{assigns: %{user: user}} = conn, _params) do
|
||||||
accounts =
|
accounts =
|
||||||
Map.put(%{}, user.id, AccountView.render("account.json", %{user: user, for: user}))
|
Map.put(%{}, user.id, AccountView.render("account.json", %{user: user, for: user}))
|
||||||
|
|
||||||
|
flavour = get_user_flavour(user)
|
||||||
|
|
||||||
initial_state =
|
initial_state =
|
||||||
%{
|
%{
|
||||||
meta: %{
|
meta: %{
|
||||||
|
@ -1135,7 +1137,7 @@ def index(%{assigns: %{user: user}} = conn, _params) do
|
||||||
conn
|
conn
|
||||||
|> put_layout(false)
|
|> put_layout(false)
|
||||||
|> put_view(MastodonView)
|
|> put_view(MastodonView)
|
||||||
|> render("index.html", %{initial_state: initial_state})
|
|> render("index.html", %{initial_state: initial_state, flavour: flavour})
|
||||||
else
|
else
|
||||||
conn
|
conn
|
||||||
|> redirect(to: "/web/login")
|
|> redirect(to: "/web/login")
|
||||||
|
@ -1157,6 +1159,43 @@ def put_settings(%{assigns: %{user: user}} = conn, %{"data" => settings} = _para
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@supported_flavours ["glitch", "vanilla"]
|
||||||
|
|
||||||
|
def set_flavour(%{assigns: %{user: user}} = conn, %{"flavour" => flavour} = _params)
|
||||||
|
when flavour in @supported_flavours do
|
||||||
|
flavour_cng = User.Info.mastodon_flavour_update(user.info, flavour)
|
||||||
|
|
||||||
|
with changeset <- Ecto.Changeset.change(user),
|
||||||
|
changeset <- Ecto.Changeset.put_embed(changeset, :info, flavour_cng),
|
||||||
|
{:ok, user} <- User.update_and_set_cache(changeset),
|
||||||
|
flavour <- user.info.flavour do
|
||||||
|
json(conn, flavour)
|
||||||
|
else
|
||||||
|
e ->
|
||||||
|
conn
|
||||||
|
|> put_resp_content_type("application/json")
|
||||||
|
|> send_resp(500, Jason.encode!(%{"error" => inspect(e)}))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def set_flavour(conn, _params) do
|
||||||
|
conn
|
||||||
|
|> put_status(400)
|
||||||
|
|> json(%{error: "Unsupported flavour"})
|
||||||
|
end
|
||||||
|
|
||||||
|
def get_flavour(%{assigns: %{user: user}} = conn, _params) do
|
||||||
|
json(conn, get_user_flavour(user))
|
||||||
|
end
|
||||||
|
|
||||||
|
defp get_user_flavour(%User{info: %{flavour: flavour}}) when flavour in @supported_flavours do
|
||||||
|
flavour
|
||||||
|
end
|
||||||
|
|
||||||
|
defp get_user_flavour(_) do
|
||||||
|
"glitch"
|
||||||
|
end
|
||||||
|
|
||||||
def login(conn, %{"code" => code}) do
|
def login(conn, %{"code" => code}) do
|
||||||
with {:ok, app} <- get_or_make_app(),
|
with {:ok, app} <- get_or_make_app(),
|
||||||
%Authorization{} = auth <- Repo.get_by(Authorization, token: code, app_id: app.id),
|
%Authorization{} = auth <- Repo.get_by(Authorization, token: code, app_id: app.id),
|
||||||
|
|
|
@ -236,6 +236,9 @@ defmodule Pleroma.Web.Router do
|
||||||
get("/suggestions", MastodonAPIController, :suggestions)
|
get("/suggestions", MastodonAPIController, :suggestions)
|
||||||
|
|
||||||
get("/endorsements", MastodonAPIController, :empty_array)
|
get("/endorsements", MastodonAPIController, :empty_array)
|
||||||
|
|
||||||
|
post("/pleroma/flavour/:flavour", MastodonAPIController, :set_flavour)
|
||||||
|
get("/pleroma/flavour", MastodonAPIController, :get_flavour)
|
||||||
end
|
end
|
||||||
|
|
||||||
scope "/api/web", Pleroma.Web.MastodonAPI do
|
scope "/api/web", Pleroma.Web.MastodonAPI do
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
</title>
|
</title>
|
||||||
<link rel="icon" type="image/png" href="/favicon.png"/>
|
<link rel="icon" type="image/png" href="/favicon.png"/>
|
||||||
<script crossorigin='anonymous' src="/packs/locales.js"></script>
|
<script crossorigin='anonymous' src="/packs/locales.js"></script>
|
||||||
<script crossorigin='anonymous' src="/packs/locales/glitch/en.js"></script>
|
<script crossorigin='anonymous' src="/packs/locales/<%= @flavour %>/en.js"></script>
|
||||||
|
|
||||||
<link rel='preload' as='script' crossorigin='anonymous' href='/packs/features/getting_started.js'>
|
<link rel='preload' as='script' crossorigin='anonymous' href='/packs/features/getting_started.js'>
|
||||||
<link rel='preload' as='script' crossorigin='anonymous' href='/packs/features/compose.js'>
|
<link rel='preload' as='script' crossorigin='anonymous' href='/packs/features/compose.js'>
|
||||||
|
@ -19,10 +19,10 @@
|
||||||
<script src="/packs/core/common.js"></script>
|
<script src="/packs/core/common.js"></script>
|
||||||
<link rel="stylesheet" media="all" href="/packs/core/common.css" />
|
<link rel="stylesheet" media="all" href="/packs/core/common.css" />
|
||||||
|
|
||||||
<script src="/packs/flavours/glitch/common.js"></script>
|
<script src="/packs/flavours/<%= @flavour %>/common.js"></script>
|
||||||
<link rel="stylesheet" media="all" href="/packs/flavours/glitch/common.css" />
|
<link rel="stylesheet" media="all" href="/packs/flavours/<%= @flavour %>/common.css" />
|
||||||
|
|
||||||
<script src="/packs/flavours/glitch/home.js"></script>
|
<script src="/packs/flavours/<%= @flavour %>/home.js"></script>
|
||||||
</head>
|
</head>
|
||||||
<body class='app-body no-reduce-motion system-font'>
|
<body class='app-body no-reduce-motion system-font'>
|
||||||
<div class='app-holder' data-props='{"locale":"en"}' id='mastodon'>
|
<div class='app-holder' data-props='{"locale":"en"}' id='mastodon'>
|
||||||
|
|
|
@ -1792,4 +1792,29 @@ test "unmute conversation", %{conn: conn, user: user, activity: activity} do
|
||||||
|> json_response(200)
|
|> json_response(200)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "flavours switching (Pleroma Extension)", %{conn: conn} do
|
||||||
|
user = insert(:user)
|
||||||
|
|
||||||
|
get_old_flavour =
|
||||||
|
conn
|
||||||
|
|> assign(:user, user)
|
||||||
|
|> get("/api/v1/pleroma/flavour")
|
||||||
|
|
||||||
|
assert "glitch" == json_response(get_old_flavour, 200)
|
||||||
|
|
||||||
|
set_flavour =
|
||||||
|
conn
|
||||||
|
|> assign(:user, user)
|
||||||
|
|> post("/api/v1/pleroma/flavour/vanilla")
|
||||||
|
|
||||||
|
assert "vanilla" == json_response(set_flavour, 200)
|
||||||
|
|
||||||
|
get_new_flavour =
|
||||||
|
conn
|
||||||
|
|> assign(:user, user)
|
||||||
|
|> post("/api/v1/pleroma/flavour/vanilla")
|
||||||
|
|
||||||
|
assert json_response(set_flavour, 200) == json_response(get_new_flavour, 200)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue