@@ -4,11 +4,11 @@ import { useLocale } from '../../contexts/index.js'
44import { useAsync } from '../../hooks/useAsync.js'
55import { useSearchParam } from '../../hooks/useSearchParam.js'
66import type { VersionMeta } from '../../services/index.js'
7- import { fetchChangelogs , getArticleLink } from '../../services/index.js'
7+ import { fetchChangelogs } from '../../services/index.js'
88import { Octicon } from '../Octicon.js'
9- import { ChangelogList , IssueList , VersionDiff , VersionMetaData } from './index.js'
9+ import { ChangelogList , VersionDiff , VersionMetaData } from './index.js'
1010
11- const Tabs = [ 'changelog' , 'diff' , 'fixes' ]
11+ const Tabs = [ 'changelog' , 'diff' ]
1212const WIKI_PAGE_PREFIX = 'https://minecraft.wiki/w/Java_Edition_'
1313
1414interface Props {
@@ -31,6 +31,7 @@ export function VersionDetail({ id, version }: Props) {
3131 changes ?. filter ( c => c . version === id || ( c . group === id && ! c . tags . includes ( 'obsolete' ) ) ) ,
3232 [ id , changes ] )
3333
34+ const fixesLink = version && getFixesLink ( version . id )
3435 const articleLink = version && getArticleLink ( version . id )
3536 const wikiPageLink = version && WIKI_PAGE_PREFIX + version . name
3637
@@ -55,6 +56,10 @@ export function VersionDetail({ id, version }: Props) {
5556 { Tabs . map ( t => < Link key = { t } class = { tab === t ? 'selected' : '' } href = { `/versions/?id=${ id } &tab=${ t } ` } >
5657 { locale ( `versions.${ t } ` ) }
5758 </ Link > ) }
59+ < a href = { fixesLink } target = "_blank" >
60+ { locale ( 'versions.fixes' ) }
61+ { Octicon . link_external }
62+ </ a >
5863 { articleLink && < a href = { articleLink } target = "_blank" >
5964 { locale ( 'versions.article' ) }
6065 { Octicon . link_external }
@@ -67,7 +72,6 @@ export function VersionDetail({ id, version }: Props) {
6772 < div class = "version-tab" >
6873 { tab === 'changelog' && < ChangelogList changes = { filteredChangelogs } defaultOrder = "asc" /> }
6974 { tab === 'diff' && < VersionDiff version = { id } /> }
70- { tab === 'fixes' && < IssueList version = { id } /> }
7175 </ div >
7276 </ div >
7377 </ >
@@ -76,3 +80,96 @@ export function VersionDetail({ id, version }: Props) {
7680export function releaseDate ( version : VersionMeta ) {
7781 return new Date ( version . release_time ) . toLocaleDateString ( undefined , { day : 'numeric' , month : 'short' , year : 'numeric' } )
7882}
83+
84+ const FIXES_PREFIX = 'https://mojira.dev/?project=MC&resolution=Fixed&fix_version='
85+
86+ function getFixesLink ( version : string ) {
87+ let match
88+ if ( ( match = version . match ( / ^ ( \d + \. \d + (?: \. \d + ) ? ) - s n a p s h o t - ( \d + ) $ / ) ) && match [ 1 ] && match [ 2 ] ) {
89+ return FIXES_PREFIX + encodeURIComponent ( `${ match [ 1 ] } Snapshot ${ match [ 2 ] } ` )
90+ }
91+ if ( ( match = version . match ( / ^ ( \d + \. \d + (?: \. \d + ) ? ) - p r e ( \d + ) $ / ) ) && match [ 1 ] && match [ 2 ] ) {
92+ return FIXES_PREFIX + encodeURIComponent ( `${ match [ 1 ] } Pre-Release ${ match [ 2 ] } ` )
93+ }
94+ if ( ( match = version . match ( / ^ ( \d + \. \d + (?: \. \d + ) ? ) - r c ( \d + ) $ / ) ) && match [ 1 ] ) {
95+ return FIXES_PREFIX + encodeURIComponent ( `${ match [ 1 ] } Release Candidate ${ match [ 2 ] } ` )
96+ }
97+ return FIXES_PREFIX + encodeURIComponent ( version )
98+ }
99+
100+ const ARTICLE_PREFIX = 'https://www.minecraft.net/article/'
101+ const ARTICLE_OVERRIDES = new Map ( Object . entries ( {
102+ '1.16-pre2' : 'minecraft-1-16-pre-release-1' ,
103+ '1.16-pre4' : 'minecraft-1-16-pre-release-3' ,
104+ '1.16-pre5' : 'minecraft-1-16-pre-release-3' ,
105+ '1.16-pre7' : 'minecraft-1-16-pre-release-6' ,
106+ '1.16-pre8' : 'minecraft-1-16-pre-release-6' ,
107+ '1.16-rc1' : 'minecraft-1-16-release-candidate' ,
108+ '1.16' : 'nether-update-java' ,
109+ '1.16.2-pre3' : 'minecraft-1-16-2-pre-release-2' ,
110+ '1.16.2-rc1' : 'minecraft-1-16-2-pre-release-2' ,
111+ '1.16.2-rc2' : 'minecraft-1-16-2-pre-release-2' ,
112+ '1.17-pre3' : 'minecraft-1-17-pre-release-2' ,
113+ '1.17-pre4' : 'minecraft-1-17-pre-release-2' ,
114+ '1.17-pre5' : 'minecraft-1-17-pre-release-2' ,
115+ '1.17.1-pre3' : 'minecraft-1-17-1-pre-release-2' ,
116+ '1.17-rc2' : 'minecraft-1-17-release-candidate-1' ,
117+ '1.17' : 'caves---cliffs--part-i-out-today-java' ,
118+ '1.17.1-rc2' : 'minecraft-1-17-1-release-candidate-1' ,
119+ '1.18-pre3' : 'minecraft-1-18-pre-release-2' ,
120+ '1.18-pre4' : 'minecraft-1-18-pre-release-2' ,
121+ '1.18-pre5' : 'minecraft-1-18-pre-release-2' ,
122+ '1.18-pre7' : 'minecraft-1-18-pre-release-6' ,
123+ '1.18-pre8' : 'minecraft-1-18-pre-release-6' ,
124+ '1.18-rc2' : 'minecraft-1-18-release-candidate-1' ,
125+ '1.18-rc3' : 'minecraft-1-18-release-candidate-1' ,
126+ '1.18-rc4' : 'minecraft-1-18-release-candidate-1' ,
127+ '1.18' : 'caves---cliffs--part-ii-out-today-java' ,
128+ '1.18.1-rc2' : 'minecraft-1-18-1-release-candidate-1' ,
129+ '1.18.1-rc3' : 'minecraft-1-18-1-release-candidate-1' ,
130+ '1.18.2-pre3' : 'minecraft-1-18-2-pre-release-2' ,
131+ '1.18.2-pre5' : 'minecraft-1-18-2-pre-release-4' ,
132+ '1.19-pre3' : 'minecraft-1-19-pre-release-2' ,
133+ '1.19-pre5' : 'minecraft-1-19-pre-release-4' ,
134+ '1.19-rc2' : 'minecraft-1-19-release-candidate-1' ,
135+ '1.19' : 'the-wild-update-out-today-java' ,
136+ '1.19.1-pre4' : 'minecraft-1-19-1-pre-release-3' ,
137+ '1.19.2-rc2' : 'minecraft-1-19-2-release-candidate-1' ,
138+ '1.19.3-pre2' : 'minecraft-1-19-3-pre-release-1' ,
139+ '1.19.3-rc2' : 'minecraft-1-19-3-release-candidate-1' ,
140+ '1.19.4-pre3' : 'minecraft-1-19-4-pre-release-2' ,
141+ '1.19.4-rc2' : 'minecraft-1-19-4-release-candidate-1' ,
142+ '1.20-pre3' : 'minecraft-1-20-pre-release-2' ,
143+ '1.20-pre4' : 'minecraft-1-20-pre-release-2' ,
144+ '1.20-pre6' : 'minecraft-1-20-pre-release-5' ,
145+ '1.20' : 'trails-tales-update-out-today-java' ,
146+ '1.20.1' : 'minecraft--java-edition-1-20-1' ,
147+ '1.20.2-pre2' : 'minecraft-1-20-2-pre-release-1' ,
148+ '23w43b' : 'minecraft-snapshot-23w43b' ,
149+ '24w03b' : 'minecraft-snapshot-24w03b' ,
150+ '24w05b' : 'minecraft-snapshot-24w05b' ,
151+ } ) )
152+
153+ function getArticleLink ( version : string ) : string | undefined {
154+ const override = ARTICLE_OVERRIDES . get ( version )
155+ if ( override ) {
156+ return ARTICLE_PREFIX + override
157+ }
158+ let match
159+ if ( ( match = version . match ( / ^ ( \d \d w \d \d ) [ a - z ] $ / ) ) && match [ 1 ] ) {
160+ return ARTICLE_PREFIX + 'minecraft-snapshot-' + match [ 1 ] + 'a'
161+ }
162+ if ( ( match = version . match ( / ^ ( \d + \. \d + (?: \. \d + ) ? ) - s n a p s h o t - ( \d + ) $ / ) ) && match [ 1 ] && match [ 2 ] ) {
163+ return ARTICLE_PREFIX + 'minecraft-' + match [ 1 ] . replaceAll ( '.' , '-' ) + '-snapshot-' + match [ 2 ]
164+ }
165+ if ( ( match = version . match ( / ^ ( \d + \. \d + (?: \. \d + ) ? ) - p r e ( \d + ) $ / ) ) && match [ 1 ] && match [ 2 ] ) {
166+ return ARTICLE_PREFIX + 'minecraft-' + match [ 1 ] . replaceAll ( '.' , '-' ) + '-pre-release-' + match [ 2 ]
167+ }
168+ if ( ( match = version . match ( / ^ ( \d + \. \d + (?: \. \d + ) ? ) - r c ( \d + ) $ / ) ) && match [ 1 ] ) {
169+ return ARTICLE_PREFIX + 'minecraft-' + match [ 1 ] . replaceAll ( '.' , '-' ) + '-release-candidate-' + match [ 2 ]
170+ }
171+ if ( version . match ( / ^ \d + \. \d + ( \. \d + ) ? $ / ) ) {
172+ return ARTICLE_PREFIX + 'minecraft-java-edition-' + version . replaceAll ( '.' , '-' )
173+ }
174+ return undefined
175+ }
0 commit comments