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()
+ }
+}