@@ -116,20 +116,20 @@ const ModMissing = ({ name, version, optional }: MissingModDepInfo) => {
116116 onClick = {
117117 url !== null
118118 ? async ( ) => {
119- setState ( _i18n . t ( '下载中' ) ) ;
120- download . downloadMod ( name , url , {
121- onProgress : ( task , progress ) => {
122- setState ( `${ progress } % (${ task . subtasks . length } )` ) ;
123- } ,
124- onFinished : ( ) => {
125- setState ( _i18n . t ( '下载完成' ) ) ;
126- ctx ?. reloadMods ( ) ;
127- } ,
128- onFailed : ( ) => {
129- setState ( _i18n . t ( '下载失败' ) ) ;
130- } ,
131- } ) ;
132- }
119+ setState ( _i18n . t ( '下载中' ) ) ;
120+ download . downloadMod ( name , url , {
121+ onProgress : ( task , progress ) => {
122+ setState ( `${ progress } % (${ task . subtasks . length } )` ) ;
123+ } ,
124+ onFinished : ( ) => {
125+ setState ( _i18n . t ( '下载完成' ) ) ;
126+ ctx ?. reloadMods ( ) ;
127+ } ,
128+ onFailed : ( ) => {
129+ setState ( _i18n . t ( '下载失败' ) ) ;
130+ } ,
131+ } ) ;
132+ }
133133 : undefined
134134 }
135135 >
@@ -201,9 +201,8 @@ const ModLocal = ({
201201 return (
202202 < div className = { `m-mod ${ enabled && 'enabled' } ` } >
203203 < span
204- className = { `expandBtn ${ expanded && 'expanded' } ${
205- hasDeps && 'clickable'
206- } `}
204+ className = { `expandBtn ${ expanded && 'expanded' } ${ hasDeps && 'clickable'
205+ } `}
207206 onClick = { ( ) => setExpanded ( ! expanded ) }
208207 >
209208 { hasDeps && ( ! optional || ctx ?. fullTree ) ? (
@@ -459,6 +458,35 @@ export const Manage = () => {
459458
460459 return modMap ;
461460 } , [ installedMods , currentProfile , profiles , checkOptionalDep ] ) ;
461+
462+ const [ latestModInfos , setLatestModInfos ] = useState < [
463+ string , string , string // name, version, url
464+ ] [ ] > ( [ ] ) ;
465+
466+ useEffect ( ( ) => {
467+ callRemote ( 'get_mod_latest_info' , v => {
468+ setLatestModInfos ( JSON . parse ( v ) )
469+ } )
470+ } , [ ] )
471+
472+ const hasUpdateMods = useMemo ( ( ) => {
473+ const mods = [ ] ;
474+ for ( const mod of installedMods ) {
475+ const latest = latestModInfos . find ( v => v [ 0 ] === mod . name ) ;
476+ if ( latest && compareVersion ( latest [ 1 ] , mod . version ) > 0 ) {
477+ mods . push ( {
478+ name : mod . name ,
479+ version : latest [ 1 ] ,
480+ url : latest [ 2 ]
481+ } ) ;
482+ }
483+ }
484+
485+ return mods ;
486+ } , [ latestModInfos , installedModMap ] ) ;
487+
488+ const [ hasUpdateBtnState , setHasUpdateBtnState ] = useState ( '更新全部' ) ;
489+
462490 const modsTreeRef = useRef ( null ) ;
463491 const [ filter , setFilter ] = useState ( '' ) ;
464492
@@ -625,6 +653,8 @@ export const Manage = () => {
625653 [ currentProfile , installedMods , gamePath , modPath , fullTree , showUpdate ]
626654 ) ;
627655
656+ const { download } = useGlobalContext ( )
657+
628658 return (
629659 < div className = "manage" >
630660 < modListContext . Provider value = { manageCtx } >
@@ -729,6 +759,38 @@ export const Manage = () => {
729759 { _i18n . t ( '显示更新' ) }
730760 </ label >
731761 </ div >
762+ < div className = "opers" style = { {
763+ marginTop : "5px"
764+ } } >
765+ { showUpdate && hasUpdateMods . length !== 0 && (
766+ < button onClick = { ( ) => {
767+ if ( hasUpdateBtnState !== '更新全部' ) return ;
768+ setHasUpdateBtnState ( '更新中' ) ;
769+ const updateUnfinishedSet = new Set ( hasUpdateMods . map ( v => v . name ) ) ;
770+ for ( const mod of hasUpdateMods ) {
771+ download . downloadMod ( mod . name , mod . url , {
772+ onProgress : ( task , progress ) => {
773+ console . log ( task , progress ) ;
774+ } ,
775+ onFinished : ( ) => {
776+ updateUnfinishedSet . delete ( mod . name ) ;
777+ if ( updateUnfinishedSet . size === 0 ) {
778+ setHasUpdateBtnState ( '更新完成' ) ;
779+ manageCtx . reloadMods ( ) ;
780+ }
781+ } ,
782+ onFailed : ( ) => {
783+ console . log ( 'failed' ) ;
784+ setHasUpdateBtnState ( '更新失败,请查看左下角' ) ;
785+ } ,
786+ force : true ,
787+ } ) ;
788+ }
789+ } } >
790+ { hasUpdateBtnState }
791+ </ button >
792+ ) }
793+ </ div >
732794 < div className = "list" ref = { modsTreeRef } >
733795 { installedModsTree . map ( ( v ) => (
734796 < Mod { ...( v as any ) } />
0 commit comments