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