@umituz/react-native-ai-generation-content 1.10.1 → 1.10.4
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.
package/package.json
CHANGED
package/src/index.ts
CHANGED
|
@@ -157,6 +157,7 @@ export {
|
|
|
157
157
|
useGeneration,
|
|
158
158
|
usePendingJobs,
|
|
159
159
|
useBackgroundGeneration,
|
|
160
|
+
usePhotoGeneration,
|
|
160
161
|
} from "./presentation/hooks";
|
|
161
162
|
|
|
162
163
|
export type {
|
|
@@ -167,6 +168,13 @@ export type {
|
|
|
167
168
|
UseBackgroundGenerationOptions,
|
|
168
169
|
UseBackgroundGenerationReturn,
|
|
169
170
|
DirectExecutionResult,
|
|
171
|
+
UsePhotoGenerationReturn,
|
|
172
|
+
PhotoGenerationInput,
|
|
173
|
+
PhotoGenerationResult,
|
|
174
|
+
PhotoGenerationError,
|
|
175
|
+
PhotoGenerationConfig,
|
|
176
|
+
PhotoGenerationState,
|
|
177
|
+
PhotoGenerationStatus,
|
|
170
178
|
} from "./presentation/hooks";
|
|
171
179
|
|
|
172
180
|
// =============================================================================
|
|
@@ -180,6 +188,11 @@ export {
|
|
|
180
188
|
PendingJobCard,
|
|
181
189
|
PendingJobProgressBar,
|
|
182
190
|
PendingJobCardActions,
|
|
191
|
+
GenerationResultContent,
|
|
192
|
+
ResultHeader,
|
|
193
|
+
ResultImageCard,
|
|
194
|
+
ResultStoryCard,
|
|
195
|
+
ResultActions,
|
|
183
196
|
} from "./presentation/components";
|
|
184
197
|
|
|
185
198
|
export type {
|
|
@@ -191,4 +204,10 @@ export type {
|
|
|
191
204
|
StatusLabels,
|
|
192
205
|
PendingJobProgressBarProps,
|
|
193
206
|
PendingJobCardActionsProps,
|
|
207
|
+
GenerationResultData,
|
|
208
|
+
GenerationResultContentProps,
|
|
209
|
+
ResultHeaderProps,
|
|
210
|
+
ResultImageCardProps,
|
|
211
|
+
ResultStoryCardProps,
|
|
212
|
+
ResultActionsProps,
|
|
194
213
|
} from "./presentation/components";
|
|
@@ -20,3 +20,17 @@ export type {
|
|
|
20
20
|
UseBackgroundGenerationReturn,
|
|
21
21
|
DirectExecutionResult,
|
|
22
22
|
} from "./use-background-generation";
|
|
23
|
+
|
|
24
|
+
export { usePhotoGeneration } from "./usePhotoGeneration";
|
|
25
|
+
export type {
|
|
26
|
+
UsePhotoGenerationReturn,
|
|
27
|
+
} from "./usePhotoGeneration";
|
|
28
|
+
|
|
29
|
+
export type {
|
|
30
|
+
PhotoGenerationInput,
|
|
31
|
+
PhotoGenerationResult,
|
|
32
|
+
PhotoGenerationError,
|
|
33
|
+
PhotoGenerationConfig,
|
|
34
|
+
PhotoGenerationState,
|
|
35
|
+
PhotoGenerationStatus,
|
|
36
|
+
} from "./photo-generation.types";
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Photo Generation Types
|
|
3
|
+
* Generic types for photo-based AI generation workflows
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
export interface PhotoGenerationInput<TMetadata = any> {
|
|
7
|
+
photos: Array<{ uri: string; base64: string }>;
|
|
8
|
+
metadata?: TMetadata;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export interface PhotoGenerationResult<TResult = any> {
|
|
12
|
+
success: boolean;
|
|
13
|
+
data?: TResult;
|
|
14
|
+
error?: PhotoGenerationError;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export interface PhotoGenerationError {
|
|
18
|
+
type: "timeout" | "policy_violation" | "save_failed" | "credit_failed" | "unknown";
|
|
19
|
+
message: string;
|
|
20
|
+
originalError?: Error;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export interface PhotoGenerationConfig<TInput, TResult, TSaveInput> {
|
|
24
|
+
generate: (input: TInput) => Promise<TResult>;
|
|
25
|
+
save?: (result: TResult, input: TInput) => Promise<TSaveInput>;
|
|
26
|
+
checkCredits?: () => Promise<boolean>;
|
|
27
|
+
deductCredits?: () => Promise<void>;
|
|
28
|
+
timeout?: number;
|
|
29
|
+
onSuccess?: (result: TResult) => void;
|
|
30
|
+
onError?: (error: PhotoGenerationError) => void;
|
|
31
|
+
onSaveComplete?: (saveResult: TSaveInput) => void;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export interface PhotoGenerationState<TResult = any> {
|
|
35
|
+
isGenerating: boolean;
|
|
36
|
+
result: TResult | null;
|
|
37
|
+
error: PhotoGenerationError | null;
|
|
38
|
+
progress: number;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export type PhotoGenerationStatus = "idle" | "validating" | "generating" | "saving" | "success" | "error";
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* usePhotoGeneration Hook
|
|
3
|
+
* Generic hook for photo-based AI generation workflows
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { useState, useCallback, useRef } from "react";
|
|
7
|
+
import type {
|
|
8
|
+
PhotoGenerationConfig,
|
|
9
|
+
PhotoGenerationState,
|
|
10
|
+
PhotoGenerationError,
|
|
11
|
+
PhotoGenerationStatus,
|
|
12
|
+
} from "./photo-generation.types";
|
|
13
|
+
|
|
14
|
+
const DEFAULT_TIMEOUT = 60000;
|
|
15
|
+
|
|
16
|
+
export interface UsePhotoGenerationReturn<TResult> extends PhotoGenerationState<TResult> {
|
|
17
|
+
generate: <TInput>(input: TInput) => Promise<void>;
|
|
18
|
+
reset: () => void;
|
|
19
|
+
status: PhotoGenerationStatus;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export const usePhotoGeneration = <TInput, TResult, TSaveInput = any>(
|
|
23
|
+
config: PhotoGenerationConfig<TInput, TResult, TSaveInput>,
|
|
24
|
+
): UsePhotoGenerationReturn<TResult> => {
|
|
25
|
+
const {
|
|
26
|
+
generate: generateFn,
|
|
27
|
+
save: saveFn,
|
|
28
|
+
checkCredits,
|
|
29
|
+
deductCredits,
|
|
30
|
+
timeout = DEFAULT_TIMEOUT,
|
|
31
|
+
onSuccess,
|
|
32
|
+
onError,
|
|
33
|
+
onSaveComplete,
|
|
34
|
+
} = config;
|
|
35
|
+
|
|
36
|
+
const [state, setState] = useState<PhotoGenerationState<TResult>>({
|
|
37
|
+
isGenerating: false,
|
|
38
|
+
result: null,
|
|
39
|
+
error: null,
|
|
40
|
+
progress: 0,
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
const [status, setStatus] = useState<PhotoGenerationStatus>("idle");
|
|
44
|
+
const isGeneratingRef = useRef(false);
|
|
45
|
+
|
|
46
|
+
const createError = useCallback(
|
|
47
|
+
(
|
|
48
|
+
type: PhotoGenerationError["type"],
|
|
49
|
+
message: string,
|
|
50
|
+
originalError?: Error,
|
|
51
|
+
): PhotoGenerationError => ({
|
|
52
|
+
type,
|
|
53
|
+
message,
|
|
54
|
+
originalError,
|
|
55
|
+
}),
|
|
56
|
+
[],
|
|
57
|
+
);
|
|
58
|
+
|
|
59
|
+
const generate = useCallback(
|
|
60
|
+
async (input: TInput) => {
|
|
61
|
+
if (isGeneratingRef.current) {
|
|
62
|
+
if (__DEV__) console.warn("[usePhotoGeneration] Generation already in progress");
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
isGeneratingRef.current = true;
|
|
67
|
+
setState({ isGenerating: true, result: null, error: null, progress: 0 });
|
|
68
|
+
setStatus("validating");
|
|
69
|
+
|
|
70
|
+
try {
|
|
71
|
+
if (checkCredits) {
|
|
72
|
+
const hasCredits = await checkCredits();
|
|
73
|
+
if (!hasCredits) {
|
|
74
|
+
throw createError("credit_failed", "Insufficient credits");
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
setStatus("generating");
|
|
79
|
+
setState((prev) => ({ ...prev, progress: 20 }));
|
|
80
|
+
|
|
81
|
+
const timeoutPromise = new Promise<never>((_, reject) =>
|
|
82
|
+
setTimeout(() => reject(new Error("Generation timeout")), timeout),
|
|
83
|
+
);
|
|
84
|
+
|
|
85
|
+
const result = await Promise.race([generateFn(input), timeoutPromise]);
|
|
86
|
+
|
|
87
|
+
setState((prev) => ({ ...prev, progress: 60 }));
|
|
88
|
+
|
|
89
|
+
if (saveFn) {
|
|
90
|
+
setStatus("saving");
|
|
91
|
+
try {
|
|
92
|
+
const saveResult = await saveFn(result, input);
|
|
93
|
+
onSaveComplete?.(saveResult);
|
|
94
|
+
} catch (saveError) {
|
|
95
|
+
throw createError(
|
|
96
|
+
"save_failed",
|
|
97
|
+
"Failed to save result",
|
|
98
|
+
saveError as Error,
|
|
99
|
+
);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
setState((prev) => ({ ...prev, progress: 80 }));
|
|
104
|
+
|
|
105
|
+
if (deductCredits) {
|
|
106
|
+
try {
|
|
107
|
+
await deductCredits();
|
|
108
|
+
} catch (deductError) {
|
|
109
|
+
if (__DEV__)
|
|
110
|
+
console.error("[usePhotoGeneration] Credit deduction failed", deductError);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
setState({
|
|
115
|
+
isGenerating: false,
|
|
116
|
+
result,
|
|
117
|
+
error: null,
|
|
118
|
+
progress: 100,
|
|
119
|
+
});
|
|
120
|
+
setStatus("success");
|
|
121
|
+
onSuccess?.(result);
|
|
122
|
+
} catch (error: any) {
|
|
123
|
+
const generationError =
|
|
124
|
+
error.type
|
|
125
|
+
? error
|
|
126
|
+
: error.message === "Generation timeout"
|
|
127
|
+
? createError("timeout", "Generation timed out", error)
|
|
128
|
+
: error.name === "ContentPolicyViolationError"
|
|
129
|
+
? createError("policy_violation", "Content policy violation", error)
|
|
130
|
+
: createError("unknown", error.message || "Generation failed", error);
|
|
131
|
+
|
|
132
|
+
setState({
|
|
133
|
+
isGenerating: false,
|
|
134
|
+
result: null,
|
|
135
|
+
error: generationError,
|
|
136
|
+
progress: 0,
|
|
137
|
+
});
|
|
138
|
+
setStatus("error");
|
|
139
|
+
onError?.(generationError);
|
|
140
|
+
} finally {
|
|
141
|
+
isGeneratingRef.current = false;
|
|
142
|
+
}
|
|
143
|
+
},
|
|
144
|
+
[
|
|
145
|
+
generateFn,
|
|
146
|
+
saveFn,
|
|
147
|
+
checkCredits,
|
|
148
|
+
deductCredits,
|
|
149
|
+
timeout,
|
|
150
|
+
onSuccess,
|
|
151
|
+
onError,
|
|
152
|
+
onSaveComplete,
|
|
153
|
+
createError,
|
|
154
|
+
],
|
|
155
|
+
);
|
|
156
|
+
|
|
157
|
+
const reset = useCallback(() => {
|
|
158
|
+
setState({ isGenerating: false, result: null, error: null, progress: 0 });
|
|
159
|
+
setStatus("idle");
|
|
160
|
+
isGeneratingRef.current = false;
|
|
161
|
+
}, []);
|
|
162
|
+
|
|
163
|
+
return {
|
|
164
|
+
...state,
|
|
165
|
+
generate,
|
|
166
|
+
reset,
|
|
167
|
+
status,
|
|
168
|
+
};
|
|
169
|
+
};
|