Add files via upload
This commit is contained in:
parent
3b56befc0b
commit
3045a730b4
1 changed files with 0 additions and 81 deletions
|
|
@ -301,87 +301,6 @@ export default function Player() {
|
||||||
</Animated.View>
|
</Animated.View>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
<Text style={s.timeText}>{fmt(progress)}</Text>
|
|
||||||
<Text style={s.timeText}>{fmt(duration)}</Text>
|
|
||||||
</View>
|
|
||||||
</View>
|
|
||||||
|
|
||||||
{/* Controls */}
|
|
||||||
<View style={s.controls}>
|
|
||||||
<CtlBtn onPress={() => { Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light); toggleShuffle(); }} active={shuffle}>
|
|
||||||
<ShuffleIcon active={shuffle} />
|
|
||||||
</CtlBtn>
|
|
||||||
<CtlBtn onPress={onPrev}>
|
|
||||||
<Svg width={28} height={28} viewBox="0 0 28 28" fill="none">
|
|
||||||
<Rect x={5} y={6} width={2.5} height={16} rx={1.2} fill={Colors.text} />
|
|
||||||
<Path d="M22 6L9.5 14 22 22V6z" fill={Colors.text} />
|
|
||||||
</Svg>
|
|
||||||
</CtlBtn>
|
|
||||||
<Pressable style={s.playBtn} onPress={() => { Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Medium); togglePlay(); }}>
|
|
||||||
{playing
|
|
||||||
? <Svg width={26} height={26} viewBox="0 0 24 24"><Rect x={5} y={4} width={4} height={16} rx={1.5} fill={Colors.bg} /><Rect x={15} y={4} width={4} height={16} rx={1.5} fill={Colors.bg} /></Svg>
|
|
||||||
: <Svg width={26} height={26} viewBox="0 0 24 24" fill={Colors.bg}><Path d="M7 4.5v15l13-7.5L7 4.5z" /></Svg>}
|
|
||||||
</Pressable>
|
|
||||||
<CtlBtn onPress={onNext}>
|
|
||||||
<Svg width={28} height={28} viewBox="0 0 28 28" fill="none">
|
|
||||||
<Rect x={20.5} y={6} width={2.5} height={16} rx={1.2} fill={Colors.text} />
|
|
||||||
<Path d="M6 6l12.5 8L6 22V6z" fill={Colors.text} />
|
|
||||||
</Svg>
|
|
||||||
</CtlBtn>
|
|
||||||
<CtlBtn onPress={() => { Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light); cycleRepeat(); }} active={repeat > 0}>
|
|
||||||
<RepeatIcon repeat={repeat} />
|
|
||||||
</CtlBtn>
|
|
||||||
</View>
|
|
||||||
|
|
||||||
{/* Lyrics button */}
|
|
||||||
<View style={s.bottomRow}>
|
|
||||||
<Pressable style={s.lyrBtn} onPress={loadLyrics}>
|
|
||||||
<Svg width={14} height={14} fill="none" stroke={lyricsOpen ? Colors.accent : 'rgba(255,255,255,0.4)'} strokeWidth={2} viewBox="0 0 24 24">
|
|
||||||
<Line x1={3} y1={8} x2={21} y2={8} /><Line x1={3} y1={12} x2={21} y2={12} /><Line x1={3} y1={16} x2={15} y2={16} />
|
|
||||||
</Svg>
|
|
||||||
<Text style={[s.lyrBtnText, lyricsOpen && { color: Colors.accent }]}>
|
|
||||||
{lyricsLoading ? 'Загрузка…' : 'Текст'}
|
|
||||||
</Text>
|
|
||||||
</Pressable>
|
|
||||||
</View>
|
|
||||||
|
|
||||||
</Animated.View>
|
|
||||||
</PanGestureHandler>
|
|
||||||
|
|
||||||
{/* Lyrics sheet */}
|
|
||||||
{lyricsOpen && (
|
|
||||||
<View style={s.lyrSheet}>
|
|
||||||
<Pressable style={StyleSheet.absoluteFill} onPress={() => setLyricsOpen(false)} />
|
|
||||||
<BlurView intensity={40} tint="dark" style={s.lyrInner}>
|
|
||||||
<Pressable onPress={() => setLyricsOpen(false)} style={s.lyrHandleBar}>
|
|
||||||
<View style={s.lyrHandle} />
|
|
||||||
</Pressable>
|
|
||||||
<View style={s.lyrHeader}>
|
|
||||||
{cover
|
|
||||||
? <Image source={{ uri: cover }} style={s.lyrThumb} contentFit="cover" />
|
|
||||||
: <View style={[s.lyrThumb, { backgroundColor: Colors.elevated }]} />}
|
|
||||||
<View style={{ flex: 1, minWidth: 0 }}>
|
|
||||||
<Text style={s.lyrTrackTitle} numberOfLines={1}>{track.title}</Text>
|
|
||||||
<Text style={s.lyrArtist} numberOfLines={1}>{track.artist}</Text>
|
|
||||||
</View>
|
|
||||||
</View>
|
|
||||||
<ScrollView ref={lyricsScrollRef} style={s.lyrScroll} contentContainerStyle={{ paddingVertical: 24, paddingHorizontal: 20 }} showsVerticalScrollIndicator={false}>
|
|
||||||
{lrcLines.length > 0
|
|
||||||
? lrcLines.map((line, i) => (
|
|
||||||
<Text key={i} style={[s.lyrLine, i === currentLineIdx && s.lyrLineActive]} onLayout={(e) => { lineHeights.current[i] = e.nativeEvent.layout.height; }}>
|
|
||||||
{line.text}
|
|
||||||
</Text>
|
|
||||||
))
|
|
||||||
: plainLyrics
|
|
||||||
? <Text style={s.plainLyrics}>{plainLyrics}</Text>
|
|
||||||
: <Text style={s.lyrEmpty}>Текст не найден</Text>}
|
|
||||||
</ScrollView>
|
|
||||||
</BlurView>
|
|
||||||
</View>
|
|
||||||
)}
|
|
||||||
</Animated.View>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
function CtlBtn({ onPress, active = false, children }: { onPress: () => void; active?: boolean; children: React.ReactNode }) {
|
function CtlBtn({ onPress, active = false, children }: { onPress: () => void; active?: boolean; children: React.ReactNode }) {
|
||||||
const sc = useSharedValue(1);
|
const sc = useSharedValue(1);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue