feat: add cover selection workflow and docker profiles

This commit is contained in:
2025-11-11 01:49:54 +03:00
parent db7de897a0
commit 98746fab39
11 changed files with 310 additions and 53 deletions

View File

@@ -1,6 +1,6 @@
import { create } from 'zustand';
const emptyCropConfig = {
const createEmptyCropConfig = () => ({
x: 0,
y: 0,
zoom: 1,
@@ -15,12 +15,16 @@ const emptyCropConfig = {
imageWidth: 0,
imageHeight: 0,
referenceImageId: null,
};
selection: null,
});
export const useAppStore = create((set) => ({
uploadedImages: [],
cropConfig: emptyCropConfig,
cropConfig: createEmptyCropConfig(),
croppedImages: [],
coverImageId: null,
coverCropConfig: createEmptyCropConfig(),
croppedCoverImage: null,
ocrText: '',
generatedEpub: null,
error: null,
@@ -28,6 +32,7 @@ export const useAppStore = create((set) => ({
clearError: () => set({ error: null }),
setUploadedImages: (images) => set({ uploadedImages: images }),
updateCropConfig: (config) => set({ cropConfig: { ...config } }),
updateCoverCropConfig: (config) => set({ coverCropConfig: { ...config } }),
setCroppedImages: (images) =>
set((state) => {
state.croppedImages.forEach((img) => {
@@ -35,6 +40,13 @@ export const useAppStore = create((set) => ({
});
return { croppedImages: images };
}),
setCroppedCoverImage: (image) =>
set((state) => {
if (state.croppedCoverImage?.url) {
URL.revokeObjectURL(state.croppedCoverImage.url);
}
return { croppedCoverImage: image };
}),
setOcrText: (text) => set({ ocrText: text }),
setGeneratedEpub: (epub) =>
set((state) => {
@@ -43,13 +55,35 @@ export const useAppStore = create((set) => ({
}
return { generatedEpub: epub };
}),
setCoverImageId: (id) =>
set((state) => {
const draft = {
coverImageId: id,
coverCropConfig: createEmptyCropConfig(),
};
if (state.croppedCoverImage?.url) {
URL.revokeObjectURL(state.croppedCoverImage.url);
}
draft.croppedCoverImage = null;
if (state.generatedEpub?.url) {
URL.revokeObjectURL(state.generatedEpub.url);
draft.generatedEpub = null;
}
return draft;
}),
resetFromStep: (step) =>
set((state) => {
const draft = {};
if (step === 'upload') {
draft.cropConfig = emptyCropConfig;
draft.cropConfig = createEmptyCropConfig();
state.croppedImages.forEach((img) => img.url && URL.revokeObjectURL(img.url));
draft.croppedImages = [];
if (state.croppedCoverImage?.url) {
URL.revokeObjectURL(state.croppedCoverImage.url);
}
draft.coverImageId = null;
draft.coverCropConfig = createEmptyCropConfig();
draft.croppedCoverImage = null;
draft.ocrText = '';
if (state.generatedEpub?.url) {
URL.revokeObjectURL(state.generatedEpub.url);