mirror of
https://github.com/shlinkio/shlink-web-client.git
synced 2025-01-10 18:27:25 +03:00
67 lines
2.2 KiB
TypeScript
67 lines
2.2 KiB
TypeScript
|
import { FC } from 'react';
|
||
|
import { ExportBtn } from '../../utils/ExportBtn';
|
||
|
import { useToggle } from '../../utils/helpers/hooks';
|
||
|
import { ShlinkApiClientBuilder } from '../../api/services/ShlinkApiClientBuilder';
|
||
|
import { isServerWithId, SelectedServer } from '../../servers/data';
|
||
|
import { ShortUrl } from '../data';
|
||
|
import { ReportExporter } from '../../common/services/ReportExporter';
|
||
|
import { useShortUrlsQuery } from './hooks';
|
||
|
|
||
|
export interface ExportShortUrlsBtnProps {
|
||
|
amount?: number;
|
||
|
}
|
||
|
|
||
|
interface ExportShortUrlsBtnConnectProps extends ExportShortUrlsBtnProps {
|
||
|
selectedServer: SelectedServer;
|
||
|
}
|
||
|
|
||
|
const itemsPerPage = 10;
|
||
|
|
||
|
export const ExportShortUrlsBtn = (
|
||
|
buildShlinkApiClient: ShlinkApiClientBuilder,
|
||
|
{ exportShortUrls }: ReportExporter,
|
||
|
): FC<ExportShortUrlsBtnConnectProps> => ({ amount = 0, selectedServer }) => {
|
||
|
const [{ tags, search, startDate, endDate, orderBy, tagsMode }] = useShortUrlsQuery();
|
||
|
const [ loading,, startLoading, stopLoading ] = useToggle();
|
||
|
const exportAllUrls = () => {
|
||
|
if (!isServerWithId(selectedServer)) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
const totalPages = amount / itemsPerPage;
|
||
|
const { listShortUrls } = buildShlinkApiClient(selectedServer);
|
||
|
const loadAllUrls = async (page = 1): Promise<ShortUrl[]> => {
|
||
|
const { data } = await listShortUrls(
|
||
|
{ page: `${page}`, tags, searchTerm: search, startDate, endDate, orderBy, tagsMode, itemsPerPage },
|
||
|
);
|
||
|
|
||
|
if (page >= totalPages) {
|
||
|
return data;
|
||
|
}
|
||
|
|
||
|
// TODO Support paralelization
|
||
|
return data.concat(await loadAllUrls(page + 1));
|
||
|
};
|
||
|
|
||
|
startLoading();
|
||
|
loadAllUrls()
|
||
|
.then((shortUrls) => {
|
||
|
exportShortUrls(shortUrls.map((shortUrl) => ({
|
||
|
createdAt: shortUrl.dateCreated,
|
||
|
shortUrl: shortUrl.shortUrl,
|
||
|
longUrl: shortUrl.longUrl,
|
||
|
title: shortUrl.title ?? '',
|
||
|
tags: shortUrl.tags.join(','),
|
||
|
visits: shortUrl.visitsCount,
|
||
|
})));
|
||
|
stopLoading();
|
||
|
})
|
||
|
.catch((e) => {
|
||
|
// TODO Handle error properly
|
||
|
console.error('An error occurred while exporting short URLs', e); // eslint-disable-line no-console
|
||
|
});
|
||
|
};
|
||
|
|
||
|
return <ExportBtn loading={loading} className="btn-md-block" amount={amount} onClick={exportAllUrls} />;
|
||
|
};
|