@umituz/react-native-ai-generation-content 1.12.2 → 1.12.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/package.json +5 -1
  2. package/src/domains/prompts/domain/entities/AIPromptTemplate.ts +48 -0
  3. package/src/domains/prompts/domain/entities/BackgroundRemovalConfig.ts +86 -0
  4. package/src/domains/prompts/domain/entities/ColorizationConfig.ts +101 -0
  5. package/src/domains/prompts/domain/entities/FaceSwapConfig.ts +54 -0
  6. package/src/domains/prompts/domain/entities/FuturePredictionConfig.ts +93 -0
  7. package/src/domains/prompts/domain/entities/GeneratedPrompt.ts +32 -0
  8. package/src/domains/prompts/domain/entities/ImageEnhancementConfig.ts +93 -0
  9. package/src/domains/prompts/domain/entities/PhotoRestorationConfig.ts +64 -0
  10. package/src/domains/prompts/domain/entities/StyleTransferConfig.ts +80 -0
  11. package/src/domains/prompts/domain/entities/TextGenerationConfig.ts +100 -0
  12. package/src/domains/prompts/domain/entities/types.ts +27 -0
  13. package/src/domains/prompts/domain/entities/value-objects.ts +33 -0
  14. package/src/domains/prompts/domain/repositories/IAIPromptServices.ts +106 -0
  15. package/src/domains/prompts/domain/repositories/IPromptHistoryRepository.ts +10 -0
  16. package/src/domains/prompts/domain/repositories/ITemplateRepository.ts +11 -0
  17. package/src/domains/prompts/index.ts +318 -0
  18. package/src/domains/prompts/infrastructure/repositories/PromptHistoryRepository.ts +85 -0
  19. package/src/domains/prompts/infrastructure/repositories/TemplateRepository.ts +77 -0
  20. package/src/domains/prompts/infrastructure/services/BackgroundRemovalService.ts +209 -0
  21. package/src/domains/prompts/infrastructure/services/ColorizationService.ts +232 -0
  22. package/src/domains/prompts/infrastructure/services/FaceSwapService.ts +198 -0
  23. package/src/domains/prompts/infrastructure/services/FuturePredictionService.ts +176 -0
  24. package/src/domains/prompts/infrastructure/services/ImageEnhancementService.ts +181 -0
  25. package/src/domains/prompts/infrastructure/services/PhotoRestorationService.ts +160 -0
  26. package/src/domains/prompts/infrastructure/services/PromptGenerationService.ts +59 -0
  27. package/src/domains/prompts/infrastructure/services/StyleTransferService.ts +194 -0
  28. package/src/domains/prompts/infrastructure/services/TextGenerationService.ts +241 -0
  29. package/src/domains/prompts/presentation/hooks/useAIServices.ts +213 -0
  30. package/src/domains/prompts/presentation/hooks/useAsyncState.ts +56 -0
  31. package/src/domains/prompts/presentation/hooks/useFaceSwap.ts +100 -0
  32. package/src/domains/prompts/presentation/hooks/useImageEnhancement.ts +100 -0
  33. package/src/domains/prompts/presentation/hooks/usePhotoRestoration.ts +100 -0
  34. package/src/domains/prompts/presentation/hooks/usePromptGeneration.ts +144 -0
  35. package/src/domains/prompts/presentation/hooks/useStyleTransfer.ts +125 -0
  36. package/src/domains/prompts/presentation/hooks/useTemplateRepository.ts +113 -0
  37. package/src/domains/prompts/presentation/theme/theme.ts +16 -0
  38. package/src/domains/prompts/presentation/theme/types.ts +82 -0
  39. package/src/domains/prompts/presentation/theme/utils.ts +24 -0
  40. package/src/index.ts +6 -0
