@smileid/usesmileid 12.0.0-beta01 → 12.0.0
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/CHANGELOG.md +11 -0
- package/README.md +701 -89
- package/dist/camera/camera_defaults.d.ts +14 -9
- package/dist/camera/camera_defaults.d.ts.map +1 -1
- package/dist/camera/camera_defaults.js +11 -9
- package/dist/camera/camera_defaults.js.map +1 -1
- package/dist/camera/orientation_degrees.d.ts +5 -6
- package/dist/camera/orientation_degrees.d.ts.map +1 -1
- package/dist/camera/orientation_degrees.js +5 -6
- package/dist/camera/orientation_degrees.js.map +1 -1
- package/dist/core/models/document_capture_mode.d.ts +8 -0
- package/dist/core/models/document_capture_mode.d.ts.map +1 -1
- package/dist/core/models/document_capture_mode.js +24 -0
- package/dist/core/models/document_capture_mode.js.map +1 -1
- package/dist/core/models/document_type.d.ts +2 -2
- package/dist/core/models/document_type.d.ts.map +1 -1
- package/dist/core/models/document_type.js +6 -4
- package/dist/core/models/document_type.js.map +1 -1
- package/dist/core/models/result.d.ts +9 -8
- package/dist/core/models/result.d.ts.map +1 -1
- package/dist/core/models/result.js +5 -6
- package/dist/core/models/result.js.map +1 -1
- package/dist/data/api/interceptors/smile_auth_interceptor.js +1 -1
- package/dist/data/api/interceptors/smile_auth_interceptor.js.map +1 -1
- package/dist/data/api/interceptors/smile_integrity_interceptor.d.ts +11 -0
- package/dist/data/api/interceptors/smile_integrity_interceptor.d.ts.map +1 -1
- package/dist/data/api/interceptors/smile_integrity_interceptor.js +13 -0
- package/dist/data/api/interceptors/smile_integrity_interceptor.js.map +1 -1
- package/dist/data/api/interceptors/smile_request_mac_interceptor.d.ts +8 -0
- package/dist/data/api/interceptors/smile_request_mac_interceptor.d.ts.map +1 -1
- package/dist/data/api/interceptors/smile_request_mac_interceptor.js +11 -0
- package/dist/data/api/interceptors/smile_request_mac_interceptor.js.map +1 -1
- package/dist/data/compression/compressible_asset.d.ts +41 -0
- package/dist/data/compression/compressible_asset.d.ts.map +1 -0
- package/dist/data/compression/compressible_asset.js +34 -0
- package/dist/data/compression/compressible_asset.js.map +1 -0
- package/dist/data/compression/payload_compression_config.d.ts +36 -0
- package/dist/data/compression/payload_compression_config.d.ts.map +1 -0
- package/dist/data/compression/payload_compression_config.js +52 -0
- package/dist/data/compression/payload_compression_config.js.map +1 -0
- package/dist/data/compression/payload_compression_runner.d.ts +29 -0
- package/dist/data/compression/payload_compression_runner.d.ts.map +1 -0
- package/dist/data/compression/payload_compression_runner.js +55 -0
- package/dist/data/compression/payload_compression_runner.js.map +1 -0
- package/dist/data/compression/payload_compressor.d.ts +40 -0
- package/dist/data/compression/payload_compressor.d.ts.map +1 -0
- package/dist/data/compression/payload_compressor.js +126 -0
- package/dist/data/compression/payload_compressor.js.map +1 -0
- package/dist/data/compression/uri_compressible_asset.d.ts +23 -0
- package/dist/data/compression/uri_compressible_asset.d.ts.map +1 -0
- package/dist/data/compression/uri_compressible_asset.js +77 -0
- package/dist/data/compression/uri_compressible_asset.js.map +1 -0
- package/dist/data/dsl/builder/cache_config_builder.d.ts +2 -1
- package/dist/data/dsl/builder/cache_config_builder.d.ts.map +1 -1
- package/dist/data/dsl/builder/cache_config_builder.js +2 -1
- package/dist/data/dsl/builder/cache_config_builder.js.map +1 -1
- package/dist/data/dsl/builder/config_builder.d.ts +40 -14
- package/dist/data/dsl/builder/config_builder.d.ts.map +1 -1
- package/dist/data/dsl/builder/config_builder.js +40 -14
- package/dist/data/dsl/builder/config_builder.js.map +1 -1
- package/dist/data/dsl/builder/interceptor_config_builder.d.ts +9 -7
- package/dist/data/dsl/builder/interceptor_config_builder.d.ts.map +1 -1
- package/dist/data/dsl/builder/interceptor_config_builder.js +9 -7
- package/dist/data/dsl/builder/interceptor_config_builder.js.map +1 -1
- package/dist/data/dsl/builder/retry_config_builder.d.ts +16 -1
- package/dist/data/dsl/builder/retry_config_builder.d.ts.map +1 -1
- package/dist/data/dsl/builder/retry_config_builder.js +16 -1
- package/dist/data/dsl/builder/retry_config_builder.js.map +1 -1
- package/dist/data/dsl/builder/timeout_config_builder.d.ts +4 -0
- package/dist/data/dsl/builder/timeout_config_builder.d.ts.map +1 -1
- package/dist/data/dsl/builder/timeout_config_builder.js +4 -0
- package/dist/data/dsl/builder/timeout_config_builder.js.map +1 -1
- package/dist/data/dsl/use_smile_id_network_builder.d.ts +17 -0
- package/dist/data/dsl/use_smile_id_network_builder.d.ts.map +1 -1
- package/dist/data/dsl/use_smile_id_network_builder.js +17 -0
- package/dist/data/dsl/use_smile_id_network_builder.js.map +1 -1
- package/dist/data/factory/networking_factory.d.ts.map +1 -1
- package/dist/data/factory/networking_factory.js +11 -1
- package/dist/data/factory/networking_factory.js.map +1 -1
- package/dist/data/repository/use_smile_id_repository_impl.d.ts +6 -0
- package/dist/data/repository/use_smile_id_repository_impl.d.ts.map +1 -1
- package/dist/data/repository/use_smile_id_repository_impl.js +82 -8
- package/dist/data/repository/use_smile_id_repository_impl.js.map +1 -1
- package/dist/data/security/request_canonicalizer.d.ts.map +1 -1
- package/dist/data/security/request_canonicalizer.js +14 -2
- package/dist/data/security/request_canonicalizer.js.map +1 -1
- package/dist/data/security/security_policy.d.ts +43 -0
- package/dist/data/security/security_policy.d.ts.map +1 -0
- package/dist/data/security/security_policy.js +61 -0
- package/dist/data/security/security_policy.js.map +1 -0
- package/dist/data/util/retry_util.d.ts +1 -1
- package/dist/data/util/retry_util.d.ts.map +1 -1
- package/dist/data/util/retry_util.js +2 -1
- package/dist/data/util/retry_util.js.map +1 -1
- package/dist/data/util/use_smile_id_token_decoder.d.ts +22 -0
- package/dist/data/util/use_smile_id_token_decoder.d.ts.map +1 -1
- package/dist/data/util/use_smile_id_token_decoder.js +58 -24
- package/dist/data/util/use_smile_id_token_decoder.js.map +1 -1
- package/dist/l10n/strings_en.d.ts +2 -1
- package/dist/l10n/strings_en.d.ts.map +1 -1
- package/dist/l10n/strings_en.js +2 -1
- package/dist/l10n/strings_en.js.map +1 -1
- package/dist/l10n/use_smile_id_localizations.d.ts +1 -0
- package/dist/l10n/use_smile_id_localizations.d.ts.map +1 -1
- package/dist/l10n/use_smile_id_localizations.js +3 -0
- package/dist/l10n/use_smile_id_localizations.js.map +1 -1
- package/dist/metadata/builder_configuration.d.ts +39 -0
- package/dist/metadata/builder_configuration.d.ts.map +1 -0
- package/dist/metadata/builder_configuration.js +34 -0
- package/dist/metadata/builder_configuration.js.map +1 -0
- package/dist/metadata/captured_image_properties.d.ts +11 -0
- package/dist/metadata/captured_image_properties.d.ts.map +1 -0
- package/dist/metadata/captured_image_properties.js +11 -0
- package/dist/metadata/captured_image_properties.js.map +1 -0
- package/dist/metadata/device_orientation_collector.d.ts +17 -0
- package/dist/metadata/device_orientation_collector.d.ts.map +1 -0
- package/dist/metadata/device_orientation_collector.js +66 -0
- package/dist/metadata/device_orientation_collector.js.map +1 -0
- package/dist/metadata/geolocation.d.ts +20 -0
- package/dist/metadata/geolocation.d.ts.map +1 -0
- package/dist/metadata/geolocation.js +40 -0
- package/dist/metadata/geolocation.js.map +1 -0
- package/dist/metadata/metadata_configuration_mappers.d.ts +48 -0
- package/dist/metadata/metadata_configuration_mappers.d.ts.map +1 -0
- package/dist/metadata/metadata_configuration_mappers.js +171 -0
- package/dist/metadata/metadata_configuration_mappers.js.map +1 -0
- package/dist/metadata/model_configuration.d.ts +41 -0
- package/dist/metadata/model_configuration.d.ts.map +1 -0
- package/dist/metadata/model_configuration.js +44 -0
- package/dist/metadata/model_configuration.js.map +1 -0
- package/dist/metadata/optional_native_modules.d.ts +79 -3
- package/dist/metadata/optional_native_modules.d.ts.map +1 -1
- package/dist/metadata/optional_native_modules.js +108 -3
- package/dist/metadata/optional_native_modules.js.map +1 -1
- package/dist/metadata/use_smile_id_metadata.d.ts +45 -7
- package/dist/metadata/use_smile_id_metadata.d.ts.map +1 -1
- package/dist/metadata/use_smile_id_metadata.js +85 -13
- package/dist/metadata/use_smile_id_metadata.js.map +1 -1
- package/dist/metadata/use_smile_id_metadata_factory.d.ts +37 -0
- package/dist/metadata/use_smile_id_metadata_factory.d.ts.map +1 -1
- package/dist/metadata/use_smile_id_metadata_factory.js +184 -12
- package/dist/metadata/use_smile_id_metadata_factory.js.map +1 -1
- package/dist/presentation/assets/svg/document_shimmer_strings.d.ts +14 -0
- package/dist/presentation/assets/svg/document_shimmer_strings.d.ts.map +1 -0
- package/dist/presentation/assets/svg/document_shimmer_strings.js +14 -0
- package/dist/presentation/assets/svg/document_shimmer_strings.js.map +1 -0
- package/dist/presentation/assets/svg/instruction_svg_strings.d.ts +12 -4
- package/dist/presentation/assets/svg/instruction_svg_strings.d.ts.map +1 -1
- package/dist/presentation/assets/svg/instruction_svg_strings.js +19 -8
- package/dist/presentation/assets/svg/instruction_svg_strings.js.map +1 -1
- package/dist/presentation/components/helpers/enhanced_smart_selfie_animation_frames.d.ts +0 -5
- package/dist/presentation/components/helpers/enhanced_smart_selfie_animation_frames.d.ts.map +1 -1
- package/dist/presentation/components/helpers/enhanced_smart_selfie_animation_frames.js +0 -5
- package/dist/presentation/components/helpers/enhanced_smart_selfie_animation_frames.js.map +1 -1
- package/dist/presentation/components/icons/index.d.ts +24 -8
- package/dist/presentation/components/icons/index.d.ts.map +1 -1
- package/dist/presentation/components/icons/index.js +31 -11
- package/dist/presentation/components/icons/index.js.map +1 -1
- package/dist/presentation/components/use_smile_id_attribution.d.ts +1 -1
- package/dist/presentation/components/use_smile_id_button.d.ts +2 -2
- package/dist/presentation/components/use_smile_id_button.js +4 -4
- package/dist/presentation/components/use_smile_id_button.js.map +1 -1
- package/dist/presentation/components/use_smile_id_capture_content.d.ts +13 -0
- package/dist/presentation/components/use_smile_id_capture_content.d.ts.map +1 -1
- package/dist/presentation/components/use_smile_id_capture_content.js +15 -9
- package/dist/presentation/components/use_smile_id_capture_content.js.map +1 -1
- package/dist/presentation/components/use_smile_id_captured_document_image.d.ts +2 -3
- package/dist/presentation/components/use_smile_id_captured_document_image.d.ts.map +1 -1
- package/dist/presentation/components/use_smile_id_captured_document_image.js +1 -3
- package/dist/presentation/components/use_smile_id_captured_document_image.js.map +1 -1
- package/dist/presentation/components/use_smile_id_document_capture_controls.d.ts +12 -6
- package/dist/presentation/components/use_smile_id_document_capture_controls.d.ts.map +1 -1
- package/dist/presentation/components/use_smile_id_document_capture_controls.js +59 -16
- package/dist/presentation/components/use_smile_id_document_capture_controls.js.map +1 -1
- package/dist/presentation/components/use_smile_id_document_overlay.d.ts +22 -5
- package/dist/presentation/components/use_smile_id_document_overlay.d.ts.map +1 -1
- package/dist/presentation/components/use_smile_id_document_overlay.js +80 -40
- package/dist/presentation/components/use_smile_id_document_overlay.js.map +1 -1
- package/dist/presentation/components/use_smile_id_document_shimmer.d.ts +15 -0
- package/dist/presentation/components/use_smile_id_document_shimmer.d.ts.map +1 -0
- package/dist/presentation/components/use_smile_id_document_shimmer.js +23 -0
- package/dist/presentation/components/use_smile_id_document_shimmer.js.map +1 -0
- package/dist/presentation/components/use_smile_id_enhanced_smart_selfie_clip.d.ts.map +1 -1
- package/dist/presentation/components/use_smile_id_enhanced_smart_selfie_clip.js +1 -3
- package/dist/presentation/components/use_smile_id_enhanced_smart_selfie_clip.js.map +1 -1
- package/dist/presentation/components/use_smile_id_guideline_thumbnail.d.ts.map +1 -1
- package/dist/presentation/components/use_smile_id_guideline_thumbnail.js +84 -1
- package/dist/presentation/components/use_smile_id_guideline_thumbnail.js.map +1 -1
- package/dist/presentation/components/use_smile_id_instructions_hero.d.ts +3 -1
- package/dist/presentation/components/use_smile_id_instructions_hero.d.ts.map +1 -1
- package/dist/presentation/components/use_smile_id_instructions_hero.js +18 -3
- package/dist/presentation/components/use_smile_id_instructions_hero.js.map +1 -1
- package/dist/presentation/components/use_smile_id_oval_border_palette.d.ts.map +1 -1
- package/dist/presentation/components/use_smile_id_oval_border_palette.js +7 -3
- package/dist/presentation/components/use_smile_id_oval_border_palette.js.map +1 -1
- package/dist/presentation/flow/dsl/builder/config_builder.d.ts +12 -0
- package/dist/presentation/flow/dsl/builder/config_builder.d.ts.map +1 -1
- package/dist/presentation/flow/dsl/builder/config_builder.js +12 -0
- package/dist/presentation/flow/dsl/builder/config_builder.js.map +1 -1
- package/dist/presentation/flow/dsl/builder/ml_builder.d.ts +13 -4
- package/dist/presentation/flow/dsl/builder/ml_builder.d.ts.map +1 -1
- package/dist/presentation/flow/dsl/builder/ml_builder.js +3 -2
- package/dist/presentation/flow/dsl/builder/ml_builder.js.map +1 -1
- package/dist/presentation/flow/dsl/builder/screens_builder.d.ts +111 -10
- package/dist/presentation/flow/dsl/builder/screens_builder.d.ts.map +1 -1
- package/dist/presentation/flow/dsl/builder/screens_builder.js +111 -10
- package/dist/presentation/flow/dsl/builder/screens_builder.js.map +1 -1
- package/dist/presentation/flow/dsl/builder/theme_builder.d.ts +15 -2
- package/dist/presentation/flow/dsl/builder/theme_builder.d.ts.map +1 -1
- package/dist/presentation/flow/dsl/builder/theme_builder.js +15 -2
- package/dist/presentation/flow/dsl/builder/theme_builder.js.map +1 -1
- package/dist/presentation/flow/dsl/use_smile_id_builder.d.ts +6 -4
- package/dist/presentation/flow/dsl/use_smile_id_builder.d.ts.map +1 -1
- package/dist/presentation/flow/dsl/use_smile_id_builder.js.map +1 -1
- package/dist/presentation/flow/dsl/use_smile_id_flow_builder.d.ts +62 -36
- package/dist/presentation/flow/dsl/use_smile_id_flow_builder.d.ts.map +1 -1
- package/dist/presentation/flow/dsl/use_smile_id_flow_builder.js +62 -36
- package/dist/presentation/flow/dsl/use_smile_id_flow_builder.js.map +1 -1
- package/dist/presentation/flow/flow_navigation_manager.d.ts +39 -4
- package/dist/presentation/flow/flow_navigation_manager.d.ts.map +1 -1
- package/dist/presentation/flow/flow_navigation_manager.js +141 -10
- package/dist/presentation/flow/flow_navigation_manager.js.map +1 -1
- package/dist/presentation/flow/model/instruction_guideline.d.ts +9 -0
- package/dist/presentation/flow/model/instruction_guideline.d.ts.map +1 -1
- package/dist/presentation/flow/model/instructions_defaults.d.ts +11 -2
- package/dist/presentation/flow/model/instructions_defaults.d.ts.map +1 -1
- package/dist/presentation/flow/model/instructions_defaults.js +73 -25
- package/dist/presentation/flow/model/instructions_defaults.js.map +1 -1
- package/dist/presentation/flow/screen/orchestrated_capture_screen.d.ts.map +1 -1
- package/dist/presentation/flow/screen/orchestrated_capture_screen.js +36 -12
- package/dist/presentation/flow/screen/orchestrated_capture_screen.js.map +1 -1
- package/dist/presentation/flow/screen/orchestrated_instructions_screen.js +1 -1
- package/dist/presentation/flow/screen/orchestrated_instructions_screen.js.map +1 -1
- package/dist/presentation/flow/screen/orchestrated_preview_screen.d.ts.map +1 -1
- package/dist/presentation/flow/screen/orchestrated_preview_screen.js +3 -1
- package/dist/presentation/flow/screen/orchestrated_preview_screen.js.map +1 -1
- package/dist/presentation/flow/screen/orchestrated_processing_screen.js +3 -3
- package/dist/presentation/flow/screen/orchestrated_processing_screen.js.map +1 -1
- package/dist/presentation/flow/validation/job_type_validator.d.ts.map +1 -1
- package/dist/presentation/flow/validation/job_type_validator.js +14 -0
- package/dist/presentation/flow/validation/job_type_validator.js.map +1 -1
- package/dist/presentation/screen/helpers/capture_screen_helpers.d.ts.map +1 -1
- package/dist/presentation/screen/helpers/capture_screen_helpers.js +1 -0
- package/dist/presentation/screen/helpers/capture_screen_helpers.js.map +1 -1
- package/dist/presentation/screen/helpers/instructions_screen_helpers.d.ts +1 -0
- package/dist/presentation/screen/helpers/instructions_screen_helpers.d.ts.map +1 -1
- package/dist/presentation/screen/helpers/instructions_screen_helpers.js +6 -2
- package/dist/presentation/screen/helpers/instructions_screen_helpers.js.map +1 -1
- package/dist/presentation/screen/helpers/scan_state_to_overlay_state.js +3 -0
- package/dist/presentation/screen/helpers/scan_state_to_overlay_state.js.map +1 -1
- package/dist/presentation/screen/use_smile_id_capture_screen.d.ts +17 -1
- package/dist/presentation/screen/use_smile_id_capture_screen.d.ts.map +1 -1
- package/dist/presentation/screen/use_smile_id_capture_screen.js +153 -18
- package/dist/presentation/screen/use_smile_id_capture_screen.js.map +1 -1
- package/dist/presentation/screen/use_smile_id_document_preview_screen.d.ts +2 -3
- package/dist/presentation/screen/use_smile_id_document_preview_screen.d.ts.map +1 -1
- package/dist/presentation/screen/use_smile_id_document_preview_screen.js +16 -11
- package/dist/presentation/screen/use_smile_id_document_preview_screen.js.map +1 -1
- package/dist/presentation/screen/use_smile_id_instructions_screen.d.ts +2 -0
- package/dist/presentation/screen/use_smile_id_instructions_screen.d.ts.map +1 -1
- package/dist/presentation/screen/use_smile_id_instructions_screen.js +2 -1
- package/dist/presentation/screen/use_smile_id_instructions_screen.js.map +1 -1
- package/dist/presentation/screen/use_smile_id_preview_screen.d.ts +7 -6
- package/dist/presentation/screen/use_smile_id_preview_screen.d.ts.map +1 -1
- package/dist/presentation/screen/use_smile_id_preview_screen.js +9 -8
- package/dist/presentation/screen/use_smile_id_preview_screen.js.map +1 -1
- package/dist/presentation/screen/use_smile_id_processing_screen.d.ts +2 -3
- package/dist/presentation/screen/use_smile_id_processing_screen.d.ts.map +1 -1
- package/dist/presentation/screen/use_smile_id_processing_screen.js +3 -2
- package/dist/presentation/screen/use_smile_id_processing_screen.js.map +1 -1
- package/dist/presentation/theme/theme.d.ts +1 -1
- package/dist/presentation/theme/theme.d.ts.map +1 -1
- package/dist/presentation/theme/theme.js +20 -18
- package/dist/presentation/theme/theme.js.map +1 -1
- package/dist/presentation/utils/force_max_brightness.d.ts +4 -4
- package/package.json +26 -6
- package/src/__tests__/react_native_mock.tsx +8 -0
- package/src/camera/camera_defaults.ts +11 -9
- package/src/camera/orientation_degrees.ts +5 -6
- package/src/core/models/__tests__/document_type.test.ts +6 -4
- package/src/core/models/document_capture_mode.ts +27 -0
- package/src/core/models/document_type.ts +6 -4
- package/src/core/models/result.ts +9 -8
- package/src/data/api/interceptors/__tests__/smile_integrity_interceptor.test.ts +37 -1
- package/src/data/api/interceptors/__tests__/smile_request_mac_interceptor.test.ts +59 -1
- package/src/data/api/interceptors/smile_auth_interceptor.ts +1 -1
- package/src/data/api/interceptors/smile_integrity_interceptor.ts +20 -0
- package/src/data/api/interceptors/smile_request_mac_interceptor.ts +13 -0
- package/src/data/compression/__tests__/payload_compressor.test.ts +200 -0
- package/src/data/compression/__tests__/payload_compressor_real_jpeg.test.ts +222 -0
- package/src/data/compression/compressible_asset.ts +62 -0
- package/src/data/compression/payload_compression_config.ts +53 -0
- package/src/data/compression/payload_compression_runner.ts +102 -0
- package/src/data/compression/payload_compressor.ts +164 -0
- package/src/data/compression/uri_compressible_asset.ts +85 -0
- package/src/data/dsl/builder/cache_config_builder.ts +3 -1
- package/src/data/dsl/builder/config_builder.ts +45 -14
- package/src/data/dsl/builder/interceptor_config_builder.ts +9 -7
- package/src/data/dsl/builder/retry_config_builder.ts +22 -1
- package/src/data/dsl/builder/timeout_config_builder.ts +7 -0
- package/src/data/dsl/use_smile_id_network_builder.ts +17 -0
- package/src/data/factory/networking_factory.ts +14 -1
- package/src/data/repository/__tests__/network_retries.test.ts +117 -0
- package/src/data/repository/use_smile_id_repository_impl.ts +96 -9
- package/src/data/security/__tests__/security_policy.test.ts +96 -0
- package/src/data/security/__tests__/smile_id_crypto_manager.test.ts +18 -0
- package/src/data/security/request_canonicalizer.ts +15 -2
- package/src/data/security/security_policy.ts +70 -0
- package/src/data/util/__tests__/use_smile_id_token_decoder.test.ts +57 -1
- package/src/data/util/retry_util.ts +3 -2
- package/src/data/util/use_smile_id_token_decoder.ts +76 -28
- package/src/l10n/strings_en.ts +2 -1
- package/src/l10n/use_smile_id_localizations.ts +3 -0
- package/src/metadata/__tests__/device_orientation_collector.test.ts +15 -0
- package/src/metadata/__tests__/metadata_configuration_mappers.test.ts +215 -0
- package/src/metadata/__tests__/metadata_configuration_objects.test.ts +85 -0
- package/src/metadata/__tests__/metadata_device_context.test.ts +147 -0
- package/src/metadata/__tests__/metadata_golden_fixture.json +13 -0
- package/src/metadata/__tests__/metadata_payload_golden.test.ts +193 -0
- package/src/metadata/__tests__/use_smile_id_metadata.test.ts +18 -24
- package/src/metadata/builder_configuration.ts +63 -0
- package/src/metadata/captured_image_properties.ts +10 -0
- package/src/metadata/device_orientation_collector.ts +75 -0
- package/src/metadata/geolocation.ts +46 -0
- package/src/metadata/metadata_configuration_mappers.ts +234 -0
- package/src/metadata/model_configuration.ts +68 -0
- package/src/metadata/optional_native_modules.ts +157 -3
- package/src/metadata/use_smile_id_metadata.ts +140 -17
- package/src/metadata/use_smile_id_metadata_factory.ts +195 -11
- package/src/presentation/assets/si_ess_animation_all_directions.json +1300 -286
- package/src/presentation/assets/svg/document_shimmer_strings.ts +17 -0
- package/src/presentation/assets/svg/instruction_svg_strings.ts +34 -12
- package/src/presentation/components/__tests__/enhanced_smart_selfie_animation_frames.test.ts +1 -3
- package/src/presentation/components/__tests__/use_smile_id_enhanced_smart_selfie_clip.test.tsx +3 -4
- package/src/presentation/components/__tests__/use_smile_id_guideline_thumbnail.test.tsx +34 -1
- package/src/presentation/components/__tests__/use_smile_id_instructions_hero.test.tsx +27 -0
- package/src/presentation/components/__tests__/use_smile_id_oval_border_palette.test.ts +7 -5
- package/src/presentation/components/helpers/enhanced_smart_selfie_animation_frames.ts +0 -6
- package/src/presentation/components/icons/index.tsx +65 -18
- package/src/presentation/components/use_smile_id_attribution.tsx +1 -1
- package/src/presentation/components/use_smile_id_button.tsx +4 -4
- package/src/presentation/components/use_smile_id_capture_content.tsx +36 -12
- package/src/presentation/components/use_smile_id_captured_document_image.tsx +3 -8
- package/src/presentation/components/use_smile_id_document_capture_controls.tsx +103 -39
- package/src/presentation/components/use_smile_id_document_overlay.tsx +134 -44
- package/src/presentation/components/use_smile_id_document_shimmer.tsx +51 -0
- package/src/presentation/components/use_smile_id_enhanced_smart_selfie_clip.tsx +0 -3
- package/src/presentation/components/use_smile_id_guideline_thumbnail.tsx +131 -2
- package/src/presentation/components/use_smile_id_instructions_hero.tsx +100 -59
- package/src/presentation/components/use_smile_id_oval_border_palette.ts +7 -3
- package/src/presentation/flow/__tests__/document_flow_navigation.test.ts +200 -1
- package/src/presentation/flow/dsl/builder/config_builder.ts +14 -0
- package/src/presentation/flow/dsl/builder/ml_builder.ts +13 -4
- package/src/presentation/flow/dsl/builder/screens_builder.ts +111 -10
- package/src/presentation/flow/dsl/builder/theme_builder.ts +19 -2
- package/src/presentation/flow/dsl/use_smile_id_builder.tsx +6 -4
- package/src/presentation/flow/dsl/use_smile_id_flow_builder.ts +62 -36
- package/src/presentation/flow/flow_navigation_manager.ts +179 -13
- package/src/presentation/flow/model/instruction_guideline.ts +6 -0
- package/src/presentation/flow/model/instructions_defaults.ts +103 -25
- package/src/presentation/flow/screen/orchestrated_capture_screen.tsx +43 -10
- package/src/presentation/flow/screen/orchestrated_instructions_screen.tsx +1 -0
- package/src/presentation/flow/screen/orchestrated_preview_screen.tsx +4 -2
- package/src/presentation/flow/screen/orchestrated_processing_screen.tsx +3 -3
- package/src/presentation/flow/validation/__tests__/job_type_validator.test.ts +64 -0
- package/src/presentation/flow/validation/job_type_validator.ts +24 -0
- package/src/presentation/screen/__tests__/instructions_screen_helpers.test.ts +15 -3
- package/src/presentation/screen/__tests__/use_smile_id_capture_screen.test.tsx +6 -4
- package/src/presentation/screen/helpers/capture_screen_helpers.ts +1 -0
- package/src/presentation/screen/helpers/instructions_screen_helpers.ts +7 -2
- package/src/presentation/screen/helpers/scan_state_to_overlay_state.ts +3 -0
- package/src/presentation/screen/use_smile_id_capture_screen.tsx +234 -36
- package/src/presentation/screen/use_smile_id_document_preview_screen.tsx +32 -22
- package/src/presentation/screen/use_smile_id_instructions_screen.tsx +4 -0
- package/src/presentation/screen/use_smile_id_preview_screen.tsx +9 -9
- package/src/presentation/screen/use_smile_id_processing_screen.tsx +7 -7
- package/src/presentation/theme/theme.ts +21 -19
- package/src/presentation/utils/force_max_brightness.tsx +4 -4
- package/dist/camera/frame_processor_plugin.d.ts +0 -28
- package/dist/camera/frame_processor_plugin.d.ts.map +0 -1
- package/dist/camera/frame_processor_plugin.js +0 -21
- package/dist/camera/frame_processor_plugin.js.map +0 -1
- package/dist/camera/use_smile_id_frame_processor.d.ts +0 -38
- package/dist/camera/use_smile_id_frame_processor.d.ts.map +0 -1
- package/dist/camera/use_smile_id_frame_processor.js +0 -2
- package/dist/camera/use_smile_id_frame_processor.js.map +0 -1
- package/dist/presentation/components/use_smile_id_document_frame_glyph.d.ts +0 -17
- package/dist/presentation/components/use_smile_id_document_frame_glyph.d.ts.map +0 -1
- package/dist/presentation/components/use_smile_id_document_frame_glyph.js +0 -17
- package/dist/presentation/components/use_smile_id_document_frame_glyph.js.map +0 -1
- package/dist/presentation/components/use_smile_id_enhanced_smart_selfie_animation.d.ts +0 -24
- package/dist/presentation/components/use_smile_id_enhanced_smart_selfie_animation.d.ts.map +0 -1
- package/dist/presentation/components/use_smile_id_enhanced_smart_selfie_animation.js +0 -91
- package/dist/presentation/components/use_smile_id_enhanced_smart_selfie_animation.js.map +0 -1
- package/dist/presentation/components/use_smile_id_instruction_card.d.ts +0 -31
- package/dist/presentation/components/use_smile_id_instruction_card.d.ts.map +0 -1
- package/dist/presentation/components/use_smile_id_instruction_card.js +0 -43
- package/dist/presentation/components/use_smile_id_instruction_card.js.map +0 -1
- package/dist/presentation/screen/helpers/use_document_orientation_lock.d.ts +0 -24
- package/dist/presentation/screen/helpers/use_document_orientation_lock.d.ts.map +0 -1
- package/dist/presentation/screen/helpers/use_document_orientation_lock.js +0 -47
- package/dist/presentation/screen/helpers/use_document_orientation_lock.js.map +0 -1
- package/src/presentation/components/use_smile_id_document_frame_glyph.tsx +0 -162
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { memo } from "react";
|
|
2
2
|
import { StyleSheet, Text, View } from "react-native";
|
|
3
|
+
import { useSafeAreaInsets } from "react-native-safe-area-context";
|
|
3
4
|
import Svg, { Path } from "react-native-svg";
|
|
4
5
|
import type { UseSmileIDTheme } from "../theme/theme";
|
|
5
6
|
import { useUseSmileIDTheme } from "../theme/theme_context";
|
|
@@ -7,7 +8,10 @@ import {
|
|
|
7
8
|
isDocumentCaptureActive,
|
|
8
9
|
type UseSmileIDOverlayState as OverlayState,
|
|
9
10
|
} from "../state/use_smile_id_overlay_state";
|
|
10
|
-
import {
|
|
11
|
+
import type { DocumentType } from "../../core/models/document_type";
|
|
12
|
+
import { UseSmileIDOvalBorderPalette } from "./use_smile_id_oval_border_palette";
|
|
13
|
+
import { UseSmileIDDocumentShimmer } from "./use_smile_id_document_shimmer";
|
|
14
|
+
import { UseSmileIDCaptureSpinner } from "./use_smile_id_capture_spinner";
|
|
11
15
|
|
|
12
16
|
export type UseSmileIDDocumentOverlayProps = {
|
|
13
17
|
readonly state: OverlayState;
|
|
@@ -15,6 +19,10 @@ export type UseSmileIDDocumentOverlayProps = {
|
|
|
15
19
|
readonly containerHeight: number;
|
|
16
20
|
/** Optional aspect ratio hint — e.g. CR-80 ID card = 1.586. */
|
|
17
21
|
readonly knownIdAspectRatio?: number;
|
|
22
|
+
/** Document type — selects the in-frame shimmer skeleton. */
|
|
23
|
+
readonly documentTypeKind?: DocumentType["kind"];
|
|
24
|
+
/** Generic-document back side — swaps the front skeleton for the back. */
|
|
25
|
+
readonly isBackSide?: boolean;
|
|
18
26
|
/**
|
|
19
27
|
* Coaching copy shown in the dark pill below the frame. Rendered here so it
|
|
20
28
|
* tracks the frame geometry instead of a fixed screen offset.
|
|
@@ -28,50 +36,88 @@ export type UseSmileIDDocumentOverlayProps = {
|
|
|
28
36
|
const CHIP_TOP_GAP = 16;
|
|
29
37
|
|
|
30
38
|
/**
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
39
|
+
* Frame spans ≤71% of container width, height capped at 61% (re-deriving width
|
|
40
|
+
* from aspect when the cap bites — keeps a wide ID-1 card from overflowing in
|
|
41
|
+
* landscape). One ratio pair drives both orientations.
|
|
34
42
|
*/
|
|
35
|
-
const
|
|
36
|
-
const
|
|
43
|
+
const FRAME_MAX_WIDTH_RATIO = 0.71;
|
|
44
|
+
const FRAME_MAX_HEIGHT_RATIO = 0.61;
|
|
37
45
|
/** Frame corner radius (matches the bordered frame's `borderRadius`). */
|
|
38
|
-
const FRAME_CORNER_RADIUS =
|
|
46
|
+
const FRAME_CORNER_RADIUS = 16;
|
|
47
|
+
/** Guide-rect border thickness; drawn straddling the frame edge (centred stroke, matching the other SDKs). */
|
|
48
|
+
const FRAME_BORDER_WIDTH = 4;
|
|
49
|
+
/** Capture-progress spinner shown beside the frame (landscape) or bottom-centre (portrait). */
|
|
50
|
+
const SPINNER_SIZE = 48;
|
|
51
|
+
/** Portrait spinner gap above the safe-area bottom (spacing.large) — matches the shutter row. */
|
|
52
|
+
const PORTRAIT_SPINNER_BOTTOM_GAP = 24;
|
|
53
|
+
|
|
54
|
+
/** Default document aspect (CR-80 ID-1 card) when no known ratio is supplied. */
|
|
55
|
+
export const DEFAULT_DOCUMENT_ASPECT = 1.586;
|
|
56
|
+
|
|
39
57
|
/**
|
|
40
|
-
*
|
|
41
|
-
*
|
|
42
|
-
*
|
|
58
|
+
* Centred document guide rectangle (container px) for a document [aspect] and
|
|
59
|
+
* viewport. Single source of truth shared by the overlay (draws the frame) and
|
|
60
|
+
* the capture screen (derives the native crop region), so the saved capture
|
|
61
|
+
* matches the frame the user saw.
|
|
62
|
+
*/
|
|
63
|
+
export function documentGuideRect(
|
|
64
|
+
aspect: number,
|
|
65
|
+
containerWidth: number,
|
|
66
|
+
containerHeight: number,
|
|
67
|
+
): {
|
|
68
|
+
readonly left: number;
|
|
69
|
+
readonly top: number;
|
|
70
|
+
readonly width: number;
|
|
71
|
+
readonly height: number;
|
|
72
|
+
} {
|
|
73
|
+
let width = containerWidth * FRAME_MAX_WIDTH_RATIO;
|
|
74
|
+
let height = width / aspect;
|
|
75
|
+
const maxHeight = containerHeight * FRAME_MAX_HEIGHT_RATIO;
|
|
76
|
+
if (height > maxHeight) {
|
|
77
|
+
height = maxHeight;
|
|
78
|
+
width = height * aspect;
|
|
79
|
+
}
|
|
80
|
+
return {
|
|
81
|
+
left: (containerWidth - width) / 2,
|
|
82
|
+
top: (containerHeight - height) / 2,
|
|
83
|
+
width,
|
|
84
|
+
height,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Faint black tint over the whole live feed (~0.15 inside the frame). Component
|
|
89
|
+
* constant, not a theme colour — the surround dim is the overridable layer.
|
|
43
90
|
*/
|
|
44
91
|
const DOCUMENT_CAMERA_TINT = "#00000026"; // black @15%
|
|
45
92
|
/** Fallback surround dim when the theme omits `documentOverlayScrim`. */
|
|
46
93
|
const DEFAULT_DOCUMENT_OVERLAY_SCRIM = "#00000066"; // black @40%
|
|
47
94
|
|
|
48
95
|
/**
|
|
49
|
-
* Document capture frame — two-layer dim
|
|
50
|
-
*
|
|
51
|
-
*
|
|
52
|
-
* masks rasterize the full-screen layer to a bitmap on the UI thread per invalidation,
|
|
53
|
-
* freezing the camera preview. Respects `knownIdAspectRatio`; the frame stays centred.
|
|
96
|
+
* Document capture frame — two-layer dim + a border that flips to `ovalActive`
|
|
97
|
+
* on `DOCUMENT_READY`. The cutout is one even-odd path, NOT a `<Mask>` (masks
|
|
98
|
+
* rasterize the full-screen layer per invalidation, freezing the preview).
|
|
54
99
|
*/
|
|
55
100
|
export function UseSmileIDDocumentOverlay(
|
|
56
101
|
props: UseSmileIDDocumentOverlayProps,
|
|
57
102
|
) {
|
|
58
103
|
const themeFromContext = useUseSmileIDTheme();
|
|
59
104
|
const theme = props.theme ?? themeFromContext;
|
|
60
|
-
const
|
|
61
|
-
const
|
|
62
|
-
const
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
//
|
|
105
|
+
const insets = useSafeAreaInsets();
|
|
106
|
+
const aspect = props.knownIdAspectRatio ?? DEFAULT_DOCUMENT_ASPECT;
|
|
107
|
+
const isPortrait = aspect < 1;
|
|
108
|
+
const {
|
|
109
|
+
left,
|
|
110
|
+
top,
|
|
111
|
+
width: frameWidth,
|
|
112
|
+
height: frameHeight,
|
|
113
|
+
} = documentGuideRect(aspect, props.containerWidth, props.containerHeight);
|
|
114
|
+
// Three-state border, shared with the selfie oval (UseSmileIDOvalBorderPalette):
|
|
115
|
+
// green once the document is correctly framed (ready / capturing / processing),
|
|
116
|
+
// red while detected but mispositioned (too far / close / off-centre / not
|
|
117
|
+
// steady), neutral while idle.
|
|
71
118
|
const captureActive = isDocumentCaptureActive(props.state);
|
|
72
|
-
const borderColor =
|
|
73
|
-
|
|
74
|
-
: theme.colors.stroke;
|
|
119
|
+
const borderColor =
|
|
120
|
+
theme.colors[UseSmileIDOvalBorderPalette.tokenFor(props.state, false)];
|
|
75
121
|
const surroundColor =
|
|
76
122
|
theme.colors.documentOverlayScrim ?? DEFAULT_DOCUMENT_OVERLAY_SCRIM;
|
|
77
123
|
|
|
@@ -104,37 +150,81 @@ export function UseSmileIDDocumentOverlay(
|
|
|
104
150
|
cornerRadius={FRAME_CORNER_RADIUS}
|
|
105
151
|
color={surroundColor}
|
|
106
152
|
/>
|
|
107
|
-
{/* In-frame document
|
|
153
|
+
{/* In-frame document shimmer — per-type skeleton hint while positioning. */}
|
|
108
154
|
{!captureActive ? (
|
|
109
155
|
<View
|
|
110
156
|
style={{
|
|
157
|
+
// Inset 10% per axis so the shimmer guide never touches the frame edge.
|
|
111
158
|
position: "absolute",
|
|
112
|
-
left,
|
|
113
|
-
top,
|
|
114
|
-
width: frameWidth,
|
|
115
|
-
height: frameHeight,
|
|
159
|
+
left: left + frameWidth * 0.1,
|
|
160
|
+
top: top + frameHeight * 0.1,
|
|
161
|
+
width: frameWidth * 0.8,
|
|
162
|
+
height: frameHeight * 0.8,
|
|
116
163
|
}}
|
|
117
164
|
pointerEvents="none"
|
|
118
165
|
>
|
|
119
|
-
<
|
|
120
|
-
width={frameWidth}
|
|
121
|
-
height={frameHeight}
|
|
122
|
-
|
|
166
|
+
<UseSmileIDDocumentShimmer
|
|
167
|
+
width={frameWidth * 0.8}
|
|
168
|
+
height={frameHeight * 0.8}
|
|
169
|
+
isBackSide={props.isBackSide ?? false}
|
|
170
|
+
{...(props.documentTypeKind !== undefined
|
|
171
|
+
? { documentTypeKind: props.documentTypeKind }
|
|
172
|
+
: {})}
|
|
123
173
|
/>
|
|
124
174
|
</View>
|
|
125
175
|
) : null}
|
|
126
176
|
<View
|
|
127
177
|
style={{
|
|
128
178
|
position: "absolute",
|
|
129
|
-
left,
|
|
130
|
-
top,
|
|
131
|
-
width: frameWidth,
|
|
132
|
-
height: frameHeight,
|
|
133
|
-
borderWidth:
|
|
134
|
-
borderRadius: FRAME_CORNER_RADIUS,
|
|
179
|
+
left: left - FRAME_BORDER_WIDTH / 2,
|
|
180
|
+
top: top - FRAME_BORDER_WIDTH / 2,
|
|
181
|
+
width: frameWidth + FRAME_BORDER_WIDTH,
|
|
182
|
+
height: frameHeight + FRAME_BORDER_WIDTH,
|
|
183
|
+
borderWidth: FRAME_BORDER_WIDTH,
|
|
184
|
+
borderRadius: FRAME_CORNER_RADIUS + FRAME_BORDER_WIDTH / 2,
|
|
135
185
|
borderColor,
|
|
136
186
|
}}
|
|
137
187
|
/>
|
|
188
|
+
{/* Capture-progress spinner: beside the frame in landscape; bottom-centre in portrait
|
|
189
|
+
(e.g. Green Book), where the near-full-width frame leaves no side margin. */}
|
|
190
|
+
{captureActive ? (
|
|
191
|
+
isPortrait ? (
|
|
192
|
+
<View
|
|
193
|
+
style={{
|
|
194
|
+
position: "absolute",
|
|
195
|
+
left: 0,
|
|
196
|
+
right: 0,
|
|
197
|
+
bottom: insets.bottom + PORTRAIT_SPINNER_BOTTOM_GAP,
|
|
198
|
+
alignItems: "center",
|
|
199
|
+
}}
|
|
200
|
+
pointerEvents="none"
|
|
201
|
+
>
|
|
202
|
+
<UseSmileIDCaptureSpinner
|
|
203
|
+
size={SPINNER_SIZE}
|
|
204
|
+
color={theme.colors.ovalActive}
|
|
205
|
+
testID="si_document_capture_spinner"
|
|
206
|
+
/>
|
|
207
|
+
</View>
|
|
208
|
+
) : (
|
|
209
|
+
<View
|
|
210
|
+
style={{
|
|
211
|
+
position: "absolute",
|
|
212
|
+
left:
|
|
213
|
+
left +
|
|
214
|
+
frameWidth +
|
|
215
|
+
(props.containerWidth - (left + frameWidth) - SPINNER_SIZE) / 2,
|
|
216
|
+
top: top + (frameHeight - SPINNER_SIZE) / 2,
|
|
217
|
+
}}
|
|
218
|
+
pointerEvents="none"
|
|
219
|
+
>
|
|
220
|
+
<UseSmileIDCaptureSpinner
|
|
221
|
+
size={SPINNER_SIZE}
|
|
222
|
+
color={theme.colors.ovalActive}
|
|
223
|
+
testID="si_document_capture_spinner"
|
|
224
|
+
/>
|
|
225
|
+
</View>
|
|
226
|
+
)
|
|
227
|
+
) : null}
|
|
138
228
|
{/* Coaching pill, anchored just below the frame (Figma off-black pill). */}
|
|
139
229
|
{props.feedbackText ? (
|
|
140
230
|
<View
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { memo } from "react";
|
|
2
|
+
import { SvgXml } from "react-native-svg";
|
|
3
|
+
import type { DocumentType } from "../../core/models/document_type";
|
|
4
|
+
import {
|
|
5
|
+
SI_DOCUMENT_BACK_SHIMMER,
|
|
6
|
+
SI_DOCUMENT_FRONT_SHIMMER,
|
|
7
|
+
SI_DOCUMENT_GREEN_BOOK_SHIMMER,
|
|
8
|
+
SI_DOCUMENT_PASSPORT_SHIMMER,
|
|
9
|
+
} from "../assets/svg/document_shimmer_strings";
|
|
10
|
+
|
|
11
|
+
/** Translucent in-frame document shimmer — the per-type "align here" skeleton, scaled to fit the capture frame. */
|
|
12
|
+
export type UseSmileIDDocumentShimmerProps = {
|
|
13
|
+
readonly width: number;
|
|
14
|
+
readonly height: number;
|
|
15
|
+
/** Selects the skeleton; the green book and passport ignore `isBackSide`. */
|
|
16
|
+
readonly documentTypeKind?: DocumentType["kind"];
|
|
17
|
+
/** Generic documents only: show the back-side skeleton instead of the front. */
|
|
18
|
+
readonly isBackSide?: boolean;
|
|
19
|
+
readonly testID?: string;
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
/** Shimmer skeleton for a document type + side. Only generic documents have front/back; passport and green book ignore the side. */
|
|
23
|
+
export function documentShimmerXml(
|
|
24
|
+
documentTypeKind: DocumentType["kind"] | undefined,
|
|
25
|
+
isBackSide: boolean,
|
|
26
|
+
): string {
|
|
27
|
+
switch (documentTypeKind) {
|
|
28
|
+
case "passport":
|
|
29
|
+
return SI_DOCUMENT_PASSPORT_SHIMMER;
|
|
30
|
+
case "southAfricaGreenBook":
|
|
31
|
+
return SI_DOCUMENT_GREEN_BOOK_SHIMMER;
|
|
32
|
+
default:
|
|
33
|
+
return isBackSide ? SI_DOCUMENT_BACK_SHIMMER : SI_DOCUMENT_FRONT_SHIMMER;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export const UseSmileIDDocumentShimmer = memo(
|
|
38
|
+
function UseSmileIDDocumentShimmer(props: UseSmileIDDocumentShimmerProps) {
|
|
39
|
+
const { width, height, documentTypeKind, isBackSide = false } = props;
|
|
40
|
+
if (width <= 0 || height <= 0) return null;
|
|
41
|
+
// Default preserveAspectRatio (meet) fits the skeleton in the frame, undistorted.
|
|
42
|
+
return (
|
|
43
|
+
<SvgXml
|
|
44
|
+
xml={documentShimmerXml(documentTypeKind, isBackSide)}
|
|
45
|
+
width={width}
|
|
46
|
+
height={height}
|
|
47
|
+
{...(props.testID !== undefined ? { testID: props.testID } : {})}
|
|
48
|
+
/>
|
|
49
|
+
);
|
|
50
|
+
},
|
|
51
|
+
);
|
|
@@ -5,7 +5,6 @@ import type { AnimationObject } from "lottie-react-native";
|
|
|
5
5
|
import { useReducedMotion } from "../utils/use_reduced_motion";
|
|
6
6
|
import { FaceOvalDefaults } from "./face_oval_defaults";
|
|
7
7
|
import {
|
|
8
|
-
ENHANCED_SMART_SELFIE_ANIMATION_OPACITY,
|
|
9
8
|
ENHANCED_SMART_SELFIE_ANIMATION_SPEED,
|
|
10
9
|
ENHANCED_SMART_SELFIE_TOTAL_FRAMES,
|
|
11
10
|
} from "./helpers/enhanced_smart_selfie_animation_frames";
|
|
@@ -56,8 +55,6 @@ export function UseSmileIDEnhancedSmartSelfieClip(
|
|
|
56
55
|
top: ovalCenterY - size / 2 + VERTICAL_ALIGNMENT_OFFSET,
|
|
57
56
|
width: size,
|
|
58
57
|
height: size,
|
|
59
|
-
// Translucent so the face stays the focal point behind the arrow cue.
|
|
60
|
-
opacity: ENHANCED_SMART_SELFIE_ANIMATION_OPACITY,
|
|
61
58
|
};
|
|
62
59
|
|
|
63
60
|
if (reducedMotion) {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { useState } from "react";
|
|
2
|
+
import { StyleSheet, Text, View, type LayoutChangeEvent } from "react-native";
|
|
2
3
|
import type { UseSmileIDTheme } from "../theme/theme";
|
|
3
4
|
import { useUseSmileIDTheme } from "../theme/theme_context";
|
|
4
5
|
import { useUseSmileIDLocalizations } from "../../l10n/use_smile_id_localizations_provider";
|
|
@@ -17,6 +18,15 @@ const BADGE_ICON_SIZE = 14;
|
|
|
17
18
|
// The badge overhangs the top-end corner of the card.
|
|
18
19
|
const BADGE_OVERHANG = -10;
|
|
19
20
|
|
|
21
|
+
// Document card SVGs carry a transparent bleed around the visible card (3px
|
|
22
|
+
// L/R, 2px top, 4px bottom); the tile offsets the SVG by it so the card fills
|
|
23
|
+
// the framed box exactly.
|
|
24
|
+
const DOC_CARD_RADIUS = 4;
|
|
25
|
+
const DOC_BLEED_X = 3;
|
|
26
|
+
const DOC_BLEED_TOP = 2;
|
|
27
|
+
const DOC_BLEED_BOTTOM = 4;
|
|
28
|
+
const DOC_BADGE_OVERHANG = -8;
|
|
29
|
+
|
|
20
30
|
export type UseSmileIDGuidelineThumbnailProps = {
|
|
21
31
|
readonly guideline: InstructionGuideline;
|
|
22
32
|
readonly theme?: UseSmileIDTheme;
|
|
@@ -33,12 +43,96 @@ export function UseSmileIDGuidelineThumbnail({
|
|
|
33
43
|
const themeFromContext = useUseSmileIDTheme();
|
|
34
44
|
const theme = themeProp ?? themeFromContext;
|
|
35
45
|
const localizations = useUseSmileIDLocalizations();
|
|
46
|
+
// Measured card width — the card scales to its column, so the SVG size and
|
|
47
|
+
// bleed offset scale with it.
|
|
48
|
+
const [measuredCardWidth, setMeasuredCardWidth] = useState(0);
|
|
36
49
|
const allowed = guideline.status === "allowed";
|
|
37
50
|
const Illustration = guideline.image;
|
|
38
51
|
const Badge = allowed ? SiFilledCheckCircle : SiFilledCloseCircle;
|
|
39
52
|
const badgeLabel = allowed
|
|
40
53
|
? localizations.siCdGuidelineAllowed
|
|
41
54
|
: localizations.siCdGuidelineBlocked;
|
|
55
|
+
const caption = guideline.label(localizations);
|
|
56
|
+
|
|
57
|
+
// Document tile: one of four equal columns (so all four fit one row); the
|
|
58
|
+
// self-contained card SVG fills the column, framed by a border + shadow with
|
|
59
|
+
// an overhanging badge (no pill).
|
|
60
|
+
if (guideline.card) {
|
|
61
|
+
const { width: figmaCardWidth, height: figmaCardHeight } = guideline.card;
|
|
62
|
+
const scale =
|
|
63
|
+
measuredCardWidth > 0 ? measuredCardWidth / figmaCardWidth : 0;
|
|
64
|
+
return (
|
|
65
|
+
<View style={styles.documentTile}>
|
|
66
|
+
{/* No `overflow: hidden` so the badge can overhang the card corner. */}
|
|
67
|
+
<View style={[styles.documentCardWrap, { maxWidth: figmaCardWidth }]}>
|
|
68
|
+
<View
|
|
69
|
+
style={[
|
|
70
|
+
styles.documentCard,
|
|
71
|
+
{
|
|
72
|
+
aspectRatio: figmaCardWidth / figmaCardHeight,
|
|
73
|
+
backgroundColor: theme.colors.cardBackground,
|
|
74
|
+
},
|
|
75
|
+
]}
|
|
76
|
+
onLayout={(event: LayoutChangeEvent) => {
|
|
77
|
+
const width = event.nativeEvent.layout.width;
|
|
78
|
+
setMeasuredCardWidth((previous) =>
|
|
79
|
+
Math.abs(previous - width) < 0.5 ? previous : width,
|
|
80
|
+
);
|
|
81
|
+
}}
|
|
82
|
+
>
|
|
83
|
+
{scale > 0 ? (
|
|
84
|
+
<View
|
|
85
|
+
style={{
|
|
86
|
+
position: "absolute",
|
|
87
|
+
left: -DOC_BLEED_X * scale,
|
|
88
|
+
top: -DOC_BLEED_TOP * scale,
|
|
89
|
+
}}
|
|
90
|
+
>
|
|
91
|
+
<Illustration
|
|
92
|
+
width={(figmaCardWidth + DOC_BLEED_X * 2) * scale}
|
|
93
|
+
height={
|
|
94
|
+
(figmaCardHeight + DOC_BLEED_TOP + DOC_BLEED_BOTTOM) * scale
|
|
95
|
+
}
|
|
96
|
+
/>
|
|
97
|
+
</View>
|
|
98
|
+
) : null}
|
|
99
|
+
{/* Border drawn over the art so the SVG can't paint over it. */}
|
|
100
|
+
<View
|
|
101
|
+
pointerEvents="none"
|
|
102
|
+
style={[
|
|
103
|
+
styles.documentCardBorder,
|
|
104
|
+
{ borderColor: theme.colors.stroke },
|
|
105
|
+
]}
|
|
106
|
+
/>
|
|
107
|
+
</View>
|
|
108
|
+
<View
|
|
109
|
+
style={[
|
|
110
|
+
styles.badge,
|
|
111
|
+
styles.documentBadge,
|
|
112
|
+
{ backgroundColor: theme.colors.cardBackground },
|
|
113
|
+
]}
|
|
114
|
+
accessibilityRole="image"
|
|
115
|
+
accessibilityLabel={badgeLabel}
|
|
116
|
+
>
|
|
117
|
+
<Badge size={BADGE_ICON_SIZE} />
|
|
118
|
+
</View>
|
|
119
|
+
</View>
|
|
120
|
+
<Text
|
|
121
|
+
numberOfLines={1}
|
|
122
|
+
style={{
|
|
123
|
+
...theme.typography.cardCaption,
|
|
124
|
+
fontSize: 10,
|
|
125
|
+
lineHeight: 12,
|
|
126
|
+
color: theme.colors.cardText,
|
|
127
|
+
textAlign: "center",
|
|
128
|
+
marginTop: theme.spacing.extraSmall,
|
|
129
|
+
}}
|
|
130
|
+
>
|
|
131
|
+
{caption}
|
|
132
|
+
</Text>
|
|
133
|
+
</View>
|
|
134
|
+
);
|
|
135
|
+
}
|
|
42
136
|
|
|
43
137
|
return (
|
|
44
138
|
<View style={styles.container}>
|
|
@@ -86,7 +180,7 @@ export function UseSmileIDGuidelineThumbnail({
|
|
|
86
180
|
marginTop: theme.spacing.extraSmall,
|
|
87
181
|
}}
|
|
88
182
|
>
|
|
89
|
-
{
|
|
183
|
+
{caption}
|
|
90
184
|
</Text>
|
|
91
185
|
</View>
|
|
92
186
|
);
|
|
@@ -131,4 +225,39 @@ const styles = StyleSheet.create({
|
|
|
131
225
|
shadowOffset: { width: 0, height: 1 },
|
|
132
226
|
elevation: 1,
|
|
133
227
|
},
|
|
228
|
+
// One of four equal columns so the document guidelines always fit one row.
|
|
229
|
+
documentTile: {
|
|
230
|
+
width: "25%",
|
|
231
|
+
alignItems: "center",
|
|
232
|
+
paddingHorizontal: 3,
|
|
233
|
+
},
|
|
234
|
+
// Capped at the artwork's natural width (inline maxWidth) so it never grows
|
|
235
|
+
// past its design size on wide screens.
|
|
236
|
+
documentCardWrap: {
|
|
237
|
+
width: "100%",
|
|
238
|
+
alignSelf: "center",
|
|
239
|
+
},
|
|
240
|
+
documentCard: {
|
|
241
|
+
width: "100%",
|
|
242
|
+
borderRadius: DOC_CARD_RADIUS,
|
|
243
|
+
// No `overflow: hidden` — would clip the SVG's bleed and the shadow.
|
|
244
|
+
shadowColor: "#000000",
|
|
245
|
+
shadowOpacity: 0.1,
|
|
246
|
+
shadowRadius: 3,
|
|
247
|
+
shadowOffset: { width: 0, height: 1 },
|
|
248
|
+
elevation: 1,
|
|
249
|
+
},
|
|
250
|
+
documentCardBorder: {
|
|
251
|
+
position: "absolute",
|
|
252
|
+
top: 0,
|
|
253
|
+
bottom: 0,
|
|
254
|
+
start: 0,
|
|
255
|
+
end: 0,
|
|
256
|
+
borderRadius: DOC_CARD_RADIUS,
|
|
257
|
+
borderWidth: 1,
|
|
258
|
+
},
|
|
259
|
+
documentBadge: {
|
|
260
|
+
top: DOC_BADGE_OVERHANG,
|
|
261
|
+
end: DOC_BADGE_OVERHANG,
|
|
262
|
+
},
|
|
134
263
|
});
|