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

Commit

Permalink
Merge branch 'main' into amendel-attribution-modal-form
Browse files Browse the repository at this point in the history
  • Loading branch information
amendelsohn committed Jul 21, 2023
2 parents 77fcf09 + 19cca4c commit 0c5438f
Show file tree
Hide file tree
Showing 104 changed files with 1,841 additions and 2,261 deletions.
59 changes: 59 additions & 0 deletions .circleci/src/commands/@mobile-commands.yml
Original file line number Diff line number Diff line change
Expand Up @@ -188,3 +188,62 @@ mobile-release-android:
command: |
cd packages/mobile/android
bundle exec fastlane <<parameters.upload-type>> track:<<parameters.track>>
# Deploy Solana saga dApp store
mobile-release-saga-dapp-store:
steps:
- checkout
- attach_workspace:
at: ./
- run:
name: Install nvm
command: |
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.3/install.sh | bash
echo 'export NVM_DIR="$HOME/.nvm"' >> $BASH_ENV
echo '[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" --install' >> $BASH_ENV
source $BASH_ENV
- run:
name: Install dependencies
command: |
cd packages/mobile/dapp-store
nvm install
nvm use
corepack enable
corepack prepare pnpm@`npm info pnpm --json | jq -r .version` --activate
pnpm install
- run:
name: Install solana
command: |
sh -c "$(curl -sSfL https://release.solana.com/v1.16.3/install)"
- run:
name: Recover key
command: |
echo $SOLANA_DAPP_STORE_PRIVATE_KEY > app-keypair.json
- run:
name: Build Android
command: |
cd packages/mobile/android
./gradlew app:assembleRelease
- run:
name: Validate release
command: |
nvm use
npx dapp-store validate release -k app-keypair.json -b $ANDROID_HOME/build-tools/30.0.3
- run:
name: Publish APK
command: |
nvm use
npx dapp-store create release -k app-keypair.json -b $ANDROID_HOME/build-tools/30.0.3 -u https://audius-fe.rpcpool.com
- run:
name: Issue update to dapp store
command: |
nvm use
npx dapp-store publish update -k app-keypair.json -u https://audius-fe.rpcpool.com --requestor-is-authorized --complies-with-solana-dapp-store-policies
- run:
name: Commit changes
command: |
git checkout main -f
git pull
git commit -am 'Update dapp-store build artifacts'
git push origin main
8 changes: 8 additions & 0 deletions .circleci/src/jobs/@mobile-jobs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -316,3 +316,11 @@ mobile-deploy-codepush-production-android-if-ota-release:
build-directory: 'build-mobile-production'
upload-type: 'prod'
track: 'alpha'

mobile-deploy-saga-dapp-store:
working_directory: ~/audius-client
resource_class: xlarge
docker:
- image: circleci/android:api-30-node
steps:
- mobile-release-saga-dapp-store
16 changes: 16 additions & 0 deletions .circleci/src/workflows/mobile.yml
Original file line number Diff line number Diff line change
Expand Up @@ -136,3 +136,19 @@ jobs:
filters:
branches:
only: /(^release.*)$/

- mobile-hold-deploy-saga-dapp-store:
type: approval
requires:
- mobile-init
filters:
branches:
only: /(^release.*)$/

- mobile-deploy-saga-dapp-store:
context: Audius Mobile Client
requires:
- mobile-hold-deploy-saga-dapp-store
filters:
branches:
only: /(^release.*)$/
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -14,3 +14,6 @@ yalc.lock

# ignored until ci has custom image with correct python version
.python-version

# Solana
app-keypair.json
33 changes: 14 additions & 19 deletions packages/common/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion packages/common/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
"url": "https://github.com/AudiusProject/audius-client/issues"
},
"dependencies": {
"@audius/sdk": "3.0.3-beta.76",
"@audius/sdk": "3.0.3-beta.84",
"@fingerprintjs/fingerprintjs-pro": "3.5.6",
"@metaplex-foundation/mpl-token-metadata": "2.5.2",
"@optimizely/optimizely-sdk": "4.0.0",
Expand Down
58 changes: 46 additions & 12 deletions packages/common/src/api/suggestedTracks.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
import { useCallback, useEffect, useState } from 'react'

import { difference, shuffle } from 'lodash'
import { difference, isEqual, shuffle } from 'lodash'
import { useSelector, useDispatch } from 'react-redux'

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 { getUserId } from 'store/account/selectors'
import { addTrackToPlaylist } from 'store/cache/collections/actions'
import { getCollection } from 'store/cache/collections/selectors'
Expand All @@ -19,12 +20,27 @@ import { useGetTrending } from './trending'

const suggestedTrackCount = 5

const selectSuggestedTracks = (state: CommonState, ids: ID[]) => {
return ids.map((id) => {
type SuggestedTrack =
| { isLoading: true; key: ID }
| { isLoading: true; id: ID; key: ID }
| { isLoading: false; id: ID; track: Track; key: ID }

const skeletons = [...Array(5)].map((_, index) => ({
key: index,
isLoading: true as const
}))

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 }
return { id, track, isLoading: false as const }
if (!track) return { id, isLoading: true as const, key: id }
return { id, track, isLoading: false as const, key: id }
})

return [...suggestedTracks, ...skeletons].slice(0, 5)
}

