{"version":3,"sources":["config.ts","layout/Header.tsx","common/DefaultPage.tsx","common/LoadingSpinner.tsx","inject.tsx","snack/browserNotification.ts","layout/Navigation.tsx","common/ScrollUpButton.tsx","common/SettingsDialog.tsx","snack/SnackBarHandler.tsx","common/ConfirmDialog.tsx","message/extras.ts","common/ToggleVisibility.tsx","application/AddApplicationDialog.tsx","application/UpdateApplicationDialog.tsx","application/Applications.tsx","client/AddClientDialog.tsx","client/UpdateClientDialog.tsx","client/Clients.tsx","plugin/Plugins.tsx","common/Container.tsx","plugin/PluginDetailView.tsx","user/Register.tsx","user/Login.tsx","message/Message.tsx","message/Messages.tsx","user/AddEditUserDialog.tsx","user/Users.tsx","common/ConnectionErrorBanner.tsx","layout/Layout.tsx","registerServiceWorker.ts","CurrentUser.ts","common/BaseStore.ts","application/AppStore.ts","message/WebSocketStore.ts","snack/SnackManager.ts","user/UserStore.ts","message/MessagesStore.ts","client/ClientStore.ts","plugin/PluginStore.ts","reactions.ts","index.tsx","apiAuth.ts"],"names":["config","get","val","Header","observer","this","props","classes","version","name","loggedIn","admin","toggleTheme","logout","style","setNavOpen","width","position","AppBar","className","appBar","Toolbar","toolbar","title","to","link","Typography","variant","titleName","color","href","renderButtons","IconButton","onClick","target","rel","showSettings","menuButtons","Hidden","smUp","implementation","icon","label","id","Component","ResponsiveButton","children","rest","Button","startIcon","withWidth","withStyles","theme","createStyles","zIndex","drawer","breakpoints","down","paddingBottom","justifyContent","flexWrap","display","flex","flexBasis","marginTop","order","up","paddingRight","textDecoration","withTheme","DefaultPage","rightControl","maxWidth","margin","Grid","container","spacing","item","xs","LoadingSpinner","textAlign","CircularProgress","size","inject","stores","node","mobxInject","InjectProvider","mayAllowPermission","Notify","needsPermission","isSupported","Notification","permission","closeAndFocus","event","window","parent","focus","location","close","closeAfterTimeout","setTimeout","Navigation","state","showRequestNotification","appStore","navOpen","apps","getItems","userApps","length","map","app","key","ListItem","button","ListItemText","primary","placeholderItems","disabled","root","paper","drawerPaper","Divider","align","requestPermission","console","log","setState","ResponsiveDrawer","Drawer","open","xsDown","height","minHeight","mixins","ScrollUpButton","opacity","scrollHandler","currentScrollPos","pageYOffset","nextState","Math","min","scrollUp","scrollTo","addEventListener","removeEventListener","Fab","bottom","right","SettingsDialog","pass","fClose","currentUser","Dialog","onClose","aria-labelledby","DialogTitle","DialogContent","TextField","autoFocus","type","value","onChange","e","fullWidth","DialogActions","Tooltip","changePassword","observable","SnackBarHandler","dispose","componentDidMount","reaction","snackManager","counter","onNewSnack","componentWillUnmount","openWhen","snackOpenSince","Date","now","MIN_VISIBLE_SNACK_TIME_IN_MS","closeCurrentSnack","openNextSnack","hasNext","next","current","message","duration","MAX_VISIBLE_SNACK_TIME_IN_MS","Snackbar","anchorOrigin","vertical","horizontal","autoHideDuration","onExited","action","aria-label","ConfirmDialog","text","fOnSubmit","DialogContentText","RenderMode","ToggleVisibility","visible","toggleVisibility","fontFamily","fontSize","AddDialog","description","submitEnabled","handleChange","bind","multiline","propertyName","UpdateDialog","initialName","initialDescription","Applications","uploadId","upload","refresh","uploadImage","click","onUploadImage","file","files","indexOf","alert","createDialog","deleteId","updateId","Paper","elevation","Table","TableHead","TableRow","TableCell","padding","TableBody","image","token","fUpload","fDelete","fEdit","noDelete","internal","ref","create","update","getByID","remove","Row","Avatar","src","alignItems","placement","Clients","clientStore","showDialog","clients","client","Plugins","pluginStore","plugins","plugin","enabled","fToggleStatus","changeEnabledState","Switch","checked","data-enabled","PluginDetailView","pluginID","parseInt","match","params","pluginInfo","displayText","currentConfig","refreshFeatures","nextProps","Promise","all","refreshConfigurer","refreshDisplayer","capabilities","requestConfig","response","requestDisplay","Info","Build","initialConfig","save","newConfig","a","changeConfig","Subject","PanelWrapper","Icon","float","toLowerCase","trim","replace","ConfigurerPanel","unsavedChanges","options","mode","lineNumbers","instance","data","newConf","then","DisplayerPanel","source","PluginInfo","url","author","modulePath","website","license","join","RegistrationDialog","namePresent","passPresent","Login","login","preventDefault","username","password","register","axios","post","registerDialog","onSubmit","connectionErrorMessage","marginBottom","contentType","extras","extract","Object","keys","k","some","Plain","path","Message","getBoundingClientRect","renderContent","content","Markdown","escapeHtml","date","wrapperPadding","imageWrapper","alt","messageContentWrapper","header","headerTitle","trash","component","React","PureComponent","marginRight","whiteSpace","wordBreak","overflow","Messages","appId","isLoadingMore","updateAllWithProps","messagesStore","exists","loadMore","updateAll","deleteMessage","removeSingle","renderMessage","heights","gutterBottom","onscroll","innerHeight","document","body","offsetHeight","checkIfLoadMore","messages","hasMore","canLoadMore","getName","hasMessages","refreshByApp","removeByApp","useWindowAsScrollContainer","preloadBatchSize","elementHeight","m","undefined","AddEditDialog","isEdit","FormControlLabel","control","handleChecked","UserRow","Users","userStore","editId","users","user","wrapper","ConnectionErrorBanner","retry","backgroundColor","lineHeight","themeMap","light","createMuiTheme","palette","dark","Layout","defaultVersion","resp","localStorageTheme","localStorage","getItem","currentTheme","setItem","authenticating","tryReconnect","flexDirection","CssBaseline","top","exact","render","isLocalhost","Boolean","hostname","navigator","URL","process","toString","origin","swUrl","fetch","status","headers","serviceWorker","ready","registration","unregister","reload","registerValidSW","catch","checkValidServiceWorker","onupdatefound","installingWorker","installing","onstatechange","controller","error","tokenKey","CurrentUser","snack","tokenCache","reconnectTimeoutId","reconnectTime","localStorageToken","setToken","browser","detect","request","method","Authorization","Base64","encode","tryAuthenticate","reject","passThrough","connectionError","statusText","filter","forEach","delete","resolve","removeItem","quiet","clearTimeout","BaseStore","getByIDOrUndefined","Error","items","find","hasId","requestDelete","requestItems","AppStore","onDelete","formData","FormData","append","put","WebSocketStore","wsActive","ws","listen","callback","wsUrl","WebSocket","onerror","onmessage","JSON","parse","onclose","SnackManager","shift","push","UserStore","MessagesStore","loading","stateOf","emptyState","loaded","clear","fetchMessages","since","getUnCached","appToImage","reduce","appid","createTransformer","clearCache","createEmptyStatesForApps","array","nextSince","messageToDelete","index","findIndex","splice","pagedResult","paging","unshift","clearAll","removeFromList","ClientStore","createNoNotifcation","PluginStore","registerReactions","wsStore","loadAll","msg","publishSingleMessage","removeMarkdown","silent","notifyClick","notifyShow","show","priority","Audio","play","port","protocol","pathname","slashes","concat","endsWith","substring","lastIndexOf","defaultProdConfig","c","initStores","interceptors","use","errorDescription","onbeforeunload","ReactDOM","getElementById","registerServiceWorker"],"mappings":"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","file":"static/js/main.b6f7beae.chunk.js","sourcesContent":["export interface IConfig {\n url: string;\n}\n\nlet config: IConfig;\n\nexport function set(c: IConfig) {\n config = c;\n}\n\nexport function get(val: 'url'): string {\n return config[val];\n}\n","import AppBar from '@material-ui/core/AppBar';\nimport Button from '@material-ui/core/Button';\nimport IconButton from '@material-ui/core/IconButton';\nimport {createStyles, Theme, WithStyles, withStyles} from '@material-ui/core/styles';\nimport Toolbar from '@material-ui/core/Toolbar';\nimport Typography from '@material-ui/core/Typography';\nimport AccountCircle from '@material-ui/icons/AccountCircle';\nimport Chat from '@material-ui/icons/Chat';\nimport DevicesOther from '@material-ui/icons/DevicesOther';\nimport ExitToApp from '@material-ui/icons/ExitToApp';\nimport Highlight from '@material-ui/icons/Highlight';\nimport GitHubIcon from '@material-ui/icons/GitHub';\nimport MenuIcon from '@material-ui/icons/Menu';\nimport Apps from '@material-ui/icons/Apps';\nimport SupervisorAccount from '@material-ui/icons/SupervisorAccount';\nimport React, {Component, CSSProperties} from 'react';\nimport {Link} from 'react-router-dom';\nimport {observer} from 'mobx-react';\nimport {Hidden, PropTypes, withWidth} from '@material-ui/core';\nimport {Breakpoint} from '@material-ui/core/styles/createBreakpoints';\n\nconst styles = (theme: Theme) =>\n createStyles({\n appBar: {\n zIndex: theme.zIndex.drawer + 1,\n [theme.breakpoints.down('xs')]: {\n paddingBottom: 10,\n },\n },\n toolbar: {\n justifyContent: 'space-between',\n [theme.breakpoints.down('xs')]: {\n flexWrap: 'wrap',\n },\n },\n menuButtons: {\n display: 'flex',\n [theme.breakpoints.down('sm')]: {\n flex: 1,\n },\n justifyContent: 'center',\n [theme.breakpoints.down('xs')]: {\n flexBasis: '100%',\n marginTop: 5,\n order: 1,\n justifyContent: 'space-between',\n },\n },\n title: {\n [theme.breakpoints.up('md')]: {\n flex: 1,\n },\n display: 'flex',\n alignItems: 'center',\n },\n titleName: {\n paddingRight: 10,\n },\n link: {\n color: 'inherit',\n textDecoration: 'none',\n },\n });\n\ntype Styles = WithStyles<'link' | 'menuButtons' | 'toolbar' | 'titleName' | 'title' | 'appBar'>;\n\ninterface IProps extends Styles {\n loggedIn: boolean;\n name: string;\n admin: boolean;\n version: string;\n toggleTheme: VoidFunction;\n showSettings: VoidFunction;\n logout: VoidFunction;\n style: CSSProperties;\n width: Breakpoint;\n setNavOpen: (open: boolean) => void;\n}\n\n@observer\nclass Header extends Component {\n public render() {\n const {\n classes,\n version,\n name,\n loggedIn,\n admin,\n toggleTheme,\n logout,\n style,\n setNavOpen,\n width,\n } = this.props;\n\n const position = width === 'xs' ? 'sticky' : 'fixed';\n\n return (\n \n \n
\n \n \n Gotify\n \n \n \n \n @{version}\n \n \n
\n {loggedIn && this.renderButtons(name, admin, logout, width, setNavOpen)}\n
\n \n \n \n\n \n \n \n \n \n
\n
\n
\n );\n }\n\n private renderButtons(\n name: string,\n admin: boolean,\n logout: VoidFunction,\n width: Breakpoint,\n setNavOpen: (open: boolean) => void\n ) {\n const {classes, showSettings} = this.props;\n return (\n
\n \n }\n onClick={() => setNavOpen(true)}\n label=\"menu\"\n width={width}\n color=\"inherit\"\n />\n \n {admin && (\n \n }\n label=\"users\"\n width={width}\n color=\"inherit\"\n />\n \n )}\n \n } label=\"apps\" width={width} color=\"inherit\" />\n \n \n }\n label=\"clients\"\n width={width}\n color=\"inherit\"\n />\n \n \n }\n label=\"plugins\"\n width={width}\n color=\"inherit\"\n />\n \n }\n label={name}\n onClick={showSettings}\n id=\"changepw\"\n width={width}\n color=\"inherit\"\n />\n }\n label=\"Logout\"\n onClick={logout}\n id=\"logout\"\n width={width}\n color=\"inherit\"\n />\n
\n );\n }\n}\n\nconst ResponsiveButton: React.FC<{\n width: Breakpoint;\n color: PropTypes.Color;\n label: string;\n id?: string;\n onClick?: () => void;\n icon: React.ReactNode;\n}> = ({width, icon, children, label, ...rest}) => {\n if (width === 'xs' || width === 'sm') {\n return {icon};\n }\n return (\n \n );\n};\n\nexport default withWidth()(withStyles(styles, {withTheme: true})(Header));\n","import Grid from '@material-ui/core/Grid';\nimport Typography from '@material-ui/core/Typography';\nimport React, {FC} from 'react';\n\ninterface IProps {\n title: string;\n rightControl?: React.ReactNode;\n maxWidth?: number;\n}\n\nconst DefaultPage: FC = ({title, rightControl, maxWidth = 700, children}) => (\n
\n \n \n \n {title}\n \n {rightControl}\n \n {children}\n \n
\n);\nexport default DefaultPage;\n","import CircularProgress from '@material-ui/core/CircularProgress';\nimport Grid from '@material-ui/core/Grid';\nimport React from 'react';\nimport DefaultPage from './DefaultPage';\n\nexport default function LoadingSpinner() {\n return (\n \n \n \n \n \n );\n}\n","import * as React from 'react';\nimport {UserStore} from './user/UserStore';\nimport {SnackManager} from './snack/SnackManager';\nimport {MessagesStore} from './message/MessagesStore';\nimport {CurrentUser} from './CurrentUser';\nimport {ClientStore} from './client/ClientStore';\nimport {AppStore} from './application/AppStore';\nimport {inject as mobxInject, Provider} from 'mobx-react';\nimport {WebSocketStore} from './message/WebSocketStore';\nimport {PluginStore} from './plugin/PluginStore';\n\nexport interface StoreMapping {\n userStore: UserStore;\n snackManager: SnackManager;\n messagesStore: MessagesStore;\n currentUser: CurrentUser;\n clientStore: ClientStore;\n appStore: AppStore;\n pluginStore: PluginStore;\n wsStore: WebSocketStore;\n}\n\nexport type AllStores = Extract;\nexport type Stores = Pick;\n\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport const inject = (...stores: I[]) =>

