@pushwoosh/smart-components-kit 1.19.0 → 1.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/MediaStorage/MediaStorage.js +7 -2
- package/MediaStorage/mediaFile.utils.d.ts +10 -0
- package/MediaStorage/mediaFile.utils.js +16 -0
- package/MediaStorage/polyglot/messages_ar.js +1 -0
- package/MediaStorage/polyglot/messages_bn.js +1 -0
- package/MediaStorage/polyglot/messages_de.js +1 -0
- package/MediaStorage/polyglot/messages_en.js +1 -0
- package/MediaStorage/polyglot/messages_es.js +1 -0
- package/MediaStorage/polyglot/messages_fr.js +1 -0
- package/MediaStorage/polyglot/messages_he.js +1 -0
- package/MediaStorage/polyglot/messages_hi.js +1 -0
- package/MediaStorage/polyglot/messages_ja.js +1 -0
- package/MediaStorage/polyglot/messages_ko.js +1 -0
- package/MediaStorage/polyglot/messages_pt.js +1 -0
- package/MediaStorage/polyglot/messages_ru.js +1 -0
- package/MediaStorage/polyglot/messages_th.js +1 -0
- package/MediaStorage/polyglot/messages_zh.js +1 -0
- package/MediaStorage/polyglot/types.d.ts +4 -0
- package/package.json +1 -1
|
@@ -11,7 +11,7 @@ import { CanvaImportDrawer } from './CanvaImportDrawer';
|
|
|
11
11
|
import { CreateCropDrawer } from './CreateCropDrawer';
|
|
12
12
|
import { GenerateImageTab } from './GenerateImageTab';
|
|
13
13
|
import { useCanvaEdit, useDeleteMediaFile, useDeleteMediaFiles } from './hooks';
|
|
14
|
-
import { formatBytes, getCropCaption, getSourceLabel, getThumbUrl, hasVersions } from './mediaFile.utils';
|
|
14
|
+
import { compressionSavings, formatBytes, getCropCaption, getSourceLabel, getThumbUrl, hasVersions } from './mediaFile.utils';
|
|
15
15
|
import { Lang, useLang } from './polyglot';
|
|
16
16
|
import { StockPhotosTab } from './StockPhotosTab';
|
|
17
17
|
import { CanvaActions, CountBadge, Dropzone, DropzoneRow, EmptyState, Grid, HiddenInput, MenuItemPreview, MenuItemThumb, SelectionBar, SearchField, SearchRow, SelectionCount, SourceBadge, TabBody, Tile, TileActions, TileBadges, TileCheckbox, TileImage, TooltipAnchor, UsageLine, VersionsBadge, WarningBadge } from './styles';
|
|
@@ -220,8 +220,13 @@ export const MediaStorage = ({
|
|
|
220
220
|
}));
|
|
221
221
|
const failed = results.filter(result => result.status === 'rejected').length;
|
|
222
222
|
if (failed < images.length) {
|
|
223
|
+
const savings = compressionSavings(results.flatMap(result => result.status === 'fulfilled' ? [result.value] : []));
|
|
223
224
|
openToast({
|
|
224
|
-
title: lang({
|
|
225
|
+
title: savings ? lang({
|
|
226
|
+
message: 'SMART.MEDIA_STORAGE.UPLOAD_SUCCESS_COMPRESSED',
|
|
227
|
+
percent: savings.percent,
|
|
228
|
+
size: formatBytes(savings.savedBytes)
|
|
229
|
+
}) : lang({
|
|
225
230
|
message: 'SMART.MEDIA_STORAGE.UPLOAD_SUCCESS'
|
|
226
231
|
}),
|
|
227
232
|
type: 'success'
|
|
@@ -11,3 +11,13 @@ export declare const getAspectRatio: (file: MediaFile) => number;
|
|
|
11
11
|
export declare const hasVersions: (file: MediaFile) => boolean;
|
|
12
12
|
/** Human-readable byte size, e.g. 4404019 -> "4.2 MB". */
|
|
13
13
|
export declare const formatBytes: (bytes: number) => string;
|
|
14
|
+
/** The part of the `/api/media/upload` answer the upload toast reads. */
|
|
15
|
+
export type UploadedFile = {
|
|
16
|
+
file_size: number;
|
|
17
|
+
original_file_size?: number;
|
|
18
|
+
};
|
|
19
|
+
/** Savings of PNG compression over a batch: compressed files only; null when nothing worth a whole percent was saved. */
|
|
20
|
+
export declare const compressionSavings: (files: UploadedFile[]) => {
|
|
21
|
+
percent: number;
|
|
22
|
+
savedBytes: number;
|
|
23
|
+
} | null;
|
|
@@ -33,4 +33,20 @@ export const formatBytes = bytes => {
|
|
|
33
33
|
// Whole numbers for bytes and for values >= 100; one decimal otherwise.
|
|
34
34
|
const rounded = exp === 0 || value >= 100 ? Math.round(value) : Math.round(value * 10) / 10;
|
|
35
35
|
return `${rounded} ${BYTE_UNITS[exp]}`;
|
|
36
|
+
};
|
|
37
|
+
/** Savings of PNG compression over a batch: compressed files only; null when nothing worth a whole percent was saved. */
|
|
38
|
+
export const compressionSavings = files => {
|
|
39
|
+
let before = 0;
|
|
40
|
+
let after = 0;
|
|
41
|
+
for (const file of files) {
|
|
42
|
+
if (file.original_file_size && file.original_file_size > file.file_size) {
|
|
43
|
+
before += file.original_file_size;
|
|
44
|
+
after += file.file_size;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
const percent = before === 0 ? 0 : Math.round((1 - after / before) * 100);
|
|
48
|
+
return percent > 0 ? {
|
|
49
|
+
percent,
|
|
50
|
+
savedBytes: before - after
|
|
51
|
+
} : null;
|
|
36
52
|
};
|
|
@@ -10,6 +10,7 @@ export const messages = {
|
|
|
10
10
|
'SMART.MEDIA_STORAGE.UPLOAD_ERROR': 'تعذّر رفع الصورة',
|
|
11
11
|
'SMART.MEDIA_STORAGE.UNSUPPORTED_FORMAT': 'تنسيق غير مدعوم. استخدم JPEG أو PNG أو GIF أو WebP',
|
|
12
12
|
'SMART.MEDIA_STORAGE.UPLOAD_SUCCESS': 'تم رفع الصورة',
|
|
13
|
+
'SMART.MEDIA_STORAGE.UPLOAD_SUCCESS_COMPRESSED': 'تم رفع الصورة. تم ضغط PNG: توفير {{percent}}% ({{size}})',
|
|
13
14
|
'SMART.MEDIA_STORAGE.USAGE': 'الملفات: {{count}} · {{size}}',
|
|
14
15
|
'SMART.MEDIA_STORAGE.CROPS_BADGE': 'اقتصاصات: {{count}}',
|
|
15
16
|
'SMART.MEDIA_STORAGE.VERSIONS_BADGE': 'إصدارات: {{count}}',
|
|
@@ -10,6 +10,7 @@ export const messages = {
|
|
|
10
10
|
'SMART.MEDIA_STORAGE.UPLOAD_ERROR': 'ছবি আপলোড করা যায়নি',
|
|
11
11
|
'SMART.MEDIA_STORAGE.UNSUPPORTED_FORMAT': 'অসমর্থিত ফরম্যাট। JPEG, PNG, GIF বা WebP ব্যবহার করুন',
|
|
12
12
|
'SMART.MEDIA_STORAGE.UPLOAD_SUCCESS': 'ছবি আপলোড হয়েছে',
|
|
13
|
+
'SMART.MEDIA_STORAGE.UPLOAD_SUCCESS_COMPRESSED': 'ছবি আপলোড হয়েছে। PNG সংকুচিত: {{percent}}% সাশ্রয় ({{size}})',
|
|
13
14
|
'SMART.MEDIA_STORAGE.USAGE': '{{count}}টি ফাইল · {{size}}',
|
|
14
15
|
'SMART.MEDIA_STORAGE.CROPS_BADGE': '{{count}}টি ক্রপ',
|
|
15
16
|
'SMART.MEDIA_STORAGE.VERSIONS_BADGE': '{{count}}টি সংস্করণ',
|
|
@@ -10,6 +10,7 @@ export const messages = {
|
|
|
10
10
|
'SMART.MEDIA_STORAGE.UPLOAD_ERROR': 'Bild konnte nicht hochgeladen werden',
|
|
11
11
|
'SMART.MEDIA_STORAGE.UNSUPPORTED_FORMAT': 'Nicht unterstütztes Format. Verwenden Sie JPEG, PNG, GIF oder WebP',
|
|
12
12
|
'SMART.MEDIA_STORAGE.UPLOAD_SUCCESS': 'Bild hochgeladen',
|
|
13
|
+
'SMART.MEDIA_STORAGE.UPLOAD_SUCCESS_COMPRESSED': 'Bild hochgeladen. PNG komprimiert: {{percent}} % gespart ({{size}})',
|
|
13
14
|
'SMART.MEDIA_STORAGE.USAGE': '{{count}} Dateien · {{size}}',
|
|
14
15
|
'SMART.MEDIA_STORAGE.CROPS_BADGE': '{{count}} Zuschn.',
|
|
15
16
|
'SMART.MEDIA_STORAGE.VERSIONS_BADGE': '{{count}} Vers.',
|
|
@@ -10,6 +10,7 @@ export const messages = {
|
|
|
10
10
|
'SMART.MEDIA_STORAGE.UPLOAD_ERROR': 'Failed to upload image',
|
|
11
11
|
'SMART.MEDIA_STORAGE.UNSUPPORTED_FORMAT': 'Unsupported format. Use JPEG, PNG, GIF or WebP',
|
|
12
12
|
'SMART.MEDIA_STORAGE.UPLOAD_SUCCESS': 'Image uploaded',
|
|
13
|
+
'SMART.MEDIA_STORAGE.UPLOAD_SUCCESS_COMPRESSED': 'Image uploaded. PNG compressed: saved {{percent}}% ({{size}})',
|
|
13
14
|
'SMART.MEDIA_STORAGE.USAGE': '{{count}} files · {{size}}',
|
|
14
15
|
'SMART.MEDIA_STORAGE.CROPS_BADGE': '{{count}} cr.',
|
|
15
16
|
'SMART.MEDIA_STORAGE.VERSIONS_BADGE': '{{count}} ver.',
|
|
@@ -10,6 +10,7 @@ export const messages = {
|
|
|
10
10
|
'SMART.MEDIA_STORAGE.UPLOAD_ERROR': 'No se pudo subir la imagen',
|
|
11
11
|
'SMART.MEDIA_STORAGE.UNSUPPORTED_FORMAT': 'Formato no compatible. Usa JPEG, PNG, GIF o WebP',
|
|
12
12
|
'SMART.MEDIA_STORAGE.UPLOAD_SUCCESS': 'Imagen subida',
|
|
13
|
+
'SMART.MEDIA_STORAGE.UPLOAD_SUCCESS_COMPRESSED': 'Imagen subida. PNG comprimido: ahorro del {{percent}} % ({{size}})',
|
|
13
14
|
'SMART.MEDIA_STORAGE.USAGE': '{{count}} archivos · {{size}}',
|
|
14
15
|
'SMART.MEDIA_STORAGE.CROPS_BADGE': '{{count}} rec.',
|
|
15
16
|
'SMART.MEDIA_STORAGE.VERSIONS_BADGE': '{{count}} vers.',
|
|
@@ -10,6 +10,7 @@ export const messages = {
|
|
|
10
10
|
'SMART.MEDIA_STORAGE.UPLOAD_ERROR': 'Échec de l’importation de l’image',
|
|
11
11
|
'SMART.MEDIA_STORAGE.UNSUPPORTED_FORMAT': 'Format non pris en charge. Utilisez JPEG, PNG, GIF ou WebP',
|
|
12
12
|
'SMART.MEDIA_STORAGE.UPLOAD_SUCCESS': 'Image importée',
|
|
13
|
+
'SMART.MEDIA_STORAGE.UPLOAD_SUCCESS_COMPRESSED': 'Image importée. PNG compressé : {{percent}} % économisés ({{size}})',
|
|
13
14
|
'SMART.MEDIA_STORAGE.USAGE': '{{count}} fichiers · {{size}}',
|
|
14
15
|
'SMART.MEDIA_STORAGE.CROPS_BADGE': '{{count}} recadr.',
|
|
15
16
|
'SMART.MEDIA_STORAGE.VERSIONS_BADGE': '{{count}} vers.',
|
|
@@ -10,6 +10,7 @@ export const messages = {
|
|
|
10
10
|
'SMART.MEDIA_STORAGE.UPLOAD_ERROR': 'העלאת התמונה נכשלה',
|
|
11
11
|
'SMART.MEDIA_STORAGE.UNSUPPORTED_FORMAT': 'פורמט לא נתמך. השתמשו ב-JPEG, PNG, GIF או WebP',
|
|
12
12
|
'SMART.MEDIA_STORAGE.UPLOAD_SUCCESS': 'התמונה הועלתה',
|
|
13
|
+
'SMART.MEDIA_STORAGE.UPLOAD_SUCCESS_COMPRESSED': 'התמונה הועלתה. PNG נדחס: חיסכון של {{percent}}% ({{size}})',
|
|
13
14
|
'SMART.MEDIA_STORAGE.USAGE': '{{count}} קבצים · {{size}}',
|
|
14
15
|
'SMART.MEDIA_STORAGE.CROPS_BADGE': '{{count}} חית.',
|
|
15
16
|
'SMART.MEDIA_STORAGE.VERSIONS_BADGE': '{{count}} גרס.',
|
|
@@ -10,6 +10,7 @@ export const messages = {
|
|
|
10
10
|
'SMART.MEDIA_STORAGE.UPLOAD_ERROR': 'छवि अपलोड नहीं हो सकी',
|
|
11
11
|
'SMART.MEDIA_STORAGE.UNSUPPORTED_FORMAT': 'असमर्थित फ़ॉर्मेट। JPEG, PNG, GIF या WebP का उपयोग करें',
|
|
12
12
|
'SMART.MEDIA_STORAGE.UPLOAD_SUCCESS': 'छवि अपलोड हो गई',
|
|
13
|
+
'SMART.MEDIA_STORAGE.UPLOAD_SUCCESS_COMPRESSED': 'छवि अपलोड हो गई। PNG संपीड़ित: {{percent}}% की बचत ({{size}})',
|
|
13
14
|
'SMART.MEDIA_STORAGE.USAGE': '{{count}} फ़ाइलें · {{size}}',
|
|
14
15
|
'SMART.MEDIA_STORAGE.CROPS_BADGE': '{{count}} क्रॉप',
|
|
15
16
|
'SMART.MEDIA_STORAGE.VERSIONS_BADGE': '{{count}} संस्करण',
|
|
@@ -10,6 +10,7 @@ export const messages = {
|
|
|
10
10
|
'SMART.MEDIA_STORAGE.UPLOAD_ERROR': '画像のアップロードに失敗しました',
|
|
11
11
|
'SMART.MEDIA_STORAGE.UNSUPPORTED_FORMAT': 'サポートされていない形式です。JPEG、PNG、GIF、WebPを使用してください',
|
|
12
12
|
'SMART.MEDIA_STORAGE.UPLOAD_SUCCESS': '画像をアップロードしました',
|
|
13
|
+
'SMART.MEDIA_STORAGE.UPLOAD_SUCCESS_COMPRESSED': '画像をアップロードしました。PNG を圧縮: {{percent}}% 削減({{size}})',
|
|
13
14
|
'SMART.MEDIA_STORAGE.USAGE': '{{count}}ファイル · {{size}}',
|
|
14
15
|
'SMART.MEDIA_STORAGE.CROPS_BADGE': 'トリミング{{count}}',
|
|
15
16
|
'SMART.MEDIA_STORAGE.VERSIONS_BADGE': 'バージョン{{count}}',
|
|
@@ -10,6 +10,7 @@ export const messages = {
|
|
|
10
10
|
'SMART.MEDIA_STORAGE.UPLOAD_ERROR': '이미지를 업로드하지 못했습니다',
|
|
11
11
|
'SMART.MEDIA_STORAGE.UNSUPPORTED_FORMAT': '지원되지 않는 형식입니다. JPEG, PNG, GIF 또는 WebP를 사용하세요',
|
|
12
12
|
'SMART.MEDIA_STORAGE.UPLOAD_SUCCESS': '이미지가 업로드되었습니다',
|
|
13
|
+
'SMART.MEDIA_STORAGE.UPLOAD_SUCCESS_COMPRESSED': '이미지가 업로드되었습니다. PNG 압축: {{percent}}% 절감 ({{size}})',
|
|
13
14
|
'SMART.MEDIA_STORAGE.USAGE': '파일 {{count}}개 · {{size}}',
|
|
14
15
|
'SMART.MEDIA_STORAGE.CROPS_BADGE': '크롭 {{count}}개',
|
|
15
16
|
'SMART.MEDIA_STORAGE.VERSIONS_BADGE': '버전 {{count}}개',
|
|
@@ -10,6 +10,7 @@ export const messages = {
|
|
|
10
10
|
'SMART.MEDIA_STORAGE.UPLOAD_ERROR': 'Falha ao enviar a imagem',
|
|
11
11
|
'SMART.MEDIA_STORAGE.UNSUPPORTED_FORMAT': 'Formato não suportado. Use JPEG, PNG, GIF ou WebP',
|
|
12
12
|
'SMART.MEDIA_STORAGE.UPLOAD_SUCCESS': 'Imagem enviada',
|
|
13
|
+
'SMART.MEDIA_STORAGE.UPLOAD_SUCCESS_COMPRESSED': 'Imagem enviada. PNG comprimido: economia de {{percent}}% ({{size}})',
|
|
13
14
|
'SMART.MEDIA_STORAGE.USAGE': '{{count}} arquivos · {{size}}',
|
|
14
15
|
'SMART.MEDIA_STORAGE.CROPS_BADGE': '{{count}} rec.',
|
|
15
16
|
'SMART.MEDIA_STORAGE.VERSIONS_BADGE': '{{count}} vers.',
|
|
@@ -10,6 +10,7 @@ export const messages = {
|
|
|
10
10
|
'SMART.MEDIA_STORAGE.UPLOAD_ERROR': 'Не удалось загрузить изображение',
|
|
11
11
|
'SMART.MEDIA_STORAGE.UNSUPPORTED_FORMAT': 'Неподдерживаемый формат. Используйте JPEG, PNG, GIF или WebP',
|
|
12
12
|
'SMART.MEDIA_STORAGE.UPLOAD_SUCCESS': 'Изображение загружено',
|
|
13
|
+
'SMART.MEDIA_STORAGE.UPLOAD_SUCCESS_COMPRESSED': 'Изображение загружено. PNG сжат: экономия {{percent}}% ({{size}})',
|
|
13
14
|
'SMART.MEDIA_STORAGE.USAGE': '{{count}} файлов · {{size}}',
|
|
14
15
|
'SMART.MEDIA_STORAGE.CROPS_BADGE': '{{count}} кр.',
|
|
15
16
|
'SMART.MEDIA_STORAGE.VERSIONS_BADGE': '{{count}} вер.',
|
|
@@ -10,6 +10,7 @@ export const messages = {
|
|
|
10
10
|
'SMART.MEDIA_STORAGE.UPLOAD_ERROR': 'อัปโหลดรูปภาพไม่สำเร็จ',
|
|
11
11
|
'SMART.MEDIA_STORAGE.UNSUPPORTED_FORMAT': 'ไม่รองรับรูปแบบนี้ ใช้ JPEG, PNG, GIF หรือ WebP',
|
|
12
12
|
'SMART.MEDIA_STORAGE.UPLOAD_SUCCESS': 'อัปโหลดรูปภาพแล้ว',
|
|
13
|
+
'SMART.MEDIA_STORAGE.UPLOAD_SUCCESS_COMPRESSED': 'อัปโหลดรูปภาพแล้ว บีบอัด PNG: ประหยัด {{percent}}% ({{size}})',
|
|
13
14
|
'SMART.MEDIA_STORAGE.USAGE': '{{count}} ไฟล์ · {{size}}',
|
|
14
15
|
'SMART.MEDIA_STORAGE.CROPS_BADGE': '{{count}} ครอป',
|
|
15
16
|
'SMART.MEDIA_STORAGE.VERSIONS_BADGE': '{{count}} เวอร์ชัน',
|
|
@@ -10,6 +10,7 @@ export const messages = {
|
|
|
10
10
|
'SMART.MEDIA_STORAGE.UPLOAD_ERROR': '上传图片失败',
|
|
11
11
|
'SMART.MEDIA_STORAGE.UNSUPPORTED_FORMAT': '不支持的格式。请使用 JPEG、PNG、GIF 或 WebP',
|
|
12
12
|
'SMART.MEDIA_STORAGE.UPLOAD_SUCCESS': '图片已上传',
|
|
13
|
+
'SMART.MEDIA_STORAGE.UPLOAD_SUCCESS_COMPRESSED': '图片已上传。PNG 已压缩:节省 {{percent}}%({{size}})',
|
|
13
14
|
'SMART.MEDIA_STORAGE.USAGE': '{{count}} 个文件 · {{size}}',
|
|
14
15
|
'SMART.MEDIA_STORAGE.CROPS_BADGE': '{{count}} 个裁剪图',
|
|
15
16
|
'SMART.MEDIA_STORAGE.VERSIONS_BADGE': '{{count}} 个版本',
|
|
@@ -11,6 +11,10 @@ export type MediaStorageMessages = {
|
|
|
11
11
|
'SMART.MEDIA_STORAGE.UPLOAD_ERROR': NoParams;
|
|
12
12
|
'SMART.MEDIA_STORAGE.UNSUPPORTED_FORMAT': NoParams;
|
|
13
13
|
'SMART.MEDIA_STORAGE.UPLOAD_SUCCESS': NoParams;
|
|
14
|
+
'SMART.MEDIA_STORAGE.UPLOAD_SUCCESS_COMPRESSED': {
|
|
15
|
+
percent: number;
|
|
16
|
+
size: string;
|
|
17
|
+
};
|
|
14
18
|
'SMART.MEDIA_STORAGE.USAGE': {
|
|
15
19
|
count: number;
|
|
16
20
|
size: string;
|