88 useCurrentBlacklistProfile ,
99 useGamePath ,
1010 useInstalledMods ,
11+ useModComments ,
1112 useStorage ,
1213} from '../states' ;
1314import { useContext , useEffect , useMemo , useRef , useState } from 'preact/hooks' ;
@@ -69,6 +70,8 @@ const modListContext = createContext<{
6970 version : string ;
7071 gb_file : string ;
7172 } [ ] ;
73+ modComments : { [ name : string ] : string } ;
74+ setModComment : ( name : string , comment : string ) => void ;
7275} | null > ( { } as any ) ;
7376
7477const ModBadge = ( {
@@ -128,20 +131,20 @@ const ModMissing = ({ name, version, optional }: MissingModDepInfo) => {
128131 onClick = {
129132 gbFileID !== null
130133 ? async ( ) => {
131- setState ( _i18n . t ( '下载中' ) ) ;
132- download . downloadMod ( name , gbFileID , {
133- onProgress : ( task , progress ) => {
134- setState ( `${ progress } % (${ task . subtasks . length } )` ) ;
135- } ,
136- onFinished : ( ) => {
137- setState ( _i18n . t ( '下载完成' ) ) ;
138- ctx ?. reloadMods ( ) ;
139- } ,
140- onFailed : ( ) => {
141- setState ( _i18n . t ( '下载失败' ) ) ;
142- } ,
143- } ) ;
144- }
134+ setState ( _i18n . t ( '下载中' ) ) ;
135+ download . downloadMod ( name , gbFileID , {
136+ onProgress : ( task , progress ) => {
137+ setState ( `${ progress } % (${ task . subtasks . length } )` ) ;
138+ } ,
139+ onFinished : ( ) => {
140+ setState ( _i18n . t ( '下载完成' ) ) ;
141+ ctx ?. reloadMods ( ) ;
142+ } ,
143+ onFailed : ( ) => {
144+ setState ( _i18n . t ( '下载失败' ) ) ;
145+ } ,
146+ } ) ;
147+ }
145148 : undefined
146149 }
147150 >
@@ -214,12 +217,19 @@ const ModLocal = ({
214217
215218 const isAlwaysOn = ctx ?. alwaysOnMods . includes ( name ) ;
216219
220+ const [ editingComment , setEditingComment ] = useState ( false ) ;
221+ const refCommentInput = useRef < HTMLInputElement > ( null ) ;
222+ useEffect ( ( ) => {
223+ if ( editingComment ) {
224+ refCommentInput . current ?. focus ( ) ;
225+ }
226+ } , [ editingComment ] ) ;
227+
217228 return (
218229 < div className = { `m-mod ${ enabled && 'enabled' } ` } key = { id } >
219230 < span
220- className = { `expandBtn ${ expanded && 'expanded' } ${
221- hasDeps && 'clickable'
222- } `}
231+ className = { `expandBtn ${ expanded && 'expanded' } ${ hasDeps && 'clickable'
232+ } `}
223233 onClick = { ( ) => setExpanded ( ! expanded ) }
224234 >
225235 { hasDeps && ( ! optional || ctx ?. fullTree ) ? (
@@ -245,8 +255,8 @@ const ModLocal = ({
245255 { isAlwaysOn
246256 ? _i18n . t ( '始终开启' )
247257 : enabled
248- ? _i18n . t ( '已启用' )
249- : _i18n . t ( '已禁用' ) }
258+ ? _i18n . t ( '已启用' )
259+ : _i18n . t ( '已禁用' ) }
250260 </ ModBadge >
251261
252262 { enabled &&
@@ -324,7 +334,28 @@ const ModLocal = ({
324334 </ ModBadge >
325335 ) }
326336
327- < span > { name } </ span >
337+ < span
338+ className = "modName"
339+ onClick = { ( ) => setEditingComment ( true ) }
340+ > { name } </ span >
341+ { ! editingComment && ctx ?. modComments [ name ] && (
342+ < span className = "modComment" onClick = { ( ) => {
343+ setEditingComment ( true ) ;
344+ } } > { ctx ?. modComments [ name ] } </ span >
345+ ) }
346+ {
347+ editingComment && (
348+ < input type = "text" value = { ctx ?. modComments [ name ] ?? '' } ref = { refCommentInput } className = "modCommentInput"
349+ onInput = { ( e ) => ctx ?. setModComment ( name , ( e . target as any ) . value ) }
350+ onKeyUp = { ( e ) => {
351+ if ( e . keyCode === 257 || e . keyCode === 256 ) { // enter or esc
352+ setEditingComment ( false ) ;
353+ }
354+ } }
355+ onBlur = { ( ) => setEditingComment ( false ) } />
356+ )
357+ }
358+
328359 < span className = "modVersion" > { version } </ span >
329360 { ( ! optional || ctx ?. fullTree ) && expanded && (
330361 < div className = { `childTree ${ expanded && 'expanded' } ` } >
@@ -660,6 +691,7 @@ export const Manage = () => {
660691 modsTreeRef . current ?. scrollTo ( 0 , 0 ) ;
661692 } , [ excludeDependents ] ) ;
662693 const globalCtx = useGlobalContext ( ) ;
694+ const [ modComments , setModComments ] = useModComments ( )
663695 const manageCtx = useMemo (
664696 ( ) => ( {
665697 hasUpdateMods,
@@ -668,6 +700,12 @@ export const Manage = () => {
668700 else setAlwaysOnMods ( alwaysOnMods . filter ( ( v ) => v !== name ) ) ;
669701 } ,
670702 alwaysOnMods,
703+ modComments, setModComment ( name : string , comment : string ) {
704+ setModComments ( {
705+ ...modComments ,
706+ [ name ] : comment
707+ } ) ;
708+ } ,
671709 batchSwitchMod : ( names : string [ ] , enabled : boolean ) => {
672710 if ( ! enabled ) names = names . filter ( ( v ) => ! alwaysOnMods . includes ( v ) ) ;
673711 if ( ! currentProfile ) return ;
@@ -804,6 +842,7 @@ export const Manage = () => {
804842 fullTree ,
805843 showUpdate ,
806844 alwaysOnMods ,
845+ modComments
807846 ]
808847 ) ;
809848
0 commit comments