Skip to content

Commit 13cf4e5

Browse files
committed
fix(info): confirm URL copies inline and rename the DeArrow credit link
The Copy URL button in the filter and userscript info screens now swaps to a green Copied checkmark for 1.5s so the tap is acknowledged (#774). The DeArrow settings menu credit reads Powered by DeArrow instead of Using DeArrow, which read as a status rather than an attribution (#773). Both strings are localized in all 17 locales. Closes #773, closes #774
1 parent f7f0feb commit 13cf4e5

20 files changed

Lines changed: 73 additions & 38 deletions

wBlock/ContentInfoMetadata.swift

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,42 @@ nonisolated struct ContentInfoMetadata: Sendable {
5959
}
6060
}
6161

62+
/// Copies a URL and briefly swaps its label to a checkmark so the tap is
63+
/// visibly acknowledged.
64+
struct CopyURLButton: View {
65+
let url: URL
66+
@State private var copied = false
67+
@State private var resetTask: Task<Void, Never>?
68+
69+
var body: some View {
70+
Button {
71+
#if os(iOS)
72+
UIPasteboard.general.string = url.absoluteString
73+
#elseif os(macOS)
74+
NSPasteboard.general.clearContents()
75+
NSPasteboard.general.setString(url.absoluteString, forType: .string)
76+
#endif
77+
withAnimation(.easeInOut(duration: 0.15)) { copied = true }
78+
resetTask?.cancel()
79+
resetTask = Task {
80+
try? await Task.sleep(nanoseconds: 1_500_000_000)
81+
guard !Task.isCancelled else { return }
82+
withAnimation(.easeInOut(duration: 0.15)) { copied = false }
83+
}
84+
} label: {
85+
if copied {
86+
Label("Copied", systemImage: "checkmark")
87+
.foregroundStyle(.green)
88+
} else {
89+
Label("Copy URL", systemImage: "doc.on.doc")
90+
}
91+
}
92+
.buttonStyle(.borderless)
93+
.animation(.easeInOut(duration: 0.15), value: copied)
94+
.accessibilityLabel(copied ? Text("Copied") : Text("Copy URL"))
95+
}
96+
}
97+
6298
struct InfoMetadataRow: View {
6399
let title: LocalizedStringKey
64100
let value: String

wBlock/FilterInfoView.swift

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -96,15 +96,7 @@ struct FilterInfoView: View {
9696
if !liveFilter.version.isEmpty { InfoMetadataRow(title: "Version", value: liveFilter.version) }
9797
if liveFilter.url.scheme?.lowercased() == "http" || liveFilter.url.scheme?.lowercased() == "https" {
9898
InfoMetadataRow(title: "Source URL", value: liveFilter.url.absoluteString, url: liveFilter.url)
99-
Button {
100-
#if os(iOS)
101-
UIPasteboard.general.string = liveFilter.url.absoluteString
102-
#elseif os(macOS)
103-
NSPasteboard.general.clearContents()
104-
NSPasteboard.general.setString(liveFilter.url.absoluteString, forType: .string)
105-
#endif
106-
} label: { Label("Copy URL", systemImage: "doc.on.doc") }
107-
.buttonStyle(.borderless)
99+
CopyURLButton(url: liveFilter.url)
108100
}
109101
if let size = cachedByteCount {
110102
InfoMetadataRow(title: "Size", value: ByteCountFormatter.string(fromByteCount: Int64(size), countStyle: .file))

wBlock/UserScriptManagerView.swift

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1073,17 +1073,7 @@ private struct ScriptURLView: View {
10731073
VStack(alignment: .leading, spacing: 6) {
10741074
if let url = script.url {
10751075
InfoMetadataRow(title: "Source URL", value: url.absoluteString, url: url)
1076-
Button {
1077-
#if os(iOS)
1078-
UIPasteboard.general.string = url.absoluteString
1079-
#elseif os(macOS)
1080-
NSPasteboard.general.clearContents()
1081-
NSPasteboard.general.setString(url.absoluteString, forType: .string)
1082-
#endif
1083-
} label: {
1084-
Label("Copy URL", systemImage: "doc.on.doc")
1085-
}
1086-
.buttonStyle(.borderless)
1076+
CopyURLButton(url: url)
10871077
}
10881078
}
10891079
}
@@ -1715,7 +1705,7 @@ private struct DeArrowSettingsPicker: View {
17151705
Button("Original Thumbnail Channels") { showingChannels = true }
17161706
Divider()
17171707
// DeArrow data is CC BY-NC-SA 4.0; the credit link is a license term.
1718-
Link("Using DeArrow", destination: URL(string: "https://dearrow.ajay.app/")!)
1708+
Link("Powered by DeArrow", destination: URL(string: "https://dearrow.ajay.app/")!)
17191709
Link("Donate to DeArrow", destination: URL(string: "https://dearrow.ajay.app/donate/")!)
17201710
} label: {
17211711
HStack(spacing: 6) {

wBlock/ar.lproj/Localizable.strings

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,7 @@
236236
"Converting %@…" = "تحويل %@";
237237
"Converting Rules" = "جارٍ تحويل القواعد";
238238
"Copy URL" = "نسخ الرابط";
239+
"Copied" = "تم النسخ";
239240
"Could not resolve URL from dropped item." = "تعذّر استخراج الرابط من العنصر المُسقط.";
240241
"Country or region" = "البلد أو المنطقة";
241242
"Country: %@" = "البلد: %@";
@@ -1021,7 +1022,7 @@ To re-enable these filters, disable other large filters and apply changes again.
10211022
"Replace Thumbnails" = "استبدال الصور المصغّرة";
10221023
"Random Frame When No Thumbnail" = "إطار عشوائي عند عدم وجود صورة مصغّرة";
10231024
"Show Original on Hover" = "إظهار الأصل عند التمرير";
1024-
"Using DeArrow" = "يستخدم DeArrow";
1025+
"Powered by DeArrow" = "مدعوم من DeArrow";
10251026
"Donate to DeArrow" = "تبرّع لـ DeArrow";
10261027
"DeArrow: On" = "DeArrow: مفعّل";
10271028
"DeArrow: Off" = "DeArrow: معطّل";

wBlock/de.lproj/Localizable.strings

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,7 @@
236236
"Converting %@…" = "Konvertieren von %@â¦";
237237
"Converting Rules" = "Regeln werden konvertiert";
238238
"Copy URL" = "URL kopieren";
239+
"Copied" = "Kopiert";
239240
"Could not resolve URL from dropped item." = "URL des abgelegten Elements konnte nicht ermittelt werden.";
240241
"Country or region" = "Land oder Region";
241242
"Country: %@" = "Land: %@";
@@ -1021,7 +1022,7 @@ Um diese Filter wieder zu aktivieren, deaktiviere andere große Filter und wende
10211022
"Replace Thumbnails" = "Vorschaubilder ersetzen";
10221023
"Random Frame When No Thumbnail" = "Zufälliges Einzelbild ohne Vorschaubild";
10231024
"Show Original on Hover" = "Original beim Überfahren anzeigen";
1024-
"Using DeArrow" = "Verwendet DeArrow";
1025+
"Powered by DeArrow" = "Bereitgestellt von DeArrow";
10251026
"Donate to DeArrow" = "An DeArrow spenden";
10261027
"DeArrow: On" = "DeArrow: Ein";
10271028
"DeArrow: Off" = "DeArrow: Aus";

wBlock/el.lproj/Localizable.strings

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,7 @@
236236
"Converting %@…" = "Μετατροπή %@â¦";
237237
"Converting Rules" = "Μετατροπή κανόνων";
238238
"Copy URL" = "Αντιγραφή URL";
239+
"Copied" = "Αντιγράφηκε";
239240
"Could not resolve URL from dropped item." = "Δεν ήταν δυνατή η επίλυση URL από το στοιχείο που αποτέθηκε.";
240241
"Country or region" = "Χώρα ή περιοχή";
241242
"Country: %@" = "Χώρα: %@";
@@ -1021,7 +1022,7 @@ To re-enable these filters, disable other large filters and apply changes again.
10211022
"Replace Thumbnails" = "Αντικατάσταση μικρογραφιών";
10221023
"Random Frame When No Thumbnail" = "Τυχαίο καρέ χωρίς μικρογραφία";
10231024
"Show Original on Hover" = "Εμφάνιση πρωτότυπου με το ποντίκι";
1024-
"Using DeArrow" = "Χρησιμοποιεί το DeArrow";
1025+
"Powered by DeArrow" = "Με την υποστήριξη του DeArrow";
10251026
"Donate to DeArrow" = "Δωρεά στο DeArrow";
10261027
"DeArrow: On" = "DeArrow: ενεργό";
10271028
"DeArrow: Off" = "DeArrow: ανενεργό";

wBlock/en.lproj/Localizable.strings

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,7 @@
236236
"Converting %@…" = "Converting %@…";
237237
"Converting Rules" = "Converting Rules";
238238
"Copy URL" = "Copy URL";
239+
"Copied" = "Copied";
239240
"Could not resolve URL from dropped item." = "Could not resolve URL from dropped item.";
240241
"Country or region" = "Country or region";
241242
"Country: %@" = "Country: %@";
@@ -1020,7 +1021,7 @@ To re-enable these filters, disable other large filters and apply changes again.
10201021
"Replace Thumbnails" = "Replace Thumbnails";
10211022
"Random Frame When No Thumbnail" = "Random Frame When No Thumbnail";
10221023
"Show Original on Hover" = "Show Original on Hover";
1023-
"Using DeArrow" = "Using DeArrow";
1024+
"Powered by DeArrow" = "Powered by DeArrow";
10241025
"Donate to DeArrow" = "Donate to DeArrow";
10251026
"DeArrow: On" = "DeArrow: On";
10261027
"DeArrow: Off" = "DeArrow: Off";

wBlock/es.lproj/Localizable.strings

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,7 @@
236236
"Converting %@…" = "Convirtiendo %@…";
237237
"Converting Rules" = "Convirtiendo reglas";
238238
"Copy URL" = "Copiar URL";
239+
"Copied" = "Copiado";
239240
"Could not resolve URL from dropped item." = "No se pudo resolver la URL del elemento soltado.";
240241
"Country or region" = "País o región";
241242
"Country: %@" = "País: %@";
@@ -1021,7 +1022,7 @@ Para volver a activarlos, desactiva otros filtros grandes y aplica los cambios d
10211022
"Replace Thumbnails" = "Sustituir miniaturas";
10221023
"Random Frame When No Thumbnail" = "Fotograma aleatorio si no hay miniatura";
10231024
"Show Original on Hover" = "Mostrar original al pasar el cursor";
1024-
"Using DeArrow" = "Usa DeArrow";
1025+
"Powered by DeArrow" = "Con tecnología de DeArrow";
10251026
"Donate to DeArrow" = "Donar a DeArrow";
10261027
"DeArrow: On" = "DeArrow: activado";
10271028
"DeArrow: Off" = "DeArrow: desactivado";

wBlock/fr.lproj/Localizable.strings

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,7 @@
236236
"Converting %@…" = "Conversion de %@…";
237237
"Converting Rules" = "Conversion des règles";
238238
"Copy URL" = "Copier l'URL";
239+
"Copied" = "Copié";
239240
"Could not resolve URL from dropped item." = "Impossible de résoudre l'URL de l'élément déposé.";
240241
"Country or region" = "Pays ou région";
241242
"Country: %@" = "Pays : %@";
@@ -1021,7 +1022,7 @@ Pour les réactiver, désactivez d’autres gros filtres puis appliquez à nouve
10211022
"Replace Thumbnails" = "Remplacer les miniatures";
10221023
"Random Frame When No Thumbnail" = "Image aléatoire sans miniature proposée";
10231024
"Show Original on Hover" = "Afficher l’original au survol";
1024-
"Using DeArrow" = "Utilise DeArrow";
1025+
"Powered by DeArrow" = "Propulsé par DeArrow";
10251026
"Donate to DeArrow" = "Faire un don à DeArrow";
10261027
"DeArrow: On" = "DeArrow : activé";
10271028
"DeArrow: Off" = "DeArrow : désactivé";

wBlock/hu.lproj/Localizable.strings

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,7 @@
236236
"Converting %@…" = "%@⦠konvertálása";
237237
"Converting Rules" = "Szabályok átalakítása";
238238
"Copy URL" = "URL másolása";
239+
"Copied" = "Másolva";
239240
"Could not resolve URL from dropped item." = "Nem sikerült feloldani az URL-t az ejtett elemből.";
240241
"Country or region" = "Ország vagy régió";
241242
"Country: %@" = "Ország: %@";
@@ -1021,7 +1022,7 @@ Az újbóli engedélyezésükhöz tilts le más nagy szűrőket, majd alkalmazd
10211022
"Replace Thumbnails" = "Bélyegképek cseréje";
10221023
"Random Frame When No Thumbnail" = "Véletlen képkocka bélyegkép nélkül";
10231024
"Show Original on Hover" = "Eredeti mutatása rámutatáskor";
1024-
"Using DeArrow" = "DeArrow használatával";
1025+
"Powered by DeArrow" = "DeArrow alapján";
10251026
"Donate to DeArrow" = "Támogasd a DeArrow-t";
10261027
"DeArrow: On" = "DeArrow: be";
10271028
"DeArrow: Off" = "DeArrow: ki";

0 commit comments

Comments
 (0)