@@ -8,13 +8,16 @@ import chalk from 'chalk';
88import { showCalendar } from '../features/calendar.js' ;
99import { openRepairService } from '../features/repair.js' ;
1010import { showDocsMenu } from '../features/docs.js' ;
11+ import { showServiceStatus } from '../features/status.js' ;
12+ import { showThemeMenu } from '../features/theme.js' ;
1113import { openHomepage , openGithub , openRoadmap } from '../features/website.js' ;
12- import { printDivider , printNewLine , success } from './ui.js' ;
14+ import { printDivider , printNewLine , success , warning } from './ui.js' ;
15+ import { pickIcon } from './icons.js' ;
1316import { padEndV } from './text.js' ;
1417import { APP_INFO , URLS } from '../config/data.js' ;
1518import { t , getCurrentLanguage , setLanguage , clearTranslationCache , type Language } from '../i18n/index.js' ;
1619
17- export type MenuAction = 'events' | 'repair' | 'docs' | 'links' | 'website' | 'github' | 'roadmap' | 'about' | 'language' ;
20+ export type MenuAction = 'events' | 'repair' | 'docs' | 'status' | ' links' | 'website' | 'github' | 'roadmap' | 'about' | 'language' | 'theme ';
1821
1922/**
2023 * Get main menu options — 6 items
@@ -25,8 +28,10 @@ function getMainMenuOptions() {
2528 { value : 'events' , label : trans . menu . events , hint : trans . menu . eventsDesc } ,
2629 { value : 'repair' , label : trans . menu . repair , hint : trans . menu . repairDesc } ,
2730 { value : 'docs' , label : trans . menu . docs , hint : trans . menu . docsDesc } ,
31+ { value : 'status' , label : trans . menu . status , hint : trans . menu . statusDesc } ,
2832 { value : 'links' , label : trans . menu . links , hint : trans . menu . linksDesc } ,
2933 { value : 'about' , label : trans . menu . about , hint : trans . menu . aboutDesc } ,
34+ { value : 'theme' , label : trans . menu . theme , hint : trans . menu . themeDesc } ,
3035 { value : 'language' , label : trans . menu . language , hint : trans . menu . languageDesc } ,
3136 ] ;
3237}
@@ -64,11 +69,13 @@ export async function runMenuAction(action: MenuAction): Promise<void> {
6469 case 'events' : await showCalendar ( ) ; break ;
6570 case 'repair' : await openRepairService ( ) ; break ;
6671 case 'docs' : await showDocsMenu ( ) ; break ;
72+ case 'status' : await showServiceStatus ( ) ; break ;
6773 case 'links' : await showLinksMenu ( ) ; break ;
6874 case 'website' : await openHomepage ( ) ; break ;
6975 case 'github' : await openGithub ( ) ; break ;
7076 case 'roadmap' : await openRoadmap ( ) ; break ;
7177 case 'about' : showAbout ( ) ; break ;
78+ case 'theme' : await showThemeMenu ( ) ; break ;
7279 case 'language' : await showLanguageMenu ( ) ; break ;
7380 }
7481}
@@ -115,7 +122,7 @@ function showAbout(): void {
115122 link ( trans . about . website , URLS . homepage ) ,
116123 link ( trans . about . email , URLS . email ) ,
117124 '' ,
118- row ( trans . about . license , ' MIT · Author: m1ngsama' ) ,
125+ row ( trans . about . license , ` MIT ${ pickIcon ( '·' , '|' ) } Author: m1ngsama` ) ,
119126 ] . join ( '\n' ) ;
120127
121128 note ( content , trans . about . title ) ;
@@ -131,17 +138,21 @@ async function showLanguageMenu(): Promise<void> {
131138 const language = await select < Language > ( {
132139 message : trans . language . selectLanguage ,
133140 options : [
134- { value : 'zh' as Language , label : trans . language . zh , hint : currentLang === 'zh' ? '✓ 当前' : undefined } ,
135- { value : 'en' as Language , label : trans . language . en , hint : currentLang === 'en' ? '✓ current' : undefined } ,
141+ { value : 'zh' as Language , label : trans . language . zh , hint : currentLang === 'zh' ? ` ${ pickIcon ( '✓' , '*' ) } current` : undefined } ,
142+ { value : 'en' as Language , label : trans . language . en , hint : currentLang === 'en' ? ` ${ pickIcon ( '✓' , '*' ) } current` : undefined } ,
136143 ] ,
137144 initialValue : currentLang ,
138145 } ) ;
139146
140147 if ( isCancel ( language ) ) return ;
141148
142149 if ( language !== currentLang ) {
143- setLanguage ( language ) ;
150+ const persisted = setLanguage ( language ) ;
144151 clearTranslationCache ( ) ;
145- success ( t ( ) . language . changed ) ;
152+ if ( persisted ) {
153+ success ( t ( ) . language . changed ) ;
154+ } else {
155+ warning ( t ( ) . language . changedSessionOnly ) ;
156+ }
146157 }
147158}
0 commit comments