mirror of
https://github.com/austinried/subtracks.git
synced 2025-12-27 00:59:28 +01:00
made gradient background move with scroll
This commit is contained in:
parent
9e2740c84e
commit
379779735e
@ -8,7 +8,7 @@ import { albumAtomFamily } from '../../state/music';
|
|||||||
import colors from '../../styles/colors';
|
import colors from '../../styles/colors';
|
||||||
import text from '../../styles/text';
|
import text from '../../styles/text';
|
||||||
import AlbumCover from './AlbumCover';
|
import AlbumCover from './AlbumCover';
|
||||||
import TopTabContainer from './TopTabContainer';
|
import GradientBackground from './GradientBackground';
|
||||||
|
|
||||||
function secondsToTime(s: number): string {
|
function secondsToTime(s: number): string {
|
||||||
const seconds = s % 60;
|
const seconds = s % 60;
|
||||||
@ -142,7 +142,9 @@ const AlbumDetails: React.FC<{
|
|||||||
alignItems: 'center',
|
alignItems: 'center',
|
||||||
paddingTop: coverSize / 8,
|
paddingTop: coverSize / 8,
|
||||||
}}
|
}}
|
||||||
|
overScrollMode='never'
|
||||||
>
|
>
|
||||||
|
<GradientBackground />
|
||||||
<AlbumCover
|
<AlbumCover
|
||||||
height={coverSize}
|
height={coverSize}
|
||||||
width={coverSize}
|
width={coverSize}
|
||||||
@ -213,11 +215,9 @@ const AlbumView: React.FC<{
|
|||||||
});
|
});
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<TopTabContainer>
|
<React.Suspense fallback={<Text>Loading...</Text>}>
|
||||||
<React.Suspense fallback={<Text>Loading...</Text>}>
|
<AlbumDetails id={id} />
|
||||||
<AlbumDetails id={id} />
|
</React.Suspense>
|
||||||
</React.Suspense>
|
|
||||||
</TopTabContainer>
|
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
26
src/components/common/GradientBackground.tsx
Normal file
26
src/components/common/GradientBackground.tsx
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import { useWindowDimensions } from 'react-native';
|
||||||
|
import LinearGradient from 'react-native-linear-gradient';
|
||||||
|
import colors from '../../styles/colors';
|
||||||
|
|
||||||
|
const GradientBackground: React.FC<{
|
||||||
|
height?: number | string;
|
||||||
|
width?: number | string;
|
||||||
|
position?: 'relative' | 'absolute';
|
||||||
|
}> = ({ height, width, position }) => {
|
||||||
|
const layout = useWindowDimensions();
|
||||||
|
|
||||||
|
return (
|
||||||
|
<LinearGradient
|
||||||
|
colors={[colors.gradient.high, colors.gradient.low]}
|
||||||
|
locations={[0.01,0.7]}
|
||||||
|
style={{
|
||||||
|
width: width || '100%',
|
||||||
|
height: height || layout.height,
|
||||||
|
position: position || 'absolute',
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default GradientBackground;
|
||||||
19
src/components/common/GradientFlatList.tsx
Normal file
19
src/components/common/GradientFlatList.tsx
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import { FlatList, FlatListProps, useWindowDimensions } from 'react-native';
|
||||||
|
import GradientBackground from './GradientBackground';
|
||||||
|
|
||||||
|
function GradientFlatList<ItemT>(props: FlatListProps<ItemT>) {
|
||||||
|
const layout = useWindowDimensions();
|
||||||
|
|
||||||
|
return (
|
||||||
|
<FlatList
|
||||||
|
{ ...props }
|
||||||
|
ListHeaderComponent={() => <GradientBackground position='relative' />}
|
||||||
|
ListHeaderComponentStyle={{
|
||||||
|
marginBottom: -layout.height,
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default GradientFlatList;
|
||||||
@ -1,14 +1,12 @@
|
|||||||
import { useNavigation } from '@react-navigation/native';
|
import { useNavigation } from '@react-navigation/native';
|
||||||
import { useAtomValue } from 'jotai/utils';
|
import { useAtomValue } from 'jotai/utils';
|
||||||
import React, { useEffect } from 'react';
|
import React, { useEffect } from 'react';
|
||||||
import { FlatList, Pressable, Text, View } from 'react-native';
|
import { Pressable, Text, View } from 'react-native';
|
||||||
import FastImage from 'react-native-fast-image';
|
|
||||||
import LinearGradient from 'react-native-linear-gradient';
|
|
||||||
import { Album } from '../../models/music';
|
import { Album } from '../../models/music';
|
||||||
import { albumsAtom, albumsUpdatingAtom, useUpdateAlbums } from '../../state/music';
|
import { albumsAtom, albumsUpdatingAtom, useUpdateAlbums } from '../../state/music';
|
||||||
import textStyles from '../../styles/text';
|
import textStyles from '../../styles/text';
|
||||||
import AlbumCover from '../common/AlbumCover';
|
import AlbumCover from '../common/AlbumCover';
|
||||||
import TopTabContainer from '../common/TopTabContainer';
|
import GradientFlatList from '../common/GradientFlatList';
|
||||||
|
|
||||||
const AlbumItem: React.FC<{
|
const AlbumItem: React.FC<{
|
||||||
id: string;
|
id: string;
|
||||||
@ -76,7 +74,7 @@ const AlbumsList = () => {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<View style={{ flex: 1 }}>
|
<View style={{ flex: 1 }}>
|
||||||
<FlatList
|
<GradientFlatList
|
||||||
data={albums}
|
data={albums}
|
||||||
renderItem={AlbumListRenderItem}
|
renderItem={AlbumListRenderItem}
|
||||||
keyExtractor={item => item.id}
|
keyExtractor={item => item.id}
|
||||||
@ -84,17 +82,16 @@ const AlbumsList = () => {
|
|||||||
removeClippedSubviews={true}
|
removeClippedSubviews={true}
|
||||||
refreshing={updating}
|
refreshing={updating}
|
||||||
onRefresh={updateAlbums}
|
onRefresh={updateAlbums}
|
||||||
|
overScrollMode='never'
|
||||||
/>
|
/>
|
||||||
</View>
|
</View>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
const AlbumsTab = () => (
|
const AlbumsTab = () => (
|
||||||
<TopTabContainer>
|
<React.Suspense fallback={<Text>Loading...</Text>}>
|
||||||
<React.Suspense fallback={<Text>Loading...</Text>}>
|
<AlbumsList />
|
||||||
<AlbumsList />
|
</React.Suspense>
|
||||||
</React.Suspense>
|
|
||||||
</TopTabContainer>
|
|
||||||
);
|
);
|
||||||
|
|
||||||
export default React.memo(AlbumsTab);
|
export default React.memo(AlbumsTab);
|
||||||
|
|||||||
@ -1,10 +1,10 @@
|
|||||||
import { useAtomValue } from 'jotai/utils';
|
import { useAtomValue } from 'jotai/utils';
|
||||||
import React, { useEffect } from 'react';
|
import React, { useEffect } from 'react';
|
||||||
import { FlatList, Image, Text, View } from 'react-native';
|
import { Image, Text, View } from 'react-native';
|
||||||
import { Artist } from '../../models/music';
|
import { Artist } from '../../models/music';
|
||||||
import { artistsAtom, artistsUpdatingAtom, useUpdateArtists } from '../../state/music';
|
import { artistsAtom, artistsUpdatingAtom, useUpdateArtists } from '../../state/music';
|
||||||
import textStyles from '../../styles/text';
|
import textStyles from '../../styles/text';
|
||||||
import TopTabContainer from '../common/TopTabContainer';
|
import GradientFlatList from '../common/GradientFlatList';
|
||||||
|
|
||||||
const ArtistItem: React.FC<{ item: Artist } > = ({ item }) => (
|
const ArtistItem: React.FC<{ item: Artist } > = ({ item }) => (
|
||||||
<View style={{
|
<View style={{
|
||||||
@ -43,20 +43,19 @@ const ArtistsList = () => {
|
|||||||
);
|
);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<FlatList
|
<GradientFlatList
|
||||||
data={artists}
|
data={artists}
|
||||||
renderItem={renderItem}
|
renderItem={renderItem}
|
||||||
keyExtractor={item => item.id}
|
keyExtractor={item => item.id}
|
||||||
onRefresh={updateArtists}
|
onRefresh={updateArtists}
|
||||||
refreshing={updating}
|
refreshing={updating}
|
||||||
|
overScrollMode='never'
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
const ArtistsTab = () => (
|
const ArtistsTab = () => (
|
||||||
<TopTabContainer>
|
<ArtistsList />
|
||||||
<ArtistsList />
|
|
||||||
</TopTabContainer>
|
|
||||||
);
|
);
|
||||||
|
|
||||||
export default ArtistsTab;
|
export default ArtistsTab;
|
||||||
|
|||||||
@ -1,9 +1,8 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import TopTabContainer from '../common/TopTabContainer';
|
import GradientBackground from '../common/GradientBackground';
|
||||||
|
|
||||||
const PlaylistsTab = () => (
|
const PlaylistsTab = () => (
|
||||||
<TopTabContainer>
|
<GradientBackground />
|
||||||
</TopTabContainer>
|
|
||||||
);
|
);
|
||||||
|
|
||||||
export default PlaylistsTab;
|
export default PlaylistsTab;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user