Skip to content

Commit 53862c3

Browse files
committed
Add release details modal
1 parent c3b0366 commit 53862c3

2 files changed

Lines changed: 147 additions & 0 deletions

File tree

Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
import { ExternalLinkIcon } from "@chakra-ui/icons"
2+
import {
3+
Badge,
4+
Box,
5+
Button,
6+
Code,
7+
Icon,
8+
Link,
9+
Modal,
10+
ModalBody,
11+
ModalCloseButton,
12+
ModalContent,
13+
ModalFooter,
14+
ModalHeader,
15+
ModalOverlay,
16+
Text,
17+
} from "@chakra-ui/react"
18+
19+
import type { ReleaseListItem } from "../../client"
20+
import { releaseExternalLink } from "../../lib/releases"
21+
22+
interface ReleaseDetailsModalProps {
23+
isOpen: boolean
24+
onClose: () => void
25+
release: ReleaseListItem | null
26+
}
27+
28+
// A labeled row, rendered only when there's a value to show.
29+
const Field = ({
30+
label,
31+
children,
32+
}: {
33+
label: string
34+
children: React.ReactNode
35+
}) => (
36+
<Box mb={3}>
37+
<Text fontSize="xs" color="gray.500" textTransform="uppercase">
38+
{label}
39+
</Text>
40+
<Box>{children}</Box>
41+
</Box>
42+
)
43+
44+
const ReleaseDetailsModal = ({
45+
isOpen,
46+
onClose,
47+
release,
48+
}: ReleaseDetailsModalProps) => {
49+
if (!release) return null
50+
const link = releaseExternalLink(release)
51+
const pathLabel =
52+
release.path && release.path !== "." ? release.path : "Whole project"
53+
const sourceLabel =
54+
release.source === "cloud"
55+
? "Hosted on Calkit"
56+
: release.publisher
57+
? `Published via ${release.publisher}`
58+
: "Declared in calkit.yaml"
59+
return (
60+
<Modal isOpen={isOpen} onClose={onClose} size="lg" isCentered>
61+
<ModalOverlay />
62+
<ModalContent>
63+
<ModalHeader>
64+
{release.title || release.name}
65+
{release.public === false && (
66+
<Badge ml={2} colorScheme="purple">
67+
Private
68+
</Badge>
69+
)}
70+
</ModalHeader>
71+
<ModalCloseButton />
72+
<ModalBody pb={6}>
73+
<Field label="Name">
74+
<Code>{release.name}</Code>
75+
</Field>
76+
{release.kind && <Field label="Kind">{release.kind}</Field>}
77+
<Field label="Path">
78+
<Code>{pathLabel}</Code>
79+
</Field>
80+
{release.git_rev_abbrev && (
81+
<Field label="Version">
82+
<Code>{release.git_ref ?? release.git_rev_abbrev}</Code>
83+
</Field>
84+
)}
85+
{release.date && <Field label="Date">{release.date}</Field>}
86+
<Field label="Source">{sourceLabel}</Field>
87+
{release.doi && (
88+
<Field label="DOI">
89+
<Link href={`https://doi.org/${release.doi}`} isExternal>
90+
{release.doi} <Icon as={ExternalLinkIcon} mx="2px" />
91+
</Link>
92+
</Field>
93+
)}
94+
{release.source === "cloud" && (
95+
<Field label="Activity">
96+
{release.view_count ?? 0} views · {release.comment_count ?? 0}{" "}
97+
comments
98+
</Field>
99+
)}
100+
{release.description && (
101+
<Field label="Description">
102+
<Text whiteSpace="pre-wrap">{release.description}</Text>
103+
</Field>
104+
)}
105+
</ModalBody>
106+
<ModalFooter gap={3}>
107+
{link && (
108+
<Button
109+
as={Link}
110+
href={link.href}
111+
isExternal
112+
variant="primary"
113+
rightIcon={<Icon as={ExternalLinkIcon} />}
114+
>
115+
Open {link.label}
116+
</Button>
117+
)}
118+
<Button onClick={onClose}>Close</Button>
119+
</ModalFooter>
120+
</ModalContent>
121+
</Modal>
122+
)
123+
}
124+
125+
export default ReleaseDetailsModal
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
// Sort types/constants for the releases table. Kept out of ReleasesTable.tsx
2+
// so that file only exports a component, which React Fast Refresh requires for
3+
// clean hot-reloading (a non-component value export there invalidates the
4+
// module on every edit).
5+
6+
export type SortKey =
7+
| "name"
8+
| "path"
9+
| "version"
10+
| "date"
11+
| "visibility"
12+
| "views"
13+
| "comments"
14+
15+
export type SortDir = "asc" | "desc"
16+
17+
export interface ReleaseSort {
18+
key: SortKey
19+
dir: SortDir
20+
}
21+
22+
export const DEFAULT_RELEASE_SORT: ReleaseSort = { key: "date", dir: "desc" }

0 commit comments

Comments
 (0)