49 lines
1.4 KiB
Elixir
49 lines
1.4 KiB
Elixir
defmodule BDS.Desktop.ShellLive.SessionUtil do
|
|
@moduledoc false
|
|
|
|
import Phoenix.Component, only: [assign: 3]
|
|
|
|
alias BDS.UI.{Session, Workbench}
|
|
|
|
@default_new_project_name "New Blog"
|
|
|
|
def restore_workbench_session(session_payload) do
|
|
Session.restore(session_payload)
|
|
rescue
|
|
_error -> Workbench.new()
|
|
end
|
|
|
|
def next_project_name(projects) do
|
|
existing_names = MapSet.new(Enum.map(projects, & &1.name))
|
|
|
|
Stream.iterate(1, &(&1 + 1))
|
|
|> Enum.find_value(fn index ->
|
|
candidate =
|
|
if index == 1, do: @default_new_project_name, else: "#{@default_new_project_name} #{index}"
|
|
|
|
if MapSet.member?(existing_names, candidate), do: nil, else: candidate
|
|
end)
|
|
end
|
|
|
|
def initial_handled_task_results do
|
|
BDS.Tasks.status_snapshot()
|
|
|> Map.get(:tasks, [])
|
|
|> Enum.filter(fn task -> task.status == :completed and is_map(task.result) end)
|
|
|> Enum.map(& &1.id)
|
|
|> MapSet.new()
|
|
end
|
|
|
|
def next_completed_task_result(socket, task_status) do
|
|
handled = Map.get(socket.assigns, :handled_task_results, MapSet.new())
|
|
|
|
Enum.find(Map.get(task_status, :tasks, []), fn task ->
|
|
task.status == :completed and is_map(task.result) and not MapSet.member?(handled, task.id)
|
|
end)
|
|
end
|
|
|
|
def mark_task_result_handled(socket, task_id) do
|
|
handled = Map.get(socket.assigns, :handled_task_results, MapSet.new())
|
|
assign(socket, :handled_task_results, MapSet.put(handled, task_id))
|
|
end
|
|
end
|