const selectCollectionTrackIds = (state: CommonState, collectionId: ID) => {
Expand All @@ -37,6 +53,7 @@ export const useGetSuggestedTracks = (collectionId: ID) => {
const currentUserId = useSelector(getUserId)
const dispatch = useDispatch()
const [suggestedTrackIds, setSuggestedTrackIds] = useState<ID[]>([])
const [isRefreshing, setIsRefreshing] = useState(false)

const collectionTrackIds = useSelector((state: CommonState) =>
selectCollectionTrackIds(state, collectionId)
Expand Down Expand Up @@ -76,7 +93,9 @@ export const useGetSuggestedTracks = (collectionId: ID) => {
useEffect(() => {
if (trendingStatus === Status.SUCCESS) {
const trendingTrackIds = difference(
trendingTracks.map((track) => track.track_id),
trendingTracks
.filter((track) => !track.is_premium)
.map((track) => track.track_id),
collectionTrackIds
)
setSuggestedTrackIds([...suggestedTrackIds, ...trendingTrackIds])
Expand All @@ -91,18 +110,25 @@ export const useGetSuggestedTracks = (collectionId: ID) => {
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [suggestedTrackIds.length])

const suggestedTracks = useSelector((state: CommonState) =>
selectSuggestedTracks(
state,
suggestedTrackIds.slice(0, suggestedTrackCount)
)
const suggestedTracks = useSelector(
(state: CommonState) =>
selectSuggestedTracks(
state,
suggestedTrackIds.slice(0, suggestedTrackCount)
),
isEqual
)

useGetTracksByIds(
{
currentUserId,
ids: suggestedTracks
.filter((suggestedTrack) => suggestedTrack.isLoading)
.filter(
(
suggestedTrack
): suggestedTrack is { isLoading: true; id: ID; key: ID } =>
'id' in suggestedTrack && suggestedTrack.isLoading
)
.map((suggestedTrack) => suggestedTrack.id)
},
{
Expand All @@ -122,10 +148,18 @@ export const useGetSuggestedTracks = (collectionId: ID) => {

const handleRefresh = useCallback(() => {
setSuggestedTrackIds(suggestedTrackIds.slice(suggestedTrackCount))
setIsRefreshing(true)
}, [suggestedTrackIds])

useEffect(() => {
if (suggestedTracks.every((suggestedTrack) => !suggestedTrack.isLoading)) {
setIsRefreshing(false)
}
}, [suggestedTracks])

return {
suggestedTracks,
isRefreshing,
onRefresh: handleRefresh,
onAddTrack: handleAddTrack
}
Expand Down
62 changes: 26 additions & 36 deletions packages/common/src/hooks/useGeneratePlaylistArtwork.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,51 +3,41 @@ import { useCallback } from 'react'
import { useSelector } from 'react-redux'

import { ID } from 'models/Identifiers'
import { SquareSizes } from 'models/ImageSizes'
import { useAppContext } from 'src/context'
import { getCollection } from 'store/cache/collections/selectors'
import { getTrack } from 'store/cache/tracks/selectors'
import {
getCollection,
getCollectionTracks
} from 'store/cache/collections/selectors'
import { CommonState } from 'store/index'
import { removeNullable } from 'utils/typeUtils'
import { updatePlaylistArtwork } from 'utils/updatePlaylistArtwork'

export const useGeneratePlaylistArtwork = (collectionId: ID) => {
const collection = useSelector(
(state: CommonState) => getCollection(state, { id: collectionId })!
const collection = useSelector((state: CommonState) =>
getCollection(state, { id: collectionId })
)

const collectionTracks = useSelector((state: CommonState) => {
const trackIds = collection.playlist_contents.track_ids.map(
({ track }) => track
)
const tracks = trackIds
.map((trackId) => getTrack(state, { id: trackId }))
.filter(removeNullable)
.slice(0, 4)

if (tracks.length < 4) {
return tracks.slice(0, 1)
}

return tracks
})
const collectionTracks = useSelector((state: CommonState) =>
getCollectionTracks(state, { id: collectionId })
)

const { imageUtils, audiusBackend } = useAppContext()

return useCallback(async () => {
if (collectionTracks.length === 0) {
return { url: '', file: undefined }
}

const trackArtworkUrls = await Promise.all(
collectionTracks.map(async (track) => {
const { cover_art_sizes, cover_art } = track
return await audiusBackend.getImageUrl(
cover_art_sizes || cover_art,
SquareSizes.SIZE_1000_BY_1000
)
})
if (!collection || !collectionTracks) return null
const { artwork } = await updatePlaylistArtwork(
collection,
collectionTracks,
{ regenerate: true },
{ audiusBackend, generateImage: imageUtils.generatePlaylistArtwork }
)

return await imageUtils.generatePlaylistArtwork(trackArtworkUrls)
}, [collectionTracks, audiusBackend, imageUtils])
if (!artwork) return null
const { url, file } = artwork
if (!url) return null
return { url, file }
}, [
collection,
collectionTracks,
audiusBackend,
imageUtils.generatePlaylistArtwork
])
}
8 changes: 0 additions & 8 deletions packages/common/src/models/Analytics.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1110,13 +1110,6 @@ type DiscoveryProviderSelection = {
reason: string
}

type CreatorNodeSelection = {
eventName: Name.CREATOR_NODE_SELECTION
selectedAs: 'primary' | 'secondary'
endpoint: string
reason: string
}

type StemCompleteUpload = {
eventName: Name.STEM_COMPLETE_UPLOAD
id: number
Expand Down Expand Up @@ -1777,7 +1770,6 @@ export type AllTrackingEvents =
| BrowserNotificationSetting
| TweetFirstUpload
| DiscoveryProviderSelection
| CreatorNodeSelection
| WebVitals
| Performance
| StemCompleteUpload
Expand Down
Loading

0 comments on commit 0c5438f

Please sign in to comment.