diff --git a/app/components/settings/nostr_edit_relays_component.html.erb b/app/components/settings/nostr_edit_relays_component.html.erb new file mode 100644 index 0000000..1cf6762 --- /dev/null +++ b/app/components/settings/nostr_edit_relays_component.html.erb @@ -0,0 +1,45 @@ +
+

Edit relays

+ <%= form_with url: "#", local: true, + html: { data: { controller: "relay-list-editor" } } do |f| %> + + + + + + + <%= f.submit "Save relay list", class: "btn-md btn-blue w-full" %> + <% end %> +
diff --git a/app/components/settings/nostr_edit_relays_component.rb b/app/components/settings/nostr_edit_relays_component.rb new file mode 100644 index 0000000..3dc7241 --- /dev/null +++ b/app/components/settings/nostr_edit_relays_component.rb @@ -0,0 +1,31 @@ +# frozen_string_literal: true + +module Settings + class NostrEditRelaysComponent < ViewComponent::Base + def initialize(nip65_event: nil) + @nip65_event = nip65_event + @relays = build_relays + ensure_site_relay + end + + private + + def build_relays + if @nip65_event.present? + @nip65_event["tags"] + .select { |t| t[0] == "r" } + .map { |t| { url: t[1], marker: t[2] } } + else + Setting.nostr_discovery_relays.map { |url| { url: url, marker: nil } } + end + end + + def ensure_site_relay + site_relay_url = Setting.nostr_relay_url + return if site_relay_url.blank? + + @relays.reject! { |r| r[:url] == site_relay_url } + @relays.unshift({ url: site_relay_url, marker: nil }) + end + end +end diff --git a/app/components/settings/nostr_relay_status_component.html.erb b/app/components/settings/nostr_relay_status_component.html.erb index 1592f9c..4ba882b 100644 --- a/app/components/settings/nostr_relay_status_component.html.erb +++ b/app/components/settings/nostr_relay_status_component.html.erb @@ -1,18 +1,18 @@ -<%= render StatusTextComponent.new( - text: @text, - icon_name: @icon_name, - icon_color: @icon_color) %> - -<% if @status == 1 %> -

- -

-<% elsif @status == 2 %> -

- -

+<% @statuses.each do |status| %> + <%= render StatusTextComponent.new( + text: status[:text], + icon_name: status[:icon_name], + icon_color: status[:icon_color] + ) %> <% end %> + +
+ + <%= render ModalComponent.new(show_close_button: false) do %> + <%= render Settings::NostrEditRelaysComponent.new( + nip65_event: @nip65_event + ) %> + <% end %> +
diff --git a/app/components/settings/nostr_relay_status_component.rb b/app/components/settings/nostr_relay_status_component.rb index 783ea70..0dc8aa6 100644 --- a/app/components/settings/nostr_relay_status_component.rb +++ b/app/components/settings/nostr_relay_status_component.rb @@ -3,34 +3,46 @@ module Settings class NostrRelayStatusComponent < ViewComponent::Base def initialize(nip65_event:, relay_url: Setting.nostr_relay_url) + @nip65_event = nip65_event @relay_url = relay_url + @relay_host = relay_url.present? ? URI.parse(relay_url).host : nil + @statuses = [] if nip65_event.present? + @statuses.push({ + text: "You have a relay list configured", + icon_name: "check-circle", + icon_color: "emerald-500" + }) + if relay_urls(nip65_event).include?(@relay_url) - @text = "You have a relay list, and the Kosmos relay is part of it" - @icon_name = "check-circle" - @icon_color = "emerald-500" - @status = 0 + @statuses.push({ + text: "The #{@relay_host} relay is part of your relay list", + icon_name: "check-circle", + icon_color: "emerald-500" + }) else - @text = "The Kosmos relay is missing from your relay list" - @icon_name = "alert-octagon" - @icon_color = "amber-500" - @status = 1 + @statuses.push({ + text: "The #{@relay_host} relay is missing from your relay list", + icon_name: "alert-octagon", + icon_color: "amber-500" + }) end else - @text = "We could not find a relay list for your public key" - @icon_name = "alert-octagon" - @icon_color = "amber-500" - @status = 2 + @statuses.push({ + text: "We could not find a relay list for your public key", + icon_name: "alert-octagon", + icon_color: "amber-500" + }) end + + @button_text = (nip65_event.present? ? "Edit relays" : "Set up relays") end private def relay_urls(nip65_event) - nip65_event["tags"].select{ |t| t[0] == "r" }.map{ |t| t[1] } - # @inbox_relay_urls = relay_tags&.select{ |t| t[2] == "read" }&.map{ |t| t[1] } - # @outbox_relay_urls = relay_tags&.select{ |t| t[2] != "read" }&.map{ |t| t[1] } + nip65_event["tags"].select { |t| t[0] == "r" }.map { |t| t[1] } end end end diff --git a/app/javascript/controllers/relay_list_editor_controller.js b/app/javascript/controllers/relay_list_editor_controller.js new file mode 100644 index 0000000..5a79803 --- /dev/null +++ b/app/javascript/controllers/relay_list_editor_controller.js @@ -0,0 +1,17 @@ +import { Controller } from "@hotwired/stimulus" + +export default class extends Controller { + static targets = [ "list", "template" ] + + add (event) { + event.preventDefault() + const row = this.templateTarget.content.cloneNode(true) + this.listTarget.appendChild(row) + } + + remove (event) { + event.preventDefault() + const row = event.target.closest("li") + row.remove() + } +}