{"version":3,"sources":["helpers/fetchAPI.ts","helpers/oidc-client.ts","context/ConfigContext.tsx","helpers/oidc-interceptor.ts","context/AuthenticationContext.tsx","context/MessageContext.tsx","helpers/classNames.ts","Menu.tsx","common/Message.tsx","common/Snackbar.tsx","about/feedpushr.svg","about/Github.tsx","about/Version.tsx","about/About.tsx","hooks/usePageTitle.ts","hooks/useAPI.ts","explore/Explore.tsx","feeds/FeedConfig.tsx","feeds/FeedCreate.tsx","common/Loader.tsx","helpers/matchResponse.tsx","feeds/FeedEdit.tsx","feeds/FeedControl.tsx","common/TimeAgo.tsx","feeds/FeedDates.tsx","feeds/FeedHtmlLink.tsx","feeds/FeedHub.tsx","feeds/FeedStatus.tsx","feeds/FeedTags.tsx","feeds/OPMLExportButton.tsx","common/UploadButton.tsx","feeds/OPMLImportJobStatus.tsx","feeds/OPMLImportButton.tsx","feeds/FeedList.tsx","feeds/Routes.tsx","common/Doc.tsx","helpers/text.ts","outputs/SpecDesc.tsx","outputs/ConfigForm.tsx","outputs/filters/FilterSpecsContext.tsx","outputs/OutputSpecsContext.tsx","outputs/SpecSelector.tsx","outputs/OutputCreate.tsx","outputs/OutputEdit.tsx","common/Ellipsis.tsx","outputs/helpers.ts","outputs/EntityControl.tsx","outputs/EntityStatus.tsx","outputs/EntityList.tsx","outputs/Outputs.tsx","outputs/filters/FilterCreate.tsx","outputs/filters/FilterEdit.tsx","outputs/Routes.tsx","Routes.tsx","App.tsx","serviceWorker.js","index.tsx"],"names":["API_ROOT","process","REACT_APP_API_ROOT","window","location","origin","pathname","replace","_interceptors","addRequestInterceptor","interceptors","uri","a","params","init","interceptor","url","URL","Object","keys","forEach","key","searchParams","append","fetch","toString","OIDCClient","settings","document","userManager","response_type","scope","this","UserManager","events","addUserSignedOut","console","log","logout","clearStaleState","Log","logger","level","WARN","getUser","authority","client_id","encodeURI","signinRedirect","signinSilent","signoutRedirect","defaultConfig","version","_links","ConfigContext","createContext","ConfigProvider","children","useState","loading","setLoading","error","setError","config","setConfig","useEffect","abortController","AbortController","fetchAPI","signal","res","ok","json","Error","statusText","doFetchAPI","abort","Provider","value","message","client","user","expired","renewToken","access_token","headers","Headers","set","AuthNContext","AuthNProvider","setUser","useContext","href","redirect","encodeURIComponent","issuer","redirect_uri","silent_redirect_uri","post_logout_redirect_uri","oidcInterceptor","login","doAuth","MessageContext","text","variant","showMessage","MessageProvider","setMessage","names","filter","name","join","List","component","aria-label","ListItem","button","Link","to","ListItemIcon","ListItemText","primary","Divider","Explore","variantIcon","success","CheckCircleIcon","warning","WarningIcon","ErrorIcon","info","InfoIcon","useStyles","makeStyles","theme","backgroundColor","green","palette","dark","main","amber","icon","fontSize","iconVariant","opacity","marginRight","spacing","display","alignItems","props","classes","className","onClose","other","Icon","SnackbarContent","classNames","aria-describedby","id","action","IconButton","color","onClick","Close","open","setOpen","handleClose","event","reason","Snackbar","anchorOrigin","vertical","horizontal","autoHideDuration","Message","SvgIcon","d","Typography","align","createStyles","root","padding","flexDirection","logo","maxWidth","alignSelf","link","Paper","Version","src","alt","BottomNavigation","showLabels","BottomNavigationAction","label","target","rel","subtitle","title","defaultHeaders","data","setData","stringifiedParams","JSON","stringify","status","columns","field","render","feed","htmlUrl","desc","usePageTitle","save","form","xmlUrl","method","_err","detail","search","query","result","page","totalCount","q","trim","length","isLoading","options","debounceInterval","paging","pageSize","actionsColumnIndex","searchAutoFocus","actions","tooltip","rowData","tags","marginTop","onSave","onCancel","React","values","setValues","handleChange","prop","split","handleSave","useCallback","TextField","onChange","fullWidth","undefined","type","helperText","Button","withRouter","history","push","gutterBottom","FeedConfig","loader","justifyContent","CircularProgress","disableShrink","matchResponse","p","Loading","Data","match","useAPI","feeds","fetchError","handleBack","Loader","err","setStatus","Switch","checked","check","then","catch","Tooltip","format","toUTCString","Date","TimeAgo","cdate","mdate","lastCheck","nextCheck","margin","size","Public","hubUrl","Chip","clickable","Cloud","contrastText","minWidth","minHeight","lineHeight","borderRadius","textAlign","$status","errorCount","errorMsg","nbProcessedItems","tag","map","handleOnClick","body","element","createElement","setAttribute","style","appendChild","click","removeChild","CloudDownload","hidden","position","pointerEvents","width","height","forwardRef","ref","onSelectFile","inputRef","createRef","files","file","current","jobID","items","setItems","es","EventSource","onerror","onopen","onmessage","ev","line","close","parts","jobResultItem","XMLURL","concat","dense","idx","red","secondary","setJobID","useTheme","fullScreen","useMediaQuery","breakpoints","down","handleOnSelectFile","formData","FormData","UploadButton","CloudUpload","Dialog","aria-labelledby","DialogTitle","DialogContent","OPMLImportJobStatus","DialogActions","autoFocus","FeedControl","FeedStatus","FeedHtmlLink","FeedHub","FeedTags","FeedDates","req","total","onRowDelete","oldFeed","setTimeout","goBack","editable","pageSizeOptions","sorting","isFreeAction","components","Toolbar","OPMLImportButton","OPMLExportButton","exact","path","FeedList","FeedCreate","FeedEdit","headline","slice","indexOf","spec","help","dangerouslySetInnerHTML","__html","marked","ExpansionPanel","boxShadow","ExpansionPanelSummary","expandIcon","ExpansionPanelDetails","condition","source","alias","setAlias","setProps","setCondition","handleChangeAlias","handleChangeProp","handleChangeCondition","enabled","SpecDesc","includes","multiline","select","entries","option","MenuItem","Doc","FilterSpecsContext","specs","FilterSpecsProvider","sessionStorage","getItem","parse","setValue","initFilterSpecs","setItem","debug","OutputSpecsContext","OutputSpecsProvider","initOutputSpecs","card","heigth","pos","marginBottom","onSelect","outputSpecContext","filterSpecContext","Grid","container","item","sm","md","lg","Card","CardContent","CardActions","setSpec","msg","SpecSelector","ConfigForm","output","find","f","ellips","max","descEntity","entity","descFilter","update","parentId","nbError","nbSuccess","EntityControl","searchable","EntityStatus","Ellipsis","entities","old","parentChildData","row","rows","buildEntitiesFromOutputs","outputs","reduce","acc","filters","rest","sub","EntityList","filterId","filterDesc","outputDesc","descOutput","Outputs","OutputCreate","FilterCreate","FilterEdit","OutputEdit","Routes","from","FeedRoutes","OutputRoutes","About","createMuiTheme","blue","pink","toolbar","paddingRight","toolbarIcon","mixins","appBar","zIndex","drawer","transition","transitions","create","easing","sharp","duration","leavingScreen","appBarShift","marginLeft","enteringScreen","menuButton","menuButtonHidden","flexGrow","drawerPaper","whiteSpace","drawerPaperClose","overflowX","up","appBarSpacer","content","overflow","paddingTop","paddingBottom","paper","fixedHeight","ThemeProvider","CssBaseline","AppBar","edge","Menu","noWrap","Drawer","ChevronLeft","Container","Boolean","hostname","ReactDOM","App","getElementById","navigator","serviceWorker","ready","registration","unregister"],"mappings":"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","file":"static/js/main.12655abb.chunk.js","sourcesContent":["export const API_ROOT =\n process.env.REACT_APP_API_ROOT || window.location.origin + window.location.pathname.replace(/\\/ui(\\/)*$/, '')\n\nexport type RequestInterceptor = (init: RequestInit) => Promise\n\nlet _interceptors: RequestInterceptor[] = []\n\nexport const addRequestInterceptor = (...interceptors: RequestInterceptor[]): void => {\n _interceptors = [..._interceptors, ...interceptors]\n}\n\nexport default async (uri: string, params: any = {}, init: RequestInit) => {\n for (const interceptor of _interceptors) {\n init = await interceptor(init)\n }\n const url = new URL(`${API_ROOT}/v2${uri}`)\n if (params) {\n Object.keys(params).forEach((key) => url.searchParams.append(key, params[key]))\n }\n return await fetch(url.toString(), init)\n}\n","import { Log, UserManager, UserManagerSettings } from 'oidc-client'\n\nexport class OIDCClient {\n public userManager: UserManager\n private origin: string\n\n constructor(settings: Partial, origin = document.location.origin) {\n settings = {\n response_type: 'code',\n scope: 'openid profile email',\n ...settings,\n }\n this.origin = origin\n this.userManager = new UserManager(settings)\n this.userManager.events.addUserSignedOut(async () => {\n console.log('user signed out...')\n this.logout()\n })\n this.userManager.clearStaleState()\n\n Log.logger = console\n Log.level = Log.WARN\n }\n\n public getUser() {\n return this.userManager.getUser()\n }\n\n public getAccountUrl() {\n const { authority, client_id } = this.userManager.settings\n return `${authority}/account?referrer=${client_id}&referrer_uri=${encodeURI(this.origin)}`\n }\n\n public login() {\n return this.userManager.signinRedirect()\n }\n\n public renewToken() {\n return this.userManager.signinSilent()\n }\n\n public logout() {\n return this.userManager.signoutRedirect()\n }\n}\n","import React, { createContext, ReactNode, useEffect, useState } from 'react'\nimport fetchAPI from '../helpers/fetchAPI'\n\ninterface LinkType {\n href: string\n}\n\ninterface ConfigContextType {\n version: string\n _links: Record\n}\n\nconst defaultConfig: ConfigContextType = {\n version: 'snapshot',\n _links: {},\n}\n\nconst ConfigContext = createContext(defaultConfig)\n\ninterface Props {\n children: ReactNode\n}\n\nconst ConfigProvider = ({ children }: Props) => {\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState()\n const [config, setConfig] = useState(defaultConfig)\n\n useEffect(() => {\n const abortController = new AbortController()\n const doFetchAPI = async () => {\n try {\n const res = await fetchAPI('/', null, { signal: abortController.signal })\n if (res.ok) {\n const json = await res.json()\n setConfig(json)\n return\n }\n throw new Error(res.statusText)\n } catch (e) {\n setError(e)\n } finally {\n setLoading(false)\n }\n }\n doFetchAPI()\n return () => abortController.abort()\n }, [])\n\n return (\n \n {error &&

ERROR: {error.message}

}\n {loading &&

LOADING...

}\n {!error && !loading && children}\n
\n )\n}\n\nexport { ConfigContext, ConfigProvider }\n","import { OIDCClient } from './oidc-client'\n\nconst interceptor = (client: OIDCClient) => async (init: RequestInit) => {\n let user = await client.getUser()\n if (user === null) {\n throw new Error('user not logged in')\n }\n if (user.expired) {\n user = await client.renewToken()\n }\n if (user.access_token) {\n const headers = new Headers(init.headers)\n headers.set('Authorization', `Bearer ${user.access_token}`)\n init.headers = headers\n }\n return init\n}\n\nexport default interceptor\n","import { User } from 'oidc-client'\nimport React, { createContext, ReactNode, useContext, useEffect, useState } from 'react'\nimport { addRequestInterceptor } from '../helpers/fetchAPI'\nimport { OIDCClient } from '../helpers/oidc-client'\nimport { ConfigContext } from './ConfigContext'\nimport oidcInterceptor from '../helpers/oidc-interceptor'\n\nconst AuthNContext = createContext(null)\n\ninterface Props {\n children: ReactNode\n}\n\nconst AuthNProvider = ({ children }: Props) => {\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState()\n const [user, setUser] = useState(null)\n const { _links } = useContext(ConfigContext)\n\n useEffect(() => {\n const { origin, href, pathname } = document.location\n const redirect = encodeURIComponent(href)\n const doAuth = async () => {\n const { issuer } = _links\n if (!issuer) {\n // no delegated authentication\n setLoading(false)\n return\n }\n const client = new OIDCClient({\n authority: issuer.href,\n client_id: 'feedpushr-ui',\n redirect_uri: `${origin}${pathname}signin-callback.html?redirect=${redirect}`,\n silent_redirect_uri: `${origin}${pathname}silent-renew.html`,\n post_logout_redirect_uri: origin + pathname,\n })\n addRequestInterceptor(oidcInterceptor(client))\n try {\n let user = await client.getUser()\n if (user === null) {\n return await client.login()\n } else if (user.expired) {\n user = await client.renewToken()\n }\n setUser(user)\n } catch (e) {\n setError(e)\n } finally {\n setLoading(false)\n }\n }\n doAuth()\n }, [])\n\n return (\n \n {error &&

ERROR: {error.message}

}\n {loading &&

Connecting...

}\n {!error && !loading && children}\n
\n )\n}\n\nexport { AuthNContext, AuthNProvider }\n","import React, { createContext, ReactNode, useState } from 'react'\n\ntype MessageVariant = 'success' | 'warning' | 'error' | 'info'\n\ninterface Message {\n text: string\n variant: MessageVariant\n}\n\ninterface MessageContextType {\n message: Message\n showMessage: (text: string, variant?: MessageVariant) => void\n}\n\nconst MessageContext = createContext({\n message: { text: '', variant: 'info' },\n showMessage: () => true,\n})\n\ninterface Props {\n children: ReactNode\n}\n\nconst MessageProvider = ({ children }: Props) => {\n const [message, setMessage] = useState({ text: '', variant: 'info' })\n\n const showMessage = (text: string, variant: MessageVariant = 'success') => {\n setMessage({ text, variant })\n }\n\n return {children}\n}\n\nexport { MessageContext, MessageProvider }\n","export default (...names: (string | undefined | null)[]) => names.filter((name) => name).join(' ')\n","import React from 'react'\n\nimport { List, ListItem, ListItemIcon, ListItemText, Divider } from '@material-ui/core'\n\nimport { RssFeed as FeedIcon, Backup as OutputIcon, Explore as ExploreIcon } from '@material-ui/icons'\nimport { Link } from 'react-router-dom'\n\nexport default () => (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n)\n","import React from 'react'\n\nimport { SnackbarContent, IconButton } from '@material-ui/core'\n\nimport {\n CheckCircle as CheckCircleIcon,\n Warning as WarningIcon,\n Error as ErrorIcon,\n Info as InfoIcon,\n Close as CloseIcon,\n} from '@material-ui/icons'\n\nimport { amber, green } from '@material-ui/core/colors'\nimport { makeStyles, Theme } from '@material-ui/core/styles'\n\nimport classNames from '../helpers/classNames'\n\nconst variantIcon = {\n success: CheckCircleIcon,\n warning: WarningIcon,\n error: ErrorIcon,\n info: InfoIcon,\n}\n\nconst useStyles = makeStyles((theme: Theme) => ({\n success: {\n backgroundColor: green[600],\n },\n error: {\n backgroundColor: theme.palette.error.dark,\n },\n info: {\n backgroundColor: theme.palette.primary.main,\n },\n warning: {\n backgroundColor: amber[700],\n },\n icon: {\n fontSize: 20,\n },\n iconVariant: {\n opacity: 0.9,\n marginRight: theme.spacing(1),\n },\n message: {\n display: 'flex',\n alignItems: 'center',\n },\n}))\n\nexport interface Props {\n className?: string\n text: string\n onClose?: () => void\n variant: keyof typeof variantIcon\n}\n\nexport default (props: Props) => {\n const classes = useStyles()\n const { className, text, onClose, variant, ...other } = props\n const Icon = variantIcon[variant]\n\n return (\n \n \n {text}\n \n }\n action={[\n \n \n ,\n ]}\n {...other}\n />\n )\n}\n","import React, { useContext, SyntheticEvent, useEffect, useState } from 'react'\n\nimport { Snackbar } from '@material-ui/core'\n\nimport { MessageContext } from '../context/MessageContext'\nimport Message from './Message'\n\nexport default () => {\n const { message } = useContext(MessageContext)\n const [open, setOpen] = useState(false)\n\n useEffect(() => {\n setOpen(message.text !== '')\n }, [message])\n\n const handleClose = (event?: SyntheticEvent, reason?: string) => {\n if (reason === 'clickaway') {\n return\n }\n setOpen(false)\n }\n\n return (\n \n \n \n )\n}\n","export default __webpack_public_path__ + \"static/media/feedpushr.581009c2.svg\";","/* eslint-disable max-len */\n\nimport React from 'react'\n\nimport { SvgIcon } from '@material-ui/core'\n\nexport default (props: Record) => (\n \n \n \n)\n","import React, { useContext } from 'react'\n\nimport { Typography } from '@material-ui/core'\n\nimport { ConfigContext } from '../context/ConfigContext'\n\nexport default () => {\n const { version } = useContext(ConfigContext)\n return (\n \n {version}\n \n )\n}\n","import React from 'react'\n\nimport {\n BottomNavigation,\n BottomNavigationAction,\n createStyles,\n Link,\n makeStyles,\n Paper,\n Theme,\n} from '@material-ui/core'\nimport { Favorite as SupportIcon, NewReleases as FeatureIcon } from '@material-ui/icons'\n\nimport logo from './feedpushr.svg'\nimport SourceIcon from './Github'\nimport Version from './Version'\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n root: {\n padding: theme.spacing(3, 2),\n display: 'flex',\n flexDirection: 'column',\n },\n logo: {\n maxWidth: '50vw',\n alignSelf: 'center',\n },\n link: {\n color: 'rgba(0, 0, 0, 0.54)',\n },\n })\n)\n\nexport default () => {\n const classes = useStyles()\n\n return (\n
\n \n \n \"feedpushr\"\n \n }\n component={Link}\n href=\"https://github.com/ncarlier/feedpushr\"\n target=\"_blank\"\n rel=\"noreferrer\"\n className={classes.link}\n />\n }\n component={Link}\n href=\"https://github.com/ncarlier/feedpushr/issues\"\n target=\"_blank\"\n rel=\"noreferrer\"\n className={classes.link}\n />\n }\n component={Link}\n href=\"https://www.paypal.me/nunux\"\n target=\"_blank\"\n rel=\"noreferrer\"\n className={classes.link}\n />\n \n \n
\n )\n}\n","import { useEffect } from 'react'\n\nexport default (subtitle?: string, title = 'Feedpushr') => {\n useEffect(() => {\n document.title = subtitle ? `${title} - ${subtitle}` : title\n }, [title, subtitle])\n}\n","import 'abortcontroller-polyfill/dist/polyfill-patch-fetch'\n\nimport { useEffect, useState } from 'react'\n\nimport fetchAPI from '../helpers/fetchAPI'\n\nconst defaultHeaders = new Headers({\n 'Content-Type': 'application/json',\n})\n\nexport default (\n uri = '/',\n params: any = {},\n init: RequestInit = { headers: defaultHeaders }\n): [boolean, T?, Error?] => {\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState()\n const [data, setData] = useState()\n\n const stringifiedParams = JSON.stringify(params)\n useEffect(() => {\n const abortController = new AbortController()\n const doFetchAPI = async () => {\n try {\n const res = await fetchAPI(uri, params, { ...init, signal: abortController.signal })\n\n if (res.status >= 300) {\n throw new Error(res.statusText)\n }\n\n const data = await res.json()\n setData(data)\n } catch (e) {\n if (e.name !== 'AbortError') setError(e)\n } finally {\n setLoading(false)\n }\n }\n doFetchAPI()\n return () => abortController.abort()\n // eslint-disable-next-line\n }, [uri, stringifiedParams])\n\n return [loading, data, error]\n}\n","import React, { useState, useContext } from 'react'\n\nimport { Link } from '@material-ui/core'\n\nimport fetchAPI from '../helpers/fetchAPI'\nimport { usePageTitle } from '../hooks'\nimport { SearchResult } from './Types'\nimport MaterialTable, { Query, QueryResult } from '@material-table/core'\nimport { MessageContext } from '../context/MessageContext'\nimport { Feed } from '../feeds/Types'\nimport Message from '../common/Message'\n\nconst headers = {\n 'Content-Type': 'application/x-www-form-urlencoded',\n}\n\nconst columns = [\n {\n title: 'Feed',\n field: 'title',\n render: (feed: SearchResult) => (\n <>\n \n {feed.title}\n \n

{feed.desc}

\n \n ),\n },\n]\n\nexport default () => {\n usePageTitle('Find new RSS feed')\n const [error, setError] = useState(null)\n const [loading, setLoading] = useState(false)\n const { showMessage } = useContext(MessageContext)\n\n const save = async (form: SearchResult) => {\n setLoading(true)\n try {\n const { title, xmlUrl: url } = form\n const res = await fetchAPI('/feeds', { title, url }, { method: 'POST', headers })\n if (!res.ok) {\n const _err = await res.json()\n throw new Error(_err.detail || res.statusText)\n }\n setError(null)\n const data = (await res.json()) as Feed\n showMessage(`${data.title} feed created`)\n } catch (err) {\n setError(err)\n } finally {\n setLoading(false)\n }\n }\n\n const search = async (query: Query) => {\n const result: QueryResult = {\n data: [],\n page: 0,\n totalCount: 0,\n }\n const q = query.search.trim()\n if (q.length <= 2) {\n return result\n }\n const res = await fetchAPI('/explore', { q }, { method: 'GET' })\n if (!res.ok) {\n const _err = await res.json()\n throw new Error(_err.detail || res.statusText)\n }\n const data = (await res.json()) as SearchResult[]\n result.data = data\n result.totalCount = data.length\n return result\n }\n\n return (\n <>\n {!!error && }\n ({\n icon: 'add_box',\n tooltip: 'Add feed',\n onClick: (event, rowData) => save(rowData as SearchResult),\n }),\n ]}\n />\n \n )\n}\n","import React, { useCallback } from 'react'\n\nimport { Button, Paper, TextField } from '@material-ui/core'\nimport { createStyles, makeStyles, Theme } from '@material-ui/core/styles'\n\nimport { Feed, FeedForm } from './Types'\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n root: {\n padding: theme.spacing(2),\n },\n tags: {\n marginTop: theme.spacing(2),\n },\n button: {\n marginRight: theme.spacing(1),\n marginTop: theme.spacing(2),\n },\n })\n)\n\ninterface Props {\n feed?: Feed\n onCancel: () => void\n onSave: (feed: FeedForm) => void\n}\n\ninterface FeedConfigForm {\n title: string\n xmlUrl: string\n tags: string[]\n}\n\nexport default ({ onSave, onCancel, feed }: Props) => {\n const classes = useStyles()\n\n const [values, setValues] = React.useState({\n title: feed ? feed.title : '',\n xmlUrl: feed ? feed.xmlUrl : '',\n tags: feed && feed.tags ? feed.tags : [],\n })\n\n const handleChange = (prop: keyof FeedConfigForm) => (event: React.ChangeEvent) => {\n if (prop === 'tags') {\n setValues({ ...values, [prop]: event.target.value.split(',') })\n } else {\n setValues({ ...values, [prop]: event.target.value })\n }\n }\n\n const handleSave = useCallback(() => {\n onSave(values)\n }, [onSave, values])\n\n return (\n \n
\n \n {feed === undefined && (\n \n )}\n \n \n \n \n
\n )\n}\n","import React, { useContext, useState } from 'react'\nimport { RouteComponentProps, withRouter } from 'react-router'\n\nimport { Typography } from '@material-ui/core'\n\nimport Message from '../common/Message'\nimport { MessageContext } from '../context/MessageContext'\nimport fetchAPI from '../helpers/fetchAPI'\nimport { usePageTitle } from '../hooks'\nimport FeedConfig from './FeedConfig'\nimport { Feed, FeedForm } from './Types'\n\nconst headers = {\n 'Content-Type': 'application/x-www-form-urlencoded',\n}\n\nexport default withRouter(({ history }: RouteComponentProps) => {\n usePageTitle('new feed')\n const [error, setError] = useState(null)\n const { showMessage } = useContext(MessageContext)\n\n function handleBack() {\n setError(null)\n history.push('/feeds')\n }\n\n async function handleSave(form: FeedForm) {\n try {\n const { title, xmlUrl: url, tags } = form\n const res = await fetchAPI('/feeds', { title, url, tags }, { method: 'POST', headers })\n if (!res.ok) {\n const _err = await res.json()\n throw new Error(_err.detail || res.statusText)\n }\n setError(null)\n const data = (await res.json()) as Feed\n showMessage(`${data.title} feed created`)\n return history.push('/feeds')\n } catch (err) {\n setError(err)\n }\n }\n\n return (\n <>\n \n New feed\n \n {!!error && }\n \n \n )\n})\n","import React from 'react'\n\nimport { CircularProgress, makeStyles } from '@material-ui/core'\n\nconst useStyles = makeStyles((/*theme: Theme*/) => ({\n loader: {\n display: 'flex',\n padding: '20px',\n justifyContent: 'center',\n },\n}))\n\nexport default () => {\n const classes = useStyles()\n return (\n
\n \n
\n )\n}\n","import React, { ReactNode } from 'react'\n\nexport interface ResponsePattern {\n Loading: () => ReactNode\n Error: (err: Error) => ReactNode\n Data: (data: T) => ReactNode\n}\n\nfunction matchResponse(p: ResponsePattern): (loading: boolean, data?: T, error?: Error) => ReactNode {\n return (loading: boolean, data?: T, error?: Error): ReactNode => {\n return (\n <>\n {loading && p.Loading()}\n {error && p.Error(error)}\n {data && p.Data(data)}\n \n )\n }\n}\n\nexport default matchResponse\n","import React, { useContext, useState } from 'react'\nimport { RouteComponentProps } from 'react-router'\n\nimport { Typography } from '@material-ui/core'\n\nimport Loader from '../common/Loader'\nimport Message from '../common/Message'\nimport { MessageContext } from '../context/MessageContext'\nimport fetchAPI from '../helpers/fetchAPI'\nimport matchResponse from '../helpers/matchResponse'\nimport { useAPI, usePageTitle } from '../hooks'\nimport FeedConfig from './FeedConfig'\nimport { Feed, FeedForm } from './Types'\n\ntype Props = RouteComponentProps<{ id: string }>\n\nconst headers = {\n 'Content-Type': 'application/x-www-form-urlencoded',\n}\n\nexport default ({ match, history }: Props) => {\n const { id } = match.params\n usePageTitle(`edit feed #${id}`)\n\n const [error, setError] = useState(null)\n const { showMessage } = useContext(MessageContext)\n const [loading, feeds, fetchError] = useAPI(`/feeds/${id}`)\n\n function handleBack() {\n setError(null)\n history.push('/feeds')\n }\n\n async function handleSave(form: FeedForm) {\n try {\n const { title, tags } = form\n const res = await fetchAPI(`/feeds/${id}`, { title, tags }, { method: 'PUT', headers })\n if (!res.ok) {\n const _err = await res.json()\n throw new Error(_err.detail || res.statusText)\n }\n setError(null)\n const data = (await res.json()) as Feed\n showMessage(`${data.title} feed updated`)\n return history.push('/feeds')\n } catch (err) {\n setError(err)\n }\n }\n\n const render = matchResponse({\n Loading: () => ,\n Data: (data) => (\n <>\n \n Configure feed\n \n {!!error && }\n \n \n ),\n Error: (err) => ,\n })\n\n return <>{render(loading, feeds, fetchError)}\n}\n","import React, { useContext, useEffect, useState } from 'react'\n\nimport { Switch } from '@material-ui/core'\n\nimport { MessageContext } from '../context/MessageContext'\nimport fetchAPI from '../helpers/fetchAPI'\nimport { Feed } from './Types'\n\ninterface Props {\n feed: Feed\n}\n\nexport default ({ feed }: Props) => {\n const [status, setStatus] = useState(false)\n const { showMessage } = useContext(MessageContext)\n\n useEffect(() => {\n setStatus(feed.status === 'running')\n }, [feed])\n\n const switchFeedStatus = (event: React.ChangeEvent, check: boolean) => {\n const action = check ? 'start' : 'stop'\n fetchAPI(`/feeds/${feed.id}/${action}`, null, { method: 'POST' })\n .then((/*res*/) => {\n setStatus(check)\n showMessage(`${feed.title} feed is ${check ? 'running' : 'stopped'}`)\n })\n .catch(console.error)\n }\n\n return \n}\n","import React from 'react'\nimport { format } from 'timeago.js'\n\nimport { Tooltip } from '@material-ui/core'\n\ninterface Props {\n value?: string\n title?: React.ReactNode\n}\n\nexport default ({ value, title }: Props) => {\n if (value) {\n return (\n \n {format(value)}\n \n )\n }\n return -\n}\n","import React from 'react'\n\nimport TimeAgo from '../common/TimeAgo'\nimport { Feed } from './Types'\n\ninterface Props {\n feed: Feed\n}\n\nconst toUTCString = (value: string) => {\n const date = new Date(value)\n return date.toUTCString()\n}\n\nexport default ({ feed }: Props) => (\n \n
created
\n
{toUTCString(feed.cdate)}
\n {!!feed.mdate && (\n <>\n
updated
\n
{toUTCString(feed.mdate)}
\n \n )}\n {!!feed.lastCheck && (\n <>\n
last check
\n
{toUTCString(feed.lastCheck)}
\n \n )}\n {!!feed.nextCheck && (\n <>\n
next check
\n
{toUTCString(feed.nextCheck)}
\n \n )}\n \n }\n value={feed.nextCheck}\n />\n)\n","import React from 'react'\n\nimport { IconButton, Theme, Tooltip } from '@material-ui/core'\nimport { Public as PublicIcon } from '@material-ui/icons'\nimport { makeStyles, createStyles } from '@material-ui/styles'\n\nimport { Feed } from './Types'\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n margin: {\n marginRight: theme.spacing(1),\n },\n })\n)\n\ninterface Props {\n feed: Feed\n}\n\nexport default ({ feed }: Props) => {\n const classes = useStyles()\n if (feed.htmlUrl) {\n return (\n \n \n \n \n \n )\n }\n return null\n}\n","import React from 'react'\n\nimport { Chip, Theme, Tooltip } from '@material-ui/core'\nimport { Cloud as CloudIcon } from '@material-ui/icons'\nimport { createStyles, makeStyles } from '@material-ui/styles'\n\nimport { Feed } from './Types'\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n margin: {\n margin: theme.spacing(1),\n },\n })\n)\n\ninterface Props {\n feed: Feed\n}\n\nexport default ({ feed }: Props) => {\n const classes = useStyles()\n if (feed.hubUrl) {\n return (\n \n }\n />\n \n )\n }\n return null\n}\n","import React from 'react'\n\nimport { makeStyles, Theme, Tooltip } from '@material-ui/core'\nimport { green } from '@material-ui/core/colors'\n\nimport classNames from '../helpers/classNames'\nimport { Feed } from './Types'\n\nconst useStyles = makeStyles((theme: Theme) => ({\n status: {\n display: 'inline-block',\n alignItems: 'center',\n backgroundColor: theme.palette.primary.main,\n color: theme.palette.primary.contrastText,\n minWidth: '2em',\n minHeight: '2em',\n padding: '.5em!important',\n lineHeight: '1em',\n borderRadius: '500rem',\n textAlign: 'center',\n },\n error: {\n backgroundColor: theme.palette.error.dark,\n },\n success: {\n backgroundColor: green[600],\n },\n}))\n\ninterface Props {\n feed: Feed\n}\n\nexport default ({ feed }: Props) => {\n const classes = useStyles()\n let $status =
0
\n let title = 'No feed aggregated'\n if (feed.errorCount) {\n title = feed.errorMsg ? feed.errorMsg : 'unexpected error'\n $status =
{feed.errorCount}
\n } else if (feed.nbProcessedItems) {\n title = 'Aggregation success'\n $status =
{feed.nbProcessedItems}
\n }\n return {$status}\n}\n","import React from 'react'\n\nimport { Chip } from '@material-ui/core'\nimport { createStyles, makeStyles, Theme } from '@material-ui/core/styles'\n\nimport { Feed } from './Types'\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n tag: {\n marginRight: theme.spacing(0.5),\n },\n })\n)\n\ninterface Props {\n feed: Feed\n}\n\nexport default ({ feed: { tags = [] } }: Props) => {\n const classes = useStyles()\n return (\n <>\n {tags.map((tag) => (\n \n ))}\n \n )\n}\n","import React, { useContext } from 'react'\n\nimport { Tooltip, Button } from '@material-ui/core'\nimport { CloudDownload as CloudDownloadIcon } from '@material-ui/icons'\n\nimport fetchAPI from '../helpers/fetchAPI'\nimport { MessageContext } from '../context/MessageContext'\n\nexport default () => {\n const { showMessage } = useContext(MessageContext)\n\n const handleOnClick = async () => {\n try {\n const res = await fetchAPI('/opml', null, { method: 'GET' })\n if (res.ok) {\n const body = await res.text()\n const element = document.createElement('a')\n element.setAttribute('href', 'data:text/xml;charset=utf-8,' + encodeURIComponent(body))\n element.setAttribute('download', 'my-feedpushr-feeds.opml')\n element.style.display = 'none'\n document.body.appendChild(element)\n element.click()\n document.body.removeChild(element)\n } else {\n const err = await res.json()\n throw new Error(err.detail || res.statusText)\n }\n } catch (err) {\n showMessage(`Unable to export feeds to OPML file: ${err.message}`, 'error')\n }\n }\n\n return (\n \n \n \n )\n}\n","import React, { ChangeEventHandler, MouseEventHandler, createRef, forwardRef } from 'react'\n\nimport { Button, makeStyles } from '@material-ui/core'\nimport { ButtonProps } from '@material-ui/core/Button'\n\ninterface Props {\n onSelectFile: (file: File) => void\n}\n\nconst useStyles = makeStyles((/*theme: Theme*/) => ({\n hidden: {\n opacity: 0,\n position: 'absolute',\n pointerEvents: 'none',\n width: '1px',\n height: '1px',\n },\n}))\n\nexport default forwardRef(({ onSelectFile, ...props }, ref) => {\n const classes = useStyles()\n const inputRef = createRef()\n\n const handleOnChange: ChangeEventHandler = (event) => {\n if (event.target.files) {\n const file = event.target.files[0]\n if (file) {\n onSelectFile(file)\n }\n }\n }\n\n const handleOnClick: MouseEventHandler = (/*event*/) => {\n if (inputRef.current) {\n inputRef.current.click()\n }\n }\n\n return (\n <>\n \n \n \n )\n})\n","import React from 'react'\n\nimport { List, ListItem, ListItemText, ListItemIcon } from '@material-ui/core'\n\nimport { CheckCircle as SuccessIcon, Error as ErrorIcon } from '@material-ui/icons'\nimport { green, red } from '@material-ui/core/colors'\n\nimport Message from '../common/Message'\nimport Loader from '../common/Loader'\nimport { API_ROOT } from '../helpers/fetchAPI'\n\ntype EventSourceStatus = 'open' | 'closed' | 'error'\n\ninterface JobResultItem {\n XMLURL: string\n error?: string\n}\n\ninterface Props {\n jobID: string\n}\n\nexport default ({ jobID }: Props) => {\n const [items, setItems] = React.useState([])\n const [status, setStatus] = React.useState('closed')\n\n React.useEffect(() => {\n const es = new EventSource(`${API_ROOT}/v2/opml/status/${jobID}`)\n es.onerror = () => setStatus('error')\n es.onopen = () => setStatus('open')\n es.onmessage = (ev) => {\n const line = ev.data as string\n if (line === 'done') {\n es.close()\n setStatus('closed')\n return\n }\n const parts = line.split('|')\n const jobResultItem: JobResultItem = {\n XMLURL: parts[0],\n error: parts[1] === 'ok' ? undefined : parts[1],\n }\n setItems((data) => [jobResultItem].concat(data))\n }\n\n return () => es.close()\n }, [jobID])\n\n return (\n <>\n {status === 'error' && }\n {status === 'open' && }\n \n {items.map((res, idx) => (\n \n \n {res.error ? : }\n \n \n \n ))}\n \n \n )\n}\n","import React, { useContext } from 'react'\nimport { RouteComponentProps, withRouter } from 'react-router'\n\nimport {\n Tooltip,\n Dialog,\n useTheme,\n useMediaQuery,\n DialogContent,\n DialogActions,\n Button,\n DialogTitle,\n} from '@material-ui/core'\nimport { CloudUpload as CloudUploadIcon } from '@material-ui/icons'\n\nimport UploadButton from '../common/UploadButton'\nimport { MessageContext } from '../context/MessageContext'\nimport fetchAPI from '../helpers/fetchAPI'\nimport OPMLImportJobStatus from './OPMLImportJobStatus'\n\ninterface ImportJobResult {\n id: string\n}\n\ninterface Props {\n style?: React.CSSProperties\n}\n\nexport default withRouter(({ style, history }: Props & RouteComponentProps) => {\n const [open, setOpen] = React.useState(false)\n const [jobID, setJobID] = React.useState('')\n const theme = useTheme()\n const fullScreen = useMediaQuery(theme.breakpoints.down('sm'))\n const { showMessage } = useContext(MessageContext)\n\n const handleClose = () => {\n setOpen(false)\n history.push('/')\n history.replace('/feeds')\n }\n\n const handleOnSelectFile = async (file: File) => {\n const formData = new FormData()\n formData.append('file', file)\n\n try {\n const res = await fetchAPI('/opml', null, { method: 'POST', body: formData })\n if (!res.ok) {\n const err = await res.json()\n throw new Error(err.detail || res.statusText)\n }\n const { id } = (await res.json()) as ImportJobResult\n setJobID(id)\n setOpen(true)\n } catch (err) {\n showMessage(`Unable to import OPML file: ${err.message}`, 'error')\n }\n }\n\n return (\n <>\n \n \n Import\n \n \n \n \n {'Import OPML file'}\n \n \n \n \n \n \n \n \n )\n})\n","import MaterialTable, { MTableToolbar, Query, QueryResult } from '@material-table/core'\nimport React, { useContext, useState } from 'react'\nimport { RouteComponentProps, withRouter } from 'react-router'\n\nimport { Link as Href } from '@material-ui/core'\n\nimport Message from '../common/Message'\nimport { MessageContext } from '../context/MessageContext'\nimport fetchAPI from '../helpers/fetchAPI'\nimport FeedControl from './FeedControl'\nimport FeedDates from './FeedDates'\nimport FeedHtmlLink from './FeedHtmlLink'\nimport FeedHub from './FeedHub'\nimport FeedStatus from './FeedStatus'\nimport FeedTags from './FeedTags'\nimport OPMLExportButton from './OPMLExportButton'\nimport OPMLImportButton from './OPMLImportButton'\nimport { Feed, FeedPage } from './Types'\nimport { usePageTitle } from '../hooks'\n\nconst columns = [\n {\n title: 'Aggregation',\n render: (feed: Feed) => !!feed && ,\n field: 'id',\n width: 120,\n },\n {\n title: 'Status',\n field: 'status',\n render: (feed: Feed) => !!feed && ,\n width: 100,\n },\n {\n title: 'Title',\n field: 'title',\n render: (feed: Feed) => (\n <>\n \n \n {feed.title}\n \n \n \n ),\n },\n {\n title: 'Tags',\n field: 'tags',\n render: (feed: Feed) => !!feed && ,\n },\n {\n title: 'Next check',\n field: 'nextCheck',\n render: (feed: Feed) => !!feed && ,\n },\n]\n\nexport default withRouter(({ history }: RouteComponentProps) => {\n usePageTitle('feeds')\n\n const [error, setError] = useState(null)\n const { showMessage } = useContext(MessageContext)\n\n const search = async (query: Query): Promise> => {\n const req = {\n q: query.search.trim(),\n page: query.page + 1,\n size: query.pageSize,\n }\n const res = await fetchAPI('/feeds', req, { method: 'GET' })\n if (!res.ok) {\n const _err = await res.json()\n throw new Error(_err.detail || res.statusText)\n }\n const page = (await res.json()) as FeedPage\n return {\n data: page.data,\n page: page.current - 1,\n totalCount: page.total,\n }\n }\n\n const onRowDelete = async (oldFeed: Feed) => {\n const { id, title } = oldFeed\n try {\n const res = await fetchAPI(`/feeds/${id}`, null, { method: 'DELETE' })\n if (!res.ok) {\n const _err = await res.json()\n throw new Error(_err.detail || res.statusText)\n }\n setError(null)\n showMessage(`${title} feed removed`)\n setTimeout(() => {\n history.push('/')\n history.goBack()\n })\n } catch (err) {\n setError(err)\n throw err\n }\n }\n\n return (\n <>\n {!!error && }\n history.push(`/feeds/${(rowData as Feed).id}`),\n },\n {\n icon: 'add_box',\n tooltip: 'Add',\n isFreeAction: true,\n onClick: () => history.push('/feeds/add'),\n },\n ]}\n components={{\n Toolbar: (props) => (\n
\n \n
\n \n \n
\n
\n ),\n }}\n />\n \n )\n})\n","import React from 'react'\nimport { Route, RouteComponentProps, Switch } from 'react-router-dom'\n\nimport FeedCreate from './FeedCreate'\nimport FeedEdit from './FeedEdit'\nimport FeedList from './FeedList'\n\nexport default ({ match }: RouteComponentProps) => (\n \n \n \n \n \n)\n","import React, { ReactNode } from 'react'\n\ninterface Props {\n href: string\n children: ReactNode\n}\n\nexport default ({ href, children }: Props) => (\n \n {children}\n \n)\n","export const headline = (value: string) => value.slice(0, value.indexOf('.') + 1)\n\nexport const afterHeadline = (value: string) => value.slice(value.indexOf('.') + 1)\n","/*global marked*/\nimport React from 'react'\n\nimport { Typography, ExpansionPanel, ExpansionPanelSummary, ExpansionPanelDetails } from '@material-ui/core'\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore'\n\nimport { headline, afterHeadline } from '../helpers/text'\nimport { Spec } from './Types'\n\ninterface Props {\n spec: Spec\n}\n\nexport default ({ spec }: Props) => {\n const help = afterHeadline(spec.desc)\n\n if (help === '') {\n return \n }\n\n return (\n \n }>\n \n \n \n \n \n \n )\n}\n","/*eslint no-undef: \"error\"*/\nimport React, { useCallback } from 'react'\n\nimport { Button, MenuItem, Paper, TextField, Typography } from '@material-ui/core'\nimport { createStyles, makeStyles, Theme } from '@material-ui/core/styles'\n\nimport Doc from '../common/Doc'\nimport { BaseForm, Filter, Output, Props, Spec } from './Types'\nimport SpecDesc from './SpecDesc'\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n root: {\n padding: theme.spacing(2),\n },\n condition: {\n marginTop: theme.spacing(2),\n },\n button: {\n marginRight: theme.spacing(1),\n marginTop: theme.spacing(2),\n },\n })\n)\n\nexport type ConfigFormPayload = BaseForm & {\n id?: string\n}\n\ninterface ConfigFormProps {\n source?: Output | Filter\n spec: Spec\n onCancel: () => void\n onSave: (payload: ConfigFormPayload) => void\n}\n\nexport default ({ onSave, onCancel, spec, source }: ConfigFormProps) => {\n const classes = useStyles()\n const [alias, setAlias] = React.useState(source ? source.alias : '')\n const [props, setProps] = React.useState(source ? source.props : {})\n const [condition, setCondition] = React.useState(source ? source.condition : '')\n\n const handleChangeAlias = useCallback(\n () => (event: React.ChangeEvent) => {\n setAlias(event.target.value)\n },\n []\n )\n\n const handleChangeProp = useCallback(\n (name: string) => (event: React.ChangeEvent) => {\n setProps({ ...props, [name]: event.target.value })\n },\n [props]\n )\n\n const handleChangeCondition = useCallback(\n () => (event: React.ChangeEvent) => {\n setCondition(event.target.value)\n },\n []\n )\n\n const handleSave = useCallback(() => {\n onSave({\n alias,\n name: spec.name,\n props,\n condition,\n enabled: source ? source.enabled : false,\n })\n }, [onSave, alias, spec, props, condition, source])\n\n return (\n \n \n {spec.name}\n \n \n
\n Alias\n \n {spec.props.length > 0 && Properties}\n {spec.props.map((prop) => (\n \n {prop.options &&\n Object.entries(prop.options).map((option) => (\n \n {option[1]}\n \n ))}\n \n ))}\n \n Condition\n \n \n Conditional expression (documentation)\n \n }\n value={condition}\n onChange={handleChangeCondition()}\n fullWidth\n />\n \n \n \n
\n )\n}\n","import React, { createContext, ReactNode, useState } from 'react'\n\nimport fetchAPI from '../../helpers/fetchAPI'\nimport { Spec } from '../Types'\n\ninterface FilterSpecsContextType {\n specs: Spec[]\n}\n\nconst FilterSpecsContext = createContext({\n specs: [],\n})\n\ninterface Props {\n children: ReactNode\n}\n\nconst FilterSpecsProvider = ({ children }: Props) => {\n const specs = sessionStorage.getItem('filterSpecs') || '[]'\n const [value, setValue] = useState(JSON.parse(specs))\n\n const initFilterSpecs = async () => {\n try {\n const res = await fetchAPI('/filters/_specs', null, { method: 'GET' })\n if (!res.ok) {\n throw new Error(res.statusText)\n }\n const data = await res.json()\n sessionStorage.setItem('filterSpecs', JSON.stringify(data))\n setValue(data)\n console.debug('filter specs initialized', data)\n } catch (err) {\n console.error('unable to fetch filters specs', err)\n }\n }\n\n if (!value.length) {\n initFilterSpecs()\n }\n\n return {children}\n}\n\nexport { FilterSpecsContext, FilterSpecsProvider }\n","import React, { createContext, ReactNode, useState } from 'react'\n\nimport fetchAPI from '../helpers/fetchAPI'\nimport { Spec } from './Types'\n\ninterface OutputSpecsContextType {\n specs: Spec[]\n}\n\nconst OutputSpecsContext = createContext({\n specs: [],\n})\n\ninterface Props {\n children: ReactNode\n}\n\nconst OutputSpecsProvider = ({ children }: Props) => {\n const specs = sessionStorage.getItem('outputSpecs') || '[]'\n const [value, setValue] = useState(JSON.parse(specs))\n\n const initOutputSpecs = async () => {\n try {\n const res = await fetchAPI('/outputs/_specs', null, { method: 'GET' })\n if (!res.ok) {\n throw new Error(res.statusText)\n }\n const data = await res.json()\n sessionStorage.setItem('outputSpecs', JSON.stringify(data))\n setValue(data)\n console.debug('output specs initialized', data)\n } catch (err) {\n console.error('unable to fetch outputs specs', err)\n }\n }\n\n if (!value.length) {\n initOutputSpecs()\n }\n\n return {children}\n}\n\nexport { OutputSpecsContext, OutputSpecsProvider }\n","/*global marked*/\n/*eslint no-undef: \"error\"*/\n\nimport React, { useContext } from 'react'\n\nimport { Button, Card, CardActions, CardContent, Grid, Typography } from '@material-ui/core'\nimport { makeStyles } from '@material-ui/core/styles'\n\nimport { FilterSpecsContext } from './filters/FilterSpecsContext'\nimport { OutputSpecsContext } from './OutputSpecsContext'\nimport { Spec } from './Types'\nimport { headline } from '../helpers/text'\n\nconst useStyles = makeStyles({\n card: {\n heigth: '100%',\n display: 'flex',\n flexDirection: 'column',\n },\n title: {\n fontSize: 14,\n },\n pos: {\n marginBottom: 12,\n },\n})\n\ninterface Props {\n type: 'output' | 'filter'\n onSelect: (spec: Spec) => void\n}\n\nexport default ({ onSelect, type }: Props) => {\n const classes = useStyles()\n const outputSpecContext = useContext(OutputSpecsContext)\n const filterSpecContext = useContext(FilterSpecsContext)\n const { specs } = type === 'output' ? outputSpecContext : filterSpecContext\n\n return (\n \n {specs.map((spec) => (\n \n \n \n \n {spec.name}\n \n \n \n \n \n \n \n \n ))}\n \n )\n}\n","import React, { useContext, useState } from 'react'\nimport { RouteComponentProps, withRouter } from 'react-router'\n\nimport { Typography } from '@material-ui/core'\n\nimport Message from '../common/Message'\nimport { MessageContext } from '../context/MessageContext'\nimport fetchAPI from '../helpers/fetchAPI'\nimport { usePageTitle } from '../hooks'\nimport ConfigForm from './ConfigForm'\nimport SpecSelector from './SpecSelector'\nimport { Output, OutputForm, Spec } from './Types'\n\nexport default withRouter(({ history }: RouteComponentProps) => {\n usePageTitle('add output')\n const [spec, setSpec] = useState(null)\n const [error, setError] = useState(null)\n const { showMessage } = useContext(MessageContext)\n\n function handleSelectSpec(spec: Spec) {\n setError(null)\n setSpec(spec)\n }\n\n function handleBack() {\n setError(null)\n setSpec(null)\n }\n\n async function handleSave(form: OutputForm) {\n try {\n const res = await fetchAPI('/outputs', null, {\n method: 'POST',\n body: JSON.stringify(form),\n })\n if (!res.ok) {\n const msg = await res.text()\n throw new Error(msg)\n }\n const data = (await res.json()) as Output\n const desc = data.alias ? data.alias : data.name\n showMessage(`${desc} output added`)\n history.push('/outputs')\n } catch (err) {\n setError(err)\n }\n }\n\n if (spec === null) {\n return (\n <>\n \n Add output: Choose\n \n \n \n )\n }\n\n return (\n <>\n \n Add output: Configure\n \n {!!error && }\n \n \n )\n})\n","import React, { useContext, useState } from 'react'\nimport { RouteComponentProps } from 'react-router'\n\nimport { Typography } from '@material-ui/core'\n\nimport Loader from '../common/Loader'\nimport Message from '../common/Message'\nimport { MessageContext } from '../context/MessageContext'\nimport fetchAPI from '../helpers/fetchAPI'\nimport matchResponse from '../helpers/matchResponse'\nimport { useAPI, usePageTitle } from '../hooks'\nimport ConfigForm from './ConfigForm'\nimport { OutputSpecsContext } from './OutputSpecsContext'\nimport { Output, OutputForm } from './Types'\n\ntype Props = RouteComponentProps<{ id: string }>\n\nexport default ({ match, history }: Props) => {\n const { id } = match.params\n usePageTitle('edit output')\n\n const [error, setError] = useState(null)\n const { showMessage } = useContext(MessageContext)\n const [loading, output, fetchError] = useAPI(`/outputs/${id}`)\n const { specs } = useContext(OutputSpecsContext)\n\n function handleBack() {\n history.push('/outputs')\n }\n\n async function handleSave(form: OutputForm) {\n try {\n const res = await fetchAPI(`/outputs/${id}`, null, {\n method: 'PUT',\n body: JSON.stringify(form),\n })\n if (!res.ok) {\n const msg = await res.text()\n throw new Error(msg)\n }\n const data = (await res.json()) as Output\n const desc = data.alias ? data.alias : data.name\n showMessage(`${desc} output configured`)\n history.push('/outputs')\n } catch (err) {\n setError(err)\n }\n }\n\n const render = matchResponse({\n Loading: () => ,\n Data: (data) => {\n const spec = specs.find((f) => f.name === data.name)\n if (!spec) {\n return \n }\n return (\n <>\n \n Configure output\n \n {!!error && }\n \n \n )\n },\n Error: (err) => ,\n })\n\n return <>{render(loading, output, fetchError)}\n}\n","import React from 'react'\n\nimport { Tooltip } from '@material-ui/core'\n\ninterface Props {\n value: string\n}\n\nconst ellips = (value: string, max = 10) => (value.length > max ? value.slice(0, max) + '...' : value)\n\nexport default ({ value }: Props) => (\n \n {ellips(value)}\n \n)\n","import { Entity, Filter, Output } from './Types'\n\nconst desc = (name: string, alias: string, type: string) => `${alias ? alias : name} ${type}`\n\nexport const descEntity = (entity: Entity) => {\n const { name, alias, type } = entity\n return desc(name, alias, type)\n}\n\nexport const descOutput = (output: Output) => {\n const { name, alias } = output\n return desc(name, alias, 'output')\n}\n\nexport const descFilter = (filter: Filter) => {\n const { name, alias } = filter\n return desc(name, alias, 'filter')\n}\n","import React, { useContext, useState } from 'react'\n\nimport { Switch, Tooltip } from '@material-ui/core'\n\nimport { MessageContext } from '../context/MessageContext'\nimport fetchAPI from '../helpers/fetchAPI'\nimport { Entity } from './Types'\nimport { descEntity } from './helpers'\n\ninterface Props {\n entity: Entity\n}\n\nexport default ({ entity }: Props) => {\n const [status, setStatus] = useState(entity.enabled)\n const { showMessage } = useContext(MessageContext)\n\n let url = `/outputs/${entity.id}`\n if (entity.type === 'filter') {\n url = `/outputs/${entity.parentId}/filters/${entity.id}`\n }\n\n async function switchEntityStatus(event: React.ChangeEvent, check: boolean) {\n const update = { ...entity, enabled: check }\n try {\n const res = await fetchAPI(url, null, {\n method: 'PUT',\n body: JSON.stringify(update),\n })\n if (res.ok) {\n setStatus(check)\n showMessage(`${descEntity(entity)} ${check ? 'enabled' : 'disabled'}`)\n } else {\n throw new Error(res.statusText)\n }\n } catch (err) {\n showMessage(`Unable to update ${descEntity(entity)}: ${err.message}`, 'error')\n }\n }\n\n return (\n \n \n \n )\n}\n","import React from 'react'\n\nimport { makeStyles, Theme } from '@material-ui/core'\nimport { green } from '@material-ui/core/colors'\n\nimport classNames from '../helpers/classNames'\nimport { Entity } from './Types'\n\nconst useStyles = makeStyles((theme: Theme) => ({\n status: {\n display: 'inline-block',\n alignItems: 'center',\n backgroundColor: theme.palette.primary.main,\n color: theme.palette.primary.contrastText,\n minWidth: '2em',\n minHeight: '2em',\n padding: '.5em!important',\n lineHeight: '1em',\n borderRadius: '500rem',\n textAlign: 'center',\n },\n error: {\n backgroundColor: theme.palette.error.dark,\n },\n success: {\n backgroundColor: green[600],\n },\n}))\n\ninterface Props {\n entity: Entity\n error?: boolean\n}\n\nexport default ({ entity, error = false }: Props) => {\n const classes = useStyles()\n if (error) {\n if (entity.nbError > 0) {\n return
{entity.nbError}
\n }\n } else if (entity.nbSuccess > 0) {\n return
{entity.nbSuccess}
\n }\n return -\n}\n","import MaterialTable from '@material-table/core'\nimport React, { useContext, useState } from 'react'\nimport { RouteComponentProps, withRouter } from 'react-router'\n\nimport Ellipsis from '../common/Ellipsis'\nimport Message from '../common/Message'\nimport { MessageContext } from '../context/MessageContext'\nimport fetchAPI from '../helpers/fetchAPI'\nimport { Entity } from './Types'\nimport EntityControl from './EntityControl'\nimport EntityStatus from './EntityStatus'\nimport { descEntity } from './helpers'\n\ninterface Props {\n entities: Entity[]\n}\n\nconst columns = [\n {\n title: 'Enabled',\n render: (entity: Entity) => !!entity && ,\n sorting: false,\n searchable: false,\n },\n {\n title: 'Alias',\n field: 'alias',\n },\n {\n title: 'Type',\n field: 'name',\n },\n {\n title: 'Success',\n render: (entity: Entity) => !!entity && ,\n searchable: false,\n },\n {\n title: 'Error',\n render: (entity: Entity) => !!entity && ,\n searchable: false,\n },\n {\n title: 'Condition',\n field: 'condition',\n render: (entity: Entity) => ,\n },\n]\n\nexport default withRouter(({ entities, history }: Props & RouteComponentProps) => {\n const [data, setData] = useState(entities)\n const [error, setError] = useState(null)\n const { showMessage } = useContext(MessageContext)\n\n const onRowDelete = async (old: Entity) => {\n const { id } = old\n let url = `/outputs/${id}`\n if (old.type === 'filter') {\n url = `/outputs/${old.parentId}/filters/${id}`\n }\n try {\n const res = await fetchAPI(url, null, { method: 'DELETE' })\n if (res.ok) {\n setError(null)\n showMessage(`${descEntity(old)} removed`)\n return setData(data.filter((f) => f.id !== id && f.parentId !== id))\n }\n const _err = await res.json()\n throw new Error(_err.detail || res.statusText)\n } catch (err) {\n setError(err)\n throw err\n }\n }\n\n return (\n <>\n {!!error && }\n rows.find((a) => a.id === row.parentId)}\n editable={{\n onRowDelete,\n }}\n options={{\n actionsColumnIndex: -1,\n paging: false,\n searchAutoFocus: true,\n }}\n actions={[\n (rowData: Entity) => ({\n icon: 'build',\n tooltip: 'Configure',\n onClick: (event, rowData) => history.push(`/outputs/${(rowData as Entity).id}`),\n hidden: rowData.type !== 'output',\n }),\n (rowData: Entity) => ({\n icon: 'playlist_add',\n tooltip: 'Add filter',\n onClick: (event, rowData) => history.push(`/outputs/${(rowData as Entity).id}/filters/add`),\n hidden: rowData.type !== 'output',\n }),\n (rowData: Entity) => ({\n icon: 'build',\n tooltip: 'Configure',\n onClick: (event, rowData) =>\n history.push(`/outputs/${(rowData as Entity).parentId}/filters/${(rowData as Entity).id}`),\n hidden: rowData.type !== 'filter',\n }),\n {\n icon: 'add_box',\n tooltip: 'Add',\n isFreeAction: true,\n onClick: () => history.push('/outputs/add'),\n },\n ]}\n />\n \n )\n})\n","import React from 'react'\n\nimport Loader from '../common/Loader'\nimport Message from '../common/Message'\nimport matchResponse from '../helpers/matchResponse'\nimport { useAPI, usePageTitle } from '../hooks'\nimport { Output, Entity } from './Types'\nimport EntityList from './EntityList'\n\ntype OutputsResponse = Output[]\n\nconst buildEntitiesFromOutputs = (outputs: OutputsResponse) => {\n return outputs.reduce((acc: Entity[], output) => {\n const { filters, ...rest } = output\n const entity: Entity = { ...rest, type: 'output' }\n acc.push(entity)\n if (filters) {\n const sub = filters.map((filter) => {\n const f: Entity = { ...filter, type: 'filter' }\n f.parentId = entity.id\n return f\n })\n acc.push(...sub)\n }\n return acc\n }, [])\n}\n\nexport default () => {\n usePageTitle('outputs')\n const [loading, outputs, error] = useAPI('/outputs')\n\n const render = matchResponse({\n Loading: () => ,\n Data: (data) => ,\n Error: (err) => ,\n })\n\n return <>{render(loading, outputs, error)}\n}\n","import React, { useContext, useState } from 'react'\nimport { RouteComponentProps } from 'react-router'\n\nimport { Typography } from '@material-ui/core'\n\nimport Message from '../../common/Message'\nimport { MessageContext } from '../../context/MessageContext'\nimport fetchAPI from '../../helpers/fetchAPI'\nimport { usePageTitle } from '../../hooks'\nimport ConfigForm from '../ConfigForm'\nimport SpecSelector from '../SpecSelector'\nimport { FilterForm, Spec } from '../Types'\n\ntype Props = RouteComponentProps<{ id: string }>\n\nexport default ({ match, history }: Props) => {\n const { id } = match.params\n usePageTitle('add filter')\n const [spec, setSpec] = useState(null)\n const [error, setError] = useState(null)\n const { showMessage } = useContext(MessageContext)\n\n function handleSelectSpec(spec: Spec) {\n setError(null)\n setSpec(spec)\n }\n\n function handleBack() {\n setError(null)\n setSpec(null)\n }\n\n async function handleSave(form: FilterForm) {\n try {\n const res = await fetchAPI(`/outputs/${id}/filters`, null, {\n method: 'POST',\n body: JSON.stringify(form),\n })\n if (!res.ok) {\n const msg = await res.text()\n throw new Error(msg)\n }\n const data = await res.json()\n showMessage(`Filter ${data.name} added`)\n history.push('/outputs')\n } catch (err) {\n setError(err)\n }\n }\n\n if (spec === null) {\n return (\n <>\n \n Add filter: Choose\n \n \n \n )\n }\n\n return (\n <>\n \n Add filter: Configure\n \n {!!error && }\n \n \n )\n}\n","import React, { useContext, useState } from 'react'\nimport { RouteComponentProps } from 'react-router'\n\nimport { Typography } from '@material-ui/core'\n\nimport Loader from '../../common/Loader'\nimport Message from '../../common/Message'\nimport { MessageContext } from '../../context/MessageContext'\nimport fetchAPI from '../../helpers/fetchAPI'\nimport matchResponse from '../../helpers/matchResponse'\nimport { useAPI, usePageTitle } from '../../hooks'\nimport ConfigForm from '../ConfigForm'\nimport { descFilter, descOutput } from '../helpers'\nimport { FilterForm, Output } from '../Types'\nimport { FilterSpecsContext } from './FilterSpecsContext'\n\ntype Props = RouteComponentProps<{\n id: string\n filterId: string\n}>\n\nexport default ({ match, history }: Props) => {\n const { id, filterId } = match.params\n usePageTitle(`edit filter`)\n\n const [error, setError] = useState(null)\n const { showMessage } = useContext(MessageContext)\n const [loading, output, fetchError] = useAPI(`/outputs/${id}`)\n const { specs } = useContext(FilterSpecsContext)\n\n function handleBack() {\n history.push('/outputs')\n }\n\n async function handleSave(form: FilterForm) {\n try {\n const res = await fetchAPI(`/outputs/${id}/filters/${filterId}`, null, {\n method: 'PUT',\n body: JSON.stringify(form),\n })\n if (!res.ok) {\n const msg = await res.text()\n throw new Error(msg)\n }\n const data = await res.json()\n const filterDesc = descFilter(data)\n showMessage(`${filterDesc} configured`)\n history.push('/outputs')\n } catch (err) {\n setError(err)\n }\n }\n\n const render = matchResponse({\n Loading: () => ,\n Data: (data) => {\n const outputDesc = descOutput(data)\n if (!data.filters || data.filters.length === 0) {\n return \n }\n const filter = data.filters.find((f) => f.id === filterId)\n if (!filter) {\n return \n }\n const spec = specs.find((f) => f.name === filter.name)\n if (!spec) {\n return \n }\n return (\n <>\n \n Configure filter\n \n {!!error && }\n \n \n )\n },\n Error: (err) => ,\n })\n\n return <>{render(loading, output, fetchError)}\n}\n","import React from 'react'\nimport { Route, RouteComponentProps, Switch } from 'react-router-dom'\n\nimport OutputCreate from './OutputCreate'\nimport OutputEdit from './OutputEdit'\nimport Outputs from './Outputs'\nimport { OutputSpecsProvider } from './OutputSpecsContext'\nimport { FilterSpecsProvider } from './filters/FilterSpecsContext'\nimport FilterCreate from './filters/FilterCreate'\nimport FilterEdit from './filters/FilterEdit'\n\nexport default ({ match }: RouteComponentProps) => (\n \n \n \n \n \n \n \n \n \n \n \n)\n","import React from 'react'\nimport { Redirect, Route, Switch } from 'react-router-dom'\n\nimport About from './about/About'\nimport Explore from './explore/Explore'\nimport FeedRoutes from './feeds/Routes'\nimport OutputRoutes from './outputs/Routes'\n\nconst Routes = () => (\n \n \n \n \n \n \n \n)\n\nexport default Routes\n","import React from 'react'\nimport { HashRouter as Router, Link } from 'react-router-dom'\n\nimport { AppBar, Container, CssBaseline, Divider, Drawer, IconButton, Toolbar, Typography } from '@material-ui/core'\nimport { blue, pink } from '@material-ui/core/colors'\nimport { createMuiTheme, makeStyles, Theme } from '@material-ui/core/styles'\nimport { ChevronLeft as ChevronLeftIcon, Info as AboutIcon, Menu as MenuIcon } from '@material-ui/icons'\nimport { ThemeProvider } from '@material-ui/styles'\n\nimport { AuthNProvider } from './context/AuthenticationContext'\nimport { ConfigProvider } from './context/ConfigContext'\nimport { MessageProvider } from './context/MessageContext'\nimport classNames from './helpers/classNames'\nimport Menu from './Menu'\nimport Snackbar from './common/Snackbar'\nimport Routes from './Routes'\n\nconst theme = createMuiTheme({\n palette: {\n primary: blue,\n secondary: pink,\n },\n})\n\nconst drawerWidth = 240\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n display: 'flex',\n },\n toolbar: {\n paddingRight: 24, // keep right padding when drawer closed\n },\n toolbarIcon: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'flex-end',\n padding: '0 8px',\n ...theme.mixins.toolbar,\n },\n appBar: {\n zIndex: theme.zIndex.drawer + 1,\n transition: theme.transitions.create(['width', 'margin'], {\n easing: theme.transitions.easing.sharp,\n duration: theme.transitions.duration.leavingScreen,\n }),\n },\n appBarShift: {\n marginLeft: drawerWidth,\n width: `calc(100% - ${drawerWidth}px)`,\n transition: theme.transitions.create(['width', 'margin'], {\n easing: theme.transitions.easing.sharp,\n duration: theme.transitions.duration.enteringScreen,\n }),\n },\n menuButton: {\n marginRight: 36,\n },\n menuButtonHidden: {\n display: 'none',\n },\n title: {\n flexGrow: 1,\n },\n drawerPaper: {\n position: 'relative',\n whiteSpace: 'nowrap',\n width: drawerWidth,\n transition: theme.transitions.create('width', {\n easing: theme.transitions.easing.sharp,\n duration: theme.transitions.duration.enteringScreen,\n }),\n },\n drawerPaperClose: {\n overflowX: 'hidden',\n transition: theme.transitions.create('width', {\n easing: theme.transitions.easing.sharp,\n duration: theme.transitions.duration.leavingScreen,\n }),\n width: theme.spacing(7),\n [theme.breakpoints.up('sm')]: {\n width: theme.spacing(9),\n },\n },\n appBarSpacer: theme.mixins.toolbar,\n content: {\n flexGrow: 1,\n height: '100vh',\n overflow: 'auto',\n },\n container: {\n paddingTop: theme.spacing(4),\n paddingBottom: theme.spacing(4),\n },\n paper: {\n padding: theme.spacing(2),\n display: 'flex',\n overflow: 'auto',\n flexDirection: 'column',\n },\n fixedHeight: {\n height: 240,\n },\n}))\n\nexport default () => {\n const classes = useStyles({})\n\n const [open, setOpen] = React.useState(true)\n const handleDrawerOpen = () => setOpen(true)\n const handleDrawerClose = () => setOpen(false)\n\n return (\n \n \n \n \n \n \n \n \n \n \n \n Feedpushr\n \n \n \n \n \n \n \n
\n \n \n \n
\n \n \n \n \n
\n
\n \n \n \n
\n \n
\n \n \n \n \n )\n}\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 https://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(/^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/)\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 https://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 (response.status === 404 || (contentType != null && contentType.indexOf('javascript') === -1)) {\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('No internet connection found. App is running in offline mode.')\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 https://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\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 './index.css'\nimport App from './App'\nimport * as serviceWorker from './serviceWorker'\n\nReactDOM.render(, document.getElementById('root'))\n\nserviceWorker.unregister()\n"],"sourceRoot":""}