From 9dacd1944dfd6be7d06cf0d3b92b4753902c90d9 Mon Sep 17 00:00:00 2001 From: william Date: Tue, 24 Jan 2023 22:37:57 -0500 Subject: [PATCH] Changes... --- .fleet/run.json | 12 ++ .fleet/settings.json | 0 package-lock.json | 115 ++++++++++++++++++++ package.json | 3 + src/App.css | 38 ------- src/App.tsx | 17 ++- src/api.ts | 8 ++ src/components/ExternalTrackCard.tsx | 43 ++++++++ src/components/Icon.tsx | 35 ++++++ src/components/NavTab.tsx | 27 +++++ src/components/SearchSongForm.tsx | 29 +++++ src/components/SongDisplay.tsx | 16 --- src/components/TrackDisplay.tsx | 16 +++ src/containers/Navbar.container.tsx | 28 +++++ src/containers/Search.container.tsx | 74 +++++++++++-- src/containers/SearchResult.container.tsx | 44 ++++++++ src/images/Spotify_Icon_RGB_Black.png | Bin 0 -> 16260 bytes src/images/Spotify_Icon_RGB_Green.png | Bin 0 -> 16410 bytes src/images/Spotify_Icon_RGB_White.png | Bin 0 -> 14904 bytes src/images/Spotify_Logo_RGB_White.png | Bin 0 -> 43822 bytes src/index.css | 13 --- src/index.tsx | 23 +++- src/model/externalTrack.model.ts | 41 +++++++ src/model/{song.model.ts => track.model.ts} | 12 +- src/style/_theme.scss | 32 ++++++ src/style/index.scss | 28 +++++ src/style/navbar.scss | 34 ++++++ src/style/search-results.scss | 59 ++++++++++ 28 files changed, 652 insertions(+), 95 deletions(-) create mode 100644 .fleet/run.json create mode 100644 .fleet/settings.json delete mode 100644 src/App.css create mode 100644 src/api.ts create mode 100644 src/components/ExternalTrackCard.tsx create mode 100644 src/components/Icon.tsx create mode 100644 src/components/NavTab.tsx create mode 100644 src/components/SearchSongForm.tsx delete mode 100644 src/components/SongDisplay.tsx create mode 100644 src/components/TrackDisplay.tsx create mode 100644 src/containers/Navbar.container.tsx create mode 100644 src/containers/SearchResult.container.tsx create mode 100755 src/images/Spotify_Icon_RGB_Black.png create mode 100755 src/images/Spotify_Icon_RGB_Green.png create mode 100755 src/images/Spotify_Icon_RGB_White.png create mode 100755 src/images/Spotify_Logo_RGB_White.png delete mode 100644 src/index.css create mode 100644 src/model/externalTrack.model.ts rename src/model/{song.model.ts => track.model.ts} (61%) create mode 100644 src/style/_theme.scss create mode 100644 src/style/index.scss create mode 100644 src/style/navbar.scss create mode 100644 src/style/search-results.scss diff --git a/.fleet/run.json b/.fleet/run.json new file mode 100644 index 0000000..b87890c --- /dev/null +++ b/.fleet/run.json @@ -0,0 +1,12 @@ +{ + "configurations": [ + { + "name": "Start Frontend", + "type": "command", + "program": "npm", + "args": [ + "start" + ] + } + ] +} \ No newline at end of file diff --git a/.fleet/settings.json b/.fleet/settings.json new file mode 100644 index 0000000..e69de29 diff --git a/package-lock.json b/package-lock.json index 8682fbb..2fe0008 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,14 +15,17 @@ "@types/node": "^16.18.10", "@types/react": "^18.0.26", "@types/react-dom": "^18.0.9", + "@types/react-router-bootstrap": "^0.24.5", "axios": "^1.2.1", "bootstrap": "^5.2.3", + "bootstrap-icons": "^1.10.3", "react": "^18.2.0", "react-bootstrap": "^2.7.0", "react-dom": "^18.2.0", "react-router-bootstrap": "^0.26.2", "react-router-dom": "^6.6.0", "react-scripts": "5.0.1", + "sass": "^1.57.1", "typescript": "^4.9.4", "web-vitals": "^2.1.4" } @@ -3817,6 +3820,11 @@ "@types/node": "*" } }, + "node_modules/@types/history": { + "version": "4.7.11", + "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", + "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==" + }, "node_modules/@types/html-minifier-terser": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", @@ -3928,6 +3936,34 @@ "@types/react": "*" } }, + "node_modules/@types/react-router": { + "version": "5.1.20", + "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz", + "integrity": "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*" + } + }, + "node_modules/@types/react-router-bootstrap": { + "version": "0.24.5", + "resolved": "https://registry.npmjs.org/@types/react-router-bootstrap/-/react-router-bootstrap-0.24.5.tgz", + "integrity": "sha512-GRx/8xF/skw4/Pmm6d+xbExi8gobCLOe8Eoz9kXPQGbYo7p5Wbi61tjpOF5AbfJ5XMN+fIzweToTi56odj/LOQ==", + "dependencies": { + "@types/react": "*", + "@types/react-router-dom": "*" + } + }, + "node_modules/@types/react-router-dom": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz", + "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router": "*" + } + }, "node_modules/@types/react-transition-group": { "version": "4.4.5", "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.5.tgz", @@ -5266,6 +5302,11 @@ "@popperjs/core": "^2.11.6" } }, + "node_modules/bootstrap-icons": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/bootstrap-icons/-/bootstrap-icons-1.10.3.tgz", + "integrity": "sha512-7Qvj0j0idEm/DdX9Q0CpxAnJYqBCFCiUI6qzSPYfERMcokVuV9Mdm/AJiVZI8+Gawe4h/l6zFcOzvV7oXCZArw==" + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -8748,6 +8789,11 @@ "url": "https://opencollective.com/immer" } }, + "node_modules/immutable": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.2.1.tgz", + "integrity": "sha512-7WYV7Q5BTs0nlQm7tl92rDYYoyELLKHoDMBKhrxEoiV4mrfVdRz8hzPiYOzH7yWjzoVEamxRuAqhxL2PLRwZYQ==" + }, "node_modules/import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", @@ -14742,6 +14788,22 @@ "resolved": "https://registry.npmjs.org/sanitize.css/-/sanitize.css-13.0.0.tgz", "integrity": "sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA==" }, + "node_modules/sass": { + "version": "1.57.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.57.1.tgz", + "integrity": "sha512-O2+LwLS79op7GI0xZ8fqzF7X2m/m8WFfI02dHOdsK5R2ECeS5F62zrwg/relM1rjSLy7Vd/DiMNIvPrQGsA0jw==", + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/sass-loader": { "version": "12.6.0", "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz", @@ -19642,6 +19704,11 @@ "@types/node": "*" } }, + "@types/history": { + "version": "4.7.11", + "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", + "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==" + }, "@types/html-minifier-terser": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", @@ -19753,6 +19820,34 @@ "@types/react": "*" } }, + "@types/react-router": { + "version": "5.1.20", + "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz", + "integrity": "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==", + "requires": { + "@types/history": "^4.7.11", + "@types/react": "*" + } + }, + "@types/react-router-bootstrap": { + "version": "0.24.5", + "resolved": "https://registry.npmjs.org/@types/react-router-bootstrap/-/react-router-bootstrap-0.24.5.tgz", + "integrity": "sha512-GRx/8xF/skw4/Pmm6d+xbExi8gobCLOe8Eoz9kXPQGbYo7p5Wbi61tjpOF5AbfJ5XMN+fIzweToTi56odj/LOQ==", + "requires": { + "@types/react": "*", + "@types/react-router-dom": "*" + } + }, + "@types/react-router-dom": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz", + "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==", + "requires": { + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router": "*" + } + }, "@types/react-transition-group": { "version": "4.4.5", "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.5.tgz", @@ -20759,6 +20854,11 @@ "integrity": "sha512-cEKPM+fwb3cT8NzQZYEu4HilJ3anCrWqh3CHAok1p9jXqMPsPTBhU25fBckEJHJ/p+tTxTFTsFQGM+gaHpi3QQ==", "requires": {} }, + "bootstrap-icons": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/bootstrap-icons/-/bootstrap-icons-1.10.3.tgz", + "integrity": "sha512-7Qvj0j0idEm/DdX9Q0CpxAnJYqBCFCiUI6qzSPYfERMcokVuV9Mdm/AJiVZI8+Gawe4h/l6zFcOzvV7oXCZArw==" + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -23291,6 +23391,11 @@ "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.16.tgz", "integrity": "sha512-qenGE7CstVm1NrHQbMh8YaSzTZTFNP3zPqr3YU0S0UY441j4bJTg4A2Hh5KAhwgaiU6ZZ1Ar6y/2f4TblnMReQ==" }, + "immutable": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.2.1.tgz", + "integrity": "sha512-7WYV7Q5BTs0nlQm7tl92rDYYoyELLKHoDMBKhrxEoiV4mrfVdRz8hzPiYOzH7yWjzoVEamxRuAqhxL2PLRwZYQ==" + }, "import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", @@ -27417,6 +27522,16 @@ "resolved": "https://registry.npmjs.org/sanitize.css/-/sanitize.css-13.0.0.tgz", "integrity": "sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA==" }, + "sass": { + "version": "1.57.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.57.1.tgz", + "integrity": "sha512-O2+LwLS79op7GI0xZ8fqzF7X2m/m8WFfI02dHOdsK5R2ECeS5F62zrwg/relM1rjSLy7Vd/DiMNIvPrQGsA0jw==", + "requires": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + } + }, "sass-loader": { "version": "12.6.0", "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz", diff --git a/package.json b/package.json index a6c1659..e95e4df 100644 --- a/package.json +++ b/package.json @@ -10,14 +10,17 @@ "@types/node": "^16.18.10", "@types/react": "^18.0.26", "@types/react-dom": "^18.0.9", + "@types/react-router-bootstrap": "^0.24.5", "axios": "^1.2.1", "bootstrap": "^5.2.3", + "bootstrap-icons": "^1.10.3", "react": "^18.2.0", "react-bootstrap": "^2.7.0", "react-dom": "^18.2.0", "react-router-bootstrap": "^0.26.2", "react-router-dom": "^6.6.0", "react-scripts": "5.0.1", + "sass": "^1.57.1", "typescript": "^4.9.4", "web-vitals": "^2.1.4" }, diff --git a/src/App.css b/src/App.css deleted file mode 100644 index 74b5e05..0000000 --- a/src/App.css +++ /dev/null @@ -1,38 +0,0 @@ -.App { - text-align: center; -} - -.App-logo { - height: 40vmin; - pointer-events: none; -} - -@media (prefers-reduced-motion: no-preference) { - .App-logo { - animation: App-logo-spin infinite 20s linear; - } -} - -.App-header { - background-color: #282c34; - min-height: 100vh; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - font-size: calc(10px + 2vmin); - color: white; -} - -.App-link { - color: #61dafb; -} - -@keyframes App-logo-spin { - from { - transform: rotate(0deg); - } - to { - transform: rotate(360deg); - } -} diff --git a/src/App.tsx b/src/App.tsx index 5f1bec8..9de7f2f 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,21 +1,20 @@ -import axios from 'axios'; import React, {useEffect, useState} from 'react'; -import './App.css'; -import SongDisplay from './components/SongDisplay'; -import Song from './model/song.model'; +import TrackDisplay from './components/TrackDisplay'; +import api from "./api"; +import Track from './model/track.model'; const App: React.FC = () => { - const [songs, setSongs] = useState(new Array()); + const [tracks, setTracks] = useState(new Array()); useEffect(() => { - axios.get("http://localhost:8080/api/v1/song/") - .then(response => setSongs(response.data)); + api.get("/tracks/") + .then(response => setTracks(response.data)); }, []); return (
- {songs.map(s => ( - + {tracks.map(t => ( + ))}
); diff --git a/src/api.ts b/src/api.ts new file mode 100644 index 0000000..b849c08 --- /dev/null +++ b/src/api.ts @@ -0,0 +1,8 @@ +import axios from "axios"; + +const api = axios.create({ + baseURL: "http://localhost:8080/api/v1", + withCredentials: true +}); + +export default api; \ No newline at end of file diff --git a/src/components/ExternalTrackCard.tsx b/src/components/ExternalTrackCard.tsx new file mode 100644 index 0000000..89d781c --- /dev/null +++ b/src/components/ExternalTrackCard.tsx @@ -0,0 +1,43 @@ +import React, {FC} from "react"; +import ExternalTrack from "../model/externalTrack.model"; +import Icon from "./Icon"; + +const ExternalTrackCard: FC = ({ + track, + source, + imported, + previewing, + onImportClick, + onPreviewClick, + onSpotifyIconClick + }) => ( +
+ {'Thumbnail +
+

{track.name}

+

{track.authors.join(', ') + ' - ' + track.albumName}

+
+
+ {previewing ? + : + } + + {imported ? + : + } +
+
+); + +interface ExternalTrackCardProps { + track: ExternalTrack, + source: string, + imported: boolean, + previewing: boolean, + onImportClick: () => void, + onPreviewClick: () => void, + onSpotifyIconClick: () => void +} + +export default ExternalTrackCard; \ No newline at end of file diff --git a/src/components/Icon.tsx b/src/components/Icon.tsx new file mode 100644 index 0000000..0fd5ab2 --- /dev/null +++ b/src/components/Icon.tsx @@ -0,0 +1,35 @@ +import {FC, useEffect, useState} from "react"; + +const Icon: FC = ({name, hover, title, onClick}) => { + const [hovering, setHovering] = useState(false); + const [className, setClassName] = useState("bi bi-" + name); + + useEffect(() => { + let icon; + + if (hover && hovering) { + icon = hover; + } else { + icon = name; + } + + setClassName("bi bi-" + icon); + }, [hovering, name, hover]); + + return ( + setHovering(true)} + onMouseLeave={() => setHovering(false)} + onClick={onClick}> + ); +}; + +interface IconProps { + name: string + hover?: string + title?: string + onClick?: () => void +} + +export default Icon; \ No newline at end of file diff --git a/src/components/NavTab.tsx b/src/components/NavTab.tsx new file mode 100644 index 0000000..dc27bb4 --- /dev/null +++ b/src/components/NavTab.tsx @@ -0,0 +1,27 @@ +import React, {FC} from "react"; +import {Nav} from "react-bootstrap"; +import {Link} from "react-router-dom"; + +const NavTab: FC = ({eventKey, label, icon, activeIcon, activeKey, onTabClick}) => { + const isActive = () => activeKey === eventKey; + + return ( + onTabClick(eventKey)}> + {!isActive() || activeIcon == null ? + : + } + {label} + + ); +}; + +interface NavTabProps { + eventKey: string, + label: string, + icon: string, + activeIcon?: string, + activeKey: string, + onTabClick: (key: string) => void +} + +export default NavTab; \ No newline at end of file diff --git a/src/components/SearchSongForm.tsx b/src/components/SearchSongForm.tsx new file mode 100644 index 0000000..6358493 --- /dev/null +++ b/src/components/SearchSongForm.tsx @@ -0,0 +1,29 @@ +import {FC, FormEvent, useState} from "react"; + +const SearchSongForm: FC = ({submitSearchHandler}) => { + const [searchQuery, setSearchQuery] = useState(""); + + const submitFormHandler = (e: FormEvent) => { + e.preventDefault(); + submitSearchHandler(searchQuery); + }; + + return ( +
+ setSearchQuery(e.currentTarget.value)}/> + +
+ ); +}; + +interface SearchSongFormProps { + submitSearchHandler: (query: string) => void +} + +export default SearchSongForm; \ No newline at end of file diff --git a/src/components/SongDisplay.tsx b/src/components/SongDisplay.tsx deleted file mode 100644 index a560274..0000000 --- a/src/components/SongDisplay.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import React from "react"; -import Song from "../model/song.model"; - -const SongDisplay: React.FC = ({song}) => { - return ( -
-

{song.name} - {song.authors.join(" and ")}

-
- ); -}; - -export interface SongDisplayProps { - song: Song -} - -export default SongDisplay; \ No newline at end of file diff --git a/src/components/TrackDisplay.tsx b/src/components/TrackDisplay.tsx new file mode 100644 index 0000000..7386a78 --- /dev/null +++ b/src/components/TrackDisplay.tsx @@ -0,0 +1,16 @@ +import React from "react"; +import Track from "../model/track.model"; + +const TrackDisplay: React.FC = ({track}) => { + return ( +
+

{track.name} - {track.authors.join(" and ")}

+
+ ); +}; + +export interface TrackDisplayProps { + track: Track +} + +export default TrackDisplay; \ No newline at end of file diff --git a/src/containers/Navbar.container.tsx b/src/containers/Navbar.container.tsx new file mode 100644 index 0000000..2cc8a41 --- /dev/null +++ b/src/containers/Navbar.container.tsx @@ -0,0 +1,28 @@ +import {FC, useState} from "react"; +import {Container, Nav, Navbar} from "react-bootstrap"; +import NavTab from "../components/NavTab"; +import "../style/navbar.scss"; + +const NavbarContainer: FC = () => { + const [activeKey, setActiveKey] = useState("library"); + + return ( + + + + + + ); +}; + +export default NavbarContainer; \ No newline at end of file diff --git a/src/containers/Search.container.tsx b/src/containers/Search.container.tsx index 42d6203..a2680f2 100644 --- a/src/containers/Search.container.tsx +++ b/src/containers/Search.container.tsx @@ -1,15 +1,71 @@ -import React from "react"; +import React, {useEffect, useState} from "react"; +import SearchSongForm from "../components/SearchSongForm"; +import api from "../api"; +import SearchResultContainer from "./SearchResult.container"; +import ExternalTrack from "../model/externalTrack.model"; + +const audio = new Audio(); const SearchContainer: React.FC = () => { + const [results, setResults] = useState({}); + const [previewTrackId, setPreviewTrackId] = useState(""); + const [importedTracksIds, setImportedTracksIds] = useState(new Array()); + + const submitSearchHandler = async (query: string) => { + const response = await api.get("/tracks/search?q=" + query, {withCredentials: true}); + setResults(response.data); + }; + + const onPreviewClick = (trackId: string, previewUrl: string) => { + audio.pause(); + + if (trackId !== previewTrackId) { + audio.src = previewUrl; + audio.play(); + setPreviewTrackId(trackId); + } else { + setPreviewTrackId(""); + } + }; + + const onImportClick = async (trackId: string) => { + if (importedTracksIds.some(id => trackId === id)) { + await api.delete(`/tracks/trackId/spotify/${trackId}`); + setImportedTracksIds(importedTracksIds.filter(id => trackId !== id)); + } else { + await api.post("/tracks/", {source: "spotify", trackId}, {withCredentials: true}); + setImportedTracksIds([...importedTracksIds, trackId]); + } + }; + + const onSpotifyIconClick = (trackId: string) => { + const spotifyTrackUrl = "https://open.spotify.com/track/" + trackId; + window.open(spotifyTrackUrl, "_blank"); + }; + + useEffect(() => { + const getLibraryTrackIds = async () => { + const response = await api.get("/tracks/trackIds/"); + if (response.data.spotify) { + setImportedTracksIds(response.data.spotify); + } + }; + + getLibraryTrackIds(); + }, []); + return ( - <> -
-
- - -
-
- + <> + + {Object.entries(results).map(([source, tracks]) => ( + + ))} + ) } diff --git a/src/containers/SearchResult.container.tsx b/src/containers/SearchResult.container.tsx new file mode 100644 index 0000000..d42f59f --- /dev/null +++ b/src/containers/SearchResult.container.tsx @@ -0,0 +1,44 @@ +import {FC} from "react"; +import ExternalTrackCard from "../components/ExternalTrackCard"; +import ExternalTrack from "../model/externalTrack.model"; +import SpotifyLogo from "../images/Spotify_Logo_RGB_White.png"; +import "../style/search-results.scss"; + +const SearchResultContainer: FC = ({ + source, + importedTracksIds, + previewTrackId, + tracks, + onImportClick, + onPreviewClick, + onSpotifyIconClick + }) => { + return ( +
+ Spotify logo +
+ {tracks.map(s => ( + s.trackId === id)} + previewing={previewTrackId === s.trackId} + onImportClick={() => onImportClick(s.trackId)} + onPreviewClick={() => onPreviewClick(s.trackId, s.previewUrl)} + onSpotifyIconClick={() => onSpotifyIconClick(s.trackId)}/> + ))} +
+
+ ); +}; + +interface SearchResultContainerProps { + source: string, + importedTracksIds: string[], + previewTrackId: string, + tracks: ExternalTrack[], + onImportClick: (trackId: string) => void, + onPreviewClick: (trackId: string, previewUrl: string) => void, + onSpotifyIconClick: (trackId: string) => void +} + +export default SearchResultContainer; \ No newline at end of file diff --git a/src/images/Spotify_Icon_RGB_Black.png b/src/images/Spotify_Icon_RGB_Black.png new file mode 100755 index 0000000000000000000000000000000000000000..4a83bfd6add45ede796ed3f8673238f2cde35761 GIT binary patch literal 16260 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 A4gdfE literal 0 HcmV?d00001 diff --git a/src/images/Spotify_Icon_RGB_Green.png b/src/images/Spotify_Icon_RGB_Green.png new file mode 100755 index 0000000000000000000000000000000000000000..26410e2fe2ec1e88d81aad43aebdb40691e4db3b GIT binary patch literal 16410 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 L-Tx}otRwzE3yc;) literal 0 HcmV?d00001 diff --git a/src/images/Spotify_Icon_RGB_White.png b/src/images/Spotify_Icon_RGB_White.png new file mode 100755 index 0000000000000000000000000000000000000000..44d781fa5669b6bff75f51177c4af01d285efe46 GIT binary patch literal 14904 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 WYf@Ck@CDXgf=lPFoGn2+M*lxc+|h#o literal 0 HcmV?d00001 diff --git a/src/images/Spotify_Logo_RGB_White.png b/src/images/Spotify_Logo_RGB_White.png new file mode 100755 index 0000000000000000000000000000000000000000..fce40d8cbcef06bc51113d6ae704c850e2588591 GIT binary patch literal 43822 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 K`*6wf$^QZ1;qVy% literal 0 HcmV?d00001 diff --git a/src/index.css b/src/index.css deleted file mode 100644 index ec2585e..0000000 --- a/src/index.css +++ /dev/null @@ -1,13 +0,0 @@ -body { - margin: 0; - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', - 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', - sans-serif; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -code { - font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', - monospace; -} diff --git a/src/index.tsx b/src/index.tsx index 8d131b9..7a3f7be 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -1,9 +1,11 @@ import React from 'react'; import ReactDOM from 'react-dom/client'; -import './index.css'; import reportWebVitals from './reportWebVitals'; -import {RouterProvider} from 'react-router-dom'; -import router from './router'; +import {BrowserRouter, Route, Routes} from 'react-router-dom'; +import './style/index.scss'; +import NavbarContainer from "./containers/Navbar.container"; +import SearchContainer from "./containers/Search.container"; +import MainContainer from './containers/Main.container'; const root = ReactDOM.createRoot( document.getElementById('root') as HTMLElement @@ -11,7 +13,20 @@ const root = ReactDOM.createRoot( root.render( - + +
+
+ +
+
+ + }/> + }/> + }/> + +
+
+
); diff --git a/src/model/externalTrack.model.ts b/src/model/externalTrack.model.ts new file mode 100644 index 0000000..ee43a19 --- /dev/null +++ b/src/model/externalTrack.model.ts @@ -0,0 +1,41 @@ +export default class ExternalTrack { + private readonly _trackId: string; + private readonly _name: string; + private readonly _albumName: string; + private readonly _authors: string[]; + private readonly _thumbnailUrl: string; + private readonly _previewUrl: string; + + public constructor(trackId: string, name: string, albumName: string, authors: string[], thumbnailUrl: string, previewUrl: string) { + this._trackId = trackId; + this._name = name; + this._albumName = albumName; + this._authors = authors; + this._thumbnailUrl = thumbnailUrl; + this._previewUrl = previewUrl; + } + + public get trackId(): string { + return this._trackId; + } + + public get name(): string { + return this._name; + } + + public get albumName(): string { + return this._albumName; + } + + public get authors(): string[] { + return this._authors; + } + + public get thumbnailUrl(): string { + return this._thumbnailUrl; + } + + public get previewUrl(): string { + return this._previewUrl; + } +} \ No newline at end of file diff --git a/src/model/song.model.ts b/src/model/track.model.ts similarity index 61% rename from src/model/song.model.ts rename to src/model/track.model.ts index c1cfd24..1e03664 100644 --- a/src/model/song.model.ts +++ b/src/model/track.model.ts @@ -1,12 +1,12 @@ -export default class Song { +export default class Track { private readonly _id: string; - private readonly _songId: string; + private readonly _trackId: string; private readonly _name: string; private readonly _authors: string[]; - public constructor(id: string, songId: string, name: string, authors: string[]) { + public constructor(id: string, trackId: string, name: string, authors: string[]) { this._id = id; - this._songId = songId; + this._trackId = trackId; this._name = name; this._authors = authors; } @@ -15,8 +15,8 @@ export default class Song { return this._id; } - public get songId(): string { - return this._songId; + public get trackId(): string { + return this._trackId; } public get name(): string { diff --git a/src/style/_theme.scss b/src/style/_theme.scss new file mode 100644 index 0000000..e2fcca6 --- /dev/null +++ b/src/style/_theme.scss @@ -0,0 +1,32 @@ +@import "~bootstrap/scss/functions"; +@import "~bootstrap/scss/variables"; +@import "~bootstrap/scss/mixins"; + +/* https://coolors.co/fc8607-8d99ae-edf2f4-29262c-1f1c21 */ + +$color-primary: #fc8607; +$color-background: #191919; +$color-background-2: darken($color-background, 5%); +$font-color-background: white; + +$body-bg: $color-background !default; +$body-color: white; + +$navbar-width: 15rem; + +$theme-colors: ( + "primary": $color-primary, + "secondary": #6c757d, + "success": #28a745, + "danger": #dc3545, + "warning": #ffc107, + "info": #17a2b8, + "light": #f8f9fa, + "dark": $color-background-2 +); +//$theme-colors-rgb: map-loop($theme-colors, to-rgb, "$value"); +//$utilities-colors: map-merge($utilities-colors, $theme-colors-rgb); +//$utilities-text-colors: map-loop($utilities-colors, rgba-css-var, "$key", "text"); +//$utilities-bg-colors: map-loop($utilities-colors, rgba-css-var, "$key", "bg"); + +@import "~bootstrap/scss/bootstrap"; \ No newline at end of file diff --git a/src/style/index.scss b/src/style/index.scss new file mode 100644 index 0000000..19c98bd --- /dev/null +++ b/src/style/index.scss @@ -0,0 +1,28 @@ +@import "~bootstrap/scss/bootstrap"; +@import "~bootstrap-icons/font/bootstrap-icons"; +@import "theme"; + +body { + margin: 0; + padding: 0; + // font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', + // 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', + // sans-serif; + font-family: 'Helvetica Neue', sans-serif; + background-color: $color-background !important; + color: $font-color-background; + overflow: hidden; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +code { + font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', + monospace; +} + +.sidebar { + background-color: $color-background-2; + min-width: 15rem; + height: 100vh; +} \ No newline at end of file diff --git a/src/style/navbar.scss b/src/style/navbar.scss new file mode 100644 index 0000000..2bfd3d5 --- /dev/null +++ b/src/style/navbar.scss @@ -0,0 +1,34 @@ +@import "theme"; + +nav { + background-color: $color-background-2; + width: $navbar-width; + + .navbar-nav { + width: $navbar-width; + flex-direction: column !important; + color: white; + } + + .nav-link { + color: rgba(255, 255, 255, 0.7); + font-weight: bold; + font-size: 1.2em; + display: flex; + flex-direction: row; + align-items: center; + + i, span { + color: rgba(255, 255, 255, 0.7); + margin-right: 1em; + } + + &:hover i, &:hover span, &.active span { + color: white; + } + + &.active i { + color: $color-primary !important; + } + } +} \ No newline at end of file diff --git a/src/style/search-results.scss b/src/style/search-results.scss new file mode 100644 index 0000000..ed2400a --- /dev/null +++ b/src/style/search-results.scss @@ -0,0 +1,59 @@ +@import "theme"; + +$thumbnail-size: 15em; +$wrapper-margin: 1em; +$wrapper-width: calc(100vw - $navbar-width - (2 * $wrapper-margin)); + +.search-results-wrapper { + overflow-x: scroll; + width: $wrapper-width; +} + +.search-results-source-logo { + width: 10em; + margin-top: $wrapper-margin; + margin-left: $wrapper-margin; +} + +.external-track-card { + width: $thumbnail-size; + margin: 1em; + + img.external-track-thumbnail { + width: $thumbnail-size; + height: $thumbnail-size; + margin-bottom: .5em; + } + + .external-track-description { + p { + margin: 0; + } + + .external-track-title { + font-weight: bold; + + &:hover { + text-decoration: underline; + } + + .bi { + margin-left: .25em; + } + } + + .external-track-subtitle { + color: rgba(255, 255, 255, 0.7); + line-height: 1.2em; + } + } + + .external-track-actions { + font-size: 1.2em; + margin-bottom: 1em; + } + + .bi, .external-track-title { + cursor: pointer; + } +} \ No newline at end of file