export html
This commit is contained in:
+1
-1
@@ -73,7 +73,7 @@
|
|||||||
},
|
},
|
||||||
"setting": {
|
"setting": {
|
||||||
"title": "تنظیمات",
|
"title": "تنظیمات",
|
||||||
"personality": "شخصی سازی",
|
"personality": "قالب",
|
||||||
"mail_server": "تنظیمات میل سرور",
|
"mail_server": "تنظیمات میل سرور",
|
||||||
"domain": "تنظیمات دامنه",
|
"domain": "تنظیمات دامنه",
|
||||||
"address": "نشانی ها",
|
"address": "نشانی ها",
|
||||||
|
|||||||
@@ -10,79 +10,9 @@ import {
|
|||||||
SectionType,
|
SectionType,
|
||||||
} from "../types/Types";
|
} from "../types/Types";
|
||||||
|
|
||||||
// تابع برای تبدیل تصویر به base64
|
|
||||||
const imageToBase64 = async (imageUrl: string): Promise<string> => {
|
|
||||||
try {
|
|
||||||
const response = await fetch(imageUrl);
|
|
||||||
const blob = await response.blob();
|
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
const reader = new FileReader();
|
|
||||||
reader.onload = () => resolve(reader.result as string);
|
|
||||||
reader.onerror = reject;
|
|
||||||
reader.readAsDataURL(blob);
|
|
||||||
});
|
|
||||||
} catch (error) {
|
|
||||||
console.error("Error converting image to base64:", error);
|
|
||||||
return imageUrl; // در صورت خطا، URL اصلی را برگردان
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// تابع برای تبدیل همه تصاویر در دادهها به base64
|
|
||||||
const convertImagesToBase64 = async (
|
|
||||||
data: PersonalityDataType
|
|
||||||
): Promise<PersonalityDataType> => {
|
|
||||||
const convertSectionImages = async (
|
|
||||||
section: SectionType
|
|
||||||
): Promise<SectionType> => {
|
|
||||||
const items = await Promise.all(
|
|
||||||
section.items.map(async (item) => {
|
|
||||||
// تبدیل تصاویر در images array
|
|
||||||
const images = await Promise.all(
|
|
||||||
item.images.map(async (image) => ({
|
|
||||||
...image,
|
|
||||||
src: await imageToBase64(image.src),
|
|
||||||
}))
|
|
||||||
);
|
|
||||||
|
|
||||||
// تبدیل background image
|
|
||||||
let backgroundImage = item.backgroundImage;
|
|
||||||
if (backgroundImage) {
|
|
||||||
backgroundImage = await imageToBase64(backgroundImage);
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
...item,
|
|
||||||
images,
|
|
||||||
backgroundImage,
|
|
||||||
};
|
|
||||||
})
|
|
||||||
);
|
|
||||||
|
|
||||||
return {
|
|
||||||
...section,
|
|
||||||
items,
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
const [header, content, footer] = await Promise.all([
|
|
||||||
convertSectionImages(data.header),
|
|
||||||
convertSectionImages(data.content),
|
|
||||||
convertSectionImages(data.footer),
|
|
||||||
]);
|
|
||||||
|
|
||||||
return {
|
|
||||||
header,
|
|
||||||
content,
|
|
||||||
footer,
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
export const exportPersonalityToHTML = async (
|
export const exportPersonalityToHTML = async (
|
||||||
data: PersonalityDataType
|
data: PersonalityDataType
|
||||||
): Promise<string> => {
|
): Promise<string> => {
|
||||||
// تبدیل تصاویر به base64
|
|
||||||
const dataWithBase64Images = await convertImagesToBase64(data);
|
|
||||||
|
|
||||||
// Helper functions
|
// Helper functions
|
||||||
const getHorizontalAlign = (alignment?: HorizontalAlignment) => {
|
const getHorizontalAlign = (alignment?: HorizontalAlignment) => {
|
||||||
switch (alignment) {
|
switch (alignment) {
|
||||||
@@ -338,7 +268,8 @@ export const exportPersonalityToHTML = async (
|
|||||||
const renderSection = (
|
const renderSection = (
|
||||||
section: SectionType,
|
section: SectionType,
|
||||||
sectionHeight: string,
|
sectionHeight: string,
|
||||||
paddingTop = ""
|
paddingTop = "",
|
||||||
|
isContentSection = false
|
||||||
) => {
|
) => {
|
||||||
if (section.columnsCount > 0) {
|
if (section.columnsCount > 0) {
|
||||||
return `<tr>
|
return `<tr>
|
||||||
@@ -418,6 +349,11 @@ export const exportPersonalityToHTML = async (
|
|||||||
}" style="padding: 8px; font-size: 14px; line-height: 1.4;">
|
}" style="padding: 8px; font-size: 14px; line-height: 1.4;">
|
||||||
${renderTexts(item?.texts || [])}
|
${renderTexts(item?.texts || [])}
|
||||||
${renderImages(item?.images || [])}
|
${renderImages(item?.images || [])}
|
||||||
|
${
|
||||||
|
isContentSection
|
||||||
|
? '<div style="margin: 16px 0; text-align: center;">{{content}}</div>'
|
||||||
|
: ""
|
||||||
|
}
|
||||||
</td>
|
</td>
|
||||||
</tr>`;
|
</tr>`;
|
||||||
|
|
||||||
@@ -490,9 +426,9 @@ export const exportPersonalityToHTML = async (
|
|||||||
const html = `<div style="max-width: 600px; margin: 0 auto; direction: rtl;">
|
const html = `<div style="max-width: 600px; margin: 0 auto; direction: rtl;">
|
||||||
<table width="100%" cellpadding="0" cellspacing="0" border="0" style="border-collapse: collapse;">
|
<table width="100%" cellpadding="0" cellspacing="0" border="0" style="border-collapse: collapse;">
|
||||||
<tbody>
|
<tbody>
|
||||||
${renderSection(dataWithBase64Images.header, "123px")}
|
${renderSection(data.header, "123px")}
|
||||||
${renderSection(dataWithBase64Images.content, "246px", "16px")}
|
${renderSection(data.content, "246px", "16px", true)}
|
||||||
${renderSection(dataWithBase64Images.footer, "123px", "16px")}
|
${renderSection(data.footer, "123px", "16px")}
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>`;
|
</div>`;
|
||||||
|
|||||||
Reference in New Issue
Block a user