From f8463676a40656893c2048655e8807099e3adb39 Mon Sep 17 00:00:00 2001 From: piotrruss Date: Mon, 10 Apr 2023 21:57:33 +0200 Subject: add radio app --- apps/Radio/components/App.js | 23 +++++++++++++++++++ apps/Radio/components/List.js | 48 ++++++++++++++++++++++++++++++++++++++++ apps/Radio/components/Search.js | 31 ++++++++++++++++++++++++++ apps/Radio/components/Submenu.js | 21 ++++++++++++++++++ 4 files changed, 123 insertions(+) create mode 100644 apps/Radio/components/App.js create mode 100644 apps/Radio/components/List.js create mode 100644 apps/Radio/components/Search.js create mode 100644 apps/Radio/components/Submenu.js (limited to 'apps/Radio/components') diff --git a/apps/Radio/components/App.js b/apps/Radio/components/App.js new file mode 100644 index 0000000..bd306b4 --- /dev/null +++ b/apps/Radio/components/App.js @@ -0,0 +1,23 @@ +import { useState } from 'react' +import styles from '../styles/Radio.module.scss' + +import Submenu from './Submenu' +import Search from './Search' +import List from './List' + +const App = () => { + const [enqueue, setEnqueue] = useState(false) + const [results, setResults] = useState() + + return ( + <> + +
+ + +
+ + ) +} + +export default App diff --git a/apps/Radio/components/List.js b/apps/Radio/components/List.js new file mode 100644 index 0000000..73e1523 --- /dev/null +++ b/apps/Radio/components/List.js @@ -0,0 +1,48 @@ +import { open } from 'helpers/windowActions' +import appList from 'configs/appList' +import useApps from 'hooks/useApps' +import fetchJson from 'helpers/fetchJson' +import styles from '../styles/Radio.module.scss' + +const play = async (title, station, apps, setApps, enqueue) => { + const streamData = await fetchJson('/api/radio/stream', { + method: 'POST', + body: JSON.stringify({ station }) + }) + + const items = [{ type: 'radio', title, ...streamData }] + + apps && apps.length > 0 && apps.some(a => a && a.name === 'Player') + ? setApps(prev => prev.map(a => a.name === 'Player' ? { ...a, props: { list: { items, enqueue } } } : a)) + : open({ appName: 'Player', ...appList.Player }, setApps, { list: { items, enqueue } }) +} + +const List = ({ results, enqueue }) => { + const { apps, setApps } = useApps() + + return ( +
+
+ {results && results.length === 0 &&
No results
} + {results && results.length > 0 && ( + results.map(({ title, url, logo, genres, locations }) => ( +
play(title, url, apps, setApps, enqueue)}> + title +
+ { title } +
+ {locations.join(', ')} +
+ {genres.map(g => {g})} +
+
+
+
+ )) + )} +
+
+ ) +} + +export default List diff --git a/apps/Radio/components/Search.js b/apps/Radio/components/Search.js new file mode 100644 index 0000000..363a37c --- /dev/null +++ b/apps/Radio/components/Search.js @@ -0,0 +1,31 @@ +import { useState } from 'react' +import styles from '../styles/Radio.module.scss' +import fetchJson from 'helpers/fetchJson' + +const searchQuery = async (query, setResults) => { + const results = await fetchJson('/api/radio/stations', { + method: 'POST', + body: JSON.stringify({ query }) + }) + + setResults(results) +} + +const Search = ({ setResults }) => { + const [query, setQuery] = useState('') + const changeQuery = e => setQuery(e.target.value) + + return ( +
+ + searchQuery(query, setResults)} + > + Search + +
+ ) +} + +export default Search diff --git a/apps/Radio/components/Submenu.js b/apps/Radio/components/Submenu.js new file mode 100644 index 0000000..6b8724b --- /dev/null +++ b/apps/Radio/components/Submenu.js @@ -0,0 +1,21 @@ +import useSettings from 'hooks/useSettings' + +const Submenu = ({ enqueue, setEnqueue }) => { + const { t } = useSettings() + + return ( +
+
+ +
{ setEnqueue(e => !e) }} + > + {t('yt_enqueue')} +
+
+
+ ) +} + +export default Submenu -- cgit v1.2.3