feat(#787): added views peaks
parent
55e15e2b08
commit
24dc9cbf57
@ -0,0 +1,22 @@ |
||||
import { usePageParams } from 'hooks' |
||||
import { useEffect, useState } from 'react' |
||||
import { Peak, getViewPeaks } from 'requests/getViewPeaks' |
||||
|
||||
export const useViewsPeaks = () => { |
||||
const { profileId, sportType } = usePageParams() |
||||
|
||||
const [peaks, setPeaks] = useState<Array<Peak>>([]) |
||||
|
||||
useEffect(() => { |
||||
(async () => { |
||||
const res = await getViewPeaks({ match_id: profileId, sport_id: sportType }) |
||||
if (res) { |
||||
setPeaks(res) |
||||
} |
||||
})() |
||||
}, [profileId, sportType]) |
||||
|
||||
return ( |
||||
{ peaks } |
||||
) |
||||
} |
||||
@ -0,0 +1,32 @@ |
||||
import { useMatchPageStore } from 'features/MatchPage/store' |
||||
import { memo, useMemo } from 'react' |
||||
|
||||
import { |
||||
PeakContainer, |
||||
PeaksList, |
||||
} from './styled' |
||||
|
||||
interface Props { |
||||
duration: number, |
||||
} |
||||
|
||||
export const Peaks: React.FC<Props> = memo(({ duration }) => { |
||||
const { peaks } = useMatchPageStore() |
||||
|
||||
const peaksPrepared = useMemo(() => peaks.map((p) => ( |
||||
{ |
||||
...p, |
||||
left: p.s / (duration / 1000) * 100, |
||||
width: (p.e - p.s) / (duration / 1000) * 100, |
||||
} |
||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||
)), [peaks.length, duration]) |
||||
|
||||
return ( |
||||
<PeaksList> |
||||
{peaksPrepared.map((p) => ( |
||||
<PeakContainer style={{ left: `${p.left}%`, width: `${p.width}%` }} /> |
||||
))} |
||||
</PeaksList> |
||||
) |
||||
}) |
||||
@ -0,0 +1,15 @@ |
||||
import styled from 'styled-components/macro' |
||||
|
||||
export const PeaksList = styled.div` |
||||
width: 100%; |
||||
height: 100%; |
||||
display: flex; |
||||
position: absolute; |
||||
z-index: 3; |
||||
` |
||||
|
||||
export const PeakContainer = styled.div` |
||||
position: relative; |
||||
height: 100%; |
||||
background-color: #5CDD86; |
||||
` |
||||
@ -0,0 +1,23 @@ |
||||
import { API_ROOT } from 'config' |
||||
import { callApi } from 'helpers' |
||||
|
||||
export interface Peak { |
||||
e: number, |
||||
s: number, |
||||
} |
||||
|
||||
export type Props = { |
||||
match_id: number, |
||||
sport_id: number, |
||||
} |
||||
|
||||
export const getViewPeaks = async ({ match_id, sport_id }: Props): Promise<Array<Peak>> => { |
||||
const config = { |
||||
method: 'GET', |
||||
} |
||||
|
||||
return callApi({ |
||||
config, |
||||
url: `${API_ROOT}/v1/views/peaks/${sport_id}/${match_id}`, |
||||
}) |
||||
} |
||||
Loading…
Reference in new issue