Skip to content

Commit af73984

Browse files
author
Lucas Bento
authored
feat: show latest rc versions in from dropdown (#91)
feat: show latest `rc` versions in `from` dropdown Co-authored-by: Lucas Bento <[email protected]>
2 parents 5331ce7 + c6c08de commit af73984

File tree

6 files changed

+167
-25
lines changed

6 files changed

+167
-25
lines changed

src/__tests__/__snapshots__/App.spec.js.snap

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,37 @@ exports[`renders without crashing 1`] = `
3030
</h1>
3131
</a>
3232
<div
33-
class="sc-gPEVay iMFRcs"
33+
class="sc-gPEVay bKLGYK"
3434
>
3535
<div>
3636
ReactGitHubBtn -
3737
Star
3838
</div>
3939
</div>
40+
<button
41+
class="ant-btn ant-btn-icon-only"
42+
type="button"
43+
>
44+
<i
45+
aria-label="icon: setting"
46+
class="anticon anticon-setting"
47+
>
48+
<svg
49+
aria-hidden="true"
50+
class=""
51+
data-icon="setting"
52+
fill="currentColor"
53+
focusable="false"
54+
height="1em"
55+
viewBox="64 64 896 896"
56+
width="1em"
57+
>
58+
<path
59+
d="M924.8 625.7l-65.5-56c3.1-19 4.7-38.4 4.7-57.8s-1.6-38.8-4.7-57.8l65.5-56a32.03 32.03 0 0 0 9.3-35.2l-.9-2.6a443.74 443.74 0 0 0-79.7-137.9l-1.8-2.1a32.12 32.12 0 0 0-35.1-9.5l-81.3 28.9c-30-24.6-63.5-44-99.7-57.6l-15.7-85a32.05 32.05 0 0 0-25.8-25.7l-2.7-.5c-52.1-9.4-106.9-9.4-159 0l-2.7.5a32.05 32.05 0 0 0-25.8 25.7l-15.8 85.4a351.86 351.86 0 0 0-99 57.4l-81.9-29.1a32 32 0 0 0-35.1 9.5l-1.8 2.1a446.02 446.02 0 0 0-79.7 137.9l-.9 2.6c-4.5 12.5-.8 26.5 9.3 35.2l66.3 56.6c-3.1 18.8-4.6 38-4.6 57.1 0 19.2 1.5 38.4 4.6 57.1L99 625.5a32.03 32.03 0 0 0-9.3 35.2l.9 2.6c18.1 50.4 44.9 96.9 79.7 137.9l1.8 2.1a32.12 32.12 0 0 0 35.1 9.5l81.9-29.1c29.8 24.5 63.1 43.9 99 57.4l15.8 85.4a32.05 32.05 0 0 0 25.8 25.7l2.7.5a449.4 449.4 0 0 0 159 0l2.7-.5a32.05 32.05 0 0 0 25.8-25.7l15.7-85a350 350 0 0 0 99.7-57.6l81.3 28.9a32 32 0 0 0 35.1-9.5l1.8-2.1c34.8-41.1 61.6-87.5 79.7-137.9l.9-2.6c4.5-12.3.8-26.3-9.3-35zM788.3 465.9c2.5 15.1 3.8 30.6 3.8 46.1s-1.3 31-3.8 46.1l-6.6 40.1 74.7 63.9a370.03 370.03 0 0 1-42.6 73.6L721 702.8l-31.4 25.8c-23.9 19.6-50.5 35-79.3 45.8l-38.1 14.3-17.9 97a377.5 377.5 0 0 1-85 0l-17.9-97.2-37.8-14.5c-28.5-10.8-55-26.2-78.7-45.7l-31.4-25.9-93.4 33.2c-17-22.9-31.2-47.6-42.6-73.6l75.5-64.5-6.5-40c-2.4-14.9-3.7-30.3-3.7-45.5 0-15.3 1.2-30.6 3.7-45.5l6.5-40-75.5-64.5c11.3-26.1 25.6-50.7 42.6-73.6l93.4 33.2 31.4-25.9c23.7-19.5 50.2-34.9 78.7-45.7l37.9-14.3 17.9-97.2c28.1-3.2 56.8-3.2 85 0l17.9 97 38.1 14.3c28.7 10.8 55.4 26.2 79.3 45.8l31.4 25.8 92.8-32.9c17 22.9 31.2 47.6 42.6 73.6L781.8 426l6.5 39.9zM512 326c-97.2 0-176 78.8-176 176s78.8 176 176 176 176-78.8 176-176-78.8-176-176-176zm79.2 255.2A111.6 111.6 0 0 1 512 614c-29.9 0-58-11.7-79.2-32.8A111.6 111.6 0 0 1 400 502c0-29.9 11.7-58 32.8-79.2C454 401.6 482.1 390 512 390c29.9 0 58 11.6 79.2 32.8A111.6 111.6 0 0 1 624 502c0 29.9-11.7 58-32.8 79.2z"
60+
/>
61+
</svg>
62+
</i>
63+
</button>
4064
</div>
4165
<div
4266
class="sc-htpNat hqmgw"

src/__tests__/components/__snapshots__/Home.spec.js.snap

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,37 @@ exports[`renders without crashing 1`] = `
3030
</h1>
3131
</a>
3232
<div
33-
class="sc-gPEVay iMFRcs"
33+
class="sc-gPEVay bKLGYK"
3434
>
3535
<div>
3636
ReactGitHubBtn -
3737
Star
3838
</div>
3939
</div>
40+
<button
41+
class="ant-btn ant-btn-icon-only"
42+
type="button"
43+
>
44+
<i
45+
aria-label="icon: setting"
46+
class="anticon anticon-setting"
47+
>
48+
<svg
49+
aria-hidden="true"
50+
class=""
51+
data-icon="setting"
52+
fill="currentColor"
53+
focusable="false"
54+
height="1em"
55+
viewBox="64 64 896 896"
56+
width="1em"
57+
>
58+
<path
59+
d="M924.8 625.7l-65.5-56c3.1-19 4.7-38.4 4.7-57.8s-1.6-38.8-4.7-57.8l65.5-56a32.03 32.03 0 0 0 9.3-35.2l-.9-2.6a443.74 443.74 0 0 0-79.7-137.9l-1.8-2.1a32.12 32.12 0 0 0-35.1-9.5l-81.3 28.9c-30-24.6-63.5-44-99.7-57.6l-15.7-85a32.05 32.05 0 0 0-25.8-25.7l-2.7-.5c-52.1-9.4-106.9-9.4-159 0l-2.7.5a32.05 32.05 0 0 0-25.8 25.7l-15.8 85.4a351.86 351.86 0 0 0-99 57.4l-81.9-29.1a32 32 0 0 0-35.1 9.5l-1.8 2.1a446.02 446.02 0 0 0-79.7 137.9l-.9 2.6c-4.5 12.5-.8 26.5 9.3 35.2l66.3 56.6c-3.1 18.8-4.6 38-4.6 57.1 0 19.2 1.5 38.4 4.6 57.1L99 625.5a32.03 32.03 0 0 0-9.3 35.2l.9 2.6c18.1 50.4 44.9 96.9 79.7 137.9l1.8 2.1a32.12 32.12 0 0 0 35.1 9.5l81.9-29.1c29.8 24.5 63.1 43.9 99 57.4l15.8 85.4a32.05 32.05 0 0 0 25.8 25.7l2.7.5a449.4 449.4 0 0 0 159 0l2.7-.5a32.05 32.05 0 0 0 25.8-25.7l15.7-85a350 350 0 0 0 99.7-57.6l81.3 28.9a32 32 0 0 0 35.1-9.5l1.8-2.1c34.8-41.1 61.6-87.5 79.7-137.9l.9-2.6c4.5-12.3.8-26.3-9.3-35zM788.3 465.9c2.5 15.1 3.8 30.6 3.8 46.1s-1.3 31-3.8 46.1l-6.6 40.1 74.7 63.9a370.03 370.03 0 0 1-42.6 73.6L721 702.8l-31.4 25.8c-23.9 19.6-50.5 35-79.3 45.8l-38.1 14.3-17.9 97a377.5 377.5 0 0 1-85 0l-17.9-97.2-37.8-14.5c-28.5-10.8-55-26.2-78.7-45.7l-31.4-25.9-93.4 33.2c-17-22.9-31.2-47.6-42.6-73.6l75.5-64.5-6.5-40c-2.4-14.9-3.7-30.3-3.7-45.5 0-15.3 1.2-30.6 3.7-45.5l6.5-40-75.5-64.5c11.3-26.1 25.6-50.7 42.6-73.6l93.4 33.2 31.4-25.9c23.7-19.5 50.2-34.9 78.7-45.7l37.9-14.3 17.9-97.2c28.1-3.2 56.8-3.2 85 0l17.9 97 38.1 14.3c28.7 10.8 55.4 26.2 79.3 45.8l31.4 25.8 92.8-32.9c17 22.9 31.2 47.6 42.6 73.6L781.8 426l6.5 39.9zM512 326c-97.2 0-176 78.8-176 176s78.8 176 176 176 176-78.8 176-176-78.8-176-176-176zm79.2 255.2A111.6 111.6 0 0 1 512 614c-29.9 0-58-11.7-79.2-32.8A111.6 111.6 0 0 1 400 502c0-29.9 11.7-58 32.8-79.2C454 401.6 482.1 390 512 390c29.9 0 58 11.6 79.2 32.8A111.6 111.6 0 0 1 624 502c0 29.9-11.7 58-32.8 79.2z"
60+
/>
61+
</svg>
62+
</i>
63+
</button>
4064
</div>
4165
<div
4266
class="sc-htpNat hqmgw"

src/components/common/Settings.js

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import React, { useState } from 'react'
2+
import { Popover, Button, Checkbox } from 'antd'
3+
import { SHOW_LATEST_RCS } from '../../utils'
4+
5+
const Settings = ({ handleSettingsChange }) => {
6+
const [popoverVisibility, setVisibility] = useState(false)
7+
8+
const handleClickChange = visibility => setVisibility(visibility)
9+
10+
const updateCheckboxValues = checkboxValues =>
11+
handleSettingsChange(checkboxValues)
12+
13+
return (
14+
<Popover
15+
placement="bottomRight"
16+
content={
17+
<Checkbox.Group onChange={updateCheckboxValues}>
18+
<div>
19+
<Checkbox value={SHOW_LATEST_RCS}>{SHOW_LATEST_RCS}</Checkbox>
20+
</div>
21+
</Checkbox.Group>
22+
}
23+
trigger="click"
24+
visible={popoverVisibility}
25+
onVisibleChange={handleClickChange}
26+
>
27+
<Button icon="setting" />
28+
</Popover>
29+
)
30+
}
31+
32+
export default Settings

src/components/common/VersionSelector.js

Lines changed: 61 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -47,26 +47,50 @@ const getVersionsInURL = () => {
4747
}
4848
}
4949

