chore: Move URL comparison logic to utils (#11617)
This commit is contained in:
@@ -2,6 +2,7 @@ import { createApp } from 'vue';
|
|||||||
import VueDOMPurifyHTML from 'vue-dompurify-html';
|
import VueDOMPurifyHTML from 'vue-dompurify-html';
|
||||||
import { domPurifyConfig } from '../shared/helpers/HTMLSanitizer';
|
import { domPurifyConfig } from '../shared/helpers/HTMLSanitizer';
|
||||||
import { directive as onClickaway } from 'vue3-click-away';
|
import { directive as onClickaway } from 'vue3-click-away';
|
||||||
|
import { isSameHost } from '@chatwoot/utils';
|
||||||
|
|
||||||
import slugifyWithCounter from '@sindresorhus/slugify';
|
import slugifyWithCounter from '@sindresorhus/slugify';
|
||||||
import PublicArticleSearch from './components/PublicArticleSearch.vue';
|
import PublicArticleSearch from './components/PublicArticleSearch.vue';
|
||||||
@@ -25,52 +26,6 @@ export const getHeadingsfromTheArticle = () => {
|
|||||||
return rows;
|
return rows;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
|
||||||
* Converts various input formats to URL objects.
|
|
||||||
* Handles URL objects, domain strings, relative paths, and full URLs.
|
|
||||||
* @param {string|URL} input - Input to convert to URL object
|
|
||||||
* @returns {URL|null} URL object or null if input is invalid
|
|
||||||
*/
|
|
||||||
const toURL = input => {
|
|
||||||
if (!input) return null;
|
|
||||||
if (input instanceof URL) return input;
|
|
||||||
|
|
||||||
if (
|
|
||||||
typeof input === 'string' &&
|
|
||||||
!input.includes('://') &&
|
|
||||||
!input.startsWith('/')
|
|
||||||
) {
|
|
||||||
return new URL(`https://${input}`);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof input === 'string' && input.startsWith('/')) {
|
|
||||||
return new URL(input, window.location.origin);
|
|
||||||
}
|
|
||||||
|
|
||||||
return new URL(input);
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Determines if two URLs belong to the same host by comparing their normalized URL objects.
|
|
||||||
* Handles various input formats including URL objects, domain strings, relative paths, and full URLs.
|
|
||||||
* Returns false if either URL cannot be parsed or normalized.
|
|
||||||
* @param {string|URL} url1 - First URL to compare
|
|
||||||
* @param {string|URL} url2 - Second URL to compare
|
|
||||||
* @returns {boolean} True if both URLs have the same host, false otherwise
|
|
||||||
*/
|
|
||||||
const isSameHost = (url1, url2) => {
|
|
||||||
try {
|
|
||||||
const urlObj1 = toURL(url1);
|
|
||||||
const urlObj2 = toURL(url2);
|
|
||||||
|
|
||||||
if (!urlObj1 || !urlObj2) return false;
|
|
||||||
|
|
||||||
return urlObj1.hostname === urlObj2.hostname;
|
|
||||||
} catch (error) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
export const openExternalLinksInNewTab = () => {
|
export const openExternalLinksInNewTab = () => {
|
||||||
const { customDomain, hostURL } = window.portalConfig;
|
const { customDomain, hostURL } = window.portalConfig;
|
||||||
const isOnArticlePage =
|
const isOnArticlePage =
|
||||||
|
|||||||
@@ -34,7 +34,7 @@
|
|||||||
"@breezystack/lamejs": "^1.2.7",
|
"@breezystack/lamejs": "^1.2.7",
|
||||||
"@chatwoot/ninja-keys": "1.2.3",
|
"@chatwoot/ninja-keys": "1.2.3",
|
||||||
"@chatwoot/prosemirror-schema": "1.1.1-next",
|
"@chatwoot/prosemirror-schema": "1.1.1-next",
|
||||||
"@chatwoot/utils": "^0.0.43",
|
"@chatwoot/utils": "^0.0.45",
|
||||||
"@formkit/core": "^1.6.7",
|
"@formkit/core": "^1.6.7",
|
||||||
"@formkit/vue": "^1.6.7",
|
"@formkit/vue": "^1.6.7",
|
||||||
"@hcaptcha/vue3-hcaptcha": "^1.3.0",
|
"@hcaptcha/vue3-hcaptcha": "^1.3.0",
|
||||||
|
|||||||
10
pnpm-lock.yaml
generated
10
pnpm-lock.yaml
generated
@@ -23,8 +23,8 @@ importers:
|
|||||||
specifier: 1.1.1-next
|
specifier: 1.1.1-next
|
||||||
version: 1.1.1-next
|
version: 1.1.1-next
|
||||||
'@chatwoot/utils':
|
'@chatwoot/utils':
|
||||||
specifier: ^0.0.43
|
specifier: ^0.0.45
|
||||||
version: 0.0.43
|
version: 0.0.45
|
||||||
'@formkit/core':
|
'@formkit/core':
|
||||||
specifier: ^1.6.7
|
specifier: ^1.6.7
|
||||||
version: 1.6.7
|
version: 1.6.7
|
||||||
@@ -406,8 +406,8 @@ packages:
|
|||||||
'@chatwoot/prosemirror-schema@1.1.1-next':
|
'@chatwoot/prosemirror-schema@1.1.1-next':
|
||||||
resolution: {integrity: sha512-/M2qZ+ZF7GlQNt1riwVP499fvp3hxSqd5iy8hxyF9pkj9qQ+OKYn5JK+v3qwwqQY3IxhmNOn1Lp6tm7vstrd9Q==}
|
resolution: {integrity: sha512-/M2qZ+ZF7GlQNt1riwVP499fvp3hxSqd5iy8hxyF9pkj9qQ+OKYn5JK+v3qwwqQY3IxhmNOn1Lp6tm7vstrd9Q==}
|
||||||
|
|
||||||
'@chatwoot/utils@0.0.43':
|
'@chatwoot/utils@0.0.45':
|
||||||
resolution: {integrity: sha512-kMIXAGebCak9qOi68QnGer+rQLLo/z2N9cR+7tvGdZCW0ThDiVCF7JbHYHVDlYsdDFIx0FLlyIdCfEbooVT2Dw==}
|
resolution: {integrity: sha512-zqmuri6MrEFAY1tLv7Z3HBy4Ig60LhSrLkEiHegVsOVSxPv4Bedq+xmAW7LphvcLNgbkkvu17MU91gvMVlpEHw==}
|
||||||
engines: {node: '>=10'}
|
engines: {node: '>=10'}
|
||||||
|
|
||||||
'@codemirror/commands@6.7.0':
|
'@codemirror/commands@6.7.0':
|
||||||
@@ -5255,7 +5255,7 @@ snapshots:
|
|||||||
prosemirror-utils: 1.2.2(prosemirror-model@1.22.3)(prosemirror-state@1.4.3)
|
prosemirror-utils: 1.2.2(prosemirror-model@1.22.3)(prosemirror-state@1.4.3)
|
||||||
prosemirror-view: 1.34.1
|
prosemirror-view: 1.34.1
|
||||||
|
|
||||||
'@chatwoot/utils@0.0.43':
|
'@chatwoot/utils@0.0.45':
|
||||||
dependencies:
|
dependencies:
|
||||||
date-fns: 2.30.0
|
date-fns: 2.30.0
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user