Skip to content
This repository has been archived by the owner on Oct 4, 2023. It is now read-only.

Commit

Permalink
[C-2877] Address suggested-tracks qa #2 (#3787)
Browse files Browse the repository at this point in the history
  • Loading branch information
dylanjeffers authored Jul 21, 2023
1 parent 4ad7987 commit 5cbc230
Show file tree
Hide file tree
Showing 8 changed files with 73 additions and 41 deletions.
29 changes: 20 additions & 9 deletions packages/common/src/api/suggestedTracks.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,19 +7,29 @@ import { usePaginatedQuery } from 'audius-query'
import { ID } from 'models/Identifiers'
import { Status } from 'models/Status'
import { TimeRange } from 'models/TimeRange'
import { Track } from 'models/Track'
import { Track, UserTrackMetadata } from 'models/Track'
import { getUserId } from 'store/account/selectors'
import { addTrackToPlaylist } from 'store/cache/collections/actions'
import { getCollection } from 'store/cache/collections/selectors'
import { getTrack } from 'store/cache/tracks/selectors'
import { CommonState } from 'store/index'
import { removeNullable } from 'utils/typeUtils'

import { useGetFavoritedTrackList } from './favorites'
import { useGetTracksByIds } from './track'
import { useGetTrending } from './trending'

const suggestedTrackCount = 5

const isValidTrack = (track: Track | UserTrackMetadata) => {
return (
!track.is_premium &&
!track.is_delete &&
!track.is_invalid &&
!track.is_unlisted
)
}

