@monkvision/camera-web 5.3.1 → 5.3.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.
@@ -34,10 +34,10 @@ function Camera(_a) {
34
34
  var _f = (0, hooks_1.useCameraPreview)({
35
35
  resolution: previewResolution,
36
36
  facingMode: hooks_1.CameraFacingMode.ENVIRONMENT,
37
- }), videoRef = _f.ref, previewDimensions = _f.previewDimensions, error = _f.error, retry = _f.retry, isPreviewLoading = _f.isLoading, availableCameraDevices = _f.availableCameraDevices, selectedCameraDeviceId = _f.selectedCameraDeviceId;
37
+ }), videoRef = _f.ref, streamDimensions = _f.streamDimensions, previewDimensions = _f.previewDimensions, error = _f.error, retry = _f.retry, isPreviewLoading = _f.isLoading, availableCameraDevices = _f.availableCameraDevices, selectedCameraDeviceId = _f.selectedCameraDeviceId;
38
38
  var _g = (0, hooks_1.useCameraCanvas)({
39
39
  resolution: resolution,
40
- streamDimensions: previewDimensions,
40
+ streamDimensions: streamDimensions,
41
41
  allowImageUpscaling: allowImageUpscaling,
42
42
  }), canvasRef = _g.ref, canvasDimensions = _g.dimensions;
