@umituz/react-native-ai-generation-content 1.26.2 → 1.26.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 +3 -2
- package/src/domains/generation/application/feature-registry.ts +101 -0
- package/src/domains/generation/application/generation-strategy.factory.ts +128 -0
- package/src/domains/generation/domain/feature-config.types.ts +61 -0
- package/src/domains/generation/domain/generation.types.ts +74 -0
- package/src/domains/generation/index.ts +37 -0
- package/src/domains/generation/presentation/useAIGeneration.hook.ts +106 -0
- package/src/domains/wizard/infrastructure/strategies/wizard-strategy.factory.ts +3 -4
- package/src/index.ts +1 -25
- package/src/infrastructure/executors/executor-factory.ts +53 -0
- package/src/infrastructure/executors/image-executor.ts +133 -0
- package/src/infrastructure/executors/video-executor.ts +130 -0
- package/src/features/ai-hug/README.md +0 -438
- package/src/features/ai-hug/domain/index.ts +0 -5
- package/src/features/ai-hug/domain/types/ai-hug.types.ts +0 -25
- package/src/features/ai-hug/domain/types/index.ts +0 -7
- package/src/features/ai-hug/index.ts +0 -19
- package/src/features/ai-hug/presentation/components/AIHugFeature.tsx +0 -77
- package/src/features/ai-hug/presentation/components/index.ts +0 -2
- package/src/features/ai-hug/presentation/hooks/index.ts +0 -9
- package/src/features/ai-hug/presentation/hooks/useAIHugFeature.ts +0 -34
- package/src/features/ai-hug/presentation/index.ts +0 -6
- package/src/features/ai-kiss/README.md +0 -445
- package/src/features/ai-kiss/domain/index.ts +0 -5
- package/src/features/ai-kiss/domain/types/ai-kiss.types.ts +0 -25
- package/src/features/ai-kiss/domain/types/index.ts +0 -7
- package/src/features/ai-kiss/index.ts +0 -19
- package/src/features/ai-kiss/presentation/components/AIKissFeature.tsx +0 -77
- package/src/features/ai-kiss/presentation/components/index.ts +0 -2
- package/src/features/ai-kiss/presentation/hooks/index.ts +0 -9
- package/src/features/ai-kiss/presentation/hooks/useAIKissFeature.ts +0 -34
- package/src/features/ai-kiss/presentation/index.ts +0 -6
- package/src/features/anime-selfie/README.md +0 -396
- package/src/features/anime-selfie/domain/index.ts +0 -5
- package/src/features/anime-selfie/domain/types/anime-selfie.types.ts +0 -52
- package/src/features/anime-selfie/domain/types/index.ts +0 -8
- package/src/features/anime-selfie/index.ts +0 -20
- package/src/features/anime-selfie/presentation/components/AnimeSelfieFeature.tsx +0 -86
- package/src/features/anime-selfie/presentation/components/index.ts +0 -2
- package/src/features/anime-selfie/presentation/hooks/index.ts +0 -9
- package/src/features/anime-selfie/presentation/hooks/useAnimeSelfieFeature.ts +0 -59
- package/src/features/anime-selfie/presentation/index.ts +0 -6
- package/src/features/couple-future/README.md +0 -445
- package/src/features/couple-future/domain/types.ts +0 -63
- package/src/features/couple-future/domain/wizard-config.adapter.ts +0 -76
- package/src/features/couple-future/domain/wizard.types.ts +0 -121
- package/src/features/couple-future/index.ts +0 -83
- package/src/features/couple-future/infrastructure/coupleFeatureRegistry.ts +0 -76
- package/src/features/couple-future/infrastructure/couplePromptEnhancer.ts +0 -100
- package/src/features/couple-future/infrastructure/executor.ts +0 -188
- package/src/features/couple-future/infrastructure/generationUtils.ts +0 -228
- package/src/features/couple-future/presentation/components/ArtStyleSelector.tsx +0 -146
- package/src/features/couple-future/presentation/components/ArtistStyleSelector.tsx +0 -122
- package/src/features/couple-future/presentation/components/CoupleFutureWizard.tsx +0 -239
- package/src/features/couple-future/presentation/components/GeneratingStepContent.tsx +0 -86
- package/src/features/couple-future/presentation/components/RomanticMoodSelector.tsx +0 -147
- package/src/features/couple-future/presentation/components/WardrobeSelector.tsx +0 -141
- package/src/features/couple-future/presentation/components/index.ts +0 -12
- package/src/features/couple-future/presentation/hooks/useCoupleFutureFlow.ts +0 -166
- package/src/features/couple-future/presentation/hooks/useCoupleFutureFlow.types.ts +0 -69
- package/src/features/couple-future/presentation/hooks/useCoupleFutureHandlers.ts +0 -117
- package/src/features/couple-future/presentation/screens/CoupleFeatureScreen.tsx +0 -113
- package/src/features/face-swap/README.md +0 -431
- package/src/features/face-swap/domain/index.ts +0 -5
- package/src/features/face-swap/domain/types/face-swap.types.ts +0 -26
- package/src/features/face-swap/domain/types/index.ts +0 -7
- package/src/features/face-swap/index.ts +0 -19
- package/src/features/face-swap/presentation/components/FaceSwapFeature.tsx +0 -87
- package/src/features/face-swap/presentation/components/index.ts +0 -2
- package/src/features/face-swap/presentation/hooks/index.ts +0 -6
- package/src/features/face-swap/presentation/hooks/useFaceSwapFeature.ts +0 -35
- package/src/features/face-swap/presentation/index.ts +0 -6
- package/src/features/hd-touch-up/README.md +0 -396
- package/src/features/hd-touch-up/domain/index.ts +0 -1
- package/src/features/hd-touch-up/domain/types/hd-touch-up.types.ts +0 -62
- package/src/features/hd-touch-up/domain/types/index.ts +0 -9
- package/src/features/hd-touch-up/index.ts +0 -21
- package/src/features/hd-touch-up/presentation/components/HDTouchUpFeature.tsx +0 -86
- package/src/features/hd-touch-up/presentation/components/index.ts +0 -2
- package/src/features/hd-touch-up/presentation/hooks/index.ts +0 -1
- package/src/features/hd-touch-up/presentation/hooks/useHDTouchUpFeature.ts +0 -23
- package/src/features/hd-touch-up/presentation/index.ts +0 -2
- package/src/features/image-to-image/README.md +0 -459
- package/src/features/image-to-image/domain/index.ts +0 -1
- package/src/features/image-to-image/domain/types/base.types.ts +0 -48
- package/src/features/image-to-image/domain/types/index.ts +0 -1
- package/src/features/image-to-image/domain/types/partials/config.types.ts +0 -37
- package/src/features/image-to-image/domain/types/partials/hook.types.ts +0 -53
- package/src/features/image-to-image/domain/types/partials/metadata.types.ts +0 -32
- package/src/features/image-to-image/domain/types/partials/result.types.ts +0 -44
- package/src/features/image-to-image/domain/types/partials/state.types.ts +0 -34
- package/src/features/image-to-image/domain/types/partials/translation.types.ts +0 -57
- package/src/features/image-to-image/index.ts +0 -2
- package/src/features/image-to-image/presentation/hooks/index.ts +0 -3
- package/src/features/image-to-image/presentation/hooks/useDualImageFeature.ts +0 -204
- package/src/features/image-to-image/presentation/hooks/useImageWithPromptFeature.ts +0 -223
- package/src/features/image-to-image/presentation/hooks/useSingleImageFeature.ts +0 -166
- package/src/features/image-to-image/presentation/index.ts +0 -1
- package/src/features/image-to-video/README.md +0 -414
- package/src/features/image-to-video/domain/constants/animation.constants.ts +0 -47
- package/src/features/image-to-video/domain/constants/duration.constants.ts +0 -13
- package/src/features/image-to-video/domain/constants/form.constants.ts +0 -22
- package/src/features/image-to-video/domain/constants/index.ts +0 -23
- package/src/features/image-to-video/domain/constants/music.constants.ts +0 -53
- package/src/features/image-to-video/domain/index.ts +0 -5
- package/src/features/image-to-video/domain/types/animation.types.ts +0 -20
- package/src/features/image-to-video/domain/types/config.types.ts +0 -56
- package/src/features/image-to-video/domain/types/duration.types.ts +0 -11
- package/src/features/image-to-video/domain/types/form.types.ts +0 -35
- package/src/features/image-to-video/domain/types/image-to-video.types.ts +0 -122
- package/src/features/image-to-video/domain/types/index.ts +0 -39
- package/src/features/image-to-video/domain/types/music.types.ts +0 -21
- package/src/features/image-to-video/index.ts +0 -116
- package/src/features/image-to-video/infrastructure/index.ts +0 -1
- package/src/features/image-to-video/infrastructure/services/image-to-video-executor.ts +0 -154
- package/src/features/image-to-video/infrastructure/services/index.ts +0 -5
- package/src/features/image-to-video/presentation/components/AddMoreCard.tsx +0 -52
- package/src/features/image-to-video/presentation/components/AnimationStyleSelector.tsx +0 -135
- package/src/features/image-to-video/presentation/components/DurationSelector.tsx +0 -110
- package/src/features/image-to-video/presentation/components/EmptyGridState.tsx +0 -69
- package/src/features/image-to-video/presentation/components/GridImageItem.tsx +0 -64
- package/src/features/image-to-video/presentation/components/ImageSelectionGrid.styles.ts +0 -84
- package/src/features/image-to-video/presentation/components/ImageSelectionGrid.tsx +0 -77
- package/src/features/image-to-video/presentation/components/ImageSelectionGrid.types.ts +0 -18
- package/src/features/image-to-video/presentation/components/MusicMoodSelector.tsx +0 -181
- package/src/features/image-to-video/presentation/components/index.ts +0 -30
- package/src/features/image-to-video/presentation/hooks/index.ts +0 -27
- package/src/features/image-to-video/presentation/hooks/useFormState.ts +0 -116
- package/src/features/image-to-video/presentation/hooks/useGeneration.ts +0 -85
- package/src/features/image-to-video/presentation/hooks/useGenerationExecution.ts +0 -143
- package/src/features/image-to-video/presentation/hooks/useImageToVideoFeature.ts +0 -107
- package/src/features/image-to-video/presentation/hooks/useImageToVideoForm.ts +0 -119
- package/src/features/image-to-video/presentation/hooks/useImageToVideoValidation.ts +0 -46
- package/src/features/image-to-video/presentation/index.ts +0 -5
- package/src/features/love-message/domain/constants.ts +0 -162
- package/src/features/love-message/domain/types.ts +0 -58
- package/src/features/love-message/index.ts +0 -37
- package/src/features/love-message/infrastructure/persistence/PartnerProfileRepository.ts +0 -52
- package/src/features/love-message/infrastructure/prompts/messagePromptBuilder.ts +0 -109
- package/src/features/love-message/infrastructure/services/LoveMessageService.ts +0 -35
- package/src/features/love-message/presentation/components/CategoryGrid.tsx +0 -88
- package/src/features/love-message/presentation/components/DetailsInput.tsx +0 -74
- package/src/features/love-message/presentation/components/ExploreHeader.tsx +0 -67
- package/src/features/love-message/presentation/components/FieldInput.tsx +0 -83
- package/src/features/love-message/presentation/components/GeneratorHeader.tsx +0 -88
- package/src/features/love-message/presentation/components/LoveMessageHeroSection.tsx +0 -114
- package/src/features/love-message/presentation/components/MessageListItem.tsx +0 -77
- package/src/features/love-message/presentation/components/MessageResult.tsx +0 -105
- package/src/features/love-message/presentation/components/PartnerInput.tsx +0 -78
- package/src/features/love-message/presentation/components/ProgressDots.tsx +0 -48
- package/src/features/love-message/presentation/components/StepDetails.tsx +0 -23
- package/src/features/love-message/presentation/components/StepPartner.tsx +0 -116
- package/src/features/love-message/presentation/components/StepVibe.tsx +0 -30
- package/src/features/love-message/presentation/components/ToneSelector.tsx +0 -100
- package/src/features/love-message/presentation/components/TrendingSection.tsx +0 -130
- package/src/features/love-message/presentation/components/TypeSelector.tsx +0 -99
- package/src/features/love-message/presentation/hooks/useLoveMessageGenerator.ts +0 -114
- package/src/features/love-message/presentation/hooks/usePartnerProfile.ts +0 -43
- package/src/features/love-message/presentation/navigation/LoveMessageStack.tsx +0 -39
- package/src/features/love-message/presentation/screens/LoveMessageExploreScreen.tsx +0 -53
- package/src/features/love-message/presentation/screens/LoveMessageGeneratorScreen.tsx +0 -169
- package/src/features/love-message/presentation/screens/MessageListScreen.tsx +0 -127
- package/src/features/love-message/presentation/screens/PartnerProfileScreen.tsx +0 -119
- package/src/features/meme-generator/README.md +0 -408
- package/src/features/meme-generator/index.ts +0 -3
- package/src/features/meme-generator/infrastructure/services/MemeGenerationService.ts +0 -87
- package/src/features/meme-generator/presentation/components/MemeGeneratorFeature.tsx +0 -180
- package/src/features/meme-generator/presentation/components/index.ts +0 -2
- package/src/features/meme-generator/presentation/screens/MemeGeneratorScreen.tsx +0 -168
- package/src/features/meme-generator/presentation/screens/index.ts +0 -1
- package/src/features/partner-upload/domain/types.ts +0 -59
- package/src/features/partner-upload/index.ts +0 -30
- package/src/features/partner-upload/presentation/components/PartnerInfoInput.tsx +0 -112
- package/src/features/partner-upload/presentation/components/PhotoTips.tsx +0 -53
- package/src/features/partner-upload/presentation/components/index.ts +0 -4
- package/src/features/partner-upload/presentation/hooks/index.ts +0 -7
- package/src/features/partner-upload/presentation/hooks/usePartnerStep.ts +0 -130
- package/src/features/partner-upload/presentation/screens/PartnerStepScreen.tsx +0 -231
- package/src/features/partner-upload/presentation/screens/index.ts +0 -6
- package/src/features/photo-restoration/README.md +0 -399
- package/src/features/photo-restoration/domain/index.ts +0 -1
- package/src/features/photo-restoration/domain/types/index.ts +0 -9
- package/src/features/photo-restoration/domain/types/photo-restore.types.ts +0 -64
- package/src/features/photo-restoration/index.ts +0 -22
- package/src/features/photo-restoration/presentation/components/PhotoRestoreFeature.tsx +0 -88
- package/src/features/photo-restoration/presentation/components/PhotoRestoreResultView.tsx +0 -86
- package/src/features/photo-restoration/presentation/components/index.ts +0 -4
- package/src/features/photo-restoration/presentation/hooks/index.ts +0 -1
- package/src/features/photo-restoration/presentation/hooks/usePhotoRestoreFeature.ts +0 -23
- package/src/features/photo-restoration/presentation/index.ts +0 -2
- package/src/features/remove-background/README.md +0 -393
- package/src/features/remove-background/domain/index.ts +0 -5
- package/src/features/remove-background/domain/types/index.ts +0 -7
- package/src/features/remove-background/domain/types/remove-background.types.ts +0 -28
- package/src/features/remove-background/index.ts +0 -19
- package/src/features/remove-background/presentation/components/RemoveBackgroundFeature.tsx +0 -86
- package/src/features/remove-background/presentation/components/index.ts +0 -2
- package/src/features/remove-background/presentation/hooks/index.ts +0 -1
- package/src/features/remove-background/presentation/hooks/useRemoveBackgroundFeature.ts +0 -28
- package/src/features/remove-background/presentation/index.ts +0 -6
- package/src/features/remove-object/README.md +0 -405
- package/src/features/remove-object/domain/index.ts +0 -5
- package/src/features/remove-object/domain/types/index.ts +0 -7
- package/src/features/remove-object/domain/types/remove-object.types.ts +0 -54
- package/src/features/remove-object/index.ts +0 -23
- package/src/features/remove-object/presentation/components/RemoveObjectFeature.tsx +0 -136
- package/src/features/remove-object/presentation/components/index.ts +0 -2
- package/src/features/remove-object/presentation/hooks/index.ts +0 -9
- package/src/features/remove-object/presentation/hooks/useRemoveObjectFeature.ts +0 -221
- package/src/features/remove-object/presentation/index.ts +0 -6
- package/src/features/replace-background/README.md +0 -405
- package/src/features/replace-background/domain/types/index.ts +0 -7
- package/src/features/replace-background/domain/types/replace-background.types.ts +0 -33
- package/src/features/replace-background/index.ts +0 -23
- package/src/features/replace-background/presentation/components/ReplaceBackgroundFeature.tsx +0 -105
- package/src/features/replace-background/presentation/components/index.ts +0 -6
- package/src/features/replace-background/presentation/hooks/index.ts +0 -9
- package/src/features/replace-background/presentation/hooks/useReplaceBackgroundFeature.ts +0 -55
- package/src/features/scenarios/domain/types.ts +0 -147
- package/src/features/scenarios/index.ts +0 -64
- package/src/features/scenarios/presentation/components/InspirationChips.tsx +0 -82
- package/src/features/scenarios/presentation/components/MagicPromptHeadline.tsx +0 -79
- package/src/features/scenarios/presentation/components/ScenarioGrid.tsx +0 -224
- package/src/features/scenarios/presentation/components/ScenarioHeader.tsx +0 -55
- package/src/features/scenarios/presentation/components/StyleSelector.tsx +0 -119
- package/src/features/scenarios/presentation/components/index.ts +0 -18
- package/src/features/scenarios/presentation/containers/CategoryNavigationContainer.tsx +0 -178
- package/src/features/scenarios/presentation/screens/HierarchicalScenarioListScreen.tsx +0 -266
- package/src/features/scenarios/presentation/screens/MagicPromptScreen.tsx +0 -242
- package/src/features/scenarios/presentation/screens/MainCategoryScreen.tsx +0 -198
- package/src/features/scenarios/presentation/screens/ScenarioPreviewScreen.tsx +0 -164
- package/src/features/scenarios/presentation/screens/ScenarioSelectorScreen.tsx +0 -66
- package/src/features/scenarios/presentation/screens/SubCategoryScreen.tsx +0 -216
- package/src/features/script-generator/README.md +0 -433
- package/src/features/script-generator/domain/constants/index.ts +0 -10
- package/src/features/script-generator/domain/types/script.types.ts +0 -30
- package/src/features/script-generator/index.ts +0 -5
- package/src/features/script-generator/infrastructure/services/ScriptGenerationService.ts +0 -62
- package/src/features/script-generator/presentation/components/ScriptDisplay.tsx +0 -158
- package/src/features/script-generator/presentation/components/VideoTypeSelector.tsx +0 -102
- package/src/features/script-generator/presentation/components/index.ts +0 -2
- package/src/features/script-generator/presentation/hooks/index.ts +0 -1
- package/src/features/script-generator/presentation/hooks/useScriptGenerator.ts +0 -77
- package/src/features/shared/README.md +0 -311
- package/src/features/shared/dual-image-video/domain/types/dual-image-video.types.ts +0 -88
- package/src/features/shared/dual-image-video/domain/types/index.ts +0 -14
- package/src/features/shared/dual-image-video/index.ts +0 -17
- package/src/features/shared/dual-image-video/presentation/hooks/index.ts +0 -5
- package/src/features/shared/dual-image-video/presentation/hooks/useDualImageVideoFeature.ts +0 -185
- package/src/features/shared/index.ts +0 -6
- package/src/features/text-to-image/README.md +0 -394
- package/src/features/text-to-image/domain/constants/index.ts +0 -8
- package/src/features/text-to-image/domain/constants/options.constants.ts +0 -39
- package/src/features/text-to-image/domain/constants/styles.constants.ts +0 -34
- package/src/features/text-to-image/domain/index.ts +0 -7
- package/src/features/text-to-image/domain/types/config.types.ts +0 -75
- package/src/features/text-to-image/domain/types/form.types.ts +0 -58
- package/src/features/text-to-image/domain/types/index.ts +0 -38
- package/src/features/text-to-image/domain/types/text-to-image.types.ts +0 -58
- package/src/features/text-to-image/index.ts +0 -116
- package/src/features/text-to-image/infrastructure/index.ts +0 -1
- package/src/features/text-to-image/infrastructure/services/index.ts +0 -5
- package/src/features/text-to-image/infrastructure/services/text-to-image-executor.ts +0 -147
- package/src/features/text-to-image/presentation/components/index.ts +0 -30
- package/src/features/text-to-image/presentation/hooks/index.ts +0 -30
- package/src/features/text-to-image/presentation/hooks/useFormState.ts +0 -103
- package/src/features/text-to-image/presentation/hooks/useGeneration.ts +0 -139
- package/src/features/text-to-image/presentation/hooks/useTextToImageFeature.ts +0 -111
- package/src/features/text-to-image/presentation/hooks/useTextToImageForm.ts +0 -58
- package/src/features/text-to-image/presentation/index.ts +0 -7
- package/src/features/text-to-video/README.md +0 -412
- package/src/features/text-to-video/domain/index.ts +0 -1
- package/src/features/text-to-video/domain/types/callback.types.ts +0 -69
- package/src/features/text-to-video/domain/types/component.types.ts +0 -106
- package/src/features/text-to-video/domain/types/config.types.ts +0 -61
- package/src/features/text-to-video/domain/types/index.ts +0 -56
- package/src/features/text-to-video/domain/types/request.types.ts +0 -36
- package/src/features/text-to-video/domain/types/state.types.ts +0 -53
- package/src/features/text-to-video/index.ts +0 -68
- package/src/features/text-to-video/infrastructure/index.ts +0 -1
- package/src/features/text-to-video/infrastructure/services/index.ts +0 -5
- package/src/features/text-to-video/infrastructure/services/text-to-video-executor.ts +0 -141
- package/src/features/text-to-video/presentation/components/FrameSelector.tsx +0 -153
- package/src/features/text-to-video/presentation/components/GenerationTabs.tsx +0 -73
- package/src/features/text-to-video/presentation/components/HeroSection.tsx +0 -61
- package/src/features/text-to-video/presentation/components/HintCarousel.tsx +0 -96
- package/src/features/text-to-video/presentation/components/OptionsPanel.tsx +0 -121
- package/src/features/text-to-video/presentation/components/index.ts +0 -10
- package/src/features/text-to-video/presentation/hooks/index.ts +0 -17
- package/src/features/text-to-video/presentation/hooks/useTextToVideoFeature.ts +0 -225
- package/src/features/text-to-video/presentation/hooks/useTextToVideoForm.ts +0 -134
- package/src/features/text-to-video/presentation/index.ts +0 -7
- package/src/features/text-to-voice/README.md +0 -445
- package/src/features/text-to-voice/domain/index.ts +0 -1
- package/src/features/text-to-voice/domain/types/component.types.ts +0 -91
- package/src/features/text-to-voice/domain/types/config.types.ts +0 -34
- package/src/features/text-to-voice/domain/types/form.types.ts +0 -39
- package/src/features/text-to-voice/domain/types/generation.types.ts +0 -43
- package/src/features/text-to-voice/domain/types/index.ts +0 -38
- package/src/features/text-to-voice/index.ts +0 -53
- package/src/features/text-to-voice/infrastructure/index.ts +0 -1
- package/src/features/text-to-voice/infrastructure/services/index.ts +0 -4
- package/src/features/text-to-voice/infrastructure/services/text-to-voice-executor.ts +0 -103
- package/src/features/text-to-voice/presentation/components/TextToVoiceAudioPlayer.tsx +0 -81
- package/src/features/text-to-voice/presentation/components/index.ts +0 -7
- package/src/features/text-to-voice/presentation/hooks/index.ts +0 -6
- package/src/features/text-to-voice/presentation/hooks/useTextToVoiceForm.ts +0 -91
- package/src/features/text-to-voice/presentation/hooks/useTextToVoiceGeneration.ts +0 -116
- package/src/features/text-to-voice/presentation/index.ts +0 -2
- package/src/features/upscaling/README.md +0 -396
- package/src/features/upscaling/domain/index.ts +0 -1
- package/src/features/upscaling/domain/types/index.ts +0 -1
- package/src/features/upscaling/domain/types/upscale.types.ts +0 -23
- package/src/features/upscaling/index.ts +0 -20
- package/src/features/upscaling/presentation/components/ComparisonSlider.tsx +0 -200
- package/src/features/upscaling/presentation/components/UpscaleFeature.tsx +0 -89
- package/src/features/upscaling/presentation/components/UpscaleResultView.tsx +0 -98
- package/src/features/upscaling/presentation/components/index.ts +0 -6
- package/src/features/upscaling/presentation/hooks/index.ts +0 -1
- package/src/features/upscaling/presentation/hooks/useUpscaleFeature.ts +0 -28
- package/src/features/upscaling/presentation/index.ts +0 -2
- package/src/features/wizard/domain/types.ts +0 -154
- package/src/features/wizard/index.ts +0 -43
- package/src/features/wizard/presentation/components/AIFeatureWizard.tsx +0 -231
- package/src/features/wizard/presentation/components/AIGenerationWizard.tsx +0 -132
- package/src/features/wizard/presentation/hooks/useWizard.ts +0 -120
- package/src/features/wizard/presentation/store/useWizardStore.ts +0 -82
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
ScriptSection,
|
|
3
|
-
ScriptGenerationRequest,
|
|
4
|
-
} from "../../domain/types/script.types";
|
|
5
|
-
import { DEFAULT_VIDEO_TYPES } from "../../domain/constants";
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* ScriptGenerationService
|
|
9
|
-
* Handles building prompts and (eventually) calling AI providers for script generation.
|
|
10
|
-
*/
|
|
11
|
-
export class ScriptGenerationService {
|
|
12
|
-
/**
|
|
13
|
-
* Build prompt for script generation
|
|
14
|
-
*/
|
|
15
|
-
buildScriptPrompt(request: ScriptGenerationRequest): string {
|
|
16
|
-
const typeInfo = DEFAULT_VIDEO_TYPES.find((t) => t.id === request.videoType);
|
|
17
|
-
|
|
18
|
-
return `Generate a video script for a ${request.duration}-second ${typeInfo?.name || "video"} about: ${request.topic}
|
|
19
|
-
|
|
20
|
-
${request.targetAudience ? `Target Audience: ${request.targetAudience}` : ""}
|
|
21
|
-
${request.keyPoints ? `Key Points to Cover: ${request.keyPoints}` : ""}
|
|
22
|
-
|
|
23
|
-
Please create a detailed script with the following structure:
|
|
24
|
-
1. Hook (3-5 seconds): Attention-grabbing opening
|
|
25
|
-
2. Introduction (5-10 seconds): Brief intro to the topic
|
|
26
|
-
3. Main Content (${request.duration - 15} seconds): Core message and value
|
|
27
|
-
4. Call-to-Action (5 seconds): Clear next step for viewers
|
|
28
|
-
|
|
29
|
-
For each section, provide:
|
|
30
|
-
- Section title
|
|
31
|
-
- Voiceover text
|
|
32
|
-
- Duration in seconds
|
|
33
|
-
- Visual/scene suggestions
|
|
34
|
-
|
|
35
|
-
Format as JSON with this structure:
|
|
36
|
-
{
|
|
37
|
-
"sections": [
|
|
38
|
-
{
|
|
39
|
-
"type": "hook|intro|main|cta",
|
|
40
|
-
"title": "Section title",
|
|
41
|
-
"content": "Voiceover text",
|
|
42
|
-
"duration": 5,
|
|
43
|
-
"notes": "Visual suggestions"
|
|
44
|
-
}
|
|
45
|
-
],
|
|
46
|
-
"totalDuration": ${request.duration}
|
|
47
|
-
}`;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
/**
|
|
51
|
-
* Generate script from request
|
|
52
|
-
*/
|
|
53
|
-
async generateScript(
|
|
54
|
-
_request: ScriptGenerationRequest,
|
|
55
|
-
): Promise<readonly ScriptSection[] | null> {
|
|
56
|
-
// NOTE: This will be implemented by the app using a specific AI provider
|
|
57
|
-
// The package provides the structure and prompt building.
|
|
58
|
-
return null;
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
export const scriptGenerationService = new ScriptGenerationService();
|
|
@@ -1,158 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* ScriptDisplay Component
|
|
3
|
-
* Generic display for AI-generated scripts with sections, durations and types.
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import React from "react";
|
|
7
|
-
import { View, TouchableOpacity, StyleSheet } from "react-native";
|
|
8
|
-
import {
|
|
9
|
-
AtomicText,
|
|
10
|
-
AtomicIcon,
|
|
11
|
-
useAppDesignTokens,
|
|
12
|
-
} from "@umituz/react-native-design-system";
|
|
13
|
-
import type { ScriptSection } from "../../domain/types/script.types";
|
|
14
|
-
|
|
15
|
-
export interface ScriptDisplayProps {
|
|
16
|
-
readonly script: readonly ScriptSection[];
|
|
17
|
-
readonly onUseScript: () => void;
|
|
18
|
-
readonly title?: string;
|
|
19
|
-
readonly useButtonText?: string;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
export const ScriptDisplay: React.FC<ScriptDisplayProps> = ({
|
|
23
|
-
script,
|
|
24
|
-
onUseScript,
|
|
25
|
-
title = "Generated Script",
|
|
26
|
-
useButtonText = "Use This Script",
|
|
27
|
-
}) => {
|
|
28
|
-
const tokens = useAppDesignTokens();
|
|
29
|
-
|
|
30
|
-
return (
|
|
31
|
-
<View style={styles.container}>
|
|
32
|
-
<View style={styles.header}>
|
|
33
|
-
<AtomicText
|
|
34
|
-
type="bodyLarge"
|
|
35
|
-
style={[styles.headerTitle, { color: tokens.colors.textPrimary }]}
|
|
36
|
-
>
|
|
37
|
-
📝 {title}
|
|
38
|
-
</AtomicText>
|
|
39
|
-
<TouchableOpacity onPress={onUseScript}>
|
|
40
|
-
<AtomicIcon name="checkmark-outline" size="md" color="primary" />
|
|
41
|
-
</TouchableOpacity>
|
|
42
|
-
</View>
|
|
43
|
-
|
|
44
|
-
{script.map((section) => (
|
|
45
|
-
<View
|
|
46
|
-
key={section.id}
|
|
47
|
-
style={[
|
|
48
|
-
styles.section,
|
|
49
|
-
{ backgroundColor: tokens.colors.surface },
|
|
50
|
-
]}
|
|
51
|
-
>
|
|
52
|
-
<View style={styles.sectionHeader}>
|
|
53
|
-
<AtomicText
|
|
54
|
-
type="bodyMedium"
|
|
55
|
-
style={{ color: tokens.colors.primary, fontWeight: "600" }}
|
|
56
|
-
>
|
|
57
|
-
{section.title} ({section.duration}s)
|
|
58
|
-
</AtomicText>
|
|
59
|
-
<View
|
|
60
|
-
style={[
|
|
61
|
-
styles.badge,
|
|
62
|
-
{ backgroundColor: tokens.colors.surfaceVariant },
|
|
63
|
-
]}
|
|
64
|
-
>
|
|
65
|
-
<AtomicText
|
|
66
|
-
type="labelSmall"
|
|
67
|
-
style={{ color: tokens.colors.primary }}
|
|
68
|
-
>
|
|
69
|
-
{section.type.toUpperCase()}
|
|
70
|
-
</AtomicText>
|
|
71
|
-
</View>
|
|
72
|
-
</View>
|
|
73
|
-
<AtomicText
|
|
74
|
-
type="bodySmall"
|
|
75
|
-
style={{
|
|
76
|
-
color: tokens.colors.textPrimary,
|
|
77
|
-
marginTop: 8,
|
|
78
|
-
lineHeight: 22,
|
|
79
|
-
}}
|
|
80
|
-
>
|
|
81
|
-
{section.content}
|
|
82
|
-
</AtomicText>
|
|
83
|
-
{section.notes && ( section.notes.length > 0) && (
|
|
84
|
-
<AtomicText
|
|
85
|
-
type="labelSmall"
|
|
86
|
-
style={{
|
|
87
|
-
color: tokens.colors.textSecondary,
|
|
88
|
-
marginTop: 8,
|
|
89
|
-
fontStyle: "italic",
|
|
90
|
-
}}
|
|
91
|
-
>
|
|
92
|
-
💡 {section.notes}
|
|
93
|
-
</AtomicText>
|
|
94
|
-
)}
|
|
95
|
-
</View>
|
|
96
|
-
))}
|
|
97
|
-
|
|
98
|
-
<TouchableOpacity
|
|
99
|
-
style={[
|
|
100
|
-
styles.useButton,
|
|
101
|
-
{ backgroundColor: tokens.colors.primary },
|
|
102
|
-
]}
|
|
103
|
-
onPress={onUseScript}
|
|
104
|
-
>
|
|
105
|
-
<AtomicIcon name="checkmark-outline" size="md" color="textInverse" />
|
|
106
|
-
<AtomicText
|
|
107
|
-
type="bodyLarge"
|
|
108
|
-
style={[styles.useButtonText, { color: tokens.colors.textInverse }]}
|
|
109
|
-
>
|
|
110
|
-
{useButtonText}
|
|
111
|
-
</AtomicText>
|
|
112
|
-
</TouchableOpacity>
|
|
113
|
-
</View>
|
|
114
|
-
);
|
|
115
|
-
};
|
|
116
|
-
|
|
117
|
-
const styles = StyleSheet.create({
|
|
118
|
-
container: {
|
|
119
|
-
padding: 16,
|
|
120
|
-
width: "100%",
|
|
121
|
-
},
|
|
122
|
-
header: {
|
|
123
|
-
flexDirection: "row",
|
|
124
|
-
alignItems: "center",
|
|
125
|
-
justifyContent: "space-between",
|
|
126
|
-
marginBottom: 16,
|
|
127
|
-
},
|
|
128
|
-
headerTitle: {
|
|
129
|
-
fontWeight: "700",
|
|
130
|
-
},
|
|
131
|
-
section: {
|
|
132
|
-
padding: 16,
|
|
133
|
-
borderRadius: 12,
|
|
134
|
-
marginBottom: 12,
|
|
135
|
-
},
|
|
136
|
-
sectionHeader: {
|
|
137
|
-
flexDirection: "row",
|
|
138
|
-
alignItems: "center",
|
|
139
|
-
justifyContent: "space-between",
|
|
140
|
-
},
|
|
141
|
-
badge: {
|
|
142
|
-
paddingHorizontal: 8,
|
|
143
|
-
paddingVertical: 4,
|
|
144
|
-
borderRadius: 6,
|
|
145
|
-
},
|
|
146
|
-
useButton: {
|
|
147
|
-
flexDirection: "row",
|
|
148
|
-
alignItems: "center",
|
|
149
|
-
justifyContent: "center",
|
|
150
|
-
padding: 18,
|
|
151
|
-
borderRadius: 16,
|
|
152
|
-
marginTop: 16,
|
|
153
|
-
},
|
|
154
|
-
useButtonText: {
|
|
155
|
-
fontWeight: "700",
|
|
156
|
-
marginLeft: 12,
|
|
157
|
-
},
|
|
158
|
-
});
|
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* VideoTypeSelector Component
|
|
3
|
-
* Horizontal scroll selector for different video types with emojis.
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import React from "react";
|
|
7
|
-
import { View, ScrollView, TouchableOpacity, StyleSheet } from "react-native";
|
|
8
|
-
import {
|
|
9
|
-
AtomicText,
|
|
10
|
-
useAppDesignTokens,
|
|
11
|
-
} from "@umituz/react-native-design-system";
|
|
12
|
-
import { VideoTypeOption } from "../../domain/types/script.types";
|
|
13
|
-
|
|
14
|
-
export interface VideoTypeSelectorProps {
|
|
15
|
-
readonly selectedType: string;
|
|
16
|
-
readonly onSelectType: (typeId: string) => void;
|
|
17
|
-
readonly types: readonly VideoTypeOption[];
|
|
18
|
-
readonly title?: string;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
export const VideoTypeSelector: React.FC<VideoTypeSelectorProps> = ({
|
|
22
|
-
selectedType,
|
|
23
|
-
onSelectType,
|
|
24
|
-
types,
|
|
25
|
-
title = "Video Type",
|
|
26
|
-
}) => {
|
|
27
|
-
const tokens = useAppDesignTokens();
|
|
28
|
-
|
|
29
|
-
return (
|
|
30
|
-
<View style={styles.section}>
|
|
31
|
-
<AtomicText
|
|
32
|
-
type="bodyMedium"
|
|
33
|
-
style={[styles.title, { color: tokens.colors.textPrimary }]}
|
|
34
|
-
>
|
|
35
|
-
{title}
|
|
36
|
-
</AtomicText>
|
|
37
|
-
<ScrollView
|
|
38
|
-
horizontal
|
|
39
|
-
showsHorizontalScrollIndicator={false}
|
|
40
|
-
contentContainerStyle={styles.scrollContent}
|
|
41
|
-
>
|
|
42
|
-
{types.map((type) => (
|
|
43
|
-
<TouchableOpacity
|
|
44
|
-
key={type.id}
|
|
45
|
-
style={[
|
|
46
|
-
styles.card,
|
|
47
|
-
{
|
|
48
|
-
backgroundColor:
|
|
49
|
-
selectedType === type.id
|
|
50
|
-
? tokens.colors.primary
|
|
51
|
-
: tokens.colors.surface,
|
|
52
|
-
borderColor:
|
|
53
|
-
selectedType === type.id
|
|
54
|
-
? tokens.colors.primary
|
|
55
|
-
: tokens.colors.borderLight,
|
|
56
|
-
},
|
|
57
|
-
]}
|
|
58
|
-
onPress={() => onSelectType(type.id)}
|
|
59
|
-
>
|
|
60
|
-
<AtomicText type="headlineLarge">{type.emoji}</AtomicText>
|
|
61
|
-
<AtomicText
|
|
62
|
-
type="bodySmall"
|
|
63
|
-
style={{
|
|
64
|
-
color:
|
|
65
|
-
selectedType === type.id
|
|
66
|
-
? tokens.colors.onPrimary
|
|
67
|
-
: tokens.colors.textPrimary,
|
|
68
|
-
fontWeight: selectedType === type.id ? "600" : "400",
|
|
69
|
-
marginTop: 8,
|
|
70
|
-
textAlign: "center",
|
|
71
|
-
}}
|
|
72
|
-
>
|
|
73
|
-
{type.name}
|
|
74
|
-
</AtomicText>
|
|
75
|
-
</TouchableOpacity>
|
|
76
|
-
))}
|
|
77
|
-
</ScrollView>
|
|
78
|
-
</View>
|
|
79
|
-
);
|
|
80
|
-
};
|
|
81
|
-
|
|
82
|
-
const styles = StyleSheet.create({
|
|
83
|
-
section: {
|
|
84
|
-
padding: 16,
|
|
85
|
-
width: "100%",
|
|
86
|
-
},
|
|
87
|
-
title: {
|
|
88
|
-
fontWeight: "600",
|
|
89
|
-
marginBottom: 12,
|
|
90
|
-
},
|
|
91
|
-
scrollContent: {
|
|
92
|
-
paddingRight: 16,
|
|
93
|
-
},
|
|
94
|
-
card: {
|
|
95
|
-
width: 100,
|
|
96
|
-
padding: 16,
|
|
97
|
-
borderRadius: 16,
|
|
98
|
-
borderWidth: 2,
|
|
99
|
-
marginRight: 12,
|
|
100
|
-
alignItems: "center",
|
|
101
|
-
},
|
|
102
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from "./useScriptGenerator";
|
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
import { useState, useCallback } from "react";
|
|
2
|
-
import {
|
|
3
|
-
ScriptSection,
|
|
4
|
-
ScriptGenerationRequest,
|
|
5
|
-
} from "../../domain/types/script.types";
|
|
6
|
-
|
|
7
|
-
export interface UseScriptGeneratorProps {
|
|
8
|
-
readonly onGenerate: (request: ScriptGenerationRequest) => Promise<readonly ScriptSection[] | null>;
|
|
9
|
-
readonly onUseScript?: (script: readonly ScriptSection[]) => void;
|
|
10
|
-
readonly onAuthRequired?: () => void;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export interface UseScriptGeneratorReturn {
|
|
14
|
-
readonly isGenerating: boolean;
|
|
15
|
-
readonly generatedScript: readonly ScriptSection[] | null;
|
|
16
|
-
readonly generateScript: (request: ScriptGenerationRequest) => Promise<void>;
|
|
17
|
-
readonly handleUseScript: () => void;
|
|
18
|
-
readonly resetState: () => void;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
export function useScriptGenerator({
|
|
22
|
-
onGenerate,
|
|
23
|
-
onUseScript,
|
|
24
|
-
onAuthRequired,
|
|
25
|
-
}: UseScriptGeneratorProps): UseScriptGeneratorReturn {
|
|
26
|
-
const [isGenerating, setIsGenerating] = useState(false);
|
|
27
|
-
const [generatedScript, setGeneratedScript] = useState<readonly ScriptSection[] | null>(null);
|
|
28
|
-
|
|
29
|
-
const generateScript = useCallback(
|
|
30
|
-
async (request: ScriptGenerationRequest) => {
|
|
31
|
-
if (!request.topic.trim()) {
|
|
32
|
-
return;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
if (onAuthRequired) {
|
|
36
|
-
onAuthRequired();
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
setIsGenerating(true);
|
|
40
|
-
|
|
41
|
-
try {
|
|
42
|
-
const script = await onGenerate(request);
|
|
43
|
-
|
|
44
|
-
if (script) {
|
|
45
|
-
setGeneratedScript(script);
|
|
46
|
-
}
|
|
47
|
-
} catch (error) {
|
|
48
|
-
if (__DEV__) {
|
|
49
|
-
|
|
50
|
-
console.error("Script generation error:", error);
|
|
51
|
-
}
|
|
52
|
-
} finally {
|
|
53
|
-
setIsGenerating(false);
|
|
54
|
-
}
|
|
55
|
-
},
|
|
56
|
-
[onGenerate, onAuthRequired],
|
|
57
|
-
);
|
|
58
|
-
|
|
59
|
-
const handleUseScript = useCallback(() => {
|
|
60
|
-
if (generatedScript && onUseScript) {
|
|
61
|
-
onUseScript(generatedScript);
|
|
62
|
-
}
|
|
63
|
-
}, [generatedScript, onUseScript]);
|
|
64
|
-
|
|
65
|
-
const resetState = useCallback(() => {
|
|
66
|
-
setGeneratedScript(null);
|
|
67
|
-
setIsGenerating(false);
|
|
68
|
-
}, []);
|
|
69
|
-
|
|
70
|
-
return {
|
|
71
|
-
isGenerating,
|
|
72
|
-
generatedScript,
|
|
73
|
-
generateScript,
|
|
74
|
-
handleUseScript,
|
|
75
|
-
resetState,
|
|
76
|
-
};
|
|
77
|
-
}
|
|
@@ -1,311 +0,0 @@
|
|
|
1
|
-
# Shared Features
|
|
2
|
-
|
|
3
|
-
Common functionality and utilities shared across multiple AI features.
|
|
4
|
-
|
|
5
|
-
## 📍 Import Path
|
|
6
|
-
|
|
7
|
-
```typescript
|
|
8
|
-
import {
|
|
9
|
-
useDualImageVideoProcessing,
|
|
10
|
-
DualImagePicker,
|
|
11
|
-
DualVideoPicker
|
|
12
|
-
} from '@umituz/react-native-ai-generation-content';
|
|
13
|
-
```
|
|
14
|
-
|
|
15
|
-
**Location**: `src/features/shared/`
|
|
16
|
-
|
|
17
|
-
## 🎯 Shared Purpose
|
|
18
|
-
|
|
19
|
-
Provide reusable components, hooks, and utilities for common AI feature patterns. Focus on dual image/video processing for features requiring two inputs, with shared state management, validation, and error handling.
|
|
20
|
-
|
|
21
|
-
---
|
|
22
|
-
|
|
23
|
-
## 📋 Usage Strategy
|
|
24
|
-
|
|
25
|
-
### When to Use Shared Features
|
|
26
|
-
|
|
27
|
-
✅ **Use Cases:**
|
|
28
|
-
- Features requiring two images/videos
|
|
29
|
-
- Common state management patterns
|
|
30
|
-
- Shared validation logic
|
|
31
|
-
- Reusable UI components
|
|
32
|
-
- Dual input processing
|
|
33
|
-
|
|
34
|
-
❌ **When NOT to Use:**
|
|
35
|
-
- Single input features (use feature-specific hooks)
|
|
36
|
-
- Complex custom logic (build custom solution)
|
|
37
|
-
- Feature-specific requirements
|
|
38
|
-
|
|
39
|
-
### Implementation Strategy
|
|
40
|
-
|
|
41
|
-
1. **Identify common patterns** across features
|
|
42
|
-
2. **Use shared hooks** for dual processing
|
|
43
|
-
3. **Implement validation** consistently
|
|
44
|
-
4. **Handle errors** uniformly
|
|
45
|
-
5. **Track progress** with shared UI
|
|
46
|
-
6. **Reset states** properly
|
|
47
|
-
7. **Customize** when needed
|
|
48
|
-
|
|
49
|
-
---
|
|
50
|
-
|
|
51
|
-
## ⚠️ Critical Rules (MUST FOLLOW)
|
|
52
|
-
|
|
53
|
-
### 1. Dual Processing
|
|
54
|
-
- **MUST** validate both inputs before processing
|
|
55
|
-
- **MUST** handle missing inputs gracefully
|
|
56
|
-
- **MUST** provide clear input labels
|
|
57
|
-
- **MUST** implement input selection
|
|
58
|
-
- **MUST** check `isReady` before processing
|
|
59
|
-
|
|
60
|
-
### 2. State Management
|
|
61
|
-
- **MUST** track both inputs independently
|
|
62
|
-
- **MUST** handle processing state
|
|
63
|
-
- **MUST** track progress percentage
|
|
64
|
-
- **MUST** display errors clearly
|
|
65
|
-
- **MUST** reset state properly
|
|
66
|
-
|
|
67
|
-
### 3. Validation
|
|
68
|
-
- **MUST** validate input types
|
|
69
|
-
- **MUST** check file sizes
|
|
70
|
-
- **MUST** verify input quality
|
|
71
|
-
- **MUST** provide validation feedback
|
|
72
|
-
- **MUST** prevent invalid operations
|
|
73
|
-
|
|
74
|
-
### 4. User Experience
|
|
75
|
-
- **MUST** provide clear UI labels
|
|
76
|
-
- **MUST** show progress indicators
|
|
77
|
-
- **MUST** handle long operations
|
|
78
|
-
- **MUST** allow cancellation
|
|
79
|
-
- **MUST** confirm before processing
|
|
80
|
-
|
|
81
|
-
### 5. Error Handling
|
|
82
|
-
- **MUST** handle processing errors
|
|
83
|
-
- **MUST** provide user-friendly messages
|
|
84
|
-
- **MUST** offer retry options
|
|
85
|
-
- **MUST** log errors appropriately
|
|
86
|
-
- **MUST** recover gracefully
|
|
87
|
-
|
|
88
|
-
---
|
|
89
|
-
|
|
90
|
-
## 🚫 Prohibitions (MUST AVOID)
|
|
91
|
-
|
|
92
|
-
### Strictly Forbidden
|
|
93
|
-
|
|
94
|
-
❌ **NEVER** do the following:
|
|
95
|
-
|
|
96
|
-
1. **No Missing Validation**
|
|
97
|
-
- Always validate both inputs
|
|
98
|
-
- Never process without checking
|
|
99
|
-
- Provide clear validation messages
|
|
100
|
-
|
|
101
|
-
2. **No Confusing UI**
|
|
102
|
-
- Always label inputs clearly
|
|
103
|
-
- Never mix up source/target
|
|
104
|
-
- Show which input is which
|
|
105
|
-
|
|
106
|
-
3. **No Silent Failures**
|
|
107
|
-
- Always explain what went wrong
|
|
108
|
-
- Never fail silently
|
|
109
|
-
- Provide actionable guidance
|
|
110
|
-
|
|
111
|
-
4. **No Blocking Operations**
|
|
112
|
-
- Never block main thread
|
|
113
|
-
- Always show progress
|
|
114
|
-
- Allow cancellation
|
|
115
|
-
|
|
116
|
-
5. **No State Leaks**
|
|
117
|
-
- Always cleanup properly
|
|
118
|
-
- Reset state when done
|
|
119
|
-
- Clear temporary data
|
|
120
|
-
|
|
121
|
-
6. **No Missing Context**
|
|
122
|
-
- Always explain what's happening
|
|
123
|
-
- Show current operation
|
|
124
|
-
- Provide progress feedback
|
|
125
|
-
|
|
126
|
-
7. **No Partial Processing**
|
|
127
|
-
- Always complete or fail cleanly
|
|
128
|
-
- Never leave partial state
|
|
129
|
-
- Handle cancellation properly
|
|
130
|
-
|
|
131
|
-
---
|
|
132
|
-
|
|
133
|
-
## 🤖 AI Agent Directions
|
|
134
|
-
|
|
135
|
-
### For AI Code Generation Tools
|
|
136
|
-
|
|
137
|
-
#### Prompt Template for AI Agents
|
|
138
|
-
|
|
139
|
-
```
|
|
140
|
-
You are implementing dual image/video processing using @umituz/react-native-ai-generation-content.
|
|
141
|
-
|
|
142
|
-
REQUIREMENTS:
|
|
143
|
-
1. Import shared processing hooks
|
|
144
|
-
2. Implement dual input selection
|
|
145
|
-
3. Validate both inputs
|
|
146
|
-
4. Handle processing state
|
|
147
|
-
5. Show progress indicators
|
|
148
|
-
6. Handle errors gracefully
|
|
149
|
-
7. Implement confirmation dialog
|
|
150
|
-
8. Reset state properly
|
|
151
|
-
|
|
152
|
-
CRITICAL RULES:
|
|
153
|
-
- MUST validate both inputs before processing
|
|
154
|
-
- MUST provide clear UI labels
|
|
155
|
-
- MUST handle missing inputs
|
|
156
|
-
- MUST show progress during processing
|
|
157
|
-
- MUST implement error handling
|
|
158
|
-
- MUST allow user cancellation
|
|
159
|
-
|
|
160
|
-
SHARED HOOKS:
|
|
161
|
-
- useDualImageVideoProcessing: Main dual processing hook
|
|
162
|
-
- DualImagePicker: Image selection component
|
|
163
|
-
- DualVideoPicker: Video selection component
|
|
164
|
-
|
|
165
|
-
CONFIGURATION:
|
|
166
|
-
- featureType: 'face-swap' | 'ai-hug' | 'ai-kiss' | etc.
|
|
167
|
-
- inputType: 'image' | 'video'
|
|
168
|
-
- defaultOptions: Feature-specific options
|
|
169
|
-
- onProcessingStart: Callback when processing starts
|
|
170
|
-
- onProcessingComplete: Callback when processing completes
|
|
171
|
-
- onError: Error callback
|
|
172
|
-
|
|
173
|
-
STATE MANAGEMENT:
|
|
174
|
-
- sourceImageOrVideo: First input
|
|
175
|
-
- targetImageOrVideo: Second input
|
|
176
|
-
- isProcessing: Processing state
|
|
177
|
-
- progress: Progress percentage (0-100)
|
|
178
|
-
- error: Error message if failed
|
|
179
|
-
- result: Processing result
|
|
180
|
-
- isReady: Both inputs provided and valid
|
|
181
|
-
|
|
182
|
-
VALIDATION:
|
|
183
|
-
- Check both inputs provided
|
|
184
|
-
- Verify input types match
|
|
185
|
-
- Validate file sizes
|
|
186
|
-
- Check input quality
|
|
187
|
-
- Provide clear feedback
|
|
188
|
-
|
|
189
|
-
STRICTLY FORBIDDEN:
|
|
190
|
-
- No missing validation
|
|
191
|
-
- No confusing UI
|
|
192
|
-
- No silent failures
|
|
193
|
-
- No blocking operations
|
|
194
|
-
- No state leaks
|
|
195
|
-
- No missing context
|
|
196
|
-
- No partial processing
|
|
197
|
-
|
|
198
|
-
QUALITY CHECKLIST:
|
|
199
|
-
- [ ] Both inputs validated
|
|
200
|
-
- [ ] Clear UI labels
|
|
201
|
-
- [ ] Progress tracking
|
|
202
|
-
- [ ] Error handling
|
|
203
|
-
- [ ] Confirmation dialog
|
|
204
|
-
- [ ] State reset
|
|
205
|
-
- [ ] Cancellation support
|
|
206
|
-
- [ ] User feedback
|
|
207
|
-
- [ ] Clean state management
|
|
208
|
-
- [ ] Proper cleanup
|
|
209
|
-
```
|
|
210
|
-
|
|
211
|
-
---
|
|
212
|
-
|
|
213
|
-
## 🛠️ Configuration Strategy
|
|
214
|
-
|
|
215
|
-
### Dual Processing Types
|
|
216
|
-
|
|
217
|
-
```typescript
|
|
218
|
-
type DualInputType = 'image' | 'video';
|
|
219
|
-
|
|
220
|
-
interface DualImageVideoProcessingStartData {
|
|
221
|
-
sourceImageOrVideo: string; // Base64
|
|
222
|
-
targetImageOrVideo: string; // Base64
|
|
223
|
-
options?: Record<string, any>;
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
interface DualImageVideoResult {
|
|
227
|
-
success: boolean;
|
|
228
|
-
result?: {
|
|
229
|
-
imageUrl?: string;
|
|
230
|
-
videoUrl?: string;
|
|
231
|
-
thumbnailUrl?: string;
|
|
232
|
-
metadata?: Record<string, any>;
|
|
233
|
-
};
|
|
234
|
-
error?: string;
|
|
235
|
-
}
|
|
236
|
-
```
|
|
237
|
-
|
|
238
|
-
### Feature Config
|
|
239
|
-
|
|
240
|
-
```typescript
|
|
241
|
-
interface DualImageVideoFeatureConfig {
|
|
242
|
-
featureType: string;
|
|
243
|
-
inputType: DualInputType;
|
|
244
|
-
defaultOptions?: Record<string, any>;
|
|
245
|
-
onProcessingStart?: () => void;
|
|
246
|
-
onProcessingComplete?: (result: DualImageVideoResult) => void;
|
|
247
|
-
onError?: (error: string) => void;
|
|
248
|
-
}
|
|
249
|
-
```
|
|
250
|
-
|
|
251
|
-
---
|
|
252
|
-
|
|
253
|
-
## 📊 Features Using Shared
|
|
254
|
-
|
|
255
|
-
### Dual Image Features
|
|
256
|
-
- **Face Swap**: Swap faces between images
|
|
257
|
-
- **AI Hug**: Generate hug images
|
|
258
|
-
- **AI Kiss**: Generate kiss images
|
|
259
|
-
- **Couple Future**: Future predictions
|
|
260
|
-
|
|
261
|
-
### Shared Components
|
|
262
|
-
- `DualImagePicker` - Image selection UI
|
|
263
|
-
- `DualVideoPicker` - Video selection UI
|
|
264
|
-
- `DualImageVideoState` - State management
|
|
265
|
-
|
|
266
|
-
---
|
|
267
|
-
|
|
268
|
-
## 🎨 Best Practices
|
|
269
|
-
|
|
270
|
-
### Input Labeling
|
|
271
|
-
- "First Image/Video" vs "Second Image/Video"
|
|
272
|
-
- "Source" vs "Target" for swap features
|
|
273
|
-
- "Person 1" vs "Person 2" for couple features
|
|
274
|
-
- Always show which is which
|
|
275
|
-
|
|
276
|
-
### Validation
|
|
277
|
-
- Check both inputs present
|
|
278
|
-
- Validate file types
|
|
279
|
-
- Check file sizes
|
|
280
|
-
- Verify quality
|
|
281
|
-
- Provide clear feedback
|
|
282
|
-
|
|
283
|
-
### User Experience
|
|
284
|
-
- Show input previews
|
|
285
|
-
- Display progress clearly
|
|
286
|
-
- Confirm before processing
|
|
287
|
-
- Allow cancellation
|
|
288
|
-
- Explain errors clearly
|
|
289
|
-
|
|
290
|
-
---
|
|
291
|
-
|
|
292
|
-
## 🐛 Common Pitfalls
|
|
293
|
-
|
|
294
|
-
❌ **Mixed up inputs**: Clear labels, visual indicators
|
|
295
|
-
❌ **Missing validation**: Always check both inputs
|
|
296
|
-
❌ **No feedback**: Show progress, errors clearly
|
|
297
|
-
❌ **State issues**: Proper cleanup and reset
|
|
298
|
-
|
|
299
|
-
---
|
|
300
|
-
|
|
301
|
-
## 📚 Related Features
|
|
302
|
-
|
|
303
|
-
- [Face Swap](../face-swap) - Uses dual image processing
|
|
304
|
-
- [AI Hug](../ai-hug) - Uses dual image processing
|
|
305
|
-
- [AI Kiss](../ai-kiss) - Uses dual image processing
|
|
306
|
-
- [Couple Future](../couple-future) - Uses dual image processing
|
|
307
|
-
|
|
308
|
-
---
|
|
309
|
-
|
|
310
|
-
**Last Updated**: 2025-01-08
|
|
311
|
-
**Version**: 2.0.0 (Strategy-based Documentation)
|