50-
// Compare versions by removing the `rc` from them, e.g. `0.60.0-rc.1` becomes `0.60.0`
5150
const compareReleaseCandidateVersions = ({ version, versionToCompare }) =>
52-
semver.compare(
53-
semver.valid(semver.coerce(version)),
54-
semver.valid(semver.coerce(versionToCompare))
55-
) === 0
56-
57-
// Filters out release candidates from `releasedVersion` with the exception of
58-
// the release candidates from the latest version & target version that comes from the URL
59-
// but only if any of them is a release candidate
60-
const getReleasedVersionsWithoutCandidates = ({
51+
['prepatch', null].includes(semver.diff(version, versionToCompare))
52+
53+
const getLatestMajorReleaseVersion = releasedVersions =>
54+
semver.valid(
55+
semver.coerce(
56+
releasedVersions.find(
57+
releasedVersion =>
58+
!semver.prerelease(releasedVersion) &&
59+
semver.patch(releasedVersion) === 0
60+
)
61+
)
62+
)
63+
64+
// Check if `from` rc version is one of the latest major release (ie. 0.60.0)
65+
const checkLatestReleaseCandidate = ({ version, latestVersion }) =>
66+
semver.prerelease(version) &&
67+
compareReleaseCandidateVersions({
68+
version: latestVersion,
69+
versionToCompare: version
70+
})
71+
72+
// Filters out release candidates from `releasedVersion` with the
73+
// exception of the release candidates from the latest version
74+
const getReleasedVersionsWithCandidates = ({
6175
releasedVersions,
6276
toVersion,
63-
latestVersion
77+
latestVersion,
78+
showReleaseCandidates
6479
}) => {
6580
const isToVersionAReleaseCandidate = semver.prerelease(toVersion) !== null
6681
const isLatestAReleaseCandidate = semver.prerelease(latestVersion) !== null
6782

68-
return releasedVersions.filter(
69-
releasedVersion =>
83+
return releasedVersions.filter(releasedVersion => {
84+
// Show the release candidates of the latest version
85+
const isLatestReleaseCandidate =
86+
showReleaseCandidates &&
87+
checkLatestReleaseCandidate({
88+
version: releasedVersion,
89+
latestVersion
90+
})
91+
92+
return (
93+
isLatestReleaseCandidate ||
7094
semver.prerelease(releasedVersion) === null ||
7195
(isToVersionAReleaseCandidate &&
7296
compareReleaseCandidateVersions({
@@ -78,16 +102,28 @@ const getReleasedVersionsWithoutCandidates = ({
78102
version: latestVersion,
79103
versionToCompare: releasedVersion
80104
}))
81-
)
105+
)
106+
})
82107
}
83108

84-
const getReleasedVersions = ({ releasedVersions, minVersion, maxVersion }) =>
85-
releasedVersions.filter(
109+
const getReleasedVersions = ({ releasedVersions, minVersion, maxVersion }) => {
110+
const latestMajorReleaseVersion = getLatestMajorReleaseVersion(
111+
releasedVersions
112+
)
113+
114+
const isVersionAReleaseAndOfLatest = version =>
115+
version.includes('rc') &&
116+
semver.valid(semver.coerce(version)) === latestMajorReleaseVersion
117+
118+
return releasedVersions.filter(
86119
releasedVersion =>
87120
releasedVersion.length > 0 &&
88121
((maxVersion && semver.lt(releasedVersion, maxVersion)) ||
89-
(minVersion && semver.gt(releasedVersion, minVersion)))
122+
(minVersion &&
123+
semver.gt(releasedVersion, minVersion) &&
124+
!isVersionAReleaseAndOfLatest(releasedVersion)))
90125
)
126+
}
91127

92128
// Finds the first minor release (which in react-native is the major) when compared to another version
93129
const getFirstMajorRelease = ({ releasedVersions, versionToCompare }) =>
@@ -122,7 +158,7 @@ const updateURLVersions = ({ fromVersion, toVersion }) => {
122158
window.history.replaceState(null, null, `${pageURL}${newURL}`)
123159
}
124160

125-
const VersionSelector = ({ showDiff }) => {
161+
const VersionSelector = ({ showDiff, showReleaseCandidates }) => {
126162
const [isLoading, setLoading] = useState(true)
127163
const [allVersions, setAllVersions] = useState([])
128164
const [fromVersionList, setFromVersionList] = useState([])
@@ -160,10 +196,11 @@ const VersionSelector = ({ showDiff }) => {
160196
: latestVersion
161197

162198
// Remove `rc` versions from the array of versions
163-
const sanitizedVersions = getReleasedVersionsWithoutCandidates({
199+
const sanitizedVersions = getReleasedVersionsWithCandidates({
164200
releasedVersions: allVersionsFromResponse,
165201
toVersion: toVersionToBeSet,
166-
latestVersion
202+
latestVersion,
203+
showReleaseCandidates
167204
})
168205

169206
setAllVersions(sanitizedVersions)
@@ -188,6 +225,7 @@ const VersionSelector = ({ showDiff }) => {
188225
minVersion: fromVersionToBeSet
189226
})
190227
)
228+
191229
setLocalFromVersion(fromVersionToBeSet)
192230
setLocalToVersion(toVersionToBeSet)
193231

@@ -203,7 +241,7 @@ const VersionSelector = ({ showDiff }) => {
203241
}
204242

205243
fetchVersions()
206-
}, [setLocalFromVersion, setLocalToVersion])
244+
}, [setLocalFromVersion, setLocalToVersion, showReleaseCandidates])
207245

208246
useEffect(() => {
209247
if (isLoading) {
@@ -227,7 +265,8 @@ const VersionSelector = ({ showDiff }) => {
227265
allVersions,
228266
localFromVersion,
229267
localToVersion,
230-
hasVersionsFromURL
268+
hasVersionsFromURL,
269+
showReleaseCandidates
231270
])
232271

233272
const onShowDiff = ({ fromVersion, toVersion }) => {

src/components/pages/Home.js

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,10 @@ import GitHubButton from 'react-github-btn'
55
import ReactGA from 'react-ga'
66
import VersionSelector from '../common/VersionSelector'
77
import DiffViewer from '../common/DiffViewer'
8+
import Settings from '../common/Settings'
89
import { homepage } from '../../../package.json'
910
import logo from '../../assets/logo.svg'
11+
import { SHOW_LATEST_RCS } from '../../utils'
1012

1113
const Page = styled.div`
1214
display: flex;
@@ -43,12 +45,16 @@ const StarButton = styled(({ className, ...props }) => (
4345
))`
4446
margin-top: 10px;
4547
margin-left: 15px;
48+
margin-right: auto;
4649
`
4750

4851
const Home = () => {
4952
const [fromVersion, setFromVersion] = useState('')
5053
const [toVersion, setToVersion] = useState('')
5154
const [showDiff, setShowDiff] = useState(false)
55+
const [settings, setSettings] = useState({
56+
[`${SHOW_LATEST_RCS}`]: false
57+
})
5258

5359
useEffect(() => {
5460
if (process.env.NODE_ENV === 'production') {
@@ -67,6 +73,15 @@ const Home = () => {
6773
setShowDiff(true)
6874
}
6975

76+
const handleSettingsChange = settingsValues => {
77+
const normalizedIncomingSettings = settingsValues.reduce((acc, val) => {
78+
acc[val] = true
79+
return acc
80+
}, {})
81+
82+
setSettings(normalizedIncomingSettings)
83+
}
84+
7085
return (
7186
<Page>
7287
<Container>
@@ -89,9 +104,14 @@ const Home = () => {
89104
>
90105
Star
91106
</StarButton>
107+
108+
<Settings handleSettingsChange={handleSettingsChange} />
92109
</TitleContainer>
93110

94-
<VersionSelector showDiff={handleShowDiff} />
111+
<VersionSelector
112+
showDiff={handleShowDiff}
113+
showReleaseCandidates={settings[SHOW_LATEST_RCS]}
114+
/>
95115
</Container>
96116

97117
<DiffViewer

src/utils.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,3 +33,6 @@ export const getChangelogURL = ({ version }) =>
3333
'.',
3434
''
3535
)}`
36+
37+
// settings constants
38+
export const SHOW_LATEST_RCS = 'Show latest release candidates'

0 commit comments

Comments
 (0)