-
Notifications
You must be signed in to change notification settings - Fork 149
Expand file tree
/
Copy pathArtworkPageBanner.tsx
More file actions
114 lines (98 loc) · 2.95 KB
/
ArtworkPageBanner.tsx
File metadata and controls
114 lines (98 loc) · 2.95 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
import { Text } from "@artsy/palette"
import { CascadingEndTimesBannerFragmentContainer } from "Components/CascadingEndTimesBanner"
import { FullBleedBanner } from "Components/FullBleedBanner"
import { useRouter } from "System/Hooks/useRouter"
import { extractNodes } from "Utils/extractNodes"
import type { ArtworkPageBanner_artwork$key } from "__generated__/ArtworkPageBanner_artwork.graphql"
import type { ArtworkPageBanner_me$key } from "__generated__/ArtworkPageBanner_me.graphql"
import type { FC } from "react"
import { graphql, useFragment } from "react-relay"
interface ArtworkPageBannerProps {
artwork: ArtworkPageBanner_artwork$key
me: ArtworkPageBanner_me$key
}
export const ArtworkPageBanner: FC<
React.PropsWithChildren<ArtworkPageBannerProps>
> = props => {
const artwork = useFragment(ARTWORK_FRAGMENT, props.artwork)
const me = useFragment(ME_FRAGMENT, props.me)
const { match } = useRouter()
const expectedPartnerOfferID = match?.location?.query?.partner_offer_id as
| string
| undefined
const partnerOffer = expectedPartnerOfferID
? extractNodes(me?.partnerOffersConnection)[0]
: null
const queryParams = match.location.query
// First show banners requested imperatively from the query string
if (!!queryParams.unavailable) {
return <ArtworkUnavailableBanner />
}
if (!!queryParams.expired_offer) {
return <ExpiredOfferBanner />
}
if (!!artwork.sale) {
return <CascadingEndTimesBannerFragmentContainer sale={artwork.sale} />
}
if (!artwork.published) {
return <UnpublishedArtworkBanner />
}
if (expectedPartnerOfferID) {
if (!artwork.isPurchasable) {
return <ArtworkUnavailableBanner />
}
if (
partnerOffer &&
partnerOffer.internalID === expectedPartnerOfferID &&
!partnerOffer.isActive
) {
return <ExpiredOfferBanner />
}
}
return null
}
const ArtworkUnavailableBanner = () => (
<FullBleedBanner variant="brand">
<Text>
Sorry, this artwork is no longer available. Please create an alert or
contact the gallery to find similar artworks.
</Text>
</FullBleedBanner>
)
const ExpiredOfferBanner = () => (
<FullBleedBanner variant="brand">
<Text>
This offer has expired. Please make an offer, purchase, or contact the
gallery.
</Text>
</FullBleedBanner>
)
const UnpublishedArtworkBanner = () => (
<FullBleedBanner variant="error">
<Text>This work is not currently published on Artsy.</Text>
</FullBleedBanner>
)
const ME_FRAGMENT = graphql`
fragment ArtworkPageBanner_me on Me
@argumentDefinitions(artworkID: { type: "String!" }) {
partnerOffersConnection(artworkID: $artworkID, first: 1) {
edges {
node {
internalID
isActive
}
}
}
}
`
const ARTWORK_FRAGMENT = graphql`
fragment ArtworkPageBanner_artwork on Artwork {
published
visibilityLevel
isPurchasable
sale {
__typename
...CascadingEndTimesBanner_sale
}
}
`