Добавил свайпер + надо решить ошибку в футтере
This commit is contained in:
parent
1891c9e7a1
commit
b96ce0d291
2
.gitignore
vendored
2
.gitignore
vendored
@ -11,3 +11,5 @@
|
|||||||
|
|
||||||
# Built Visual Studio Code Extensions
|
# Built Visual Studio Code Extensions
|
||||||
*.vsix
|
*.vsix
|
||||||
|
|
||||||
|
node_modules
|
20
package-lock.json
generated
20
package-lock.json
generated
@ -22,6 +22,7 @@
|
|||||||
"react": "^18.3.1",
|
"react": "^18.3.1",
|
||||||
"react-dom": "^18.3.1",
|
"react-dom": "^18.3.1",
|
||||||
"react-scripts": "5.0.1",
|
"react-scripts": "5.0.1",
|
||||||
|
"swiper": "^11.1.10",
|
||||||
"typescript": "^4.9.5",
|
"typescript": "^4.9.5",
|
||||||
"use-sound": "^4.0.3",
|
"use-sound": "^4.0.3",
|
||||||
"web-vitals": "^2.1.4"
|
"web-vitals": "^2.1.4"
|
||||||
@ -18871,6 +18872,25 @@
|
|||||||
"boolbase": "~1.0.0"
|
"boolbase": "~1.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/swiper": {
|
||||||
|
"version": "11.1.10",
|
||||||
|
"resolved": "https://registry.npmjs.org/swiper/-/swiper-11.1.10.tgz",
|
||||||
|
"integrity": "sha512-pAVM6vCb6bumj2B9aSh67l3wP1j5YR8dPQM1YhQKMpnBc33vs+RpyVz6NZYZl/ZopCBSYbbWK5nvESwbmU0QXQ==",
|
||||||
|
"funding": [
|
||||||
|
{
|
||||||
|
"type": "patreon",
|
||||||
|
"url": "https://www.patreon.com/swiperjs"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "open_collective",
|
||||||
|
"url": "http://opencollective.com/swiper"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"license": "MIT",
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 4.7.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/symbol-tree": {
|
"node_modules/symbol-tree": {
|
||||||
"version": "3.2.4",
|
"version": "3.2.4",
|
||||||
"resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
|
"resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
"react": "^18.3.1",
|
"react": "^18.3.1",
|
||||||
"react-dom": "^18.3.1",
|
"react-dom": "^18.3.1",
|
||||||
"react-scripts": "5.0.1",
|
"react-scripts": "5.0.1",
|
||||||
|
"swiper": "^11.1.10",
|
||||||
"typescript": "^4.9.5",
|
"typescript": "^4.9.5",
|
||||||
"use-sound": "^4.0.3",
|
"use-sound": "^4.0.3",
|
||||||
"web-vitals": "^2.1.4"
|
"web-vitals": "^2.1.4"
|
||||||
|
@ -24,6 +24,7 @@
|
|||||||
color: white;
|
color: white;
|
||||||
bottom: 0;
|
bottom: 0;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
position: absolute;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Добавление градиента к блоку прокрутки */
|
/* Добавление градиента к блоку прокрутки */
|
||||||
|
12
src/App.tsx
12
src/App.tsx
@ -22,15 +22,15 @@ function App() {
|
|||||||
|
|
||||||
async function fetchData() {
|
async function fetchData() {
|
||||||
const responseSongs = await axios.get<ISong[]>('http://localhost:3000/songs');
|
const responseSongs = await axios.get<ISong[]>('http://localhost:3000/songs');
|
||||||
const responseAlbums = await axios.get<IAlbum[]>('http://localhost:3000/albums');
|
// const responseAlbums = await axios.get<IAlbum[]>('http://localhost:3000/albums');
|
||||||
const responseGenres = await axios.get<IGenre[]>('http://localhost:3000/genres');
|
// const responseGenres = await axios.get<IGenre[]>('http://localhost:3000/genres');
|
||||||
const responseBands = await axios.get<IBand[]>('http://localhost:3000/bands');
|
// const responseBands = await axios.get<IBand[]>('http://localhost:3000/bands');
|
||||||
const responsePlaylists = await axios.get<IPlaylist[]>('http://localhost:3000/playlists');
|
const responsePlaylists = await axios.get<IPlaylist[]>('http://localhost:3000/playlists');
|
||||||
|
|
||||||
setSongs(responseSongs.data);
|
setSongs(responseSongs.data);
|
||||||
setAlbums(responseAlbums.data);
|
// setAlbums(responseAlbums.data);
|
||||||
setGenres(responseGenres.data);
|
// setGenres(responseGenres.data);
|
||||||
setBands(responseBands.data);
|
// setBands(responseBands.data);
|
||||||
setPlaylist(responsePlaylists.data);
|
setPlaylist(responsePlaylists.data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,23 +1,44 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { Button } from 'antd';
|
import { Button, Table } from 'antd';
|
||||||
import { Grid, Row, Col } from 'antd';
|
import { PlayCircleOutlined } from '@ant-design/icons';
|
||||||
import PlayCircleOutlined from '@ant-design/icons/PlayCircleOutlined';
|
|
||||||
import { ISong, SongProps } from '../models/IModels';
|
import { ISong, SongProps } from '../models/IModels';
|
||||||
|
|
||||||
export function CurrentTrack({song}: SongProps) {
|
export function CurrentTrack({song}: {song: ISong}) {
|
||||||
|
|
||||||
|
const columns = [
|
||||||
|
{
|
||||||
|
title: 'Play',
|
||||||
|
dataIndex: 'play',
|
||||||
|
key: 'play',
|
||||||
|
width: 50,
|
||||||
|
render: (text: string, song: ISong) => (
|
||||||
|
<img
|
||||||
|
className="w-full h-auto rounded"
|
||||||
|
src={song.cover}
|
||||||
|
alt={song.song_name}
|
||||||
|
/>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '',
|
||||||
|
dataIndex: 'song_name',
|
||||||
|
key: 'song_name',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '',
|
||||||
|
dataIndex: 'band_name',
|
||||||
|
key: 'band_name',
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<span className="flex items-center justify-between p-4 border-3 border-gray-300 bg-slate-300 w-full h-10">
|
<Table
|
||||||
<Row>
|
columns={columns}
|
||||||
<Col span={4}>
|
dataSource={[song]}
|
||||||
<Button type="link"><PlayCircleOutlined /></Button>
|
pagination={false}
|
||||||
</Col>
|
className="w-full bg-slate-300"
|
||||||
<Col span={10} className="flex items-center justify-between">
|
/>
|
||||||
<p className="text-md">Current Track</p>
|
|
||||||
</Col>
|
|
||||||
<Col span={10} className="flex items-center justify-between">
|
|
||||||
<p className="text-md">Current Group</p>
|
|
||||||
</Col>
|
|
||||||
</Row>
|
|
||||||
</span>
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,16 +1,13 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { Button } from 'antd';
|
import { Button } from 'antd';
|
||||||
import { CurrentTrack } from './CurrentTrack';
|
import { CurrentTrack } from './CurrentTrack';
|
||||||
import { ISong, SongProps } from '../models/IModels';
|
import { ISong } from '../models/IModels';
|
||||||
|
|
||||||
export function Footer({song}: SongProps) {
|
export function Footer({song}: {song: ISong}) {
|
||||||
return (
|
return (
|
||||||
<footer id="footer" className="bg-gray-600">
|
<footer id="footer" className="bg-gray-600">
|
||||||
<CurrentTrack song={song} />
|
<CurrentTrack song={song} />
|
||||||
<div className="container mx-auto flex justify-between">
|
<div className="container mx-auto flex justify-between">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<p className="text-lg"> 2022 Music Service</p>
|
<p className="text-lg"> 2022 Music Service</p>
|
||||||
<ul className="flex">
|
<ul className="flex">
|
||||||
<li className="mr-4">
|
<li className="mr-4">
|
||||||
|
@ -1,16 +1,42 @@
|
|||||||
import { IPlaylist } from "../models/IModels";
|
import { IPlaylist } from "../models/IModels";
|
||||||
|
|
||||||
|
import { Navigation, Pagination, Scrollbar, A11y } from 'swiper/modules';
|
||||||
|
|
||||||
|
import { Swiper, SwiperSlide } from 'swiper/react';
|
||||||
|
|
||||||
|
// Import Swiper styles
|
||||||
|
import 'swiper/css';
|
||||||
|
import 'swiper/css/navigation';
|
||||||
|
import 'swiper/css/pagination';
|
||||||
|
import 'swiper/css/scrollbar';
|
||||||
|
|
||||||
export function PlaylistsBlock({playlists}: {playlists: IPlaylist[]}) {
|
export function PlaylistsBlock({playlists}: {playlists: IPlaylist[]}) {
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="flex overflow-x-scroll rounded bg-slate-300" style={{scrollSnapType: 'x mandatory'}}>
|
<div className="container mx-auto content bg-slate-300">
|
||||||
{playlists.map((p: IPlaylist) => (
|
<Swiper
|
||||||
<div key={p.id} className="w-1/3 mr-4" style={{scrollSnapAlign: 'start'}}>
|
// install Swiper modules
|
||||||
<img src={p.cover} alt={p.name} style={{width: 200, height: 'auto'}} className="rounded" />
|
modules={[Navigation, Pagination, Scrollbar, A11y]}
|
||||||
<p className="text-lg">{p.name}</p>
|
spaceBetween={50}
|
||||||
</div>
|
slidesPerView={3}
|
||||||
))}
|
navigation
|
||||||
|
pagination={{ clickable: true }}
|
||||||
|
scrollbar={{ draggable: true }}
|
||||||
|
onSlideChange={() => console.log('slide change')}>
|
||||||
|
{playlists.map((p: IPlaylist) => (
|
||||||
|
<SwiperSlide key={p.id}>
|
||||||
|
<div className="flex overflow-x-scroll rounded bg-slate-300 self-center" style={{scrollSnapType: 'x mandatory', width: '75%', minHeight: 300}}>
|
||||||
|
<img src={p.cover} alt={p.name} style={{minWidth: 200, height: 'auto', minHeight: 200}} className="rounded" />
|
||||||
|
<p className="text-lg">{p.name}</p>
|
||||||
|
</div>
|
||||||
|
</SwiperSlide>
|
||||||
|
))}
|
||||||
|
</Swiper>
|
||||||
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user