Working on first support of svg on mobiles but seems quite complicated
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
import * as React from 'react';
|
import * as React from 'react';
|
||||||
import { View, ImageBackground, Image } from 'react-native';
|
import { View, ImageBackground, Image, Platform } from 'react-native';
|
||||||
import API from '../../API';
|
import API from '../../API';
|
||||||
import { useQuery } from '../../Queries';
|
import { useQuery } from '../../Queries';
|
||||||
import { PianoCC } from '../../views/PlayView';
|
import { PianoCC } from '../../views/PlayView';
|
||||||
@@ -7,6 +7,7 @@ import Animated, { useSharedValue, withTiming, Easing } from 'react-native-reani
|
|||||||
import { CursorInfoItem } from '../../models/SongCursorInfos';
|
import { CursorInfoItem } from '../../models/SongCursorInfos';
|
||||||
import { PianoNotes } from '../../state/SoundPlayerSlice';
|
import { PianoNotes } from '../../state/SoundPlayerSlice';
|
||||||
import { Audio } from 'expo-av';
|
import { Audio } from 'expo-av';
|
||||||
|
import { SvgContainer, GetSvgDims } from './SvgContainer';
|
||||||
|
|
||||||
// note we are also using timestamp in a context
|
// note we are also using timestamp in a context
|
||||||
export type ParitionMagicProps = {
|
export type ParitionMagicProps = {
|
||||||
@@ -17,8 +18,10 @@ export type ParitionMagicProps = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const getSVGURL = (songID: number) => {
|
const getSVGURL = (songID: number) => {
|
||||||
|
return 'https://cdnjs.cloudflare.com/ajax/libs/flag-icon-css/3.3.0/flags/1x1/ad.svg';
|
||||||
return API.getPartitionSvgUrl(songID);
|
return API.getPartitionSvgUrl(songID);
|
||||||
};
|
};
|
||||||
|
|
||||||
const getCursorToPlay = (
|
const getCursorToPlay = (
|
||||||
cursorInfos: CursorInfoItem[],
|
cursorInfos: CursorInfoItem[],
|
||||||
currentCurIdx: number,
|
currentCurIdx: number,
|
||||||
@@ -40,7 +43,7 @@ const PartitionMagic = ({ songID, onEndReached, onError, onReady }: ParitionMagi
|
|||||||
const { data, isLoading, isError } = useQuery(API.getSongCursorInfos(songID));
|
const { data, isLoading, isError } = useQuery(API.getSongCursorInfos(songID));
|
||||||
const [currentCurIdx, setCurrentCurIdx] = React.useState(-1);
|
const [currentCurIdx, setCurrentCurIdx] = React.useState(-1);
|
||||||
const partitionOffset = useSharedValue(0);
|
const partitionOffset = useSharedValue(0);
|
||||||
const [partitionDims, setPartitionDims] = React.useState<[number, number]>([0, 0]);
|
const [partitionDims, setPartitionDims] = React.useState<[number, number]>([0, 1]);
|
||||||
const pianoCC = React.useContext(PianoCC);
|
const pianoCC = React.useContext(PianoCC);
|
||||||
const pianoSounds = React.useRef<Record<string, Audio.Sound>>();
|
const pianoSounds = React.useRef<Record<string, Audio.Sound>>();
|
||||||
const cursorPaddingVertical = 10;
|
const cursorPaddingVertical = 10;
|
||||||
@@ -55,7 +58,13 @@ const PartitionMagic = ({ songID, onEndReached, onError, onReady }: ParitionMagi
|
|||||||
const cursorLeft = (data?.cursors[0]?.x ?? 0) - cursorPaddingHorizontal;
|
const cursorLeft = (data?.cursors[0]?.x ?? 0) - cursorPaddingHorizontal;
|
||||||
|
|
||||||
React.useEffect(() => {
|
React.useEffect(() => {
|
||||||
Image.getSize(getSVGURL(songID), (w, h) => {
|
if (Platform.OS === 'web') {
|
||||||
|
Image.getSize(getSVGURL(songID), (w, h) => {
|
||||||
|
setPartitionDims([w, h]);
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
GetSvgDims(getSVGURL(songID), (w, h) => {
|
||||||
setPartitionDims([w, h]);
|
setPartitionDims([w, h]);
|
||||||
});
|
});
|
||||||
if (!pianoSounds.current) {
|
if (!pianoSounds.current) {
|
||||||
@@ -146,13 +155,19 @@ const PartitionMagic = ({ songID, onEndReached, onError, onReady }: ParitionMagi
|
|||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
{!isLoading && !isError && (
|
{!isLoading && !isError && (
|
||||||
<ImageBackground
|
<SvgContainer
|
||||||
source={{ uri: getSVGURL(songID) }}
|
url={getSVGURL(songID)}
|
||||||
onLoad={onReady}
|
onReady={() => {
|
||||||
|
console.log('ready');
|
||||||
|
console.log(partitionDims);
|
||||||
|
onReady();
|
||||||
|
}}
|
||||||
style={{
|
style={{
|
||||||
aspectRatio: partitionDims[0] / partitionDims[1],
|
// check to avoid NaN
|
||||||
|
// aspectRatio: partitionDims[1]
|
||||||
|
// ? partitionDims[0] / partitionDims[1]
|
||||||
|
// : undefined,
|
||||||
height: '100%',
|
height: '100%',
|
||||||
position: 'relative',
|
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
|
|||||||
57
front/components/Play/SvgContainer.tsx
Normal file
57
front/components/Play/SvgContainer.tsx
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import { ViewStyle, ImageBackground, Platform, Image } from 'react-native';
|
||||||
|
import { SvgCssUri } from 'react-native-svg';
|
||||||
|
|
||||||
|
type SvgContainerProps = {
|
||||||
|
url: string;
|
||||||
|
onReady?: () => void;
|
||||||
|
style?: ViewStyle;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const GetSvgDims = (url: string, success: (w: number, h: number) => void) => {
|
||||||
|
if (Platform.OS === 'web') {
|
||||||
|
React.useEffect(() => {
|
||||||
|
Image.getSize(url, (w, h) => {
|
||||||
|
success(w, h);
|
||||||
|
});
|
||||||
|
}, [url]);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
success(470.1052279999999, 275);
|
||||||
|
};
|
||||||
|
|
||||||
|
export const SvgContainer = ({ url, onReady, style }: SvgContainerProps) => {
|
||||||
|
// const [dims, setDims] = React.useState<[number, number]>([470.1052279999999, 0]);
|
||||||
|
|
||||||
|
if (Platform.OS === 'web') {
|
||||||
|
return (
|
||||||
|
<ImageBackground
|
||||||
|
source={{ uri: url }}
|
||||||
|
onLoad={onReady}
|
||||||
|
style={[
|
||||||
|
{
|
||||||
|
// aspectRatio: dims[0] / dims[1],
|
||||||
|
},
|
||||||
|
style,
|
||||||
|
]}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return (
|
||||||
|
<SvgCssUri
|
||||||
|
uri={url}
|
||||||
|
style={[
|
||||||
|
{
|
||||||
|
// aspectRatio: 2545.469353542076 / 193.5,
|
||||||
|
// aspectRatio: 470 / 275,
|
||||||
|
},
|
||||||
|
style,
|
||||||
|
]}
|
||||||
|
// onLayout={(e) => {
|
||||||
|
// const { width, height } = e.nativeEvent.layout;
|
||||||
|
// getDims(width, height);
|
||||||
|
// }}
|
||||||
|
onLoad={onReady}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
};
|
||||||
@@ -79,7 +79,7 @@ export const PianoCC = createContext<PianoCanvasContext>({
|
|||||||
});
|
});
|
||||||
|
|
||||||
const PlayView = ({ songId, route }: RouteProps<PlayViewProps>) => {
|
const PlayView = ({ songId, route }: RouteProps<PlayViewProps>) => {
|
||||||
songId = 1;
|
songId = 13;
|
||||||
const [type, setType] = useState<'practice' | 'normal'>();
|
const [type, setType] = useState<'practice' | 'normal'>();
|
||||||
const accessToken = useSelector((state: RootState) => state.user.accessToken);
|
const accessToken = useSelector((state: RootState) => state.user.accessToken);
|
||||||
const navigation = useNavigation();
|
const navigation = useNavigation();
|
||||||
|
|||||||
Reference in New Issue
Block a user