Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/main' into brian/codepush-ci-sentry
Browse files Browse the repository at this point in the history
  • Loading branch information
brainbicycle committed Sep 18, 2023
2 parents b9caa49 + a68106c commit 747944a
Show file tree
Hide file tree
Showing 22 changed files with 635 additions and 138 deletions.
14 changes: 10 additions & 4 deletions .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ orbs:
queue: eddiewebb/[email protected]
horizon: artsy/[email protected]
jq: circleci/[email protected]
ruby: circleci/[email protected]

commands:
await-previous-builds:
Expand Down Expand Up @@ -75,6 +76,10 @@ commands:
- run:
name: Compile query map
command: yarn relay
install-ruby:
steps:
- ruby/install:
version: "2.7"
install-gems:
steps:
- restore_cache:
Expand Down Expand Up @@ -148,6 +153,7 @@ commands:
- install-node-modules
- run-relay-compiler
- update-echo
- install-ruby
- install-gems
build-app-android:
steps:
Expand Down Expand Up @@ -183,7 +189,7 @@ jobs:

macos:
xcode: 14.1.0
resource_class: macos.m1.medium.gen1
resource_class: macos.x86.medium.gen2

steps:
- checkout
Expand Down Expand Up @@ -302,7 +308,7 @@ jobs:

macos:
xcode: 14.1.0
resource_class: macos.m1.medium.gen1
resource_class: macos.x86.medium.gen2

steps:
- checkout
Expand Down Expand Up @@ -352,7 +358,7 @@ jobs:

macos:
xcode: 14.1.0
resource_class: macos.m1.medium.gen1
resource_class: macos.x86.medium.gen2

