gcx/frontend/admin-web/src/views/app-versions/hooks/use-upload.ts

51 lines
1.6 KiB
TypeScript

'use client';
import type { ChangeEvent } from 'react';
import type { AppType } from '@/domain/entities';
import { useUploadStore } from '@/store/zustand/upload.store';
import { uploadVersionUseCase } from '@/application/use-cases/version.use-cases';
export function useUpload(appType: AppType, onSuccess: () => void) {
const store = useUploadStore();
const handleFileChange = (e: ChangeEvent<HTMLInputElement>) => {
const f = e.target.files?.[0];
if (!f) return;
store.setFile(f);
store.setParseWarning('');
if (f.name.endsWith('.apk')) store.setPlatform('ANDROID');
else if (f.name.endsWith('.ipa')) store.setPlatform('IOS');
};
const handleSubmit = async () => {
const { file, platform, versionName, buildNumber, changelog, minOsVersion, isForceUpdate } =
useUploadStore.getState();
if (!file) {
store.setUploadError('请选择 APK/IPA 文件');
return;
}
store.setIsUploading(true);
store.setUploadError('');
try {
console.log('[useUpload] Uploading:', file.name, (file.size / 1024 / 1024).toFixed(1) + 'MB');
const result = await uploadVersionUseCase.execute({
file, appType, platform, versionName, buildNumber,
changelog, minOsVersion, isForceUpdate,
});
console.log('[useUpload] Success:', result);
store.reset();
onSuccess();
} catch (err) {
console.error('[useUpload] Failed:', err);
store.setUploadError((err as Error)?.message || 'Upload failed');
}
store.setIsUploading(false);
};
return { handleFileChange, handleSubmit };
}