Added url parser to support wider range of addresses

This commit is contained in:
unknown 2021-06-11 15:33:06 +02:00
parent 5968663be4
commit a5504e6e80
7 changed files with 63 additions and 24 deletions

View file

@ -60,3 +60,16 @@ docker run -p 5005:5005 -v <host_dir>:/app/data flame
- Customize your page by choosing from 12 color themes - Customize your page by choosing from 12 color themes
![Homescreen screenshot](./github/_themes.png) ![Homescreen screenshot](./github/_themes.png)
## Usage
### Supported links for applications and bookmarks
#### Rules
- URL starts with `http://`
- Format: `http://www.domain.com`, `http://domain.com`
- Redirect: `{dest}`
- URL starts with `https://`
- Format: `https://www.domain.com`, `https://domain.com`
- Redirect: `https://{dest}`
- URL without protocol
- Format: `www.domain.com`, `domain.com`, `sub.domain.com`, `local`, `ip`, `ip:port`
- Redirect: `http://{dest}`

View file

@ -11,7 +11,6 @@ import Home from './components/Home/Home';
import Apps from './components/Apps/Apps'; import Apps from './components/Apps/Apps';
import Settings from './components/Settings/Settings'; import Settings from './components/Settings/Settings';
import Bookmarks from './components/Bookmarks/Bookmarks'; import Bookmarks from './components/Bookmarks/Bookmarks';
import NotificationCenter from './components/NotificationCenter/NotificationCenter'; import NotificationCenter from './components/NotificationCenter/NotificationCenter';
if (localStorage.theme) { if (localStorage.theme) {

View file

@ -1,8 +1,6 @@
import { Link } from 'react-router-dom';
import classes from './AppCard.module.css'; import classes from './AppCard.module.css';
import Icon from '../../UI/Icons/Icon/Icon'; import Icon from '../../UI/Icons/Icon/Icon';
import { iconParser } from '../../../utility/iconParser'; import { iconParser, urlParser } from '../../../utility';
import { App } from '../../../interfaces'; import { App } from '../../../interfaces';
@ -12,18 +10,16 @@ interface ComponentProps {
} }
const AppCard = (props: ComponentProps): JSX.Element => { const AppCard = (props: ComponentProps): JSX.Element => {
const redirectHandler = (url: string): void => { const [displayUrl, redirectUrl] = urlParser(props.app.url);
window.open(url);
}
return ( return (
<a href={`http://${props.app.url}`} target='_blank' className={classes.AppCard}> <a href={redirectUrl} target='_blank' className={classes.AppCard}>
<div className={classes.AppCardIcon}> <div className={classes.AppCardIcon}>
<Icon icon={iconParser(props.app.icon)} /> <Icon icon={iconParser(props.app.icon)} />
</div> </div>
<div className={classes.AppCardDetails}> <div className={classes.AppCardDetails}>
<h5>{props.app.name}</h5> <h5>{props.app.name}</h5>
<span>{props.app.url}</span> <span>{displayUrl}</span>
</div> </div>
</a> </a>
) )

View file

@ -2,7 +2,7 @@ import { Bookmark, Category } from '../../../interfaces';
import classes from './BookmarkCard.module.css'; import classes from './BookmarkCard.module.css';
import Icon from '../../UI/Icons/Icon/Icon'; import Icon from '../../UI/Icons/Icon/Icon';
import { iconParser } from '../../../utility/iconParser'; import { iconParser, urlParser } from '../../../utility';
interface ComponentProps { interface ComponentProps {
category: Category; category: Category;
@ -13,9 +13,12 @@ const BookmarkCard = (props: ComponentProps): JSX.Element => {
<div className={classes.BookmarkCard}> <div className={classes.BookmarkCard}>
<h3>{props.category.name}</h3> <h3>{props.category.name}</h3>
<div className={classes.Bookmarks}> <div className={classes.Bookmarks}>
{props.category.bookmarks.map((bookmark: Bookmark) => ( {props.category.bookmarks.map((bookmark: Bookmark) => {
const [displayUrl, redirectUrl] = urlParser(bookmark.url);
return (
<a <a
href={`http://${bookmark.url}`} href={redirectUrl}
target='_blank' target='_blank'
key={`bookmark-${bookmark.id}`}> key={`bookmark-${bookmark.id}`}>
{bookmark.icon && ( {bookmark.icon && (
@ -25,7 +28,8 @@ const BookmarkCard = (props: ComponentProps): JSX.Element => {
)} )}
{bookmark.name} {bookmark.name}
</a> </a>
))} )
})}
</div> </div>
</div> </div>
) )

View file

@ -1,3 +1,8 @@
/**
* Parse Material Desgin icon name to be used with mdi/js
* @param mdiName Dash separated icon name from MDI, e.g. alert-box-outline
* @returns Parsed icon name to be used with mdi/js, e.g mdiAlertBoxOutline
*/
export const iconParser = (mdiName: string): string => { export const iconParser = (mdiName: string): string => {
let parsedName = mdiName let parsedName = mdiName
.split('-') .split('-')

View file

@ -0,0 +1,2 @@
export * from './iconParser';
export * from './urlParser';

View file

@ -0,0 +1,20 @@
export const urlParser = (url: string): string[] => {
let parsedUrl: string;
let displayUrl: string;
if (/https?:\/\//.test(url)) {
// Url starts with http[s]:// -> leave it as it is
parsedUrl = url;
} else {
// No protocol -> apply http:// prefix
parsedUrl = `http://${url}`;
}
// Create simplified url to display as text
displayUrl = url
.replace(/https?:\/\//, '')
.replace('www.', '')
.replace(/\/$/, '');
return [displayUrl, parsedUrl]
}