mirror of
https://github.com/austinried/subtracks.git
synced 2025-12-27 17:19:27 +01:00
* initial react-query experiments * use queries for item screens send the data we do have over routing to prepopulate (album/playlist) use number for starred because sending Date freaks out react-navigation * add in equiv. song cover art fix * reorg, switch artistview over start mapping song cover art when any are available * refactor useStar to queries fix caching for starred items and album cover art * add hook to reset queries on server change * refactor search to use query * fix song cover art setting * use query for artistInfo * remove last bits of library state * cleanup * use query key factory already fixed one wrong key... * require coverart size * let's try no promise queues on these for now * image cache uses query * perf fix for playlist parsing also use placeholder data so we don't have to deal with staleness * drill that disabled also list controls doesn't need its own songs hook/copy * switch to react-native-blob-util for downloads slightly slower but allows us to use DownloadManager, which backgrounds downloads so they are no longer corrupted when the app suspends * add a fake "top songs" based on artist search then sorted by play count/ratings artistview should load now even if topSongs fails * try not to swap between topSongs/search on refetch set queueContext by song list so the index isn't off if the list changes * add content type validation for file fetching also try to speed up existing file return by limiting fs ops * if the HEAD fails, don't queue the download * clean up params * reimpl clear image cache * precompute contextId prevents wrong "is playing" when any mismatch between queue and list * clear images from all servers use external files dir instead of cache * fix pressable disabled flicker don't retry topsongs on failure try to optimize setqueue and fixcoverart a bit * wait for queries during clear * break out fetchExistingFile from fetchFile allows to tell if file is coming from disk or not only show placeholder/loading spinner if actually fetching image * forgot these wouldn't do anything with objects * remove query cache when switching servers * add content-disposition extension gathering add support for progress hook (needs native support still) * added custom RNBU pkg with progress changes * fully unmount tabs when server changes prevents unwanted requests, gives fresh start on switch fix fixCoverArt not re-rendering in certain cases on search * use serverId from fetch deps * fix lint * update licenses * just use the whole lodash package * make using cache buster optional
81 lines
2.1 KiB
TypeScript
81 lines
2.1 KiB
TypeScript
import React, { useCallback, useState } from 'react'
|
|
import { GestureResponderEvent, LayoutRectangle, Pressable, PressableProps, StyleSheet } from 'react-native'
|
|
|
|
type PressableOpacityProps = PressableProps & {
|
|
ripple?: boolean
|
|
rippleColor?: string
|
|
unstable_pressDelay?: number
|
|
}
|
|
|
|
const PressableOpacity: React.FC<PressableOpacityProps> = props => {
|
|
const [opacity, setOpacity] = useState(1)
|
|
const [dimensions, setDimensions] = useState<LayoutRectangle | undefined>(undefined)
|
|
|
|
props = {
|
|
...props,
|
|
unstable_pressDelay: props.unstable_pressDelay === undefined ? 60 : props.unstable_pressDelay,
|
|
}
|
|
|
|
const onPressIn = useCallback<(event: GestureResponderEvent) => void>(
|
|
data => {
|
|
if (props.disabled) {
|
|
return
|
|
}
|
|
setOpacity(0.4)
|
|
props.onPressIn ? props.onPressIn(data) : null
|
|
},
|
|
[props],
|
|
)
|
|
const onPressOut = useCallback<(event: GestureResponderEvent) => void>(
|
|
data => {
|
|
if (props.disabled) {
|
|
return
|
|
}
|
|
setOpacity(1)
|
|
props.onPressOut ? props.onPressOut(data) : null
|
|
},
|
|
[props],
|
|
)
|
|
const onLongPress = useCallback<(event: GestureResponderEvent) => void>(
|
|
data => {
|
|
if (props.disabled) {
|
|
return
|
|
}
|
|
setOpacity(1)
|
|
props.onLongPress ? props.onLongPress(data) : null
|
|
},
|
|
[props],
|
|
)
|
|
|
|
return (
|
|
<Pressable
|
|
{...props}
|
|
// eslint-disable-next-line react-native/no-inline-styles
|
|
style={[styles.pressable, props.style as any, { opacity }, props.disabled ? { opacity: 0.3 } : {}]}
|
|
android_ripple={
|
|
props.ripple
|
|
? {
|
|
color: props.rippleColor || 'rgba(255,255,255,0.26)',
|
|
radius: dimensions ? dimensions.width / 2 : undefined,
|
|
borderless: true,
|
|
}
|
|
: undefined
|
|
}
|
|
onLayout={event => setDimensions(event.nativeEvent.layout)}
|
|
onPressIn={onPressIn}
|
|
onPressOut={onPressOut}
|
|
onLongPress={onLongPress}>
|
|
{props.children}
|
|
</Pressable>
|
|
)
|
|
}
|
|
|
|
const styles = StyleSheet.create({
|
|
pressable: {
|
|
justifyContent: 'center',
|
|
alignItems: 'center',
|
|
},
|
|
})
|
|
|
|
export default React.memo(PressableOpacity)
|