1+ import { AnchorButton , Card } from '@blueprintjs/core' ;
2+ import { useTranslation } from 'react-i18next' ;
3+ import { useEffect , useState } from 'react' ;
4+ import axios from 'axios' ;
5+ import ReactMarkdown from 'react-markdown' ;
6+ import remarkGfm from 'remark-gfm' ;
7+ import { AvatarPortrait } from "@gcsim/components" ;
8+ import LatestCharactersData from '@gcsim/data/src/latest_chars.json'
9+
10+ const majorVersionRegex = / v \d + \. \d + / gm;
11+
12+ export function LatestVersion ( ) {
13+ const { t} = useTranslation ( ) ;
14+
15+ const [ { isLoaded, text, tag, portraits} , setState ] = useState ( {
16+ isLoaded : false ,
17+ text : '' ,
18+ tag : '' ,
19+ portraits : [ ]
20+ } ) ;
21+
22+ useEffect ( ( ) => {
23+ axios ( 'https://api.github.com/repos/genshinsim/gcsim/releases/latest' )
24+ . then ( ( resp : { data } ) => {
25+ const majorVersion = majorVersionRegex . exec ( resp . data . name ) ;
26+ let portraits = [ ] ;
27+ if ( majorVersion && majorVersion [ 0 ] ) {
28+ portraits = LatestCharactersData [ majorVersion [ 0 ] ] || [ ] ;
29+ }
30+ setState ( { isLoaded : true , text : resp . data . body , tag : resp . data . name , portraits} ) ;
31+ } )
32+ . catch ( ( err ) =>
33+ console . log ( t ( 'viewer.error_encountered' ) + err . message ) ,
34+ ) ;
35+ } , [ t ] ) ;
36+
37+ return (
38+ < Card className = "flex flex-col items-center gap-4 overflow-x-auto" >
39+ { isLoaded ? (
40+ < >
41+ < div className = "flex flex-col gap-4" >
42+ < h1 className = "text-center text-xl md:text-2xl lg:text-4xl" >
43+ < b > { t ( 'dash.latest_release' ) } </ b >
44+ < a
45+ href = { `https://github.com/genshinsim/gcsim/releases/tag/${ tag } ` } >
46+ { tag }
47+ </ a >
48+ </ h1 >
49+ </ div >
50+ < div className = "flex flex-col" >
51+ < h2 className = "text-center text-2xl" > { t ( 'dash.new_characters' ) } </ h2 >
52+ < div className = "flex gap-4" >
53+ { portraits . map ( ( char ) => (
54+ < div key = { char } className = "flex flex-col items-center" >
55+ < AvatarPortrait char = { { name : char } } hideDetails />
56+ { t ( `game:character_names.${ char } ` ) }
57+ </ div >
58+ ) ) }
59+ </ div >
60+ </ div >
61+ < div className = "self-start" >
62+ < ReactMarkdown remarkPlugins = { [ remarkGfm ] } >
63+ { text }
64+ </ ReactMarkdown >
65+ </ div >
66+ < AnchorButton
67+ href = "https://github.com/genshinsim/gcsim/releases"
68+ intent = "primary"
69+ target = "_blank"
70+ className = "!p-3 !rounded-md" >
71+ < span className = "text-xl md:text-2xl font-semibold" >
72+ { t ( 'dash.view_releases' ) }
73+ </ span >
74+ </ AnchorButton >
75+ </ >
76+ ) : (
77+ < > { t ( 'sim.loading' ) } </ >
78+ ) }
79+ </ Card >
80+ ) ;
81+ }
0 commit comments