fix: lỗi hiển thị ở frontend

This commit is contained in:
2026-06-21 21:53:14 +07:00
parent 403c169ddd
commit b1a539235b
40 changed files with 5094 additions and 668 deletions
+31 -8
View File
@@ -1,24 +1,47 @@
const loadScript = (src: string): Promise<void> => {
const loadScript = (src: string, fallbackSrc?: string): Promise<void> => {
return new Promise((resolve, reject) => {
if (document.querySelector(`script[src="${src}"]`)) {
if (
document.querySelector(`script[src="${src}"]`) ||
(fallbackSrc && document.querySelector(`script[src="${fallbackSrc}"]`))
) {
resolve();
return;
}
const script = document.createElement('script');
script.src = src;
script.onload = () => resolve();
script.onerror = () => reject(new Error(`Failed to load script ${src}`));
script.onerror = () => {
if (fallbackSrc) {
console.warn(`Failed to load script ${src}. Trying fallback: ${fallbackSrc}`);
const fallbackScript = document.createElement('script');
fallbackScript.src = fallbackSrc;
fallbackScript.onload = () => resolve();
fallbackScript.onerror = () => reject(new Error(`Failed to load script ${fallbackSrc}`));
document.head.appendChild(fallbackScript);
} else {
reject(new Error(`Failed to load script ${src}`));
}
};
document.head.appendChild(script);
});
};
const loadModerationLibraries = async () => {
// Load TensorFlow first
await loadScript('https://cdn.jsdelivr.net/npm/@tensorflow/tfjs');
// Load models after tfjs is available
// Load TensorFlow first with fallback
await loadScript(
'https://cdn.jsdelivr.net/npm/@tensorflow/tfjs',
'https://unpkg.com/@tensorflow/tfjs'
);
// Load models after tfjs is available, with fallbacks
await Promise.all([
loadScript('https://cdn.jsdelivr.net/npm/@tensorflow-models/blazeface'),
loadScript('https://cdn.jsdelivr.net/npm/nsfwjs@2.4.0/dist/bundle.js')
loadScript(
'https://cdn.jsdelivr.net/npm/@tensorflow-models/blazeface',
'https://unpkg.com/@tensorflow-models/blazeface'
),
loadScript(
'https://cdn.jsdelivr.net/npm/nsfwjs@2.4.0/dist/bundle.js',
'https://unpkg.com/nsfwjs@2.4.0/dist/bundle.js'
)
]);
};
+22 -1
View File
@@ -113,7 +113,28 @@ const translations: Record<string, Record<Language, string>> = {
viewMap: { vi: 'Bản đồ', en: 'Map', zh: '地图' },
viewTimeline: { vi: 'Lịch trình', en: 'Itinerary', zh: '行程表' },
sharedJourneyTitle: { vi: 'Hành trình chia sẻ khẩn cấp', en: 'Emergency Shared Journey', zh: '紧急分享行程' },
linkExpired: { vi: 'Liên kết không tồn tại hoặc đã bị vô hiệu hóa.', en: 'Link does not exist or has been disabled.', zh: '链接不存在或已被禁用。' }
linkExpired: { vi: 'Liên kết không tồn tại hoặc đã bị vô hiệu hóa.', en: 'Link does not exist or has been disabled.', zh: '链接不存在或已被禁用。' },
// Landing Page Buttons Short
shortExplore: { vi: 'Khám phá', en: 'Explore', zh: '探索' },
shortCamera: { vi: 'Chụp ảnh', en: 'Camera', zh: '拍照' },
reportBusinessBtn: { vi: 'Báo cáo sai phạm', en: 'Report Violation', zh: '举报' },
blacklistTitle: { vi: 'Widget Blacklist', en: 'Blacklist Widget', zh: '黑名单' },
reportModalTitle: { vi: 'Báo cáo cơ sở không đàng hoàng', en: 'Report Dishonest Business', zh: '举报不良商家' },
businessName: { vi: 'Tên cơ sở/người dùng', en: 'Name', zh: '名称' },
businessPhone: { vi: 'Số điện thoại', en: 'Phone Number', zh: '电话号码' },
businessEmail: { vi: 'Email liên hệ', en: 'Email Address', zh: '电子邮箱' },
businessAddress: { vi: 'Địa chỉ', en: 'Address', zh: '地址' },
businessType: { vi: 'Loại hình', en: 'Type', zh: '类型' },
typeUser: { vi: 'Người dùng', en: 'User', zh: '用户' },
typeRestaurant: { vi: 'Nhà hàng', en: 'Restaurant', zh: '餐厅' },
typeHotel: { vi: 'Khách sạn', en: 'Hotel', zh: '酒店' },
typeHomestay: { vi: 'Homestay', en: 'Homestay', zh: '民俗' },
reportReason: { vi: 'Lý do báo cáo', en: 'Reason for report', zh: '举报原因' },
submitReport: { vi: 'Gửi báo cáo', en: 'Submit Report', zh: '提交举报' },
reportSuccess: { vi: 'Gửi báo cáo thành công. Ban quản trị sẽ kiểm duyệt thông tin.', en: 'Report submitted successfully. The admin will review it.', zh: '提交成功。管理员将审核' },
emptyBlacklist: { vi: 'Chưa có cơ sở nào trong danh sách đen.', en: 'No businesses in blacklist yet.', zh: '黑名单中暂无商家。' },
tabReports: { vi: 'Blacklist', en: 'Blacklist', zh: '黑名单' }
};
export const useTranslation = () => {