Navaron Bracke

fix facing mode check on Safari

1 import 'dart:js_interop'; 1 import 'dart:js_interop';
2 2
  3 +import 'package:mobile_scanner/src/web/media_track_extension.dart';
3 import 'package:web/web.dart'; 4 import 'package:web/web.dart';
4 5
5 /// This class represents a delegate that manages the constraints for a [MediaStreamTrack]. 6 /// This class represents a delegate that manages the constraints for a [MediaStreamTrack].
@@ -19,8 +20,9 @@ final class MediaTrackConstraintsDelegate { @@ -19,8 +20,9 @@ final class MediaTrackConstraintsDelegate {
19 20
20 final MediaTrackCapabilities capabilities = track.getCapabilities(); 21 final MediaTrackCapabilities capabilities = track.getCapabilities();
21 final MediaTrackSettings settings = track.getSettings(); 22 final MediaTrackSettings settings = track.getSettings();
  23 + final JSArray<JSString>? facingModes = capabilities.facingModeNullable;
22 24
23 - if (capabilities.facingMode.toDart.isEmpty) { 25 + if (facingModes == null || facingModes.toDart.isEmpty) {
24 return MediaTrackSettings( 26 return MediaTrackSettings(
25 width: settings.width, 27 width: settings.width,
26 height: settings.height, 28 height: settings.height,
  1 +import 'dart:js_interop';
  2 +import 'package:web/web.dart';
  3 +
  4 +/// This extension provides nullable properties for [MediaTrackCapabilities],
  5 +/// for cases where the properties are not supported by all browsers.
  6 +extension NullableMediaTrackCapabilities on MediaTrackCapabilities {
  7 + /// The `facingMode` property is not supported on Safari.
  8 + @JS('facingMode')
  9 + external JSArray<JSString>? get facingModeNullable;
  10 +}
@@ -13,6 +13,7 @@ import 'package:mobile_scanner/src/mobile_scanner_view_attributes.dart'; @@ -13,6 +13,7 @@ import 'package:mobile_scanner/src/mobile_scanner_view_attributes.dart';
13 import 'package:mobile_scanner/src/objects/barcode_capture.dart'; 13 import 'package:mobile_scanner/src/objects/barcode_capture.dart';
14 import 'package:mobile_scanner/src/objects/start_options.dart'; 14 import 'package:mobile_scanner/src/objects/start_options.dart';
15 import 'package:mobile_scanner/src/web/barcode_reader.dart'; 15 import 'package:mobile_scanner/src/web/barcode_reader.dart';
  16 +import 'package:mobile_scanner/src/web/media_track_extension.dart';
16 import 'package:mobile_scanner/src/web/zxing/zxing_barcode_reader.dart'; 17 import 'package:mobile_scanner/src/web/zxing/zxing_barcode_reader.dart';
17 import 'package:web/web.dart'; 18 import 'package:web/web.dart';
18 19
@@ -125,10 +126,11 @@ class MobileScannerWeb extends MobileScannerPlatform { @@ -125,10 +126,11 @@ class MobileScannerWeb extends MobileScannerPlatform {
125 126
126 final MediaStreamTrack videoTrack = tracks.first; 127 final MediaStreamTrack videoTrack = tracks.first;
127 final MediaTrackCapabilities capabilities = videoTrack.getCapabilities(); 128 final MediaTrackCapabilities capabilities = videoTrack.getCapabilities();
  129 + final JSArray<JSString>? facingModes = capabilities.facingModeNullable;
128 130
129 - // TODO: this is empty on MacOS, where there is no facing mode, but one, user facing camera. 131 + // TODO: this is an empty array on MacOS Chrome, where there is no facing mode, but one, user facing camera.
130 // Facing mode is not supported by this track, do nothing. 132 // Facing mode is not supported by this track, do nothing.
131 - if (capabilities.facingMode.toDart.isEmpty) { 133 + if (facingModes == null || facingModes.toDart.isEmpty) {
132 return; 134 return;
133 } 135 }
134 136