import { Head, router } from '@inertiajs/react' import { useTranslation } from 'react-i18next' import StyledTable from '~/components/StyledTable' import SettingsLayout from '~/layouts/SettingsLayout' import StyledButton from '~/components/StyledButton' import { useModals } from '~/context/ModalContext' import StyledModal from '~/components/StyledModal' import { FileEntry } from '../../../types/files' import { useNotifications } from '~/context/NotificationContext' import { useState } from 'react' import api from '~/lib/api' import DownloadURLModal from '~/components/DownloadURLModal' import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query' import useDownloads from '~/hooks/useDownloads' import StyledSectionHeader from '~/components/StyledSectionHeader' import CuratedCollectionCard from '~/components/CuratedCollectionCard' import type { CollectionWithStatus } from '../../../types/collections' import ActiveDownloads from '~/components/ActiveDownloads' import Alert from '~/components/Alert' const CURATED_COLLECTIONS_KEY = 'curated-map-collections' export default function MapsManager(props: { maps: { baseAssetsExist: boolean; regionFiles: FileEntry[] } }) { const { t } = useTranslation() const queryClient = useQueryClient() const { openModal, closeAllModals } = useModals() const { addNotification } = useNotifications() const [downloading, setDownloading] = useState(false) const { data: curatedCollections } = useQuery({ queryKey: [CURATED_COLLECTIONS_KEY], queryFn: () => api.listCuratedMapCollections(), refetchOnWindowFocus: false, }) const { invalidate: invalidateDownloads } = useDownloads({ filetype: 'map', enabled: true, }) async function downloadBaseAssets() { try { setDownloading(true) const res = await api.downloadBaseMapAssets() if (!res) { throw new Error(t('mapsManager.baseAssetsUnknownError')) } if (res.success) { addNotification({ type: 'success', message: t('mapsManager.baseAssetsSuccess'), }) router.reload() } } catch (error) { console.error('Error downloading base assets:', error) addNotification({ type: 'error', message: t('mapsManager.baseAssetsError'), }) } finally { setDownloading(false) } } async function downloadCollection(record: CollectionWithStatus) { try { await api.downloadMapCollection(record.slug) invalidateDownloads() addNotification({ type: 'success', message: t('mapsManager.downloadQueued', { name: record.name }), }) } catch (error) { console.error('Error downloading collection:', error) } } async function downloadCustomFile(url: string) { try { await api.downloadRemoteMapRegion(url) invalidateDownloads() addNotification({ type: 'success', message: t('mapsManager.customDownloadQueued'), }) } catch (error) { console.error('Error downloading custom file:', error) } } async function confirmDeleteFile(file: FileEntry) { openModal( { closeAllModals() }} onCancel={closeAllModals} open={true} confirmText={t('mapsManager.delete')} cancelText={t('mapsManager.cancel')} confirmVariant="danger" > {t('mapsManager.confirmDeleteMessage', { name: file.name })} , 'confirm-delete-file-modal' ) } async function confirmDownload(record: CollectionWithStatus) { const isCollection = 'resources' in record openModal( { if (isCollection) { if (record.all_installed) { addNotification({ message: t('mapsManager.allResourcesDownloaded', { name: record.name }), type: 'info', }) return } downloadCollection(record) } closeAllModals() }} onCancel={closeAllModals} open={true} confirmText={t('mapsManager.download')} cancelText={t('mapsManager.cancel')} confirmVariant="primary" > , 'confirm-download-file-modal' ) } async function openDownloadModal() { openModal( closeAllModals()} onPreflightSuccess={async (url) => { await downloadCustomFile(url) closeAllModals() }} />, 'download-map-file-modal' ) } const refreshManifests = useMutation({ mutationFn: () => api.refreshManifests(), onSuccess: () => { addNotification({ message: t('mapsManager.refreshSuccess'), type: 'success', }) queryClient.invalidateQueries({ queryKey: [CURATED_COLLECTIONS_KEY] }) }, }) return ( {t('mapsManager.heading')} {t('mapsManager.description')} {!props.maps.baseAssetsExist && ( downloadBaseAssets(), }} /> )} refreshManifests.mutate()} disabled={refreshManifests.isPending} icon="IconRefresh" > {t('mapsManager.forceRefreshCollections')} {curatedCollections?.map((collection) => ( confirmDownload(collection)} /> ))} {curatedCollections && curatedCollections.length === 0 && ( {t('mapsManager.noCuratedCollections')} )} {t('mapsManager.downloadCustomMapFile')} className="font-semibold mt-4" rowLines={true} loading={false} compact columns={[ { accessor: 'name', title: t('mapsManager.columns.name') }, { accessor: 'actions', title: t('mapsManager.columns.actions'), render: (record) => ( { confirmDeleteFile(record) }} > {t('mapsManager.delete')} ), }, ]} data={props.maps.regionFiles || []} /> ) }
{t('mapsManager.confirmDeleteMessage', { name: file.name })}
{t('mapsManager.description')}
{t('mapsManager.noCuratedCollections')}