import { t } from '../../../i18n'; import { Modal, notification } from 'antd'; import { customAlphabet } from 'nanoid'; import { websiteApi } from 'services/website'; export const generalMockData = (n) => { const data = []; const childs = []; for (let i = 0; i < n; i++) { data.push({ id: generateId(), parentId: null, name: `level${i}`, isHidden: false, linkType: 'PAGE', linkedPageId: 'tesst', target: 'SELF', isHomePage: i === 0, }); for (let child = 0; child < 2; child++) { childs.push({ id: generateId(), parentId: data[i].id, name: `level${i}${child}`, isHidden: false, linkType: 'LINK', linkedPageId: 'tesst', target: 'SELF', }); } } return data.concat(childs); }; const DEFAULT_ALPHABET = '1234567890abcdefghijklmnopqrstuvwxyzABCDYFGHIGKLMNOPQRSTUVWXYZ_'; export const SLUG_ALPHABET = '1234567890abcdefghijklmnopqrstuvwxyz'; export const generateId = (alphabet = DEFAULT_ALPHABET) => { const nanoid = customAlphabet(alphabet, 8); return nanoid(); }; export const handleDisconnectDomain = ( websiteId: number, cbSuccess?: () => void, ) => { Modal.confirm({ title: t('Bạn có chắc chắn muốn hủy kết nối tên miền?'), content: t( 'Website sẽ không thể truy cập sau khi bạn hủy kết nối tên miền', ), okText: t('Huỷ kết nối'), cancelText: t('Đóng'), centered: true, onOk: async () => { await websiteApi.updateWebsite({ id: websiteId, domainId: null }); cbSuccess?.(); notification.success({ message: t('Huỷ kết nối tên miền thành công'), }); }, }); }; const vnRegexes = [ /à|á|ạ|ả|ã|â|ầ|ấ|ậ|ẩ|ẫ|ă|ằ|ắ|ặ|ẳ|ẵ|À|Á|Ạ|Ả|Ã|Â|Ầ|Ấ|Ậ|Ẩ|Ẫ|Ă|Ằ|Ắ|Ặ|Ẳ|Ẵ/g, /è|é|ẹ|ẻ|ẽ|ê|ề|ế|ệ|ể|ễ|È|É|Ẹ|Ẻ|Ẽ|Ê|Ề|Ế|Ệ|Ể|Ễ/g, /ì|í|ị|ỉ|ĩ|Ì|Í|Ị|Ỉ|Ĩ/g, /ò|ó|ọ|ỏ|õ|ô|ồ|ố|ộ|ổ|ỗ|ơ|ờ|ớ|ợ|ở|ỡ|Ò|Ó|Ọ|Ỏ|Õ|Ô|Ồ|Ố|Ộ|Ổ|Ỗ|Ơ|Ờ|Ớ|Ợ|Ở|Ỡ/g, /ù|ú|ụ|ủ|ũ|ư|ừ|ứ|ự|ử|ữ|Ù|Ú|Ụ|Ủ|Ũ|Ư|Ừ|Ứ|Ự|Ử|Ữ/g, /ỳ|ý|ỵ|ỷ|ỹ|Ỳ|Ý|Ỵ|Ỷ|Ỹ/g, /đ|Đ/g, // Some system encode vietnamese combining accent as individual utf-8 characters // Một vài bộ encode coi các dấu mũ, dấu chữ như một kí tự riêng biệt nên thêm hai dòng này /\u0300|\u0301|\u0303|\u0309|\u0323/g, // ̀ ́ ̃ ̉ ̣ huyền, sắc, ngã, hỏi, nặng /\u02C6|\u0306|\u031B/g, // ˆ ̆ ̛ Â, Ê, Ă, Ơ, Ư /!|@|%|\^|\*|\(|\)|\+|=|<|>|\?|\/|,|\.|:|;|'|"|&|#|\[|\]|~|\$|_|`|-|{|}|\||\\/g, ]; const replacement = ['a', 'e', 'i', 'o', 'u', 'y', 'd', '', '', ' ']; export const generateSlug = (str) => { vnRegexes.forEach((value, index) => { str = str.replace(value, replacement[index]); }); str = str.toLowerCase().trim(); return str.replace(/\s+/g, '-'); }; // sort object by attribute // Ex: {b: 1, a: [1,2], c: {c2: 3, c1: 4}} // => {a: [1,2], b:1, c: {c1: 4, c2: 3}} export const standardizedObject = (object) => { if (!object || object?.constructor != {}.constructor) return object; const newEntries = Object.entries(object) .map((entry) => [entry[0], standardizedObject(entry[1])]) .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0)); return Object.fromEntries(newEntries); }; export const isEqualContentPage = ( obj1: any, obj2: any, checkDataOrder = false, ): boolean => { if (obj1 === null || obj2 === null) { return obj1 === obj2; } let _obj1 = obj1; let _obj2 = obj2; if (!checkDataOrder) { if (obj1 instanceof Array) { _obj1 = [...obj1].sort(); } if (obj2 instanceof Array) { _obj2 = [...obj2].sort(); } } if (typeof _obj1 !== 'object' || typeof _obj2 !== 'object') { return _obj1 === _obj2; } const obj1Props = Object.getOwnPropertyNames(_obj1); const obj2Props = Object.getOwnPropertyNames(_obj2); const lstPropsCompare = obj1Props.length > obj2Props.length ? obj1Props : obj2Props; for (const prop of lstPropsCompare) { const val1 = _obj1[prop]; const val2 = _obj2[prop]; if (typeof val1 === 'object' && typeof val2 === 'object') { if (isEqualContentPage(val1, val2, checkDataOrder)) { continue; } else { return false; } } if (val1 !== val2) { return false; } } return true; };