@@ -0,0 +1,213 @@
1
+ import { useState, useCallback } from 'react';
2
+ import type {
3
+ FaceSwapConfig
4
+ } from '../../domain/entities/FaceSwapConfig';
5
+ import type {
6
+ PhotoRestorationConfig
7
+ } from '../../domain/entities/PhotoRestorationConfig';
8
+ import type {
9
+ ImageEnhancementConfig
10
+ } from '../../domain/entities/ImageEnhancementConfig';
11
+ import type {
12
+ StyleTransferConfig
13
+ } from '../../domain/entities/StyleTransferConfig';
14
+ import type {
15
+ BackgroundRemovalConfig
16
+ } from '../../domain/entities/BackgroundRemovalConfig';
17
+ import type {
18
+ TextGenerationConfig
19
+ } from '../../domain/entities/TextGenerationConfig';
20
+ import type {
21
+ ColorizationConfig
22
+ } from '../../domain/entities/ColorizationConfig';
23
+ import type {
24
+ IFaceSwapService,
25
+ IPhotoRestorationService,
26
+ IImageEnhancementService,
27
+ IStyleTransferService,
28
+ IBackgroundRemovalService,
29
+ ITextGenerationService,
30
+ IColorizationService
31
+ } from '../../domain/repositories/IAIPromptServices';
32
+ import type { ITemplateRepository } from '../../domain/repositories/ITemplateRepository';
33
+ import type { IPromptHistoryRepository } from '../../domain/repositories/IPromptHistoryRepository';
34
+ import type { GeneratedPrompt } from '../../domain/entities/GeneratedPrompt';
35
+ import { createGeneratedPrompt } from '../../domain/entities/GeneratedPrompt';
36
+ import { useAsyncState } from './useAsyncState';
37
+
38
+ export type AIConfig =
39
+ | { type: 'face-swap'; config: FaceSwapConfig }
40
+ | { type: 'photo-restoration'; config: PhotoRestorationConfig }
41
+ | { type: 'image-enhancement'; config: ImageEnhancementConfig }
42
+ | { type: 'style-transfer'; config: StyleTransferConfig }
43
+ | { type: 'background-removal'; config: BackgroundRemovalConfig }
44
+ | { type: 'text-generation'; config: TextGenerationConfig }
45
+ | { type: 'colorization'; config: ColorizationConfig };
46
+
47
+ export interface UseAIServicesState {
48
+ generatedPrompt: GeneratedPrompt | null;
49
+ processing: boolean;
50
+ currentService: string | null;
51
+ }
52
+
53
+ export interface UseAIServicesActions {
54
+ processRequest: (aiConfig: AIConfig) => Promise<void>;
55
+ getAvailableStyles: (serviceType: string) => Promise<string[]>;
56
+ clearPrompt: () => void;
57
+ reset: () => void;
58
+ }
59
+
60
+ export const useAIServices = (
61
+ services: {
62
+ faceSwap: IFaceSwapService;
63
+ photoRestoration: IPhotoRestorationService;
64
+ imageEnhancement: IImageEnhancementService;
65
+ styleTransfer: IStyleTransferService;
66
+ backgroundRemoval: IBackgroundRemovalService;
67
+ textGeneration: ITextGenerationService;
68
+ colorization: IColorizationService;
69
+ },
70
+ repositories: {
71
+ template: ITemplateRepository;
72
+ history: IPromptHistoryRepository;
73
+ }
74
+ ): UseAIServicesState & UseAIServicesActions => {
75
+ const {
76
+ data: generatedPrompt,
77
+ loading: processing,
78
+ error,
79
+ setError,
80
+ setData: setGeneratedPrompt,
81
+ clearError,
82
+ } = useAsyncState<GeneratedPrompt>(null);
83
+
84
+ const [currentService, setCurrentService] = useState<string | null>(null);
85
+
86
+ const processRequest = useCallback(async (aiConfig: AIConfig): Promise<void> => {
87
+ clearError();
88
+ setCurrentService(aiConfig.type);
89
+
90
+ try {
91
+ let templateResult;
92
+ let promptResult;
93
+
94
+ switch (aiConfig.type) {
95
+ case 'face-swap':
96
+ templateResult = await services.faceSwap.generateTemplate(aiConfig.config);
97
+ if (templateResult.success && templateResult.data) {
98
+ promptResult = await services.faceSwap.generatePrompt(templateResult.data, aiConfig.config);
99
+ }
100
+ break;
101
+
102
+ case 'photo-restoration':
103
+ templateResult = await services.photoRestoration.generateTemplate(aiConfig.config);
104
+ if (templateResult.success && templateResult.data) {
105
+ promptResult = await services.photoRestoration.generatePrompt(templateResult.data, aiConfig.config);
106
+ }
107
+ break;
108
+
109
+ case 'image-enhancement':
110
+ templateResult = await services.imageEnhancement.generateTemplate(aiConfig.config);
111
+ if (templateResult.success && templateResult.data) {
112
+ promptResult = await services.imageEnhancement.generatePrompt(templateResult.data, aiConfig.config);
113
+ }
114
+ break;
115
+
116
+ case 'style-transfer':
117
+ templateResult = await services.styleTransfer.generateTemplate(aiConfig.config);
118
+ if (templateResult.success && templateResult.data) {
119
+ promptResult = await services.styleTransfer.generatePrompt(templateResult.data, aiConfig.config);
120
+ }
121
+ break;
122
+
123
+ case 'background-removal':
124
+ templateResult = await services.backgroundRemoval.generateTemplate(aiConfig.config);
125
+ if (templateResult.success && templateResult.data) {
126
+ promptResult = await services.backgroundRemoval.generatePrompt(templateResult.data, aiConfig.config);
127
+ }
128
+ break;
129
+
130
+ case 'text-generation':
131
+ templateResult = await services.textGeneration.generateTemplate(aiConfig.config);
132
+ if (templateResult.success && templateResult.data) {
133
+ promptResult = await services.textGeneration.generatePrompt(templateResult.data, aiConfig.config);
134
+ }
135
+ break;
136
+
137
+ case 'colorization':
138
+ templateResult = await services.colorization.generateTemplate(aiConfig.config);
139
+ if (templateResult.success && templateResult.data) {
140
+ promptResult = await services.colorization.generatePrompt(templateResult.data, aiConfig.config);
141
+ }
142
+ break;
143
+
144
+ default:
145
+ setError('Unknown AI service type');
146
+ return;
147
+ }
148
+
149
+ if (!templateResult?.success || !templateResult.data) {
150
+ setError('Failed to generate template');
151
+ return;
152
+ }
153
+
154
+ if (!promptResult?.success) {
155
+ setError('Failed to generate prompt');
156
+ return;
157
+ }
158
+
159
+ const newPrompt = createGeneratedPrompt({
160
+ templateId: templateResult.data.id,
161
+ generatedText: promptResult.data,
162
+ variables: aiConfig.config as unknown as Record<string, unknown>,
163
+ });
164
+
165
+ await repositories.history.save(newPrompt);
166
+ setGeneratedPrompt(newPrompt);
167
+
168
+ } catch (error) {
169
+ setError('An unexpected error occurred');
170
+ } finally {
171
+ setCurrentService(null);
172
+ }
173
+ }, [services, repositories, setError, setGeneratedPrompt, clearError]);
174
+
175
+ const getAvailableStyles = useCallback(async (serviceType: string): Promise<string[]> => {
176
+ try {
177
+ switch (serviceType) {
178
+ case 'face-swap':
179
+ return await services.faceSwap.getAvailableStyles();
180
+ case 'style-transfer':
181
+ return await services.styleTransfer.getAvailableStyles();
182
+ default:
183
+ return [];
184
+ }
185
+ } catch (error) {
186
+ setError('Failed to load available styles');
187
+ return [];
188
+ }
189
+ }, [services, setError]);
190
+
191
+ const clearPrompt = useCallback(() => {
192
+ setGeneratedPrompt(null);
193
+ setCurrentService(null);
194
+ clearError();
195
+ }, [setGeneratedPrompt, clearError]);
196
+
197
+ const reset = useCallback(() => {
198
+ setGeneratedPrompt(null);
199
+ setCurrentService(null);
200
+ clearError();
201
+ }, [setGeneratedPrompt, clearError]);
202
+
203
+ return {
204
+ generatedPrompt,
205
+ processing,
206
+ currentService,
207
+ error,
208
+ processRequest,
209
+ getAvailableStyles,
210
+ clearPrompt,
211
+ reset,
212
+ } as UseAIServicesState & UseAIServicesActions;
213
+ };
@@ -0,0 +1,56 @@
1
+ import { useState, useCallback } from 'react';
2
+
3
+ export interface AsyncState<T> {
4
+ data: T | null;
5
+ loading: boolean;
6
+ error: string | null;
7
+ }
8
+
9
+ export interface AsyncActions<T> {
10
+ setLoading: (loading: boolean) => void;
11
+ setError: (error: string | null) => void;
12
+ setData: (data: T | null) => void;
13
+ clearError: () => void;
14
+ reset: () => void;
15
+ }
16
+
17
+ export const useAsyncState = <T>(initialData: T | null = null): AsyncState<T> & AsyncActions<T> => {
18
+ const [state, setState] = useState<AsyncState<T>>({
19
+ data: initialData,
20
+ loading: false,
21
+ error: null,
22
+ });
23
+
24
+ const setLoading = useCallback((loading: boolean) => {
25
+ setState(prev => ({ ...prev, loading }));
26
+ }, []);
27
+
28
+ const setError = useCallback((error: string | null) => {
29
+ setState(prev => ({ ...prev, error, loading: false }));
30
+ }, []);
31
+
32
+ const setData = useCallback((data: T | null) => {
33
+ setState(prev => ({ ...prev, data, loading: false, error: null }));
34
+ }, []);
35
+
36
+ const clearError = useCallback(() => {
37
+ setState(prev => ({ ...prev, error: null }));
38
+ }, []);
39
+
40
+ const reset = useCallback(() => {
41
+ setState({
42
+ data: initialData,
43
+ loading: false,
44
+ error: null,
45
+ });
46
+ }, [initialData]);
47
+
48
+ return {
49
+ ...state,
50
+ setLoading,
51
+ setError,
52
+ setData,
53
+ clearError,
54
+ reset,
55
+ };
56
+ };
@@ -0,0 +1,100 @@
1
+ import { useCallback } from 'react';
2
+ import type { FaceSwapConfig, FaceSwapGenerationResult } from '../../domain/entities/FaceSwapConfig';
3
+ import type { IFaceSwapService } from '../../domain/repositories/IAIPromptServices';
4
+ import type { ITemplateRepository } from '../../domain/repositories/ITemplateRepository';
5
+ import type { IPromptHistoryRepository } from '../../domain/repositories/IPromptHistoryRepository';
6
+ import type { GeneratedPrompt } from '../../domain/entities/GeneratedPrompt';
7
+ import { createGeneratedPrompt } from '../../domain/entities/GeneratedPrompt';
8
+ import { useAsyncState } from './useAsyncState';
9
+
10
+ export interface UseFaceSwapState {
11
+ generatedPrompt: string | null;
12
+ lastResult: FaceSwapGenerationResult | null;
13
+ }
14
+
15
+ export interface UseFaceSwapActions {
16
+ generateFaceSwapPrompt: (config: FaceSwapConfig) => Promise<void>;
17
+ getAvailableStyles: () => Promise<string[]>;
18
+ clearPrompt: () => void;
19
+ reset: () => void;
20
+ }
21
+
22
+ export const useFaceSwap = (
23
+ faceSwapService: IFaceSwapService,
24
+ templateRepository: ITemplateRepository,
25
+ historyRepository: IPromptHistoryRepository
26
+ ): UseFaceSwapState & UseFaceSwapActions => {
27
+ const {
28
+ data: lastResult,
29
+ loading,
30
+ error,
31
+ setError,
32
+ setData: setResult,
33
+ clearError,
34
+ } = useAsyncState<FaceSwapGenerationResult>(null);
35
+
36
+ const generateFaceSwapPrompt = useCallback(async (config: FaceSwapConfig): Promise<void> => {
37
+ clearError();
38
+
39
+ try {
40
+ const templateResult = await faceSwapService.generateTemplate(config);
41
+ if (!templateResult.success || !templateResult.data) {
42
+ setError(templateResult.success === false && templateResult.error === 'TEMPLATE_NOT_FOUND' ? 'Template not found' : 'Failed to generate template');
43
+ return;
44
+ }
45
+
46
+ const promptResult = await faceSwapService.generatePrompt(templateResult.data, config);
47
+ if (!promptResult.success) {
48
+ setError(promptResult.success === false && promptResult.error === 'GENERATION_FAILED' ? 'Failed to generate prompt' : 'Generation failed');
49
+ return;
50
+ }
51
+
52
+ const generatedPrompt = createGeneratedPrompt({
53
+ templateId: templateResult.data.id,
54
+ generatedText: promptResult.data,
55
+ variables: config as unknown as Record<string, unknown>,
56
+ });
57
+
58
+ await historyRepository.save(generatedPrompt);
59
+
60
+ const generationResult: FaceSwapGenerationResult = {
61
+ template: templateResult.data,
62
+ prompt: generatedPrompt,
63
+ };
64
+
65
+ setResult(generationResult);
66
+ } catch (error) {
67
+ setError('An unexpected error occurred');
68
+ }
69
+ }, [faceSwapService, historyRepository, setError, setResult, clearError]);
70
+
71
+ const getAvailableStyles = useCallback(async (): Promise<string[]> => {
72
+ try {
73
+ return await faceSwapService.getAvailableStyles();
74
+ } catch (error) {
75
+ setError('Failed to load available styles');
76
+ return [];
77
+ }
78
+ }, [faceSwapService, setError]);
79
+
80
+ const clearPrompt = useCallback(() => {
81
+ setResult(null);
82
+ clearError();
83
+ }, [setResult, clearError]);
84
+
85
+ const reset = useCallback(() => {
86
+ setResult(null);
87
+ clearError();
88
+ }, [setResult, clearError]);
89
+
90
+ return {
91
+ generatedPrompt: lastResult?.prompt.generatedText || null,
92
+ lastResult,
93
+ loading,
94
+ error,
95
+ generateFaceSwapPrompt,
96
+ getAvailableStyles,
97
+ clearPrompt,
98
+ reset,
99
+ } as UseFaceSwapState & UseFaceSwapActions;
100
+ };
@@ -0,0 +1,100 @@
1
+ import { useCallback } from 'react';
2
+ import type { ImageEnhancementConfig, EnhancementAdjustments } from '../../domain/entities/ImageEnhancementConfig';
3
+ import type { AIPromptTemplate } from '../../domain/entities/AIPromptTemplate';
4
+ import type { IImageEnhancementService } from '../../domain/repositories/IAIPromptServices';
5
+ import type { ITemplateRepository } from '../../domain/repositories/ITemplateRepository';
6
+ import type { IPromptHistoryRepository } from '../../domain/repositories/IPromptHistoryRepository';
7
+ import { createGeneratedPrompt } from '../../domain/entities/GeneratedPrompt';
8
+ import { useAsyncState } from './useAsyncState';
9
+
10
+ export interface ImageEnhancementResult {
11
+ template: AIPromptTemplate;
12
+ config: ImageEnhancementConfig;
13
+ adjustments: EnhancementAdjustments;
14
+ }
15
+
16
+ export interface UseImageEnhancementState {
17
+ generatedPrompt: string | null;
18
+ lastResult: ImageEnhancementResult | null;
19
+ adjustments: EnhancementAdjustments | null;
20
+ }
21
+
22
+ export interface UseImageEnhancementActions {
23
+ enhanceImage: (config: ImageEnhancementConfig) => Promise<void>;
24
+ calculateAdjustments: (config: ImageEnhancementConfig) => EnhancementAdjustments;
25
+ clearPrompt: () => void;
26
+ reset: () => void;
27
+ }
28
+
29
+ export const useImageEnhancement = (
30
+ service: IImageEnhancementService,
31
+ templateRepository: ITemplateRepository,
32
+ historyRepository: IPromptHistoryRepository
33
+ ): UseImageEnhancementState & UseImageEnhancementActions => {
34
+ const {
35
+ data: lastResult,
36
+ setData: setResult,
37
+ clearError,
38
+ setError,
39
+ } = useAsyncState<ImageEnhancementResult>(null);
40
+
41
+ const enhanceImage = useCallback(async (config: ImageEnhancementConfig): Promise<void> => {
42
+ clearError();
43
+
44
+ try {
45
+ const templateResult = await service.generateTemplate(config);
46
+ if (!templateResult.success || !templateResult.data) {
47
+ setError('Failed to generate template');
48
+ return;
49
+ }
50
+
51
+ const promptResult = await service.generatePrompt(templateResult.data, config);
52
+ if (!promptResult.success) {
53
+ setError('Failed to generate enhancement prompt');
54
+ return;
55
+ }
56
+
57
+ const generatedPrompt = createGeneratedPrompt({
58
+ templateId: templateResult.data.id,
59
+ generatedText: promptResult.data,
60
+ variables: {} as Record<string, unknown>,
61
+ });
62
+
63
+ await historyRepository.save(generatedPrompt);
64
+
65
+ const enhancementResult: ImageEnhancementResult = {
66
+ template: templateResult.data,
67
+ config,
68
+ adjustments: service.calculateAdjustments(config),
69
+ };
70
+
71
+ setResult(enhancementResult);
72
+ } catch {
73
+ setError('An unexpected error occurred during image enhancement');
74
+ }
75
+ }, [service, historyRepository, setError, setResult, clearError]);
76
+
77
+ const calculateAdjustments = useCallback((config: ImageEnhancementConfig): EnhancementAdjustments => {
78
+ return service.calculateAdjustments(config);
79
+ }, [service]);
80
+
81
+ const clearPrompt = useCallback(() => {
82
+ setResult(null);
83
+ clearError();
84
+ }, [setResult, clearError]);
85
+
86
+ const reset = useCallback(() => {
87
+ setResult(null);
88
+ clearError();
89
+ }, [setResult, clearError]);
90
+
91
+ return {
92
+ generatedPrompt: null,
93
+ lastResult,
94
+ adjustments: lastResult?.adjustments || null,
95
+ enhanceImage,
96
+ calculateAdjustments,
97
+ clearPrompt,
98
+ reset,
99
+ };
100
+ };
@@ -0,0 +1,100 @@
1
+ import { useCallback } from 'react';
2
+ import type { PhotoRestorationConfig } from '../../domain/entities/PhotoRestorationConfig';
3
+ import type { AIPromptTemplate } from '../../domain/entities/AIPromptTemplate';
4
+ import type { IPhotoRestorationService } from '../../domain/repositories/IAIPromptServices';
5
+ import type { ITemplateRepository } from '../../domain/repositories/ITemplateRepository';
6
+ import type { IPromptHistoryRepository } from '../../domain/repositories/IPromptHistoryRepository';
7
+ import { createGeneratedPrompt } from '../../domain/entities/GeneratedPrompt';
8
+ import { useAsyncState } from './useAsyncState';
9
+
10
+ export interface PhotoRestorationResult {
11
+ template: AIPromptTemplate;
12
+ config: PhotoRestorationConfig;
13
+ estimatedQuality: number;
14
+ }
15
+
16
+ export interface UsePhotoRestorationState {
17
+ generatedPrompt: string | null;
18
+ lastResult: PhotoRestorationResult | null;
19
+ estimatedQuality: number | null;
20
+ }
21
+
22
+ export interface UsePhotoRestorationActions {
23
+ restorePhoto: (config: PhotoRestorationConfig) => Promise<void>;
24
+ estimateQuality: (config: PhotoRestorationConfig) => number;
25
+ clearPrompt: () => void;
26
+ reset: () => void;
27
+ }
28
+
29
+ export const usePhotoRestoration = (
30
+ service: IPhotoRestorationService,
31
+ templateRepository: ITemplateRepository,
32
+ historyRepository: IPromptHistoryRepository
33
+ ): UsePhotoRestorationState & UsePhotoRestorationActions => {
34
+ const {
35
+ data: lastResult,
36
+ setData: setResult,
37
+ clearError,
38
+ setError,
39
+ } = useAsyncState<PhotoRestorationResult>(null);
40
+
41
+ const restorePhoto = useCallback(async (config: PhotoRestorationConfig): Promise<void> => {
42
+ clearError();
43
+
44
+ try {
45
+ const templateResult = await service.generateTemplate(config);
46
+ if (!templateResult.success || !templateResult.data) {
47
+ setError('Failed to generate template');
48
+ return;
49
+ }
50
+
51
+ const promptResult = await service.generatePrompt(templateResult.data, config);
52
+ if (!promptResult.success) {
53
+ setError('Failed to generate restoration prompt');
54
+ return;
55
+ }
56
+
57
+ const generatedPrompt = createGeneratedPrompt({
58
+ templateId: templateResult.data.id,
59
+ generatedText: promptResult.data,
60
+ variables: {} as Record<string, unknown>,
61
+ });
62
+
63
+ await historyRepository.save(generatedPrompt);
64
+
65
+ const restorationResult: PhotoRestorationResult = {
66
+ template: templateResult.data,
67
+ config,
68
+ estimatedQuality: service.estimateQuality(config),
69
+ };
70
+
71
+ setResult(restorationResult);
72
+ } catch {
73
+ setError('An unexpected error occurred during photo restoration');
74
+ }
75
+ }, [service, historyRepository, setError, setResult, clearError]);
76
+
77
+ const estimateQuality = useCallback((config: PhotoRestorationConfig): number => {
78
+ return service.estimateQuality(config);
79
+ }, [service]);
80
+
81
+ const clearPrompt = useCallback(() => {
82
+ setResult(null);
83
+ clearError();
84
+ }, [setResult, clearError]);
85
+
86
+ const reset = useCallback(() => {
87
+ setResult(null);
88
+ clearError();
89
+ }, [setResult, clearError]);
90
+
91
+ return {
92
+ generatedPrompt: null,
93
+ lastResult,
94
+ estimatedQuality: lastResult?.estimatedQuality || null,
95
+ restorePhoto,
96
+ estimateQuality,
97
+ clearPrompt,
98
+ reset,
99
+ };
100
+ };