43
43
  var takeScreenshot = (0, hooks_1.useCameraScreenshot)({
@@ -7,7 +7,11 @@ import { UserMediaResult } from './useUserMedia';
7
7
  */
8
8
  export interface CameraPreviewHandle extends UserMediaResult {
9
9
  /**
10
- * The effective pixel dimensions of the video stream on the client screen.
10
+ * The actual dimensions of the camera stream (full resolution).
11
+ */
12
+ streamDimensions: PixelDimensions | null;
13
+ /**
14
+ * The effective pixel dimensions of the video stream on the client screen (scaled for display).
11
15
  */
12
16
  previewDimensions: PixelDimensions | null;
13
17
  /**
@@ -17,9 +17,21 @@ var react_1 = require("react");
17
17
  var common_1 = require("@monkvision/common");
18
18
  var utils_1 = require("./utils");
19
19
  var useUserMedia_1 = require("./useUserMedia");
20
- function getPreviewDimensions(refVideo, windowDimensions) {
21
- var height = refVideo.videoHeight;
22
- var width = refVideo.videoWidth;
20
+ function getStreamDimensionsFromVideo(videoElement, stream) {
21
+ var _a = (0, useUserMedia_1.getStreamVideoTrackSettings)(stream), width = _a.width, height = _a.height;
22
+ if (!height || !width) {
23
+ throw new useUserMedia_1.InvalidStreamError('Unable to set up the Monk camera screenshoter because the video stream does not have the properties width and height defined.', useUserMedia_1.InvalidStreamErrorName.NO_DIMENSIONS);
24
+ }
25
+ var videoIsLandscape = videoElement.videoWidth > videoElement.videoHeight;
26
+ var maxDimension = Math.max(width, height);
27
+ var minDimension = Math.min(width, height);
28
+ return videoIsLandscape
29
+ ? { width: maxDimension, height: minDimension }
30
+ : { width: minDimension, height: maxDimension };
31
+ }
32
+ function getPreviewDimensions(videoElement, windowDimensions) {
33
+ var height = videoElement.videoHeight;
34
+ var width = videoElement.videoWidth;
23
35
  if (!windowDimensions || !height || !width) {
24
36
  return null;
25
37
  }
@@ -41,7 +53,8 @@ function getPreviewDimensions(refVideo, windowDimensions) {
41
53
  */
42
54
  function useCameraPreview(config) {
43
55
  var ref = (0, react_1.useRef)(null);
44
- var _a = (0, react_1.useState)(null), previewDimensions = _a[0], setPreviewDimensions = _a[1];
56
+ var _a = (0, react_1.useState)(null), streamDimensions = _a[0], setStreamDimensions = _a[1];
57
+ var _b = (0, react_1.useState)(null), previewDimensions = _b[0], setPreviewDimensions = _b[1];
45
58
  var windowDimensions = (0, common_1.useWindowDimensions)();
46
59
  var handleError = (0, monitoring_1.useMonitoring)().handleError;
47
60
  var userMediaResult = (0, useUserMedia_1.useUserMedia)((0, utils_1.getMediaConstraints)(config), ref);
@@ -49,16 +62,22 @@ function useCameraPreview(config) {
49
62
  var currentRef = ref.current;
50
63
  if (userMediaResult.stream && currentRef) {
51
64
  currentRef.srcObject = userMediaResult.stream;
52
- var handleMetadata = function () {
53
- currentRef === null || currentRef === void 0 ? void 0 : currentRef.play().catch(handleError);
54
- if (currentRef) {
65
+ var updateDimensions_1 = function () {
66
+ if (!currentRef || !userMediaResult.stream) {
67
+ return;
68
+ }
69
+ var streamDims = getStreamDimensionsFromVideo(currentRef, userMediaResult.stream);
70
+ if (streamDims && windowDimensions) {
71
+ setStreamDimensions(streamDims);
55
72
  setPreviewDimensions(getPreviewDimensions(currentRef, windowDimensions));
56
73
  }
57
74
  };
75
+ var handleMetadata = function () {
76
+ currentRef === null || currentRef === void 0 ? void 0 : currentRef.play().catch(handleError);
77
+ updateDimensions_1();
78
+ };
58
79
  var handleResize = function () {
59
- if (currentRef) {
60
- setPreviewDimensions(getPreviewDimensions(currentRef, windowDimensions));
61
- }
80
+ updateDimensions_1();
62
81
  };
63
82
  currentRef.onloadedmetadata = handleMetadata;
64
83
  currentRef.onresize = handleResize;
@@ -70,5 +89,5 @@ function useCameraPreview(config) {
70
89
  }
71
90
  };
72
91
  }, [windowDimensions, userMediaResult.stream, handleError]);
73
- return (0, react_1.useMemo)(function () { return (__assign({ ref: ref, previewDimensions: previewDimensions }, userMediaResult)); }, [previewDimensions, userMediaResult]);
92
+ return (0, react_1.useMemo)(function () { return (__assign({ ref: ref, streamDimensions: streamDimensions, previewDimensions: previewDimensions }, userMediaResult)); }, [streamDimensions, previewDimensions, userMediaResult]);
74
93
  }
@@ -10,7 +10,19 @@ export declare enum InvalidStreamErrorName {
10
10
  /**
11
11
  * The stream had too many video tracks (more than one).
12
12
  */
13
- TOO_MANY_VIDEO_TRACKS = "TooManyVideoTracks"
13
+ TOO_MANY_VIDEO_TRACKS = "TooManyVideoTracks",
14
+ /**
15
+ * The stream's video track had no dimensions.
16
+ */
17
+ NO_DIMENSIONS = "NoDimensions"
18
+ }
19
+ /**
20
+ * Custom error class used to throw errors related to invalid MediaStreams.
21
+ *
22
+ * @see InvalidStreamErrorName for the different types of invalid stream errors that can be thrown.
23
+ */
24
+ export declare class InvalidStreamError extends Error {
25
+ constructor(message: string, name: InvalidStreamErrorName);
14
26
  }
15
27
  /**
16
28
  * The type of errors that the `useUserMedia` hook can return.
@@ -108,6 +120,11 @@ export interface UserMediaResult {
108
120
  */
109
121
  selectedCameraDeviceId: string | null;
110
122
  }
123
+ /**
124
+ * Gets the video track settings of a MediaStream.
125
+ * This function also checks if the stream is valid and otherwise throws an error.
126
+ */
127
+ export declare function getStreamVideoTrackSettings(stream: MediaStream): MediaTrackSettings;
111
128
  /**
112
129
  * React hook that wraps the `navigator.mediaDevices.getUserMedia` browser function in order to add React logic layers
113
130
  * and utility tools :
@@ -65,7 +65,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
65
65
  return (mod && mod.__esModule) ? mod : { "default": mod };
66
66
  };
67
67
  Object.defineProperty(exports, "__esModule", { value: true });
68
- exports.UserMediaErrorType = exports.InvalidStreamErrorName = void 0;
68
+ exports.UserMediaErrorType = exports.InvalidStreamError = exports.InvalidStreamErrorName = void 0;
69
+ exports.getStreamVideoTrackSettings = getStreamVideoTrackSettings;
69
70
  exports.useUserMedia = useUserMedia;
70
71
  var monitoring_1 = require("@monkvision/monitoring");
71
72
  var fast_deep_equal_1 = __importDefault(require("fast-deep-equal"));
@@ -85,7 +86,16 @@ var InvalidStreamErrorName;
85
86
  * The stream had too many video tracks (more than one).
86
87
  */
87
88
  InvalidStreamErrorName["TOO_MANY_VIDEO_TRACKS"] = "TooManyVideoTracks";
89
+ /**
90
+ * The stream's video track had no dimensions.
91
+ */
92
+ InvalidStreamErrorName["NO_DIMENSIONS"] = "NoDimensions";
88
93
  })(InvalidStreamErrorName || (exports.InvalidStreamErrorName = InvalidStreamErrorName = {}));
94
+ /**
95
+ * Custom error class used to throw errors related to invalid MediaStreams.
96
+ *
97
+ * @see InvalidStreamErrorName for the different types of invalid stream errors that can be thrown.
98
+ */
89
99
  var InvalidStreamError = /** @class */ (function (_super) {
90
100
  __extends(InvalidStreamError, _super);
91
101
  function InvalidStreamError(message, name) {
@@ -95,6 +105,7 @@ var InvalidStreamError = /** @class */ (function (_super) {
95
105
  }
96
106
  return InvalidStreamError;
97
107
  }(Error));
108
+ exports.InvalidStreamError = InvalidStreamError;
98
109
  /**
99
110
  * The type of errors that the `useUserMedia` hook can return.
100
111
  *
@@ -139,6 +150,10 @@ var UserMediaErrorType;
139
150
  */
140
151
  UserMediaErrorType["OTHER"] = "other";
141
152
  })(UserMediaErrorType || (exports.UserMediaErrorType = UserMediaErrorType = {}));
153
+ /**
154
+ * Gets the video track settings of a MediaStream.
155
+ * This function also checks if the stream is valid and otherwise throws an error.
156
+ */
142
157
  function getStreamVideoTrackSettings(stream) {
143
158
  var videoTracks = stream.getVideoTracks();
144
159
  if (videoTracks.length === 0) {
package/lib/i18n.js CHANGED
@@ -6,6 +6,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.i18nCamera = void 0;
7
7
  var common_1 = require("@monkvision/common");
8
8
  var en_json_1 = __importDefault(require("./translations/en.json"));
9
+ var ro_json_1 = __importDefault(require("./translations/ro.json"));
10
+ var pl_json_1 = __importDefault(require("./translations/pl.json"));
11
+ var da_json_1 = __importDefault(require("./translations/da.json"));
12
+ var sv_json_1 = __importDefault(require("./translations/sv.json"));
13
+ var es_json_1 = __importDefault(require("./translations/es.json"));
14
+ var pt_json_1 = __importDefault(require("./translations/pt.json"));
9
15
  var fr_json_1 = __importDefault(require("./translations/fr.json"));
10
16
  var de_json_1 = __importDefault(require("./translations/de.json"));
11
17
  var nl_json_1 = __importDefault(require("./translations/nl.json"));
@@ -21,5 +27,11 @@ exports.i18nCamera = (0, common_1.i18nCreateSDKInstance)({
21
27
  de: { translation: de_json_1.default },
22
28
  nl: { translation: nl_json_1.default },
23
29
  it: { translation: it_json_1.default },
30
+ pt: { translation: pt_json_1.default },
31
+ es: { translation: es_json_1.default },
32
+ sv: { translation: sv_json_1.default },
33
+ da: { translation: da_json_1.default },
34
+ pl: { translation: pl_json_1.default },
35
+ ro: { translation: ro_json_1.default },
24
36
  },
25
37
  });
@@ -0,0 +1,3 @@
1
+ {
2
+ "retry": "Prøv igen"
3
+ }
@@ -0,0 +1,3 @@
1
+ {
2
+ "retry": "Reintentar"
3
+ }
@@ -0,0 +1,3 @@
1
+ {
2
+ "retry": "Ponów próbę"
3
+ }
@@ -0,0 +1,3 @@
1
+ {
2
+ "retry": "Tentar novamente"
3
+ }
@@ -0,0 +1,3 @@
1
+ {
2
+ "retry": "Reîncearcă"
3
+ }
@@ -0,0 +1,3 @@
1
+ {
2
+ "retry": "Försök igen"
3
+ }
@@ -11,6 +11,12 @@ function getCameraErrorLabel(error) {
11
11
  case Camera_1.UserMediaErrorType.NOT_ALLOWED:
12
12
  return {
13
13
  en: 'Camera preview unavailable because camera access was not granted to the page.',
14
+ ro: 'Previzualizarea camerei nu este disponibilă deoarece accesul la cameră nu a fost acordat paginii.',
15
+ pl: 'Podgląd kamery jest niedostępny, ponieważ strona nie otrzymała uprawnień dostępu do kamery.',
16
+ da: 'Kameraforhåndsvisning er ikke tilgængelig, fordi kameraadgang ikke blev givet til siden.',
17
+ sv: 'Kameraview är inte tillgänglig eftersom sidan inte har tillgång till kameran.',
18
+ es: 'La vista previa de la cámara no está disponible porque no se concedió permiso de acceso a la cámara a la página.',
19
+ pt: 'A visualização da câmera não está disponível porque o acesso à câmera não foi concedido à página.',
14
20
  fr: "L'apperçu de la caméra n'est pas disponible car l'accès à la caméra n'est pas autorisé.",
15
21
  de: 'Die Kameravorschau ist nicht verfügbar, da für die Seite kein Kamerazugriff gewährt wurde.',
16
22
  nl: 'De cameravoorbeeld is niet beschikbaar omdat er geen toegang tot de camera is verleend aan de pagina.',
@@ -19,6 +25,12 @@ function getCameraErrorLabel(error) {
19
25
  case Camera_1.UserMediaErrorType.WEBPAGE_NOT_ALLOWED:
20
26
  return {
21
27
  en: 'Unable to get camera access. Make sure to press “Allow” when asked to grant camera permission for this web page.',
28
+ ro: 'Nu s-a putut accesa camera. Asigurați-vă că apăsați „Permite” când vi se solicită să acordați permisiunea de utilizare a camerei pentru această pagină web.',
29
+ pl: 'Nie można uzyskać dostępu do kamery. Upewnij się, że klikniesz „Zezwól”, gdy zostaniesz poproszony o udzielenie uprawnień dostępu do kamery dla tej strony internetowej.',
30
+ da: 'Kunne ikke få adgang til kameraet. Sørg for at trykke på “Tillad”, når du bliver bedt om at give tilladelse til kameraadgang for denne webside.',
31
+ sv: 'Kunde inte få åtkomst till kameran. Se till att du trycker på ”Tillåt” när du blir ombedd att ge kameratillstånd för den här webbsidan.”',
32
+ es: 'No se pudo acceder a la cámara. Asegúrese de presionar “Permitir” cuando se le solicite conceder permiso de cámara para esta página web.',
33
+ pt: 'Não foi possível obter acesso à câmera. Certifique-se de pressionar “Permitir” quando solicitado a conceder permissão para a câmera nesta página.',
22
34
  fr: "Impossible d'accéder à la caméra. Veuillez vous assurer d'appuyer sur “Autoriser” lorsqu'on vous propose d'autoriser l'accès à la caméra pour cette page web.",
23
35
  de: 'Die Kamera kann nicht zugelassen werden. Stellen Sie sicher, dass Sie auf „Zulassen“ drücken, wenn Sie aufgefordert werden, die Kamera für diese Webseite zuzulassen.',
24
36
  nl: 'Kan geen toestemming krijgen voor de camera. Zorg ervoor dat u op “Toestaan” drukt wanneer u wordt gevraagd om toestemming te geven voor het gebruik van de camera op deze webpagina.',
@@ -27,6 +39,12 @@ function getCameraErrorLabel(error) {
27
39
  case Camera_1.UserMediaErrorType.BROWSER_NOT_ALLOWED:
28
40
  return {
29
41
  en: "Unable to get camera access. Make sure to grant camera access to your current internet browser in your device's settings.",
42
+ ro: 'Nu s-a putut accesa camera. Asigurați-vă că ați acordat permisiunea de acces la cameră pentru browserul dvs. în setările dispozitivului.',
43
+ pl: 'Nie można uzyskać dostępu do kamery. Upewnij się, że w ustawieniach urządzenia przyznałeś dostęp do kamery dla używanej przeglądarki internetowej.',
44
+ da: 'Kunne ikke få adgang til kameraet. Sørg for at give kameraadgang til din aktuelle webbrowser i dine enhedsindstillinger.',
45
+ sv: 'Kunde inte få åtkomst till kameran. Se till att du har tillåtit kameraåtkomst för din webbläsare i enheten.',
46
+ es: 'No se pudo acceder a la cámara. Asegúrese de otorgar permisos de cámara a su navegador web actual en la configuración de su dispositivo.',
47
+ pt: 'Não foi possível obter acesso à câmera. Certifique-se de conceder acesso à câmera ao seu navegador atual nas configurações do dispositivo.',
30
48
  fr: "Impossible d'accéder à la caméra. Veuillez vous assurer d'autoriser l'accès à la caméra pour ce navigateur internet dans les paramètres de votre téléphone.",
31
49
  de: 'Der Zugriff auf die Kamera ist nicht möglich. Stellen Sie sicher, dass Sie in den Einstellungen Ihres Geräts den Kamerazugriff für Ihren aktuellen Internetbrowser zulassen.',
32
50
  nl: 'Kan geen cameratoegang krijgen. Zorg ervoor dat u de camera toegang verleent tot uw huidige internet browser in de instellingen van uw apparaat.',
@@ -35,6 +53,12 @@ function getCameraErrorLabel(error) {
35
53
  case Camera_1.UserMediaErrorType.STREAM_INACTIVE:
36
54
  return {
37
55
  en: 'The camera video stream was closed unexpectedly.',
56
+ ro: 'Fluxul video al camerei a fost închis neașteptat.',
57
+ pl: 'Strumień wideo z kamery został nieoczekiwanie przerwany.',
58
+ da: 'Kameraets videostream blev uventet lukket.',
59
+ sv: 'Kamerans videoström stängdes oväntat.',
60
+ es: 'La transmisión de video de la cámara se cerró inesperadamente.',
61
+ pt: 'O stream de vídeo da câmera foi encerrado inesperadamente.',
38
62
  fr: 'Le flux vidéo de la caméra a été coupé de manière inattendue.',
39
63
  de: 'Der Video-Stream der Kamera wurde unerwartet geschlossen.',
40
64
  nl: 'De videostream van de camera is onverwacht gesloten.',
@@ -43,6 +67,12 @@ function getCameraErrorLabel(error) {
43
67
  case Camera_1.UserMediaErrorType.INVALID_STREAM:
44
68
  return {
45
69
  en: 'Unable to process the camera video stream.',
70
+ ro: 'Nu se poate procesa fluxul video al camerei.',
71
+ pl: 'Nie można przetworzyć strumienia wideo z kamery.',
72
+ da: 'Kunne ikke behandle videostrømmen fra kameraet.',
73
+ sv: 'Kunde inte bearbeta kamerans videoström.',
74
+ es: 'No se puede procesar la transmisión de video de la cámara.',
75
+ pt: 'Não foi possível processar o stream de vídeo da câmera.',
46
76
  fr: 'Impossible de traiter le flux vidéo de la caméra.',
47
77
  de: 'Der Videostrom der Kamera kann nicht verarbeitet werden.',
48
78
  nl: 'De videostream van de camera kan niet worden verwerkt.',
@@ -51,6 +81,12 @@ function getCameraErrorLabel(error) {
51
81
  default:
52
82
  return {
53
83
  en: 'An unexpected error occurred when fetching the camera video stream.',
84
+ ro: 'A apărut o eroare neașteptată la preluarea fluxului video de la cameră.',
85
+ pl: 'Wystąpił nieoczekiwany błąd podczas pobierania strumienia wideo z kamery.',
86
+ da: 'Der opstod en uventet fejl under hentning af kameravideostrømmen.',
87
+ sv: 'Ett oväntat fel uppstod när kamerans videoström hämtades.',
88
+ es: 'Se produjo un error inesperado al obtener la transmisión de video de la cámara.',
89
+ pt: 'Ocorreu um erro inesperado ao obter o stream de vídeo da câmera.',
54
90
  fr: 'Une erreur inattendue est survenue lors de la récupération du flux vidéo de la caméra.',
55
91
  de: 'Beim Abrufen des Kamera-Videostreams ist ein unerwarteter Fehler aufgetreten.',
56
92
  nl: 'Er is een onverwachte fout opgetreden bij het ophalen van de videostream van de camera.',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@monkvision/camera-web",
3
- "version": "5.3.1",
3
+ "version": "5.3.4",
4
4
  "license": "BSD-3-Clause-Clear",
5
5
  "packageManager": "yarn@3.2.4",
6
6
  "description": "MonkJs camera package for React (web) used to display a camera preview and take pictures",
@@ -28,9 +28,9 @@
28
28
  "lint:fix": "yarn run prettier:fix && yarn run eslint:fix"
29
29
  },
30
30
  "dependencies": {
31
- "@monkvision/common": "5.3.1",
32
- "@monkvision/common-ui-web": "5.3.1",
33
- "@monkvision/monitoring": "5.3.1",
31
+ "@monkvision/common": "5.3.4",
32
+ "@monkvision/common-ui-web": "5.3.4",
33
+ "@monkvision/monitoring": "5.3.4",
34
34
  "fast-deep-equal": "^3.1.3",
35
35
  "i18next": "^23.4.5",
36
36
  "react-i18next": "^13.2.0"
@@ -42,13 +42,13 @@
42
42
  "react-router-dom": "^6.22.3"
43
43
  },
44
44
  "devDependencies": {
45
- "@monkvision/eslint-config-base": "5.3.1",
46
- "@monkvision/eslint-config-typescript": "5.3.1",
47
- "@monkvision/eslint-config-typescript-react": "5.3.1",
48
- "@monkvision/jest-config": "5.3.1",
49
- "@monkvision/prettier-config": "5.3.1",
50
- "@monkvision/test-utils": "5.3.1",
51
- "@monkvision/typescript-config": "5.3.1",
45
+ "@monkvision/eslint-config-base": "5.3.4",
46
+ "@monkvision/eslint-config-typescript": "5.3.4",
47
+ "@monkvision/eslint-config-typescript-react": "5.3.4",
48
+ "@monkvision/jest-config": "5.3.4",
49
+ "@monkvision/prettier-config": "5.3.4",
50
+ "@monkvision/test-utils": "5.3.4",
51
+ "@monkvision/typescript-config": "5.3.4",
52
52
  "@testing-library/react": "^16.3.0",
53
53
  "@types/fscreen": "^1.0.1",
54
54
  "@types/jest": "^30",
@@ -89,5 +89,5 @@
89
89
  "url": "https://github.com/monkvision/monkjs/issues"
90
90
  },
91
91
  "homepage": "https://github.com/monkvision/monkjs",
92
- "gitHead": "859c252dd8e45c5aa4755f28f90fd4163e6cb8f6"
92
+ "gitHead": "5b46d87e58706a101dfde74d52c697f3fc4e1970"
93
93
  }