lib/exshome_clock/services/local_time.ex

defmodule ExshomeClock.Services.LocalTime do
  @moduledoc """
  Provides a value for local time.
  It subscribes to the changes in clock settings and current time.
  """
  use Exshome.Dependency.GenServerDependency,
    name: "local_time",
    dependencies: [
      {ExshomeClock.Services.UtcTime, :utc_time},
      {ExshomeClock.Settings.ClockSettings, :settings}
    ]

  @impl GenServerDependency
  def handle_dependency_change(%DependencyState{deps: deps} = state) do
    value =
      DateTime.shift_zone!(
        deps.utc_time,
        deps.settings.timezone
      )

    update_value(state, value)
  end
end