SquidSpirit f367b56633
All checks were successful
Frontend CI / build (push) Successful in 1m42s
Auto Comment On PR / add_improve_comment (pull_request) Successful in 17s
PR Title Check / pr-title-check (pull_request) Successful in 16s
fix: eslint
2025-10-14 02:08:05 +08:00

51 lines
1.5 KiB
TypeScript

import { StatusType, type AsyncState } from '$lib/common/adapter/presenter/asyncState';
import { ImageInfoViewModel } from '$lib/image/adapter/presenter/imageInfoViewModel';
import type { UploadImageUseCase } from '$lib/image/application/useCase/uploadImageUseCase';
import { get, writable } from 'svelte/store';
export type ImageInfoState = AsyncState<ImageInfoViewModel>;
export type ImageEvent = ImageUploadedEvent;
export class ImageBloc {
private readonly state = writable<ImageInfoState>({
status: StatusType.Idle,
});
constructor(private readonly uploadImageUseCase: UploadImageUseCase) {}
get subscribe() {
return this.state.subscribe;
}
async dispatch(event: ImageEvent): Promise<ImageInfoState> {
switch (event.event) {
case ImageEventType.ImageUploadedEvent:
return this.uploadImage(event.file);
}
}
private async uploadImage(file: File): Promise<ImageInfoState> {
this.state.set({ status: StatusType.Loading, data: get(this.state).data });
let result: ImageInfoState;
try {
const imageInfo = await this.uploadImageUseCase.execute(file);
const imageInfoViewModel = ImageInfoViewModel.fromEntity(imageInfo);
result = { status: StatusType.Success, data: imageInfoViewModel };
} catch (error) {
result = { status: StatusType.Error, error: error as Error };
}
return result;
}
}
export enum ImageEventType {
ImageUploadedEvent,
}
interface ImageUploadedEvent {
event: ImageEventType.ImageUploadedEvent;
file: File;
}