Your IP : 216.73.217.87


Current Path : /hdd/hdd11/www/vlevski/enter/static/js/
Upload File :
Current File : /hdd/hdd11/www/vlevski/enter/static/js/main.cdeab582.chunk.js.map

{"version":3,"sources":["utils.js","components/Screens/Cloud/CloudContext.js","components/Modals/ConfirmDelete.js","components/Modals/CreateFolder.js","components/Modal/Modal.js","components/FileView/HoverIcons.js","components/FileView/FileView.js","components/FileExplorer/FileExplorer.js","components/FileUploader/FileUploader.js","components/FolderCreate/FolderCreate.js","components/TopMenu/TopMenu.js","components/Modals/Versions.js","components/Breadcrumbs/Breadcrumbs.js","components/Screens/Cloud/Cloud.js","components/Modals/Readmore.js","components/Screens/Login/Login.js","routes.js","components/Screens/ChangePassword/ChangePassword.js","App.js","serviceWorker.js","index.js","components/FileView/FileView.module.scss","components/Breadcrumbs/Breadcrumbs.module.scss","components/Screens/Login/Login.module.scss","components/Screens/ChangePassword/ChangePassword.module.scss","components/FileView/HoverIcons.module.scss"],"names":["isLogged","localStorage","getItem","httpRequest","url","a","async","method","body","isPrivate","axios","headers","data","JSON","stringify","res","response","status","logout","protect","component","invert","Redirect","to","removeItem","window","location","replace","CloudContext","React","createContext","withCloudContext","WrappedComponent","Consumer","context","props","Component","CenteredTitle","children","className","ConfirmDelete","deleteFn","dismiss","name","type","ModalHeader","tag","toggle","ModalFooter","Button","color","onClick","CreateFolder","saveFolder","useState","setName","onSave","useCallback","ModalBody","Row","Col","md","size","offset","sm","Input","onChange","e","target","value","isModalOpen","setIsModalOpen","modalComponent","modalProps","setModalProps","Element","modals","Modal","isOpen","HoverIcons","deleteAction","stopPropagation","styles","icons","icon","FileView","text","onDeleteAction","hover","setHover","fType","toLowerCase","iconType","fileColor","extension","substr","lastIndexOf","onMouseEnter","onMouseLeave","box","bottomHalf","sortFn","b","api","process","REACT_APP_API","currentPath","navigate","setModalComponent","fetchFs","fs","subItems","useMemo","split","reduce","acc","child","find","f","root","initDownload","file","path","token","downloadUrl","href","sort","map","i","xs","lg","xl","key","updateProgress","finishUpload","style","cursor","display","fd","FormData","files","append","fileName","cancelToken","cancelSource","CancelToken","source","post","onUploadProgress","progressEvent","progress","Math","round","loaded","total","then","NotificationManager","success","catch","err","isCancel","forbiddenSymbols","forbiddenNames","handleCreate","length","match","error","overflowX","fontSize","backgroundColor","preventDefault","reload","versions","setIsOpen","pathArr","slice","filter","v","crumb","active","join","setCurrentPath","setFs","Map","beingUploaded","setBeingUploaded","beingUploadedRef","useRef","tree","useEffect","callback","delay","savedCallback","current","id","setInterval","clearInterval","useInterval","set","remove","startsWith","newPath","Provider","Container","fluid","position","background","zIndex","bottom","right","width","entrySeq","cancel","Progress","left","readmore","identifier","setIdentifier","password","setPassword","handleSubmit","Headers","console","log","fetch","jwt","ok","setItem","container","src","alt","Readmore","Form","form","onSubmit","min","placeholder","disabled","exact","Cloud","Login","FileUploader","confirmPassword","setConfirmPassword","align","library","add","faUser","faLock","faFolder","faFile","faFolderPlus","faFileUpload","faSignOutAlt","faChevronCircleLeft","faCloudUploadAlt","faTrashAlt","faWindowClose","faFileImage","faFileWord","faFilePdf","faFilePowerpoint","faFileExcel","faFileCode","faFileVideo","faFileArchive","faFileAudio","faFileAlt","httpLink","HttpLink","uri","authLink","setContext","_","logoutLink","onError","networkError","statusCode","cache","InMemoryCache","App","ApolloClient","link","concat","renderRoutes","routes","Boolean","hostname","ReactDOM","render","document","getElementById","navigator","serviceWorker","ready","registration","unregister","module","exports"],"mappings":"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","file":"static/js/main.cdeab582.chunk.js","sourcesContent":["import React, {useRef, useEffect} from 'react';\nimport {Redirect} from 'react-router-dom';\nimport axios from 'axios';\n\nconst isLogged = () => !!localStorage.getItem('jwt');\n\nexport function useInterval(callback, delay) {\n  const savedCallback = useRef();\n\n  // Remember the latest callback.\n  useEffect(() => {\n    savedCallback.current = callback;\n  }, [callback]);\n\n  // Set up the interval.\n  useEffect(() => {\n    function tick() {\n      savedCallback.current();\n    }\n    if (delay !== null) {\n      let id = setInterval(tick, delay);\n      return () => clearInterval(id);\n    }\n  }, [delay]);\n}\n\nexport const httpRequest = async (url, method = 'GET', body, isPrivate = true) => {\n  try{\n    const res = await axios({\n      method,\n      url,\n      headers: {\n        ...(isPrivate && {'X-Session-ID': localStorage.getItem('jwt')}),\n        'Content-Type': 'application/json'\n      },\n      ...(!!body && {data: JSON.stringify(body)})\n    });\n    return res.data;\n  }catch(error){\n    if(error.response.status === 401){\n      logout();\n    }else{\n      throw error;\n    }\n  }\n\n}\n\nexport const protect = (component, invert = false) =>\n  invert\n    ? isLogged()\n      ? () => <Redirect to=\"/\" />\n      : component\n    : isLogged()\n    ? component\n    : () => <Redirect to=\"/login\" />;\n\nexport const logout = () => {\n  localStorage.removeItem('jwt');\n  window.location.replace('/login');\n}\n","import React, { Component } from 'react';\n\nexport const CloudContext = React.createContext({});\n\nexport const withCloudContext = WrappedComponent => {\n  return class extends Component {\n    render() {\n      return (\n        <CloudContext.Consumer>\n          {context => <WrappedComponent {...context} {...this.props} />}\n        </CloudContext.Consumer>\n      );\n    }\n  };\n};\n","import React from 'react';\nimport {ModalHeader, ModalFooter, Button} from 'reactstrap';\n\nconst CenteredTitle = ({children}) => <h5 className=\"w-100\">{children}</h5>\n\nconst ConfirmDelete = ({deleteFn, dismiss, name, type}) => {\n  return (\n    <>\n      <ModalHeader tag={CenteredTitle} className=\"text-center\" toggle={dismiss}>\n        {type === 'FILE' && (\n          <>\n            Сигурни ли сте, че искате да изтриете файла <br />\n            <span className=\"font-weight-bold\">{name}</span>?\n          </>\n        )}\n        {type === 'DIR' && (\n          <>\n            Сигурни ли сте, че искате да изтриете папката <br />\n            <span className=\"font-weight-bold\">{name}</span><br /> и всичко в нея?\n          </>\n        )}\n      </ModalHeader>\n      <ModalFooter>\n        <Button color=\"danger\" onClick={deleteFn}>\n          Да\n        </Button>\n        <Button color=\"primary\" onClick={dismiss}>\n          Нe\n        </Button>\n      </ModalFooter>\n    </>\n  );\n};\n\nexport default ConfirmDelete;\n","import React, {useState, useCallback} from 'react';\nimport {\n  Row,\n  Col,\n  ModalHeader,\n  ModalBody,\n  ModalFooter,\n  Input,\n  Button\n} from 'reactstrap';\n\nconst CenteredTitle = ({children}) => <h5 className=\"w-100\">{children}</h5>;\n\nconst CreateFolder = ({dismiss, saveFolder}) => {\n  const [name, setName] = useState('');\n  const onSave = useCallback(() => {\n    saveFolder(name)\n  }, [name]);\n  return (\n    <>\n      <ModalHeader tag={CenteredTitle} className=\"text-center\" toggle={dismiss}>\n        Моля, въведете име на папка:\n      </ModalHeader>\n      <ModalBody>\n        <Row>\n          <Col md={{size: 6, offset: 3}} sm=\"12\">\n            <Input onChange={e => setName(e.target.value)} value={name} />\n          </Col>\n        </Row>\n      </ModalBody>\n      <ModalFooter>\n        <Button onClick={onSave} className=\"my-0 mx-auto\" color=\"primary\">\n          Запази\n        </Button>\n      </ModalFooter>\n    </>\n  );\n};\n\nexport default CreateFolder;\n","import React, {useCallback} from 'react';\nimport {Modal} from 'reactstrap';\nimport {withCloudContext} from '../Screens/Cloud/CloudContext';\nimport * as modals from '../Modals';\n\nconst ModalRoot = ({\n  isModalOpen,\n  setIsModalOpen,\n  modalComponent,\n  modalProps,\n  setModalProps,\n}) => {\n  const dismiss = useCallback(() => {\n    setIsModalOpen(false);\n    setModalProps({});\n  }, []);\n\n  const Element = modals[modalComponent];\n  return (\n    <Modal size=\"xl\" isOpen={isModalOpen} toggle={dismiss}>\n      {!!Element && (\n        <Element\n          {...modalProps}\n          dismiss={dismiss}\n        />\n      )}\n    </Modal>\n  );\n};\n\nexport default withCloudContext(ModalRoot);\n","import React from 'react';\nimport {FontAwesomeIcon} from '@fortawesome/react-fontawesome';\nimport styles from './HoverIcons.module.scss';\n\nconst HoverIcons = ({deleteAction}) => {\n  const onClick = e => {\n    e.stopPropagation();\n    deleteAction();\n  };\n  return (\n    <div onClick={onClick} className={`position-absolute ${styles.icons}`}>\n      <FontAwesomeIcon icon=\"trash-alt\" size=\"2x\" className=\"text-danger mx-auto d-block\" />\n    </div>\n  );\n};\n\nexport default HoverIcons;","import React, { useState } from 'react';\nimport styles from './FileView.module.scss';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport HoverIcons from './HoverIcons';\n\n/*\ntry {\n\t\t    ${const genImage = async () => {\n\t\t\timageIcon = await imageThumbnail(text, imageOptions)}\n\t\t\t{imageIcon}\n\t\t}\n\t\t} catch (err) {\n\t\t\t<FontAwesomeIcon\n\t\t\t\t\t\ticon={iconType}\n\t\t\t\t\t\tsize=\"6x\"\n\t\t\t\t\t\tclassName={`mx-auto d-block ${fType === 'dir' ? 'folder' : fileColor}`}\n\t\t\t\t\t  />\n\t\t}\n\n*/\n\nconst FileView = ({ type, text, onDeleteAction, className, ...props }) => {\n  const [hover, setHover] = useState(false);\n  const fType = type.toLowerCase();\n  /*\n  const imageThumbnail = require('image-thumbnail');\n  let imageOptions = { width: 100, height: 100, responseType: 'base64' }\n  */\n  let iconType = '';\n  let fileColor = '';\n  let imageIcon = false;\n\n  if (fType === 'dir') {\n    iconType = 'folder'\n  } else {\n    let extension = text.substr(text.lastIndexOf('.') + 1)\n\textension = extension.toLowerCase()\n    switch (extension) {\n      case 'jpg': case 'jpeg': case 'bmp': case 'png': case 'gif': case 'tif': case 'tiff': case 'eps': case 'svg':\n        iconType = 'file-image'\n        fileColor = 'file-image'\n        break;\n      case 'docx': case 'doc': case 'rtf': case 'dot': case 'dotx': case 'odt':\n        iconType = 'file-word'\n        fileColor = 'file-word'\n        break;\n      case 'xlsx': case 'xls': case 'csv': case 'xlt': case 'xltx': case 'ods':\n        iconType = 'file-excel'\n        fileColor = 'file-excel'\n        break;\n      case 'pptx': case 'ppt': case 'ppsx': case 'pps': case 'odp':\n        iconType = 'file-powerpoint'\n        fileColor = 'file-powerpoint'\n        break;\n      case 'pdf':\n        iconType = 'file-pdf'\n        fileColor = 'file-pdf'\n        break;\n      case 'sql': case 'cs': case 'php': case 'py': case 'cpp': case 'js': case 'java': case 'htm': case 'html': case 'css': case 'scss':\n        iconType = 'file-code'\n        fileColor = 'file-code'\n        break;\n      case 'txt':\n        iconType = 'file-alt'\n        fileColor = 'file-alt'\n        break;\n      case 'zip': case 'rar': case '7z': case 'gzip': case 'gz': case 'rzip':\n        iconType = 'file-archive'\n        fileColor = 'file-archive'\n        break;\n      case 'mp3': case 'ac3': case 'aac': case 'aif': case 'aiff': case 'flc': case 'flac': case 'm4a': case 'ogg': case 'ra': case 'wav': case 'wma': case 'opus':\n        iconType = 'file-audio'\n        fileColor = 'file-audio'\n        break;\n      case 'avi': case 'mp4': case 'mpg': case 'mpeg': case 'm4v': case 'mkv': case 'ts': case 'wmv': case 'webm': case 'flv': case 'f4v': case 'mov': case 'qt': case 'mts': case 'm2ts': case 'asf': case 'rv': case '3gp': case 'ogv':\n        iconType = 'file-video'\n        fileColor = 'file-video'\n        break;\n      default:\n        iconType = 'file'\n        fileColor = 'file-other'\n        break;\n    }\n  }\n  return (\n    <>\n      <div\n        {...props}\n        onMouseEnter={() => setHover(true)}\n        onMouseLeave={() => setHover(false)}\n        className={`rounded position-relative pt-2 ${styles.box} ${\n          !!className ? className : ''\n          }`}>\n        {hover && <HoverIcons deleteAction={onDeleteAction} />}\n\t    <FontAwesomeIcon\n\t\t\ticon={iconType}\n\t\t\tsize=\"6x\"\n\t\t\tclassName={`mx-auto d-block ${fType === 'dir' ? 'folder' : fileColor}`}\n\t\t/>\n        <div className={`${styles.bottomHalf} mt-2`}>\n          <p className={`text-center ${styles.text}`}>{text}</p>\n        </div>\n      </div>\n    </>\n  );\n};\n\nexport default FileView;","import React, {useMemo} from 'react';\nimport FileView from '../FileView/FileView';\nimport {Row, Col} from 'reactstrap';\n\nimport {httpRequest} from '../../utils';\nimport {withCloudContext} from '../Screens/Cloud/CloudContext';\n\nconst sortFn = (a, b) =>\n  a.type === 'DIR' && b.type === 'FILE' ? -1 : a.type === b.type ? 0 : 1;\n\nconst api = process.env.REACT_APP_API;\n\nconst FileExplorer = ({\n  currentPath,\n  navigate,\n  setIsModalOpen,\n  setModalProps,\n  setModalComponent,\n  fetchFs,\n  fs\n}) => {\n  const subItems = useMemo(\n    () => {\n      const [, ...path] = currentPath.split('/');\n      return path.reduce((acc, value) => {\n        const child = acc.find(f => f.name === value);\n        if (!!child && child.type === 'DIR') {\n          return child.children;\n        } else {\n          return acc;\n        }\n      }, fs.root);\n    },\n    [fs, currentPath]\n  );\n\n  const initDownload = async file => {\n    try {\n      const token = await httpRequest(api + '/files/cloud/getToken', 'post', {\n        path: currentPath + '/' + file\n      });\n      const downloadUrl = api + '/files/cloud/download?token=' + token;\n      window.location.href = downloadUrl;\n    } catch (error) {}\n  };\n\n  const deleteAction = (file, type) => {\n    const deleteFn = async () => {\n      try {\n        await httpRequest(api + '/files/cloud/file', 'delete', {\n          path: currentPath + '/' + file\n        });\n\n        setIsModalOpen(false);\n        fetchFs();\n      } catch (error) {}\n    };\n\n    setModalProps({deleteFn, name: file, type});\n    setModalComponent('ConfirmDelete');\n    setIsModalOpen(true);\n  };\n\n  return (\n    <Row>\n      {subItems.sort(sortFn).map((child, i) => (\n        <Col xs=\"12\" sm=\"6\" md=\"4\" lg=\"3\" xl=\"2\" key={i}>\n          <div className=\"mb-3 w-100\">\n            <FileView\n              onClick={() =>\n                (child.type === 'DIR' ? navigate : initDownload)(child.name)\n              }\n              className=\"my-0 mx-auto\"\n              onDeleteAction={() => deleteAction(child.name, child.type)}\n              type={child.type}\n              text={child.name}\n            />\n          </div>\n        </Col>\n      ))}\n    </Row>\n  );\n};\n\nexport default withCloudContext(FileExplorer);\n","import React from 'react';\nimport {Input} from 'reactstrap';\nimport axios, {CancelToken} from 'axios';\nimport {withCloudContext} from '../Screens/Cloud/CloudContext';\nimport {FontAwesomeIcon} from '@fortawesome/react-fontawesome';\nimport {NotificationContainer, NotificationManager} from 'react-notifications';\n\nconst FileUploader = ({currentPath, updateProgress, finishUpload}) => {\n  const makeHandleProgress = (fileName, cancelToken) => progressEvent => {\n    const progress = Math.round(\n      (progressEvent.loaded / progressEvent.total) * 100\n    );\n    updateProgress(fileName, progress, cancelToken);\n  };\n\n  const uploadFile = e => {\n    const fd = new FormData();\n    const file = e.target.files[0];\n    fd.append('path', currentPath);\n    fd.append('file', file);\n\n    updateProgress(file.name, 0);\n    const cancelSource = CancelToken.source();\n    axios\n      .post(process.env.REACT_APP_API + '/files/cloud/file', fd, {\n        cancelToken: cancelSource.token,\n        headers: {\n          'X-Session-ID': localStorage.getItem('jwt'),\n          'Content-Type': 'multipart/form-data'\n        },\n        onUploadProgress: makeHandleProgress(file.name, cancelSource)\n      })\n      .then(() => {\n        finishUpload(file.name);\n        NotificationManager.success('',`${file.name} е качен успешно!`, 3000);\n      }).catch(err => {\n        if(axios.isCancel(err)){\n          finishUpload(file.name)\n        }\n      });\n  };\n\n  return (\n    <label style={{cursor: 'pointer'}}>\n      <FontAwesomeIcon className=\"file\" icon=\"cloud-upload-alt\" size=\"7x\" />{' '}\n      <Input type=\"file\" style={{display: 'none'}} onChange={uploadFile} />\n      <NotificationContainer/>\n    </label>\n  );\n};\n\nexport default withCloudContext(FileUploader);\n","import React from 'react';\nimport {httpRequest} from '../../utils';\nimport {FontAwesomeIcon} from '@fortawesome/react-fontawesome';\nimport {withCloudContext} from '../Screens/Cloud/CloudContext';\n\nimport {NotificationContainer, NotificationManager} from 'react-notifications';\n\nconst forbiddenSymbols = /\\*|\\?|\\/|\\\\|:|>|<|\\||\"/gi;\nconst forbiddenNames = ['.', '..'];\n\nconst FolderCreate = ({\n  currentPath,\n  fetchFs,\n  setModalProps,\n  setModalComponent,\n  setIsModalOpen\n}) => {\n  const handleCreate = name => {\n    if (name.length > 0 && name[0] !== forbiddenNames[0] && (name[0] + name[1] !== '..') && !name.match(forbiddenSymbols)) {\n      (async () => {\n        await httpRequest(\n          process.env.REACT_APP_API + '/files/cloud/folder',\n          'POST',\n          {\n            path: currentPath,\n            name\n          }\n        );\n\n        fetchFs();\n        setIsModalOpen(false);\n        setModalProps({});\n        NotificationManager.success('',`Папката ${name} е създадена успешно!`, 3000);\n      })();\n    } else{\n      NotificationManager.error('Не можете да ползвате символите / \\\\ : * ? \" > < | . ..', 'Грешно име на папка', 3000)\n    }\n  };\n\n  const showModal = () => {\n    setModalComponent('CreateFolder');\n    setModalProps({saveFolder: handleCreate});\n    setIsModalOpen(true);\n  }\n  return (\n    <>\n      <span onClick={showModal} style={{cursor: 'pointer'}}>\n        <FontAwesomeIcon className=\"folder\" icon=\"folder-plus\" size=\"7x\" />\n      </span>\n\n      <NotificationContainer/>\n    </>\n  )\n};\n\nexport default withCloudContext(FolderCreate);\n","import React from 'react';\nimport { withCloudContext } from '../Screens/Cloud/CloudContext';\nimport FileUploader from '../FileUploader/FileUploader';\nimport FolderCreate from '../FolderCreate/FolderCreate';\nimport { Row, Col, Button } from 'reactstrap';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\n\nconst TopMenu = ({ navigate }) => {\n  const Exit = e => {\n    e.preventDefault();\n    localStorage.removeItem('jwt');\n    window.location.reload(true);\n  };\n\n  return (\n    <div className=\"w-100\" style={{ overflowX: 'hidden' }}>\n      <Row className=\"mb-4\">\n        <Button\n          onClick={() => navigate('..')}\n          className=\"col-2\"\n          color=\"primary\"\n          type=\"submit\">\n          <span style={{ fontSize: '1.2rem' }} className=\"d-none d-md-inline-block\">\n            <FontAwesomeIcon icon=\"chevron-circle-left\" />\n          </span>\n          <span style={{ fontSize: '2rem' }} className=\"d-inline-block d-md-none\">\n            <FontAwesomeIcon icon=\"chevron-circle-left\" />\n          </span>\n          <span\n            style={{ fontSize: '1.5rem' }}\n            className=\"d-none d-md-inline-block ml-2\">\n            Назад\n          </span>\n        </Button>\n        <span\n          className=\"col-8 text-center text-primary\"\n          style={{\n            fontSize: '3rem',\n            backgroundColor: '#dddddd',\n          }}>\n          Файлов мениджър\n        </span>\n        <Button onClick={Exit} className=\"col-2\" color=\"primary\" type=\"submit\">\n          <span\n            style={{ fontSize: '1.5rem' }}\n            className=\"d-none d-md-inline-block mr-2\">\n            Изход\n          </span>\n          <span style={{ fontSize: '1.2rem' }} className=\"d-none d-md-inline-block\">\n            <FontAwesomeIcon icon=\"sign-out-alt\" />\n          </span>\n          <span style={{ fontSize: '2rem' }} className=\"d-inline-block d-md-none\">\n            <FontAwesomeIcon icon=\"sign-out-alt\" />\n          </span>\n        </Button>\n      </Row>\n      <Row>\n        <Col\n          className=\"text-center\"\n          xs={{ size: 6, offset: 3 }}\n          lg={{ size: 4, offset: 4 }}>\n          <span className=\"mr-3\">\n            <FolderCreate />\n          </span>\n          <span className=\"ml-3\">\n            <FileUploader />\n          </span>\n        </Col>\n      </Row>\n      <hr />\n    </div>\n  );\n};\n\nexport default withCloudContext(TopMenu);\n","import React, { useState, useCallback } from 'react';\nimport {\n    Row,\n    Col,\n    Modal,\n    ModalHeader,\n    ModalBody,\n    ModalFooter,\n    Button\n} from 'reactstrap';\n\nconst CenteredTitle = ({ children }) => <h5 className=\"w-100\">{children}</h5>;\n\nconst versions = ({ isOpen, setIsOpen }) => {\n    return (\n        <Modal isOpen={isOpen} size='xl'>\n            <ModalHeader tag={CenteredTitle} className=\"text-center\" toggle={() => setIsOpen(false)}>\n                Версии на „My5“\n            </ModalHeader>\n            <ModalBody>\n                <Row>\n                    <Col md={{ size: 10, offset: 1 }} sm=\"12\">\n\t\t\t\t\t\t<h5>Версия 1.23</h5>\n                        <p>Добавени бяха характерни цветове за типовете файлове.</p>\n                        <h5>Версия 1.22</h5>\n                        <p>Добавени бяха икони за най-популярните файлови разширения.</p>\n                        <h5>Версия 1.21</h5>\n                        <p>Беше извършена финална оптимизация на кода. Създадена беше система за автоматично стартиране на node модула в случай на неочаквано прекъсване на работа му.</p>\n                        <h5>Версия 1.20</h5>\n                        <p>Беше оправена грешка в кода, която се получаваше при автоматично превеждане от Google Translate на сайта.</p>\n                        <h5>Версия 1.19</h5>\n                        <p>Добавена беше възможността да се прекъсва качването на файл. Създаден беше допълнителен бутон за целта, а малко текстово поле показваше процентното отчитане на качването. Беше разширена лентата на прогреса, за да се вижда по-ясно и при мобилни устройства. Посочените компоменти бяха преместени в долната дясна част на екрана.</p>\n                        <h5>Версия 1.18</h5>\n                        <p>Добавена беше информация за самия проект и същността му преди влизането в системата.</p>\n                        <h5>Версия 1.17</h5>\n                        <p>Беше добавен модален прозорец, който да извежда запитване преди изтриването на файлове или папки. Създаването на папки беше променено да става също с помощта на модалния прозорец.</p>\n                        <h5>Версия 1.16</h5>\n                        <p>Добавена беше възможност за сваляне на качените файлове.</p>\n                        <h5>Версия 1.15</h5>\n                        <p>Беше добавена възможност за изтриване на файловете или папките.</p>\n                        <h5>Версия 1.14</h5>\n                        <p>Добавиха се съобщения за всяко едно от действията с помощта на NotifyJS.</p>\n                        <h5>Версия 1.13</h5>\n                        <p>Добавиха се CSS ефекти и различни промени по дизайна, които да придават по-добра завършеност на цялостната визия.</p>\n                        <h5>Версия 1.12</h5>\n                        <p>Дизайнът допълнително беше изчистен за мобилни устройства, като бутоните за Назад и Изход бяха заменени само от икони при по-малка резолюция на мобилното устройство.</p>\n                        <h5>Версия 1.11</h5>\n                        <p>Добавена беше възможността за мигновено обновяване на списъка с файлове и папки при достъп от различни устройства. Вече качването на файл от едно устройство се отбелязваше своевеременно и на останалите устройства, с които потребителят е влязъл в системата.</p>\n                        <h5>Версия 1.10</h5>\n                        <p>Бяха направени значителни промени в дизайна. Всичко стана по-приветливо и по-лесно за използване, като иконите станаха главна част от дизайна, който вече беше напълно отзивчив за мобилни устройства.</p>\n                        <h5>Версия 1.09</h5>\n                        <p>Създадена беше база данни за файловата система, позволяваща проследяване на всеки файл или папка на принципа на онаследяването.</p>\n                        <h5>Версия 1.08</h5>\n                        <p>Създадена беше лента на прогреса, показваща докъде е стигнало качването на даден файл.</p>\n                        <h5>Версия 1.07</h5>\n                        <p>Добавено беше пренаписване на кода в Apache, за да се поддържат едноименните връзки.</p>\n                        <h5>Версия 1.06</h5>\n                        <p>Добавен беше бутон за изход от системата.</p>\n                        <h5>Версия 1.05</h5>\n                        <p>Добавена беше поддръжката на икони с използването на безплатния Font Awesome.</p>\n                        <h5>Версия 1.04</h5>\n                        <p>Беше пренаписан дизайна, за да се ползва ReactJS.</p>\n                        <h5>Версия 1.03</h5>\n                        <p>Добавена беше възможност за качване на нов файл, преди да е завършило качването на предишния.</p>\n                        <h5>Версия 1.02</h5>\n                        <p>Добавена беше възможност за качване на файлове.</p>\n                        <h5>Версия 1.01</h5>\n                        <p>При логин се създаваше потребителска папка. Добавена беше възможност създаване на папки.</p>\n                        <h5>Версия 1.00</h5>\n                        <p>Създадена беше формата за вход. Добавени бяха възможност за влизане в системата с използване на jwt. Създадена беше основната база данни с потребители.</p>\n                    </Col>\n                </Row>\n            </ModalBody>\n            <ModalFooter>\n                <Button onClick={() => setIsOpen(false)} className=\"my-0 mx-auto\" color=\"primary\">\n                    Добре\n            </Button>\n            </ModalFooter>\n        </Modal>\n    );\n}\n\n\n\nexport default versions;\n","import React from 'react';\nimport {withCloudContext} from '../Screens/Cloud/CloudContext';\nimport styles from './Breadcrumbs.module.scss';\n\nconst Breadcrumbs = ({currentPath, navigate}) => {\n  const pathArr = currentPath.split('/').slice(1).filter(v => !!v);\n\n  return (\n    <div className=\"px-5 py-2\">\n      <span\n        color=\"link\"\n        onClick={() => navigate('/')}\n        className={`${styles.crumb} p-0`}>\n        Начало {currentPath !== '/' && <>/ {' '}</>} \n      </span>\n      {pathArr.map((path, i) => {\n        const active = i === pathArr.length - 1\n        return (\n          <span\n            color=\"link\"\n            onClick={() =>\n              !active &&\n              navigate('/' + pathArr.slice(0, i + 1).join('/'))\n            }\n            className={`${styles.crumb} ${active ? styles.active : ''} p-0`}\n            key={pathArr.slice(0, i + 1).join('/')}>\n            {path} {!active && <>/ {' '}</>} \n          </span>\n        );\n      })}\n    </div>\n  );\n};\n\nexport default withCloudContext(Breadcrumbs);\n","import React, { useEffect, useState, useRef } from 'react';\nimport { Container, Progress, Row, Col, Button } from 'reactstrap';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport Modal from '../../Modal/Modal';\nimport { httpRequest } from '../../../utils';\n\nimport { protect, useInterval } from '../../../utils';\nimport FileExplorer from '../../FileExplorer/FileExplorer';\nimport { CloudContext } from './CloudContext';\nimport TopMenu from '../../TopMenu/TopMenu';\nimport Version from '../../Modals/Versions';\n\nimport { Map } from 'immutable';\nimport Breadcrumbs from '../../Breadcrumbs/Breadcrumbs';\n\nconst REFRESH_RATE = 5000;\n\nconst Cloud = () => {\n  const [currentPath, setCurrentPath] = useState('/');\n  const [fs, setFs] = useState({ root: [] });\n  const [beingUploaded, setBeingUploaded] = useState(Map());\n  const [isModalOpen, setIsModalOpen] = useState(false);\n  const [modalComponent, setModalComponent] = useState('');\n  const [modalProps, setModalProps] = useState({});\n  const beingUploadedRef = useRef(beingUploaded);\n  const [isOpen, setIsOpen] = useState(false);\n\n  const navigate = path => {\n    if (path.startsWith('/')) {\n      setCurrentPath(path);\n    } else {\n      const newPath = path\n        .split('/')\n        .reduce(\n          (acc, value) => {\n            if (value === '..') {\n              return acc.slice(null, -1);\n            } else if (!!value) {\n              return [...acc, value];\n            } else {\n              return acc;\n            }\n          },\n          currentPath === '/' ? [''] : currentPath.split('/')\n        )\n        .join('/');\n\n      setCurrentPath(newPath === '' ? '/' : newPath);\n    }\n  };\n\n  const fetchFs = async () => {\n    const tree = await httpRequest(process.env.REACT_APP_API + '/files');\n    setFs(tree);\n  };\n\n  useEffect(() => {\n    fetchFs();\n  }, []);\n\n  useInterval(() => {\n    fetchFs();\n  }, REFRESH_RATE);\n\n  useEffect(\n    () => {\n      beingUploadedRef.current = beingUploaded;\n    },\n    [beingUploaded]\n  );\n\n  const updateProgress = (fileName, progress, cancelToken) => {\n    setBeingUploaded(\n      beingUploadedRef.current.set(fileName, { progress, cancelToken })\n    );\n  };\n\n  const finishUpload = fileName => {\n    fetchFs();\n    setBeingUploaded(beingUploadedRef.current.remove(fileName));\n  };\n\n  const context = {\n    currentPath,\n    setCurrentPath,\n    beingUploaded,\n    setBeingUploaded,\n    updateProgress,\n    finishUpload,\n    // parentID,\n    navigate,\n    fetchFs,\n    isModalOpen,\n    setIsModalOpen,\n    modalProps,\n    setModalProps,\n    modalComponent,\n    setModalComponent,\n    fs\n  };\n\n  return (\n    <CloudContext.Provider value={context}>\n      <TopMenu />\n      <Breadcrumbs />\n      <Container fluid>\n        <FileExplorer />\n      </Container>\n      <Modal />\n      <div\n        className=\"px-2 py-1\"\n        style={{\n          position: 'fixed',\n          background: '#eee',\n          zIndex: 1,\n          bottom: 0,\n          right: 0,\n          width: '40%',\n        }}>\n        {beingUploaded.entrySeq().map(([key, value]) => {\n          return (\n            <>\n              <Row>\n                <Col xs=\"2\" md=\"1\">\n                  <FontAwesomeIcon\n                    className=\"font-15\"\n                    onClick={() => value.cancelToken.cancel()}\n                    icon=\"window-close\"\n                  />\n                </Col>\n                <Col xs=\"10\" md=\"11\">\n                  <p>{key}</p>\n                </Col>\n              </Row>\n              <Row>\n                <Col xs=\"2\" md=\"1\"><span className=\"text-dark\">{value.progress}%</span></Col>\n                <Col xs=\"10\" md=\"11\"><Progress value={value.progress} /></Col>\n              </Row>\n            </>\n          );\n        })}\n      </div>\n      <div\n        className=\"px-2 py-1\"\n        style={{\n          position: 'fixed',\n          background: 'transparent',\n          zIndex: 1,\n          bottom: 0,\n          left: 0,\n          width: '40%'\n        }}>\n        <Version isOpen={isOpen} setIsOpen={setIsOpen}></Version>\n        <Button className='w-200' color='link' onClick={() => setIsOpen(true)}>Версия 1.23</Button>\n      </div>\n\n    </CloudContext.Provider>\n  );\n};\nexport default protect(Cloud);","import React, { useState, useCallback } from 'react';\nimport {\n    Row,\n    Col,\n    Modal,\n    ModalHeader,\n    ModalBody,\n    ModalFooter,\n    Button\n} from 'reactstrap';\n\nconst CenteredTitle = ({ children }) => <h5 className=\"w-100\">{children}</h5>;\n\nconst readmore = ({ isOpen, setIsOpen }) => {\n    return (\n        <Modal isOpen={isOpen} size='xl'>\n            <ModalHeader tag={CenteredTitle} className=\"text-center\" toggle={() => setIsOpen(false)}>\n                Какво представлява „My5“?\n            </ModalHeader>\n            <ModalBody>\n                <Row>\n                    <Col md={{ size: 10, offset: 1 }} sm=\"12\">\n                        <p>Сайтът „My5“ представлява иновативно хранилище за файлове - една завършена система за локални облачни услуги, с която можете да създавате собствени потребителски папки и да качвате файлове. Идеята за направата на системата се получи, след като на няколко пъти срив в интернета на града затрудни достъпа до Google Drive и One Drive акаунтите на училището. Това наложи създаване на собствено решение за споделяне и съхранение на файлове от страна на учениците, което да се изпълнява в рамките на училището и да не се влияе от локалната свързаност към глобалната мрежа. От няколко години всеки от учениците в СУ “Васил Левски” - гр. Троян има лична ученическа карта, която му служи за пропуск.</p>\n                        <p>Използвайки базата данни, която е създадена в училището, изготвихме нашата система, като в нея дадохме възможност всеки да влиза със своя уникален номер от  ученическата си карта и парола, която е получена от класния ръководител. Оказа се, че така създадената система е много подходяща за часовете по информатика и информационни технологии, където всеки един ученик може да записва файловете си в личния си облак и да ги достъпва по всяко време и от всяко устройство.</p>\n                        <p>В изпълнението на тази главна цел създадохме кросплатформена система, в която всяко действие, което изпълните на едно от устройствата, веднага се изпълнява на другите. Например, ако сте влезли в системата през Вашия мобилен телефон, а в същото време в училище сте достъпили профила си през работната си станция, то качването на файла от телефона в системата, веднага ще се отрази и на компютъра. Самият сървър е зад два смарт рутера и достъпа до него се осъществява след поредица от разрешения. На него има инсталирани необходимите SSL сертификати, като за достъп се използва единствено TLS 1.2. Това дава достатъчна степен на защита на данните и предпазване на личните файлове на учениците. Благодарение на изградената вътрешна интранет мрежа на училището достъпа до нашето решение би бил невъзможен единствено когато няма ток, а това помага за много по-добро провеждане на часовете, защото подготвеното от учителя и качено в системата домашно от предния ден, на другия ден ще бъде достъпно за локално ползване в училище, дори и да няма интернет свързаност. Това позволява по-спокойно прецизиране на плана на уроците и създаване на една по-приятна атмосфера за провеждане на един интерактивен час.</p>\n                        <p>Проектът е с лесен, отзивчив, интуитивен и опростен дизайн, като при направата на външния вид сме се стремили да отговорим на желанието на повечето ученици да могат без проблем да се ориентират и да създават съдържанието по удобен за тях начин. Използването на познати технологии като Bootstrap и NotifyJS спомага именно за горепосочените предимства.</p>\n                    </Col>\n                </Row>\n            </ModalBody>\n            <ModalFooter>\n                <Button onClick={() => setIsOpen(false)} className=\"my-0 mx-auto\" color=\"primary\">\n                    Разбрах\n            </Button>\n            </ModalFooter>\n        </Modal>\n    );\n}\n\n\n\nexport default readmore;\n","import React, { useState, useCallback } from 'react';\nimport { Container, Form, Row, Col, Input, Button } from 'reactstrap';\nimport styles from './Login.module.scss';\nimport { protect } from '../../../utils';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { NotificationContainer, NotificationManager } from 'react-notifications';\nimport Readmore from '../../Modals/Readmore';\n\nconst Login = () => {\n  const [identifier, setIdentifier] = useState('');\n  const [password, setPassword] = useState('');\n  const [isOpen, setIsOpen] = useState(false);\n  const handleSubmit = useCallback(async e => {\n    e.preventDefault();\n\n    const headers = new Headers();\n    headers.append('Content-Type', 'application/json');\n\n    console.log(process.env.REACT_APP_API)\n    const res = await fetch(process.env.REACT_APP_API + '/login', {\n      method: 'POST',\n      headers,\n      body: JSON.stringify({\n        identifier,\n        password\n      })\n    });\n\n    const jwt = await res.text();\n    \n    if (res.ok && password != '12345') {\n      localStorage.setItem('jwt', jwt);\n      window.location.replace('/');\n    } else if (res.ok && password == '12345') {\n      localStorage.setItem('jwt', jwt);\n      window.location.replace('/changePassword');\n    } else if (res.status === 401) {\n      NotificationManager.error('', 'Грешно име или парола!', 3000);\n    }\n  }, [identifier, password]);\n\n  return (\n    <Container className={`${styles.container} p-5`}>\n      <img className=\"mx-auto d-block\" src=\"/Logo.png\" alt='Logo' />\n      <Readmore isOpen={isOpen} setIsOpen={setIsOpen}></Readmore>\n      <Button className='w-100 text-center' color='link' onClick={() => setIsOpen(true)}>Иновативно хранилище за файлове</Button>\n      <Form className={styles.form} onSubmit={handleSubmit}>\n        <Row>\n          <Col xs=\"1\">\n            <FontAwesomeIcon icon=\"user\" />\n\t\t  </Col>\n\t\t  <Col xs=\"11\">\n            <Input\n              min=\"0\"\n              type=\"number\"\n              name=\"identifier\"\n              placeholder=\"Идентификационен номер\"\n              value={identifier}\n              onChange={e => setIdentifier(e.target.value)}\n            />\n          </Col>\n        </Row>\n\n        <Row>\n          <Col xs=\"1\">\n            <FontAwesomeIcon icon=\"lock\" />\n\t\t  </Col>\n\t\t  <Col xs=\"11\">\n            <Input\n              type=\"password\"\n              placeholder=\"Парола\"\n              value={password}\n              onChange={e => setPassword(e.target.value)}\n            />\n          </Col>\n        </Row>\n\n        <Row>\n          <Col className=\"text-center\">\n            <Button\n              disabled={!identifier || !password}\n              color=\"primary\"\n              type=\"submit\">\n              Вход\n            </Button>\n          </Col>\n        </Row>\n      </Form>\n\n      <NotificationContainer />\n    </Container>\n  );\n};\n\nexport default protect(Login, true);\n","import { Cloud, Login, ChangePassword} from './components/Screens';\nimport FileUploader from './components/FileUploader/FileUploader';\n\nexport default [\n  { path: '/', exact: true, component: Cloud },\n  { path: '/login', component: Login },\n  { path: '/upload', component: FileUploader },\n  { path: '/changePassword', component: ChangePassword}\n];\n","import React, { useState, useCallback } from \"react\";\nimport { Container, Form, Row, Col, Input, Button } from \"reactstrap\";\nimport styles from \"./ChangePassword.module.scss\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport {\n  NotificationContainer,\n  NotificationManager\n} from \"react-notifications\";\nimport { httpRequest } from \"../../../utils\";\n\nconst ChangePasword = () => {\n  const [password, setPassword] = useState(\"\");\n  const [confirmPassword, setConfirmPassword] = useState(\"\");\n\n  const handleSubmit = useCallback(async e => {\n    e.preventDefault();\n\n    const headers = new Headers();\n    headers.append(\"Content-Type\", \"application/json\");\n\n    if (password !== confirmPassword) {\n      NotificationManager.error(\"\", \"Паролите трябва да са еднакви!\", 3000);\n    } else {\n      const res = await httpRequest(\n        process.env.REACT_APP_API + \"/changePassword\",\n        \"PUT\",\n        {\n          password\n        }\n      );\n\n      console.log('res', res)\n      window.location.replace(\"/\");\n      // if (res.ok) {\n      // } else {\n      //   NotificationManager.error(\n      //     \"\",\n      //     \"В момента не може да се извърши операцията!\",\n      //     3000\n      //   );\n      // }\n    }\n  });\n\n  return (\n    <Container className={`${styles.container} p-5`}>\n      <img className=\"mx-auto d-block\" src=\"/Logo.png\" alt=\"Logo\" />\n      <h1 align=\"center\">Смяна на парола</h1>\n      <Form className={styles.form} onSubmit={handleSubmit}>\n        <Row>\n          <Col xs=\"1\">\n            <FontAwesomeIcon icon=\"lock\" />\n          </Col>\n          <Col xs=\"11\">\n            <Input\n              type=\"password\"\n              placeholder=\"Парола\"\n              value={password}\n              onChange={e => setPassword(e.target.value)}\n            />\n          </Col>\n        </Row>\n\n        <Row>\n          <Col xs=\"1\">\n            <FontAwesomeIcon icon=\"lock\" />\n          </Col>\n          <Col xs=\"11\">\n            <Input\n              type=\"password\"\n              placeholder=\"Повтори паролата\"\n              value={confirmPassword}\n              onChange={e => setConfirmPassword(e.target.value)}\n            />\n          </Col>\n        </Row>\n\n        <Row>\n          <Col className=\"text-center\">\n            <Button\n              disabled={!password || !confirmPassword}\n              color=\"primary\"\n              type=\"submit\"\n            >\n              Смени парола\n            </Button>\n          </Col>\n        </Row>\n      </Form>\n\n      <NotificationContainer />\n    </Container>\n  );\n};\n\nexport default ChangePasword;\n","import React from 'react';\nimport { ApolloClient } from 'apollo-client';\nimport { ApolloProvider } from 'react-apollo';\nimport { InMemoryCache } from 'apollo-cache-inmemory';\nimport { setContext } from 'apollo-link-context';\nimport { HttpLink } from 'apollo-link-http';\nimport { onError } from 'apollo-link-error';\nimport { BrowserRouter as Router } from 'react-router-dom';\nimport { renderRoutes } from 'react-router-config';\nimport { logout } from './utils';\nimport routes from './routes';\nimport './index.scss';\nimport { library } from '@fortawesome/fontawesome-svg-core';\nimport 'react-notifications/lib/notifications.css'\nimport {\n  faUser,\n  faLock,\n  faFolder,\n  faFile,\n  faFolderPlus,\n  faFileUpload,\n  faSignOutAlt,\n  faChevronCircleLeft,\n  faCloudUploadAlt,\n  faTrashAlt,\n  faWindowClose,\n  faFileImage,\n  faFileWord,\n  faFilePdf,\n  faFilePowerpoint,\n  faFileExcel,\n  faFileCode,\n  faFileVideo,\n  faFileArchive,\n  faFileAudio,\n  faFileAlt\n} from '@fortawesome/free-solid-svg-icons';\nlibrary.add(\n  faUser, \n  faLock, \n  faFolder, \n  faFile, \n  faFolderPlus, \n  faFileUpload, \n  faSignOutAlt, \n  faChevronCircleLeft,\n  faCloudUploadAlt,\n  faTrashAlt,\n  faWindowClose,\n  faFileImage,\n  faFileWord,\n  faFilePdf,\n  faFilePowerpoint,\n  faFileExcel,\n  faFileCode,\n  faFileVideo,\n  faFileArchive,\n  faFileAudio,\n  faFileAlt\n);\n\nconst httpLink = new HttpLink({ uri: process.env.REACT_APP_API + '/graphql' });\n\nconst authLink = setContext((_, { headers }) => {\n  // get the authentication token from local storage if it exists\n  const token = localStorage.getItem('jwt');\n  // return the headers to the context so httpLink can read them\n  return {\n    headers: {\n      ...headers,\n      'X-Session-ID': token\n    }\n  };\n});\n\nconst logoutLink = onError(({ networkError }) => {\n  if (networkError.statusCode === 401) logout();\n});\n\nconst cache = new InMemoryCache();\n\nconst client = new ApolloClient({\n  link: authLink.concat(logoutLink.concat(httpLink)),\n  cache\n});\n\nconst App = () => (\n  // <ApolloProvider client={client}>\n    <Router>{renderRoutes(routes)}</Router>\n  // </ApolloProvider>\n);\n\nexport default App;\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read http://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n  window.location.hostname === 'localhost' ||\n    // [::1] is the IPv6 localhost address.\n    window.location.hostname === '[::1]' ||\n    // 127.0.0.1/8 is considered localhost for IPv4.\n    window.location.hostname.match(\n      /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n    )\n);\n\nexport function register(config) {\n  if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n    // The URL constructor is available in all browsers that support SW.\n    const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n    if (publicUrl.origin !== window.location.origin) {\n      // Our service worker won't work if PUBLIC_URL is on a different origin\n      // from what our page is served on. This might happen if a CDN is used to\n      // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n      return;\n    }\n\n    window.addEventListener('load', () => {\n      const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n      if (isLocalhost) {\n        // This is running on localhost. Let's check if a service worker still exists or not.\n        checkValidServiceWorker(swUrl, config);\n\n        // Add some additional logging to localhost, pointing developers to the\n        // service worker/PWA documentation.\n        navigator.serviceWorker.ready.then(() => {\n          console.log(\n            'This web app is being served cache-first by a service ' +\n              'worker. To learn more, visit http://bit.ly/CRA-PWA'\n          );\n        });\n      } else {\n        // Is not localhost. Just register service worker\n        registerValidSW(swUrl, config);\n      }\n    });\n  }\n}\n\nfunction registerValidSW(swUrl, config) {\n  navigator.serviceWorker\n    .register(swUrl)\n    .then(registration => {\n      registration.onupdatefound = () => {\n        const installingWorker = registration.installing;\n        if (installingWorker == null) {\n          return;\n        }\n        installingWorker.onstatechange = () => {\n          if (installingWorker.state === 'installed') {\n            if (navigator.serviceWorker.controller) {\n              // At this point, the updated precached content has been fetched,\n              // but the previous service worker will still serve the older\n              // content until all client tabs are closed.\n              console.log(\n                'New content is available and will be used when all ' +\n                  'tabs for this page are closed. See http://bit.ly/CRA-PWA.'\n              );\n\n              // Execute callback\n              if (config && config.onUpdate) {\n                config.onUpdate(registration);\n              }\n            } else {\n              // At this point, everything has been precached.\n              // It's the perfect time to display a\n              // \"Content is cached for offline use.\" message.\n              console.log('Content is cached for offline use.');\n\n              // Execute callback\n              if (config && config.onSuccess) {\n                config.onSuccess(registration);\n              }\n            }\n          }\n        };\n      };\n    })\n    .catch(error => {\n      console.error('Error during service worker registration:', error);\n    });\n}\n\nfunction checkValidServiceWorker(swUrl, config) {\n  // Check if the service worker can be found. If it can't reload the page.\n  fetch(swUrl)\n    .then(response => {\n      // Ensure service worker exists, and that we really are getting a JS file.\n      const contentType = response.headers.get('content-type');\n      if (\n        response.status === 404 ||\n        (contentType != null && contentType.indexOf('javascript') === -1)\n      ) {\n        // No service worker found. Probably a different app. Reload the page.\n        navigator.serviceWorker.ready.then(registration => {\n          registration.unregister().then(() => {\n            window.location.reload();\n          });\n        });\n      } else {\n        // Service worker found. Proceed as normal.\n        registerValidSW(swUrl, config);\n      }\n    })\n    .catch(() => {\n      console.log(\n        'No internet connection found. App is running in offline mode.'\n      );\n    });\n}\n\nexport function unregister() {\n  if ('serviceWorker' in navigator) {\n    navigator.serviceWorker.ready.then(registration => {\n      registration.unregister();\n    });\n  }\n}\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport App from './App';\nimport * as serviceWorker from './serviceWorker';\n\nReactDOM.render(<App />, document.getElementById('root'));\n\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: http://bit.ly/CRA-PWA\nserviceWorker.unregister();\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"box\":\"FileView_box__2nXDc\",\"bottomHalf\":\"FileView_bottomHalf__2Q6nc\",\"text\":\"FileView_text__1niex\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"crumb\":\"Breadcrumbs_crumb__121dB\",\"active\":\"Breadcrumbs_active__37yRc\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"container\":\"Login_container__3EUtH\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"container\":\"ChangePassword_container__1-xmL\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"icons\":\"HoverIcons_icons__3ZMHu\"};"],"sourceRoot":""}