defmodule Kanta.Sync.Plugin.DashboardComponent do @moduledoc """ Phoenix LiveComponent for Kanta dashboard """ use Phoenix.LiveComponent alias Kanta.Sync.Adapter.ConnectionChecker alias Kanta.Sync.Services.FetchAndPopulateDatabaseService alias Kanta.Sync.Services.PushChangesToProductionService def pull_prompt_text, do: """ Your environment will be populated with translations from the production environment. Are you sure? """ def push_prompt_text, do: """ Translations on production will be overwriten with changed translation from your environment. Are you sure? """ def render(%{connected: connected, fetching: fetching, pushing: pushing} = assigns) do dot_color = if connected, do: "#4caf50", else: "#f44336" ~H"""
KantaSync
<%= if @connected do %>
Connected to production.
<% else %> Can't connect to Kanta API endpoint <% end %>
""" end def update(%{id: id}, socket) do connected = ConnectionChecker.call() socket = assign(socket, id: id, connected: connected, fetching: false, pushing: false, task: nil) {:ok, socket} end def handle_event("fetch", _, %{assigns: assigns} = socket) do pid = self() Task.start(fn -> FetchAndPopulateDatabaseService.call() send_update(pid, __MODULE__, id: assigns.id, fetching: false) end) socket = assign(socket, fetching: true) {:noreply, socket} end def handle_event("push", _, %{assigns: assigns} = socket) do pid = self() Task.start(fn -> PushChangesToProductionService.call() send_update(pid, __MODULE__, id: assigns.id, fetching: false) end) socket = assign(socket, pushing: true) {:noreply, socket} end def handle_info({_ref, _data}, socket) do {:noreply, assign(socket, pushing: false, fetching: false)} end end