mirror of
https://github.com/penpot/penpot-exporter-figma-plugin.git
synced 2024-12-22 13:43:03 -05:00
Improve UX for larger files, when the download also takes time to process (#136)
* Improve UX for larger files, when the download also takes time to process * add changelog
This commit is contained in:
parent
8a86304fea
commit
7895daaea8
4 changed files with 39 additions and 15 deletions
5
.changeset/two-cougars-allow.md
Normal file
5
.changeset/two-cougars-allow.md
Normal file
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
"penpot-exporter": minor
|
||||
---
|
||||
|
||||
Add loader when generating really large files after the page processing loader
|
|
@ -1,5 +1,6 @@
|
|||
import { componentsLibrary } from '@plugin/ComponentLibrary';
|
||||
import { imagesLibrary } from '@plugin/ImageLibrary';
|
||||
import { sleep } from '@plugin/utils';
|
||||
|
||||
import { PenpotDocument } from '@ui/types';
|
||||
|
||||
|
@ -7,7 +8,7 @@ import { transformPageNode } from '.';
|
|||
|
||||
export const transformDocumentNode = async (node: DocumentNode): Promise<PenpotDocument> => {
|
||||
const children = [];
|
||||
let currentPage = 0;
|
||||
let currentPage = 1;
|
||||
|
||||
figma.ui.postMessage({
|
||||
type: 'PROGRESS_TOTAL_PAGES',
|
||||
|
@ -15,14 +16,16 @@ export const transformDocumentNode = async (node: DocumentNode): Promise<PenpotD
|
|||
});
|
||||
|
||||
for (const page of node.children) {
|
||||
await page.loadAsync();
|
||||
|
||||
children.push(await transformPageNode(page));
|
||||
|
||||
figma.ui.postMessage({
|
||||
type: 'PROGRESS_PROCESSED_PAGES',
|
||||
data: currentPage++
|
||||
});
|
||||
|
||||
await page.loadAsync();
|
||||
|
||||
children.push(await transformPageNode(page));
|
||||
await sleep(0);
|
||||
}
|
||||
|
||||
return {
|
||||
|
|
|
@ -3,7 +3,11 @@ import { useEffect, useState } from 'react';
|
|||
|
||||
import { Stack } from './Stack';
|
||||
|
||||
export const ExporterProgress = () => {
|
||||
type ExporterProgressProps = {
|
||||
downloading: boolean;
|
||||
};
|
||||
|
||||
export const ExporterProgress = ({ downloading }: ExporterProgressProps) => {
|
||||
const [currentNode, setCurrentNode] = useState<string | undefined>();
|
||||
const [totalPages, setTotalPages] = useState<number | undefined>();
|
||||
const [processedPages, setProcessedPages] = useState<number | undefined>();
|
||||
|
@ -13,6 +17,7 @@ export const ExporterProgress = () => {
|
|||
setCurrentNode(event.data.pluginMessage.data as string);
|
||||
} else if (event.data.pluginMessage?.type === 'PROGRESS_TOTAL_PAGES') {
|
||||
setTotalPages(event.data.pluginMessage.data as number);
|
||||
setProcessedPages(0);
|
||||
} else if (event.data.pluginMessage?.type === 'PROGRESS_PROCESSED_PAGES') {
|
||||
setProcessedPages(event.data.pluginMessage.data as number);
|
||||
}
|
||||
|
@ -38,15 +43,25 @@ export const ExporterProgress = () => {
|
|||
<Stack space="small" horizontalAlign="center">
|
||||
<LoadingIndicator />
|
||||
<span style={{ textAlign: 'center' }}>
|
||||
{processedPages} of {totalPages} pages exported 💪
|
||||
{currentNode ? (
|
||||
{!downloading ? (
|
||||
<>
|
||||
<br />
|
||||
Currently exporting layer
|
||||
<br />
|
||||
{'“' + truncateText(currentNode, 40) + '”'}
|
||||
{processedPages} of {totalPages} pages exported 💪
|
||||
{currentNode ? (
|
||||
<>
|
||||
<br />
|
||||
Currently exporting layer
|
||||
<br />
|
||||
{'“' + truncateText(currentNode, 35) + '”'}
|
||||
</>
|
||||
) : undefined}
|
||||
</>
|
||||
) : undefined}
|
||||
) : (
|
||||
<>
|
||||
Generating Penpot file 🚀
|
||||
<br />
|
||||
Please wait, this process might take a while...
|
||||
</>
|
||||
)}
|
||||
</span>
|
||||
</Stack>
|
||||
);
|
||||
|
|
|
@ -16,18 +16,19 @@ export const PenpotExporter = () => {
|
|||
const [needsReload, setNeedsReload] = useState(false);
|
||||
const [loading, setLoading] = useState(true);
|
||||
const [exporting, setExporting] = useState(false);
|
||||
const [downloading, setDownloading] = useState(false);
|
||||
const methods = useForm<FormValues>();
|
||||
|
||||
methods.getValues();
|
||||
|
||||
const onMessage = (event: MessageEvent<{ pluginMessage: { type: string; data: unknown } }>) => {
|
||||
if (event.data.pluginMessage?.type == 'PENPOT_DOCUMENT') {
|
||||
setDownloading(true);
|
||||
|
||||
const document = event.data.pluginMessage.data as PenpotDocument;
|
||||
const file = parse(document);
|
||||
|
||||
file.export();
|
||||
|
||||
setExporting(false);
|
||||
} else if (event.data.pluginMessage?.type == 'CUSTOM_FONTS') {
|
||||
setMissingFonts(event.data.pluginMessage.data as string[]);
|
||||
setLoading(false);
|
||||
|
@ -72,7 +73,7 @@ export const PenpotExporter = () => {
|
|||
|
||||
if (loading) return <LoadingIndicator />;
|
||||
|
||||
if (exporting) return <ExporterProgress />;
|
||||
if (exporting) return <ExporterProgress downloading={downloading} />;
|
||||
|
||||
if (needsReload) {
|
||||
return (
|
||||
|
|
Loading…
Reference in a new issue