UX: warn for aggregator websites, try to nudge https://wiki.openstreetmap.org/wiki/Organised_Editing/Activities/Trziste_prace to not use aggregator websites
This commit is contained in:
parent
752266ee48
commit
10c28e6608
4 changed files with 46 additions and 4 deletions
|
@ -847,6 +847,7 @@
|
|||
},
|
||||
"tooLong": "The text is too long, at most 255 characters are allowed. You have {count} characters now.",
|
||||
"url": {
|
||||
"aggregator": "{host} is a third-party aggregator website. If possible, search the official website.",
|
||||
"description": "link to a website",
|
||||
"feedback": "This is not a valid web address"
|
||||
},
|
||||
|
|
|
@ -703,6 +703,7 @@
|
|||
},
|
||||
"tooLong": "Deze tekst is te lang. De tekst heeft {count} lettertekens, er mogen maximaal 255 letters zijn",
|
||||
"url": {
|
||||
"aggregator": "{host} is een aggregator-website. Gebruik de officiele website indien mogelijk.",
|
||||
"description": "een link naar een webpagina",
|
||||
"feedback": "Dit is geen geldige link"
|
||||
},
|
||||
|
|
|
@ -85,13 +85,12 @@
|
|||
feedback?.setData(undefined)
|
||||
return
|
||||
}
|
||||
if (!validator?.isValid(v, getCountry)) {
|
||||
feedback?.setData(validator?.getFeedback(v, getCountry))
|
||||
if (!validator?.isValid(v, getCountry)) {
|
||||
value.setData(undefined)
|
||||
return
|
||||
}
|
||||
|
||||
feedback?.setData(undefined)
|
||||
if (selectedUnit.data) {
|
||||
value.setData(unit.toOsm(v, selectedUnit.data))
|
||||
} else {
|
||||
|
|
|
@ -1,16 +1,30 @@
|
|||
import { Validator } from "../Validator"
|
||||
import { Translation } from "../../i18n/Translation"
|
||||
import Translations from "../../i18n/Translations"
|
||||
|
||||
export default class UrlValidator extends Validator {
|
||||
private readonly _forceHttps: boolean
|
||||
|
||||
private static readonly aggregatorWebsites = new Set<string>([
|
||||
"booking.com",
|
||||
"hotel-details-guide.com", "tripingguide.com",
|
||||
"tripadvisor.com", "tripadvisor.co.uk", "tripadvisor.com.au",
|
||||
])
|
||||
|
||||
constructor(name?: string, explanation?: string, forceHttps?: boolean) {
|
||||
super(
|
||||
name ?? "url",
|
||||
explanation ??
|
||||
"The validatedTextField will format URLs to always be valid and have a https://-header (even though the 'https'-part will be hidden from the user. Furthermore, some tracking parameters will be removed",
|
||||
"url"
|
||||
"url",
|
||||
)
|
||||
this._forceHttps = forceHttps ?? false
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* new UrlValidator().reformat("https://example.com/page?fbclid=123456&utm_source=mastodon") // => "https://example.com/page"
|
||||
*/
|
||||
reformat(str: string): string {
|
||||
try {
|
||||
let url: URL
|
||||
|
@ -63,6 +77,33 @@ export default class UrlValidator extends Validator {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* const v = new UrlValidator()
|
||||
* v.getFeedback("example.").textFor("en") // => "This is not a valid web address"
|
||||
* v.getFeedback("https://booking.com/some-hotel.html").textFor("en").indexOf("search the official website") > 0 // => true
|
||||
*
|
||||
*/
|
||||
getFeedback(s: string, getCountry?: () => string): Translation | undefined {
|
||||
const upstream = super.getFeedback(s, getCountry)
|
||||
if (upstream) {
|
||||
return upstream
|
||||
}
|
||||
/*
|
||||
Upstream calls 'isValid', which checks if it is an actual URL.
|
||||
If we reach this point, we can safely assume 'new URL' will work
|
||||
*/
|
||||
const url = new URL(s)
|
||||
let host = url.host.toLowerCase()
|
||||
if (host.startsWith("www.")) {
|
||||
host = host.slice(4)
|
||||
}
|
||||
if (UrlValidator.aggregatorWebsites.has(host)) {
|
||||
return Translations.t.validation.url.aggregator.Subs({ host })
|
||||
}
|
||||
return undefined
|
||||
}
|
||||
|
||||
isValid(str: string): boolean {
|
||||
try {
|
||||
if (
|
||||
|
|
Loading…
Reference in a new issue