react-native-audio-api
Version:
react-native-audio-api provides system for controlling audio in React Native environment compatible with Web Audio API specification
68 lines (63 loc) • 1.59 kB
text/typescript
import { useMemo } from 'react';
import {
useSharedValue,
useAnimatedStyle,
withTiming,
} from 'react-native-reanimated';
export function formatTime(seconds: number): string {
if (!Number.isFinite(seconds) || seconds < 0) {
return '0:00';
}
const h = Math.floor(seconds / 3600);
const m = Math.floor((seconds % 3600) / 60);
const s = Math.floor(seconds % 60);
if (h > 0) {
return `${h}:${m.toString().padStart(2, '0')}:${s.toString().padStart(2, '0')}`;
} else {
return `${m}:${s.toString().padStart(2, '0')}`;
}
}
export function timeFromLocationX(
locationX: number,
trackWidth: number,
durationSeconds: number
): number {
if (trackWidth <= 0 || durationSeconds <= 0) {
return 0;
}
const pct = Math.max(0, Math.min(1, locationX / trackWidth));
return pct * durationSeconds;
}
export function useExpandableTrackHeight(
trackBarHeight: number,
trackBarHeightPressed: number,
trackBarAnimMs: number
) {
const height = useSharedValue(trackBarHeight);
const animatedStyle = useAnimatedStyle(() => ({
height: height.value,
borderRadius: height.value / 2,
}));
return useMemo(
() => ({
animatedStyle,
expand: () => {
height.value = withTiming(trackBarHeightPressed, {
duration: trackBarAnimMs,
});
},
collapse: () => {
height.value = withTiming(trackBarHeight, {
duration: trackBarAnimMs,
});
},
}),
[
animatedStyle,
height,
trackBarHeight,
trackBarHeightPressed,
trackBarAnimMs,
]
);
}