mirror of
https://github.com/invoke-ai/InvokeAI.git
synced 2026-04-23 03:00:31 -04:00
69 lines
2.2 KiB
TypeScript
69 lines
2.2 KiB
TypeScript
import type { SystemStyleObject } from '@invoke-ai/ui-library';
|
|
import { IconButton, spinAnimation } from '@invoke-ai/ui-library';
|
|
import { EMPTY_ARRAY } from 'app/store/constants';
|
|
import { toast } from 'features/toast/toast';
|
|
import { useCallback } from 'react';
|
|
import { useTranslation } from 'react-i18next';
|
|
import { PiDownloadSimpleBold, PiSpinner } from 'react-icons/pi';
|
|
import { useLazyExportStylePresetsQuery, useListStylePresetsQuery } from 'services/api/endpoints/stylePresets';
|
|
|
|
const loadingStyles: SystemStyleObject = {
|
|
svg: { animation: spinAnimation },
|
|
};
|
|
|
|
export const StylePresetExportButton = () => {
|
|
const [exportStylePresets, { isLoading }] = useLazyExportStylePresetsQuery();
|
|
const { t } = useTranslation();
|
|
const { presetCount } = useListStylePresetsQuery(undefined, {
|
|
selectFromResult: ({ data }) => {
|
|
const presetsToExport = data?.filter((preset) => preset.type !== 'default') ?? EMPTY_ARRAY;
|
|
return {
|
|
presetCount: presetsToExport.length,
|
|
};
|
|
},
|
|
});
|
|
const handleClickDownloadCsv = useCallback(async () => {
|
|
let blob;
|
|
try {
|
|
const response = await exportStylePresets().unwrap();
|
|
blob = new Blob([response], { type: 'text/csv' });
|
|
} catch (error) {
|
|
toast({
|
|
status: 'error',
|
|
title: t('stylePresets.exportFailed'),
|
|
});
|
|
return;
|
|
}
|
|
|
|
if (blob) {
|
|
const url = window.URL.createObjectURL(blob);
|
|
const a = document.createElement('a');
|
|
a.href = url;
|
|
a.download = 'data.csv';
|
|
document.body.appendChild(a);
|
|
a.click();
|
|
document.body.removeChild(a);
|
|
window.URL.revokeObjectURL(url);
|
|
toast({
|
|
status: 'success',
|
|
title: t('stylePresets.exportDownloaded'),
|
|
});
|
|
}
|
|
}, [exportStylePresets, t]);
|
|
|
|
return (
|
|
<IconButton
|
|
onClick={handleClickDownloadCsv}
|
|
icon={!isLoading ? <PiDownloadSimpleBold /> : <PiSpinner />}
|
|
tooltip={t('stylePresets.exportPromptTemplates')}
|
|
aria-label={t('stylePresets.exportPromptTemplates')}
|
|
size="md"
|
|
variant="link"
|
|
w={8}
|
|
h={8}
|
|
sx={isLoading ? loadingStyles : undefined}
|
|
isDisabled={isLoading || presetCount === 0}
|
|
/>
|
|
);
|
|
};
|