(\n node: React.ComponentType

\n): React.ComponentType>> =>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n mobxInject(...stores)(node) as any;\n\nexport const InjectProvider: React.SFC<{stores: StoreMapping}> = ({children, stores}) => (\n {children}\n);\n","import Notify from 'notifyjs';\nimport removeMarkdown from 'remove-markdown';\nimport {IMessage} from '../types';\n\nexport function mayAllowPermission(): boolean {\n return Notify.needsPermission && Notify.isSupported() && Notification.permission !== 'denied';\n}\n\nexport function requestPermission() {\n if (Notify.needsPermission && Notify.isSupported()) {\n Notify.requestPermission(\n () => console.log('granted notification permissions'),\n () => console.log('notification permission denied')\n );\n }\n}\n\nexport function notifyNewMessage(msg: IMessage) {\n const notify = new Notify(msg.title, {\n body: removeMarkdown(msg.message),\n icon: msg.image,\n silent: true,\n notifyClick: closeAndFocus,\n notifyShow: closeAfterTimeout,\n });\n notify.show();\n}\n\nfunction closeAndFocus(event: Event) {\n if (window.parent) {\n window.parent.focus();\n }\n window.focus();\n window.location.href = '/';\n const target = event.target as Notification;\n target.close();\n}\n\nfunction closeAfterTimeout(event: Event) {\n setTimeout(() => {\n const target = event.target as Notification;\n target.close();\n }, 5000);\n}\n","import Divider from '@material-ui/core/Divider';\nimport Drawer from '@material-ui/core/Drawer';\nimport ListItem from '@material-ui/core/ListItem';\nimport ListItemText from '@material-ui/core/ListItemText';\nimport {StyleRules, Theme, WithStyles, withStyles} from '@material-ui/core/styles';\nimport React, {Component} from 'react';\nimport {Link} from 'react-router-dom';\nimport {observer} from 'mobx-react';\nimport {inject, Stores} from '../inject';\nimport {mayAllowPermission, requestPermission} from '../snack/browserNotification';\nimport {Button, Hidden, IconButton, Typography} from '@material-ui/core';\nimport {DrawerProps} from '@material-ui/core/Drawer/Drawer';\nimport CloseIcon from '@material-ui/icons/Close';\n\nconst styles = (theme: Theme): StyleRules<'root' | 'drawerPaper' | 'toolbar' | 'link'> => ({\n root: {\n height: '100%',\n },\n drawerPaper: {\n position: 'relative',\n width: 250,\n minHeight: '100%',\n height: '100vh',\n },\n toolbar: theme.mixins.toolbar,\n link: {\n color: 'inherit',\n textDecoration: 'none',\n },\n});\n\ntype Styles = WithStyles<'root' | 'drawerPaper' | 'toolbar' | 'link'>;\n\ninterface IProps {\n loggedIn: boolean;\n navOpen: boolean;\n setNavOpen: (open: boolean) => void;\n}\n\n@observer\nclass Navigation extends Component<\n IProps & Styles & Stores<'appStore'>,\n {showRequestNotification: boolean}\n> {\n public state = {showRequestNotification: mayAllowPermission()};\n\n public render() {\n const {classes, loggedIn, appStore, navOpen, setNavOpen} = this.props;\n const {showRequestNotification} = this.state;\n const apps = appStore.getItems();\n\n const userApps =\n apps.length === 0\n ? null\n : apps.map((app) => {\n return (\n setNavOpen(false)}\n className={`${classes.link} item`}\n to={'/messages/' + app.id}\n key={app.id}>\n \n \n \n \n );\n });\n\n const placeholderItems = [\n \n \n ,\n \n \n ,\n ];\n\n return (\n \n

\n setNavOpen(false)}>\n \n \n \n \n \n
{loggedIn ? userApps : placeholderItems}
\n \n \n {showRequestNotification ? (\n {\n requestPermission();\n this.setState({showRequestNotification: false});\n }}>\n Enable Notifications\n \n ) : null}\n \n \n );\n }\n}\n\nconst ResponsiveDrawer: React.FC<\n DrawerProps & {navOpen: boolean; setNavOpen: (open: boolean) => void}\n> = ({navOpen, setNavOpen, children, ...rest}) => {\n return (\n <>\n \n \n setNavOpen(false)}>\n \n \n {children}\n \n \n \n \n {children}\n \n \n \n );\n};\n\nexport default withStyles(styles, {withTheme: true})(inject('appStore')(Navigation));\n","import Fab from '@material-ui/core/Fab';\nimport KeyboardArrowUp from '@material-ui/icons/KeyboardArrowUp';\nimport React, {Component} from 'react';\n\nclass ScrollUpButton extends Component {\n state = {\n display: 'none',\n opacity: 0,\n };\n componentDidMount() {\n window.addEventListener('scroll', this.scrollHandler);\n }\n\n componentWillUnmount() {\n window.removeEventListener('scroll', this.scrollHandler);\n }\n\n scrollHandler = () => {\n const currentScrollPos = window.pageYOffset;\n const opacity = Math.min(currentScrollPos / 500, 1);\n const nextState = {display: currentScrollPos > 0 ? 'inherit' : 'none', opacity};\n if (this.state.display !== nextState.display || this.state.opacity !== nextState.opacity) {\n this.setState(nextState);\n }\n };\n\n public render() {\n return (\n \n \n \n );\n }\n\n private scrollUp = () => window.scrollTo(0, 0);\n}\n\nexport default ScrollUpButton;\n","import Button from '@material-ui/core/Button';\nimport Dialog from '@material-ui/core/Dialog';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport TextField from '@material-ui/core/TextField';\nimport Tooltip from '@material-ui/core/Tooltip';\nimport React, {Component} from 'react';\nimport {observable} from 'mobx';\nimport {observer} from 'mobx-react';\nimport {inject, Stores} from '../inject';\n\ninterface IProps {\n fClose: VoidFunction;\n}\n\n@observer\nclass SettingsDialog extends Component> {\n @observable\n private pass = '';\n\n public render() {\n const {pass} = this;\n const {fClose, currentUser} = this.props;\n const submitAndClose = () => {\n currentUser.changePassword(pass);\n fClose();\n };\n return (\n \n Change Password\n \n (this.pass = e.target.value)}\n fullWidth\n />\n \n \n \n \n
\n \n Change\n \n
\n
\n
\n \n );\n }\n}\n\nexport default inject('currentUser')(SettingsDialog);\n","import IconButton from '@material-ui/core/IconButton';\nimport Snackbar from '@material-ui/core/Snackbar';\nimport Close from '@material-ui/icons/Close';\nimport React, {Component} from 'react';\nimport {observable, reaction} from 'mobx';\nimport {observer} from 'mobx-react';\nimport {inject, Stores} from '../inject';\n\n@observer\nclass SnackBarHandler extends Component> {\n private static MAX_VISIBLE_SNACK_TIME_IN_MS = 6000;\n private static MIN_VISIBLE_SNACK_TIME_IN_MS = 1000;\n\n @observable\n private open = false;\n @observable\n private openWhen = 0;\n\n private dispose: () => void = () => {};\n\n public componentDidMount = () =>\n (this.dispose = reaction(() => this.props.snackManager.counter, this.onNewSnack));\n\n public componentWillUnmount = () => this.dispose();\n\n public render() {\n const {message: current, hasNext} = this.props.snackManager;\n const duration = hasNext()\n ? SnackBarHandler.MIN_VISIBLE_SNACK_TIME_IN_MS\n : SnackBarHandler.MAX_VISIBLE_SNACK_TIME_IN_MS;\n\n return (\n {current}}\n action={\n \n \n \n }\n />\n );\n }\n\n private onNewSnack = () => {\n const {open, openWhen} = this;\n\n if (!open) {\n this.openNextSnack();\n return;\n }\n\n const snackOpenSince = Date.now() - openWhen;\n if (snackOpenSince > SnackBarHandler.MIN_VISIBLE_SNACK_TIME_IN_MS) {\n this.closeCurrentSnack();\n } else {\n setTimeout(\n this.closeCurrentSnack,\n SnackBarHandler.MIN_VISIBLE_SNACK_TIME_IN_MS - snackOpenSince\n );\n }\n };\n\n private openNextSnack = () => {\n if (this.props.snackManager.hasNext()) {\n this.open = true;\n this.openWhen = Date.now();\n this.props.snackManager.next();\n }\n };\n\n private closeCurrentSnack = () => (this.open = false);\n}\n\nexport default inject('snackManager')(SnackBarHandler);\n","import Button from '@material-ui/core/Button';\nimport Dialog from '@material-ui/core/Dialog';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogContentText from '@material-ui/core/DialogContentText';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport React from 'react';\n\ninterface IProps {\n title: string;\n text: string;\n fClose: VoidFunction;\n fOnSubmit: VoidFunction;\n}\n\nexport default function ConfirmDialog({title, text, fClose, fOnSubmit}: IProps) {\n const submitAndClose = () => {\n fOnSubmit();\n fClose();\n };\n return (\n \n {title}\n \n {text}\n \n \n \n \n Yes\n \n \n \n );\n}\n","import {IMessageExtras} from '../types';\n\nexport enum RenderMode {\n Markdown = 'text/markdown',\n Plain = 'text/plain',\n}\n\nexport const contentType = (extras?: IMessageExtras): RenderMode => {\n const type = extract(extras, 'client::display', 'contentType');\n const valid = Object.keys(RenderMode)\n .map((k) => RenderMode[k])\n .some((mode) => mode === type);\n return valid ? type : RenderMode.Plain;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst extract = (extras: IMessageExtras | undefined, key: string, path: string): any => {\n if (!extras) {\n return null;\n }\n\n if (!extras[key]) {\n return null;\n }\n\n if (!extras[key][path]) {\n return null;\n }\n\n return extras[key][path];\n};\n","import IconButton from '@material-ui/core/IconButton';\nimport Typography from '@material-ui/core/Typography';\nimport Visibility from '@material-ui/icons/Visibility';\nimport VisibilityOff from '@material-ui/icons/VisibilityOff';\nimport React, {Component} from 'react';\n\ninterface IProps {\n value: string;\n style?: object;\n}\n\ninterface IState {\n visible: boolean;\n}\n\nclass ToggleVisibility extends Component {\n public state = {visible: false};\n\n public render() {\n const {value, style} = this.props;\n const text = this.state.visible ? value : '•••••••••••••••';\n return (\n
\n \n {this.state.visible ? : }\n \n {text}\n
\n );\n }\n\n private toggleVisibility = () => this.setState({visible: !this.state.visible});\n}\n\nexport default ToggleVisibility;\n","import Button from '@material-ui/core/Button';\nimport Dialog from '@material-ui/core/Dialog';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogContentText from '@material-ui/core/DialogContentText';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport TextField from '@material-ui/core/TextField';\nimport Tooltip from '@material-ui/core/Tooltip';\nimport React, {Component} from 'react';\n\ninterface IProps {\n fClose: VoidFunction;\n fOnSubmit: (name: string, description: string) => void;\n}\n\ninterface IState {\n name: string;\n description: string;\n}\n\nexport default class AddDialog extends Component {\n public state = {name: '', description: ''};\n\n public render() {\n const {fClose, fOnSubmit} = this.props;\n const {name, description} = this.state;\n const submitEnabled = this.state.name.length !== 0;\n const submitAndClose = () => {\n fOnSubmit(name, description);\n fClose();\n };\n return (\n \n Create an application\n \n \n An application is allowed to send messages.\n \n \n \n \n \n \n \n
\n \n Create\n \n
\n
\n
\n \n );\n }\n\n private handleChange(propertyName: string, event: React.ChangeEvent) {\n const state = this.state;\n state[propertyName] = event.target.value;\n this.setState(state);\n }\n}\n","import Button from '@material-ui/core/Button';\nimport Dialog from '@material-ui/core/Dialog';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogContentText from '@material-ui/core/DialogContentText';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport TextField from '@material-ui/core/TextField';\nimport Tooltip from '@material-ui/core/Tooltip';\nimport React, {Component} from 'react';\n\ninterface IProps {\n fClose: VoidFunction;\n fOnSubmit: (name: string, description: string) => void;\n initialName: string;\n initialDescription: string;\n}\n\ninterface IState {\n name: string;\n description: string;\n}\n\nexport default class UpdateDialog extends Component {\n public state = {name: '', description: ''};\n\n public componentWillMount() {\n this.setState({name: this.props.initialName, description: this.props.initialDescription});\n }\n\n public render() {\n const {fClose, fOnSubmit} = this.props;\n const {name, description} = this.state;\n const submitEnabled = this.state.name.length !== 0;\n const submitAndClose = () => {\n fOnSubmit(name, description);\n fClose();\n };\n return (\n \n Update an application\n \n \n An application is allowed to send messages.\n \n \n \n \n \n \n \n
\n \n Update\n \n
\n
\n
\n \n );\n }\n\n private handleChange(propertyName: string, event: React.ChangeEvent) {\n const state = this.state;\n state[propertyName] = event.target.value;\n this.setState(state);\n }\n}\n","import Avatar from '@material-ui/core/Avatar';\nimport Grid from '@material-ui/core/Grid';\nimport IconButton from '@material-ui/core/IconButton';\nimport Paper from '@material-ui/core/Paper';\nimport Table from '@material-ui/core/Table';\nimport TableBody from '@material-ui/core/TableBody';\nimport TableCell from '@material-ui/core/TableCell';\nimport TableHead from '@material-ui/core/TableHead';\nimport TableRow from '@material-ui/core/TableRow';\nimport Delete from '@material-ui/icons/Delete';\nimport Edit from '@material-ui/icons/Edit';\nimport CloudUpload from '@material-ui/icons/CloudUpload';\nimport React, {ChangeEvent, Component, SFC} from 'react';\nimport ConfirmDialog from '../common/ConfirmDialog';\nimport DefaultPage from '../common/DefaultPage';\nimport Button from '@material-ui/core/Button';\nimport ToggleVisibility from '../common/ToggleVisibility';\nimport AddApplicationDialog from './AddApplicationDialog';\nimport {observer} from 'mobx-react';\nimport {observable} from 'mobx';\nimport {inject, Stores} from '../inject';\nimport * as config from '../config';\nimport UpdateDialog from './UpdateApplicationDialog';\nimport {IApplication} from '../types';\n\n@observer\nclass Applications extends Component> {\n @observable\n private deleteId: number | false = false;\n @observable\n private updateId: number | false = false;\n @observable\n private createDialog = false;\n\n private uploadId = -1;\n private upload: HTMLInputElement | null = null;\n\n public componentDidMount = () => this.props.appStore.refresh();\n\n public render() {\n const {\n createDialog,\n deleteId,\n updateId,\n props: {appStore},\n } = this;\n const apps = appStore.getItems();\n return (\n (this.createDialog = true)}>\n Create Application\n \n }\n maxWidth={1000}>\n \n \n \n \n \n \n Name\n Token\n Description\n \n \n \n \n \n {apps.map((app: IApplication) => {\n return (\n this.uploadImage(app.id)}\n fDelete={() => (this.deleteId = app.id)}\n fEdit={() => (this.updateId = app.id)}\n noDelete={app.internal}\n />\n );\n })}\n \n
\n (this.upload = upload)}\n type=\"file\"\n style={{display: 'none'}}\n onChange={this.onUploadImage}\n />\n
\n
\n {createDialog && (\n (this.createDialog = false)}\n fOnSubmit={appStore.create}\n />\n )}\n {updateId !== false && (\n (this.updateId = false)}\n fOnSubmit={(name, description) =>\n appStore.update(updateId, name, description)\n }\n initialDescription={appStore.getByID(updateId).description}\n initialName={appStore.getByID(updateId).name}\n />\n )}\n {deleteId !== false && (\n (this.deleteId = false)}\n fOnSubmit={() => appStore.remove(deleteId)}\n />\n )}\n \n );\n }\n\n private uploadImage = (id: number) => {\n this.uploadId = id;\n if (this.upload) {\n this.upload.click();\n }\n };\n\n private onUploadImage = (e: ChangeEvent) => {\n const file = e.target.files && e.target.files[0];\n if (!file) {\n return;\n }\n if (['image/png', 'image/jpeg', 'image/gif'].indexOf(file.type) !== -1) {\n this.props.appStore.uploadImage(this.uploadId, file);\n } else {\n alert('Uploaded file must be of type png, jpeg or gif.');\n }\n };\n}\n\ninterface IRowProps {\n name: string;\n value: string;\n noDelete: boolean;\n description: string;\n fUpload: VoidFunction;\n image: string;\n fDelete: VoidFunction;\n fEdit: VoidFunction;\n}\n\nconst Row: SFC = observer(\n ({name, value, noDelete, description, fDelete, fUpload, image, fEdit}) => (\n \n \n
\n \n \n \n \n
\n
\n {name}\n \n \n \n {description}\n \n \n \n \n \n \n \n \n \n \n
\n )\n);\n\nexport default inject('appStore')(Applications);\n","import Button from '@material-ui/core/Button';\nimport Dialog from '@material-ui/core/Dialog';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport TextField from '@material-ui/core/TextField';\nimport Tooltip from '@material-ui/core/Tooltip';\nimport React, {Component} from 'react';\n\ninterface IProps {\n fClose: VoidFunction;\n fOnSubmit: (name: string) => void;\n}\n\nexport default class AddDialog extends Component {\n public state = {name: ''};\n\n public render() {\n const {fClose, fOnSubmit} = this.props;\n const {name} = this.state;\n const submitEnabled = this.state.name.length !== 0;\n const submitAndClose = () => {\n fOnSubmit(name);\n fClose();\n };\n return (\n \n Create a client\n \n \n \n \n \n \n
\n \n Create\n \n
\n \n
\n \n );\n }\n\n private handleChange(propertyName: string, event: React.ChangeEvent) {\n const state = this.state;\n state[propertyName] = event.target.value;\n this.setState(state);\n }\n}\n","import Button from '@material-ui/core/Button';\nimport Dialog from '@material-ui/core/Dialog';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogContentText from '@material-ui/core/DialogContentText';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport TextField from '@material-ui/core/TextField';\nimport Tooltip from '@material-ui/core/Tooltip';\nimport React, {Component} from 'react';\n\ninterface IProps {\n fClose: VoidFunction;\n fOnSubmit: (name: string) => void;\n initialName: string;\n}\n\ninterface IState {\n name: string;\n}\n\nexport default class UpdateDialog extends Component {\n public state = {name: ''};\n\n public componentWillMount() {\n this.setState({name: this.props.initialName});\n }\n\n public render() {\n const {fClose, fOnSubmit} = this.props;\n const {name} = this.state;\n const submitEnabled = this.state.name.length !== 0;\n const submitAndClose = () => {\n fOnSubmit(name);\n fClose();\n };\n return (\n \n Update a Client\n \n \n A client manages messages, clients, applications and users (with admin\n permissions).\n \n \n \n \n \n \n
\n \n Update\n \n
\n
\n
\n \n );\n }\n\n private handleChange(propertyName: string, event: React.ChangeEvent) {\n const state = {};\n state[propertyName] = event.target.value;\n this.setState(state);\n }\n}\n","import Grid from '@material-ui/core/Grid';\nimport IconButton from '@material-ui/core/IconButton';\nimport Paper from '@material-ui/core/Paper';\nimport Table from '@material-ui/core/Table';\nimport TableBody from '@material-ui/core/TableBody';\nimport TableCell from '@material-ui/core/TableCell';\nimport TableHead from '@material-ui/core/TableHead';\nimport TableRow from '@material-ui/core/TableRow';\nimport Delete from '@material-ui/icons/Delete';\nimport Edit from '@material-ui/icons/Edit';\nimport React, {Component, SFC} from 'react';\nimport ConfirmDialog from '../common/ConfirmDialog';\nimport DefaultPage from '../common/DefaultPage';\nimport Button from '@material-ui/core/Button';\nimport ToggleVisibility from '../common/ToggleVisibility';\nimport AddClientDialog from './AddClientDialog';\nimport UpdateDialog from './UpdateClientDialog';\nimport {observer} from 'mobx-react';\nimport {observable} from 'mobx';\nimport {inject, Stores} from '../inject';\nimport {IClient} from '../types';\n\n@observer\nclass Clients extends Component> {\n @observable\n private showDialog = false;\n @observable\n private deleteId: false | number = false;\n @observable\n private updateId: false | number = false;\n\n public componentDidMount = () => this.props.clientStore.refresh();\n\n public render() {\n const {\n deleteId,\n updateId,\n showDialog,\n props: {clientStore},\n } = this;\n const clients = clientStore.getItems();\n\n return (\n (this.showDialog = true)}>\n Create Client\n \n }>\n \n \n \n \n \n Name\n Token\n \n \n \n \n \n {clients.map((client: IClient) => {\n return (\n (this.updateId = client.id)}\n fDelete={() => (this.deleteId = client.id)}\n />\n );\n })}\n \n
\n
\n
\n {showDialog && (\n (this.showDialog = false)}\n fOnSubmit={clientStore.create}\n />\n )}\n {updateId !== false && (\n (this.updateId = false)}\n fOnSubmit={(name) => clientStore.update(updateId, name)}\n initialName={clientStore.getByID(updateId).name}\n />\n )}\n {deleteId !== false && (\n (this.deleteId = false)}\n fOnSubmit={() => clientStore.remove(deleteId)}\n />\n )}\n \n );\n }\n}\n\ninterface IRowProps {\n name: string;\n value: string;\n fEdit: VoidFunction;\n fDelete: VoidFunction;\n}\n\nconst Row: SFC = ({name, value, fEdit, fDelete}) => (\n \n {name}\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n);\n\nexport default inject('clientStore')(Clients);\n","import React, {Component, SFC} from 'react';\nimport {Link} from 'react-router-dom';\nimport Grid from '@material-ui/core/Grid';\nimport Paper from '@material-ui/core/Paper';\nimport Table from '@material-ui/core/Table';\nimport TableBody from '@material-ui/core/TableBody';\nimport TableCell from '@material-ui/core/TableCell';\nimport TableHead from '@material-ui/core/TableHead';\nimport TableRow from '@material-ui/core/TableRow';\nimport Settings from '@material-ui/icons/Settings';\nimport {Switch, Button} from '@material-ui/core';\nimport DefaultPage from '../common/DefaultPage';\nimport ToggleVisibility from '../common/ToggleVisibility';\nimport {observer} from 'mobx-react';\nimport {inject, Stores} from '../inject';\nimport {IPlugin} from '../types';\n\n@observer\nclass Plugins extends Component> {\n public componentDidMount = () => this.props.pluginStore.refresh();\n\n public render() {\n const {\n props: {pluginStore},\n } = this;\n const plugins = pluginStore.getItems();\n return (\n \n \n \n \n \n \n ID\n Enabled\n Name\n Token\n Details\n \n \n \n {plugins.map((plugin: IPlugin) => {\n return (\n \n this.props.pluginStore.changeEnabledState(\n plugin.id,\n !plugin.enabled\n )\n }\n />\n );\n })}\n \n
\n
\n
\n
\n );\n }\n}\n\ninterface IRowProps {\n id: number;\n name: string;\n token: string;\n enabled: boolean;\n fToggleStatus: VoidFunction;\n}\n\nconst Row: SFC = observer(({name, id, token, enabled, fToggleStatus}) => (\n \n {id}\n \n \n \n {name}\n \n \n \n \n \n \n \n \n \n));\n\nexport default inject('pluginStore')(Plugins);\n","import Paper from '@material-ui/core/Paper';\nimport {withStyles, WithStyles} from '@material-ui/core/styles';\nimport * as React from 'react';\n\nconst styles = () => ({\n paper: {\n padding: 16,\n },\n});\n\ninterface IProps extends WithStyles<'paper'> {\n style?: object;\n}\n\nconst Container: React.SFC = ({classes, children, style}) => {\n return (\n \n {children}\n \n );\n};\n\nexport default withStyles(styles)(Container);\n","import React, {Component} from 'react';\nimport {RouteComponentProps} from 'react-router';\nimport ReactMarkDown from 'react-markdown';\nimport {UnControlled as CodeMirror} from 'react-codemirror2';\nimport 'codemirror/lib/codemirror.css';\nimport 'codemirror/theme/material.css';\nimport 'codemirror/mode/yaml/yaml';\nimport Info from '@material-ui/icons/Info';\nimport Build from '@material-ui/icons/Build';\nimport Subject from '@material-ui/icons/Subject';\nimport Refresh from '@material-ui/icons/Refresh';\nimport Button from '@material-ui/core/Button';\nimport Typography from '@material-ui/core/Typography';\nimport DefaultPage from '../common/DefaultPage';\nimport * as config from '../config';\nimport Container from '../common/Container';\nimport {inject, Stores} from '../inject';\nimport {IPlugin} from '../types';\n\ninterface IProps extends RouteComponentProps<{id: string}> {}\n\ninterface IState {\n displayText: string | null;\n currentConfig: string | null;\n}\n\nclass PluginDetailView extends Component, IState> {\n private pluginID: number = parseInt(this.props.match.params.id, 10);\n private pluginInfo = () => this.props.pluginStore.getByID(this.pluginID);\n\n public state: IState = {\n displayText: null,\n currentConfig: null,\n };\n\n public componentWillMount() {\n this.refreshFeatures();\n }\n\n public componentWillReceiveProps(nextProps: IProps & Stores<'pluginStore'>) {\n this.pluginID = parseInt(nextProps.match.params.id, 10);\n this.refreshFeatures();\n }\n\n private refreshFeatures() {\n return Promise.all([this.refreshConfigurer(), this.refreshDisplayer()]);\n }\n\n private async refreshConfigurer() {\n const {\n props: {pluginStore},\n } = this;\n if (this.pluginInfo().capabilities.indexOf('configurer') !== -1) {\n const response = await pluginStore.requestConfig(this.pluginID);\n this.setState({currentConfig: response});\n }\n }\n\n private async refreshDisplayer() {\n const {\n props: {pluginStore},\n } = this;\n if (this.pluginInfo().capabilities.indexOf('displayer') !== -1) {\n const response = await pluginStore.requestDisplay(this.pluginID);\n this.setState({displayText: response});\n }\n }\n\n public render() {\n const pluginInfo = this.pluginInfo();\n const {name, capabilities} = pluginInfo;\n return (\n \n \n \n \n {capabilities.indexOf('configurer') !== -1 ? (\n \n {\n await this.props.pluginStore.changeConfig(this.pluginID, newConfig);\n await this.refreshFeatures();\n }}\n />\n \n ) : null}{' '}\n {capabilities.indexOf('displayer') !== -1 ? (\n \n \n \n ) : null}\n \n );\n }\n}\n\ninterface IPanelWrapperProps {\n name: string;\n description?: string;\n refresh?: () => Promise;\n icon?: React.ComponentType;\n}\n\nconst PanelWrapper: React.SFC = ({\n name,\n description,\n refresh,\n icon,\n children,\n}) => {\n const Icon = icon;\n return (\n \n \n {Icon ? (\n \n \n  \n \n ) : null}\n {name}\n {refresh ? (\n {\n refresh();\n }}>\n \n \n ) : null}\n \n {description ? {description} : null}\n
\n
{children}
\n
\n );\n};\n\ninterface IConfigurerPanelProps {\n pluginInfo: IPlugin;\n initialConfig: string;\n save: (newConfig: string) => Promise;\n}\nclass ConfigurerPanel extends Component {\n public state = {unsavedChanges: null};\n\n public render() {\n return (\n
\n {\n let newConf: string | null = value;\n if (value === this.props.initialConfig) {\n newConf = null;\n }\n this.setState({unsavedChanges: newConf});\n }}\n />\n
\n {\n const newConfig = this.state.unsavedChanges;\n this.props.save(newConfig!).then(() => {\n this.setState({unsavedChanges: null});\n });\n }}>\n Save\n \n
\n );\n }\n}\n\ninterface IDisplayerPanelProps {\n pluginInfo: IPlugin;\n displayText: string;\n}\nconst DisplayerPanel: React.SFC = ({pluginInfo, displayText}) => (\n \n \n \n);\n\nclass PluginInfo extends Component<{pluginInfo: IPlugin}> {\n public render() {\n const {\n props: {\n pluginInfo: {name, author, modulePath, website, license, capabilities, id, token},\n },\n } = this;\n return (\n
\n {name ? (\n \n Name: {name}\n \n ) : null}\n {author ? (\n \n Author: {author}\n \n ) : null}\n \n Module Path: {modulePath}\n \n {website ? (\n \n Website: {website}\n \n ) : null}\n {license ? (\n \n License: {license}\n \n ) : null}\n \n Capabilities: {capabilities.join(', ')}\n \n {capabilities.indexOf('webhooker') !== -1 ? (\n \n Custom Route Prefix:{' '}\n {((url) => (\n \n {url}\n \n ))(`${config.get('url')}plugin/${id}/custom/${token}/`)}\n \n ) : null}\n
\n );\n }\n}\n\nexport default inject('pluginStore')(PluginDetailView);\n","import Button from '@material-ui/core/Button';\nimport Dialog from '@material-ui/core/Dialog';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport TextField from '@material-ui/core/TextField';\nimport Tooltip from '@material-ui/core/Tooltip';\nimport React, {ChangeEvent, Component} from 'react';\n\ninterface IProps {\n name?: string;\n fClose: VoidFunction;\n fOnSubmit: (name: string, pass: string) => void;\n}\n\ninterface IState {\n name: string;\n pass: string;\n}\n\nexport default class RegistrationDialog extends Component {\n public state = {\n name: '',\n pass: '',\n };\n\n public render() {\n const {fClose, fOnSubmit} = this.props;\n const {name, pass} = this.state;\n const namePresent = this.state.name.length !== 0;\n const passPresent = this.state.pass.length !== 0;\n const submitAndClose = () => {\n fOnSubmit(name, pass);\n fClose();\n };\n return (\n \n \n Registration\n \n \n \n \n \n \n \n \n
\n \n Register\n \n
\n \n
\n \n );\n }\n\n private handleChange(propertyName: string, event: ChangeEvent) {\n const state = this.state;\n state[propertyName] = event.target.value;\n this.setState(state);\n }\n}\n","import Button from '@material-ui/core/Button';\nimport Grid from '@material-ui/core/Grid';\nimport TextField from '@material-ui/core/TextField';\nimport React, {Component, FormEvent} from 'react';\nimport Container from '../common/Container';\nimport DefaultPage from '../common/DefaultPage';\nimport {observable} from 'mobx';\nimport {observer} from 'mobx-react';\nimport {inject, Stores} from '../inject';\nimport RegistrationDialog from './Register';\nimport axios from 'axios';\n\n@observer\nclass Login extends Component> {\n @observable\n private username = '';\n @observable\n private password = '';\n @observable\n private registerDialog = false;\n\n public render() {\n const {username, password, registerDialog} = this;\n return (\n (this.registerDialog = true)}>\n Register\n \n }\n maxWidth={250}>\n \n \n
\n (this.username = e.target.value)}\n />\n (this.password = e.target.value)}\n />\n \n Login\n \n \n
\n
\n {registerDialog && (\n (this.registerDialog = false)}\n fOnSubmit={this.register}\n />\n )}\n \n );\n }\n\n private login = (e: React.MouseEvent) => {\n e.preventDefault();\n this.props.currentUser.login(this.username, this.password);\n };\n\n private register = async (name: string, pass: string) => {\n await axios.post(\"/registration\", {name, pass});\n };\n\n private preventDefault = (e: FormEvent) => e.preventDefault();\n}\n\nexport default inject('currentUser')(Login);\n","import IconButton from '@material-ui/core/IconButton';\nimport {createStyles, Theme, withStyles, WithStyles} from '@material-ui/core/styles';\nimport Typography from '@material-ui/core/Typography';\nimport Delete from '@material-ui/icons/Delete';\nimport React from 'react';\nimport TimeAgo from 'react-timeago';\nimport Container from '../common/Container';\nimport * as config from '../config';\nimport ReactMarkdown from 'react-markdown';\nimport {RenderMode, contentType} from './extras';\nimport {IMessageExtras} from '../types';\n\nconst styles = (theme: Theme) =>\n createStyles({\n header: {\n display: 'flex',\n flexWrap: 'wrap',\n marginBottom: 0,\n },\n headerTitle: {\n flex: 1,\n },\n trash: {\n marginTop: -15,\n marginRight: -15,\n },\n wrapperPadding: {\n padding: 12,\n },\n messageContentWrapper: {\n width: '100%',\n maxWidth: 585,\n },\n image: {\n marginRight: 15,\n [theme.breakpoints.down('sm')]: {\n width: 32,\n height: 32,\n },\n },\n date: {\n [theme.breakpoints.down('sm')]: {\n order: 1,\n flexBasis: '100%',\n opacity: 0.7,\n },\n },\n imageWrapper: {\n display: 'flex',\n },\n content: {\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-all',\n '& p': {\n margin: 0,\n },\n '& a': {\n color: '#ff7f50',\n },\n '& pre': {\n overflow: 'auto',\n },\n },\n });\n\ninterface IProps {\n title: string;\n image?: string;\n date: string;\n content: string;\n fDelete: VoidFunction;\n extras?: IMessageExtras;\n height: (height: number) => void;\n}\n\nclass Message extends React.PureComponent> {\n private node: HTMLDivElement | null = null;\n\n public componentDidMount = () =>\n this.props.height(this.node ? this.node.getBoundingClientRect().height : 0);\n\n private renderContent = () => {\n const content = this.props.content;\n switch (contentType(this.props.extras)) {\n case RenderMode.Markdown:\n return ;\n case RenderMode.Plain:\n default:\n return content;\n }\n };\n\n public render(): React.ReactNode {\n const {fDelete, classes, title, date, image} = this.props;\n\n return (\n
(this.node = ref)}>\n \n
\n {image !== null ? (\n \n ) : null}\n
\n
\n
\n \n {title}\n \n \n \n \n \n \n \n
\n \n {this.renderContent()}\n \n
\n
\n
\n );\n }\n}\n\nexport default withStyles(styles, {withTheme: true})(Message);\n","import CircularProgress from '@material-ui/core/CircularProgress';\nimport Grid from '@material-ui/core/Grid';\nimport Typography from '@material-ui/core/Typography';\nimport React, {Component} from 'react';\nimport {RouteComponentProps} from 'react-router';\nimport DefaultPage from '../common/DefaultPage';\nimport Button from '@material-ui/core/Button';\nimport Message from './Message';\nimport {observer} from 'mobx-react';\nimport {inject, Stores} from '../inject';\nimport {observable} from 'mobx';\nimport ReactInfinite from 'react-infinite';\nimport {IMessage} from '../types';\n\ninterface IProps extends RouteComponentProps<{id: string}> {}\n\ninterface IState {\n appId: number;\n}\n\n@observer\nclass Messages extends Component, IState> {\n @observable\n private heights: Record = {};\n\n private static appId(props: IProps) {\n if (props === undefined) {\n return -1;\n }\n const {match} = props;\n return match.params.id !== undefined ? parseInt(match.params.id, 10) : -1;\n }\n\n public state = {appId: -1};\n\n private isLoadingMore = false;\n\n public componentWillReceiveProps(nextProps: IProps & Stores<'messagesStore' | 'appStore'>) {\n this.updateAllWithProps(nextProps);\n }\n\n public componentWillMount() {\n window.onscroll = () => {\n if (\n window.innerHeight + window.pageYOffset >=\n document.body.offsetHeight - window.innerHeight * 2\n ) {\n this.checkIfLoadMore();\n }\n };\n this.updateAll();\n }\n\n public render() {\n const {appId} = this.state;\n const {messagesStore, appStore} = this.props;\n const messages = messagesStore.get(appId);\n const hasMore = messagesStore.canLoadMore(appId);\n const name = appStore.getName(appId);\n const hasMessages = messages.length !== 0;\n\n return (\n \n messagesStore.refreshByApp(appId)}\n style={{marginRight: 5}}>\n Refresh\n \n messagesStore.removeByApp(appId)}>\n Delete All\n \n
\n }>\n {hasMessages ? (\n
\n this.heights[m.id] || 1)}>\n {messages.map(this.renderMessage)}\n \n\n {hasMore ? (\n \n \n \n ) : (\n this.label(\"You've reached the end\")\n )}\n
\n ) : (\n this.label('No messages')\n )}\n \n );\n }\n\n private updateAllWithProps = (props: IProps & Stores<'messagesStore'>) => {\n const appId = Messages.appId(props);\n this.setState({appId});\n if (!props.messagesStore.exists(appId)) {\n props.messagesStore.loadMore(appId);\n }\n };\n\n private updateAll = () => this.updateAllWithProps(this.props);\n\n private deleteMessage = (message: IMessage) => () =>\n this.props.messagesStore.removeSingle(message);\n\n private renderMessage = (message: IMessage) => {\n return (\n {\n if (!this.heights[message.id]) {\n this.heights[message.id] = height;\n }\n }}\n fDelete={this.deleteMessage(message)}\n title={message.title}\n date={message.date}\n content={message.message}\n image={message.image}\n extras={message.extras}\n />\n );\n };\n\n private checkIfLoadMore() {\n const {appId} = this.state;\n if (!this.isLoadingMore && this.props.messagesStore.canLoadMore(appId)) {\n this.isLoadingMore = true;\n this.props.messagesStore.loadMore(appId).then(() => (this.isLoadingMore = false));\n }\n }\n\n private label = (text: string) => (\n \n \n {text}\n \n \n );\n}\n\nexport default inject('messagesStore', 'appStore')(Messages);\n","import Button from '@material-ui/core/Button';\nimport Dialog from '@material-ui/core/Dialog';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport FormControlLabel from '@material-ui/core/FormControlLabel';\nimport Switch from '@material-ui/core/Switch';\nimport TextField from '@material-ui/core/TextField';\nimport Tooltip from '@material-ui/core/Tooltip';\nimport React, {ChangeEvent, Component} from 'react';\n\ninterface IProps {\n name?: string;\n admin?: boolean;\n fClose: VoidFunction;\n fOnSubmit: (name: string, pass: string, admin: boolean) => void;\n isEdit?: boolean;\n}\n\ninterface IState {\n name: string;\n pass: string;\n admin: boolean;\n}\n\nexport default class AddEditDialog extends Component {\n public state = {\n name: '',\n pass: '',\n admin: false,\n };\n\n public render() {\n const {fClose, fOnSubmit, isEdit} = this.props;\n const {name, pass, admin} = this.state;\n const namePresent = this.state.name.length !== 0;\n const passPresent = this.state.pass.length !== 0 || isEdit;\n const submitAndClose = () => {\n fOnSubmit(name, pass, admin);\n fClose();\n };\n return (\n \n \n {isEdit ? 'Edit ' + this.props.name : 'Add a user'}\n \n \n \n \n \n }\n label=\"has administrator rights\"\n />\n \n \n \n \n
\n \n {isEdit ? 'Save' : 'Create'}\n \n
\n \n
\n \n );\n }\n\n public componentWillMount() {\n const {name, admin} = this.props;\n this.setState({...this.state, name: name || '', admin: admin || false});\n }\n\n private handleChange(propertyName: string, event: ChangeEvent) {\n const state = this.state;\n state[propertyName] = event.target.value;\n this.setState(state);\n }\n\n private handleChecked(propertyName: string, event: ChangeEvent) {\n const state = this.state;\n state[propertyName] = event.target.checked;\n this.setState(state);\n }\n}\n","import Grid from '@material-ui/core/Grid';\nimport IconButton from '@material-ui/core/IconButton';\nimport Paper from '@material-ui/core/Paper';\nimport {withStyles, WithStyles} from '@material-ui/core/styles';\nimport Table from '@material-ui/core/Table';\nimport TableBody from '@material-ui/core/TableBody';\nimport TableCell from '@material-ui/core/TableCell';\nimport TableHead from '@material-ui/core/TableHead';\nimport TableRow from '@material-ui/core/TableRow';\nimport Delete from '@material-ui/icons/Delete';\nimport Edit from '@material-ui/icons/Edit';\nimport React, {Component, SFC} from 'react';\nimport ConfirmDialog from '../common/ConfirmDialog';\nimport DefaultPage from '../common/DefaultPage';\nimport Button from '@material-ui/core/Button';\nimport AddEditDialog from './AddEditUserDialog';\nimport {observer} from 'mobx-react';\nimport {observable} from 'mobx';\nimport {inject, Stores} from '../inject';\nimport {IUser} from '../types';\n\nconst styles = () => ({\n wrapper: {\n margin: '0 auto',\n maxWidth: 700,\n },\n});\n\ninterface IRowProps {\n name: string;\n admin: boolean;\n fDelete: VoidFunction;\n fEdit: VoidFunction;\n}\n\nconst UserRow: SFC = ({name, admin, fDelete, fEdit}) => (\n \n {name}\n {admin ? 'Yes' : 'No'}\n \n \n \n \n \n \n \n \n \n);\n\n@observer\nclass Users extends Component & Stores<'userStore'>> {\n @observable\n private createDialog = false;\n @observable\n private deleteId: number | false = false;\n @observable\n private editId: number | false = false;\n\n public componentDidMount = () => this.props.userStore.refresh();\n\n public render() {\n const {\n deleteId,\n editId,\n createDialog,\n props: {userStore},\n } = this;\n const users = userStore.getItems();\n return (\n (this.createDialog = true)}>\n Create User\n \n }>\n \n \n \n \n \n Name\n Admin\n \n \n \n \n {users.map((user: IUser) => {\n return (\n (this.deleteId = user.id)}\n fEdit={() => (this.editId = user.id)}\n />\n );\n })}\n \n
\n
\n
\n {createDialog && (\n (this.createDialog = false)}\n fOnSubmit={userStore.create}\n />\n )}\n {editId !== false && (\n (this.editId = false)}\n fOnSubmit={userStore.update.bind(this, editId)}\n name={userStore.getByID(editId).name}\n admin={userStore.getByID(editId).admin}\n isEdit={true}\n />\n )}\n {deleteId !== false && (\n (this.deleteId = false)}\n fOnSubmit={() => userStore.remove(deleteId)}\n />\n )}\n \n );\n }\n}\n\nexport default withStyles(styles)(inject('userStore')(Users));\n","import React from 'react';\nimport Button from '@material-ui/core/Button';\nimport Typography from '@material-ui/core/Typography';\n\ninterface ConnectionErrorBannerProps {\n height: number;\n retry: () => void;\n message: string;\n}\n\nexport const ConnectionErrorBanner = ({height, retry, message}: ConnectionErrorBannerProps) => {\n return (\n \n \n {message}{' '}\n \n \n \n );\n};\n","import {createMuiTheme, MuiThemeProvider, Theme, WithStyles, withStyles} from '@material-ui/core';\nimport CssBaseline from '@material-ui/core/CssBaseline';\nimport axios, {AxiosResponse} from 'axios';\nimport * as React from 'react';\nimport {HashRouter, Redirect, Route, Switch} from 'react-router-dom';\nimport Header from './Header';\nimport LoadingSpinner from '../common/LoadingSpinner';\nimport Navigation from './Navigation';\nimport ScrollUpButton from '../common/ScrollUpButton';\nimport SettingsDialog from '../common/SettingsDialog';\nimport SnackBarHandler from '../snack/SnackBarHandler';\nimport * as config from '../config';\nimport Applications from '../application/Applications';\nimport Clients from '../client/Clients';\nimport Plugins from '../plugin/Plugins';\nimport PluginDetailView from '../plugin/PluginDetailView';\nimport Login from '../user/Login';\nimport Messages from '../message/Messages';\nimport Users from '../user/Users';\nimport {observer} from 'mobx-react';\nimport {observable} from 'mobx';\nimport {inject, Stores} from '../inject';\nimport {ConnectionErrorBanner} from '../common/ConnectionErrorBanner';\nimport {IVersion} from '../types';\n\nconst styles = (theme: Theme) => ({\n content: {\n margin: '0 auto',\n marginTop: 64,\n padding: theme.spacing(4),\n width: '100%',\n [theme.breakpoints.down('xs')]: {\n marginTop: 0,\n },\n },\n});\n\nconst localStorageThemeKey = 'gotify-theme';\ntype ThemeKey = 'dark' | 'light';\nconst themeMap: Record = {\n light: createMuiTheme({\n palette: {\n type: 'light',\n },\n }),\n dark: createMuiTheme({\n palette: {\n type: 'dark',\n },\n }),\n};\n\nconst isThemeKey = (value: string | null): value is ThemeKey => {\n return value === 'light' || value === 'dark';\n};\n\n@observer\nclass Layout extends React.Component<\n WithStyles<'content'> & Stores<'currentUser' | 'snackManager'>\n> {\n private static defaultVersion = '0.0.0';\n\n @observable\n private currentTheme: ThemeKey = 'dark';\n @observable\n private showSettings = false;\n @observable\n private version = Layout.defaultVersion;\n @observable\n private navOpen = false;\n\n private setNavOpen(open: boolean) {\n this.navOpen = open;\n }\n\n public componentDidMount() {\n if (this.version === Layout.defaultVersion) {\n axios.get(config.get('url') + 'version').then((resp: AxiosResponse) => {\n this.version = resp.data.version;\n });\n }\n\n const localStorageTheme = window.localStorage.getItem(localStorageThemeKey);\n if (isThemeKey(localStorageTheme)) {\n this.currentTheme = localStorageTheme;\n } else {\n window.localStorage.setItem(localStorageThemeKey, this.currentTheme);\n }\n }\n\n public render() {\n const {version, showSettings, currentTheme} = this;\n const {\n classes,\n currentUser: {\n loggedIn,\n authenticating,\n user: {name, admin},\n logout,\n tryReconnect,\n connectionErrorMessage,\n },\n } = this.props;\n const theme = themeMap[currentTheme];\n const loginRoute = () => (loggedIn ? : );\n return (\n \n \n
\n {!connectionErrorMessage ? null : (\n tryReconnect()}\n message={connectionErrorMessage}\n />\n )}\n
\n \n (this.showSettings = true)}\n logout={logout}\n setNavOpen={this.setNavOpen.bind(this)}\n />\n
\n \n
\n \n {authenticating ? (\n \n \n \n ) : null}\n \n {loggedIn ? null : }\n \n \n \n \n \n \n \n \n
\n
\n {showSettings && (\n (this.showSettings = false)} />\n )}\n \n \n
\n
\n
\n
\n );\n }\n\n private toggleTheme() {\n this.currentTheme = this.currentTheme === 'dark' ? 'light' : 'dark';\n localStorage.setItem(localStorageThemeKey, this.currentTheme);\n }\n}\n\nexport default withStyles(styles, {withTheme: true})(inject('currentUser', 'snackManager')(Layout));\n","// In production, we register a service worker to serve assets from local cache.\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 the 'N+1' visit to a page, since previously\n// cached resources are updated in the background.\n\n// To learn more about the benefits of this model, read https://goo.gl/KwvDNy.\n// This link also includes instructions on opting out of this behavior.\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(/^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/)\n);\n\nexport default function register() {\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.toString());\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/facebookincubator/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. Lets check if a service worker still exists or not.\n checkValidServiceWorker(swUrl);\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 https://goo.gl/SC7cgQ'\n );\n });\n } else {\n // Is not local host. Just register service worker\n registerValidSW(swUrl);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl: string) {\n if (!window.location.href.match('^([^/]*\\\\/)(.*\\\\.js|.*.html|static\\\\/.*|)$')) {\n return;\n }\n navigator.serviceWorker\n .register(swUrl)\n .then((registration) => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker) {\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the old content will have been purged and\n // the fresh content will have been added to the cache.\n // It's the perfect time to display a 'New content is\n // available; please refresh.' message in your web app.\n console.log('New content is available; please refresh.');\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 }\n };\n }\n };\n })\n .catch((error) => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl: string) {\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 if (\n response.status === 404 ||\n response.headers.get('content-type')!.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);\n }\n })\n .catch(() => {\n console.log('No internet connection found. App is running in offline mode.');\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 axios, {AxiosError, AxiosResponse} from 'axios';\nimport * as config from './config';\nimport {Base64} from 'js-base64';\nimport {detect} from 'detect-browser';\nimport {SnackReporter} from './snack/SnackManager';\nimport {observable} from 'mobx';\nimport {IClient, IUser} from './types';\n\nconst tokenKey = 'gotify-login-key';\n\nexport class CurrentUser {\n private tokenCache: string | null = null;\n private reconnectTimeoutId: number | null = null;\n private reconnectTime = 7500;\n @observable\n public loggedIn = false;\n @observable\n public authenticating = false;\n @observable\n public user: IUser = {name: 'unknown', admin: false, id: -1};\n @observable\n public connectionErrorMessage: string | null = null;\n\n public constructor(private readonly snack: SnackReporter) {}\n\n public token = (): string => {\n if (this.tokenCache !== null) {\n return this.tokenCache;\n }\n\n const localStorageToken = window.localStorage.getItem(tokenKey);\n if (localStorageToken) {\n this.tokenCache = localStorageToken;\n return localStorageToken;\n }\n\n return '';\n };\n\n private readonly setToken = (token: string) => {\n this.tokenCache = token;\n window.localStorage.setItem(tokenKey, token);\n };\n\n public login = async (username: string, password: string) => {\n this.loggedIn = false;\n this.authenticating = true;\n const browser = detect();\n const name = (browser && browser.name + ' ' + browser.version) || 'unknown browser';\n axios\n .create()\n .request({\n url: config.get('url') + 'client',\n method: 'POST',\n data: {name},\n // eslint-disable-next-line @typescript-eslint/naming-convention\n headers: {Authorization: 'Basic ' + Base64.encode(username + ':' + password)},\n })\n .then((resp: AxiosResponse) => {\n this.snack(`A client named '${name}' was created for your session.`);\n this.setToken(resp.data.token);\n this.tryAuthenticate()\n .then(() => {\n this.authenticating = false;\n this.loggedIn = true;\n })\n .catch(() => {\n this.authenticating = false;\n console.log(\n 'create client succeeded, but authenticated with given token failed'\n );\n });\n })\n .catch(() => {\n this.authenticating = false;\n return this.snack('Login failed');\n });\n };\n\n public tryAuthenticate = async (): Promise> => {\n if (this.token() === '') {\n return Promise.reject();\n }\n\n return (\n axios\n .create()\n // eslint-disable-next-line @typescript-eslint/naming-convention\n .get(config.get('url') + 'current/user', {headers: {'X-Gotify-Key': this.token()}})\n .then((passThrough) => {\n this.user = passThrough.data;\n this.loggedIn = true;\n this.connectionErrorMessage = null;\n this.reconnectTime = 7500;\n return passThrough;\n })\n .catch((error: AxiosError) => {\n if (!error || !error.response) {\n this.connectionError('No network connection or server unavailable.');\n return Promise.reject(error);\n }\n\n if (error.response.status >= 500) {\n this.connectionError(\n `${error.response.statusText} (code: ${error.response.status}).`\n );\n return Promise.reject(error);\n }\n\n this.connectionErrorMessage = null;\n\n if (error.response.status >= 400 && error.response.status < 500) {\n this.logout();\n }\n return Promise.reject(error);\n })\n );\n };\n\n public logout = async () => {\n await axios\n .get(config.get('url') + 'client')\n .then((resp: AxiosResponse) => {\n resp.data\n .filter((client) => client.token === this.tokenCache)\n .forEach((client) => axios.delete(config.get('url') + 'client/' + client.id));\n })\n .catch(() => Promise.resolve());\n window.localStorage.removeItem(tokenKey);\n this.tokenCache = null;\n this.loggedIn = false;\n };\n\n public changePassword = (pass: string) => {\n axios\n .post(config.get('url') + 'current/user/password', {pass})\n .then(() => this.snack('Password changed'));\n };\n\n public tryReconnect = (quiet = false) => {\n this.tryAuthenticate().catch(() => {\n if (!quiet) {\n this.snack('Reconnect failed');\n }\n });\n };\n\n private readonly connectionError = (message: string) => {\n this.connectionErrorMessage = message;\n if (this.reconnectTimeoutId !== null) {\n window.clearTimeout(this.reconnectTimeoutId);\n }\n this.reconnectTimeoutId = window.setTimeout(\n () => this.tryReconnect(true),\n this.reconnectTime\n );\n this.reconnectTime = Math.min(this.reconnectTime * 2, 120000);\n };\n}\n","import {action, observable} from 'mobx';\n\ninterface HasID {\n id: number;\n}\n\nexport interface IClearable {\n clear(): void;\n}\n\n/**\n * Base implementation for handling items with ids.\n */\nexport abstract class BaseStore implements IClearable {\n @observable\n protected items: T[] = [];\n\n protected abstract requestItems(): Promise;\n\n protected abstract requestDelete(id: number): Promise;\n\n @action\n public remove = async (id: number): Promise => {\n await this.requestDelete(id);\n await this.refresh();\n };\n\n @action\n public refresh = async (): Promise => {\n this.items = await this.requestItems().then((items) => items || []);\n };\n\n public getByID = (id: number): T => {\n const item = this.getByIDOrUndefined(id);\n if (item === undefined) {\n throw new Error('cannot find item with id ' + id);\n }\n return item;\n };\n\n public getByIDOrUndefined = (id: number): T | undefined => {\n return this.items.find((hasId: HasID) => hasId.id === id);\n };\n\n public getItems = (): T[] => this.items;\n\n @action\n public clear = (): void => {\n this.items = [];\n };\n}\n","import {BaseStore} from '../common/BaseStore';\nimport axios from 'axios';\nimport * as config from '../config';\nimport {action} from 'mobx';\nimport {SnackReporter} from '../snack/SnackManager';\nimport {IApplication} from '../types';\n\nexport class AppStore extends BaseStore {\n public onDelete: () => void = () => {};\n\n public constructor(private readonly snack: SnackReporter) {\n super();\n }\n\n protected requestItems = (): Promise => {\n return axios\n .get(`${config.get('url')}application`)\n .then((response) => response.data);\n };\n\n protected requestDelete = (id: number): Promise => {\n return axios.delete(`${config.get('url')}application/${id}`).then(() => {\n this.onDelete();\n return this.snack('Application deleted');\n });\n };\n\n @action\n public uploadImage = async (id: number, file: Blob): Promise => {\n const formData = new FormData();\n formData.append('file', file);\n await axios.post(`${config.get('url')}application/${id}/image`, formData, {\n headers: {'content-type': 'multipart/form-data'},\n });\n await this.refresh();\n this.snack('Application image updated');\n };\n\n @action\n public update = async (id: number, name: string, description: string): Promise => {\n await axios.put(`${config.get('url')}application/${id}`, {name, description});\n await this.refresh();\n this.snack('Application updated');\n };\n\n @action\n public create = async (name: string, description: string): Promise => {\n await axios.post(`${config.get('url')}application`, {name, description});\n await this.refresh();\n this.snack('Application created');\n };\n\n public getName = (id: number): string => {\n const app = this.getByIDOrUndefined(id);\n return id === -1 ? 'All Messages' : app !== undefined ? app.name : 'unknown';\n };\n}\n","import {SnackReporter} from '../snack/SnackManager';\nimport {CurrentUser} from '../CurrentUser';\nimport * as config from '../config';\nimport {AxiosError} from 'axios';\nimport {IMessage} from '../types';\n\nexport class WebSocketStore {\n private wsActive = false;\n private ws: WebSocket | null = null;\n\n public constructor(\n private readonly snack: SnackReporter,\n private readonly currentUser: CurrentUser\n ) {}\n\n public listen = (callback: (msg: IMessage) => void) => {\n if (!this.currentUser.token() || this.wsActive) {\n return;\n }\n this.wsActive = true;\n\n const wsUrl = config.get('url').replace('http', 'ws').replace('https', 'wss');\n const ws = new WebSocket(wsUrl + 'stream?token=' + this.currentUser.token());\n\n ws.onerror = (e) => {\n this.wsActive = false;\n console.log('WebSocket connection errored', e);\n };\n\n ws.onmessage = (data) => callback(JSON.parse(data.data));\n\n ws.onclose = () => {\n this.wsActive = false;\n this.currentUser\n .tryAuthenticate()\n .then(() => {\n this.snack('WebSocket connection closed, trying again in 30 seconds.');\n setTimeout(() => this.listen(callback), 30000);\n })\n .catch((error: AxiosError) => {\n if (error && error.response && error.response.status === 401) {\n this.snack('Could not authenticate with client token, logging out.');\n }\n });\n };\n\n this.ws = ws;\n };\n\n public close = () => this.ws && this.ws.close(1000, 'WebSocketStore#close');\n}\n","import {action, observable} from 'mobx';\n\nexport interface SnackReporter {\n (message: string): void;\n}\n\nexport class SnackManager {\n @observable\n private messages: string[] = [];\n @observable\n public message: string | null = null;\n @observable\n public counter = 0;\n\n @action\n public next = (): void => {\n if (!this.hasNext()) {\n throw new Error('There is nothing here :(');\n }\n this.message = this.messages.shift() as string;\n };\n\n public hasNext = () => this.messages.length > 0;\n\n @action\n public snack: SnackReporter = (message: string): void => {\n this.messages.push(message);\n this.counter++;\n };\n}\n","import {BaseStore} from '../common/BaseStore';\nimport axios from 'axios';\nimport * as config from '../config';\nimport {action} from 'mobx';\nimport {SnackReporter} from '../snack/SnackManager';\nimport {IUser} from '../types';\n\nexport class UserStore extends BaseStore {\n constructor(private readonly snack: SnackReporter) {\n super();\n }\n\n protected requestItems = (): Promise => {\n return axios.get(`${config.get('url')}user`).then((response) => response.data);\n };\n\n protected requestDelete(id: number): Promise {\n return axios\n .delete(`${config.get('url')}user/${id}`)\n .then(() => this.snack('User deleted'));\n }\n\n @action\n public create = async (name: string, pass: string, admin: boolean) => {\n await axios.post(`${config.get('url')}user`, {name, pass, admin});\n await this.refresh();\n this.snack('User created');\n };\n\n @action\n public update = async (id: number, name: string, pass: string | null, admin: boolean) => {\n await axios.post(config.get('url') + 'user/' + id, {name, pass, admin});\n await this.refresh();\n this.snack('User updated');\n };\n}\n","import {BaseStore} from '../common/BaseStore';\nimport {action, IObservableArray, observable, reaction} from 'mobx';\nimport axios, {AxiosResponse} from 'axios';\nimport * as config from '../config';\nimport {createTransformer} from 'mobx-utils';\nimport {SnackReporter} from '../snack/SnackManager';\nimport {IApplication, IMessage, IPagedMessages} from '../types';\n\nconst AllMessages = -1;\n\ninterface MessagesState {\n messages: IObservableArray;\n hasMore: boolean;\n nextSince: number;\n loaded: boolean;\n}\n\nexport class MessagesStore {\n @observable\n private state: Record = {};\n\n private loading = false;\n\n public constructor(\n private readonly appStore: BaseStore,\n private readonly snack: SnackReporter\n ) {\n reaction(() => appStore.getItems(), this.createEmptyStatesForApps);\n }\n\n private stateOf = (appId: number, create = true) => {\n if (!this.state[appId] && create) {\n this.state[appId] = this.emptyState();\n }\n return this.state[appId] || this.emptyState();\n };\n\n public canLoadMore = (appId: number) => this.stateOf(appId, /*create*/ false).hasMore;\n\n @action\n public loadMore = async (appId: number) => {\n const state = this.stateOf(appId);\n if (!state.hasMore || this.loading) {\n return Promise.resolve();\n }\n this.loading = true;\n\n const pagedResult = await this.fetchMessages(appId, state.nextSince).then(\n (resp) => resp.data\n );\n\n state.messages.replace([...state.messages, ...pagedResult.messages]);\n state.nextSince = pagedResult.paging.since || 0;\n state.hasMore = 'next' in pagedResult.paging;\n state.loaded = true;\n this.loading = false;\n return Promise.resolve();\n };\n\n @action\n public publishSingleMessage = (message: IMessage) => {\n if (this.exists(AllMessages)) {\n this.stateOf(AllMessages).messages.unshift(message);\n }\n if (this.exists(message.appid)) {\n this.stateOf(message.appid).messages.unshift(message);\n }\n };\n\n @action\n public removeByApp = async (appId: number) => {\n if (appId === AllMessages) {\n await axios.delete(config.get('url') + 'message');\n this.snack('Deleted all messages');\n this.clearAll();\n } else {\n await axios.delete(config.get('url') + 'application/' + appId + '/message');\n this.snack(`Deleted all messages from ${this.appStore.getByID(appId).name}`);\n this.clear(AllMessages);\n this.clear(appId);\n }\n await this.loadMore(appId);\n };\n\n @action\n public removeSingle = async (message: IMessage) => {\n await axios.delete(config.get('url') + 'message/' + message.id);\n if (this.exists(AllMessages)) {\n this.removeFromList(this.state[AllMessages].messages, message);\n }\n if (this.exists(message.appid)) {\n this.removeFromList(this.state[message.appid].messages, message);\n }\n this.snack('Message deleted');\n };\n\n @action\n public clearAll = () => {\n this.state = {};\n this.createEmptyStatesForApps(this.appStore.getItems());\n };\n\n @action\n public refreshByApp = async (appId: number) => {\n this.clearAll();\n this.loadMore(appId);\n };\n\n public exists = (id: number) => this.stateOf(id).loaded;\n\n private removeFromList(messages: IMessage[], messageToDelete: IMessage): false | number {\n if (messages) {\n const index = messages.findIndex((message) => message.id === messageToDelete.id);\n if (index !== -1) {\n messages.splice(index, 1);\n return index;\n }\n }\n return false;\n }\n\n private clear = (appId: number) => (this.state[appId] = this.emptyState());\n\n private fetchMessages = (\n appId: number,\n since: number\n ): Promise> => {\n if (appId === AllMessages) {\n return axios.get(config.get('url') + 'message?since=' + since);\n } else {\n return axios.get(\n config.get('url') + 'application/' + appId + '/message?since=' + since\n );\n }\n };\n\n private getUnCached = (appId: number): Array => {\n const appToImage = this.appStore\n .getItems()\n .reduce((all, app) => ({...all, [app.id]: app.image}), {});\n\n return this.stateOf(appId, false).messages.map((message: IMessage) => {\n return {\n ...message,\n image: appToImage[message.appid] || null,\n };\n });\n };\n\n public get = createTransformer(this.getUnCached);\n\n private clearCache = () => (this.get = createTransformer(this.getUnCached));\n\n private createEmptyStatesForApps = (apps: IApplication[]) => {\n apps.map((app) => app.id).forEach((id) => this.stateOf(id, /*create*/ true));\n this.clearCache();\n };\n\n private emptyState = (): MessagesState => ({\n messages: observable.array(),\n hasMore: true,\n nextSince: 0,\n loaded: false,\n });\n}\n","import {BaseStore} from '../common/BaseStore';\nimport axios from 'axios';\nimport * as config from '../config';\nimport {action} from 'mobx';\nimport {SnackReporter} from '../snack/SnackManager';\nimport {IClient} from '../types';\n\nexport class ClientStore extends BaseStore {\n public constructor(private readonly snack: SnackReporter) {\n super();\n }\n\n protected requestItems = (): Promise => {\n return axios.get(`${config.get('url')}client`).then((response) => response.data);\n };\n\n protected requestDelete(id: number): Promise {\n return axios\n .delete(`${config.get('url')}client/${id}`)\n .then(() => this.snack('Client deleted'));\n }\n\n @action\n public update = async (id: number, name: string): Promise => {\n await axios.put(`${config.get('url')}client/${id}`, {name});\n await this.refresh();\n this.snack('Client updated');\n };\n\n @action\n public createNoNotifcation = async (name: string): Promise => {\n const client = await axios.post(`${config.get('url')}client`, {name});\n await this.refresh();\n return client.data;\n };\n\n @action\n public create = async (name: string): Promise => {\n await this.createNoNotifcation(name);\n this.snack('Client added');\n };\n}\n","import axios from 'axios';\nimport {action} from 'mobx';\nimport {BaseStore} from '../common/BaseStore';\nimport * as config from '../config';\nimport {SnackReporter} from '../snack/SnackManager';\nimport {IPlugin} from '../types';\n\nexport class PluginStore extends BaseStore {\n public onDelete: () => void = () => {};\n\n public constructor(private readonly snack: SnackReporter) {\n super();\n }\n\n public requestConfig = (id: number): Promise => {\n return axios\n .get(`${config.get('url')}plugin/${id}/config`)\n .then((response) => response.data);\n };\n\n public requestDisplay = (id: number): Promise => {\n return axios\n .get(`${config.get('url')}plugin/${id}/display`)\n .then((response) => response.data);\n };\n\n protected requestItems = (): Promise => {\n return axios.get(`${config.get('url')}plugin`).then((response) => response.data);\n };\n\n protected requestDelete = (id: number): Promise => {\n this.snack('Cannot delete plugin');\n throw new Error('Cannot delete plugin');\n };\n\n public getName = (id: number): string => {\n const plugin = this.getByIDOrUndefined(id);\n return id === -1 ? 'All Plugins' : plugin !== undefined ? plugin.name : 'unknown';\n };\n\n @action\n public changeConfig = async (id: number, newConfig: string): Promise => {\n await axios.post(`${config.get('url')}plugin/${id}/config`, newConfig, {\n headers: {'content-type': 'application/x-yaml'},\n });\n this.snack(`Plugin config updated`);\n await this.refresh();\n };\n\n @action\n public changeEnabledState = async (id: number, enabled: boolean): Promise => {\n await axios.post(`${config.get('url')}plugin/${id}/${enabled ? 'enable' : 'disable'}`);\n this.snack(`Plugin ${enabled ? 'enabled' : 'disabled'}`);\n await this.refresh();\n };\n}\n","import {StoreMapping} from './inject';\nimport {reaction} from 'mobx';\nimport * as Notifications from './snack/browserNotification';\n\nexport const registerReactions = (stores: StoreMapping) => {\n const clearAll = () => {\n stores.messagesStore.clearAll();\n stores.appStore.clear();\n stores.clientStore.clear();\n stores.userStore.clear();\n stores.wsStore.close();\n };\n const loadAll = () => {\n stores.wsStore.listen((message) => {\n stores.messagesStore.publishSingleMessage(message);\n Notifications.notifyNewMessage(message);\n if (message.priority >= 4) {\n const src = 'static/notification.ogg';\n const audio = new Audio(src);\n audio.play();\n }\n });\n stores.appStore.refresh();\n };\n\n reaction(\n () => stores.currentUser.loggedIn,\n (loggedIn) => {\n if (loggedIn) {\n loadAll();\n } else {\n clearAll();\n }\n }\n );\n\n reaction(\n () => stores.currentUser.connectionErrorMessage,\n (connectionErrorMessage) => {\n if (!connectionErrorMessage) {\n clearAll();\n loadAll();\n }\n }\n );\n};\n","import * as React from 'react';\nimport * as ReactDOM from 'react-dom';\nimport 'typeface-roboto';\nimport {initAxios} from './apiAuth';\nimport * as config from './config';\nimport Layout from './layout/Layout';\nimport registerServiceWorker from './registerServiceWorker';\nimport {CurrentUser} from './CurrentUser';\nimport {AppStore} from './application/AppStore';\nimport {WebSocketStore} from './message/WebSocketStore';\nimport {SnackManager} from './snack/SnackManager';\nimport {InjectProvider, StoreMapping} from './inject';\nimport {UserStore} from './user/UserStore';\nimport {MessagesStore} from './message/MessagesStore';\nimport {ClientStore} from './client/ClientStore';\nimport {PluginStore} from './plugin/PluginStore';\nimport {registerReactions} from './reactions';\n\nconst defaultDevConfig = {\n url: 'http://localhost:3000/',\n};\n\nconst {port, hostname, protocol, pathname} = window.location;\nconst slashes = protocol.concat('//');\nconst path = pathname.endsWith('/') ? pathname : pathname.substring(0, pathname.lastIndexOf('/'));\nconst url = slashes.concat(port ? hostname.concat(':', port) : hostname) + path;\nconst urlWithSlash = url.endsWith('/') ? url : url.concat('/');\n\nconst defaultProdConfig = {\n url: urlWithSlash,\n};\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\ndeclare global {\n interface Window {\n config: config.IConfig;\n }\n}\n\nconst initStores = (): StoreMapping => {\n const snackManager = new SnackManager();\n const appStore = new AppStore(snackManager.snack);\n const userStore = new UserStore(snackManager.snack);\n const messagesStore = new MessagesStore(appStore, snackManager.snack);\n const currentUser = new CurrentUser(snackManager.snack);\n const clientStore = new ClientStore(snackManager.snack);\n const wsStore = new WebSocketStore(snackManager.snack, currentUser);\n const pluginStore = new PluginStore(snackManager.snack);\n appStore.onDelete = () => messagesStore.clearAll();\n\n return {\n appStore,\n snackManager,\n userStore,\n messagesStore,\n currentUser,\n clientStore,\n wsStore,\n pluginStore,\n };\n};\n\n(function clientJS() {\n if (process.env.NODE_ENV === 'production') {\n config.set(window.config || defaultProdConfig);\n } else {\n config.set(window.config || defaultDevConfig);\n }\n const stores = initStores();\n initAxios(stores.currentUser, stores.snackManager.snack);\n\n registerReactions(stores);\n\n stores.currentUser.tryAuthenticate().catch(() => {});\n\n window.onbeforeunload = () => {\n stores.wsStore.close();\n };\n\n ReactDOM.render(\n \n \n ,\n document.getElementById('root')\n );\n registerServiceWorker();\n})();\n","import axios from 'axios';\nimport {CurrentUser} from './CurrentUser';\nimport {SnackReporter} from './snack/SnackManager';\n\nexport const initAxios = (currentUser: CurrentUser, snack: SnackReporter) => {\n axios.interceptors.request.use((config) => {\n config.headers['X-Gotify-Key'] = currentUser.token();\n return config;\n });\n\n axios.interceptors.response.use(undefined, (error) => {\n if (!error.response) {\n snack('Gotify server is not reachable, try refreshing the page.');\n return Promise.reject(error);\n }\n\n const status = error.response.status;\n\n if (status === 401) {\n currentUser.tryAuthenticate().then(() => snack('Could not complete request.'));\n }\n\n if (status === 400 || status === 403 || status === 500) {\n snack(error.response.data.error + ': ' + error.response.data.errorDescription);\n }\n\n return Promise.reject(error);\n });\n};\n"],"sourceRoot":""}