11import { useCallback , useEffect , useMemo , useRef , useState } from "react" ;
2- import { useLocation , useNavigate } from "react-router" ;
2+ import { useLocation , useNavigate , useSearchParams } from "react-router" ;
33
44import { useJsonRpc } from "@hooks/useJsonRpc" ;
55import { UpdateState , useUpdateStore } from "@hooks/stores" ;
@@ -14,16 +14,33 @@ import { m } from "@localizations/messages.js";
1414export default function SettingsGeneralUpdateRoute ( ) {
1515 const navigate = useNavigate ( ) ;
1616 const location = useLocation ( ) ;
17+ //@ts -ignore
18+ const [ searchParams , setSearchParams ] = useSearchParams ( ) ;
1719 const { updateSuccess } = location . state || { } ;
1820
1921 const { setModalView, otaState } = useUpdateStore ( ) ;
2022 const { send } = useJsonRpc ( ) ;
2123
24+ const downgrade = useMemo ( ( ) => searchParams . get ( "downgrade" ) === "true" , [ searchParams ] ) ;
25+ const updateComponents = useMemo ( ( ) => searchParams . get ( "components" ) || "" , [ searchParams ] ) ;
26+
2227 const onConfirmUpdate = useCallback ( ( ) => {
2328 send ( "tryUpdate" , { } ) ;
2429 setModalView ( "updating" ) ;
2530 } , [ send , setModalView ] ) ;
2631
32+ const onConfirmDowngrade = useCallback ( ( system ?: string , app ?: string ) => {
33+ send ( "tryUpdateComponents" , {
34+ components : {
35+ system, app,
36+ components : updateComponents
37+ } ,
38+ includePreRelease : true ,
39+ checkOnly : false ,
40+ } ) ;
41+ setModalView ( "updating" ) ;
42+ } , [ send , setModalView , updateComponents ] ) ;
43+
2744 useEffect ( ( ) => {
2845 if ( otaState . updating ) {
2946 setModalView ( "updating" ) ;
@@ -36,15 +53,24 @@ export default function SettingsGeneralUpdateRoute() {
3653 }
3754 } , [ otaState . updating , otaState . error , setModalView , updateSuccess ] ) ;
3855
39- return < Dialog onClose = { ( ) => navigate ( ".." ) } onConfirmUpdate = { onConfirmUpdate } /> ;
56+ return < Dialog
57+ onClose = { ( ) => navigate ( ".." ) }
58+ onConfirmUpdate = { onConfirmUpdate }
59+ onConfirmDowngrade = { onConfirmDowngrade }
60+ downgrade = { downgrade }
61+ /> ;
4062}
4163
4264export function Dialog ( {
4365 onClose,
4466 onConfirmUpdate,
67+ onConfirmDowngrade,
68+ downgrade,
4569} : Readonly < {
70+ downgrade : boolean ;
4671 onClose : ( ) => void ;
4772 onConfirmUpdate : ( ) => void ;
73+ onConfirmDowngrade : ( ) => void ;
4874} > ) {
4975 const { navigateTo } = useDeviceUiNavigation ( ) ;
5076
@@ -61,15 +87,15 @@ export function Dialog({
6187
6288 setVersionInfo ( versionInfo ) ;
6389
64- if ( hasUpdate ) {
65- setModalView ( "updateAvailable" ) ;
66- } else if ( hasDowngrade ) {
90+ if ( hasDowngrade && downgrade ) {
6791 setModalView ( "updateDowngradeAvailable" ) ;
92+ } else if ( hasUpdate ) {
93+ setModalView ( "updateAvailable" ) ;
6894 } else {
6995 setModalView ( "upToDate" ) ;
7096 }
7197 } ,
72- [ setModalView ] ,
98+ [ setModalView , downgrade ] ,
7399 ) ;
74100
75101 const onCancelDowngrade = useCallback ( ( ) => {
@@ -101,7 +127,7 @@ export function Dialog({
101127 ) }
102128 { modalView === "updateDowngradeAvailable" && (
103129 < UpdateDowngradeAvailableState
104- onConfirmUpdate = { onConfirmUpdate }
130+ onConfirmDowngrade = { onConfirmDowngrade }
105131 onCancelDowngrade = { onCancelDowngrade }
106132 versionInfo = { versionInfo ! }
107133 />
@@ -419,13 +445,19 @@ function UpdateAvailableState({
419445
420446function UpdateDowngradeAvailableState ( {
421447 versionInfo,
422- onConfirmUpdate ,
448+ onConfirmDowngrade ,
423449 onCancelDowngrade,
424450} : {
425451 versionInfo : SystemVersionInfo ;
426- onConfirmUpdate : ( ) => void ;
452+ onConfirmDowngrade : ( system ?: string , app ?: string ) => void ;
427453 onCancelDowngrade : ( ) => void ;
428454} ) {
455+ const confirmDowngrade = useCallback ( ( ) => {
456+ onConfirmDowngrade (
457+ versionInfo ?. remote ?. systemVersion || undefined ,
458+ versionInfo ?. remote ?. appVersion || undefined ,
459+ ) ;
460+ } , [ versionInfo , onConfirmDowngrade ] ) ;
429461 return (
430462 < div className = "flex flex-col items-start justify-start space-y-4 text-left" >
431463 < div className = "text-left" >
@@ -449,7 +481,7 @@ function UpdateDowngradeAvailableState({
449481 ) : null }
450482 </ p >
451483 < div className = "flex items-center justify-start gap-x-2" >
452- < Button size = "SM" theme = "primary" text = { m . general_update_downgrade_button ( ) } onClick = { onConfirmUpdate } />
484+ < Button size = "SM" theme = "primary" text = { m . general_update_downgrade_button ( ) } onClick = { confirmDowngrade } />
453485 < Button size = "SM" theme = "light" text = { m . general_update_keep_current_button ( ) } onClick = { onCancelDowngrade } />
454486 </ div >
455487 </ div >
0 commit comments