51 lines
1.6 KiB
TypeScript
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 };
|
|
}
|