@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,147 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Scenario Domain Types
|
|
3
|
-
* Generic types for scenario selection feature
|
|
4
|
-
* Supports both flat and hierarchical category systems
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
export enum ScenarioCategory {
|
|
8
|
-
TIME_TRAVEL = "time_travel",
|
|
9
|
-
FAMILY = "family",
|
|
10
|
-
LIFESTYLE = "lifestyle",
|
|
11
|
-
FANTASY = "fantasy",
|
|
12
|
-
CAREER = "career",
|
|
13
|
-
TRAVEL = "travel",
|
|
14
|
-
CULTURAL = "cultural",
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* Output type for AI generation
|
|
19
|
-
*/
|
|
20
|
-
export type ScenarioOutputType = 'image' | 'video' | 'both';
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* Scenario media configuration
|
|
24
|
-
*/
|
|
25
|
-
export interface ScenarioMedia {
|
|
26
|
-
readonly imageUrl?: string; // Preview/thumbnail image
|
|
27
|
-
readonly videoUrl?: string; // Preview video URL
|
|
28
|
-
readonly previewImageUrl?: string; // Smaller thumbnail
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
export interface ScenarioData {
|
|
32
|
-
readonly id: string;
|
|
33
|
-
readonly category?: ScenarioCategory | string;
|
|
34
|
-
|
|
35
|
-
// Content (app provides in target language)
|
|
36
|
-
readonly title: string;
|
|
37
|
-
readonly description: string;
|
|
38
|
-
|
|
39
|
-
// AI Configuration
|
|
40
|
-
readonly outputType: ScenarioOutputType; // What this scenario generates
|
|
41
|
-
readonly aiPrompt: string; // AI generation prompt
|
|
42
|
-
readonly storyTemplate?: string; // Story template with placeholders (optional)
|
|
43
|
-
|
|
44
|
-
// Media
|
|
45
|
-
readonly icon: string;
|
|
46
|
-
readonly imageUrl?: string; // Preview image
|
|
47
|
-
readonly videoUrl?: string; // Preview video
|
|
48
|
-
readonly previewImageUrl?: string; // Thumbnail
|
|
49
|
-
|
|
50
|
-
// Requirements
|
|
51
|
-
readonly requiresPhoto?: boolean; // Requires user photo upload
|
|
52
|
-
readonly requiresMultiplePhotos?: boolean; // Requires multiple photos (e.g., couples)
|
|
53
|
-
readonly minPhotos?: number; // Minimum photos required
|
|
54
|
-
readonly maxPhotos?: number; // Maximum photos allowed
|
|
55
|
-
|
|
56
|
-
// Display
|
|
57
|
-
readonly hidden?: boolean; // Hide from UI
|
|
58
|
-
readonly featured?: boolean; // Featured/promoted scenario
|
|
59
|
-
readonly order?: number; // Display order
|
|
60
|
-
|
|
61
|
-
// Metadata
|
|
62
|
-
readonly tags?: readonly string[]; // Search/filter tags
|
|
63
|
-
readonly duration?: number; // Video duration (for video scenarios)
|
|
64
|
-
readonly aspectRatio?: string; // Output aspect ratio (e.g., "16:9", "9:16")
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
/**
|
|
68
|
-
* Scenario Main Category (Top-level grouping for hierarchical system)
|
|
69
|
-
*/
|
|
70
|
-
export interface ScenarioMainCategory {
|
|
71
|
-
readonly id: string;
|
|
72
|
-
readonly title: string;
|
|
73
|
-
readonly description?: string;
|
|
74
|
-
readonly icon?: string;
|
|
75
|
-
readonly emoji?: string;
|
|
76
|
-
readonly order: number;
|
|
77
|
-
readonly subCategoryIds: readonly string[];
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
/**
|
|
81
|
-
* Scenario Sub Category (Second-level grouping for hierarchical system)
|
|
82
|
-
*/
|
|
83
|
-
export interface ScenarioSubCategory {
|
|
84
|
-
readonly id: string;
|
|
85
|
-
readonly title: string;
|
|
86
|
-
readonly description?: string;
|
|
87
|
-
readonly icon?: string;
|
|
88
|
-
readonly emoji?: string;
|
|
89
|
-
readonly mainCategoryId: string;
|
|
90
|
-
readonly scenarioCategories: readonly string[];
|
|
91
|
-
readonly order: number;
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
/**
|
|
95
|
-
* Hierarchical scenario category configuration
|
|
96
|
-
*/
|
|
97
|
-
export interface ScenarioHierarchyConfig {
|
|
98
|
-
readonly mainCategories: readonly ScenarioMainCategory[];
|
|
99
|
-
readonly subCategories: readonly ScenarioSubCategory[];
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
export interface ScenarioSelectorConfig {
|
|
103
|
-
readonly titleKey: string;
|
|
104
|
-
readonly subtitleKey: string;
|
|
105
|
-
readonly showCategoryFilter?: boolean;
|
|
106
|
-
readonly enableSearch?: boolean;
|
|
107
|
-
readonly pageSize?: number;
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
export interface ScenarioPreviewConfig {
|
|
111
|
-
readonly showTips?: boolean;
|
|
112
|
-
readonly showDetails?: boolean;
|
|
113
|
-
readonly enableCustomization?: boolean;
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
export interface MagicPromptConfig {
|
|
117
|
-
readonly maxLength: number;
|
|
118
|
-
readonly minLength: number;
|
|
119
|
-
readonly headerKey: string;
|
|
120
|
-
readonly headlinePart1Key: string;
|
|
121
|
-
readonly headlinePart2Key: string;
|
|
122
|
-
readonly subtitleKey: string;
|
|
123
|
-
readonly inputLabelKey: string;
|
|
124
|
-
readonly surpriseButtonKey: string;
|
|
125
|
-
readonly placeholderKey: string;
|
|
126
|
-
readonly styleTitleKey: string;
|
|
127
|
-
readonly inspirationTitleKey: string;
|
|
128
|
-
readonly continueKey: string;
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
export interface VisualStyleOption {
|
|
132
|
-
readonly id: string;
|
|
133
|
-
readonly icon: string;
|
|
134
|
-
readonly labelKey: string;
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
export interface InspirationChipData {
|
|
138
|
-
readonly id: string;
|
|
139
|
-
readonly labelKey: string;
|
|
140
|
-
readonly promptKey: string;
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
export const SCENARIO_DEFAULTS = {
|
|
144
|
-
pageSize: 10,
|
|
145
|
-
maxPromptLength: 500,
|
|
146
|
-
minPromptLength: 10,
|
|
147
|
-
} as const;
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Scenarios Feature
|
|
3
|
-
* Config-driven scenario selection and preview screens
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
// Domain types
|
|
7
|
-
export type {
|
|
8
|
-
ScenarioData,
|
|
9
|
-
ScenarioSelectorConfig,
|
|
10
|
-
ScenarioPreviewConfig,
|
|
11
|
-
MagicPromptConfig,
|
|
12
|
-
VisualStyleOption,
|
|
13
|
-
InspirationChipData,
|
|
14
|
-
ScenarioMainCategory,
|
|
15
|
-
ScenarioSubCategory,
|
|
16
|
-
ScenarioHierarchyConfig,
|
|
17
|
-
} from "./domain/types";
|
|
18
|
-
export { SCENARIO_DEFAULTS } from "./domain/types";
|
|
19
|
-
|
|
20
|
-
// Note: ScenarioCategory is now exported from domains/scenarios
|
|
21
|
-
// Import from there instead: import { ScenarioCategory } from '@umituz/react-native-ai-generation-content'
|
|
22
|
-
|
|
23
|
-
// Components
|
|
24
|
-
export {
|
|
25
|
-
ScenarioHeader,
|
|
26
|
-
ScenarioGrid,
|
|
27
|
-
MagicPromptHeadline,
|
|
28
|
-
InspirationChips,
|
|
29
|
-
StyleSelector,
|
|
30
|
-
} from "./presentation/components";
|
|
31
|
-
export type {
|
|
32
|
-
ScenarioHeaderProps,
|
|
33
|
-
ScenarioGridProps,
|
|
34
|
-
MagicPromptHeadlineProps,
|
|
35
|
-
InspirationChipsProps,
|
|
36
|
-
StyleSelectorProps,
|
|
37
|
-
} from "./presentation/components";
|
|
38
|
-
|
|
39
|
-
// Screens
|
|
40
|
-
export { ScenarioSelectorScreen } from "./presentation/screens/ScenarioSelectorScreen";
|
|
41
|
-
export type { ScenarioSelectorScreenProps } from "./presentation/screens/ScenarioSelectorScreen";
|
|
42
|
-
|
|
43
|
-
export { ScenarioPreviewScreen } from "./presentation/screens/ScenarioPreviewScreen";
|
|
44
|
-
export type {
|
|
45
|
-
ScenarioPreviewScreenProps,
|
|
46
|
-
ScenarioPreviewTranslations,
|
|
47
|
-
} from "./presentation/screens/ScenarioPreviewScreen";
|
|
48
|
-
|
|
49
|
-
export { MagicPromptScreen } from "./presentation/screens/MagicPromptScreen";
|
|
50
|
-
export type { MagicPromptScreenProps } from "./presentation/screens/MagicPromptScreen";
|
|
51
|
-
|
|
52
|
-
// Hierarchical Screens
|
|
53
|
-
export { MainCategoryScreen } from "./presentation/screens/MainCategoryScreen";
|
|
54
|
-
export type { MainCategoryScreenProps } from "./presentation/screens/MainCategoryScreen";
|
|
55
|
-
|
|
56
|
-
export { SubCategoryScreen } from "./presentation/screens/SubCategoryScreen";
|
|
57
|
-
export type { SubCategoryScreenProps } from "./presentation/screens/SubCategoryScreen";
|
|
58
|
-
|
|
59
|
-
export { HierarchicalScenarioListScreen } from "./presentation/screens/HierarchicalScenarioListScreen";
|
|
60
|
-
export type { HierarchicalScenarioListScreenProps } from "./presentation/screens/HierarchicalScenarioListScreen";
|
|
61
|
-
|
|
62
|
-
// Containers
|
|
63
|
-
export { CategoryNavigationContainer } from "./presentation/containers/CategoryNavigationContainer";
|
|
64
|
-
export type { CategoryNavigationContainerProps } from "./presentation/containers/CategoryNavigationContainer";
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* InspirationChips Component
|
|
3
|
-
* Horizontal scrollable suggestion chips for Magic Prompt
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import React, { useMemo } from "react";
|
|
7
|
-
import { View, StyleSheet, ScrollView, TouchableOpacity } from "react-native";
|
|
8
|
-
import {
|
|
9
|
-
AtomicText,
|
|
10
|
-
useAppDesignTokens,
|
|
11
|
-
} from "@umituz/react-native-design-system";
|
|
12
|
-
import type { InspirationChipData } from "../../domain/types";
|
|
13
|
-
|
|
14
|
-
export interface InspirationChipsProps {
|
|
15
|
-
readonly chips: readonly InspirationChipData[];
|
|
16
|
-
readonly title: string;
|
|
17
|
-
readonly onSelect: (promptKey: string) => void;
|
|
18
|
-
readonly t: (key: string) => string;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
export const InspirationChips: React.FC<InspirationChipsProps> = ({
|
|
22
|
-
chips,
|
|
23
|
-
title,
|
|
24
|
-
onSelect,
|
|
25
|
-
t,
|
|
26
|
-
}) => {
|
|
27
|
-
const tokens = useAppDesignTokens();
|
|
28
|
-
|
|
29
|
-
const styles = useMemo(
|
|
30
|
-
() =>
|
|
31
|
-
StyleSheet.create({
|
|
32
|
-
container: {
|
|
33
|
-
marginBottom: tokens.spacing.lg,
|
|
34
|
-
},
|
|
35
|
-
sectionTitle: {
|
|
36
|
-
fontWeight: "700",
|
|
37
|
-
marginBottom: tokens.spacing.sm,
|
|
38
|
-
},
|
|
39
|
-
chipsContainer: {
|
|
40
|
-
gap: tokens.spacing.sm,
|
|
41
|
-
paddingBottom: 4,
|
|
42
|
-
},
|
|
43
|
-
chip: {
|
|
44
|
-
paddingHorizontal: tokens.spacing.md,
|
|
45
|
-
paddingVertical: 10,
|
|
46
|
-
borderRadius: 999,
|
|
47
|
-
borderWidth: 1,
|
|
48
|
-
borderColor: tokens.colors.border,
|
|
49
|
-
backgroundColor: tokens.colors.surface,
|
|
50
|
-
},
|
|
51
|
-
}),
|
|
52
|
-
[tokens],
|
|
53
|
-
);
|
|
54
|
-
|
|
55
|
-
return (
|
|
56
|
-
<View style={styles.container}>
|
|
57
|
-
<AtomicText type="labelLarge" style={styles.sectionTitle}>
|
|
58
|
-
{title}
|
|
59
|
-
</AtomicText>
|
|
60
|
-
<ScrollView
|
|
61
|
-
horizontal
|
|
62
|
-
showsHorizontalScrollIndicator={false}
|
|
63
|
-
contentContainerStyle={styles.chipsContainer}
|
|
64
|
-
>
|
|
65
|
-
{chips.map((chip) => (
|
|
66
|
-
<TouchableOpacity
|
|
67
|
-
key={chip.id}
|
|
68
|
-
style={styles.chip}
|
|
69
|
-
onPress={() => onSelect(chip.promptKey)}
|
|
70
|
-
>
|
|
71
|
-
<AtomicText
|
|
72
|
-
type="bodySmall"
|
|
73
|
-
style={{ color: tokens.colors.textPrimary }}
|
|
74
|
-
>
|
|
75
|
-
{t(chip.labelKey)}
|
|
76
|
-
</AtomicText>
|
|
77
|
-
</TouchableOpacity>
|
|
78
|
-
))}
|
|
79
|
-
</ScrollView>
|
|
80
|
-
</View>
|
|
81
|
-
);
|
|
82
|
-
};
|
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* MagicPromptHeadline Component
|
|
3
|
-
* Headline section with highlighted text for Magic Prompt screen
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import React from "react";
|
|
7
|
-
import { View, StyleSheet } from "react-native";
|
|
8
|
-
import {
|
|
9
|
-
AtomicText,
|
|
10
|
-
useAppDesignTokens,
|
|
11
|
-
} from "@umituz/react-native-design-system";
|
|
12
|
-
|
|
13
|
-
export interface MagicPromptHeadlineProps {
|
|
14
|
-
readonly headlinePart1: string;
|
|
15
|
-
readonly headlinePart2: string;
|
|
16
|
-
readonly subtitle: string;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export const MagicPromptHeadline: React.FC<MagicPromptHeadlineProps> = ({
|
|
20
|
-
headlinePart1,
|
|
21
|
-
headlinePart2,
|
|
22
|
-
subtitle,
|
|
23
|
-
}) => {
|
|
24
|
-
const tokens = useAppDesignTokens();
|
|
25
|
-
|
|
26
|
-
return (
|
|
27
|
-
<View style={styles.container}>
|
|
28
|
-
<View style={styles.titleRow}>
|
|
29
|
-
<AtomicText
|
|
30
|
-
type="headlineLarge"
|
|
31
|
-
style={[styles.title, { color: tokens.colors.textPrimary }]}
|
|
32
|
-
>
|
|
33
|
-
{headlinePart1}{" "}
|
|
34
|
-
<AtomicText
|
|
35
|
-
type="headlineLarge"
|
|
36
|
-
style={[
|
|
37
|
-
styles.titleHighlight,
|
|
38
|
-
{ color: tokens.colors.textPrimary },
|
|
39
|
-
]}
|
|
40
|
-
>
|
|
41
|
-
{headlinePart2}
|
|
42
|
-
</AtomicText>
|
|
43
|
-
</AtomicText>
|
|
44
|
-
</View>
|
|
45
|
-
<AtomicText
|
|
46
|
-
type="bodyLarge"
|
|
47
|
-
style={[styles.subtitle, { color: tokens.colors.textSecondary }]}
|
|
48
|
-
>
|
|
49
|
-
{subtitle}
|
|
50
|
-
</AtomicText>
|
|
51
|
-
</View>
|
|
52
|
-
);
|
|
53
|
-
};
|
|
54
|
-
|
|
55
|
-
const styles = StyleSheet.create({
|
|
56
|
-
container: {
|
|
57
|
-
marginVertical: 24,
|
|
58
|
-
},
|
|
59
|
-
titleRow: {
|
|
60
|
-
marginBottom: 12,
|
|
61
|
-
},
|
|
62
|
-
title: {
|
|
63
|
-
fontWeight: "800",
|
|
64
|
-
fontSize: 32,
|
|
65
|
-
lineHeight: 40,
|
|
66
|
-
},
|
|
67
|
-
titleHighlight: {
|
|
68
|
-
fontWeight: "800",
|
|
69
|
-
fontSize: 32,
|
|
70
|
-
lineHeight: 40,
|
|
71
|
-
textDecorationLine: "underline",
|
|
72
|
-
textDecorationColor: "rgba(255, 140, 90, 0.5)",
|
|
73
|
-
textDecorationStyle: "solid",
|
|
74
|
-
},
|
|
75
|
-
subtitle: {
|
|
76
|
-
fontSize: 16,
|
|
77
|
-
lineHeight: 24,
|
|
78
|
-
},
|
|
79
|
-
});
|
|
@@ -1,224 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* ScenarioGrid Component
|
|
3
|
-
* Grid display for scenario selection with category filtering
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import React, { useMemo, useCallback, useState } from "react";
|
|
7
|
-
import {
|
|
8
|
-
View,
|
|
9
|
-
FlatList,
|
|
10
|
-
StyleSheet,
|
|
11
|
-
type ListRenderItemInfo,
|
|
12
|
-
} from "react-native";
|
|
13
|
-
import {
|
|
14
|
-
useAppDesignTokens,
|
|
15
|
-
useResponsive,
|
|
16
|
-
AtomicCard,
|
|
17
|
-
AtomicText,
|
|
18
|
-
AtomicSkeleton,
|
|
19
|
-
FilterGroup,
|
|
20
|
-
type DesignTokens,
|
|
21
|
-
} from "@umituz/react-native-design-system";
|
|
22
|
-
import { useSafeAreaInsets } from "react-native-safe-area-context";
|
|
23
|
-
import type { ScenarioData, ScenarioCategory } from "../../domain/types";
|
|
24
|
-
import { SCENARIO_DEFAULTS } from "../../domain/types";
|
|
25
|
-
|
|
26
|
-
export interface ScenarioGridProps {
|
|
27
|
-
readonly scenarios: readonly ScenarioData[];
|
|
28
|
-
readonly selectedScenarioId: string | null;
|
|
29
|
-
readonly onSelect: (id: string) => void;
|
|
30
|
-
readonly categories: readonly ScenarioCategory[];
|
|
31
|
-
readonly t: (key: string) => string;
|
|
32
|
-
readonly pageSize?: number;
|
|
33
|
-
readonly categoryAllLabel?: string;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
export const ScenarioGrid: React.FC<ScenarioGridProps> = ({
|
|
37
|
-
scenarios,
|
|
38
|
-
selectedScenarioId,
|
|
39
|
-
onSelect,
|
|
40
|
-
categories,
|
|
41
|
-
t,
|
|
42
|
-
pageSize = SCENARIO_DEFAULTS.pageSize,
|
|
43
|
-
categoryAllLabel = "All",
|
|
44
|
-
}) => {
|
|
45
|
-
const [category, setCategory] = useState<ScenarioCategory | "all">("all");
|
|
46
|
-
const [displayedCount, setDisplayedCount] = useState(pageSize);
|
|
47
|
-
const [isLoading, setIsLoading] = useState(false);
|
|
48
|
-
|
|
49
|
-
const tokens = useAppDesignTokens();
|
|
50
|
-
const insets = useSafeAreaInsets();
|
|
51
|
-
const { width } = useResponsive();
|
|
52
|
-
|
|
53
|
-
const numColumns = 2;
|
|
54
|
-
const horizontalPadding = tokens.spacing.md;
|
|
55
|
-
const cardSpacing = tokens.spacing.md;
|
|
56
|
-
const availableWidth = width - horizontalPadding * 2 - cardSpacing;
|
|
57
|
-
const cardWidth = availableWidth / numColumns;
|
|
58
|
-
|
|
59
|
-
const filteredScenarios = useMemo(() => {
|
|
60
|
-
if (category === "all") return scenarios;
|
|
61
|
-
return scenarios.filter((s) => s.category === category);
|
|
62
|
-
}, [scenarios, category]);
|
|
63
|
-
|
|
64
|
-
const displayedScenarios = useMemo(
|
|
65
|
-
() => filteredScenarios.slice(0, displayedCount),
|
|
66
|
-
[filteredScenarios, displayedCount],
|
|
67
|
-
);
|
|
68
|
-
|
|
69
|
-
const hasMore = displayedCount < filteredScenarios.length;
|
|
70
|
-
const isLoadingMore = isLoading && displayedCount > pageSize;
|
|
71
|
-
|
|
72
|
-
const styles = useMemo(
|
|
73
|
-
() => createStyles(tokens, cardWidth, cardSpacing, horizontalPadding),
|
|
74
|
-
[tokens, cardWidth, cardSpacing, horizontalPadding],
|
|
75
|
-
);
|
|
76
|
-
|
|
77
|
-
const loadMore = useCallback(() => {
|
|
78
|
-
if (hasMore && !isLoading) {
|
|
79
|
-
setIsLoading(true);
|
|
80
|
-
setTimeout(() => {
|
|
81
|
-
setDisplayedCount((prev) =>
|
|
82
|
-
Math.min(prev + pageSize, filteredScenarios.length),
|
|
83
|
-
);
|
|
84
|
-
setIsLoading(false);
|
|
85
|
-
}, 300);
|
|
86
|
-
}
|
|
87
|
-
}, [hasMore, isLoading, filteredScenarios.length, pageSize]);
|
|
88
|
-
|
|
89
|
-
const handleCategoryChange = useCallback(
|
|
90
|
-
(val: ScenarioCategory | "all") => {
|
|
91
|
-
setCategory(val);
|
|
92
|
-
setDisplayedCount(pageSize);
|
|
93
|
-
},
|
|
94
|
-
[pageSize],
|
|
95
|
-
);
|
|
96
|
-
|
|
97
|
-
const ListEmptyComponent = useMemo(
|
|
98
|
-
() => (
|
|
99
|
-
<View style={[styles.centerContainer, { paddingHorizontal: horizontalPadding }]}>
|
|
100
|
-
<AtomicText type="bodyMedium" color="textSecondary">
|
|
101
|
-
{t("scenario.empty")}
|
|
102
|
-
</AtomicText>
|
|
103
|
-
</View>
|
|
104
|
-
),
|
|
105
|
-
[t, styles.centerContainer, horizontalPadding],
|
|
106
|
-
);
|
|
107
|
-
|
|
108
|
-
const ListFooterComponent = useMemo(
|
|
109
|
-
() =>
|
|
110
|
-
isLoadingMore ? (
|
|
111
|
-
<View style={[styles.footerLoader, { paddingHorizontal: horizontalPadding }]}>
|
|
112
|
-
<AtomicSkeleton pattern="card" count={2} />
|
|
113
|
-
</View>
|
|
114
|
-
) : null,
|
|
115
|
-
[isLoadingMore, styles.footerLoader, horizontalPadding],
|
|
116
|
-
);
|
|
117
|
-
|
|
118
|
-
const ListHeaderComponent = useMemo(
|
|
119
|
-
() => (
|
|
120
|
-
<View style={{ marginBottom: tokens.spacing.md }}>
|
|
121
|
-
<FilterGroup
|
|
122
|
-
items={[
|
|
123
|
-
{ label: categoryAllLabel, value: "all" },
|
|
124
|
-
...categories.map((cat) => ({
|
|
125
|
-
label: t(`category.${cat}`),
|
|
126
|
-
value: cat,
|
|
127
|
-
})),
|
|
128
|
-
]}
|
|
129
|
-
selectedValue={category}
|
|
130
|
-
onSelect={(val) =>
|
|
131
|
-
handleCategoryChange(val as ScenarioCategory | "all")
|
|
132
|
-
}
|
|
133
|
-
contentContainerStyle={{ paddingHorizontal: horizontalPadding }}
|
|
134
|
-
/>
|
|
135
|
-
</View>
|
|
136
|
-
),
|
|
137
|
-
[
|
|
138
|
-
category,
|
|
139
|
-
t,
|
|
140
|
-
horizontalPadding,
|
|
141
|
-
tokens.spacing.md,
|
|
142
|
-
categories,
|
|
143
|
-
categoryAllLabel,
|
|
144
|
-
handleCategoryChange,
|
|
145
|
-
],
|
|
146
|
-
);
|
|
147
|
-
|
|
148
|
-
const renderItem = useCallback(
|
|
149
|
-
({ item }: ListRenderItemInfo<ScenarioData>) => {
|
|
150
|
-
const title = t(`scenario.${item.id}.title`);
|
|
151
|
-
const description = t(`scenario.${item.id}.description`);
|
|
152
|
-
|
|
153
|
-
return (
|
|
154
|
-
<AtomicCard
|
|
155
|
-
image={item.previewImageUrl ?? item.imageUrl ?? ""}
|
|
156
|
-
title={title}
|
|
157
|
-
subtitle={description}
|
|
158
|
-
selected={selectedScenarioId === item.id}
|
|
159
|
-
imageAspectRatio={1.25}
|
|
160
|
-
style={{ width: cardWidth }}
|
|
161
|
-
onPress={() => onSelect(item.id)}
|
|
162
|
-
testID={`scenario-card-${item.id}`}
|
|
163
|
-
/>
|
|
164
|
-
);
|
|
165
|
-
},
|
|
166
|
-
[cardWidth, selectedScenarioId, onSelect, t],
|
|
167
|
-
);
|
|
168
|
-
|
|
169
|
-
return (
|
|
170
|
-
<FlatList
|
|
171
|
-
data={displayedScenarios}
|
|
172
|
-
numColumns={numColumns}
|
|
173
|
-
key={`grid-${numColumns}`}
|
|
174
|
-
showsVerticalScrollIndicator={false}
|
|
175
|
-
columnWrapperStyle={styles.row}
|
|
176
|
-
renderItem={renderItem}
|
|
177
|
-
keyExtractor={(item: ScenarioData) => item.id}
|
|
178
|
-
ListHeaderComponent={ListHeaderComponent}
|
|
179
|
-
ListEmptyComponent={filteredScenarios.length === 0 ? ListEmptyComponent : null}
|
|
180
|
-
ListFooterComponent={ListFooterComponent}
|
|
181
|
-
onEndReached={loadMore}
|
|
182
|
-
onEndReachedThreshold={0.5}
|
|
183
|
-
contentContainerStyle={[
|
|
184
|
-
styles.listContent,
|
|
185
|
-
{
|
|
186
|
-
paddingBottom: insets.bottom + 100,
|
|
187
|
-
},
|
|
188
|
-
]}
|
|
189
|
-
initialNumToRender={pageSize}
|
|
190
|
-
maxToRenderPerBatch={pageSize}
|
|
191
|
-
windowSize={5}
|
|
192
|
-
/>
|
|
193
|
-
);
|
|
194
|
-
};
|
|
195
|
-
|
|
196
|
-
const createStyles = (
|
|
197
|
-
tokens: DesignTokens,
|
|
198
|
-
cardWidth: number,
|
|
199
|
-
cardSpacing: number,
|
|
200
|
-
horizontalPadding: number,
|
|
201
|
-
) =>
|
|
202
|
-
StyleSheet.create({
|
|
203
|
-
container: {
|
|
204
|
-
flex: 1,
|
|
205
|
-
},
|
|
206
|
-
listContent: {
|
|
207
|
-
paddingTop: tokens.spacing.sm,
|
|
208
|
-
flexGrow: 1,
|
|
209
|
-
},
|
|
210
|
-
row: {
|
|
211
|
-
gap: cardSpacing,
|
|
212
|
-
marginBottom: cardSpacing,
|
|
213
|
-
paddingHorizontal: horizontalPadding,
|
|
214
|
-
},
|
|
215
|
-
centerContainer: {
|
|
216
|
-
flex: 1,
|
|
217
|
-
justifyContent: "center",
|
|
218
|
-
alignItems: "center",
|
|
219
|
-
paddingVertical: tokens.spacing.xl,
|
|
220
|
-
},
|
|
221
|
-
footerLoader: {
|
|
222
|
-
paddingVertical: tokens.spacing.md,
|
|
223
|
-
},
|
|
224
|
-
});
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* ScenarioHeader Component
|
|
3
|
-
* Header section for scenario selection screen
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import React from "react";
|
|
7
|
-
import { View, StyleSheet } from "react-native";
|
|
8
|
-
import {
|
|
9
|
-
AtomicText,
|
|
10
|
-
useAppDesignTokens,
|
|
11
|
-
type DesignTokens,
|
|
12
|
-
} from "@umituz/react-native-design-system";
|
|
13
|
-
|
|
14
|
-
export interface ScenarioHeaderProps {
|
|
15
|
-
readonly title: string;
|
|
16
|
-
readonly subtitle: string;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export const ScenarioHeader: React.FC<ScenarioHeaderProps> = ({
|
|
20
|
-
title,
|
|
21
|
-
subtitle,
|
|
22
|
-
}) => {
|
|
23
|
-
const tokens = useAppDesignTokens();
|
|
24
|
-
const styles = React.useMemo(() => createStyles(tokens), [tokens]);
|
|
25
|
-
|
|
26
|
-
return (
|
|
27
|
-
<View style={styles.container}>
|
|
28
|
-
<AtomicText type="headlineLarge" style={styles.title}>
|
|
29
|
-
{title}
|
|
30
|
-
</AtomicText>
|
|
31
|
-
<AtomicText
|
|
32
|
-
type="bodyMedium"
|
|
33
|
-
color="textSecondary"
|
|
34
|
-
style={styles.subtitle}
|
|
35
|
-
>
|
|
36
|
-
{subtitle}
|
|
37
|
-
</AtomicText>
|
|
38
|
-
</View>
|
|
39
|
-
);
|
|
40
|
-
};
|
|
41
|
-
|
|
42
|
-
const createStyles = (tokens: DesignTokens) =>
|
|
43
|
-
StyleSheet.create({
|
|
44
|
-
container: {
|
|
45
|
-
paddingHorizontal: tokens.spacing.md,
|
|
46
|
-
paddingBottom: tokens.spacing.md,
|
|
47
|
-
gap: tokens.spacing.xs,
|
|
48
|
-
},
|
|
49
|
-
title: {
|
|
50
|
-
lineHeight: 34,
|
|
51
|
-
},
|
|
52
|
-
subtitle: {
|
|
53
|
-
lineHeight: 22,
|
|
54
|
-
},
|
|
55
|
-
});
|