diff --git a/assets/src/bundles/browse/origin-search.js b/assets/src/bundles/browse/origin-search.js --- a/assets/src/bundles/browse/origin-search.js +++ b/assets/src/bundles/browse/origin-search.js @@ -5,7 +5,7 @@ * See top-level LICENSE file for more information */ -import {handleFetchError} from 'utils/functions'; +import {handleFetchError, isArchivedOrigin} from 'utils/functions'; const limit = 100; let linksPrev = []; @@ -186,13 +186,20 @@ $('#swh-no-result').text(data.reason); $('#swh-no-result').show(); }); - }); } else { - // otherwise, proceed with origins search - $('#swh-origin-search-results').show(); - $('.swh-search-pagination').show(); - searchOriginsFirst(searchQueryText, limit); + isArchivedOrigin(searchQueryText) + .then(() => { + // redirect to the browse origin + window.location.href = + `${Urls.browse_origin()}?origin_url=${encodeURIComponent(searchQueryText)}`; + }) + .catch(() => { + // otherwise, proceed with origins search irrespective of the error + $('#swh-origin-search-results').show(); + $('.swh-search-pagination').show(); + searchOriginsFirst(searchQueryText, limit); + }); } } diff --git a/assets/src/utils/functions.js b/assets/src/utils/functions.js --- a/assets/src/utils/functions.js +++ b/assets/src/utils/functions.js @@ -78,3 +78,35 @@ } return ``; } + +export function isValidURL(string) { + try { + new URL(string); + } catch (_) { + return false; + } + return true; +} + +export function isArchivedOrigin(originPath) { + // Returns a promise to Check whether the given string is an archived origin URL + return new Promise((resolve, reject) => { + if (!isValidURL(originPath)) { + // Not a valid URL, reject immediately + reject(new Error('Not a valid URL')); + } else { + fetch(Urls.api_1_origin(originPath)) + .then(resp => { + if (resp.ok) { + // Success response represents an archived origin + resolve('URL exists in the archive'); + } else { + reject(new Error('Not an archived origin')); + } + }) + .catch(() => { + reject(new Error('Unknown error')); + }); + } + }); +}