steps:
- attach_workspace:
Expand Down Expand Up @@ -445,7 +451,7 @@ jobs:
BUNDLE_PATH: .vendor # path to install gems and use for caching
macos:
xcode: 14.1.0
resource_class: macos.m1.medium.gen1
resource_class: macos.x86.medium.gen2
steps:
- checkout
- install-gems
Expand Down
2 changes: 1 addition & 1 deletion .ruby-version
Original file line number Diff line number Diff line change
@@ -1 +1 @@
2.7.8
2.7.4
2 changes: 1 addition & 1 deletion .secrets.baseline
Original file line number Diff line number Diff line change
Expand Up @@ -1103,5 +1103,5 @@
}
]
},
"generated_at": "2023-09-12T15:16:43Z"
"generated_at": "2023-09-18T10:42:15Z"
}
2 changes: 1 addition & 1 deletion .tool-versions
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
nodejs 16.18.0
ruby 2.7.8
ruby 2.7.4
java zulu-11.58.15
4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -109,8 +109,8 @@
"@babel/plugin-transform-named-capturing-groups-regex": "Needed for compiling android with hermes enabled"
},
"dependencies": {
"@artsy/cohesion": "4.146.0",
"@artsy/palette-mobile": "13.0.8",
"@artsy/cohesion": "4.147.0",
"@artsy/palette-mobile": "v13.0.10",
"@artsy/to-title-case": "1.1.0",
"@expo/react-native-action-sheet": "4.0.1",
"@gorhom/bottom-sheet": "4.4.5",
Expand Down
12 changes: 6 additions & 6 deletions src/app/Components/Artist/ArtistAbout/ArtistAbout.tests.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,9 @@ describe("ArtistAbout", () => {
describe("Biography", () => {
it("is shown when the artist has metadata", () => {
renderWithRelay({
Boolean: (context) => {
if (context.name === "hasMetadata") {
return true
ArtistBlurb: () => {
return {
text: "a biography",
}
},
})
Expand All @@ -39,9 +39,9 @@ describe("ArtistAbout", () => {

it("is hidden when the artist has metadata", () => {
renderWithRelay({
Boolean: (context) => {
if (context.name === "hasMetadata") {
return false
ArtistBlurb: () => {
return {
text: "",
}
},
})
Expand Down
55 changes: 36 additions & 19 deletions src/app/Components/Artist/ArtistAbout/ArtistAbout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -24,37 +24,42 @@ export const ArtistAbout: React.FC<Props> = ({ artist }) => {
const isDisplayable =
artist.hasMetadata || !!articles.length || !!relatedArtists.length || !!relatedGenes.length

const hasInsights = artist.hasArtistInsights.length > 0
const hasArtistSeries = artist.hasArtistSeriesConnection?.totalCount ?? 0 > 0
const hasShows = artist.hasArtistShows?.totalCount ?? 0 > 0
const hasBiography = !!artist.hasBiographyBlurb?.text
const hasArticles = articles.length > 0
const hasRelatedArtists = relatedArtists.length > 0
const hasRelatedGenes = relatedGenes.length > 0

return (
<Tabs.ScrollView>
{isDisplayable ? (
<>
<Spacer y={2} />
<Join separator={<Spacer y={4} />}>
{!!artist.hasMetadata && (
{!!hasBiography && (
<>
<Spacer y={1} />
<Biography artist={artist} />
</>
)}
{!!hasInsights && <ArtistCareerHighlights artist={artist} />}
{!!hasArtistSeries && (
<ArtistSeriesMoreSeriesFragmentContainer
contextScreenOwnerId={artist.internalID}
contextScreenOwnerSlug={artist.slug}
contextScreenOwnerType={OwnerType.artist}
contextModule={ContextModule.artistSeriesRail}
artist={artist}
artistSeriesHeader="Top Artist Series"
/>
)}
{!!hasArticles && <Articles articles={articles} artist={artist} />}
{!!hasShows && <ArtistAboutShowsFragmentContainer artist={artist} />}

<ArtistCareerHighlights artist={artist} />

<ArtistSeriesMoreSeriesFragmentContainer
contextScreenOwnerId={artist.internalID}
contextScreenOwnerSlug={artist.slug}
contextScreenOwnerType={OwnerType.artist}
contextModule={ContextModule.artistSeriesRail}
artist={artist}
artistSeriesHeader="Top Artist Series"
/>

{!!articles.length && <Articles articles={articles} artist={artist} />}

<ArtistAboutShowsFragmentContainer artist={artist} />

{!!relatedArtists.length && <RelatedArtistsRail artists={relatedArtists} />}

{!!relatedGenes.length && <ArtistAboutRelatedGenes genes={relatedGenes} />}
{!!hasRelatedArtists && <RelatedArtistsRail artists={relatedArtists} />}
{!!hasRelatedGenes && <ArtistAboutRelatedGenes genes={relatedGenes} />}
</Join>
<Spacer y={4} />
</>
Expand All @@ -68,8 +73,20 @@ export const ArtistAbout: React.FC<Props> = ({ artist }) => {
export const ArtistAboutContainer = createFragmentContainer(ArtistAbout, {
artist: graphql`
fragment ArtistAbout_artist on Artist {
hasArtistSeriesConnection: artistSeriesConnection(first: 1) {
totalCount
}
hasBiographyBlurb: biographyBlurb(format: PLAIN, partnerBio: false) {
text
}
hasMetadata
internalID
hasArtistInsights: insights {
entities
}
hasArtistShows: showsConnection(first: 1, sort: END_AT_ASC, status: "running") {
totalCount
}
slug
...Biography_artist
...ArtistSeriesMoreSeries_artist
Expand Down
5 changes: 4 additions & 1 deletion src/app/Components/SectionTitle.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { ArrowRightIcon, Flex, SpacingUnit, useTheme, Text, TextProps } from "@artsy/palette-mobile"
import { ArrowRightIcon, Flex, SpacingUnit, Text, TextProps, useTheme } from "@artsy/palette-mobile"
import { toTitleCase } from "@artsy/to-title-case"
import { TouchableOpacity } from "react-native"

Expand All @@ -15,6 +15,7 @@ const Wrapper: React.FC<{ onPress?(): any }> = ({ onPress, children }) => {
}

export const SectionTitle: React.FC<{
fontWeight?: string
title: React.ReactNode
titleVariant?: TextProps["variant"]
subtitle?: React.ReactNode
Expand All @@ -23,6 +24,7 @@ export const SectionTitle: React.FC<{
mb?: SpacingUnit
capitalized?: boolean
}> = ({
fontWeight,
title,
titleVariant = "sm-display",
subtitle,
Expand All @@ -48,6 +50,7 @@ export const SectionTitle: React.FC<{
ellipsizeMode="tail"
numberOfLines={1}
testID="title"
fontWeight={fontWeight}
>
{typeof title === "string" ? titleText : title}
</Text>
Expand Down
80 changes: 7 additions & 73 deletions src/app/Scenes/Activity/ActivityItem.tsx
Original file line number Diff line number Diff line change
@@ -1,23 +1,14 @@
import { ActionType } from "@artsy/cohesion"
import { ClickedActivityPanelNotificationItem } from "@artsy/cohesion/dist/Schema/Events/ActivityPanel"
import { Spacer, Flex, Text } from "@artsy/palette-mobile"
import { captureMessage } from "@sentry/react-native"
import {
ActivityItemMarkAsReadMutation,
ActivityItemMarkAsReadMutation$data,
} from "__generated__/ActivityItemMarkAsReadMutation.graphql"
import { Flex, Spacer, Text } from "@artsy/palette-mobile"
import { ActivityItem_item$key } from "__generated__/ActivityItem_item.graphql"
import { FilterArray } from "app/Components/ArtworkFilter/ArtworkFilterHelpers"
import { ORDERED_ARTWORK_SORTS } from "app/Components/ArtworkFilter/Filters/SortOptions"
import { OpaqueImageView } from "app/Components/OpaqueImageView2"
import { navigate } from "app/system/navigation/navigate"
import { useMarkNotificationAsRead } from "app/Scenes/Activity/mutations/useMarkNotificationAsRead"
import { navigateToActivityItem } from "app/Scenes/Activity/utils/navigateToActivityItem"
import { extractNodes } from "app/utils/extractNodes"
import { last } from "lodash"
import { parse as parseQueryString } from "query-string"
import { TouchableOpacity } from "react-native"
import { graphql, useFragment, useMutation } from "react-relay"
import { graphql, useFragment } from "react-relay"
import { useTracking } from "react-tracking"
import { RecordSourceSelectorProxy } from "relay-runtime"
import { ActivityItemTypeLabel } from "./ActivityItemTypeLabel"
import { isArtworksBasedNotification } from "./utils/isArtworksBasedNotification"
import { shouldDisplayNotificationTypeLabel } from "./utils/shouldDisplayNotificationTypeLabel"
Expand All @@ -26,20 +17,11 @@ interface ActivityItemProps {
item: ActivityItem_item$key
}

const updater = (
id: string,
store: RecordSourceSelectorProxy<ActivityItemMarkAsReadMutation$data>
) => {
const notification = store.get(id)

notification?.setValue(false, "isUnread")
}

const UNREAD_INDICATOR_SIZE = 8
const ARTWORK_IMAGE_SIZE = 55

export const ActivityItem: React.FC<ActivityItemProps> = (props) => {
const [markAsRead] = useMutation<ActivityItemMarkAsReadMutation>(markNotificationAsRead)
const markAsRead = useMarkNotificationAsRead()
const tracking = useTracking()
const item = useFragment(activityItemFragment, props.item)
const artworks = extractNodes(item.artworksConnection)
Expand All @@ -48,43 +30,12 @@ export const ActivityItem: React.FC<ActivityItemProps> = (props) => {
isArtworksBasedNotification(item.notificationType) && remainingArtworksCount > 0

const handlePress = () => {
const splittedQueryParams = item.targetHref.split("?")
const queryParams = last(splittedQueryParams) ?? ""
const parsed = parseQueryString(queryParams)

const sortFilterItem = ORDERED_ARTWORK_SORTS.find(
(sortEntity) => sortEntity.paramValue === "-published_at"
)!

const navigateToActivityItem = () =>
navigate(item.targetHref, {
passProps: {
predefinedFilters: [sortFilterItem] as FilterArray,
searchCriteriaID: parsed.search_criteria_id,
},
})

tracking.trackEvent(tracks.tappedNotification(item.notificationType))

navigateToActivityItem()
navigateToActivityItem(item.targetHref)

if (item.isUnread) {
markAsRead({
variables: {
input: {
id: item.internalID,
},
},
optimisticUpdater: (store) => {
updater(item.id, store)
},
updater: (store) => {
updater(item.id, store)
},
onError: (error) => {
captureMessage(error?.stack!)
},
})
markAsRead(item)
}
}

Expand Down Expand Up @@ -183,20 +134,3 @@ const tracks = {
notification_type: notificationType,
}),
}

const markNotificationAsRead = graphql`
mutation ActivityItemMarkAsReadMutation($input: MarkNotificationAsReadInput!) {
markNotificationAsRead(input: $input) {
responseOrError {
... on MarkNotificationAsReadSuccess {
success
}
... on MarkNotificationAsReadFailure {
mutationError {
message
}
}
}
}
}
`
21 changes: 8 additions & 13 deletions src/app/Scenes/Activity/ActivityItemTypeLabel.tsx
Original file line number Diff line number Diff line change
@@ -1,22 +1,17 @@
import { Text } from "@artsy/palette-mobile"
import { NotificationTypesEnum } from "__generated__/ActivityRail_notificationsConnection.graphql"
import {
getNotificationTypeColor,
getNotificationTypeLabel,
} from "app/Scenes/Activity/utils/getNotificationTypeLabel"

interface Props {
notificationType: string
notificationType: NotificationTypesEnum
}

export const ActivityItemTypeLabel: React.FC<Props> = ({ notificationType }) => {
const getNotificationType = () => {
if (notificationType === "ARTWORK_ALERT") {
return "Alert"
}
if (notificationType === "ARTICLE_FEATURED_ARTIST") {
return "Artsy Editorial"
}

return null
}
const notificationTypeLabel = getNotificationType()
const notificationTypeColor = notificationType == "ARTWORK_ALERT" ? "blue100" : "black60"
const notificationTypeLabel = getNotificationTypeLabel(notificationType)
const notificationTypeColor = getNotificationTypeColor(notificationType)

return (
<Text
Expand Down
Loading

0 comments on commit 747944a

Please sign in to comment.