cleanup: remove unused CharacterImagesSection, tweak metadata
This commit is contained in:
parent
38762c8946
commit
5edcf6473a
2 changed files with 0 additions and 206 deletions
|
|
@ -1,205 +0,0 @@
|
||||||
<svelte:options runes={true} />
|
|
||||||
|
|
||||||
<script lang="ts">
|
|
||||||
import DetailsContainer from '$lib/components/ui/DetailsContainer.svelte'
|
|
||||||
import Button from '$lib/components/ui/Button.svelte'
|
|
||||||
import { entityAdapter } from '$lib/api/adapters/entity.adapter'
|
|
||||||
import type { CharacterDownloadStatus } from '$lib/api/adapters/entity.adapter'
|
|
||||||
|
|
||||||
interface Props {
|
|
||||||
characterId: string
|
|
||||||
granblueId: string
|
|
||||||
canEdit?: boolean
|
|
||||||
}
|
|
||||||
|
|
||||||
let { characterId, granblueId, canEdit = false }: Props = $props()
|
|
||||||
|
|
||||||
let isDownloading = $state(false)
|
|
||||||
let downloadStatus = $state<CharacterDownloadStatus | null>(null)
|
|
||||||
let downloadError = $state<string | null>(null)
|
|
||||||
let pollingInterval = $state<ReturnType<typeof setInterval> | null>(null)
|
|
||||||
|
|
||||||
const isComplete = $derived(downloadStatus?.status === 'completed')
|
|
||||||
const isFailed = $derived(downloadStatus?.status === 'failed')
|
|
||||||
const isInProgress = $derived(
|
|
||||||
downloadStatus?.status === 'queued' || downloadStatus?.status === 'processing'
|
|
||||||
)
|
|
||||||
|
|
||||||
async function startDownload(force = false) {
|
|
||||||
isDownloading = true
|
|
||||||
downloadError = null
|
|
||||||
|
|
||||||
try {
|
|
||||||
await entityAdapter.downloadCharacterImages(characterId, { force })
|
|
||||||
// Start polling for status
|
|
||||||
startPolling()
|
|
||||||
} catch (error) {
|
|
||||||
downloadError = 'Failed to start download'
|
|
||||||
console.error('Download error:', error)
|
|
||||||
isDownloading = false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function startPolling() {
|
|
||||||
// Clear any existing polling
|
|
||||||
if (pollingInterval) {
|
|
||||||
clearInterval(pollingInterval)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Poll every 2 seconds
|
|
||||||
pollingInterval = setInterval(async () => {
|
|
||||||
try {
|
|
||||||
const status = await entityAdapter.getCharacterDownloadStatus(characterId)
|
|
||||||
downloadStatus = status
|
|
||||||
|
|
||||||
// Stop polling if completed or failed
|
|
||||||
if (status.status === 'completed' || status.status === 'failed') {
|
|
||||||
stopPolling()
|
|
||||||
isDownloading = false
|
|
||||||
}
|
|
||||||
} catch (error) {
|
|
||||||
console.error('Status polling error:', error)
|
|
||||||
stopPolling()
|
|
||||||
isDownloading = false
|
|
||||||
downloadError = 'Failed to get download status'
|
|
||||||
}
|
|
||||||
}, 2000)
|
|
||||||
|
|
||||||
// Initial status check
|
|
||||||
entityAdapter.getCharacterDownloadStatus(characterId).then((status) => {
|
|
||||||
downloadStatus = status
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
function stopPolling() {
|
|
||||||
if (pollingInterval) {
|
|
||||||
clearInterval(pollingInterval)
|
|
||||||
pollingInterval = null
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Cleanup on unmount
|
|
||||||
$effect(() => {
|
|
||||||
return () => {
|
|
||||||
stopPolling()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
</script>
|
|
||||||
|
|
||||||
{#if canEdit}
|
|
||||||
<DetailsContainer title="Image Management">
|
|
||||||
<div class="images-section">
|
|
||||||
<p class="description">Download character images from the game server to your storage.</p>
|
|
||||||
|
|
||||||
<div class="actions">
|
|
||||||
<Button
|
|
||||||
variant="primary"
|
|
||||||
size="small"
|
|
||||||
onclick={() => startDownload(false)}
|
|
||||||
disabled={isDownloading || isInProgress}
|
|
||||||
>
|
|
||||||
{isDownloading || isInProgress ? 'Downloading...' : 'Download Images'}
|
|
||||||
</Button>
|
|
||||||
|
|
||||||
{#if isComplete}
|
|
||||||
<Button
|
|
||||||
variant="secondary"
|
|
||||||
size="small"
|
|
||||||
onclick={() => startDownload(true)}
|
|
||||||
disabled={isDownloading}
|
|
||||||
>
|
|
||||||
Re-download (force)
|
|
||||||
</Button>
|
|
||||||
{/if}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{#if downloadStatus}
|
|
||||||
<div class="status" class:success={isComplete} class:error={isFailed}>
|
|
||||||
{#if isInProgress}
|
|
||||||
<div class="progress-bar">
|
|
||||||
<div class="progress-fill" style="width: {downloadStatus.progress ?? 0}%"></div>
|
|
||||||
</div>
|
|
||||||
<span class="progress-text">
|
|
||||||
{downloadStatus.progress ?? 0}% - {downloadStatus.imagesDownloaded ??
|
|
||||||
0}/{downloadStatus.imagesTotal ?? '?'} images
|
|
||||||
</span>
|
|
||||||
{:else if isComplete}
|
|
||||||
<span>Download complete - {downloadStatus.imagesDownloaded} images downloaded</span>
|
|
||||||
{:else if isFailed}
|
|
||||||
<span>Download failed: {downloadStatus.error}</span>
|
|
||||||
{/if}
|
|
||||||
</div>
|
|
||||||
{/if}
|
|
||||||
|
|
||||||
{#if downloadError}
|
|
||||||
<div class="error-message">{downloadError}</div>
|
|
||||||
{/if}
|
|
||||||
</div>
|
|
||||||
</DetailsContainer>
|
|
||||||
{/if}
|
|
||||||
|
|
||||||
<style lang="scss">
|
|
||||||
@use '$src/themes/colors' as colors;
|
|
||||||
@use '$src/themes/spacing' as spacing;
|
|
||||||
@use '$src/themes/typography' as typography;
|
|
||||||
|
|
||||||
.images-section {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
gap: spacing.$unit-2x;
|
|
||||||
padding: spacing.$unit-2x 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.description {
|
|
||||||
color: colors.$grey-50;
|
|
||||||
font-size: typography.$font-small;
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.actions {
|
|
||||||
display: flex;
|
|
||||||
gap: spacing.$unit;
|
|
||||||
}
|
|
||||||
|
|
||||||
.status {
|
|
||||||
padding: spacing.$unit;
|
|
||||||
border-radius: 4px;
|
|
||||||
font-size: typography.$font-small;
|
|
||||||
|
|
||||||
&.success {
|
|
||||||
background: colors.$wind-bg-20;
|
|
||||||
color: colors.$wind-text-20;
|
|
||||||
}
|
|
||||||
|
|
||||||
&.error {
|
|
||||||
background: colors.$error--bg--light;
|
|
||||||
color: colors.$error;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.progress-bar {
|
|
||||||
height: 4px;
|
|
||||||
background: colors.$grey-80;
|
|
||||||
border-radius: 2px;
|
|
||||||
overflow: hidden;
|
|
||||||
margin-bottom: spacing.$unit;
|
|
||||||
}
|
|
||||||
|
|
||||||
.progress-fill {
|
|
||||||
height: 100%;
|
|
||||||
background: colors.$accent--blue--light;
|
|
||||||
transition: width 0.3s ease;
|
|
||||||
}
|
|
||||||
|
|
||||||
.progress-text {
|
|
||||||
color: colors.$grey-50;
|
|
||||||
}
|
|
||||||
|
|
||||||
.error-message {
|
|
||||||
color: colors.$error;
|
|
||||||
font-size: typography.$font-small;
|
|
||||||
padding: spacing.$unit;
|
|
||||||
background: colors.$error--bg--light;
|
|
||||||
border-radius: 4px;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
@ -55,7 +55,6 @@
|
||||||
onAcceptSuggestion={() => onAcceptSuggestion?.('granblueId', suggestions?.granblueId)}
|
onAcceptSuggestion={() => onAcceptSuggestion?.('granblueId', suggestions?.granblueId)}
|
||||||
onDismissSuggestion={() => onDismissSuggestion?.('granblueId')}
|
onDismissSuggestion={() => onDismissSuggestion?.('granblueId')}
|
||||||
/>
|
/>
|
||||||
<DetailItem label="Character ID" bind:value={editData.characterId} editable={true} type="number" />
|
|
||||||
{:else}
|
{:else}
|
||||||
<DetailItem label="Rarity" value={getRarityLabel(character.rarity)} />
|
<DetailItem label="Rarity" value={getRarityLabel(character.rarity)} />
|
||||||
<DetailItem label="Granblue ID">
|
<DetailItem label="Granblue ID">
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue