feat: add cover selection workflow and docker profiles
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user