|
1 | 1 | import React from "react"; |
2 | 2 | import ReactDOM from "react-dom"; |
| 3 | +import { Item } from "shared/graphql/graphql"; |
| 4 | +import root from "react-shadow/emotion"; |
| 5 | +import { UserLookup } from "../types/UserLookup"; |
| 6 | +import { FormattedDateTime } from "../formattedDateTime"; |
| 7 | +import { css } from "@emotion/react"; |
| 8 | +import { agateSans } from "../../fontNormaliser"; |
| 9 | +import { neutral, space } from "@guardian/source-foundations"; |
3 | 10 |
|
4 | 11 | export const STARRED_MESSAGES_HTML_TAG = "pinboard-starred-messages"; |
5 | 12 |
|
6 | | -// interface StarredMessagesProps {} |
| 13 | +const StarredItemDisplay = ({ |
| 14 | + item, |
| 15 | + userLookup, |
| 16 | +}: { |
| 17 | + item: Item; |
| 18 | + userLookup: UserLookup; |
| 19 | +}) => { |
| 20 | + const user = userLookup?.[item.userEmail]; |
| 21 | + const userDisplayName = user |
| 22 | + ? `${user.firstName} ${user.lastName}` |
| 23 | + : item.userEmail; |
| 24 | + return ( |
| 25 | + <div |
| 26 | + css={css` |
| 27 | + ${agateSans.xsmall()}; |
| 28 | + display: flex; |
| 29 | + align-items: flex-end; |
| 30 | + gap: ${space[1]}px; |
| 31 | + color: ${neutral[20]}; |
| 32 | + `} |
| 33 | + > |
| 34 | + <span |
| 35 | + css={css` |
| 36 | + color: ${neutral[0]}; |
| 37 | + ${agateSans.medium()}; |
| 38 | + `} |
| 39 | + > |
| 40 | + {item.message} |
| 41 | + </span> |
| 42 | + <span title={item.userEmail}>{userDisplayName}</span> |
| 43 | + <span> |
| 44 | + <FormattedDateTime timestamp={item.timestamp} withAgo /> |
| 45 | + </span> |
| 46 | + </div> |
| 47 | + ); |
| 48 | +}; |
7 | 49 |
|
8 | | -const StarredMessages = (/* props: StarredMessagesProps */) => ( |
9 | | - <div> |
10 | | - <p>Starred Messages</p> |
11 | | - </div> |
12 | | -); |
| 50 | +interface StarredMessagesProps { |
| 51 | + items: Item[]; |
| 52 | + userLookup: UserLookup; |
| 53 | +} |
| 54 | + |
| 55 | +const StarredMessages = ({ items, userLookup }: StarredMessagesProps) => { |
| 56 | + const starredMessages = items.filter( |
| 57 | + (item) => item.isStarred && !item.deletedAt |
| 58 | + ); |
| 59 | + return ( |
| 60 | + <root.div> |
| 61 | + {starredMessages.map((item) => ( |
| 62 | + <StarredItemDisplay key={item.id} item={item} userLookup={userLookup} /> |
| 63 | + ))} |
| 64 | + </root.div> |
| 65 | + ); |
| 66 | +}; |
13 | 67 |
|
14 | | -interface StarredMessagesPortalProps { |
| 68 | +interface StarredMessagesPortalProps extends StarredMessagesProps { |
15 | 69 | node: Element; |
16 | 70 | } |
17 | 71 |
|
18 | | -export const StarredMessagesPortal = ({ node }: StarredMessagesPortalProps) => |
19 | | - ReactDOM.createPortal(<StarredMessages />, node); |
| 72 | +export const StarredMessagesPortal = ({ |
| 73 | + node, |
| 74 | + ...props |
| 75 | +}: StarredMessagesPortalProps) => |
| 76 | + ReactDOM.createPortal(<StarredMessages {...props} />, node); |
0 commit comments