|
1 | | -import { memo, FC, useCallback, useEffect } from 'react'; |
| 1 | +import { memo, FC, useState, useCallback } from 'react'; |
2 | 2 | import TextLoop from 'react-text-loop'; |
3 | 3 |
|
4 | | -import { useStore } from 'services/store'; |
5 | | -import { TNowPlayingData, isNowPlayingData } from 'services/now-playing'; |
| 4 | +import { TNowPlayingData, isNowPlayingData, getNowPlaying } from 'services/api'; |
6 | 5 | import { |
| 6 | + getRandomItem, |
7 | 7 | textLoopIntervals, |
8 | 8 | TVisibilityChangeHandler, |
9 | 9 | useVisibilityChange, |
10 | 10 | } from 'services/utils'; |
11 | 11 | import CoverArt from 'components/CoverArt'; |
12 | 12 | import { Text } from 'components/core'; |
| 13 | +import { useInitialProps } from 'services/context/initial-props'; |
| 14 | +import { ACTIVITIES, PREFIXES } from 'services/copy'; |
13 | 15 |
|
14 | 16 | const clamp = (v: number, min: number, max: number) => |
15 | 17 | Math.max(Math.min(v, max), min); |
@@ -58,22 +60,64 @@ const nowPlayingMarkup = ({ |
58 | 60 | ]; |
59 | 61 | }; |
60 | 62 |
|
61 | | -const DynamicCurrentStatus: FC = memo(() => { |
62 | | - const { dispatch, statuses } = useStore('statuses'); |
63 | | - const statusesMarkup = statuses.map((status) => |
64 | | - isNowPlayingData(status) ? nowPlayingMarkup(status) : status.split(' ') |
65 | | - ); |
| 63 | +const getInitialStatus = (initialStatus: string | null) => { |
| 64 | + const prefix = getRandomItem(PREFIXES); |
| 65 | + const activity = getRandomItem([ |
| 66 | + ...ACTIVITIES, |
| 67 | + ...(initialStatus |
| 68 | + ? new Array(ACTIVITIES.length).fill(initialStatus) // larger weight for custom status |
| 69 | + : []), |
| 70 | + ]); |
| 71 | + |
| 72 | + return `${prefix} ${activity}.`; |
| 73 | +}; |
| 74 | + |
| 75 | +const useStatuses = () => { |
| 76 | + const { |
| 77 | + initialNowPlayingData, |
| 78 | + customStatus, |
| 79 | + spotifyToken, |
| 80 | + } = useInitialProps(); |
| 81 | + |
| 82 | + const [statuses, setStatuses] = useState([ |
| 83 | + initialNowPlayingData ?? getInitialStatus(customStatus), |
| 84 | + ]); |
66 | 85 |
|
67 | | - const visibilityChangeHandler = useCallback<TVisibilityChangeHandler>( |
68 | | - (isHidden) => { |
69 | | - if (!isHidden) dispatch('data/refresh'); |
| 86 | + const updateNowPlaying = useCallback<TVisibilityChangeHandler>( |
| 87 | + async (isHidden) => { |
| 88 | + if (!isHidden) { |
| 89 | + const updatedNowPlayingData = await getNowPlaying(spotifyToken); |
| 90 | + const lastStatus = statuses[statuses.length - 1]; |
| 91 | + const lastNowPlayingData = isNowPlayingData(lastStatus) |
| 92 | + ? lastStatus |
| 93 | + : null; |
| 94 | + |
| 95 | + if ( |
| 96 | + !!updatedNowPlayingData && |
| 97 | + updatedNowPlayingData.uri !== lastNowPlayingData?.uri |
| 98 | + ) { |
| 99 | + console.log( |
| 100 | + `Now playing: ${ |
| 101 | + updatedNowPlayingData.podcastName ?? updatedNowPlayingData.name |
| 102 | + }` |
| 103 | + ); |
| 104 | + setStatuses((prev) => [...prev, updatedNowPlayingData]); |
| 105 | + } |
| 106 | + } |
70 | 107 | }, |
71 | | - [dispatch] |
| 108 | + [spotifyToken, statuses] |
72 | 109 | ); |
73 | 110 |
|
74 | | - useVisibilityChange(visibilityChangeHandler); |
| 111 | + useVisibilityChange(updateNowPlaying); |
| 112 | + |
| 113 | + return statuses; |
| 114 | +}; |
75 | 115 |
|
76 | | - useEffect(() => dispatch('data/refresh'), []); //eslint-disable-line react-hooks/exhaustive-deps |
| 116 | +const DynamicCurrentStatus: FC = memo(() => { |
| 117 | + const statuses = useStatuses(); |
| 118 | + const statusesMarkup = statuses.map((status) => |
| 119 | + isNowPlayingData(status) ? nowPlayingMarkup(status) : status.split(' ') |
| 120 | + ); |
77 | 121 |
|
78 | 122 | return ( |
79 | 123 | <span> |
|
0 commit comments