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 text from '../../styles/text';
|
||||
import AlbumCover from './AlbumCover';
|
||||
import TopTabContainer from './TopTabContainer';
|
||||
import GradientBackground from './GradientBackground';
|
||||
|
||||
function secondsToTime(s: number): string {
|
||||
const seconds = s % 60;
|
||||
@ -142,7 +142,9 @@ const AlbumDetails: React.FC<{
|
||||
alignItems: 'center',
|
||||
paddingTop: coverSize / 8,
|
||||
}}
|
||||
overScrollMode='never'
|
||||
>
|
||||
<GradientBackground />
|
||||
<AlbumCover
|
||||
height={coverSize}
|
||||
width={coverSize}
|
||||
@ -213,11 +215,9 @@ const AlbumView: React.FC<{
|
||||
});
|
||||
|
||||
return (
|
||||
<TopTabContainer>
|
||||
<React.Suspense fallback={<Text>Loading...</Text>}>
|
||||
<AlbumDetails id={id} />
|
||||
</React.Suspense>
|
||||
</TopTabContainer>
|
||||
<React.Suspense fallback={<Text>Loading...</Text>}>
|
||||
<AlbumDetails id={id} />
|
||||
</React.Suspense>
|
||||
);
|
||||
};
|
||||
|
||||
|
||||
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 { useAtomValue } from 'jotai/utils';
|
||||
import React, { useEffect } from 'react';
|
||||
import { FlatList, Pressable, Text, View } from 'react-native';
|
||||
import FastImage from 'react-native-fast-image';
|
||||
import LinearGradient from 'react-native-linear-gradient';
|
||||
import { Pressable, Text, View } from 'react-native';
|
||||
import { Album } from '../../models/music';
|
||||
import { albumsAtom, albumsUpdatingAtom, useUpdateAlbums } from '../../state/music';
|
||||
import textStyles from '../../styles/text';
|
||||
import AlbumCover from '../common/AlbumCover';
|
||||
import TopTabContainer from '../common/TopTabContainer';
|
||||
import GradientFlatList from '../common/GradientFlatList';
|
||||
|
||||
const AlbumItem: React.FC<{
|
||||
id: string;
|
||||
@ -76,7 +74,7 @@ const AlbumsList = () => {
|
||||
|
||||
return (
|
||||
<View style={{ flex: 1 }}>
|
||||
<FlatList
|
||||
<GradientFlatList
|
||||
data={albums}
|
||||
renderItem={AlbumListRenderItem}
|
||||
keyExtractor={item => item.id}
|
||||
@ -84,17 +82,16 @@ const AlbumsList = () => {
|
||||
removeClippedSubviews={true}
|
||||
refreshing={updating}
|
||||
onRefresh={updateAlbums}
|
||||
overScrollMode='never'
|
||||
/>
|
||||
</View>
|
||||
);
|
||||
}
|
||||
|
||||
const AlbumsTab = () => (
|
||||
<TopTabContainer>
|
||||
<React.Suspense fallback={<Text>Loading...</Text>}>
|
||||
<AlbumsList />
|
||||
</React.Suspense>
|
||||
</TopTabContainer>
|
||||
<React.Suspense fallback={<Text>Loading...</Text>}>
|
||||
<AlbumsList />
|
||||
</React.Suspense>
|
||||
);
|
||||
|
||||
export default React.memo(AlbumsTab);
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
import { useAtomValue } from 'jotai/utils';
|
||||
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 { artistsAtom, artistsUpdatingAtom, useUpdateArtists } from '../../state/music';
|
||||
import textStyles from '../../styles/text';
|
||||
import TopTabContainer from '../common/TopTabContainer';
|
||||
import GradientFlatList from '../common/GradientFlatList';
|
||||
|
||||
const ArtistItem: React.FC<{ item: Artist } > = ({ item }) => (
|
||||
<View style={{
|
||||
@ -43,20 +43,19 @@ const ArtistsList = () => {
|
||||
);
|
||||
|
||||
return (
|
||||
<FlatList
|
||||
<GradientFlatList
|
||||
data={artists}
|
||||
renderItem={renderItem}
|
||||
keyExtractor={item => item.id}
|
||||
onRefresh={updateArtists}
|
||||
refreshing={updating}
|
||||
overScrollMode='never'
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
const ArtistsTab = () => (
|
||||
<TopTabContainer>
|
||||
<ArtistsList />
|
||||
</TopTabContainer>
|
||||
<ArtistsList />
|
||||
);
|
||||
|
||||
export default ArtistsTab;
|
||||
|
||||
@ -1,9 +1,8 @@
|
||||
import React from 'react';
|
||||
import TopTabContainer from '../common/TopTabContainer';
|
||||
import GradientBackground from '../common/GradientBackground';
|
||||
|
||||
const PlaylistsTab = () => (
|
||||
<TopTabContainer>
|
||||
</TopTabContainer>
|
||||
<GradientBackground />
|
||||
);
|
||||
|
||||
export default PlaylistsTab;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user