type SuggestedTrack =
| { isLoading: true; key: ID }
| { isLoading: true; id: ID; key: ID }
Expand All @@ -34,11 +44,14 @@ const selectSuggestedTracks = (
state: CommonState,
ids: ID[]
): SuggestedTrack[] => {
const suggestedTracks = ids.map((id) => {
const track = getTrack(state, { id })
if (!track) return { id, isLoading: true as const, key: id }
return { id, track, isLoading: false as const, key: id }
})
const suggestedTracks = ids
.map((id) => {
const track = getTrack(state, { id })
if (!track) return { id, isLoading: true as const, key: id }
if (!isValidTrack) return null
return { id, track, isLoading: false as const, key: id }
})
.filter(removeNullable)

return [...suggestedTracks, ...skeletons].slice(0, 5)
}
Expand Down Expand Up @@ -93,9 +106,7 @@ export const useGetSuggestedTracks = (collectionId: ID) => {
useEffect(() => {
if (trendingStatus === Status.SUCCESS) {
const trendingTrackIds = difference(
trendingTracks
.filter((track) => !track.is_premium)
.map((track) => track.track_id),
trendingTracks.filter(isValidTrack).map((track) => track.track_id),
collectionTrackIds
)
setSuggestedTrackIds([...suggestedTrackIds, ...trendingTrackIds])
Expand Down
4 changes: 4 additions & 0 deletions packages/common/src/store/cache/reducer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,10 @@ export const mergeCustomizer = (objValue: any, srcValue: any, key: string) => {
if (forceUpdateKeys.has(key)) {
return srcValue
}

if (key === 'artwork') {
return null
}
if (key === 'is_verified') {
return srcValue || objValue
}
Expand Down
53 changes: 34 additions & 19 deletions packages/common/src/utils/updatePlaylistArtwork.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import { AudiusBackend } from 'services/audius-backend'
import { Nullable } from './typeUtils'

const filterTrack = (track1: Track) => (track2: Track) =>
track1.track_id === track2.track_id
track1.track_id !== track2.track_id

type ArtworkActions = {
added?: Track
Expand All @@ -29,8 +29,8 @@ export const updatePlaylistArtwork = async (
actions: ArtworkActions,
context: Context
) => {
const { is_image_autogenerated } = collection
if (!is_image_autogenerated && !actions.regenerate) {
const { is_image_autogenerated, cover_art_sizes } = collection
if (!is_image_autogenerated && cover_art_sizes && !actions.regenerate) {
return collection
}

Expand All @@ -49,12 +49,16 @@ export const updatePlaylistArtwork = async (
)
if (removedIndex === -1) {
// continue
} else if (tracks.length >= 4 && removedIndex < 4) {
} else if (tracks.length > 4 && removedIndex < 4) {
tracksForImage = tracks.filter(filterTrack(removed)).slice(0, 4)
} else if (tracks.length === 4) {
tracksForImage = tracks.filter(filterTrack(removed)).slice(0, 1)
} else if (tracks.length < 4 && removedIndex === 0) {
tracksForImage = tracks.slice(1, 2)
} else if (tracks.length < 4) {
if (tracks.length === 1) {
tracksForImage = []
} else if (removedIndex === 0) {
tracksForImage = tracks.slice(1, 2)
}
}
} else if (actions.reordered) {
if (
Expand All @@ -76,23 +80,34 @@ export const updatePlaylistArtwork = async (
tracksForImage = actions.updated.slice(0, 4)
}
} else if (actions.regenerate) {
tracksForImage = tracks.slice(0, 4)
if (tracks.length < 4) {
tracksForImage = tracks.slice(0, 1)
} else {
tracksForImage = tracks.slice(0, 4)
}
}

if (tracksForImage) {
const trackUrls = await Promise.all(
tracksForImage.map(async (track) => {
const { cover_art_sizes, cover_art } = track
return await context.audiusBackend.getImageUrl(
cover_art_sizes ?? cover_art,
SquareSizes.SIZE_1000_BY_1000
)
})
)
if (tracksForImage.length === 0) {
console.log('okay full removal!')
// @ts-expect-error
collection.cover_art_sizes = undefined
collection._cover_art_sizes = {}
} else {
const trackUrls = await Promise.all(
tracksForImage.map(async (track) => {
const { cover_art_sizes, cover_art } = track
return await context.audiusBackend.getImageUrl(
cover_art_sizes ?? cover_art,
SquareSizes.SIZE_1000_BY_1000
)
})
)

const artwork = await context.generateImage(trackUrls)
collection.artwork = artwork
collection.is_image_autogenerated = true
const artwork = await context.generateImage(trackUrls)
collection.artwork = artwork
collection.is_image_autogenerated = true
}
}

return collection
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,20 @@ import { Collection, Kind, cacheActions } from '@audius/common'
import { put } from 'typed-redux-saga'

export function* optimisticUpdateCollection(collection: Collection) {
if (collection.artwork?.url) {
const { artwork } = collection
const optimisticCollection = { ...collection }
if (optimisticCollection.artwork?.url) {
const { artwork } = optimisticCollection
const { url } = artwork
collection.artwork = artwork
collection.cover_art_sizes = url!
const coverArtSizes = collection._cover_art_sizes ?? {}
optimisticCollection.artwork = artwork
optimisticCollection.cover_art_sizes = url!
const coverArtSizes = optimisticCollection._cover_art_sizes ?? {}
coverArtSizes.OVERRIDE = url
collection._cover_art_sizes = coverArtSizes
collection.is_image_autogenerated = true
optimisticCollection._cover_art_sizes = coverArtSizes
}

yield* put(
cacheActions.update(Kind.COLLECTIONS, [
{ id: collection.playlist_id, metadata: collection }
{ id: optimisticCollection.playlist_id, metadata: optimisticCollection }
])
)
}
4 changes: 2 additions & 2 deletions packages/web/src/components/collection/desktop/Artwork.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ export const Artwork = (props: ArtworkProps) => {

useEffect(() => {
// If there's a gradient, this is a smart collection. Just immediately call back
if (image || gradient || imageOverride) callback()
if (image || gradient || imageOverride || imageBlank) callback()
}, [image, callback, gradient, imageOverride])

const handleEditArtwork = useCallback(() => {
Expand All @@ -79,7 +79,7 @@ export const Artwork = (props: ArtworkProps) => {
<DynamicImage
wrapperClassName={styles.coverArtWrapper}
className={styles.coverArt}
image={gradient || imageOverride || image}
image={gradient || imageOverride || image || imageBlank}
>
{Icon ? (
<Icon className={styles.imageIcon} style={{ background: gradient }} />
Expand Down
3 changes: 2 additions & 1 deletion packages/web/src/components/create-playlist/PlaylistForm.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,8 @@ const PlaylistForm = ({
...newCollectionMetadata(metadata),
artwork: oldFormFields.artwork,
playlist_name: oldFormFields.playlist_name,
description: oldFormFields.description
description: oldFormFields.description,
is_image_autogenerated: oldFormFields.is_image_autogenerated
}))
}
}, [metadata])
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
.content {
display: flex;
flex-direction: column;
overflow: hidden;
}

.loading {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ const SuggestedTrack = (props: SuggestedTrackProps) => {

const handleAddTrack = useCallback(() => {
onAddTrack(track_id, collectionId)
dispatch(toast({ content: messages.trackAdded }))
dispatch(toast({ content: messages.trackAdded, timeout: 1500 }))
}, [onAddTrack, track_id, collectionId, dispatch])

return (
Expand Down Expand Up @@ -117,7 +117,7 @@ export const SuggestedTracks = (props: SuggestedTracksProps) => {
const divider = <Divider className={styles.trackDivider} />

const contentStyles = useSpring({
maxHeight: isExpanded ? contentHeight : 0
height: isExpanded ? contentHeight : 0
})

return (
Expand Down

0 comments on commit 5cbc230

Please sign in to comment.