Dynamic realtime profile ReadMe linked with spotify
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

162 lines
3.9 KiB

import React from "react";
import ReadmeImg from "./ReadmeImg";
import Text from "./Text";
export interface Props {
cover?: string;
track: string;
artist: string;
progress: number;
duration: number;
isPlaying: boolean;
}
export const Player: React.FC<Props> = ({
cover,
track,
artist,
progress,
duration,
isPlaying,
}) => {
return (
<ReadmeImg width="256" height="64">
<style>
{`
.paused {
animation-play-state: paused !important;
background: #e1e4e8 !important;
}
img:not([src]) {
content: url("data:image/gif;base64,R0lGODlhAQABAPAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==");
border-radius: 6px;
background: #FFF;
border: 1px solid #e1e4e8;
}
p {
display: block;
opacity: 0;
}
.progress-bar {
position: relative;
width: 100%;
height: 4px;
margin: -1px;
border: 1px solid #e1e4e8;
border-radius: 4px;
overflow: hidden;
padding: 2px;
z-index: 0;
}
#progress {
position: absolute;
top: -1px;
left: 0;
width: 100%;
height: 6px;
transform-origin: left center;
background-color: #24292e;
animation: progress ${duration}ms linear;
animation-delay: -${progress}ms;
}
.progress-bar,
#track,
#artist,
#cover {
opacity: 0;
animation: appear 300ms ease-out forwards;
}
#track {
animation-delay: 400ms;
}
#artist {
animation-delay: 500ms;
}
.progress-bar {
animation-delay: 550ms;
margin-top: 4px;
}
#cover {
animation-name: cover-appear;
animation-delay: 300ms;
box-shadow: 0 1px 3px rgba(0,0,0,0.1), 0 3px 10px rgba(0,0,0,0.05);
}
#cover:not([src]) {
box-shadow: none;
}
@keyframes cover-appear {
from {
opacity: 0;
transform: scale(0.8);
}
to {
opacity: 1;
transform: scale(1);
}
}
@keyframes appear {
from {
opacity: 0;
transform: translateX(-8px);
}
to {
opacity: 1;
transform: translateX(0);
}
}
@keyframes progress {
from {
transform: scaleX(0)
}
to {
transform: scaleX(1)
}
}
`}
</style>
<div
className={isPlaying ? "disabled" : ""}
style={{
display: "flex",
alignItems: "center",
paddingTop: 8,
paddingLeft: 4,
}}
>
<img id="cover" src={cover ?? null} width="48" height="48" />
<div
style={{
display: "flex",
flex: 1,
flexDirection: "column",
marginTop: -4,
marginLeft: 8,
}}
>
<Text id="track" weight="bold">
{`${track ?? ""} `.trim()}
</Text>
<Text id="artist" color={!track ? "gray" : undefined}>
{artist || "Nothing playing..."}
</Text>
{track && (
<div className="progress-bar">
<div id="progress" className={!isPlaying ? "paused" : ""} />
</div>
)}
</div>
</div>
</ReadmeImg>
);
};