{"version":3,"sources":["Theme.js","components/ThemedButton.js","components/LoginForm.js","components/Activities/SendButton.js","components/Activities/State.js","components/Activities/Note/AutoResizeTextArea.js","components/Activities/Note/NoteActivity.js","utils/CSRFHelper.js","components/Activities/UploadFile/FileImage.js","components/Activities/UploadFile/FileIcon.js","components/Activities/UploadFile/DeleteIcon.js","components/Activities/UploadFile/SuccessIcon.js","components/Activities/UploadFile/UploadFileActivityUI.js","components/Activities/UploadFile/UploadFileActivity.js","utils/Fetch.js","components/Activities/Presenter/NavigationBar.js","components/Activities/Presenter/Icons.js","components/Activities/Presenter/Tools.js","components/Activities/Presenter/ToolFloatingButton.js","components/Activities/Presenter/ToolPalette.js","components/Activities/Presenter/ToolMenu.js","components/Activities/Presenter/DrawingSurface.js","utils/useSetTimeout.js","components/Activities/Presenter/ZoomPanPitchDraw.js","utils/ImageLoader.js","components/Activities/Presenter/DocumentPresenter.js","components/Activities/Presenter/DocumentDownloader.js","components/Errors/ErrorDisplayer.js","components/Activities/Presenter/PresenterActivity.js","components/Activities/Presenter/PresenterState.js","components/Activities/Vote/VoteActivity.js","components/ActivityRenderer.js","components/Activities/index.js","components/Logo.js","components/ConnectionState.js","components/ActivityManager.js","components/SessionState.js","components/Home.js","components/Errors/ErrorBoundary.js","components/Layout.js","components/Translator.js","App.js","registerServiceWorker.js","index.js"],"names":["defaultTheme","baseColor","darkColor","darkDarkColor","lightColor","mediumDarkColor","lightAccentColor","ThemeContext","React","createContext","ThemedButton","props","theme","useContext","style","className","content","buttonProps","themedStyle","backgroundColor","borderColor","color","classes","Button","type","LoginForm","t","useTranslate","useState","userName","setUserName","isValid","length","Form","Input","value","onChange","e","target","placeholder","aria-label","id","name","autoComplete","onClick","event","preventDefault","joinSessionAsync","disabled","SendButton","common","state","Spinner","size","undefined","progress","xmlns","version","width","height","fill","stroke","viewBox","d","AutoResizeTextArea","useEffect","autosize","innerAreaRef","current","destroy","ref","rows","newValue","unflatLines","replace","split","map","line","innerLines","rest","push","slice","lines","forEach","array","lengthDif","text","maxLines","join","setText","readOnly","NoteColors","h","s","l","hsla","alpha","NoteActivity","setState","textAreaRef","useRef","callHubAsync","colorSeed","cancelled","onError","error","console","Promise","r","setTimeout","then","focus","catch","a","outDuration","sendAsync","noteColor","Math","min","floor","stickedColor","max","stickedStyle","background","containerStyle","useMemo","borderRadius","animation","opacity","transform","getCSRFToken","cname","ca","decodeURIComponent","document","cookie","i","c","charAt","substring","indexOf","getCookie","FileImage","maxWidth","maxHeight","margin","FileIcon","icon","fileName","pop","DeleteIcon","maxSize","SuccessIcon","success","cx","cy","wrongFormatMessage","file","ext","getExtension","InputErrors","message","fileRejections","acceptedFiles","hasValidExtension","activityArgs","rejection","errors","log","code","allowedExtensions","toLowerCase","find","UploadFileActivityUI","args","ignoreFile","setIgnoreFile","uploadResult","setUploadResult","uploadProgress","setUploadProgress","useDropzone","accept","allowedMimeTypes","multiple","preventDropOnDocument","MAXSIZE_MO","onDrop","_","isDragActive","getRootProps","getInputProps","baseStyle","activeStyle","hasFile","task","sendFileAsync","promise","response","cancel","Row","input","limitFileNameChars","stopPropagation","UploadFileActivity","onUploadProgress","formData","FormData","append","url","options","xhr","XMLHttpRequest","ended","res","rej","end","removeEventListener","onLoad","abortReject","errorReject","reject","context","status","k","open","method","headers","setRequestHeader","addEventListener","upload","onProgress","onprogress","send","body","abort","fetchWithProgress","SessionId","sessionId","UserId","userId","RequestVerificationToken","round","loaded","total","NavigationBar","currentPageIndex","changePage","pageCount","PencilIcon","isSelected","display","objectFit","alt","zIndex","strokeWidth","EraserIcon","PaletteIcon","HandIcon","StylusIcon","colors","sizes","types","defaultTool","Action","tool","setTool","previousTool","newTool","children","ActionColor","ToolFloatingButton","floatingButtonState","setFloatingButtonState","HandNotSelected","HandSelected","HandEraserSelected","StylusNotSelected","StylusSelected","StylusEraserSelected","setToolType","surfaceRef","onpointerover","pointerType","onPointerDown","paletteIsOpen","setPaletteIsOpen","isPrimary","PaletteButton","setStylusDetected","penId","stylus","pointerId","onpointerdown","onpointerup","onpointerout","ToolPalette","isEraser","setIsEraser","colorsArgs","colorGridCol","colorGridRow","useClickOutside","boxShadow","gridTemplateColumns","gridTemplateRows","repeat","elem","key","row","col","handleClickOutside","contains","ToolMenu","paletteColors","Array","setColorsArgs","setColorGridRow","setColorGridCol","constructColorArgs","colorTab","tab","index","j","newType","midPointBtw","p1","p2","x","y","canvasStyle","position","canvasTypes","DrawingSurface","componentWillUnmount","containerRef","canvasObserver","unobserve","isDrawable","isStylus","pointerID","penID","canDraw","undo","annotations","removeLines","redraw","ctx","drawing","clearRect","canvas","drawPoints","points","p","unNormalize","brushColor","brushRadius","scaleFactor","tmp","handleDrawStart","isPressing","getPointerPos","touches","lazy","update","both","handlePointerMove","handleDrawMove","handleDrawEnd","isDrawing","saveLine","handleCanvasResize","entries","observer","contentRect","setCanvasSize","interface","temp","loop","once","rect","getBoundingClientRect","clientX","clientY","changedTouches","left","top","isDisabled","isEnabled","pen","eraser","brush","normalize","nX","nY","nSize","removedLines","filter","some","nP","dX","abs","dY","mouseHasMoved","destination","lineJoin","lineCap","strokeStyle","lineWidth","moveTo","beginPath","len","midPoint","quadraticCurveTo","lineTo","addLines","uuidv4","drawImage","clear","penChanged","pointer","getPointerCoordinates","getBrushCoordinates","drawInterface","window","requestAnimationFrame","hideInterface","interfaceCleared","arc","PI","greatestSideLength","canvasSize","createRef","this","LazyBrush","radius","lazyRadius","devicePixelRatio","enabled","initialPoint","innerWidth","innerHeight","chainLength","ResizeObserver","observe","onpointermove","pressure","onpointercancel","onpointerleave","initX","initY","saveData","loadSaveData","prevProps","setRadius","prevLines","newLines","JSON","stringify","touchAction","getContext","PureComponent","defaultProps","penSizeRatio","loadTimeOffset","immediateLoading","useSetTimeout","delay","callback","isRunning","setIsRunning","timerId","clearTimeout","ZoomPanPitchDraw","containerSize","setContainerSize","imgSize","setImgSize","finalSize","setFinalSize","isTimerRunning","setIsTimerRunning","adaptContainerSize","clientWidth","clientHeight","source","imageSource","naturalWidth","naturalHeight","resolve","tmpImage","Image","onabort","onerror","onload","src","setError","onresize","setSurfaceHeight","imgRatio","pointerEvents","pan","ZoomPanPitchDrawContent","stylusDetected","drawingProps","limitToBounds","maxScale","paddingSize","wheel","step","scale","DocumentPresenter","pages","initialPageIndex","alertPageChangedAsync","setTitleClassName","setCurrentPageIndex","setAnnotations","surfaceHeight","ready","currentPage","prev","concat","Id","PageIndex","Color","Size","Width","Height","Points","X","Y","arrayBufferToBase64","buffer","binary","bytes","Uint8Array","byteLength","String","fromCharCode","btoa","DocumentDownloader","startPage","subscribeToEvent","setPages","abortController","AbortController","onReady","prevPages","page","fetch","sourceUrl","signal","result","ok","blob","reader","FileReader","onloadend","base64","readAsArrayBuffer","needsUpload","newPage","initPageAsync","clone","ErrorDisplayer","location","reload","PresenterActivity","titleRef","setFooterClassName","addFooterClassName","otherProps","presenterActivityArgs","setPresenterActivityArgs","presenters","currentPresenters","setCurrentPresenters","presenterState","setPresenterState","clearTitleClassName","classList","add","Presenter","presenterName","documentName","docName","trim","createTextNode","appendChild","setDocumentName","presenterId","initialState","VoteActivity","vote","setVote","items","setItems","displayImagesVote","choicesArray","fromEvent","itemList","getFileAsync","fileId","binaryData","urlImage","URL","createObjectURL","Blob","displayNumber","ConnectionId","connectionId","data","getElementsByClassName","querySelectorAll","box","remove","getElementById","selectedChoices","from","displayImages","elements","choices","ActivityRenderer","activity","projectName","innerProps","Activity","elementsArray","title","Logo","strokeOpacity","hexaChars","ActivityManager","reconnect","setReconnect","setUserId","setProjectName","setActivity","setActivityArgs","sessionExistance","setSessionExistance","sessionState","setSessionState","connectionState","setConnectionState","setTheme","setActivitySerializedArgs","serializedArgs","parse","footerRef","connectionRef","retrieveUserConnectInfo","storeUserConnectInfo","home","genericCallHubAsync","invoke","publicCallHubAsync","methodName","eventName","callBack","on","off","connection","signalR","withUrl","withAutomaticReconnect","build","infos","onreconnecting","onreconnected","onclose","start","toString","signalRConnect","stop","err","json","info","backgroundElement","backgroundImage","getSessionInfoAsync","useCallback","previousId","sessionConnectionInfo","isPaused","ReconnectButton","v","HomeButton","RenderContent","Provider","Home","useParams","history","useHistory","customSessionId","setCustomSessionId","pathname","marginBottom","ErrorBoundary","hasError","Component","Layout","footer","textAlign","Col","path","href","rel","allTranslations","en","fr","locale","navigator","language","userLanguage","substr","Translator","desiredLanguage","translations","documentElement","setAttribute","App","Boolean","hostname","match","baseUrl","getElementsByTagName","getAttribute","rootElement","ReactDOM","render","basename","serviceWorker","registration","unregister"],"mappings":"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","file":"static/js/main.0b06ee14.chunk.js","sourcesContent":["import React from 'react';\r\n\r\nexport const defaultTheme =\r\n{\r\n baseColor: '#09C0F6',\r\n darkColor: '#057394',\r\n darkDarkColor: '#033A4A',\r\n lightColor: '#9DE6FB',\r\n mediumDarkColor: '#044D62',\r\n lightAccentColor: '#5CDAFF'\r\n}\r\n\r\nexport const ThemeContext = React.createContext(defaultTheme);","import React, { useContext } from 'react';\r\nimport { Button } from 'reactstrap';\r\nimport { ThemeContext, defaultTheme } from '../Theme';\r\n\r\nexport function ThemedButton(props) {\r\n const theme = useContext(ThemeContext) || defaultTheme;\r\n\r\n const { style, className, content, ...buttonProps } = props;\r\n\r\n const themedStyle =\r\n {\r\n ...style,\r\n backgroundColor: theme.baseColor,\r\n borderColor: theme.darkColor,\r\n color: 'white'\r\n };\r\n\r\n let classes = \"themedButton\";\r\n if (className)\r\n classes += \" \" + className;\r\n\r\n return (\r\n \r\n );\r\n}","import React, { useState } from 'react';\r\nimport { Form, Input } from 'reactstrap';\r\nimport { ThemedButton } from './ThemedButton';\r\nimport { useTranslate } from 'react-translate';\r\n\r\nexport function LoginForm(props) {\r\n const t = useTranslate('Login');\r\n const [userName, setUserName] = useState('');\r\n\r\n const isValid = userName && userName.length > 2;\r\n\r\n function join(event) {\r\n event.preventDefault();\r\n\r\n if (isValid) {\r\n props.joinSessionAsync(userName);\r\n }\r\n }\r\n\r\n return (\r\n
\r\n setUserName(e.target.value)}\r\n placeholder={t('name.full')}\r\n aria-label={t('name.short')}\r\n id=\"username\"\r\n name=\"name\"\r\n autoComplete=\"name\"\r\n />\r\n \r\n \r\n );\r\n}","import React from 'react';\r\nimport { useTranslate } from 'react-translate';\r\nimport { Spinner } from 'reactstrap';\r\n\r\nimport * as State from './State';\r\nimport { ThemedButton } from '../ThemedButton';\r\n\r\nexport function SendButton(props) {\r\n const common = useTranslate('Common');\r\n \r\n return (\r\n \r\n {props.progress !== undefined && {props.progress} %}\r\n )\r\n : (<>\r\n {props.state === State.error ? common('retry') : common('send')}\r\n \r\n \r\n \r\n )\r\n }\r\n onClick={props.onClick}\r\n disabled={props.disabled || props.state === State.init || props.state === State.sending}\r\n />);\r\n}","export const init = 0;\r\nexport const ready = 1;\r\nexport const sending = 2;\r\nexport const error = 3;\r\n\r\n","import React, { useEffect } from \"react\";\r\nimport autosize from \"autosize\";\r\n\r\nimport './NoteActivity.css';\r\n\r\nexport function AutoResizeTextArea(props) {\r\n useEffect(() => {\r\n autosize(props.innerAreaRef.current);\r\n return () => {\r\n if (props.innerAreaRef.current)\r\n autosize.destroy(props.innerAreaRef.current);\r\n }\r\n });\r\n\r\n const estimatedLineSize = 19;\r\n const maxLines = 4;\r\n\r\n function handleChange(event) {\r\n let newValue = event.target.value;\r\n\r\n // Recreate (approximatively) the lines displayed on screen\r\n // to detect if we reached the lines limit \r\n const unflatLines = newValue\r\n .replace('\\r', '')\r\n .split('\\n')\r\n .map((line) => {\r\n if (!line) return [''];\r\n\r\n const innerLines = [];\r\n let rest = line;\r\n while (rest && rest.length > 0) {\r\n innerLines.push(rest.slice(0, estimatedLineSize));\r\n rest = rest.slice(estimatedLineSize);\r\n }\r\n return innerLines;\r\n })\r\n // .flat(); >> not suppoted by old edge !\r\n\r\n const lines = [];\r\n unflatLines.forEach(array => array.forEach(e => lines.push(e)));\r\n\r\n const lengthDif = newValue.length - props.text.length;\r\n if (lengthDif > 0 && lines.length > maxLines) {\r\n // constraint value if too much lines, but still allow char suppression\r\n\r\n if (lengthDif > 2) {\r\n // if number of new chars is important (ie. user pasted something)\r\n // limit char & lines number;\r\n\r\n newValue = newValue\r\n .slice(0, maxLines * estimatedLineSize)\r\n .split('\\n')\r\n .slice(0, maxLines)\r\n .join('\\n');\r\n } else {\r\n // prevent new char addition : restore old value\r\n newValue = props.text;\r\n }\r\n }\r\n\r\n props.setText(newValue);\r\n }\r\n\r\n return (\r\n \r\n );\r\n}","import React, { useState, useEffect, useRef, useMemo } from 'react';\r\nimport { SendButton } from '../SendButton';\r\nimport * as State from '../State';\r\nimport { useTranslate } from 'react-translate';\r\nimport { AutoResizeTextArea } from './AutoResizeTextArea';\r\n\r\nimport './NoteActivity.css';\r\n\r\nconst Yellow = { h: 50, s: 98, l: 57 } //#FDD924\r\nconst Orange = { h: 35, s: 100, l: 56 } //#FFA21E\r\nconst Green = { h: 85, s: 75, l: 51 } //#93E024\r\nconst Blue = { h: 180.5, s: 57, l: 58 } //#59D0D1\r\nconst Pink = { h: 349, s: 96, l: 78 } //#FD90A4\r\nconst NoteColors = [Yellow, Orange, Green, Blue, Pink];\r\n\r\nconst inDuration = 500;\r\nconst delayBetweenNotes = 200;\r\nconst outDuration = 700;\r\n\r\nfunction hsla(color, alpha) {\r\n return `hsla(${color.h}, ${color.s}%, ${color.l}%, ${alpha})`;\r\n}\r\n\r\nexport function NoteActivity(props) {\r\n const common = useTranslate('Common');\r\n const [text, setText] = useState('');\r\n const [state, setState] = useState(State.init);\r\n const textAreaRef = useRef(null);\r\n\r\n const { callHubAsync, colorSeed } = props;\r\n\r\n useEffect(() => {\r\n let cancelled = false;\r\n let onError = (error) => {\r\n if (!cancelled) {\r\n console.error(error);\r\n setState(State.error);\r\n }\r\n }\r\n\r\n if (state === State.init) {\r\n new Promise(r => setTimeout(r, inDuration))\r\n .then(() => {\r\n if (!cancelled) {\r\n setState(State.ready);\r\n textAreaRef.current.focus();\r\n }\r\n })\r\n .catch(onError);\r\n\r\n return () => cancelled = true;\r\n }\r\n if (state === State.sending) {\r\n async function sendAsync() {\r\n try {\r\n const result = await callHubAsync(\"SendNote\", text);\r\n if (result) {\r\n await new Promise(r => setTimeout(r, outDuration + delayBetweenNotes));\r\n\r\n if (cancelled) return;\r\n\r\n setText('');\r\n setState(State.init);\r\n }\r\n else {\r\n onError(\"failed to send note\");\r\n }\r\n }\r\n catch (error) {\r\n onError(error);\r\n }\r\n }\r\n\r\n sendAsync();\r\n\r\n return () => cancelled = true;\r\n\r\n } else {\r\n return undefined;\r\n }\r\n }, [state, callHubAsync, setText, setState, textAreaRef]) // 'text' intentionally omitted here\r\n\r\n\r\n function sendMessage(event) {\r\n event.preventDefault();\r\n setState(State.sending);\r\n }\r\n\r\n function giveFocus(event) {\r\n event.preventDefault();\r\n\r\n if (state === State.ready)\r\n textAreaRef.current.focus();\r\n }\r\n\r\n // Note Color\r\n const noteColor = NoteColors[Math.min(NoteColors.length - 1, Math.floor(colorSeed * NoteColors.length))];\r\n const stickedColor = {\r\n h: Math.max(0, noteColor.h - 4),\r\n s: noteColor.s,\r\n l: Math.max(0, noteColor.l - 6)\r\n };\r\n\r\n const stickedStyle = {\r\n background: `linear-gradient(${hsla(stickedColor, 1)} 0%, ${hsla(stickedColor, 0.75)} 20%, ${hsla(stickedColor, 0)} 25%)`\r\n };\r\n\r\n const containerStyle = useMemo(() => {\r\n const background = `${hsla(noteColor, 1)}`;\r\n\r\n if (state === State.init) {\r\n return {\r\n background,\r\n borderRadius: '5%',\r\n animation: `zoomIn ${inDuration}ms forwards`\r\n }\r\n } else if (state === State.sending) {\r\n return {\r\n background,\r\n borderRadius: '5%',\r\n animation: `backOutTop ${outDuration}ms forwards`\r\n }\r\n }\r\n\r\n // writing and error\r\n return {\r\n background,\r\n opacity: 1,\r\n borderRadius: '5%',\r\n transform: 'none'\r\n }\r\n }, [state, noteColor]);\r\n\r\n return (\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n\r\n \r\n\r\n

{/* just hidden to keep layout */}\r\n {common('error.retry')}\r\n

\r\n \r\n );\r\n}","function getCookie(cname) {\r\n var name = cname + \"=\";\r\n var decodedCookie = decodeURIComponent(document.cookie);\r\n var ca = decodedCookie.split(';');\r\n for (var i = 0; i < ca.length; i++) {\r\n var c = ca[i];\r\n while (c.charAt(0) === ' ') {\r\n c = c.substring(1);\r\n }\r\n if (c.indexOf(name) === 0) {\r\n return c.substring(name.length, c.length);\r\n }\r\n }\r\n return \"\";\r\n}\r\n\r\nexport function getCSRFToken() {\r\n return getCookie(\"CSRF-TOKEN\");\r\n}","import React from 'react';\r\n\r\nexport function FileImage(props) {\r\n return (\r\n \r\n \r\n );\r\n}","import React, { useMemo } from 'react';\r\n\r\n//const Unknown = \"M 68.054333,3.4179037e-6 14.163896,0.09751342 c -1.918829,0.0035 -3.472659,1.55969498 -3.473294,3.47852698 V 96.520641 c 1.8e-4,1.921217 1.557364,3.478749 3.478582,3.479358 h 71.658614 c 1.922396,0.0011 3.481417,-1.556961 3.481599,-3.479358 V 24.66573 c 3.78e-4,-0.818164 -0.287547,-1.610297 -0.813211,-2.237254 L 70.72576,1.2443374 C 70.063557,0.45433942 69.085162,-0.00138958 68.054333,3.4179037e-6 Z M 64.577262,6.9639724 64.556102,24.659646 c -0.0027,1.92445 1.55715,3.485674 3.481603,3.484611 H 82.349184 V 93.04204 H 17.64852 V 7.0492764 Z m 6.951134,6.0639116 6.842378,8.158451 h -6.851453 z\"\r\n\r\nexport function FileIcon(props) {\r\n\r\n const icon = useMemo(() => {\r\n const ext = props.fileName.split('.').pop();\r\n\r\n switch (ext) {\r\n case 'jpg':\r\n case 'jpeg':\r\n case 'png':\r\n return \"m 33 41 0 2 0 44 63 0 0 -46 -63 0 z m 4 4 39.203125 0 C 77.139139 53.305563 83.694437 59.860861 92 60.796875 L 92 83 l -4.986328 0 -14.5 -19.769531 -4.589844 7.652343 L 56.890625 56.171875 38.361328 82.642578 38.873047 83 37 83 37 45 Z M 80.199219 45 92 45 92 56.800781 C 85.862305 55.923473 81.076527 51.137695 80.199219 45 Z M 57.003906 62.986328 72.013672 83 42.994141 83 57.003906 62.986328 Z M 72.845703 70.449219 82.050781 83 l -5.892578 0 0.546875 -0.410156 -6.189453 -8.253906 2.330078 -3.886719 z\";\r\n\r\n case 'pdf':\r\n case 'pptx':\r\n return \"M 77.083985,55.083984 74.25586,57.914062 80.34375,64 74.257813,70.087891 77.085938,72.914062 86,63.998047 Z m -25.169923,0 L 43,63.998047 51.914062,72.914062 54.74414,70.085938 48.658203,64 54.74414,57.914062 Z M 33,41 V 87 H 96 V 41 Z m 4,4 H 92 V 83 H 37 Z\";\r\n\r\n //case 'mov':\r\n //case 'mp4':\r\n //case 'avi':\r\n // return \"m 33,41 v 2 44 H 96 V 41 Z m 4,4 H 92 V 83 H 37 Z m 18.125,5.306641 v 13.71289 L 55.123,77.732422 58.123,76 66.998,70.876953 78.873,64.019531 67,57.164062 Z m 4,6.929687 5.873047,3.392578 5.875,3.390625 -5.875,3.392578 -5.875,3.390625 0.002,-6.783203 v -6.783203 z\";\r\n\r\n default:\r\n return \"m 41.5,33 v 62 h 46 V 50.945312 L 69.5,33 Z m 4,4 h 20 v 18 h 18 v 36 h -38 z m 24,1.65625 L 81.806641,50.962891 69.5,51 Z\";\r\n }\r\n }, [props.fileName]);\r\n\r\n return (\r\n \r\n \r\n );\r\n}\r\n","import React from 'react';\r\n\r\nexport function DeleteIcon(props) {\r\n return (\r\n \r\n \r\n );\r\n}","import React from 'react';\r\n\r\nexport function SuccessIcon(props) {\r\n return (\r\n \r\n \r\n {props.success ?\r\n \r\n : \r\n }\r\n );\r\n}","import React, { useState, useMemo, useContext, useEffect } from 'react';\r\nimport { SendButton } from '../SendButton';\r\nimport { ThemeContext } from '../../../Theme';\r\nimport { Row, Form, Button } from 'reactstrap';\r\nimport { useTranslate } from 'react-translate';\r\nimport * as State from '../State';\r\nimport { useDropzone } from 'react-dropzone';\r\n\r\nimport { FileImage } from './FileImage';\r\nimport { FileIcon } from './FileIcon';\r\nimport { DeleteIcon } from './DeleteIcon';\r\nimport { SuccessIcon } from './SuccessIcon';\r\n\r\nimport './UploadFileActivity.css';\r\n\r\nconst MAXSIZE_MO = 200;\r\nconst MAXSIZE_BYTE = MAXSIZE_MO * 1048576;\r\n\r\nfunction wrongFormatMessage(file, t) {\r\n let ext = '';\r\n if (file && file.name)\r\n ext = `(*.${getExtension(file.name)})`;\r\n\r\n return t('file.wrongFormat') + ext;\r\n}\r\n\r\nfunction InputErrors(props) {\r\n let message;\r\n\r\n if (props.fileRejections.length === 0) {\r\n // if file is accepted by Input MimeTypes but has not a valid extension\r\n if (props.acceptedFiles[0] && !hasValidExtension(props.acceptedFiles[0], props.activityArgs))\r\n message = wrongFormatMessage(props.acceptedFiles[0], props.t);\r\n else\r\n return null;\r\n }\r\n else {\r\n const rejection = props.fileRejections[0]\r\n const error = rejection.errors[0];\r\n console.log(error.code);\r\n if (error.code === \"file-too-large\")\r\n message = `${props.t('file.tooLarge')} (Max ${MAXSIZE_MO} Mo)`;\r\n else if (error.code === \"too-many-files\")\r\n message = props.t('file.tooMany');\r\n else\r\n message = wrongFormatMessage(rejection.file, props.t);\r\n }\r\n\r\n return

{message}

;\r\n}\r\n\r\nfunction getInputMimeTypes(args) {\r\n if (args && args.allowedMimeTypes && args.allowedMimeTypes.length > 0)\r\n return args.allowedMimeTypes.join();\r\n else\r\n return '*.*';\r\n}\r\n\r\nfunction hasValidExtension(file, activityArgs) {\r\n if (file && file.name) {\r\n if (!activityArgs || !activityArgs.allowedExtensions) {\r\n return true;\r\n }\r\n else {\r\n const ext = (\".\" + getExtension(file.name)).toLowerCase();\r\n return !!(activityArgs.allowedExtensions.find(e => e === ext));\r\n }\r\n }\r\n\r\n return false;\r\n}\r\n\r\nfunction getExtension(fileName) {\r\n return fileName.split('.').pop();\r\n}\r\n\r\nfunction limitFileNameChars(input) {\r\n const max = 40;\r\n if (input.length <= max)\r\n return input;\r\n\r\n const ext = getExtension(input);\r\n return input.slice(0, max - 3 - ext.length) + \".. .\" + ext;\r\n}\r\n\r\n\r\nexport function UploadFileActivityUI(props) {\r\n const t = useTranslate('Upload');\r\n const common = useTranslate('Common');\r\n const theme = useContext(ThemeContext);\r\n const [state, setState] = useState(State.ready);\r\n const [ignoreFile, setIgnoreFile] = useState(false);\r\n const [uploadResult, setUploadResult] = useState(undefined);\r\n const [uploadProgress, setUploadProgress] = useState(0);\r\n\r\n const { acceptedFiles, fileRejections, isDragActive, getRootProps, getInputProps } = useDropzone(\r\n {\r\n accept: getInputMimeTypes(props.activityArgs),\r\n multiple: false,\r\n preventDropOnDocument: false,\r\n maxSize: MAXSIZE_BYTE,\r\n onDrop: _ => {\r\n setIgnoreFile(false);\r\n setUploadResult(undefined);\r\n },\r\n disabled: state === State.sending\r\n });\r\n \r\n const style = useMemo(() => {\r\n const baseStyle = { borderColor: theme.baseColor };\r\n const activeStyle = { borderColor: 'white', backgroundColor: theme.baseColor };\r\n return isDragActive ? activeStyle : baseStyle;\r\n }, [isDragActive, theme]);\r\n \r\n\r\n let file;\r\n // Check extension after Input's built-in check to deal with deltas between Extensions and MimeTypes\r\n // (MimeTypes are more permissive, but needed for Safari)\r\n if (acceptedFiles && hasValidExtension(acceptedFiles[0], props.activityArgs))\r\n file = acceptedFiles[0];\r\n\r\n const hasFile = !!file && !ignoreFile;\r\n\r\n useEffect(() => {\r\n if (state === State.sending) {\r\n let cancelled = false;\r\n\r\n const task = props.sendFileAsync(file, setUploadProgress);\r\n\r\n task.promise.then(e => {\r\n console.log(\"upload ended succesfully\");\r\n console.log(e);\r\n\r\n setIgnoreFile(true);\r\n setUploadResult({ success: true });\r\n setState(State.ready);\r\n }).catch(e => {\r\n if (cancelled)\r\n console.log(\"upload canceled\");\r\n else {\r\n setUploadResult({\r\n success: false,\r\n message: e.target.response\r\n });\r\n setState(State.error);\r\n }\r\n });\r\n\r\n return () => {\r\n cancelled = true;\r\n task.cancel();\r\n }\r\n }\r\n else {\r\n return undefined;\r\n }\r\n }, [state, file, props.sendFileAsync, setUploadProgress, setIgnoreFile, setUploadResult, setState]);\r\n\r\n function sendFile(event) {\r\n event.preventDefault();\r\n\r\n if (!hasFile)\r\n return;\r\n \r\n setUploadProgress(0);\r\n setState(State.sending);\r\n }\r\n \r\n function onDelete(event) {\r\n setIgnoreFile(true);\r\n event.stopPropagation();\r\n }\r\n\r\n return (<>\r\n
\r\n \r\n
\r\n \r\n {hasFile &&\r\n
\r\n \r\n

{limitFileNameChars(file.name)}

\r\n \r\n
\r\n }\r\n {!hasFile &&\r\n <>\r\n \r\n

{t('instructions')}

\r\n \r\n }\r\n
\r\n
\r\n\r\n {!ignoreFile &&\r\n \r\n }\r\n\r\n \r\n\r\n {uploadResult !== undefined &&\r\n <>\r\n \r\n \r\n

{uploadResult.success ? t('success') : common('error.retry')}

\r\n
\r\n {!uploadResult.success &&\r\n

{uploadResult.message}

\r\n }\r\n \r\n }\r\n \r\n );\r\n}","import React from 'react';\r\nimport { getCSRFToken } from '../../../utils/CSRFHelper';\r\nimport { fetchWithProgress } from '../../../utils/Fetch';\r\nimport { UploadFileActivityUI } from './UploadFileActivityUI';\r\n\r\n\r\nexport function UploadFileActivity(props) {\r\n\r\n function sendFileAsync(file, onUploadProgress) {\r\n const formData = new FormData();\r\n formData.append('file', file);\r\n\r\n return fetchWithProgress('api/files', {\r\n method: 'POST',\r\n body: formData,\r\n headers: {\r\n SessionId: props.sessionId,\r\n UserId: props.userId,\r\n RequestVerificationToken: getCSRFToken()\r\n },\r\n onProgress: e => {\r\n onUploadProgress(Math.round(100 * e.loaded / e.total));\r\n }\r\n });\r\n }\r\n\r\n return \r\n}","// returns a cancellable promise with progress feedback\r\nexport function fetchWithProgress(url, options = {}) {\r\n const xhr = new XMLHttpRequest();\r\n let ended = false;\r\n\r\n const promise = new Promise((res, rej) => {\r\n const end = () => {\r\n ended = true;\r\n xhr.removeEventListener('load', onLoad);\r\n xhr.removeEventListener('abort', abortReject);\r\n xhr.removeEventListener('error', errorReject);\r\n }\r\n\r\n const reject = (error, context) => {\r\n console.log(context);\r\n console.log(error);\r\n end();\r\n rej(error);\r\n }\r\n\r\n const abortReject = error => reject(error, 'on-abort');\r\n const errorReject = error => reject(error, 'on-error');\r\n const onLoad = event => {\r\n end();\r\n if (event.target.status >= 200 && event.target.status <= 204) {\r\n res(event);\r\n } else {\r\n console.log(\"status: \" + event.target.status);\r\n console.log(\"message: \" + event.target.response);\r\n rej(event);\r\n }\r\n }\r\n\r\n xhr.open(options.method, url, true);\r\n\r\n for (var k in options.headers || {})\r\n xhr.setRequestHeader(k, options.headers[k]);\r\n\r\n xhr.addEventListener('load', onLoad);\r\n xhr.addEventListener('abort', abortReject);\r\n xhr.addEventListener('error', errorReject);\r\n\r\n if (xhr.upload && options.onProgress)\r\n xhr.upload.onprogress = options.onProgress;\r\n\r\n xhr.send(options.body);\r\n });\r\n\r\n return {\r\n promise,\r\n cancel: () => {\r\n if (!ended)\r\n xhr.abort();\r\n }\r\n };\r\n}\r\n","import React, { useContext } from 'react';\r\nimport { AngleLeftIcon, AngleRightIcon } from 'react-line-awesome'\r\nimport { ThemeContext, defaultTheme } from '../../../Theme';\r\nimport \"./Presenter.css\"\r\n\r\nexport function NavigationBar(props) {\r\n const { currentPageIndex, changePage, pageCount } = props;\r\n const theme = useContext(ThemeContext) || defaultTheme;\r\n\r\n if (pageCount > 1) {\r\n return (
\r\n changePage(currentPageIndex - 1)}>\r\n \r\n \r\n = pageCount - 1) ? true : false}\r\n style={{ backgroundColor: theme.darkColor }}\r\n onClick={() => changePage(currentPageIndex + 1)}>\r\n \r\n \r\n
);\r\n }\r\n return <>;\r\n}","import React, { useContext } from 'react';\r\nimport { ThemeContext, defaultTheme } from '../../../Theme';\r\nimport './Tools.css';\r\n\r\nexport function PencilIcon(props) {\r\n\r\n const { isSelected, color } = props;\r\n const theme = useContext(ThemeContext) || defaultTheme;\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
);\r\n}\r\n\r\nexport function EraserIcon(props) {\r\n\r\n const { isSelected } = props;\r\n const theme = useContext(ThemeContext) || defaultTheme;\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
);\r\n}\r\n\r\nexport function PaletteIcon(props) {\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n
);\r\n}\r\n\r\nexport function HandIcon(props) {\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n
);}\r\n\r\nexport function StylusIcon(props) {\r\n return (\r\n
\r\n \r\n \r\n \r\n
);\r\n}","//utils for ToolBar and ToolPalette ans some highers components\r\n\r\nimport React from 'react';\r\nimport './Tools.css';\r\n\r\nexport const colors = {\r\n YELLOW: '#f4d000',\r\n WHITE: '#fcfcfc',\r\n TURQUOISE: '#00c5d5',\r\n ORANGE: '#f45b00',\r\n BLACK: '#000000',\r\n BLUE: '#0055d5',\r\n RED: '#ff0000',\r\n EXCENSE: '#e43b5c',\r\n GREEN: '#008000',\r\n}\r\n\r\nexport const sizes = {\r\n SMALL: 2,\r\n MEDIUM: 4,\r\n LARGE: 10\r\n}\r\n\r\nexport const types = {\r\n HAND: 'hand',\r\n PEN: 'pen',\r\n ERASER: 'eraser',\r\n TEXT: 'text'\r\n}\r\n\r\nexport const defaultTool = {\r\n color: colors.RED,\r\n size: sizes.SMALL,\r\n type: types.PEN\r\n}\r\n\r\nexport function Action(props) {\r\n const { tool, setTool, target, value, disabled } = props;\r\n\r\n function click() {\r\n setTool(previousTool => {\r\n var newTool = { ...previousTool };\r\n newTool[target] = value;\r\n return newTool;\r\n });\r\n }\r\n\r\n const isSelected = tool[target] === value;\r\n\r\n return (\r\n \r\n {props.children}\r\n \r\n );\r\n}\r\n\r\nexport function ActionColor(props) {\r\n\r\n const { tool, setTool, className, color, background, disabled } = props;\r\n\r\n function click() {\r\n setTool(previousTool => {\r\n var newTool = { ...previousTool };\r\n newTool[\"color\"] = color;\r\n return newTool;\r\n });\r\n }\r\n\r\n const isSelected = (tool[\"color\"] === color);\r\n\r\n return (\r\n
\r\n \r\n {isSelected\r\n ? (
\r\n
\r\n
)\r\n : (
)\r\n }\r\n \r\n
\r\n );\r\n}","import React, { useState, useContext, useEffect } from 'react';\r\nimport { PencilIcon, EraserIcon, PaletteIcon, HandIcon, StylusIcon } from './Icons'\r\nimport { ThemeContext, defaultTheme } from '../../../Theme';\r\nimport { types } from './Tools'\r\nimport './Tools.css';\r\n\r\nexport function ToolFloatingButton(props) {\r\n const [floatingButtonState, setFloatingButtonState] = useState(\"HandNotSelected\");\r\n\r\n switch (floatingButtonState) {\r\n case \"HandNotSelected\":\r\n return ()\r\n case \"HandSelected\":\r\n return ()\r\n case \"HandEraserSelected\":\r\n return ()\r\n case \"StylusNotSelected\":\r\n return ()\r\n case \"StylusSelected\":\r\n return ()\r\n case \"StylusEraserSelected\":\r\n return ()\r\n default:\r\n break;\r\n }\r\n}\r\n\r\nfunction HandNotSelected(props) {\r\n const { setToolType, setFloatingButtonState, surfaceRef } = props;\r\n const theme = useContext(ThemeContext) || defaultTheme;\r\n\r\n //When arriving in HandNotSelected, set the HAND tool\r\n useEffect(() => {\r\n setToolType(types.HAND);\r\n }, []);\r\n\r\n //deal with surface event\r\n useEffect(() => {\r\n if (surfaceRef && surfaceRef.current) {\r\n surfaceRef.current.onpointerover = (e) => {\r\n if (e.pointerType === \"pen\") {\r\n //Stylus detected, switch to StylusSelected state\r\n setFloatingButtonState(\"StylusSelected\");\r\n } \r\n }\r\n }\r\n }, [surfaceRef]);\r\n\r\n return (\r\n {\r\n if (e.pointerType === \"pen\") {\r\n //Stylus detected, switch to StylusSelected state\r\n setFloatingButtonState(\"StylusSelected\");\r\n } else {\r\n //Switch to HandSelected state\r\n setFloatingButtonState(\"HandSelected\");\r\n }\r\n }}>\r\n \r\n \r\n )\r\n}\r\n\r\nfunction HandSelected(props) {\r\n const { paletteIsOpen, setPaletteIsOpen, tool, setToolType, setFloatingButtonState, surfaceRef } = props;\r\n const theme = useContext(ThemeContext) || defaultTheme;\r\n\r\n //When arriving in HandSelected, set the PEN tool\r\n useEffect(() => {\r\n setToolType(types.PEN);\r\n }, []);\r\n\r\n //When tool is Eraser, switch to HandEraserSelected state\r\n useEffect(() => {\r\n if ((tool[\"type\"] === types.ERASER)) {\r\n setFloatingButtonState(\"HandEraserSelected\");\r\n }\r\n }, [tool]);\r\n\r\n //deal with surface event\r\n useEffect(() => {\r\n if (surfaceRef && surfaceRef.current) {\r\n surfaceRef.current.onpointerover = (e) => {\r\n if (e.pointerType === \"pen\") {\r\n //Stylus detected, switch to StylusSelected state\r\n setFloatingButtonState(\"StylusSelected\");\r\n } \r\n if (!e.isPrimary) {\r\n //More than one fingers detected (user want to zoom)\r\n setFloatingButtonState(\"HandNotSelected\");\r\n }\r\n }\r\n }\r\n\r\n }, [surfaceRef]);\r\n\r\n return (<>\r\n {\r\n if (e.pointerType === \"pen\") {\r\n //Stylus detected, switch to StylusSelected state\r\n setFloatingButtonState(\"StylusSelected\");\r\n } else {\r\n //Switch to HandNotSelected state\r\n setFloatingButtonState(\"HandNotSelected\");\r\n }\r\n }}>\r\n \r\n \r\n \r\n )\r\n}\r\n\r\nfunction HandEraserSelected(props) {\r\n const { paletteIsOpen, setPaletteIsOpen, tool, setFloatingButtonState, surfaceRef, setStylusDetected } = props;\r\n const theme = useContext(ThemeContext) || defaultTheme;\r\n\r\n //When tool is Pen, switch to HandSelected state\r\n useEffect(() => {\r\n if ((tool[\"type\"] === types.PEN)) {\r\n setFloatingButtonState(\"HandSelected\");\r\n }\r\n }, [tool]);\r\n\r\n //deal with surface event\r\n useEffect(() => {\r\n if (surfaceRef && surfaceRef.current) {\r\n surfaceRef.current.onpointerover = (e) => {\r\n if (e.pointerType === \"pen\") {\r\n //Stylus detected, switch to StylusEraserSelected state\r\n setFloatingButtonState(\"StylusEraserSelected\");\r\n } \r\n if (!e.isPrimary) {\r\n setFloatingButtonState(\"HandNotSelected\");\r\n }\r\n }\r\n }\r\n }, [surfaceRef]);\r\n\r\n return (<>\r\n {\r\n if (e.pointerType === \"pen\") {\r\n //Stylus detected, switch to StylusNotSelected state\r\n setFloatingButtonState(\"StylusNotSelected\");\r\n } else {\r\n //Switch to HandNotSelected state\r\n setFloatingButtonState(\"HandNotSelected\");\r\n }\r\n }}>\r\n \r\n \r\n \r\n )\r\n}\r\n\r\nfunction StylusNotSelected(props) {\r\n const { setToolType, setFloatingButtonState, surfaceRef, setStylusDetected } = props;\r\n const theme = useContext(ThemeContext) || defaultTheme;\r\n\r\n //When arriving in StylusNotSelected, set the HAND tool\r\n useEffect(() => {\r\n setToolType(types.HAND);\r\n setStylusDetected(true);\r\n }, []);\r\n\r\n //deal with surface event\r\n useEffect(() => {\r\n if (surfaceRef && surfaceRef.current) {\r\n surfaceRef.current.onpointerover = (e) => {\r\n if (e.pointerType === \"pen\") {\r\n //Stylus detected, switch to StylusSelected state\r\n setFloatingButtonState(\"StylusSelected\");\r\n } else {\r\n //no need to switch state\r\n }\r\n }\r\n }\r\n }, [surfaceRef]);\r\n\r\n return (\r\n {\r\n //Switch to StylusSelected state\r\n setFloatingButtonState(\"StylusSelected\");\r\n }}>\r\n \r\n \r\n )\r\n}\r\n\r\nfunction StylusSelected(props) {\r\n const { paletteIsOpen, setPaletteIsOpen, tool, setToolType, setFloatingButtonState, surfaceRef, setStylusDetected } = props;\r\n const theme = useContext(ThemeContext) || defaultTheme;\r\n var penId = -1;\r\n var stylus = false;\r\n\r\n //When arriving in StylusSelected, set the PEN tool\r\n useEffect(() => {\r\n setToolType(types.PEN);\r\n setStylusDetected(true);\r\n }, []);\r\n\r\n //When tool is Eraser, switch to StylusEraserSelected state\r\n useEffect(() => {\r\n if ((tool[\"type\"] === types.ERASER)) {\r\n setFloatingButtonState(\"StylusEraserSelected\");\r\n }\r\n }, [tool]);\r\n\r\n //deal with surface event\r\n useEffect(() => {\r\n if (surfaceRef && surfaceRef.current) {\r\n surfaceRef.current.onpointerover = (e) => {\r\n if (!paletteIsOpen && e.pointerType === \"pen\") {\r\n penId = e.pointerId;\r\n }\r\n }\r\n surfaceRef.current.onpointerdown = (e) => {\r\n if (!paletteIsOpen && e.pointerType !== \"pen\" && e.pointerId !== penId && !stylus) {\r\n setToolType(types.HAND);\r\n }\r\n if (!paletteIsOpen && (e.pointerType === \"pen\" || e.pointerId === penId)) {\r\n setToolType(types.PEN);\r\n stylus = true;\r\n }\r\n }\r\n surfaceRef.current.onpointerup = (e) => {\r\n if (!paletteIsOpen && (e.pointerType === \"pen\" || e.pointerId === penId)) {\r\n stylus = false;\r\n } \r\n }\r\n }\r\n }, [surfaceRef, paletteIsOpen]);\r\n\r\n return (<>\r\n {\r\n //switch to StylusNotSelected state\r\n setFloatingButtonState(\"StylusNotSelected\");\r\n }}>\r\n \r\n \r\n setToolType(types.PEN)} {...{ paletteIsOpen, setPaletteIsOpen }} />\r\n )\r\n}\r\n\r\nfunction StylusEraserSelected(props) {\r\n const { paletteIsOpen, setPaletteIsOpen, tool, setToolType, setFloatingButtonState, surfaceRef } = props;\r\n const theme = useContext(ThemeContext) || defaultTheme;\r\n var penId = -1;\r\n var stylus = true;\r\n\r\n //When tool is Pen, switch to StylusSelected state\r\n useEffect(() => {\r\n if ((tool[\"type\"] === types.PEN)) {\r\n setFloatingButtonState(\"StylusSelected\");\r\n }\r\n }, [tool]);\r\n\r\n //deal with surface event\r\n useEffect(() => {\r\n if (surfaceRef && surfaceRef.current) {\r\n surfaceRef.current.onpointerover = (e) => {\r\n if (!paletteIsOpen && e.pointerType === \"pen\") {\r\n penId = e.pointerId;\r\n }\r\n }\r\n surfaceRef.current.onpointerdown = (e) => {\r\n if (!paletteIsOpen && e.pointerType !== \"pen\" && !stylus) {\r\n setToolType(types.HAND);\r\n }\r\n if (!paletteIsOpen && (e.pointerType === \"pen\" || e.pointerId === penId)) {\r\n setToolType(types.ERASER);\r\n stylus = true;\r\n }\r\n }\r\n surfaceRef.current.onpointerout = (e) => {\r\n if (!paletteIsOpen && e.pointerType === \"pen\") {\r\n stylus = false;\r\n }\r\n }\r\n }\r\n }, [surfaceRef, paletteIsOpen]);\r\n\r\n return (<>\r\n {\r\n //Switch to StylusNotSelected state\r\n setFloatingButtonState(\"StylusNotSelected\");\r\n }}>\r\n \r\n \r\n setToolType(types.ERASER)} {...{ paletteIsOpen, setPaletteIsOpen }} />\r\n )\r\n}\r\n\r\nfunction PaletteButton(props) {\r\n const { onClick, paletteIsOpen, setPaletteIsOpen } = props;\r\n const theme = useContext(ThemeContext) || defaultTheme;\r\n\r\n return (\r\n {\r\n if (onClick) {\r\n onClick();\r\n }\r\n setPaletteIsOpen(true);\r\n }}>\r\n
\r\n \r\n
\r\n \r\n )\r\n}\r\n\r\n///////////old version///////////////////\r\n\r\nexport function ToolButton({ paletteIsOpen, setPaletteIsOpen, tool, setTool }) {\r\n\r\n const [pencilIsOpen, setPencilIsOpen] = useState(false);\r\n const theme = useContext(ThemeContext) || defaultTheme;\r\n\r\n useEffect(() => {\r\n if (!pencilIsOpen) {\r\n setTool(previousTool => {\r\n var newTool = { ...previousTool };\r\n newTool[\"type\"] = types.HAND;\r\n return newTool;\r\n });\r\n } else {\r\n setTool(previousTool => {\r\n var newTool = { ...previousTool };\r\n newTool[\"type\"] = types.PEN;\r\n return newTool;\r\n });\r\n }\r\n }, [pencilIsOpen]);\r\n\r\n return (\r\n
\r\n {\r\n setPencilIsOpen(!pencilIsOpen);\r\n setPaletteIsOpen(false);\r\n }}>\r\n {(tool[\"type\"] === types.ERASER && pencilIsOpen)\r\n ? \r\n : \r\n }\r\n\r\n \r\n {pencilIsOpen\r\n ? ( {\r\n setPaletteIsOpen(true);\r\n }}>\r\n
\r\n \r\n
\r\n \r\n ) : (<>)}\r\n\r\n
\r\n )\r\n}","import React, { useState, useContext, useEffect, useRef } from 'react';\r\nimport { TimesIcon } from 'react-line-awesome'\r\nimport { PencilIcon, EraserIcon } from './Icons'\r\nimport { useTranslate } from \"react-translate\";\r\nimport { ThemeContext, defaultTheme } from '../../../Theme';\r\nimport { types, sizes, colors, Action, ActionColor } from './Tools'\r\nimport './Tools.css';\r\n\r\nexport function ToolPalette(props) {\r\n\r\n const t = useTranslate(\"Presenter\");\r\n const theme = useContext(ThemeContext) || defaultTheme;\r\n const [isEraser, setIsEraser] = useState(false);\r\n const ref = useRef();\r\n const { tool, setTool, setPaletteIsOpen, colorsArgs, colorGridCol, colorGridRow } = props;\r\n\r\n const background = theme.darkColor;\r\n\r\n useClickOutside(ref, () => setPaletteIsOpen(false));\r\n\r\n useEffect(() => {\r\n if (tool[\"type\"] === types.ERASER) {\r\n setIsEraser(true);\r\n } else {\r\n setIsEraser(false);\r\n }\r\n }, [tool[\"type\"]]);\r\n\r\n return (\r\n
\r\n \r\n
\r\n {colorsArgs.map(elem => (\r\n \r\n ))}\r\n
\r\n
\r\n
\r\n \r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n )\r\n};\r\n\r\nconst useClickOutside = (ref, onClick) => {\r\n useEffect(() => {\r\n if (!ref?.current) {\r\n return;\r\n }\r\n const handleClickOutside = (e) => {\r\n if (onClick && !ref.current.contains(e.target)) {\r\n onClick(e);\r\n }\r\n };\r\n document.addEventListener('pointerdown', handleClickOutside);\r\n return () => {\r\n document.removeEventListener('pointerdown', handleClickOutside);\r\n };\r\n }, [ref, onClick]);\r\n};\r\n\r\n////////////////OLD VERSION///////////////////\r\nexport function ToolPaletteOld(props) {\r\n\r\n const t = useTranslate(\"Presenter\");\r\n const theme = useContext(ThemeContext) || defaultTheme;\r\n const [isEraser, setIsEraser] = useState(\"\");\r\n const ref = useRef();\r\n const { tool, setTool, setPaletteIsOpen } = props;\r\n const background = theme.darkColor;\r\n\r\n useClickOutside(ref, () => setPaletteIsOpen(false));\r\n\r\n useEffect(() => {\r\n if (tool[\"type\"] === types.ERASER) {\r\n setIsEraser(\"opacity\");\r\n } else {\r\n setIsEraser(\"\");\r\n }\r\n }, [tool[\"type\"]]);\r\n\r\n return (\r\n
\r\n \r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n \r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n )\r\n};","import React, { useState, useEffect } from 'react';\r\nimport { ToolFloatingButton } from './ToolFloatingButton';\r\nimport { ToolPalette } from './ToolPalette'\r\nimport './Tools.css';\r\n\r\nexport function ToolMenu(props) {\r\n\r\n const { tool, setTool, surfaceRef, setStylusDetected, paletteColors } = props;\r\n const [paletteIsOpen, setPaletteIsOpen] = useState(false);\r\n // array of elements : {color, row, col}\r\n const [colorsArgs, setColorsArgs] = useState(new Array());\r\n const [colorGridRow, setColorGridRow] = useState(3);\r\n const [colorGridCol, setColorGridCol] = useState(3);\r\n\r\n function constructColorArgs(colorTab) {\r\n var tab = new Array();\r\n var length = colorTab.length;\r\n var index = 0;\r\n var row = 3;\r\n var col = 3;\r\n\r\n if (length > 9) {\r\n col = 4;\r\n }\r\n if (length > 12) {\r\n row = 4;\r\n }\r\n for (var i = 1; i <= row; i++) {\r\n for (var j = 1; j <= col; j++) {\r\n if (index < length) {\r\n tab[index] = { color: colorTab[index], row: i, col: j };\r\n index++;\r\n }\r\n }\r\n }\r\n setColorGridCol(col);\r\n setColorGridRow(row);\r\n setColorsArgs(tab);\r\n }\r\n\r\n useEffect(() => {\r\n if (paletteColors) {\r\n constructColorArgs(paletteColors);\r\n } else {\r\n constructColorArgs([\"#f4d000\", \"#fcfcfc\", \"#00c5d5\", \"#f45b00\", \"#000000\", \"#0055d5\", \"#ff0000\", \"#e43b5c\", \"#008000\"]);\r\n }\r\n }, []);\r\n\r\n function setToolType(newType) {\r\n setTool(previousTool => {\r\n var newTool = { ...previousTool };\r\n newTool[\"type\"] = newType;\r\n return newTool;\r\n });\r\n }\r\n\r\n return (<>\r\n { paletteIsOpen\r\n ? (<>\r\n \r\n ) : (<>)\r\n }\r\n
\r\n \r\n
\r\n )\r\n}","// Forked from https://github.com/embiem/react-canvas-draw/\r\n\r\n\r\nimport React, { PureComponent } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { LazyBrush } from \"lazy-brush\";\r\n// import { Catenary } from \"catenary-curve\";\r\nimport { v4 as uuidv4 } from 'uuid';\r\n\r\nimport ResizeObserver from \"resize-observer-polyfill\";\r\n\r\nfunction midPointBtw(p1, p2) {\r\n return {\r\n x: p1.x + (p2.x - p1.x) / 2,\r\n y: p1.y + (p2.y - p1.y) / 2\r\n };\r\n}\r\n\r\nconst canvasStyle = {\r\n display: \"block\",\r\n position: \"absolute\"\r\n};\r\n\r\nconst canvasTypes = [\r\n {\r\n name: \"interface\",\r\n zIndex: 15\r\n },\r\n {\r\n name: \"drawing\",\r\n zIndex: 11\r\n },\r\n {\r\n name: \"temp\",\r\n zIndex: 12\r\n }\r\n];\r\n\r\nconst dimensionPropType = PropTypes.oneOfType([\r\n PropTypes.number,\r\n PropTypes.string\r\n]);\r\n\r\nconst sizePropType = PropTypes.shape({\r\n width: dimensionPropType,\r\n height: dimensionPropType\r\n});\r\n\r\nconst penPropType = PropTypes.shape({\r\n size: PropTypes.number,\r\n color: PropTypes.string,\r\n eraser: PropTypes.bool\r\n});\r\n\r\nexport class DrawingSurface extends PureComponent {\r\n static propTypes = {\r\n pen: penPropType,\r\n canvasSize: sizePropType,\r\n scaleFactor: PropTypes.number,\r\n hideInterface: PropTypes.bool,\r\n\r\n penSizeRatio: PropTypes.number,\r\n isStylus: PropTypes.bool,\r\n canDraw: PropTypes.bool,\r\n\r\n annotations: PropTypes.array.isRequired,\r\n addLines: PropTypes.func.isRequired,\r\n removeLines: PropTypes.func.isRequired,\r\n\r\n onChange: PropTypes.func,\r\n loadTimeOffset: PropTypes.number,\r\n lazyRadius: PropTypes.number,\r\n // catenaryColor: PropTypes.string,\r\n backgroundColor: PropTypes.string,\r\n disabled: PropTypes.bool,\r\n saveData: PropTypes.string,\r\n immediateLoading: PropTypes.bool\r\n };\r\n\r\n static defaultProps = {\r\n pen: {\r\n size: 5,\r\n color: '#F00',\r\n eraser: false\r\n },\r\n canvasSize: { width: 400, height: 400 },\r\n scaleFactor: 1,\r\n hideInterface: false,\r\n\r\n penSizeRatio: 1,\r\n isStylus: false,\r\n canDraw: false,\r\n\r\n annotations: [],\r\n addLines: () => { },\r\n removeLines: () => { },\r\n\r\n onChange: null,\r\n loadTimeOffset: 5,\r\n lazyRadius: 1,\r\n // catenaryColor: \"#0a0302\",\r\n backgroundColor: \"transparent\",\r\n disabled: false,\r\n saveData: \"\",\r\n immediateLoading: false,\r\n };\r\n\r\n constructor(props) {\r\n super(props);\r\n\r\n this.canvas = {};\r\n this.ctx = {};\r\n\r\n // this.catenary = new Catenary();\r\n\r\n this.points = [];\r\n this.penID = -1;\r\n\r\n this.mouseHasMoved = true;\r\n this.penChanged = true;\r\n this.isDrawing = false;\r\n this.isPressing = false;\r\n\r\n this.containerRef = React.createRef();\r\n }\r\n\r\n componentDidMount() {\r\n this.lazy = new LazyBrush({\r\n radius: this.props.lazyRadius * window.devicePixelRatio,\r\n enabled: true,\r\n initialPoint: {\r\n x: window.innerWidth / 2,\r\n y: window.innerHeight / 2\r\n }\r\n });\r\n this.chainLength = this.props.lazyRadius * window.devicePixelRatio;\r\n\r\n this.canvasObserver = new ResizeObserver((entries, observer) =>\r\n this.handleCanvasResize(entries, observer)\r\n );\r\n\r\n if (this.containerRef && this.containerRef.current) {\r\n this.canvasObserver.observe(this.containerRef.current);\r\n\r\n this.containerRef.current.onpointerover = (e) => {\r\n if (this.props.isStylus && e.pointerType === \"pen\") {\r\n this.penID = e.pointerID;\r\n }\r\n }\r\n\r\n this.containerRef.current.onpointerdown = (e) => {\r\n console.log(\"down : isPrimary ? \" + e.isPrimary + \" canDraw ? \" + this.props.canDraw +\r\n \" pointerType ? \" + e.pointerType);\r\n if (!e.isPrimary) {\r\n this.isDrawing = false;\r\n this.isPressing = false;\r\n this.saveLine();\r\n }\r\n if (this.isDrawable(e)) {\r\n console.log(\"start draw\");\r\n this.handleDrawStart(e);\r\n }\r\n };\r\n this.containerRef.current.onpointermove = (e) => {\r\n if (this.isDrawable(e)) {\r\n if (this.isPressing) {\r\n this.handleDrawMove(e);\r\n } else {\r\n if (e.pressure !== 0) {\r\n this.handleDrawStart(e);\r\n }\r\n }\r\n }\r\n };\r\n this.containerRef.current.onpointerup = (e) => {\r\n if (this.isDrawable(e)) {\r\n this.handleDrawEnd(e);\r\n }\r\n };\r\n this.containerRef.current.onpointerout = (e) => {\r\n if (this.isDrawable(e)) {\r\n this.handleDrawEnd(e);\r\n }\r\n };\r\n this.containerRef.current.onpointercancel = (e) => {\r\n if (this.isDrawable(e)) {\r\n this.handleDrawEnd(e);\r\n }\r\n };\r\n this.containerRef.current.onpointerleave = (e) => {\r\n if (this.isDrawable(e)) {\r\n this.handleDrawEnd(e);\r\n }\r\n };\r\n }\r\n\r\n this.loop();\r\n\r\n window.setTimeout(() => {\r\n const initX = window.innerWidth / 2;\r\n const initY = window.innerHeight / 2;\r\n this.lazy.update(\r\n { x: initX - this.chainLength / 4, y: initY },\r\n { both: true }\r\n );\r\n this.lazy.update(\r\n { x: initX + this.chainLength / 4, y: initY },\r\n { both: false }\r\n );\r\n this.mouseHasMoved = true;\r\n this.penChanged = true;\r\n this.clear();\r\n\r\n // Load saveData from prop if it exists\r\n if (this.props.saveData) {\r\n this.loadSaveData(this.props.saveData);\r\n }\r\n }, 100);\r\n }\r\n\r\n componentDidUpdate(prevProps) {\r\n if (prevProps.lazyRadius !== this.props.lazyRadius) {\r\n // Set new lazyRadius values\r\n this.chainLength = this.props.lazyRadius * window.devicePixelRatio;\r\n this.lazy.setRadius(this.props.lazyRadius * window.devicePixelRatio);\r\n }\r\n\r\n let prevLines = prevProps.annotations; \r\n let newLines = this.props.annotations;\r\n\r\n if ( prevLines.length !== newLines.length || // added or removed line(s)\r\n (prevLines.length === 0 || newLines.length === 0 || prevLines[0].id !== newLines[0].id)) // whole array changed\r\n {\r\n this.redraw();\r\n }\r\n\r\n if (JSON.stringify(prevProps.pen) !== JSON.stringify(this.props.pen)) {\r\n // Signal this.loop function that values changed\r\n this.penChanged = true;\r\n }\r\n\r\n if (prevProps.canDraw !== this.props.canDraw) {\r\n this.saveLine();\r\n }\r\n\r\n }\r\n\r\n componentWillUnmount = () => {\r\n if (this.containerRef && this.containerRef.current)\r\n this.canvasObserver.unobserve(this.containerRef.current);\r\n };\r\n\r\n isDrawable = (e) => {\r\n return (!this.props.isStylus || e.pointerType === \"pen\" || e.pointerID === this.penID) && this.props.canDraw && e.isPrimary;\r\n }\r\n\r\n undo = () => {\r\n if (this.props.annotations.length > 0) {\r\n this.props.removeLines(this.props.annotations[this.props.annotations.length - 1]);\r\n }\r\n };\r\n\r\n redraw = () => {\r\n this.ctx.drawing.clearRect(0.5, 0.5, this.canvas.drawing.width, this.canvas.drawing.height);\r\n\r\n this.props.annotations.forEach(line => {\r\n this.drawPoints({\r\n points: line.points.map(p => this.unNormalize(p)),\r\n brushColor: line.brushColor,\r\n brushRadius: (line.brushRadius * this.props.scaleFactor) / 2.0,\r\n tmp: false\r\n });\r\n });\r\n };\r\n\r\n handleDrawStart = e => {\r\n // e.preventDefault();\r\n // e.stopPropagation();\r\n\r\n // Start drawing\r\n this.isPressing = true;\r\n\r\n const { x, y } = this.getPointerPos(e);\r\n\r\n if (e.touches && e.touches.length > 0) {\r\n // on touch, set catenary position to touch pos\r\n this.lazy.update({ x, y }, { both: true });\r\n }\r\n // Reset points array\r\n this.points.length = 0;\r\n\r\n // Ensure the initial down position gets added to our line\r\n this.handlePointerMove(x, y);\r\n };\r\n\r\n handleDrawMove = e => {\r\n // e.preventDefault();\r\n // e.stopPropagation();\r\n\r\n const { x, y } = this.getPointerPos(e);\r\n this.handlePointerMove(x, y);\r\n };\r\n\r\n handleDrawEnd = e => {\r\n // e.preventDefault();\r\n // e.stopPropagation();\r\n\r\n // Draw to this end pos\r\n this.handleDrawMove(e);\r\n\r\n // Stop drawing & save the drawn line\r\n this.isDrawing = false;\r\n this.isPressing = false;\r\n this.saveLine();\r\n };\r\n\r\n handleCanvasResize = (entries, observer) => {\r\n for (const entry of entries) {\r\n const { width, height } = entry.contentRect;\r\n this.setCanvasSize(this.canvas.interface, width, height);\r\n this.setCanvasSize(this.canvas.drawing, width, height);\r\n this.setCanvasSize(this.canvas.temp, width, height);\r\n\r\n this.loop({ once: true });\r\n }\r\n this.redraw();\r\n };\r\n\r\n setCanvasSize = (canvas, width, height) => {\r\n canvas.width = width;\r\n canvas.height = height;\r\n canvas.style.width = width;\r\n canvas.style.height = height;\r\n };\r\n\r\n getPointerPos = e => {\r\n const rect = this.canvas.interface.getBoundingClientRect();\r\n\r\n // use cursor pos as default\r\n let clientX = e.clientX;\r\n let clientY = e.clientY;\r\n\r\n // use first touch if available\r\n if (e.changedTouches && e.changedTouches.length > 0) {\r\n clientX = e.changedTouches[0].clientX;\r\n clientY = e.changedTouches[0].clientY;\r\n }\r\n\r\n // return mouse/touch position inside canvas\r\n return {\r\n x: (clientX - rect.left) / this.props.scaleFactor,\r\n y: (clientY - rect.top) / this.props.scaleFactor\r\n };\r\n };\r\n\r\n handlePointerMove = (x, y) => {\r\n if (this.props.disabled) return;\r\n\r\n this.lazy.update({ x, y });\r\n const isDisabled = !this.lazy.isEnabled();\r\n\r\n if (\r\n (this.isPressing && !this.isDrawing) ||\r\n (isDisabled && this.isPressing)\r\n ) {\r\n // Start drawing and add point\r\n this.isDrawing = true;\r\n\r\n if (!this.props.pen.eraser)\r\n this.points.push({ x: this.lazy.brush.x + 0.5, y: this.lazy.brush.y + 0.5 });\r\n }\r\n\r\n if (this.isDrawing) {\r\n if (this.props.pen.eraser) {\r\n const { x: nX, y: nY } = this.normalize({ x, y });\r\n const { x: nSize, y: _ } = this.normalize({ x: this.props.pen.size, y: 0 });\r\n\r\n var removedLines = this.props.annotations\r\n .filter(l => l.points.some(nP => {\r\n let dX = Math.abs(nP.x - nX);\r\n let dY = Math.abs(nP.y - nY);\r\n\r\n return dX < nSize && dY < nSize;\r\n }));\r\n\r\n if (removedLines.length > 0) {\r\n this.props.removeLines(removedLines);\r\n }\r\n\r\n } else {\r\n // Add new point\r\n this.points.push({ x: this.lazy.brush.x + 0.5, y: this.lazy.brush.y + 0.5 });\r\n\r\n // Draw current points\r\n this.drawPoints({\r\n points: this.points,\r\n brushColor: this.props.pen.color,\r\n brushRadius: this.props.pen.size\r\n });\r\n }\r\n }\r\n\r\n this.mouseHasMoved = true;\r\n };\r\n\r\n drawPoints = ({ points, brushColor, brushRadius, tmp = true }) => {\r\n const destination = tmp ?\r\n this.ctx.temp :\r\n this.ctx.drawing;\r\n\r\n destination.lineJoin = \"round\";\r\n destination.lineCap = \"round\";\r\n destination.strokeStyle = brushColor;\r\n\r\n if (tmp) {\r\n destination.clearRect(\r\n 0.5,\r\n 0.5,\r\n destination.canvas.width,\r\n destination.canvas.height\r\n );\r\n }\r\n\r\n destination.lineWidth = (brushRadius * 2.0) / this.props.scaleFactor;\r\n\r\n let p1 = points[0];\r\n let p2 = points[1];\r\n\r\n destination.moveTo(p2.x, p2.y);\r\n destination.beginPath();\r\n\r\n for (var i = 1, len = points.length; i < len; i++) {\r\n // we pick the point between pi+1 & pi+2 as the\r\n // end point and p1 as our control point\r\n var midPoint = midPointBtw(p1, p2);\r\n destination.quadraticCurveTo(p1.x, p1.y, midPoint.x, midPoint.y);\r\n p1 = points[i];\r\n p2 = points[i + 1];\r\n }\r\n // Draw last line as a straight line while\r\n // we wait for the next point to be able to calculate\r\n // the bezier control point\r\n destination.lineTo(p1.x, p1.y);\r\n destination.stroke();\r\n };\r\n\r\n saveLine = ({ brushColor, brushRadius } = {}) => {\r\n if (this.points.length < 3) return;\r\n\r\n const width = this.canvas.temp.width;\r\n const height = this.canvas.temp.height;\r\n // Save as new line\r\n this.props.addLines([{\r\n id: uuidv4(),\r\n points: this.points.map(p => this.normalize(p)),\r\n brushColor: brushColor || this.props.pen.color, \r\n brushRadius: brushRadius || (this.props.pen.size * 2 / this.props.scaleFactor), \r\n width: width,\r\n height: height\r\n }]);\r\n\r\n // Reset points array\r\n this.points.length = 0;\r\n\r\n // Copy the line to the drawing canvas\r\n this.ctx.drawing.drawImage(this.canvas.temp, 0.5, 0.5, width, height);\r\n\r\n // Clear the temporary line-drawing canvas\r\n this.ctx.temp.clearRect(0.5, 0.5, width, height);\r\n };\r\n\r\n clear = () => {\r\n this.props.removeLines(this.props.annotations);\r\n };\r\n\r\n loop = ({ once = false } = {}) => {\r\n if (this.mouseHasMoved || this.penChanged) {\r\n const pointer = this.lazy.getPointerCoordinates();\r\n const brush = this.lazy.getBrushCoordinates();\r\n\r\n this.drawInterface(this.ctx.interface, pointer, brush);\r\n this.mouseHasMoved = false;\r\n this.penChanged = false;\r\n }\r\n\r\n if (!once) {\r\n window.requestAnimationFrame(() => {\r\n this.loop();\r\n });\r\n }\r\n };\r\n\r\n\r\n drawInterface = (ctx, pointer, brush) => {\r\n if (this.props.hideInterface) {\r\n if (!this.interfaceCleared) {\r\n ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);\r\n this.interfaceCleared = true;\r\n }\r\n return;\r\n }\r\n\r\n this.interfaceCleared = false;\r\n\r\n ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);\r\n\r\n // Draw brush preview\r\n if (this.props.pen.eraser) {\r\n ctx.beginPath();\r\n ctx.lineWidth = 1;\r\n ctx.strokeStyle = \"white\";\r\n ctx.arc(brush.x, brush.y, (this.props.pen.size * 2) / this.props.scaleFactor, 0, Math.PI * 2, true);\r\n ctx.stroke();\r\n\r\n ctx.beginPath();\r\n ctx.lineWidth = 1;\r\n ctx.strokeStyle = \"black\";\r\n ctx.arc(brush.x, brush.y, ((this.props.pen.size + 2) * 2) / this.props.scaleFactor, 0, Math.PI * 2, true);\r\n ctx.stroke();\r\n\r\n } /* else {\r\n ctx.beginPath();\r\n ctx.fillStyle = this.props.pen.color;\r\n ctx.arc(brush.x, brush.y, (this.props.pen.size * 2) / this.props.scaleFactor, 0, Math.PI * 2, true);\r\n ctx.fill();\r\n } */\r\n\r\n // Draw mouse point (the one directly at the cursor)\r\n // ctx.beginPath();\r\n // ctx.fillStyle = this.props.catenaryColor;\r\n // ctx.arc(pointer.x, pointer.y, 4, 0, Math.PI * 2, true);\r\n // ctx.fill();\r\n\r\n // Draw catenary\r\n // if (this.lazy.isEnabled()) {\r\n // ctx.beginPath();\r\n // ctx.lineWidth = 2;\r\n // ctx.lineCap = \"round\";\r\n // ctx.setLineDash([2, 4]);\r\n // ctx.strokeStyle = this.props.catenaryColor;\r\n // this.catenary.drawToCanvas(\r\n // this.ctx.interface,\r\n // brush,\r\n // pointer,\r\n // this.chainLength\r\n // );\r\n // ctx.stroke();\r\n // }\r\n\r\n // Draw brush point (the one in the middle of the brush preview)\r\n // ctx.beginPath();\r\n // ctx.fillStyle = this.props.catenaryColor;\r\n // ctx.arc(brush.x, brush.y, 2, 0, Math.PI * 2, true);\r\n // ctx.fill();\r\n };\r\n\r\n\r\n // Transform screen position inside a [0, 1]x[0, 1] normalized value\r\n // The annotation zone is extended to a square so as to not deform cursor\r\n normalize = ({ x, y }) => {\r\n let greatestSideLength = Math.max(this.props.canvasSize.width, this.props.canvasSize.height);\r\n\r\n return {\r\n x: x / greatestSideLength,\r\n y: y / greatestSideLength\r\n };\r\n };\r\n\r\n unNormalize = ({ x, y }) => {\r\n let greatestSideLength = Math.max(this.props.canvasSize.width, this.props.canvasSize.height);\r\n\r\n return {\r\n x: x * greatestSideLength,\r\n y: y * greatestSideLength\r\n };\r\n };\r\n\r\n render() {\r\n return (\r\n \r\n {canvasTypes.map(({ name, zIndex }) => {\r\n return (\r\n {\r\n if (canvas) {\r\n this.canvas[name] = canvas;\r\n this.ctx[name] = canvas.getContext(\"2d\");\r\n }\r\n }}\r\n style={{ ...canvasStyle, zIndex }}\r\n />\r\n );\r\n })}\r\n
\r\n );\r\n }\r\n}","import React, { useState, useEffect } from 'react';\r\n\r\nexport function useSetTimeout(delay, callback = () => { }) {\r\n const [isRunning, setIsRunning] = useState(true)\r\n useEffect(() => {\r\n let timerId\r\n if (isRunning) {\r\n // returns a positive interger ID which identifies the timer\r\n timerId = setTimeout(() => {\r\n callback()\r\n setIsRunning(false)\r\n }, delay)\r\n }\r\n // clear the timer\r\n return () => clearTimeout(timerId)\r\n }, [delay, callback, isRunning])\r\n return [isRunning, setIsRunning]\r\n}","import React, { useRef, useState, useEffect } from 'react';\r\nimport { Spinner } from 'reactstrap';\r\nimport { DrawingSurface } from './DrawingSurface';\r\nimport { TransformWrapper, TransformComponent } from \"react-zoom-pan-pinch\";\r\nimport { preloadImageAsync } from '../../../utils/ImageLoader';\r\nimport { useTranslate } from \"react-translate\";\r\nimport { useSetTimeout } from \"../../../utils/useSetTimeout\"\r\nimport \"./Presenter.css\"\r\n\r\n\r\nexport function ZoomPanPitchDraw(props) {\r\n const t = useTranslate(\"Presenter\");\r\n const containerRef = useRef();\r\n const [containerSize, setContainerSize] = useState(undefined);\r\n const [imgSize, setImgSize] = useState(undefined);\r\n const [finalSize, setFinalSize] = useState(undefined);\r\n const [isTimerRunning, setIsTimerRunning] = useSetTimeout(5000);\r\n //const [scaleFactor, setScaleFactor] = useState(undefined);\r\n\r\n // We need to set manually image's initial size\r\n // So we retrieve image size and container size to compute desired one\r\n\r\n useEffect(() => {\r\n setIsTimerRunning(true);\r\n preloadImageAsync(\r\n props.imageSource,\r\n e => {\r\n var size = {\r\n width: e.target.naturalWidth || e.target.width,\r\n height: e.target.naturalHeight || e.target.height\r\n };\r\n setImgSize(size);\r\n }\r\n ).catch(error => {\r\n props.setError(t(\"error.imageLoading\"));\r\n });\r\n \r\n }, [props.imageSource]);\r\n\r\n\r\n useEffect(() => {\r\n if (!containerSize) {\r\n adaptContainerSize();\r\n }\r\n }, [containerRef.current, containerSize]);\r\n\r\n \r\n window.onresize = () => {\r\n props.setSurfaceHeight(window.innerHeight);\r\n adaptContainerSize();\r\n }\r\n\r\n\r\n useEffect(() => {\r\n if (containerSize && imgSize) {\r\n var imgRatio = imgSize.width / imgSize.height;\r\n var containerRatio = containerSize.width / containerSize.height;\r\n var width = 0;\r\n var height = 0;\r\n\r\n if (imgRatio > containerRatio) {\r\n width = containerSize.width;\r\n height = width / imgRatio;\r\n //setScaleFactor(imgSize.width / width);\r\n } else {\r\n height = containerSize.height;\r\n width = height * imgRatio;\r\n //setScaleFactor(imgSize.height / height);\r\n } \r\n setFinalSize({ width, height });\r\n setIsTimerRunning(false);\r\n }\r\n }, [containerSize, imgSize]);\r\n\r\n function adaptContainerSize() {\r\n if (containerRef.current) {\r\n var size = {\r\n width: containerRef.current.clientWidth,\r\n height: containerRef.current.clientHeight\r\n };\r\n setContainerSize(size);\r\n }\r\n }\r\n\r\n return (<>\r\n
\r\n {finalSize\r\n ? \r\n : (
\r\n {t(\"presentation.pageLoading\")}\r\n \r\n {!isTimerRunning ? {t(\"presentation.pageLoadingTooLong\")} : <>}\r\n
)}\r\n
\r\n );\r\n}\r\n\r\n\r\nfunction ZoomPanPitchDrawContent(props) {\r\n\r\n const { imageSource, imgSize, finalSize, containerSize, pan, stylusDetected, ...drawingProps } = props;\r\n\r\n return (\r\n {({ scale }) => (\r\n \r\n
\r\n \"\"\r\n\r\n
\r\n \r\n
\r\n
\r\n
\r\n )}\r\n );\r\n}","export function preloadImageAsync(source, onLoad) {\r\n return new Promise((resolve, reject) => {\r\n var tmpImage = new Image();\r\n tmpImage.onabort = e => reject(e);\r\n tmpImage.onerror = e => reject(e);\r\n tmpImage.onload = e => {\r\n if (onLoad)\r\n onLoad(e);\r\n resolve();\r\n }\r\n tmpImage.src = source;\r\n })\r\n}","import React, { useRef, useState, useEffect } from \"react\";\r\nimport { NavigationBar } from \"./NavigationBar\";\r\nimport { Spinner } from 'reactstrap';\r\nimport { ToolMenu } from \"./ToolMenu\";\r\nimport { types, defaultTool } from './Tools';\r\nimport { ZoomPanPitchDraw } from \"./ZoomPanPitchDraw\";\r\nimport { useTranslate } from \"react-translate\";\r\nimport \"./Presenter.css\"\r\n\r\nexport function DocumentPresenter(props) {\r\n const {\r\n pages,\r\n initialPageIndex,\r\n callHubAsync,\r\n alertPageChangedAsync,\r\n paletteColors,\r\n setTitleClassName,\r\n isTimerRunning,\r\n setError\r\n } = props;\r\n\r\n const t = useTranslate(\"Presenter\");\r\n const [currentPageIndex, setCurrentPageIndex] = useState(initialPageIndex);\r\n const [tool, setTool] = useState(defaultTool);\r\n const [annotations, setAnnotations] = useState([]);\r\n const [stylusDetected, setStylusDetected] = useState(false);\r\n const surfaceRef = useRef();\r\n const [surfaceHeight, setSurfaceHeight] = useState(window.innerHeight);\r\n\r\n function changePage(index) {\r\n setCurrentPageIndex(index);\r\n if (pages[index]) {\r\n setAnnotations(pages[index].annotations);\r\n }\r\n alertPageChangedAsync(index, 0);\r\n }\r\n\r\n function addLines(lines) {\r\n setAnnotations((prev) => {\r\n var newValue = prev.concat(lines);\r\n pages[currentPageIndex].annotations = newValue;\r\n\r\n callHubAsync(\r\n \"AddStrokes\",\r\n lines.map((l) => ({\r\n Id: l.id,\r\n PageIndex: currentPageIndex,\r\n Color: l.brushColor,\r\n Size: l.brushRadius,\r\n Width: l.width,\r\n Height: l.height,\r\n Points: l.points.map((p) => ({ X: p.x, Y: p.y })),\r\n }))\r\n );\r\n\r\n return newValue;\r\n });\r\n }\r\n\r\n function removeLines(lines) {\r\n setAnnotations((prev) => {\r\n var newValue = prev.filter((l) => !lines.some((r) => l.id === r.id));\r\n pages[currentPageIndex].annotations = newValue;\r\n\r\n callHubAsync(\r\n \"RemoveStrokes\",\r\n lines.map((l) => ({\r\n Id: l.id,\r\n PageIndex: currentPageIndex,\r\n }))\r\n );\r\n\r\n return newValue;\r\n });\r\n }\r\n\r\n if (pages && pages[initialPageIndex] && pages[initialPageIndex].ready) {\r\n let currentPage = pages[currentPageIndex];\r\n setTitleClassName('presenter-title');\r\n\r\n return (\r\n \r\n {currentPage && currentPage.ready\r\n ? (
\r\n \r\n
)\r\n : (
\r\n {t(\"presentation.pageLoading\")}\r\n \r\n {!isTimerRunning ? {t(\"presentation.pageLoadingTooLong\")} : <>}\r\n
)\r\n }\r\n \r\n
\r\n \r\n
\r\n\r\n
\r\n );\r\n } else {\r\n return (\r\n
\r\n

{t(\"presentation.started\")}

\r\n {t(\"presentation.pageLoading\")}\r\n \r\n {!isTimerRunning ? {t(\"presentation.pageLoadingTooLong\")} : <>}\r\n
\r\n );\r\n }\r\n}\r\n","import React, { useState, useEffect } from 'react';\r\nimport { DocumentPresenter } from './DocumentPresenter';\r\nimport { useTranslate } from \"react-translate\";\r\nimport { useSetTimeout } from \"../../../utils/useSetTimeout\"\r\nimport { AbortError } from '@microsoft/signalr';\r\n\r\nfunction arrayBufferToBase64(buffer) {\r\n var binary = '';\r\n var bytes = new Uint8Array(buffer);\r\n var len = bytes.byteLength;\r\n for (var i = 0; i < len; i++) {\r\n binary += String.fromCharCode(bytes[i]);\r\n }\r\n return window.btoa(binary);\r\n}\r\n\r\n\r\nexport function DocumentDownloader(props) {\r\n const {\r\n pageCount,\r\n startPage,\r\n subscribeToEvent,\r\n callHubAsync,\r\n paletteColors,\r\n setTitleClassName,\r\n setError\r\n } = props;\r\n const [pages, setPages] = useState(Array(pageCount));\r\n const [isTimerRunning, setIsTimerRunning] = useSetTimeout(30000);\r\n const abortController = new AbortController();\r\n const t = useTranslate(\"Presenter\");\r\n\r\n function onReady() {\r\n setPages(prevPages => {\r\n var clone = prevPages.map(p => p);\r\n return clone;\r\n }); // update props\r\n //setIsTimerRunning(false);\r\n }\r\n\r\n async function initPageAsync(page) {\r\n try {\r\n var result = await fetch(page.sourceUrl, { signal: abortController.signal });\r\n if (result && result.ok) {\r\n var blob = await result.blob();\r\n\r\n const reader = new FileReader();\r\n reader.onloadend = () => {\r\n var base64 = arrayBufferToBase64(reader.result);\r\n page.source = \"data:\"+ blob.type + \";base64, \" + base64;\r\n page.ready = true;\r\n onReady();\r\n };\r\n reader.onerror = () => {\r\n setError(t(\"error.pageLoading\"));\r\n };\r\n reader.onabort = () => {\r\n setError(t(\"error.pageLoading\"));\r\n };\r\n reader.readAsArrayBuffer(blob);\r\n } else {\r\n setError(t(\"error.pageLoading\"));\r\n }\r\n } catch (ex) {\r\n if (ex.name === \"AbortError\") {\r\n return;\r\n }\r\n setError(t(\"error.pageLoading\"));\r\n }\r\n \r\n }\r\n\r\n async function alertPageChangedAsync(index) {\r\n var needsUpload = pages[index] === undefined || !pages[index].ready;\r\n if (needsUpload) {\r\n setIsTimerRunning(true);\r\n }\r\n await callHubAsync(\r\n \"changePage\",\r\n index,\r\n needsUpload\r\n );\r\n }\r\n\r\n useEffect(() => {\r\n if (subscribeToEvent) {\r\n var eventName = \"pageUploadStarted\";\r\n\r\n var unsubscriber = subscribeToEvent(eventName, args => {\r\n const { id, index, size } = args;\r\n\r\n var newPage = {\r\n id,\r\n ready: false,\r\n sourceUrl: `api/Files/${id}`,\r\n annotations: []\r\n };\r\n\r\n initPageAsync(newPage);\r\n\r\n setPages(prevPages => {\r\n var clone = prevPages.map(p => p);\r\n clone[index] = newPage;\r\n return clone;\r\n });\r\n\r\n });\r\n\r\n return unsubscriber;\r\n }\r\n\r\n return undefined;\r\n }, [subscribeToEvent, pages]);\r\n\r\n useEffect(() => {\r\n return () => {\r\n setIsTimerRunning(false);\r\n abortController.abort();\r\n }\r\n }, []);\r\n\r\n\r\n return \r\n}\r\n","import React from 'react';\r\nimport { useTranslate } from \"react-translate\";\r\nimport { ExclamationTriangleIcon } from 'react-line-awesome'\r\n\r\nexport function ErrorDisplayer({ message }) {\r\n const t = useTranslate(\"Common\");\r\n\r\n setTimeout(() => {\r\n window.location.reload();\r\n }, 5000);\r\n\r\n return (\r\n <>\r\n \r\n

{message}

\r\n

{t(\"error.refresh\")}

\r\n \r\n );\r\n}","import React, { useState, useEffect } from \"react\";\r\nimport { DocumentDownloader } from \"./DocumentDownloader\";\r\nimport * as PresenterState from \"./PresenterState\";\r\nimport { useTranslate } from \"react-translate\";\r\nimport './Presenter.css'\r\nimport { ErrorDisplayer } from \"../../Errors/ErrorDisplayer\";\r\n\r\nexport function PresenterActivity(props) {\r\n const t = useTranslate(\"Presenter\");\r\n const { activityArgs, userId, subscribeToEvent, titleRef, setFooterClassName, addFooterClassName, ...otherProps } = props;\r\n const [presenterActivityArgs, setPresenterActivityArgs] = useState(undefined);\r\n const [currentPresenters, setCurrentPresenters] = useState(activityArgs.presenters);\r\n const [presenterState, setPresenterState] = useState(PresenterState.waiting);\r\n const [error, setError] = useState(null);\r\n\r\n function clearTitleClassName(){\r\n if (titleRef && titleRef.current) {\r\n titleRef.current.classList = \"\";\r\n }\r\n }\r\n\r\n function setTitleClassName(name) {\r\n if (titleRef && titleRef.current) {\r\n titleRef.current.classList.add(name);\r\n }\r\n }\r\n\r\n function setDocumentName() {\r\n if (titleRef && titleRef.current && presenterActivityArgs && presenterActivityArgs.documentName) {\r\n const docName = presenterActivityArgs.documentName.trim();\r\n if (docName != \"\") {\r\n const name = document.createTextNode(\" - \" + docName);\r\n titleRef.current.appendChild(name);\r\n } \r\n }\r\n }\r\n \r\n useEffect(() => {\r\n if (subscribeToEvent) {\r\n var eventName = \"presentationStart\";\r\n\r\n var unsubscriber = subscribeToEvent(eventName, (args) => {\r\n setPresenterActivityArgs(args);\r\n if (args.presenterId === userId) {\r\n setPresenterState(PresenterState.presenting);\r\n } else if (presenterState !== PresenterState.presenting) {\r\n setPresenterState(PresenterState.waiting);\r\n }\r\n });\r\n\r\n return unsubscriber;\r\n }\r\n return undefined;\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (subscribeToEvent) {\r\n var eventName = \"presentationStop\";\r\n\r\n var unsubscriber = subscribeToEvent(eventName, (args) => {\r\n setPresenterActivityArgs(args);\r\n if (args.presenterId === userId) {\r\n setPresenterState(PresenterState.waiting);\r\n }\r\n });\r\n return unsubscriber;\r\n }\r\n return undefined;\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (subscribeToEvent) {\r\n var eventName = \"presentersChanged\";\r\n\r\n var unsubscriber = subscribeToEvent(eventName, (args) => {\r\n setCurrentPresenters(args.presenters);\r\n });\r\n return unsubscriber;\r\n }\r\n return undefined;\r\n }, []);\r\n\r\n function Presenter() {\r\n switch (presenterState) {\r\n case PresenterState.waiting:\r\n setFooterClassName('logoContainer');\r\n clearTitleClassName();\r\n if (!currentPresenters || currentPresenters.length === 0) {\r\n return

{t(\"instructions\")}

;\r\n } else if (currentPresenters.length === 1) {\r\n return

{currentPresenters[0].presenterName} {t(\"presentation.otherpresenter\")}

;\r\n } else {\r\n if (currentPresenters.length === 2) {\r\n return

{currentPresenters.map(p => p.presenterName).join(\" et \")} {t(\"presentation.otherpresenters\")}

;\r\n }\r\n else {\r\n return

{currentPresenters.slice(0, currentPresenters.length - 1).map(p => `${p.presenterName}`).join(\", \")} et {currentPresenters[currentPresenters.length - 1].presenterName} {t(\"presentation.otherpresenters\")}

;\r\n }\r\n }\r\n case PresenterState.presenting:\r\n if (error) {\r\n setFooterClassName('logoContainer');\r\n clearTitleClassName();\r\n return ;\r\n } else {\r\n addFooterClassName('not-display-if-mobile');\r\n setDocumentName();\r\n return ;\r\n }\r\n case PresenterState.ready:\r\n default:\r\n clearTitleClassName();\r\n setFooterClassName('logoContainer');\r\n return

{t(\"instructions\")}

; \r\n }\r\n }\r\n\r\n return (\r\n <>\r\n \r\n \r\n );\r\n}\r\n","export const ready = 0;\r\nexport const presenting = 1;\r\nexport const waiting = 2;","import React, { useState, useEffect } from 'react';\r\nimport * as State from '../State';\r\nimport { useTranslate } from 'react-translate';\r\nimport { getCSRFToken } from '../../../utils/CSRFHelper';\r\n\r\nimport './VoteActivity.css';\r\n\r\n\r\nconst inDuration = 500;\r\nconst delayBetweenVotes = 10;\r\nconst outDuration = 10;\r\nlet initialState = true\r\n\r\nexport function VoteActivity(props) {\r\n const common = useTranslate('Common');\r\n const [state, setState] = useState(State.init);\r\n const [vote, setVote] = useState('');\r\n let [items, setItems] = useState([])\r\n const { callHubAsync, subscribeToEvent } = props;\r\n\r\n useEffect(() => {\r\n let cancelled = false;\r\n let onError = (error) => {\r\n initialState = true\r\n if (!cancelled) {\r\n console.error(error);\r\n setState(State.error);\r\n }\r\n }\r\n if (state === State.init) {\r\n initialState = true\r\n new Promise(r => setTimeout(r, inDuration))\r\n .then(() => {\r\n if (!cancelled) {\r\n setState(State.ready);\r\n }\r\n })\r\n .catch(onError);\r\n\r\n return () => cancelled = true;\r\n }\r\n if (state === State.ready) {\r\n \r\n async function displayImages(choicesArray) {\r\n items = await displayImagesVote(choicesArray, false)\r\n setItems(items)\r\n }\r\n\r\n if (initialState) {\r\n displayImages(props.elements);\r\n initialState = false\r\n }\r\n \r\n if (subscribeToEvent) {\r\n var eventName1 = \"voteChoicesUpdated\";\r\n\r\n var unsubscriber = subscribeToEvent(eventName1, (args) => {\r\n async function displayImages(choicesArray) {\r\n items = await displayImagesVote(choicesArray, true)\r\n setItems(items)\r\n }\r\n displayImages(args.choices);\r\n })\r\n\r\n var eventName2 = \"resetVotes\";\r\n var unsubscriber2 = subscribeToEvent(eventName2, (args) => {\r\n let boxes = document.querySelectorAll('.clicked');\r\n boxes.forEach(box => {\r\n box.classList.remove('clicked');\r\n });\r\n })\r\n }\r\n \r\n \r\n }\r\n if (state === State.sending) {\r\n async function sendAsync() {\r\n try {\r\n const result = await callHubAsync(\"SendVote\", vote);\r\n if (result) {\r\n await new Promise(r => setTimeout(r, outDuration + delayBetweenVotes));\r\n\r\n if (cancelled) return;\r\n\r\n setVote(undefined);\r\n setState(State.ready);\r\n }\r\n else {\r\n onError(\"failed to send vote\");\r\n }\r\n }\r\n catch (error) {\r\n onError(error);\r\n }\r\n }\r\n\r\n sendAsync();\r\n\r\n return () => cancelled = true;\r\n\r\n } else {\r\n return undefined;\r\n }\r\n }, [state, callHubAsync, setVote, setState, setItems, subscribeToEvent])\r\n\r\n async function displayImagesVote(choicesArray, fromEvent) {\r\n \r\n let itemList = []\r\n \r\n for (const [index, value] of choicesArray.entries()) {\r\n //requete pour get le fichier ?\r\n let file = null\r\n if (fromEvent) {\r\n file = await getFileAsync(value.fileId);\r\n } else {\r\n file = await getFileAsync(value.value);\r\n }\r\n if (file != null) {\r\n var binaryData = [];\r\n if (value.key === undefined) {\r\n binaryData.push(file);\r\n let urlImage = window.URL.createObjectURL(new Blob(binaryData, { type: \"image/png\" }))\r\n itemList.push(\r\n
displayNumber(value.id + \"_checkButton\")}>\r\n \"PossibleChoice\"\r\n \"PossibleChoice\"\r\n
\r\n )\r\n } else {\r\n binaryData.push(file);\r\n let urlImage = window.URL.createObjectURL(new Blob(binaryData, { type: \"image/png\" }))\r\n itemList.push(\r\n
displayNumber(value.key + \"_checkButton\")}>\r\n \"PossibleChoice\"\r\n \"PossibleChoice\"\r\n
\r\n )\r\n }\r\n \r\n }\r\n \r\n }\r\n setItems(itemList)\r\n \r\n return itemList;\r\n }\r\n\r\n async function getFileAsync(fileId) {\r\n return await fetch('api/upload/'+ fileId, {\r\n method: 'GET',\r\n body: null,\r\n headers: {\r\n SessionId: props.sessionId,\r\n ConnectionId: props.connectionId,\r\n UserId: props.userId,\r\n RequestVerificationToken: getCSRFToken()\r\n }\r\n }).then((response) => response.blob())\r\n .then(data => {\r\n return data;\r\n })\r\n }\r\n\r\n function displayNumber(id) {\r\n //rajouter requete http + lien avec le services\r\n if (document.getElementsByClassName(\"clicked\").length === 1 && document.getElementsByClassName(\"clicked\")[0].id === id) {\r\n let boxes = document.querySelectorAll('.clicked');\r\n boxes.forEach(box => {\r\n box.classList.remove('clicked');\r\n });\r\n } else {\r\n let boxes = document.querySelectorAll('.clicked');\r\n boxes.forEach(box => {\r\n box.classList.remove('clicked');\r\n });\r\n document.getElementById(id).classList.add(\"clicked\")\r\n }\r\n let selectedChoices = (Array.from(document.querySelectorAll('.clicked'))[0]?.id)?.replace(\"_checkButton\", '')\r\n setVote(selectedChoices)\r\n sendMessage(selectedChoices)\r\n }\r\n\r\n function sendMessage(event) {\r\n setVote(event)\r\n setState(State.sending);\r\n }\r\n\r\n return (\r\n
\r\n
\r\n {items}\r\n
\r\n\r\n

{/* just hidden to keep layout */}\r\n {common('error.retry')}\r\n

\r\n
\r\n );\r\n}\r\n\r\n ","import React, { useEffect, useRef} from 'react';\r\nimport { useTranslate } from 'react-translate';\r\nimport * as Activities from './Activities';\r\n\r\nexport function ActivityRenderer(props) {\r\n const t = useTranslate('ActivityManager');\r\n const { activity, projectName, setFooterClassName, addFooterClassName, ...innerProps } = props;\r\n const titleRef = useRef(null);\r\n\r\n useEffect(() => {\r\n document.title = \"Compositeur Digital UX - \" + projectName;\r\n }, [projectName]);\r\n\r\n function Activity() {\r\n switch (activity) {\r\n case Activities.Note:\r\n return ;\r\n case Activities.UploadFile:\r\n return ;\r\n case Activities.Presenter:\r\n return ;\r\n case Activities.Vote:\r\n let elementsArray = []\r\n for (let i = 0; i < props.activityArgs.choices.length; i++) {\r\n elementsArray.push({\r\n 'key': props.activityArgs.choices[i].id,\r\n 'value': props.activityArgs.choices[i].fileId\r\n })\r\n }\r\n return \r\n default:\r\n return

{t('session.noActivity')}

;\r\n }\r\n }\r\n\r\n return (<>\r\n

{props.projectName}

\r\n \r\n );\r\n \r\n}","export const Note = 'Note';\r\nexport const UploadFile = 'UploadFile';\r\nexport const Presenter = 'Presenter';\r\nexport const Vote = 'Vote';\r\n\r\nexport { NoteActivity } from './Note/NoteActivity';\r\nexport { UploadFileActivity } from './UploadFile/UploadFileActivity';\r\nexport { PresenterActivity } from './Presenter/PresenterActivity';\r\nexport { VoteActivity } from './Vote/VoteActivity';","import React from 'react';\r\n\r\nexport function Logo(props) {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n}","export const Error = 0;\r\nexport const Loading = 1;\r\nexport const Connected = 2;\r\nexport const Reconnecting = 3;\r\nexport const Disconnected = 4;","import React, { useState, useEffect, useRef, useCallback } from 'react';\r\nimport * as signalR from \"@microsoft/signalr\"\r\n\r\nimport { ThemeContext, defaultTheme } from '../Theme';\r\nimport { LoginForm } from './LoginForm';\r\nimport { Spinner } from 'reactstrap';\r\nimport { ThemedButton } from './ThemedButton';\r\nimport { useTranslate } from 'react-translate';\r\nimport { ActivityRenderer } from './ActivityRenderer';\r\nimport { Logo } from './Logo';\r\n\r\nimport * as State from './ConnectionState';\r\nimport * as SessionState from './SessionState';\r\nimport '../custom.css'\r\n\r\nconst hexaChars = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'];\r\n\r\n// returns a number between 0 and 1 depending on input string\r\nfunction getSeed(input) {\r\n return Math.max(0, hexaChars.indexOf(input.charAt(0)) / hexaChars.length);\r\n}\r\n\r\nexport function ActivityManager(props) {\r\n const common = useTranslate('Common');\r\n const t = useTranslate('ActivityManager');\r\n const [reconnect, setReconnect] = useState(false);\r\n const [userId, setUserId] = useState('');\r\n const [projectName, setProjectName] = useState('');\r\n const [activity, setActivity] = useState('');\r\n const [activityArgs, setActivityArgs] = useState(undefined);\r\n const [sessionExistance, setSessionExistance] = useState(undefined);\r\n const [sessionState, setSessionState] = useState(SessionState.CheckingSession);\r\n const [connectionState, setConnectionState] = useState(State.Loading);\r\n const [theme, setTheme] = useState(defaultTheme);\r\n const [elements, setElements] = useState('');\r\n const [voteChoice, setVoteChoice] = useState('');\r\n\r\n function setActivitySerializedArgs(serializedArgs) {\r\n setActivityArgs(!!serializedArgs ? JSON.parse(serializedArgs) : undefined);\r\n }\r\n\r\n function clearFooterClassName() {\r\n if (footerRef && footerRef.current) {\r\n footerRef.current.classList = \"\";\r\n }\r\n }\r\n\r\n function addFooterClassName(name) {\r\n if (footerRef && footerRef.current) {\r\n footerRef.current.classList.add(name);\r\n }\r\n }\r\n\r\n function setFooterClassName(name) {\r\n clearFooterClassName();\r\n addFooterClassName(name);\r\n }\r\n\r\n const connectionRef = useRef();\r\n\r\n const {\r\n sessionId,\r\n retrieveUserConnectInfo,\r\n storeUserConnectInfo,\r\n home,\r\n footerRef\r\n } = props;\r\n\r\n // initialize SignalR connection\r\n useEffect(() => {\r\n async function signalRConnect() {\r\n try {\r\n setConnectionState(State.Loading);\r\n\r\n const connection = new signalR.HubConnectionBuilder()\r\n .withUrl('/companionHub')\r\n .withAutomaticReconnect()\r\n .build();\r\n\r\n connection.on('startingActivity', infos => {\r\n setActivitySerializedArgs(infos.serializedArgs);\r\n setActivity(infos.activity);\r\n });\r\n connection.on('pauseSession', () => {\r\n setActivity(undefined);\r\n setSessionState(SessionState.SessionPaused);\r\n setFooterClassName(\"logoContainer\");\r\n });\r\n connection.on('restartSession', () => {\r\n setActivity(undefined);\r\n setSessionState(SessionState.LoggedIn);\r\n setFooterClassName(\"logoContainer\");\r\n });\r\n connection.on('stoppingActivity', () => {\r\n setActivity(undefined);\r\n setFooterClassName(\"logoContainer\");\r\n });\r\n connection.on('stoppingSession', () => {\r\n setSessionState(SessionState.SessionEnded);\r\n setFooterClassName(\"logoContainer\");\r\n });\r\n connection.onreconnecting(() => {\r\n setConnectionState(State.Reconnecting);\r\n });\r\n connection.onreconnected(() => {\r\n setConnectionState(State.Connected);\r\n });\r\n connection.onclose(() => {\r\n setConnectionState(State.Disconnected);\r\n });\r\n\r\n connectionRef.current = connection;\r\n await connectionRef.current.start();\r\n setConnectionState(State.Connected);\r\n } catch (err) {\r\n setConnectionState(State.Error);\r\n console.error(err.toString());\r\n }\r\n }\r\n\r\n signalRConnect();\r\n\r\n return () => {\r\n const connection = connectionRef?.current;\r\n if (connection) {\r\n connection.off('startingActivity');\r\n connection.off('stoppingActivity');\r\n connection.off('pauseSession');\r\n connection.off('restartSession');\r\n connection.off('stoppingSession');\r\n connection.stop()\r\n .then(() => setConnectionState(State.Disconnected))\r\n .catch(err => {\r\n setConnectionState(State.Error);\r\n console.error(err.toString());\r\n });\r\n }\r\n };\r\n },\r\n [reconnect]//, clearUserConnectInfo] // the function will be called at first render and each time the value of 'reconnect' is changed (no matter true or false !)\r\n );\r\n\r\n // check session existence && download its theme && background\r\n useEffect(() => {\r\n async function getSessionInfoAsync() {\r\n const result = await fetch(`api/session/${sessionId}/info`);\r\n const info = result && result.ok && await result.json();\r\n if (info) {\r\n setProjectName(info.name);\r\n setTheme(info.theme);\r\n setSessionExistance(true);\r\n\r\n document.body.style.background = `radial-gradient(circle at 80% 80%, ${info.theme.darkColor}, ${info.theme.darkDarkColor})`;\r\n\r\n const backgroundElement = document.getElementById('customBackground');\r\n backgroundElement.style.backgroundImage = `url(api/session/${sessionId}/background)`;\r\n backgroundElement.style.opacity = 1;\r\n } else {\r\n setSessionExistance(false);\r\n }\r\n }\r\n\r\n getSessionInfoAsync();\r\n\r\n }, [sessionId]);\r\n\r\n\r\n async function genericCallHubAsync(...args) {\r\n return await connectionRef.current.invoke(...args);\r\n }\r\n\r\n async function publicCallHubAsync(methodName, ...args) {\r\n return await genericCallHubAsync(methodName, sessionId, userId, ...args);\r\n }\r\n\r\n function subscribeToEvent(eventName, callBack) {\r\n connectionRef.current.on(eventName, callBack);\r\n return () => connectionRef.current.off(eventName);\r\n }\r\n\r\n\r\n const joinSessionAsync = useCallback(async (userName, previousId = undefined) => {\r\n try {\r\n const sessionConnectionInfo = previousId ?\r\n await genericCallHubAsync('RejoinSession', sessionId, userName, previousId)\r\n : await genericCallHubAsync('JoinSession', sessionId, userName);\r\n \r\n if (sessionConnectionInfo) {\r\n setUserId(sessionConnectionInfo.userId);\r\n setActivitySerializedArgs(sessionConnectionInfo.serializedArgs);\r\n setActivity(sessionConnectionInfo.activity);\r\n if (sessionConnectionInfo.isPaused) {\r\n setSessionState(SessionState.SessionPaused);\r\n }\r\n else {\r\n setSessionState(SessionState.LoggedIn);\r\n }\r\n\r\n // store userName to reuse it in case of page refresh\r\n storeUserConnectInfo(userName, sessionConnectionInfo.userId);\r\n } else {\r\n setSessionState(SessionState.LoginFailed);\r\n }\r\n } catch (err) {\r\n console.error(err.toString());\r\n setSessionState(SessionState.LoginFailed);\r\n }\r\n }, [storeUserConnectInfo, sessionId]);\r\n\r\n // auto reconnect with previous name in case of page refresh.\r\n // Needs that the two above USEEFFECTS are ended to apply correct sessionState (or join session if possible)\r\n useEffect(() => {\r\n try {\r\n if (connectionState === State.Connected && sessionExistance !== undefined) {\r\n\r\n if (!sessionExistance) {\r\n setSessionState(SessionState.UnkownSession);\r\n } else {\r\n const info = retrieveUserConnectInfo();\r\n if (info?.userName && info?.userId) {\r\n console.log(`reconnect user (${info.userId}:${info.userName})`);\r\n joinSessionAsync(info.userName, info.userId);\r\n } else {\r\n setSessionState(SessionState.NotLogged);\r\n }\r\n }\r\n }\r\n } catch (err) {\r\n console.error(err.toString());\r\n } \r\n }, [connectionState, sessionExistance, retrieveUserConnectInfo, joinSessionAsync]);\r\n\r\n\r\n function ReconnectButton() {\r\n return setReconnect(v => !v)} />;\r\n }\r\n\r\n function HomeButton() {\r\n\r\n return home()} />;\r\n }\r\n\r\n function RenderContent() {\r\n \r\n if (connectionState === State.Error) {\r\n return <>\r\n

{common('error')}

\r\n \r\n ;\r\n } else if (connectionState === State.Loading) {\r\n return ;\r\n } else if (connectionState === State.Connected) {\r\n switch (sessionState) {\r\n case SessionState.CheckingSession:\r\n return ;\r\n case SessionState.UnkownSession:\r\n return <>\r\n

{t('session.unknown')}

\r\n \r\n ;\r\n case SessionState.LoggedIn:\r\n return ();\r\n case SessionState.SessionEnded:\r\n return <>\r\n

{t('session.ended')}

\r\n \r\n ;\r\n case SessionState.SessionPaused:\r\n return <>\r\n

{t('session.paused')}

\r\n ;\r\n case SessionState.NotLogged:\r\n case SessionState.LoginFailed:\r\n default:\r\n return (<>\r\n \r\n

{t('session.joining')} {projectName}

\r\n \r\n {sessionState === SessionState.LoginFailed &&\r\n

{common('error.retry')}

\r\n }\r\n );\r\n }\r\n } else if (connectionState === State.Reconnecting) {\r\n return <>\r\n \r\n

{t('connection.reconnecting')}

\r\n ;\r\n } else if (connectionState === State.Disconnected) {\r\n return <>\r\n

{t('connection.disconnected')}

\r\n \r\n ;\r\n }\r\n }\r\n\r\n return (\r\n \r\n );\r\n}","export const CheckingSession = 0;\r\nexport const NotLogged = 1;\r\nexport const LoggedIn = 2;\r\nexport const LoginFailed = 3;\r\nexport const UnkownSession = 4;\r\nexport const SessionEnded = 5;\r\nexport const SessionPaused = 6;","import React, { useState, useCallback } from 'react';\r\nimport { useParams, useHistory } from 'react-router-dom';\r\nimport { ActivityManager } from './ActivityManager';\r\nimport { Form, Input } from 'reactstrap';\r\nimport { ThemedButton } from './ThemedButton';\r\nimport { useTranslate } from 'react-translate';\r\nimport { Logo } from './Logo';\r\n\r\nimport { version } from \"../../package.json\";\r\n\r\nexport function Home(props) {\r\n const t = useTranslate('Home');\r\n const { sessionId } = useParams();\r\n const history = useHistory();\r\n const [customSessionId, setCustomSessionId] = useState('');\r\n const { footerRef } = props;\r\n\r\n function submit(event) {\r\n event.preventDefault();\r\n\r\n if (customSessionId) {\r\n history.push(\"/\" + customSessionId);\r\n }\r\n }\r\n\r\n function home() {\r\n history.push(\"/\");\r\n }\r\n\r\n const retrieveUserConnectInfo = useCallback(() => history.location.state, []);\r\n const storeUserConnectInfo = useCallback((userName, userId) => history.replace(history.location.pathname, { userName, userId }), []);\r\n if (sessionId)\r\n return ;\r\n else {\r\n return (\r\n <>\r\n \r\n

{t('title')}

\r\n

{t('instructions.fullUrl')}
{t('instructions.type')}

\r\n
\r\n setCustomSessionId(e.target.value)}\r\n aria-label={t('sessionId')}\r\n placeholder={t('sessionId')}\r\n />\r\n \r\n \r\n

v{version}

\r\n \r\n );\r\n }\r\n}","import React from 'react';\r\nimport { ErrorDisplayer } from './ErrorDisplayer';\r\n\r\nexport class ErrorBoundary extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = { hasError: false };\r\n }\r\n\r\n componentDidCatch(error, info) {\r\n // Show a reply UI\r\n this.setState({ hasError: true });\r\n console.log(info);\r\n }\r\n\r\n render() {\r\n if (this.state.hasError) {\r\n // You can show any reply UI\r\n return (<>\r\n
\r\n \r\n
\r\n );\r\n }\r\n return this.props.children;\r\n }\r\n}","import React, { useRef } from 'react';\r\nimport { Route } from 'react-router';\r\nimport { Home } from './Home';\r\nimport { Container, Row, Col } from 'reactstrap';\r\nimport { ErrorBoundary } from './Errors/ErrorBoundary'\r\nimport { useTranslate } from \"react-translate\";\r\n\r\nexport function Layout(props) {\r\n const footer = useRef(null);\r\n const t = useTranslate(\"Common\");\r\n return (\r\n <>\r\n
\r\n
\r\n \r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n \r\n \"Compositeur\r\n \"Compositeur\r\n \r\n
\r\n
\r\n
\r\n \r\n );\r\n}\r\n","import React from 'react';\r\nimport { TranslatorProvider } from 'react-translate';\r\n\r\nimport en from '../translations/en.json';\r\nimport fr from '../translations/fr.json';\r\n\r\nconst allTranslations = [en, fr];\r\nconst locale = (navigator.language || navigator.userLanguage || 'en').substr(0, 2).toLowerCase(); // Chrome outputs 'fr-FR'\r\n\r\ndocument.documentElement.setAttribute('lang', locale);\r\n\r\nexport function Translator(props) {\r\n\r\n const auto = !props.language || props.language === 'auto';\r\n const desiredLanguage = auto ? locale : props.language;\r\n const translations = allTranslations.find(t => t.locale === desiredLanguage) ?? en;\r\n\r\n return (\r\n {props.children}\r\n );\r\n}","import React, { Component } from 'react';\r\nimport { Layout } from './components/Layout';\r\nimport { Translator } from './components/Translator';\r\n\r\nimport './custom.css';\r\n\r\nexport default class App extends Component {\r\n\r\n render () {\r\n return (\r\n \r\n \r\n \r\n );\r\n }\r\n}\r\n","// In production, we register a service worker to serve assets from local cache.\r\n\r\n// This lets the app load faster on subsequent visits in production, and gives\r\n// it offline capabilities. However, it also means that developers (and users)\r\n// will only see deployed updates on the \"N+1\" visit to a page, since previously\r\n// cached resources are updated in the background.\r\n\r\n// To learn more about the benefits of this model, read https://goo.gl/KwvDNy.\r\n// This link also includes instructions on opting out of this behavior.\r\n\r\nconst isLocalhost = Boolean(\r\n window.location.hostname === 'localhost' ||\r\n // [::1] is the IPv6 localhost address.\r\n window.location.hostname === '[::1]' ||\r\n // 127.0.0.1/8 is considered localhost for IPv4.\r\n window.location.hostname.match(\r\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\r\n )\r\n);\r\n\r\nexport default function register () {\r\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\r\n // The URL constructor is available in all browsers that support SW.\r\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location);\r\n if (publicUrl.origin !== window.location.origin) {\r\n // Our service worker won't work if PUBLIC_URL is on a different origin\r\n // from what our page is served on. This might happen if a CDN is used to\r\n // serve assets; see https://github.com/facebookincubator/create-react-app/issues/2374\r\n return;\r\n }\r\n\r\n window.addEventListener('load', () => {\r\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\r\n\r\n if (isLocalhost) {\r\n // This is running on localhost. Lets check if a service worker still exists or not.\r\n checkValidServiceWorker(swUrl);\r\n } else {\r\n // Is not local host. Just register service worker\r\n registerValidSW(swUrl);\r\n }\r\n });\r\n }\r\n}\r\n\r\nfunction registerValidSW (swUrl) {\r\n navigator.serviceWorker\r\n .register(swUrl)\r\n .then(registration => {\r\n registration.onupdatefound = () => {\r\n const installingWorker = registration.installing;\r\n installingWorker.onstatechange = () => {\r\n if (installingWorker.state === 'installed') {\r\n if (navigator.serviceWorker.controller) {\r\n // At this point, the old content will have been purged and\r\n // the fresh content will have been added to the cache.\r\n // It's the perfect time to display a \"New content is\r\n // available; please refresh.\" message in your web app.\r\n console.log('New content is available; please refresh.');\r\n } else {\r\n // At this point, everything has been precached.\r\n // It's the perfect time to display a\r\n // \"Content is cached for offline use.\" message.\r\n console.log('Content is cached for offline use.');\r\n }\r\n }\r\n };\r\n };\r\n })\r\n .catch(error => {\r\n console.error('Error during service worker registration:', error);\r\n });\r\n}\r\n\r\nfunction checkValidServiceWorker (swUrl) {\r\n // Check if the service worker can be found. If it can't reload the page.\r\n fetch(swUrl)\r\n .then(response => {\r\n // Ensure service worker exists, and that we really are getting a JS file.\r\n if (\r\n response.status === 404 ||\r\n response.headers.get('content-type').indexOf('javascript') === -1\r\n ) {\r\n // No service worker found. Probably a different app. Reload the page.\r\n navigator.serviceWorker.ready.then(registration => {\r\n registration.unregister().then(() => {\r\n window.location.reload();\r\n });\r\n });\r\n } else {\r\n // Service worker found. Proceed as normal.\r\n registerValidSW(swUrl);\r\n }\r\n })\r\n .catch(() => {\r\n console.log(\r\n 'No internet connection found. App is running in offline mode.'\r\n );\r\n });\r\n}\r\n\r\nexport function unregister () {\r\n if ('serviceWorker' in navigator) {\r\n navigator.serviceWorker.ready.then(registration => {\r\n registration.unregister();\r\n });\r\n }\r\n}\r\n","import 'bootstrap/dist/css/bootstrap.css';\r\nimport React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport { BrowserRouter } from 'react-router-dom';\r\nimport App from './App';\r\nimport * as sw from './registerServiceWorker';\r\n\r\nconst baseUrl = document.getElementsByTagName('base')[0].getAttribute('href');\r\nconst rootElement = document.getElementById('root');\r\n\r\nReactDOM.render(\r\n \r\n \r\n ,\r\n rootElement);\r\n\r\n// Disable service worker due to non-updated files after app update\r\n//sw.registerServiceWorker();\r\nsw.unregister();\r\n"],"sourceRoot":""}