|
|
|
|
@ -15,7 +15,7 @@ const useShortUrlChange = () => {
|
|
|
|
|
const fetchNowConversationsitems = async (base64Url, apiUrl) => {
|
|
|
|
|
try {
|
|
|
|
|
const formData = new FormData();
|
|
|
|
|
formData.append('url', base64Url);
|
|
|
|
|
formData.append(' url', base64Url);
|
|
|
|
|
formData.append('type', 'info');
|
|
|
|
|
const response = await fetch(`${apiUrl}/apps/short_link/index/create`, {
|
|
|
|
|
method: 'POST',
|
|
|
|
|
@ -52,9 +52,35 @@ const useShortUrlChange = () => {
|
|
|
|
|
return { base64Url: '', extracted2: '' };
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
const normalizeUrl = (longUrl) => {
|
|
|
|
|
const trimmed = longUrl.trim();
|
|
|
|
|
// 排除纯数字、纯字母、纯文字(中文、日文等)以及它们的组合
|
|
|
|
|
if (/^[\p{L}\p{N}]+$/u.test(trimmed)) {
|
|
|
|
|
return '';
|
|
|
|
|
}
|
|
|
|
|
if (!trimmed) return '';
|
|
|
|
|
|
|
|
|
|
// 1. 已是 http/https 开头,直接验证合法性
|
|
|
|
|
if (/^https?:\/\//i.test(trimmed)) {
|
|
|
|
|
try {
|
|
|
|
|
const urlObj = new URL(trimmed);
|
|
|
|
|
return urlObj.href;
|
|
|
|
|
} catch (e) {
|
|
|
|
|
return '';
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// 2. www 开头/纯域名/IP+端口,补 https:// 后验证
|
|
|
|
|
const fullUrl = `https://${trimmed}`;
|
|
|
|
|
try {
|
|
|
|
|
const urlObj = new URL(fullUrl);
|
|
|
|
|
return urlObj.href;
|
|
|
|
|
} catch (e) {
|
|
|
|
|
return '';
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
const convertUrl = useCallback(async (longUrl) => {
|
|
|
|
|
if (!longUrl.trim()) {
|
|
|
|
|
const normalizedUrl = normalizeUrl(longUrl);
|
|
|
|
|
if (!normalizedUrl) {
|
|
|
|
|
setGlobalNotify([{
|
|
|
|
|
key: Date.now().toString(),
|
|
|
|
|
title: '错误',
|
|
|
|
|
@ -64,7 +90,7 @@ const useShortUrlChange = () => {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const { base64Url, extracted2 } = urlBase64(longUrl);
|
|
|
|
|
const { base64Url, extracted2 } = urlBase64(normalizedUrl);
|
|
|
|
|
|
|
|
|
|
if (base64Url) {
|
|
|
|
|
const apiUrl = apiPrefix[extracted2] || apiPrefix["chinahighlights.com"];
|