From c2b5529a60d3b38cbcea5788743d333e1915f014 Mon Sep 17 00:00:00 2001 From: Misode Date: Tue, 24 Feb 2026 21:57:35 +0100 Subject: [PATCH] Link directly to mojira.dev filtered issue list --- src/app/components/versions/Issue.tsx | 15 --- src/app/components/versions/IssueList.tsx | 22 ---- src/app/components/versions/VersionDetail.tsx | 105 +++++++++++++++++- src/app/components/versions/index.ts | 1 - src/app/services/Article.ts | 77 ------------- src/app/services/DataFetcher.ts | 26 ----- src/app/services/index.ts | 1 - src/locales/en.json | 1 - 8 files changed, 101 insertions(+), 147 deletions(-) delete mode 100644 src/app/components/versions/Issue.tsx delete mode 100644 src/app/components/versions/IssueList.tsx delete mode 100644 src/app/services/Article.ts diff --git a/src/app/components/versions/Issue.tsx b/src/app/components/versions/Issue.tsx deleted file mode 100644 index 2662f12a..00000000 --- a/src/app/components/versions/Issue.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import type { Bugfix } from '../../services/DataFetcher.js' -import { Badge } from '../Badge.jsx' -import { Card } from '../Card.jsx' - -interface Props { - fix: Bugfix -} -export function Issue({ fix }: Props) { - return -
{fix.summary}
-
- {fix.categories.map(c => )} -
-
-} diff --git a/src/app/components/versions/IssueList.tsx b/src/app/components/versions/IssueList.tsx deleted file mode 100644 index 3a42b2dd..00000000 --- a/src/app/components/versions/IssueList.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import { useLocale } from '../../contexts/Locale.jsx' -import { useAsync } from '../../hooks/useAsync.js' -import { fetchBugfixes } from '../../services/DataFetcher.js' -import { Issue } from './Issue.jsx' - -interface Props { - version: string -} -export function IssueList({ version }: Props) { - const { locale } = useLocale() - const { value: issues, loading } = useAsync(() => fetchBugfixes(version), [version]) - - return
- {issues === undefined || loading ? <> - {locale('loading')} - : issues.length === 0 ? <> - {locale('versions.fixes.no_results')} - : <> - {issues?.map(issue => )} - } -
-} diff --git a/src/app/components/versions/VersionDetail.tsx b/src/app/components/versions/VersionDetail.tsx index 7366bdad..c7d387ad 100644 --- a/src/app/components/versions/VersionDetail.tsx +++ b/src/app/components/versions/VersionDetail.tsx @@ -4,11 +4,11 @@ import { useLocale } from '../../contexts/index.js' import { useAsync } from '../../hooks/useAsync.js' import { useSearchParam } from '../../hooks/useSearchParam.js' import type { VersionMeta } from '../../services/index.js' -import { fetchChangelogs, getArticleLink } from '../../services/index.js' +import { fetchChangelogs } from '../../services/index.js' import { Octicon } from '../Octicon.js' -import { ChangelogList, IssueList, VersionDiff, VersionMetaData } from './index.js' +import { ChangelogList, VersionDiff, VersionMetaData } from './index.js' -const Tabs = ['changelog', 'diff', 'fixes'] +const Tabs = ['changelog', 'diff'] const WIKI_PAGE_PREFIX = 'https://minecraft.wiki/w/Java_Edition_' interface Props { @@ -31,6 +31,7 @@ export function VersionDetail({ id, version }: Props) { changes?.filter(c => c.version === id || (c.group === id && !c.tags.includes('obsolete'))), [id, changes]) + const fixesLink = version && getFixesLink(version.id) const articleLink = version && getArticleLink(version.id) const wikiPageLink = version && WIKI_PAGE_PREFIX + version.name @@ -55,6 +56,10 @@ export function VersionDetail({ id, version }: Props) { {Tabs.map(t => {locale(`versions.${t}`)} )} + + {locale('versions.fixes')} + {Octicon.link_external} + {articleLink && {locale('versions.article')} {Octicon.link_external} @@ -67,7 +72,6 @@ export function VersionDetail({ id, version }: Props) {
{tab === 'changelog' && } {tab === 'diff' && } - {tab === 'fixes' && }
@@ -76,3 +80,96 @@ export function VersionDetail({ id, version }: Props) { export function releaseDate(version: VersionMeta) { return new Date(version.release_time).toLocaleDateString(undefined, { day: 'numeric', month: 'short', year: 'numeric' }) } + +const FIXES_PREFIX = 'https://mojira.dev/?project=MC&resolution=Fixed&fix_version=' + +function getFixesLink(version: string) { + let match + if ((match = version.match(/^(\d+\.\d+(?:\.\d+)?)-snapshot-(\d+)$/)) && match[1] && match[2]) { + return FIXES_PREFIX + encodeURIComponent(`${match[1]} Snapshot ${match[2]}`) + } + if ((match = version.match(/^(\d+\.\d+(?:\.\d+)?)-pre(\d+)$/)) && match[1] && match[2]) { + return FIXES_PREFIX + encodeURIComponent(`${match[1]} Pre-Release ${match[2]}`) + } + if ((match = version.match(/^(\d+\.\d+(?:\.\d+)?)-rc(\d+)$/)) && match[1]) { + return FIXES_PREFIX + encodeURIComponent(`${match[1]} Release Candidate ${match[2]}`) + } + return FIXES_PREFIX + encodeURIComponent(version) +} + +const ARTICLE_PREFIX = 'https://www.minecraft.net/article/' +const ARTICLE_OVERRIDES = new Map(Object.entries({ + '1.16-pre2': 'minecraft-1-16-pre-release-1', + '1.16-pre4': 'minecraft-1-16-pre-release-3', + '1.16-pre5': 'minecraft-1-16-pre-release-3', + '1.16-pre7': 'minecraft-1-16-pre-release-6', + '1.16-pre8': 'minecraft-1-16-pre-release-6', + '1.16-rc1': 'minecraft-1-16-release-candidate', + '1.16': 'nether-update-java', + '1.16.2-pre3': 'minecraft-1-16-2-pre-release-2', + '1.16.2-rc1': 'minecraft-1-16-2-pre-release-2', + '1.16.2-rc2': 'minecraft-1-16-2-pre-release-2', + '1.17-pre3': 'minecraft-1-17-pre-release-2', + '1.17-pre4': 'minecraft-1-17-pre-release-2', + '1.17-pre5': 'minecraft-1-17-pre-release-2', + '1.17.1-pre3': 'minecraft-1-17-1-pre-release-2', + '1.17-rc2': 'minecraft-1-17-release-candidate-1', + '1.17': 'caves---cliffs--part-i-out-today-java', + '1.17.1-rc2': 'minecraft-1-17-1-release-candidate-1', + '1.18-pre3': 'minecraft-1-18-pre-release-2', + '1.18-pre4': 'minecraft-1-18-pre-release-2', + '1.18-pre5': 'minecraft-1-18-pre-release-2', + '1.18-pre7': 'minecraft-1-18-pre-release-6', + '1.18-pre8': 'minecraft-1-18-pre-release-6', + '1.18-rc2': 'minecraft-1-18-release-candidate-1', + '1.18-rc3': 'minecraft-1-18-release-candidate-1', + '1.18-rc4': 'minecraft-1-18-release-candidate-1', + '1.18': 'caves---cliffs--part-ii-out-today-java', + '1.18.1-rc2': 'minecraft-1-18-1-release-candidate-1', + '1.18.1-rc3': 'minecraft-1-18-1-release-candidate-1', + '1.18.2-pre3': 'minecraft-1-18-2-pre-release-2', + '1.18.2-pre5': 'minecraft-1-18-2-pre-release-4', + '1.19-pre3': 'minecraft-1-19-pre-release-2', + '1.19-pre5': 'minecraft-1-19-pre-release-4', + '1.19-rc2': 'minecraft-1-19-release-candidate-1', + '1.19': 'the-wild-update-out-today-java', + '1.19.1-pre4': 'minecraft-1-19-1-pre-release-3', + '1.19.2-rc2': 'minecraft-1-19-2-release-candidate-1', + '1.19.3-pre2': 'minecraft-1-19-3-pre-release-1', + '1.19.3-rc2': 'minecraft-1-19-3-release-candidate-1', + '1.19.4-pre3': 'minecraft-1-19-4-pre-release-2', + '1.19.4-rc2': 'minecraft-1-19-4-release-candidate-1', + '1.20-pre3': 'minecraft-1-20-pre-release-2', + '1.20-pre4': 'minecraft-1-20-pre-release-2', + '1.20-pre6': 'minecraft-1-20-pre-release-5', + '1.20': 'trails-tales-update-out-today-java', + '1.20.1': 'minecraft--java-edition-1-20-1', + '1.20.2-pre2': 'minecraft-1-20-2-pre-release-1', + '23w43b': 'minecraft-snapshot-23w43b', + '24w03b': 'minecraft-snapshot-24w03b', + '24w05b': 'minecraft-snapshot-24w05b', +})) + +function getArticleLink(version: string): string | undefined { + const override = ARTICLE_OVERRIDES.get(version) + if (override) { + return ARTICLE_PREFIX + override + } + let match + if ((match = version.match(/^(\d\dw\d\d)[a-z]$/)) && match[1]) { + return ARTICLE_PREFIX + 'minecraft-snapshot-' + match[1] + 'a' + } + if ((match = version.match(/^(\d+\.\d+(?:\.\d+)?)-snapshot-(\d+)$/)) && match[1] && match[2]) { + return ARTICLE_PREFIX + 'minecraft-' + match[1].replaceAll('.', '-') + '-snapshot-' + match[2] + } + if ((match = version.match(/^(\d+\.\d+(?:\.\d+)?)-pre(\d+)$/)) && match[1] && match[2]) { + return ARTICLE_PREFIX + 'minecraft-' + match[1].replaceAll('.', '-') + '-pre-release-' + match[2] + } + if ((match = version.match(/^(\d+\.\d+(?:\.\d+)?)-rc(\d+)$/)) && match[1]) { + return ARTICLE_PREFIX + 'minecraft-' + match[1].replaceAll('.', '-') + '-release-candidate-' + match[2] + } + if (version.match(/^\d+\.\d+(\.\d+)?$/)) { + return ARTICLE_PREFIX + 'minecraft-java-edition-' + version.replaceAll('.', '-') + } + return undefined +} diff --git a/src/app/components/versions/index.ts b/src/app/components/versions/index.ts index b6213b9b..29f0ab04 100644 --- a/src/app/components/versions/index.ts +++ b/src/app/components/versions/index.ts @@ -1,7 +1,6 @@ export * from '../Badge.jsx' export * from './ChangelogEntry.js' export * from './ChangelogList.js' -export * from './IssueList.jsx' export * from './VersionDetail.js' export * from './VersionDiff.jsx' export * from './VersionEntry.js' diff --git a/src/app/services/Article.ts b/src/app/services/Article.ts deleted file mode 100644 index a4402d25..00000000 --- a/src/app/services/Article.ts +++ /dev/null @@ -1,77 +0,0 @@ -const ARTICLE_PREFIX = 'https://www.minecraft.net/article/' - -const ARTICLE_OVERRIDES = new Map(Object.entries({ - '1.16-pre2': 'minecraft-1-16-pre-release-1', - '1.16-pre4': 'minecraft-1-16-pre-release-3', - '1.16-pre5': 'minecraft-1-16-pre-release-3', - '1.16-pre7': 'minecraft-1-16-pre-release-6', - '1.16-pre8': 'minecraft-1-16-pre-release-6', - '1.16-rc1': 'minecraft-1-16-release-candidate', - '1.16': 'nether-update-java', - '1.16.2-pre3': 'minecraft-1-16-2-pre-release-2', - '1.16.2-rc1': 'minecraft-1-16-2-pre-release-2', - '1.16.2-rc2': 'minecraft-1-16-2-pre-release-2', - '1.17-pre3': 'minecraft-1-17-pre-release-2', - '1.17-pre4': 'minecraft-1-17-pre-release-2', - '1.17-pre5': 'minecraft-1-17-pre-release-2', - '1.17.1-pre3': 'minecraft-1-17-1-pre-release-2', - '1.17-rc2': 'minecraft-1-17-release-candidate-1', - '1.17': 'caves---cliffs--part-i-out-today-java', - '1.17.1-rc2': 'minecraft-1-17-1-release-candidate-1', - '1.18-pre3': 'minecraft-1-18-pre-release-2', - '1.18-pre4': 'minecraft-1-18-pre-release-2', - '1.18-pre5': 'minecraft-1-18-pre-release-2', - '1.18-pre7': 'minecraft-1-18-pre-release-6', - '1.18-pre8': 'minecraft-1-18-pre-release-6', - '1.18-rc2': 'minecraft-1-18-release-candidate-1', - '1.18-rc3': 'minecraft-1-18-release-candidate-1', - '1.18-rc4': 'minecraft-1-18-release-candidate-1', - '1.18': 'caves---cliffs--part-ii-out-today-java', - '1.18.1-rc2': 'minecraft-1-18-1-release-candidate-1', - '1.18.1-rc3': 'minecraft-1-18-1-release-candidate-1', - '1.18.2-pre3': 'minecraft-1-18-2-pre-release-2', - '1.18.2-pre5': 'minecraft-1-18-2-pre-release-4', - '1.19-pre3': 'minecraft-1-19-pre-release-2', - '1.19-pre5': 'minecraft-1-19-pre-release-4', - '1.19-rc2': 'minecraft-1-19-release-candidate-1', - '1.19': 'the-wild-update-out-today-java', - '1.19.1-pre4': 'minecraft-1-19-1-pre-release-3', - '1.19.2-rc2': 'minecraft-1-19-2-release-candidate-1', - '1.19.3-pre2': 'minecraft-1-19-3-pre-release-1', - '1.19.3-rc2': 'minecraft-1-19-3-release-candidate-1', - '1.19.4-pre3': 'minecraft-1-19-4-pre-release-2', - '1.19.4-rc2': 'minecraft-1-19-4-release-candidate-1', - '1.20-pre3': 'minecraft-1-20-pre-release-2', - '1.20-pre4': 'minecraft-1-20-pre-release-2', - '1.20-pre6': 'minecraft-1-20-pre-release-5', - '1.20': 'trails-tales-update-out-today-java', - '1.20.1': 'minecraft--java-edition-1-20-1', - '1.20.2-pre2': 'minecraft-1-20-2-pre-release-1', - '23w43b': 'minecraft-snapshot-23w43b', - '24w03b': 'minecraft-snapshot-24w03b', - '24w05b': 'minecraft-snapshot-24w05b', -})) - -export function getArticleLink(version: string): string | undefined { - const override = ARTICLE_OVERRIDES.get(version) - if (override) { - return ARTICLE_PREFIX + override - } - let match - if ((match = version.match(/^(\d\dw\d\d)[a-z]$/)) && match[1]) { - return ARTICLE_PREFIX + 'minecraft-snapshot-' + match[1] + 'a' - } - if ((match = version.match(/^(\d+\.\d+(?:\.\d+)?)-snapshot-(\d+)$/)) && match[1] && match[2]) { - return ARTICLE_PREFIX + 'minecraft-' + match[1].replaceAll('.', '-') + '-snapshot-' + match[2] - } - if ((match = version.match(/^(\d+\.\d+(?:\.\d+)?)-pre(\d+)$/)) && match[1] && match[2]) { - return ARTICLE_PREFIX + 'minecraft-' + match[1].replaceAll('.', '-') + '-pre-release-' + match[2] - } - if ((match = version.match(/^(\d+\.\d+(?:\.\d+)?)-rc(\d+)$/)) && match[1]) { - return ARTICLE_PREFIX + 'minecraft-' + match[1].replaceAll('.', '-') + '-release-candidate-' + match[2] - } - if (version.match(/^\d+\.\d+(\.\d+)?$/)) { - return ARTICLE_PREFIX + 'minecraft-java-edition-' + version.replaceAll('.', '-') - } - return undefined -} diff --git a/src/app/services/DataFetcher.ts b/src/app/services/DataFetcher.ts index abfc48e9..15b450af 100644 --- a/src/app/services/DataFetcher.ts +++ b/src/app/services/DataFetcher.ts @@ -14,7 +14,6 @@ const mcmetaUrl = 'https://raw.githubusercontent.com/misode/mcmeta' const mcmetaTarballUrl = 'https://github.com/misode/mcmeta/tarball' const vanillaMcdocUrl = 'https://raw.githubusercontent.com/SpyglassMC/vanilla-mcdoc' const changesUrl = 'https://raw.githubusercontent.com/misode/technical-changes' -const fixesUrl = 'https://raw.githubusercontent.com/misode/mcfixes' const versionDiffUrl = 'https://mcmeta-diff.misode.workers.dev' const whatsNewUrl = 'https://whats-new.misode.workers.dev' @@ -309,31 +308,6 @@ export async function fetchChangelogs(): Promise { } } -export interface Bugfix { - id: string, - summary: string, - labels: string[], - status: string, - confirmation_status: string, - categories: string[], - priority: string, - fix_versions: string[], - creation_date: string, - resolution_date: string, - updated_date: string, - watches: number, - votes: number, -} - -export async function fetchBugfixes(version: string): Promise { - try { - const fixes = await cachedFetch(`${fixesUrl}/main/versions/${version}.json`, { refresh: true }) - return fixes - } catch (e) { - throw new Error(`Error occured while fetching bugfixes for version ${version}: ${message(e)}`) - } -} - export interface GitHubCommitFile { sha: string, filename: string, diff --git a/src/app/services/index.ts b/src/app/services/index.ts index a51c7e67..97b0686c 100644 --- a/src/app/services/index.ts +++ b/src/app/services/index.ts @@ -1,4 +1,3 @@ -export * from './Article.js' export * from './DataFetcher.js' export * from './Sharing.js' export * from './Source.js' diff --git a/src/locales/en.json b/src/locales/en.json index f7d7f336..2cf22bb7 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -362,7 +362,6 @@ "versions.data_version": "Data version", "versions.diff": "Mcmeta diff", "versions.fixes": "Fixed bugs", - "versions.fixes.no_results": "No fixes", "versions.latest_release": "Latest release", "versions.latest_snapshot": "Latest snapshot", "versions.minecraft_versions": "Minecraft Versions",