siam-ui-utils 2.2.25 → 2.2.27
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/dist/CustomBootstrap.js +9 -0
- package/dist/CustomBootstrap.js.map +1 -0
- package/dist/CustomSelectInput.js +12 -0
- package/dist/CustomSelectInput.js.map +1 -0
- package/dist/IntlMessages.js +10 -0
- package/dist/IntlMessages.js.map +1 -0
- package/dist/assets/img/copiar.png.js +5 -0
- package/dist/assets/img/copiar.png.js.map +1 -0
- package/dist/assets/img/take-photo.png.js +5 -0
- package/dist/assets/img/take-photo.png.js.map +1 -0
- package/dist/bridges/with-router-bridge.js +14 -0
- package/dist/bridges/with-router-bridge.js.map +1 -0
- package/dist/constants.js +9 -0
- package/dist/constants.js.map +1 -0
- package/dist/copy-link/index.js +60 -0
- package/dist/copy-link/index.js.map +1 -0
- package/dist/custom-input/CustomInputCheckbox.js +36 -0
- package/dist/custom-input/CustomInputCheckbox.js.map +1 -0
- package/dist/custom-input/CustomInputRadio.js +43 -0
- package/dist/custom-input/CustomInputRadio.js.map +1 -0
- package/dist/dropzone/Dropzone.js +513 -0
- package/dist/dropzone/Dropzone.js.map +1 -0
- package/{src/dropzone/Input.tsx → dist/dropzone/Input.js} +77 -76
- package/dist/dropzone/Input.js.map +1 -0
- package/{src/dropzone/Layout.tsx → dist/dropzone/Layout.js} +50 -57
- package/dist/dropzone/Layout.js.map +1 -0
- package/dist/dropzone/Preview.js +117 -0
- package/dist/dropzone/Preview.js.map +1 -0
- package/dist/dropzone/SubmitButton.js +34 -0
- package/dist/dropzone/SubmitButton.js.map +1 -0
- package/dist/dropzone/assets/cancel.svg.js +5 -0
- package/dist/dropzone/assets/cancel.svg.js.map +1 -0
- package/dist/dropzone/assets/remove.svg.js +5 -0
- package/dist/dropzone/assets/remove.svg.js.map +1 -0
- package/dist/dropzone/assets/restart.svg.js +5 -0
- package/dist/dropzone/assets/restart.svg.js.map +1 -0
- package/dist/dropzone/utils.js +85 -0
- package/dist/dropzone/utils.js.map +1 -0
- package/dist/dropzone-uploader/dropzone-uploader-dni-digital/index.js +150 -0
- package/dist/dropzone-uploader/dropzone-uploader-dni-digital/index.js.map +1 -0
- package/dist/dropzone-uploader/index.js +136 -0
- package/dist/dropzone-uploader/index.js.map +1 -0
- package/dist/iconos/constants-svg.js +41 -0
- package/dist/iconos/constants-svg.js.map +1 -0
- package/dist/iconos/icon-button-svg.js +50 -0
- package/dist/iconos/icon-button-svg.js.map +1 -0
- package/dist/iconos/styled-icon.js +26 -0
- package/dist/iconos/styled-icon.js.map +1 -0
- package/dist/index.js +33 -0
- package/dist/index.js.map +1 -0
- package/dist/select/constants.js +8 -0
- package/dist/select/constants.js.map +1 -0
- package/dist/select/index.js +90 -0
- package/dist/select/index.js.map +1 -0
- package/dist/timer/index.js +60 -0
- package/dist/timer/index.js.map +1 -0
- package/dist/tomar-foto/index.js +62 -0
- package/dist/tomar-foto/index.js.map +1 -0
- package/dist/view-layout/button-editor.js +14 -0
- package/dist/view-layout/button-editor.js.map +1 -0
- package/dist/view-layout/constants.js +11 -0
- package/dist/view-layout/constants.js.map +1 -0
- package/dist/view-layout/editor-layer.js +28 -0
- package/dist/view-layout/editor-layer.js.map +1 -0
- package/dist/view-layout/index.js +53 -0
- package/dist/view-layout/index.js.map +1 -0
- package/dist/view-layout/slot-wrapper.js +39 -0
- package/dist/view-layout/slot-wrapper.js.map +1 -0
- package/dist/where-by-room/index.js +20 -0
- package/dist/where-by-room/index.js.map +1 -0
- package/dist/where-by-room/room.js +78 -0
- package/dist/where-by-room/room.js.map +1 -0
- package/package.json +69 -18
- package/eslint.config.mjs +0 -45
- package/index.html +0 -17
- package/src/App.css +0 -47
- package/src/App.jsx +0 -66
- package/src/CustomBootstrap.jsx +0 -10
- package/src/CustomSelectInput.jsx +0 -8
- package/src/IntlMessages.jsx +0 -7
- package/src/assets/css/sass/_gogo.style.scss +0 -8967
- package/src/assets/css/sass/_mixins.scss +0 -125
- package/src/assets/css/sass/_plugins.scss +0 -1
- package/src/assets/css/sass/ampf_style.scss +0 -185
- package/src/assets/css/sass/main.scss +0 -11
- package/src/assets/css/sass/plugins/react-table.scss +0 -314
- package/src/assets/css/sass/themes/gogo.light.redruby.scss +0 -41
- package/src/assets/css/sass/themes/variables.scss +0 -86
- package/src/assets/css/vendor/bootstrap.min.css +0 -6
- package/src/assets/css/vendor/bootstrap.rtl.only.min.css +0 -1428
- package/src/assets/img/copiar.png +0 -0
- package/src/assets/img/take-photo.png +0 -0
- package/src/bridges/index.js +0 -1
- package/src/bridges/with-router-bridge.jsx +0 -11
- package/src/constants.js +0 -7
- package/src/copy-link/index.jsx +0 -58
- package/src/copy-link/styles.scss +0 -39
- package/src/custom-input/CustomInputCheckbox.jsx +0 -33
- package/src/custom-input/CustomInputRadio.jsx +0 -37
- package/src/custom-input/index.css +0 -168
- package/src/custom-input/index.js +0 -2
- package/src/dropzone/Dropzone.tsx +0 -816
- package/src/dropzone/Preview.tsx +0 -139
- package/src/dropzone/SubmitButton.tsx +0 -47
- package/src/dropzone/assets/cancel.svg +0 -1
- package/src/dropzone/assets/remove.svg +0 -1
- package/src/dropzone/assets/restart.svg +0 -1
- package/src/dropzone/styles.css +0 -140
- package/src/dropzone/utils.ts +0 -113
- package/src/dropzone-uploader/dropzone-uploader-dni-digital/index.jsx +0 -151
- package/src/dropzone-uploader/dropzone-uploader.css +0 -66
- package/src/dropzone-uploader/index.jsx +0 -138
- package/src/iconos/constants-svg.js +0 -659
- package/src/iconos/icon-button-svg.jsx +0 -50
- package/src/iconos/index.js +0 -2
- package/src/iconos/styled-icon.jsx +0 -25
- package/src/index.css +0 -74
- package/src/index.js +0 -13
- package/src/main.jsx +0 -7
- package/src/select/constants.js +0 -4
- package/src/select/index.tsx +0 -147
- package/src/test-resources.jsx +0 -145
- package/src/timer/index.jsx +0 -62
- package/src/timer/styles.scss +0 -54
- package/src/tomar-foto/index.jsx +0 -69
- package/src/view-layout/button-editor.jsx +0 -18
- package/src/view-layout/constants.js +0 -7
- package/src/view-layout/editor-layer.jsx +0 -27
- package/src/view-layout/index.tsx +0 -62
- package/src/view-layout/item-slot.tsx +0 -20
- package/src/view-layout/slot-wrapper.tsx +0 -44
- package/src/view-layout/styles.scss +0 -143
- package/src/where-by-room/constants.js +0 -2
- package/src/where-by-room/index.jsx +0 -17
- package/src/where-by-room/room.jsx +0 -79
- package/tsconfig.json +0 -19
- package/vite.config.ts +0 -22
package/dist/index.js
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { CustomSelect } from "./select/index.js";
|
|
2
|
+
import { Colxx, Separator } from "./CustomBootstrap.js";
|
|
3
|
+
import { CustomSelectInput } from "./CustomSelectInput.js";
|
|
4
|
+
import { DropzoneUploader } from "./dropzone-uploader/index.js";
|
|
5
|
+
import { DropzoneUploaderDniDigital } from "./dropzone-uploader/dropzone-uploader-dni-digital/index.js";
|
|
6
|
+
import { TomarFoto } from "./tomar-foto/index.js";
|
|
7
|
+
import { CopyLink } from "./copy-link/index.js";
|
|
8
|
+
import { Timer, formatTiempo } from "./timer/index.js";
|
|
9
|
+
import { ViewLayout } from "./view-layout/index.js";
|
|
10
|
+
import { WhereByRoom } from "./where-by-room/index.js";
|
|
11
|
+
import * as IntlMessages from "./IntlMessages.js";
|
|
12
|
+
import { withRouter } from "./bridges/with-router-bridge.js";
|
|
13
|
+
import { CustomInputCheckbox } from "./custom-input/CustomInputCheckbox.js";
|
|
14
|
+
import { CustomInputRadio } from "./custom-input/CustomInputRadio.js";
|
|
15
|
+
export {
|
|
16
|
+
Colxx,
|
|
17
|
+
CopyLink,
|
|
18
|
+
CustomInputCheckbox,
|
|
19
|
+
CustomInputRadio,
|
|
20
|
+
CustomSelect,
|
|
21
|
+
CustomSelectInput,
|
|
22
|
+
DropzoneUploader,
|
|
23
|
+
DropzoneUploaderDniDigital,
|
|
24
|
+
IntlMessages,
|
|
25
|
+
Separator,
|
|
26
|
+
Timer,
|
|
27
|
+
TomarFoto,
|
|
28
|
+
ViewLayout,
|
|
29
|
+
WhereByRoom,
|
|
30
|
+
formatTiempo,
|
|
31
|
+
withRouter
|
|
32
|
+
};
|
|
33
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sources":["../../src/select/constants.js"],"sourcesContent":["export const LABELS = {\r\n SIN_DATOS: \"SIN DATOS\",\r\n SELECCIONE: \"SELECCIONE...\",\r\n};\r\n"],"names":[],"mappings":"AAAY,MAAC,SAAS;AAAA,EACpB,WAAW;AAAA,EACX,YAAY;AACd;"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { jsxs, Fragment, jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useState, useEffect } from "react";
|
|
3
|
+
import Select from "react-select";
|
|
4
|
+
import { Label } from "reactstrap";
|
|
5
|
+
import { CustomSelectInput } from "../CustomSelectInput.js";
|
|
6
|
+
import { LABELS } from "./constants.js";
|
|
7
|
+
import "react-tagsinput/react-tagsinput.css";
|
|
8
|
+
const { SIN_DATOS, SELECCIONE } = LABELS;
|
|
9
|
+
const CustomSelect = (props) => {
|
|
10
|
+
const [firstElement] = useState(props.firstElement);
|
|
11
|
+
const [newItem] = useState(props.newItem);
|
|
12
|
+
const [selectedIoption, setIoption] = useState({});
|
|
13
|
+
const [customStylesOption] = useState(props.customStylesOption);
|
|
14
|
+
const [customStyles, setCustomStyles] = useState({});
|
|
15
|
+
useEffect(() => {
|
|
16
|
+
if (newItem) {
|
|
17
|
+
props.options.push(newItem);
|
|
18
|
+
}
|
|
19
|
+
}, [newItem, props.options]);
|
|
20
|
+
useEffect(() => {
|
|
21
|
+
const { options = [] } = props;
|
|
22
|
+
if (firstElement && Number(options?.length) > 1) {
|
|
23
|
+
const propIOption = options.filter((item) => item === firstElement);
|
|
24
|
+
if (propIOption?.length === 0) {
|
|
25
|
+
props.options.unshift(firstElement);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}, [firstElement, props.options]);
|
|
29
|
+
useEffect(() => {
|
|
30
|
+
const { selectedValue } = props;
|
|
31
|
+
const errorProp = { value: null };
|
|
32
|
+
if (selectedValue || firstElement && firstElement.value === selectedValue) {
|
|
33
|
+
const propIOption = props.options.filter(({ value }) => {
|
|
34
|
+
return JSON.stringify(value) === JSON.stringify(selectedValue);
|
|
35
|
+
});
|
|
36
|
+
if (propIOption[0]) {
|
|
37
|
+
setIoption(propIOption[0]);
|
|
38
|
+
if (!Object.getOwnPropertyDescriptor(selectedIoption, "label")) {
|
|
39
|
+
props.onChange(propIOption[0]);
|
|
40
|
+
}
|
|
41
|
+
} else {
|
|
42
|
+
setIoption(errorProp);
|
|
43
|
+
props.onChange(errorProp);
|
|
44
|
+
}
|
|
45
|
+
} else if (props.options.length > 0) {
|
|
46
|
+
setIoption(errorProp);
|
|
47
|
+
props.onChange(errorProp);
|
|
48
|
+
}
|
|
49
|
+
}, [props.selectedValue, props.options, firstElement]);
|
|
50
|
+
useEffect(() => {
|
|
51
|
+
if (customStylesOption) {
|
|
52
|
+
const stylesOption = {
|
|
53
|
+
option: (base, { data }) => {
|
|
54
|
+
return {
|
|
55
|
+
...base,
|
|
56
|
+
color: data.fields && data.fields[customStylesOption.fieldMatch] === customStylesOption.valueMatch ? "blue !important" : "",
|
|
57
|
+
fontWeight: data.fields && data.fields[customStylesOption.fieldMatch] === customStylesOption.valueMatch ? "bold" : ""
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
setCustomStyles(stylesOption);
|
|
62
|
+
}
|
|
63
|
+
}, [customStylesOption]);
|
|
64
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
65
|
+
props.label && props.label !== "" && /* @__PURE__ */ jsxs(Label, { className: "mb-0", children: [
|
|
66
|
+
props.label,
|
|
67
|
+
":"
|
|
68
|
+
] }),
|
|
69
|
+
/* @__PURE__ */ jsx(
|
|
70
|
+
Select,
|
|
71
|
+
{
|
|
72
|
+
...props,
|
|
73
|
+
components: { Input: CustomSelectInput },
|
|
74
|
+
className: "react-select",
|
|
75
|
+
classNamePrefix: "react-select",
|
|
76
|
+
name: "form-field-name",
|
|
77
|
+
value: Object.getOwnPropertyDescriptor(selectedIoption, "label") ? selectedIoption : "",
|
|
78
|
+
onChange: props.onChange,
|
|
79
|
+
options: props.options,
|
|
80
|
+
placeholder: Number(props.options.length) === 0 ? SIN_DATOS : props.placeholder || SELECCIONE,
|
|
81
|
+
isDisabled: props.disabled,
|
|
82
|
+
styles: customStyles
|
|
83
|
+
}
|
|
84
|
+
)
|
|
85
|
+
] });
|
|
86
|
+
};
|
|
87
|
+
export {
|
|
88
|
+
CustomSelect
|
|
89
|
+
};
|
|
90
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/select/index.tsx"],"sourcesContent":["import React, { useEffect, useState } from 'react';\r\nimport Select from 'react-select';\r\nimport { Label } from 'reactstrap';\r\nimport {CustomSelectInput} from '../CustomSelectInput';\r\nimport { LABELS } from './constants';\r\nimport 'react-tagsinput/react-tagsinput.css';\r\n\r\ninterface ICustomStylesOption {\r\n fieldMatch: string;\r\n valueMatch: any;\r\n}\r\ninterface IOption {\r\n label: string;\r\n value: any;\r\n fields?: any;\r\n}\r\ninterface IOption {\r\n label: string;\r\n value: any;\r\n fields?: any;\r\n}\r\ninterface Props {\r\n label: string;\r\n tabIndex: number;\r\n options: [IOption];\r\n onChange: any;\r\n selectedValue: any;\r\n firstElement?: IOption; // no ingresar null como VALUE del elemento, setear '' ya que lo toma como que no se selecciono nada\r\n newItem?: IOption;\r\n placeholder?: string;\r\n disabled?: boolean;\r\n customStylesOption?: ICustomStylesOption;\r\n}\r\n\r\nconst {SIN_DATOS, SELECCIONE}=LABELS\r\n\r\nexport const CustomSelect: React.FC<Props> = (props: Props) => {\r\n const [firstElement] = useState(props.firstElement);\r\n const [newItem] = useState(props.newItem);\r\n const [selectedIoption, setIoption] = useState({});\r\n const [customStylesOption] = useState(props.customStylesOption);\r\n const [customStyles, setCustomStyles] = useState({});\r\n\r\n // agrega items\r\n useEffect(() => {\r\n if (newItem) {\r\n props.options.push(newItem);\r\n }\r\n }, [newItem, props.options]);\r\n\r\n // Seleccion del 1er item.\r\n useEffect(() => {\r\n const { options = [] } = props;\r\n if (firstElement && Number(options?.length) > 1) {\r\n const propIOption = options.filter((item) => item === firstElement);\r\n\r\n if (propIOption?.length === 0) {\r\n props.options.unshift(firstElement);\r\n }\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [firstElement, props.options]);\r\n\r\n // selecciona un valor seteado dentro de la coleccion\r\n useEffect(() => {\r\n const { selectedValue } = props;\r\n const errorProp = { value: null };\r\n\r\n if (\r\n selectedValue ||\r\n (firstElement && firstElement.value === selectedValue)\r\n ) {\r\n const propIOption = props.options.filter(({ value }) => {\r\n return JSON.stringify(value) === JSON.stringify(selectedValue);\r\n });\r\n\r\n if (propIOption[0]) {\r\n setIoption(propIOption[0]);\r\n if (!Object.getOwnPropertyDescriptor(selectedIoption, 'label')) {\r\n props.onChange(propIOption[0]);\r\n }\r\n } else {\r\n setIoption(errorProp);\r\n props.onChange(errorProp);\r\n }\r\n } else if (props.options.length > 0) {\r\n setIoption(errorProp);\r\n props.onChange(errorProp);\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [props.selectedValue, props.options, firstElement]);\r\n\r\n useEffect(() => {\r\n if (customStylesOption) {\r\n const stylesOption = {\r\n option: (base: any, { data }: any) => {\r\n return {\r\n ...base,\r\n color:\r\n data.fields &&\r\n data.fields[customStylesOption.fieldMatch] ===\r\n customStylesOption.valueMatch\r\n ? 'blue !important'\r\n : '',\r\n fontWeight:\r\n data.fields &&\r\n data.fields[customStylesOption.fieldMatch] ===\r\n customStylesOption.valueMatch\r\n ? 'bold'\r\n : '',\r\n };\r\n },\r\n };\r\n setCustomStyles(stylesOption);\r\n }\r\n }, [customStylesOption]);\r\n\r\n return (\r\n <>\r\n {props.label && props.label !== '' && (\r\n <Label className=\"mb-0\">{props.label}:</Label>\r\n )}\r\n <Select\r\n {...props}\r\n components={{ Input: CustomSelectInput }}\r\n className=\"react-select\"\r\n classNamePrefix=\"react-select\"\r\n name=\"form-field-name\"\r\n value={\r\n Object.getOwnPropertyDescriptor(selectedIoption, 'label')\r\n ? selectedIoption\r\n : ''\r\n }\r\n onChange={props.onChange}\r\n options={props.options}\r\n placeholder={\r\n Number(props.options.length) === 0\r\n ? SIN_DATOS\r\n : props.placeholder || SELECCIONE\r\n }\r\n isDisabled={props.disabled}\r\n styles={customStyles}\r\n />\r\n </>\r\n );\r\n};\r\n\r\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useState, useRef, useEffect } from "react";
|
|
3
|
+
import "./styles.scss";
|
|
4
|
+
const formatTiempo = (ms) => {
|
|
5
|
+
if (ms == null) return "--:--";
|
|
6
|
+
const absMs = Math.abs(ms);
|
|
7
|
+
const totalSec = Math.floor(absMs / 1e3);
|
|
8
|
+
const min = Math.floor(totalSec / 60);
|
|
9
|
+
const sec = totalSec % 60;
|
|
10
|
+
const formatted = `${min.toString().padStart(2, "0")}:${sec.toString().padStart(2, "0")}`;
|
|
11
|
+
return ms < 0 ? `-${formatted}` : formatted;
|
|
12
|
+
};
|
|
13
|
+
const getTimerColorClass = (ms, maxTime) => {
|
|
14
|
+
if (!maxTime) return "";
|
|
15
|
+
const percent = ms / maxTime;
|
|
16
|
+
if (percent > 0.33) return "timer-green";
|
|
17
|
+
if (percent > 0.15) return "timer-yellow";
|
|
18
|
+
if (percent > 0) return "timer-red";
|
|
19
|
+
if (ms === 0) return "timer-out";
|
|
20
|
+
if (ms < 0) return "timer-over";
|
|
21
|
+
return "";
|
|
22
|
+
};
|
|
23
|
+
const Timer = ({
|
|
24
|
+
initialMinutes = 0,
|
|
25
|
+
icon = true,
|
|
26
|
+
className = "",
|
|
27
|
+
active = true,
|
|
28
|
+
style = {}
|
|
29
|
+
}) => {
|
|
30
|
+
const initialMs = initialMinutes * 60 * 1e3;
|
|
31
|
+
const [ms, setMs] = useState(initialMs);
|
|
32
|
+
const intervalRef = useRef();
|
|
33
|
+
useEffect(() => {
|
|
34
|
+
if (!active) return;
|
|
35
|
+
intervalRef.current = setInterval(() => {
|
|
36
|
+
setMs((prev) => prev - 1e3);
|
|
37
|
+
}, 1e3);
|
|
38
|
+
return () => clearInterval(intervalRef.current);
|
|
39
|
+
}, [active]);
|
|
40
|
+
useEffect(() => {
|
|
41
|
+
setMs(initialMs);
|
|
42
|
+
}, [initialMs]);
|
|
43
|
+
const timerColorClass = getTimerColorClass(ms, initialMs);
|
|
44
|
+
return /* @__PURE__ */ jsxs(
|
|
45
|
+
"span",
|
|
46
|
+
{
|
|
47
|
+
className: `av-video-timer timer ${timerColorClass} ${className}`,
|
|
48
|
+
style,
|
|
49
|
+
children: [
|
|
50
|
+
icon && /* @__PURE__ */ jsx("i", { className: "icon-clock timer" }),
|
|
51
|
+
formatTiempo(ms)
|
|
52
|
+
]
|
|
53
|
+
}
|
|
54
|
+
);
|
|
55
|
+
};
|
|
56
|
+
export {
|
|
57
|
+
Timer,
|
|
58
|
+
formatTiempo
|
|
59
|
+
};
|
|
60
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/timer/index.jsx"],"sourcesContent":["import { useEffect, useState, useRef } from 'react';\r\nimport './styles.scss';\r\n\r\nexport const formatTiempo = (ms) => {\r\n if (ms == null) return '--:--';\r\n const absMs = Math.abs(ms);\r\n const totalSec = Math.floor(absMs / 1000);\r\n const min = Math.floor(totalSec / 60);\r\n const sec = totalSec % 60;\r\n const formatted = `${min.toString().padStart(2, '0')}:${sec\r\n .toString()\r\n .padStart(2, '0')}`;\r\n return ms < 0 ? `-${formatted}` : formatted;\r\n};\r\n\r\nconst getTimerColorClass = (ms, maxTime) => {\r\n if (!maxTime) return '';\r\n const percent = ms / maxTime;\r\n if (percent > 0.33) return 'timer-green';\r\n if (percent > 0.15) return 'timer-yellow';\r\n if (percent > 0) return 'timer-red';\r\n if (ms === 0) return 'timer-out';\r\n if (ms < 0) return 'timer-over';\r\n return '';\r\n};\r\n\r\nconst Timer = ({\r\n initialMinutes = 0,\r\n icon = true,\r\n className = '',\r\n active = true,\r\n style = {},\r\n}) => {\r\n const initialMs = initialMinutes * 60 * 1000;\r\n const [ms, setMs] = useState(initialMs);\r\n const intervalRef = useRef();\r\n\r\n useEffect(() => {\r\n if (!active) return;\r\n intervalRef.current = setInterval(() => {\r\n setMs((prev) => prev - 1000);\r\n }, 1000);\r\n return () => clearInterval(intervalRef.current);\r\n }, [active]);\r\n\r\n useEffect(() => {\r\n setMs(initialMs);\r\n }, [initialMs]);\r\n\r\n const timerColorClass = getTimerColorClass(ms, initialMs);\r\n\r\n return (\r\n <span\r\n className={`av-video-timer timer ${timerColorClass} ${className}`}\r\n style={style}\r\n >\r\n {icon && <i className=\"icon-clock timer\" />}\r\n {formatTiempo(ms)}\r\n </span>\r\n );\r\n};\r\nexport { Timer };\r\n"],"names":[],"mappings":";;;AAGO,MAAM,eAAe,CAAC,OAAO;AAClC,MAAI,MAAM,KAAM,QAAO;AACvB,QAAM,QAAQ,KAAK,IAAI,EAAE;AACzB,QAAM,WAAW,KAAK,MAAM,QAAQ,GAAI;AACxC,QAAM,MAAM,KAAK,MAAM,WAAW,EAAE;AACpC,QAAM,MAAM,WAAW;AACvB,QAAM,YAAY,GAAG,IAAI,SAAA,EAAW,SAAS,GAAG,GAAG,CAAC,IAAI,IACrD,SAAA,EACA,SAAS,GAAG,GAAG,CAAC;AACnB,SAAO,KAAK,IAAI,IAAI,SAAS,KAAK;AACpC;AAEA,MAAM,qBAAqB,CAAC,IAAI,YAAY;AAC1C,MAAI,CAAC,QAAS,QAAO;AACrB,QAAM,UAAU,KAAK;AACrB,MAAI,UAAU,KAAM,QAAO;AAC3B,MAAI,UAAU,KAAM,QAAO;AAC3B,MAAI,UAAU,EAAG,QAAO;AACxB,MAAI,OAAO,EAAG,QAAO;AACrB,MAAI,KAAK,EAAG,QAAO;AACnB,SAAO;AACT;AAEA,MAAM,QAAQ,CAAC;AAAA,EACb,iBAAiB;AAAA,EACjB,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,QAAQ,CAAA;AACV,MAAM;AACJ,QAAM,YAAY,iBAAiB,KAAK;AACxC,QAAM,CAAC,IAAI,KAAK,IAAI,SAAS,SAAS;AACtC,QAAM,cAAc,OAAA;AAEpB,YAAU,MAAM;AACd,QAAI,CAAC,OAAQ;AACb,gBAAY,UAAU,YAAY,MAAM;AACtC,YAAM,CAAC,SAAS,OAAO,GAAI;AAAA,IAC7B,GAAG,GAAI;AACP,WAAO,MAAM,cAAc,YAAY,OAAO;AAAA,EAChD,GAAG,CAAC,MAAM,CAAC;AAEX,YAAU,MAAM;AACd,UAAM,SAAS;AAAA,EACjB,GAAG,CAAC,SAAS,CAAC;AAEd,QAAM,kBAAkB,mBAAmB,IAAI,SAAS;AAExD,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW,wBAAwB,eAAe,IAAI,SAAS;AAAA,MAC/D;AAAA,MAEC,UAAA;AAAA,QAAA,QAAQ,oBAAC,KAAA,EAAE,WAAU,mBAAA,CAAmB;AAAA,QACxC,aAAa,EAAE;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGtB;"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { jsxs, Fragment, jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from "react";
|
|
3
|
+
import { Row } from "reactstrap";
|
|
4
|
+
import { TAKE_PHOTO } from "../constants.js";
|
|
5
|
+
import imgHacerFoto from "../assets/img/take-photo.png.js";
|
|
6
|
+
import { Colxx } from "../CustomBootstrap.js";
|
|
7
|
+
import { DropzoneUploader } from "../dropzone-uploader/index.js";
|
|
8
|
+
const TomarFoto = ({
|
|
9
|
+
onFilesSelectedSelfie = () => {
|
|
10
|
+
},
|
|
11
|
+
isMobile = false
|
|
12
|
+
}) => {
|
|
13
|
+
const [filesTotalSelectedSelfie, setTotalFilesSelectedSelfie] = useState(0);
|
|
14
|
+
const {
|
|
15
|
+
LOAD_SELFIE_WITH_IDENTITY_CARD_MESSAGE,
|
|
16
|
+
MESSAGE_SELFIE_ONLY_CAN_TAKE_FROM_CELLPHONE,
|
|
17
|
+
TAKE_PHOTO_MESSAGE
|
|
18
|
+
} = TAKE_PHOTO;
|
|
19
|
+
const handleFilesSelectedSelfie = (files) => {
|
|
20
|
+
setTotalFilesSelectedSelfie(files.length);
|
|
21
|
+
onFilesSelectedSelfie(files);
|
|
22
|
+
};
|
|
23
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
24
|
+
/* @__PURE__ */ jsx(Row, { className: "pt-2 ml-4", children: /* @__PURE__ */ jsx(Colxx, { xxs: "11", md: "5", children: LOAD_SELFIE_WITH_IDENTITY_CARD_MESSAGE }) }),
|
|
25
|
+
/* @__PURE__ */ jsx(Row, { className: "pt-2 ml-2", children: /* @__PURE__ */ jsx(Colxx, { xxs: "12", md: "9", children: isMobile ? /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsxs(Colxx, { xxs: "12", className: "text-center", children: [
|
|
26
|
+
filesTotalSelectedSelfie === 0 && /* @__PURE__ */ jsx(
|
|
27
|
+
"img",
|
|
28
|
+
{
|
|
29
|
+
style: { width: "97%" },
|
|
30
|
+
alt: "hacerFotoDNI",
|
|
31
|
+
src: imgHacerFoto
|
|
32
|
+
}
|
|
33
|
+
),
|
|
34
|
+
/* @__PURE__ */ jsx(
|
|
35
|
+
DropzoneUploader,
|
|
36
|
+
{
|
|
37
|
+
className: "pt-2 ml-2",
|
|
38
|
+
maxFiles: 1,
|
|
39
|
+
onChangeFiles: handleFilesSelectedSelfie,
|
|
40
|
+
totalFiles: filesTotalSelectedSelfie,
|
|
41
|
+
accept: "image/jpg,image/jpeg",
|
|
42
|
+
capture: "environment",
|
|
43
|
+
nameFileLabel: TAKE_PHOTO_MESSAGE
|
|
44
|
+
}
|
|
45
|
+
)
|
|
46
|
+
] }) }) : /* @__PURE__ */ jsx(
|
|
47
|
+
"h2",
|
|
48
|
+
{
|
|
49
|
+
className: "view-icon iconsminds-smartphone-4 ml-2 mr-2",
|
|
50
|
+
style: {
|
|
51
|
+
color: "red",
|
|
52
|
+
margin: "10px 10px 0px 10px"
|
|
53
|
+
},
|
|
54
|
+
children: MESSAGE_SELFIE_ONLY_CAN_TAKE_FROM_CELLPHONE
|
|
55
|
+
}
|
|
56
|
+
) }) })
|
|
57
|
+
] });
|
|
58
|
+
};
|
|
59
|
+
export {
|
|
60
|
+
TomarFoto
|
|
61
|
+
};
|
|
62
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/tomar-foto/index.jsx"],"sourcesContent":["import { useState } from 'react';\r\nimport { Row } from 'reactstrap';\r\nimport { DropzoneUploader, Colxx } from '../';\r\nimport { TAKE_PHOTO } from '../constants';\r\nimport imgHacerFoto from '../assets/img/take-photo.png';\r\n\r\n \r\nexport const TomarFoto = ({\r\n onFilesSelectedSelfie = () => {},\r\n isMobile = false,\r\n}) => {\r\n const [filesTotalSelectedSelfie, setTotalFilesSelectedSelfie] = useState(0);\r\n const {\r\n LOAD_SELFIE_WITH_IDENTITY_CARD_MESSAGE,\r\n MESSAGE_SELFIE_ONLY_CAN_TAKE_FROM_CELLPHONE,\r\n TAKE_PHOTO_MESSAGE,\r\n } = TAKE_PHOTO;\r\n\r\n const handleFilesSelectedSelfie = (files) => {\r\n setTotalFilesSelectedSelfie(files.length);\r\n onFilesSelectedSelfie(files);\r\n };\r\n\r\n return (\r\n <>\r\n <Row className=\"pt-2 ml-4\">\r\n <Colxx xxs=\"11\" md=\"5\">\r\n {LOAD_SELFIE_WITH_IDENTITY_CARD_MESSAGE}\r\n </Colxx>\r\n </Row>\r\n <Row className=\"pt-2 ml-2\">\r\n <Colxx xxs=\"12\" md=\"9\">\r\n {isMobile ? (\r\n <>\r\n <Colxx xxs=\"12\" className=\"text-center\">\r\n {filesTotalSelectedSelfie === 0 && (\r\n <img\r\n style={{ width: '97%' }}\r\n alt=\"hacerFotoDNI\"\r\n src={imgHacerFoto}\r\n />\r\n )}\r\n <DropzoneUploader\r\n className=\"pt-2 ml-2\"\r\n maxFiles={1}\r\n onChangeFiles={handleFilesSelectedSelfie}\r\n totalFiles={filesTotalSelectedSelfie}\r\n accept=\"image/jpg,image/jpeg\"\r\n capture=\"environment\"\r\n nameFileLabel={TAKE_PHOTO_MESSAGE}\r\n />\r\n </Colxx>\r\n </>\r\n ) : (\r\n <h2\r\n className={'view-icon iconsminds-smartphone-4 ml-2 mr-2'}\r\n style={{\r\n color: 'red',\r\n margin: '10px 10px 0px 10px',\r\n }}\r\n >\r\n {MESSAGE_SELFIE_ONLY_CAN_TAKE_FROM_CELLPHONE}\r\n </h2>\r\n )}\r\n </Colxx>\r\n </Row>\r\n </>\r\n );\r\n};\r\n"],"names":[],"mappings":";;;;;;;AAOO,MAAM,YAAY,CAAC;AAAA,EACxB,wBAAwB,MAAM;AAAA,EAAC;AAAA,EAC/B,WAAW;AACb,MAAM;AACJ,QAAM,CAAC,0BAA0B,2BAA2B,IAAI,SAAS,CAAC;AAC1E,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,EAAA,IACE;AAEJ,QAAM,4BAA4B,CAAC,UAAU;AAC3C,gCAA4B,MAAM,MAAM;AACxC,0BAAsB,KAAK;AAAA,EAC7B;AAEA,SACE,qBAAA,UAAA,EACE,UAAA;AAAA,IAAA,oBAAC,KAAA,EAAI,WAAU,aACb,UAAA,oBAAC,OAAA,EAAM,KAAI,MAAK,IAAG,KAChB,UAAA,uCAAA,CACH,GACF;AAAA,wBACC,KAAA,EAAI,WAAU,aACb,UAAA,oBAAC,SAAM,KAAI,MAAK,IAAG,KAChB,qBACC,oBAAA,UAAA,EACE,UAAA,qBAAC,SAAM,KAAI,MAAK,WAAU,eACvB,UAAA;AAAA,MAAA,6BAA6B,KAC5B;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,OAAO,EAAE,OAAO,MAAA;AAAA,UAChB,KAAI;AAAA,UACJ,KAAK;AAAA,QAAA;AAAA,MAAA;AAAA,MAGT;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAU;AAAA,UACV,UAAU;AAAA,UACV,eAAe;AAAA,UACf,YAAY;AAAA,UACZ,QAAO;AAAA,UACP,SAAQ;AAAA,UACR,eAAe;AAAA,QAAA;AAAA,MAAA;AAAA,IACjB,EAAA,CACF,GACF,IAEA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAW;AAAA,QACX,OAAO;AAAA,UACL,OAAO;AAAA,UACP,QAAQ;AAAA,QAAA;AAAA,QAGT,UAAA;AAAA,MAAA;AAAA,IAAA,GAGP,EAAA,CACF;AAAA,EAAA,GACF;AAEJ;"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import "./styles.scss";
|
|
3
|
+
const ButtonEditor = ({ activo, onClick }) => /* @__PURE__ */ jsx(
|
|
4
|
+
"button",
|
|
5
|
+
{
|
|
6
|
+
className: `visualizador-editor-btn ${activo ? "visualizador-editor-btn--activo" : "visualizador-editor-btn--inactivo"}`,
|
|
7
|
+
onClick,
|
|
8
|
+
children: /* @__PURE__ */ jsx("span", { children: /* @__PURE__ */ jsx("i", { className: "icon-eye simple-icon-eye" }) })
|
|
9
|
+
}
|
|
10
|
+
);
|
|
11
|
+
export {
|
|
12
|
+
ButtonEditor as default
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=button-editor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"button-editor.js","sources":["../../src/view-layout/button-editor.jsx"],"sourcesContent":["import './styles.scss';\r\n\r\nconst ButtonEditor = ({ activo, onClick }) => (\r\n <button\r\n className={`visualizador-editor-btn ${\r\n activo\r\n ? 'visualizador-editor-btn--activo'\r\n : 'visualizador-editor-btn--inactivo'\r\n }`}\r\n onClick={onClick}\r\n >\r\n <span>\r\n <i className=\"icon-eye simple-icon-eye\" />\r\n </span>\r\n </button>\r\n);\r\n\r\nexport default ButtonEditor;\r\n"],"names":[],"mappings":";;AAEA,MAAM,eAAe,CAAC,EAAE,QAAQ,cAC9B;AAAA,EAAC;AAAA,EAAA;AAAA,IACC,WAAW,2BACT,SACI,oCACA,mCACN;AAAA,IACA;AAAA,IAEA,8BAAC,QAAA,EACC,UAAA,oBAAC,KAAA,EAAE,WAAU,4BAA2B,EAAA,CAC1C;AAAA,EAAA;AACF;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sources":["../../src/view-layout/constants.js"],"sourcesContent":["export const GRID_SIZES = {\r\n sm: { cols: 18, rows: 18 },\r\n md: { cols: 12, rows: 12 },\r\n lg: { cols: 6, rows: 6 },\r\n};\r\n\r\nexport const LOCALHOST = ['localhost', '127.0.0.1'];\r\n"],"names":[],"mappings":"AAAY,MAAC,aAAa;AAAA,EACxB,IAAI,EAAE,MAAM,IAAI,MAAM,GAAE;AAAA,EACxB,IAAI,EAAE,MAAM,IAAI,MAAM,GAAE;AAAA,EACxB,IAAI,EAAE,MAAM,GAAG,MAAM,EAAC;AACxB;AAEY,MAAC,YAAY,CAAC,aAAa,WAAW;"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import "./styles.scss";
|
|
3
|
+
const EditorLayer = ({ gridCols, gridRows }) => {
|
|
4
|
+
return /* @__PURE__ */ jsx(
|
|
5
|
+
"div",
|
|
6
|
+
{
|
|
7
|
+
className: "editor-layer",
|
|
8
|
+
style: {
|
|
9
|
+
gridTemplateColumns: `repeat(${gridCols}, 1fr)`,
|
|
10
|
+
gridTemplateRows: `repeat(${gridRows}, 1fr)`
|
|
11
|
+
},
|
|
12
|
+
children: Array.from({ length: gridRows * gridCols }).map((_, idx) => {
|
|
13
|
+
const x = idx % gridCols;
|
|
14
|
+
const y = Math.floor(idx / gridCols);
|
|
15
|
+
return /* @__PURE__ */ jsx("div", { className: "editor-layer-cell", children: /* @__PURE__ */ jsxs("div", { className: "editor-layer-cell-coord", children: [
|
|
16
|
+
"x:",
|
|
17
|
+
x,
|
|
18
|
+
";y:",
|
|
19
|
+
y
|
|
20
|
+
] }) }, `cell-${x}-${y}`);
|
|
21
|
+
})
|
|
22
|
+
}
|
|
23
|
+
);
|
|
24
|
+
};
|
|
25
|
+
export {
|
|
26
|
+
EditorLayer as default
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=editor-layer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"editor-layer.js","sources":["../../src/view-layout/editor-layer.jsx"],"sourcesContent":["import './styles.scss';\r\n\r\nconst EditorLayer = ({ gridCols, gridRows }) => {\r\n return (\r\n <div\r\n className=\"editor-layer\"\r\n style={{\r\n gridTemplateColumns: `repeat(${gridCols}, 1fr)`,\r\n gridTemplateRows: `repeat(${gridRows}, 1fr)`,\r\n }}\r\n >\r\n {Array.from({ length: gridRows * gridCols }).map((_, idx) => {\r\n const x = idx % gridCols;\r\n const y = Math.floor(idx / gridCols);\r\n return (\r\n <div key={`cell-${x}-${y}`} className=\"editor-layer-cell\">\r\n <div className=\"editor-layer-cell-coord\">\r\n x:{x};y:{y}\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n );\r\n};\r\n\r\nexport default EditorLayer;\r\n"],"names":[],"mappings":";;AAEA,MAAM,cAAc,CAAC,EAAE,UAAU,eAAe;AAC9C,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAU;AAAA,MACV,OAAO;AAAA,QACL,qBAAqB,UAAU,QAAQ;AAAA,QACvC,kBAAkB,UAAU,QAAQ;AAAA,MAAA;AAAA,MAGrC,UAAA,MAAM,KAAK,EAAE,QAAQ,WAAW,SAAA,CAAU,EAAE,IAAI,CAAC,GAAG,QAAQ;AAC3D,cAAM,IAAI,MAAM;AAChB,cAAM,IAAI,KAAK,MAAM,MAAM,QAAQ;AACnC,mCACG,OAAA,EAA2B,WAAU,qBACpC,UAAA,qBAAC,OAAA,EAAI,WAAU,2BAA0B,UAAA;AAAA,UAAA;AAAA,UACpC;AAAA,UAAE;AAAA,UAAI;AAAA,QAAA,EAAA,CACX,EAAA,GAHQ,QAAQ,CAAC,IAAI,CAAC,EAIxB;AAAA,MAEJ,CAAC;AAAA,IAAA;AAAA,EAAA;AAGP;"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useState, createElement } from "react";
|
|
3
|
+
import SlotWrapper from "./slot-wrapper.js";
|
|
4
|
+
import EditorLayer from "./editor-layer.js";
|
|
5
|
+
import { GRID_SIZES, LOCALHOST } from "./constants.js";
|
|
6
|
+
import ButtonEditor from "./button-editor.js";
|
|
7
|
+
import "./styles.scss";
|
|
8
|
+
const ViewLayout = ({
|
|
9
|
+
slots = [],
|
|
10
|
+
size = "md",
|
|
11
|
+
alto = 80,
|
|
12
|
+
ancho = 90,
|
|
13
|
+
server = window?.location?.hostname,
|
|
14
|
+
...props
|
|
15
|
+
}) => {
|
|
16
|
+
const isLocalhost = LOCALHOST.includes(server);
|
|
17
|
+
const [isEditorActivo, setEditorActivo] = useState(false);
|
|
18
|
+
const gridCols = GRID_SIZES[size].cols;
|
|
19
|
+
const gridRows = GRID_SIZES[size].rows;
|
|
20
|
+
return /* @__PURE__ */ jsxs("div", { className: "visualizador-container", children: [
|
|
21
|
+
isLocalhost && /* @__PURE__ */ jsx(
|
|
22
|
+
ButtonEditor,
|
|
23
|
+
{
|
|
24
|
+
activo: isEditorActivo,
|
|
25
|
+
onClick: () => setEditorActivo((prev) => !prev)
|
|
26
|
+
}
|
|
27
|
+
),
|
|
28
|
+
/* @__PURE__ */ jsxs(
|
|
29
|
+
"div",
|
|
30
|
+
{
|
|
31
|
+
className: "visualizador-grid-css",
|
|
32
|
+
style: {
|
|
33
|
+
maxWidth: `${ancho}vw`,
|
|
34
|
+
height: `${alto}vh`,
|
|
35
|
+
gridTemplateColumns: `repeat(${gridCols}, 1fr)`,
|
|
36
|
+
gridTemplateRows: `repeat(${gridRows}, 1fr)`
|
|
37
|
+
},
|
|
38
|
+
...props,
|
|
39
|
+
children: [
|
|
40
|
+
isEditorActivo && /* @__PURE__ */ jsx(EditorLayer, { gridCols, gridRows }),
|
|
41
|
+
slots.map((slot) => {
|
|
42
|
+
const { x, y, w, h, legend } = slot;
|
|
43
|
+
return /* @__PURE__ */ createElement(SlotWrapper, { ...slot, legend, key: slot.slot });
|
|
44
|
+
})
|
|
45
|
+
]
|
|
46
|
+
}
|
|
47
|
+
)
|
|
48
|
+
] });
|
|
49
|
+
};
|
|
50
|
+
export {
|
|
51
|
+
ViewLayout
|
|
52
|
+
};
|
|
53
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/view-layout/index.tsx"],"sourcesContent":["import React, { FC, useState } from 'react';\r\nimport SlotWrapper from './slot-wrapper';\r\nimport { ItemSlot } from './item-slot';\r\nimport EditorLayer from './editor-layer.jsx';\r\nimport { GRID_SIZES, LOCALHOST } from './constants';\r\nimport ButtonEditor from './button-editor.jsx';\r\nimport './styles.scss';\r\n\r\ninterface LayoutProps {\r\n slots: ItemSlot[];\r\n alto?: number;\r\n ancho?: number;\r\n size?: 'sm' | 'md' | 'lg';\r\n [key: string]: any;\r\n}\r\n\r\nconst ViewLayout: FC<LayoutProps> = ({\r\n slots = [],\r\n size = 'md',\r\n alto = 80,\r\n ancho = 90,\r\n server = window?.location?.hostname,\r\n ...props\r\n}) => {\r\n \r\n const isLocalhost=LOCALHOST.includes(server);\r\n\r\n const [isEditorActivo, setEditorActivo] = useState(false);\r\n const gridCols = GRID_SIZES[size].cols;\r\n const gridRows = GRID_SIZES[size].rows;\r\n return (\r\n <div className=\"visualizador-container\">\r\n {isLocalhost && (\r\n <ButtonEditor\r\n activo={isEditorActivo}\r\n onClick={() => setEditorActivo((prev) => !prev)}\r\n />\r\n )}\r\n\r\n <div\r\n className=\"visualizador-grid-css\"\r\n style={{\r\n maxWidth: `${ancho}vw`,\r\n height: `${alto}vh`,\r\n gridTemplateColumns: `repeat(${gridCols}, 1fr)`,\r\n gridTemplateRows: `repeat(${gridRows}, 1fr)`,\r\n }}\r\n {...props}\r\n >\r\n {isEditorActivo && (\r\n <EditorLayer gridCols={gridCols} gridRows={gridRows} />\r\n )}\r\n {slots.map((slot) => {\r\n const { x, y, w, h, legend } = slot;\r\n return <SlotWrapper {...slot} legend={legend} key={slot.slot} />;\r\n })}\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport { ViewLayout };\r\n"],"names":[],"mappings":";;;;;;;AAgBA,MAAM,aAA8B,CAAC;AAAA,EACnC,QAAQ,CAAA;AAAA,EACR,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,SAAS,QAAQ,UAAU;AAAA,EAC3B,GAAG;AACL,MAAM;AAEJ,QAAM,cAAY,UAAU,SAAS,MAAM;AAE3C,QAAM,CAAC,gBAAgB,eAAe,IAAI,SAAS,KAAK;AACxD,QAAM,WAAW,WAAW,IAAI,EAAE;AAClC,QAAM,WAAW,WAAW,IAAI,EAAE;AAClC,SACE,qBAAC,OAAA,EAAI,WAAU,0BACZ,UAAA;AAAA,IAAA,eACC;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,QAAQ;AAAA,QACR,SAAS,MAAM,gBAAgB,CAAC,SAAS,CAAC,IAAI;AAAA,MAAA;AAAA,IAAA;AAAA,IAIlD;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAU;AAAA,QACV,OAAO;AAAA,UACL,UAAU,GAAG,KAAK;AAAA,UAClB,QAAQ,GAAG,IAAI;AAAA,UACf,qBAAqB,UAAU,QAAQ;AAAA,UACvC,kBAAkB,UAAU,QAAQ;AAAA,QAAA;AAAA,QAErC,GAAG;AAAA,QAEH,UAAA;AAAA,UAAA,kBACC,oBAAC,aAAA,EAAY,UAAoB,SAAA,CAAoB;AAAA,UAEtD,MAAM,IAAI,CAAC,SAAS;AACnB,kBAAM,EAAE,GAAG,GAAG,GAAG,GAAG,WAAW;AAC/B,iDAAQ,aAAA,EAAa,GAAG,MAAM,QAAgB,KAAK,KAAK,MAAM;AAAA,UAChE,CAAC;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EACH,GACF;AAEJ;"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
+
const SlotWrapper = ({
|
|
3
|
+
slot = 1,
|
|
4
|
+
component = null,
|
|
5
|
+
x = 0,
|
|
6
|
+
y = 0,
|
|
7
|
+
w = 2,
|
|
8
|
+
h = 2,
|
|
9
|
+
align = "stretch",
|
|
10
|
+
contentSize = "medium",
|
|
11
|
+
direction = "column",
|
|
12
|
+
justify = "flex-start",
|
|
13
|
+
legend,
|
|
14
|
+
showBorder = false
|
|
15
|
+
}) => {
|
|
16
|
+
return /* @__PURE__ */ jsxs(
|
|
17
|
+
"fieldset",
|
|
18
|
+
{
|
|
19
|
+
className: `visualizador-slot visualizador-slot-content--${contentSize} visualizador-slot--${direction} visualizador-slot-align--${align} visualizador-slot-justify--${justify} ` + (!showBorder ? "visualizador-slot--no-border" : ""),
|
|
20
|
+
style: {
|
|
21
|
+
position: "relative",
|
|
22
|
+
gridColumn: `${x + 1} / span ${w}`,
|
|
23
|
+
gridRow: `${y + 1} / span ${h}`,
|
|
24
|
+
display: "flex",
|
|
25
|
+
overflow: "hidden",
|
|
26
|
+
border: showBorder ? void 0 : "none"
|
|
27
|
+
},
|
|
28
|
+
children: [
|
|
29
|
+
/* @__PURE__ */ jsx("legend", { className: "slot-legend", children: legend }),
|
|
30
|
+
/* @__PURE__ */ jsx("div", { className: "slot-content", children: component })
|
|
31
|
+
]
|
|
32
|
+
},
|
|
33
|
+
slot
|
|
34
|
+
);
|
|
35
|
+
};
|
|
36
|
+
export {
|
|
37
|
+
SlotWrapper as default
|
|
38
|
+
};
|
|
39
|
+
//# sourceMappingURL=slot-wrapper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slot-wrapper.js","sources":["../../src/view-layout/slot-wrapper.tsx"],"sourcesContent":["import React, { FC } from 'react';\r\nimport { ItemSlot } from './item-slot';\r\n\r\nconst SlotWrapper: FC<ItemSlot> = ({\r\n slot = 1,\r\n component = null,\r\n x = 0,\r\n y = 0,\r\n w = 2,\r\n h = 2,\r\n align = 'stretch',\r\n contentSize = 'medium',\r\n direction = 'column',\r\n justify = 'flex-start',\r\n legend,\r\n showBorder = false,\r\n}) => {\r\n return (\r\n <fieldset\r\n key={slot}\r\n className={\r\n `visualizador-slot ` +\r\n `visualizador-slot-content--${contentSize} ` +\r\n `visualizador-slot--${direction} ` +\r\n `visualizador-slot-align--${align} ` +\r\n `visualizador-slot-justify--${justify} ` +\r\n (!showBorder ? 'visualizador-slot--no-border' : '')\r\n }\r\n style={{\r\n position: 'relative',\r\n gridColumn: `${x + 1} / span ${w}`,\r\n gridRow: `${y + 1} / span ${h}`,\r\n display: 'flex',\r\n overflow: 'hidden',\r\n border: showBorder ? undefined : 'none',\r\n }}\r\n >\r\n <legend className=\"slot-legend\">{legend}</legend>\r\n <div className=\"slot-content\">{component}</div>\r\n </fieldset>\r\n );\r\n};\r\n\r\nexport default SlotWrapper;\r\n"],"names":[],"mappings":";AAGA,MAAM,cAA4B,CAAC;AAAA,EACjC,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,UAAU;AAAA,EACV;AAAA,EACA,aAAa;AACf,MAAM;AACJ,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MAEC,WACE,gDAC8B,WAAW,uBACnB,SAAS,6BACH,KAAK,+BACH,OAAO,OACpC,CAAC,aAAa,iCAAiC;AAAA,MAElD,OAAO;AAAA,QACL,UAAU;AAAA,QACV,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC;AAAA,QAChC,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC;AAAA,QAC7B,SAAS;AAAA,QACT,UAAU;AAAA,QACV,QAAQ,aAAa,SAAY;AAAA,MAAA;AAAA,MAGnC,UAAA;AAAA,QAAA,oBAAC,UAAA,EAAO,WAAU,eAAe,UAAA,QAAO;AAAA,QACxC,oBAAC,OAAA,EAAI,WAAU,gBAAgB,UAAA,UAAA,CAAU;AAAA,MAAA;AAAA,IAAA;AAAA,IAnBpC;AAAA,EAAA;AAsBX;"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import { WherebyProvider } from "@whereby.com/browser-sdk/react";
|
|
3
|
+
import "@whereby.com/browser-sdk/embed";
|
|
4
|
+
import { Room } from "./room.js";
|
|
5
|
+
const WhereByRoom = ({ src, onEvent, onActions, iframeClass }) => {
|
|
6
|
+
return /* @__PURE__ */ jsx(WherebyProvider, { children: /* @__PURE__ */ jsx(
|
|
7
|
+
Room,
|
|
8
|
+
{
|
|
9
|
+
src,
|
|
10
|
+
onEvent,
|
|
11
|
+
onActions,
|
|
12
|
+
iframeClass
|
|
13
|
+
}
|
|
14
|
+
) });
|
|
15
|
+
};
|
|
16
|
+
export {
|
|
17
|
+
WhereByRoom,
|
|
18
|
+
WhereByRoom as default
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/where-by-room/index.jsx"],"sourcesContent":["import { WherebyProvider } from '@whereby.com/browser-sdk/react';\r\nimport '@whereby.com/browser-sdk/embed';\r\nimport Room from './room';\r\n\r\nexport const WhereByRoom = ({ src, onEvent, onActions, iframeClass }) => {\r\n return (\r\n <WherebyProvider>\r\n <Room\r\n src={src}\r\n onEvent={onEvent}\r\n onActions={onActions}\r\n iframeClass={iframeClass}\r\n />\r\n </WherebyProvider>\r\n );\r\n};\r\nexport default WhereByRoom;\r\n"],"names":[],"mappings":";;;;AAIO,MAAM,cAAc,CAAC,EAAE,KAAK,SAAS,WAAW,kBAAkB;AACvE,6BACG,iBAAA,EACC,UAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,EAAA,GAEJ;AAEJ;"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useRef, useEffect } from "react";
|
|
3
|
+
import "@whereby.com/browser-sdk/embed";
|
|
4
|
+
const Room = ({ src, onEvent, onActions, iframeClass }) => {
|
|
5
|
+
const wherebyRef = useRef(null);
|
|
6
|
+
useEffect(() => {
|
|
7
|
+
const elm = wherebyRef.current;
|
|
8
|
+
if (!elm) return;
|
|
9
|
+
if (onActions) {
|
|
10
|
+
onActions({
|
|
11
|
+
endMeeting: () => elm.endMeeting(),
|
|
12
|
+
knock: () => elm.knock(),
|
|
13
|
+
cancelKnock: () => elm.cancelKnock(),
|
|
14
|
+
leaveRoom: () => elm.leaveRoom(),
|
|
15
|
+
startRecording: () => elm.startRecording(),
|
|
16
|
+
stopRecording: () => elm.stopRecording(),
|
|
17
|
+
startStreaming: () => elm.startStreaming(),
|
|
18
|
+
stopStreaming: () => elm.stopStreaming(),
|
|
19
|
+
startLiveTranscription: () => elm.startLiveTranscription(),
|
|
20
|
+
stopLiveTranscription: () => elm.stopLiveTranscription(),
|
|
21
|
+
toggleCamera: (enabled) => elm.toggleCamera(enabled),
|
|
22
|
+
toggleMicrophone: (enabled) => elm.toggleMicrophone(enabled),
|
|
23
|
+
toggleScreenshare: (enabled) => elm.toggleScreenshare(enabled),
|
|
24
|
+
toggleChat: (enabled) => elm.toggleChat(enabled)
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
const events = [
|
|
28
|
+
"ready",
|
|
29
|
+
"grant_device_permission",
|
|
30
|
+
"deny_device_permission",
|
|
31
|
+
"precall_check_completed",
|
|
32
|
+
"precall_check_skipped",
|
|
33
|
+
"knock",
|
|
34
|
+
"cancel_knock",
|
|
35
|
+
"join",
|
|
36
|
+
"leave",
|
|
37
|
+
"meeting_end",
|
|
38
|
+
"participantupdate",
|
|
39
|
+
"participant_join",
|
|
40
|
+
"participant_leave",
|
|
41
|
+
"microphone_toggle",
|
|
42
|
+
"camera_toggle",
|
|
43
|
+
"screenshare_toggle",
|
|
44
|
+
"chat_toggle",
|
|
45
|
+
"people_toggle",
|
|
46
|
+
"pip_toggle",
|
|
47
|
+
"streaming_status_change",
|
|
48
|
+
"recording_status_change",
|
|
49
|
+
"transcription_status_change",
|
|
50
|
+
"connection_status_change"
|
|
51
|
+
];
|
|
52
|
+
function handleEvent(e) {
|
|
53
|
+
if (onEvent) onEvent(e.type, e.detail);
|
|
54
|
+
}
|
|
55
|
+
events.forEach((ev) => elm.addEventListener(ev, handleEvent));
|
|
56
|
+
return () => {
|
|
57
|
+
events.forEach((ev) => elm.removeEventListener(ev, handleEvent));
|
|
58
|
+
};
|
|
59
|
+
}, [onEvent, onActions]);
|
|
60
|
+
return /* @__PURE__ */ jsx("div", { className: iframeClass, children: /* @__PURE__ */ jsx(
|
|
61
|
+
"whereby-embed",
|
|
62
|
+
{
|
|
63
|
+
ref: wherebyRef,
|
|
64
|
+
class: iframeClass,
|
|
65
|
+
room: src,
|
|
66
|
+
chat: "on",
|
|
67
|
+
screenshare: "on",
|
|
68
|
+
audio: "on",
|
|
69
|
+
video: "on",
|
|
70
|
+
allow: "camera; microphone; fullscreen"
|
|
71
|
+
}
|
|
72
|
+
) });
|
|
73
|
+
};
|
|
74
|
+
export {
|
|
75
|
+
Room,
|
|
76
|
+
Room as default
|
|
77
|
+
};
|
|
78
|
+
//# sourceMappingURL=room.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"room.js","sources":["../../src/where-by-room/room.jsx"],"sourcesContent":["import { useEffect, useRef } from 'react';\r\nimport '@whereby.com/browser-sdk/embed';\r\n\r\nexport const Room = ({ src, onEvent, onActions, iframeClass }) => {\r\n const wherebyRef = useRef(null);\r\n\r\n useEffect(() => {\r\n const elm = wherebyRef.current;\r\n if (!elm) return;\r\n\r\n if (onActions) {\r\n onActions({\r\n endMeeting: () => elm.endMeeting(),\r\n knock: () => elm.knock(),\r\n cancelKnock: () => elm.cancelKnock(),\r\n leaveRoom: () => elm.leaveRoom(),\r\n startRecording: () => elm.startRecording(),\r\n stopRecording: () => elm.stopRecording(),\r\n startStreaming: () => elm.startStreaming(),\r\n stopStreaming: () => elm.stopStreaming(),\r\n startLiveTranscription: () => elm.startLiveTranscription(),\r\n stopLiveTranscription: () => elm.stopLiveTranscription(),\r\n toggleCamera: (enabled) => elm.toggleCamera(enabled),\r\n toggleMicrophone: (enabled) => elm.toggleMicrophone(enabled),\r\n toggleScreenshare: (enabled) => elm.toggleScreenshare(enabled),\r\n toggleChat: (enabled) => elm.toggleChat(enabled),\r\n });\r\n }\r\n\r\n const events = [\r\n 'ready',\r\n 'grant_device_permission',\r\n 'deny_device_permission',\r\n 'precall_check_completed',\r\n 'precall_check_skipped',\r\n 'knock',\r\n 'cancel_knock',\r\n 'join',\r\n 'leave',\r\n 'meeting_end',\r\n 'participantupdate',\r\n 'participant_join',\r\n 'participant_leave',\r\n 'microphone_toggle',\r\n 'camera_toggle',\r\n 'screenshare_toggle',\r\n 'chat_toggle',\r\n 'people_toggle',\r\n 'pip_toggle',\r\n 'streaming_status_change',\r\n 'recording_status_change',\r\n 'transcription_status_change',\r\n 'connection_status_change',\r\n ];\r\n function handleEvent(e) {\r\n if (onEvent) onEvent(e.type, e.detail);\r\n }\r\n events.forEach((ev) => elm.addEventListener(ev, handleEvent));\r\n return () => {\r\n events.forEach((ev) => elm.removeEventListener(ev, handleEvent));\r\n };\r\n }, [onEvent, onActions]);\r\n\r\n return (\r\n <div className={iframeClass}>\r\n <whereby-embed\r\n ref={wherebyRef}\r\n class={iframeClass}\r\n room={src}\r\n chat=\"on\"\r\n screenshare=\"on\"\r\n audio=\"on\"\r\n video=\"on\"\r\n allow=\"camera; microphone; fullscreen\"\r\n />\r\n </div>\r\n );\r\n};\r\nexport default Room;\r\n"],"names":[],"mappings":";;;AAGO,MAAM,OAAO,CAAC,EAAE,KAAK,SAAS,WAAW,kBAAkB;AAChE,QAAM,aAAa,OAAO,IAAI;AAE9B,YAAU,MAAM;AACd,UAAM,MAAM,WAAW;AACvB,QAAI,CAAC,IAAK;AAEV,QAAI,WAAW;AACb,gBAAU;AAAA,QACR,YAAY,MAAM,IAAI,WAAA;AAAA,QACtB,OAAO,MAAM,IAAI,MAAA;AAAA,QACjB,aAAa,MAAM,IAAI,YAAA;AAAA,QACvB,WAAW,MAAM,IAAI,UAAA;AAAA,QACrB,gBAAgB,MAAM,IAAI,eAAA;AAAA,QAC1B,eAAe,MAAM,IAAI,cAAA;AAAA,QACzB,gBAAgB,MAAM,IAAI,eAAA;AAAA,QAC1B,eAAe,MAAM,IAAI,cAAA;AAAA,QACzB,wBAAwB,MAAM,IAAI,uBAAA;AAAA,QAClC,uBAAuB,MAAM,IAAI,sBAAA;AAAA,QACjC,cAAc,CAAC,YAAY,IAAI,aAAa,OAAO;AAAA,QACnD,kBAAkB,CAAC,YAAY,IAAI,iBAAiB,OAAO;AAAA,QAC3D,mBAAmB,CAAC,YAAY,IAAI,kBAAkB,OAAO;AAAA,QAC7D,YAAY,CAAC,YAAY,IAAI,WAAW,OAAO;AAAA,MAAA,CAChD;AAAA,IACH;AAEA,UAAM,SAAS;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAEF,aAAS,YAAY,GAAG;AACtB,UAAI,QAAS,SAAQ,EAAE,MAAM,EAAE,MAAM;AAAA,IACvC;AACA,WAAO,QAAQ,CAAC,OAAO,IAAI,iBAAiB,IAAI,WAAW,CAAC;AAC5D,WAAO,MAAM;AACX,aAAO,QAAQ,CAAC,OAAO,IAAI,oBAAoB,IAAI,WAAW,CAAC;AAAA,IACjE;AAAA,EACF,GAAG,CAAC,SAAS,SAAS,CAAC;AAEvB,SACE,oBAAC,OAAA,EAAI,WAAW,aACd,UAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,MAAK;AAAA,MACL,aAAY;AAAA,MACZ,OAAM;AAAA,MACN,OAAM;AAAA,MACN,OAAM;AAAA,IAAA;AAAA,EAAA,GAEV;AAEJ;"}
|