From 3a9dafe99d877fa937257430c941ca77881adf9b Mon Sep 17 00:00:00 2001 From: Kiet <31864905+Kitenite@users.noreply.github.com> Date: Tue, 17 Sep 2024 17:01:06 -0400 Subject: [PATCH] Manual update app from UI (#375) --- app/bun.lockb | Bin 325588 -> 360293 bytes app/common/constants.ts | 3 + app/dev-app-update.yml | 2 +- app/electron-builder.json5 | 3 +- app/electron/main/events/index.ts | 8 ++ app/electron/main/index.ts | 10 +-- app/electron/main/update.ts | 8 -- app/electron/main/update/index.ts | 70 ++++++++++++++++++ app/package.json | 9 ++- .../AppBar/UpdateButton/UpdateProvider.tsx | 5 ++ .../components/AppBar/UpdateButton/index.tsx | 26 +++++++ app/src/components/AppBar/index.tsx | 26 ++++--- app/src/lib/update/index.ts | 25 +++++++ 13 files changed, 164 insertions(+), 31 deletions(-) delete mode 100644 app/electron/main/update.ts create mode 100644 app/electron/main/update/index.ts create mode 100644 app/src/components/AppBar/UpdateButton/UpdateProvider.tsx create mode 100644 app/src/components/AppBar/UpdateButton/index.tsx create mode 100644 app/src/lib/update/index.ts diff --git a/app/bun.lockb b/app/bun.lockb index 0bc3c01b92c469e708916ffb8d0af1103c7f6f6b..1217aa74742548b03c195076bb0c6fa3f2cf2dc7 100755 GIT binary patch delta 82949 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⪙<1#q0*kFe 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�P|>Rzy#UoK9=#GO28sgRis_b2+fBD< zx>eI{nQp)I5`7!cCy3QSHLwf6H^A%QHLw%tW#A6@RX}m?_PvHC;uQqla_O!>$9gi* z5#Ir{2l^q-HlQ^~0=lhg3>pFbe5rPhPCrFNQPer$2bXE&Pv7Qkw?{1w2Df7T;tsl# z3$)ILVn9~gLQ@kL17RA(LlbD^TxjEb6HvhnnmrpYe6kg6KJ-|gR($p z6aCHcrd@01N+mWLa`?NZ0sdW6BhnPb2y4eh(h-)QcA;!NOw`?lbD|37sIC8Zp3nQ{ zv^HU6Ao7dsW^Gb!){4N?7^(BGy3|G_KX3p3Ha7Deu4+_dI>qf7X>A}O(lO;lq8jOl z_RHTJ&pUYeYX-FBRVK1mwAcPB*WRo@Im_u^Gylrdg*6fhRj4VAbfh%@!);Dfg`7yf z^sCL5+Q?gvmPXzsq0Xy)4f<-UBJY6Ieqy#+8ci=p{@xJ{NS)Ek zm3WYMy+#I;w{yDnQU`S#)&!U~a{gKaF^DaIF1*d*rq)T**v#rGBwIdt)4IoNna7`t z%$2(G`bE-;x;j~gk5as8(C8vl@$W_z37w`%A^+Er{56oPMKJGL)cR7i+5-7rbsGLR z;f{1nbE?iM?EkKFS05-BdG#po!up>^sfsj`$S5Lntq|*>5p$Mb*@5zH2Q*^UZM>`> z?R$4ahee zNS7_10gB;&CwxD+4?F-K1hZA)954?&4CaFQ;4!cOsK-h#0@8)SRQ3eC80da-8T=G@ z5-bH8y+*B(J_9tU71-y22C)jP2J*>~@ElNB<+vSe1nSt!Kw*9fya2WV`DrRtcmo{K z*V{blFOt^F)AB&?$g94Hui8?26WFTxSEFTd+5#7cH^VL*DWD2ffjSduM0r{R>QF?B z#V-u>Zm!n5UM#&vzBZfqpKzxPDt%AuWudNECwgswo7bfi`LZI6ruk ze2soD_!Jxjd%ywkHuw;{1NMV`;A8L>kiY!ov)iWi&hNXV-%*(L-tY%`GUWIk_~>t% z8h9VbS3W|dobn?6pOBVcq@!wFol(B@&ww&t&B89S>=`1`cX9ZYW}YnHm!x_Wx^_?kf~6la|*jU{HxVfUbZ4A zKOxePe3h@rNLPK*l$M^O#`txiWh7Mg=1yznZN)?Pa}e*ILmQ&D*G6%11h!x4b%{1((-Xk??8%YcI+{ zt61A3vVygGOHiQ}qbie+!dwzf+v)F>Me5M+v1@lIdKF14suke!KvVe}(9~%$UZdZ~ z(_$(I>utg^pfphBsxUI=Vh8-aQH?mS_CMJgwW27$NpQ{*o~DAwfsWc{WavnK1gODT zK))QXv-~`0NqRe)PRkagr@#ZyC&Rkj>ME)$Xmj#()zno~7bz|D#%Q`c*M@Z+;If?K ztA()!qXxVd)^%K$U3Er{)I_fX=8=9F)FoXHGy)C4^+100;p>3(h87x}>d~My2o3CC zuY}BhQ!*YSV*yaF7J>OdqgPaJB!4qFOGUqeEYht(B8Ub0kRt}x6)yp91>%9C6$h(K zcd&`NHes&^d;;TJ36^U9XMwihCh#OskM$e*E>NTMVRhmWph{KYc+zToE>OdIyRQvU z$Go?f(bUl-&=aU0by)d5KsV48H z8MZp!IZwI^>FyvC+y(}M-e4RU1$ya6DsLvy4=6)(*$333qQ0;S^apX+${zs4nty%L zkOB_@w*q~BH3-}SBK|{3j|8fB1V{zL!7!jUhHL+i!59tFfE?9;7EyX0do1Y;ps@3Q ze*UWtsBuNluIIKo^7RY%OtOBY) z5qZX@wMf^H*8D5)d074$-8$0G0r^K7e1Y^vumLE_FIwITAEwNgwD0|;B!%${u!Rhz z2Y~)SAv%Wk5>Tbzz+Z#6!ETTryaiqcZ-6(!F7PVQw%iWC0+jc;1Ku(d;vZOAAxtl2jD&M4%iF!0Ci4zV&Q$#AA$qmGw>zef%5c0I2Cx&i-R>4`hYxAHb{CS zerv#s;Bk--Eehy=>iprA;g!c_66(#L;1bX)2EKT=D5})0s$cb~4t;8x1!Sw%Z|vUtMAS%sJNM)hQO*24-5QIdy7-5 zIDuXkr1mAXa<8vHGj%Anw`ka+VRKFz_tnKw%_`2p;Tjwk-tqPg+h^^59f!sZo5tX= z%q_Bn8g}4N9)~&Mq46C*YS1L$AKauNU1u%2ZE*0Pb#Inm3F27>zvAcD-CpF|jx{{L zCJfM5$DM;ii}pB_#$j&0$7@$wf89XOp_wWgU~^Vof9L(Zeyv!WoTd$%C}*sDNOjM& zbrFYz8Y!}R)4!(FSo^`Wo2-|F!}6AMkgC*<{^d2<5Q z&HegG;y=#ko)UzfY@;^%+Oy^PgD9}>xZ z-w)?^9GSbbz1ObRh3_yqg~-`>aMzBOKen##HOSoX0>JI^R8*J1`6&1Cr=rSLEW%ra zrEsip&BYFT%9pF`RlySS`Kr3_KShg8-MKrWN>^#xu$lK6W(j;(_HQ%lvjQ`&x4zu9 z_jW5UW0?AMttbw+y!z&%n@SQtG1%&Qr)7LW`9%-2Ra~!z3#`$2-H`$+kGa_7=Nx#g`+scnuxb?t34f6 zzeayPyiov#umVHyv~uwm((dg&qPRbjv)CQ?G+kQho`T$`o{p+u(-rk0qskm#b$_u> zKg~Zr;MZqY3bb+d$Ge4=)632Ucp-pV_T|SvAN-h`Mkm;MivPE65)S^8?z-bqW!!Pg zqbdi^6>uL~9#zi&o;&*hSvB09@>u77E_&51(I{V;d_?knx7Z3M_@LVks#ulnr=Ii~ z^3&xD52yTQHjJ2JD{RE+Wy(ScTrIh6{PGcVsG?nL+nw}hy_bj zSel?qkz$9S(S*bvg~uo&CcgF>(X}A<-mu5sTU6A<#IE0O?%c~N${X|jzjOW`&$;Z( zZ=QMj%$>4}JBm_t!bxJFHKx7J&kq+pz!3LfXvW$|T}5WhSl6ZXRuLD>|oQ_1m z6Dl6o4D3Cjmdl~RmZa~FPhDsXd-SGl%VDi)G_;jyPZd@OUaBl=y+RnQJqGES26MjM z(ss!k%SCEc8e<>2ok_b^ppBNEtq{6?+QL%A_ok4QCVhO;6WmxX?m#OUZXoSj39?bN zZ6l<%UL|;GM=bPSZdYt`V)yfLWOB-Cnm9spT? z?NP%F|NP~c=$(CM{YR~GK?%m|^xjl`4VXyAN9H;a{dVolsg$cxt3pu1((iZ*Vu1Ph z$V~2T@#KD^4%VVtH3=n5Q@6?em|$)0#xhMUnh!8c?6g*pJl@%nJ9K|l_Jt15<|8eD zB`Mpkqlb)c0RW7T74hzQhNAEs09ZNzEr|%rHOI{w3XppYH>;X?e*#Ld*>Gq&>?ilI$TFj008q$BdT`v^*y1Qi1II~ z)vxf9GnDizoOvnj_!ZT8bb&n%Q1z{Xt>9&Lohq#Z_4)OstyN`>Xi~9|rna};*!J&`k z=zCYt2Xhw$$|I_phm`gL0OnDFmAgz`@-7~>!iXs8R3v>KJjxQ2M$9Ka(VtQyC2ebS zX&mZA2S8Odo!;a@!v8ep`rE!Hy-kf??N1i>?zWEH*Fz{TvZLx?= z@0g#WnKBeuQpHVR!iQRK66}@S3|D!#1w7rRX(-iJfj}%sr!M%l_nXvXy+H-yumQz^ zcA>TRV#F1T>#$*US_YJ_~bd5bm(4h!OzhW~oyC4m7{UKw%E!WIvJ}CIQATWH*BrRDt zlm5N|6!L2N!D=sUEGj)YZ9=_84O3#XO_O@PvWfWBRHLP!D0I-m4+~@fR9gOaMarBy zmL`DAhy@*jwzN9rch*JSJ&StQ*A8J3BQqkaQ-*)|_> z8J;WH`vQw)O4}-!Yh7A$e{1Qn-!Z6fi(K^U&UEN$=1cRpLU-M0(^lBHKRsj*scGYK zO1j{g#7^)Uf@ACV<&o2fL`T< z)s&4iQjxu?Gxghs8a=sU7NSiE;7RYx^{R1WTly>k1-wl$_;<8pn=nqE4{I2sZE4_k z$aR|ZJCFpW(2{1$_Nok8&T6Dj@^B)d?7i8!J}X$KZ>xCS^@fwaWmX)Ab5#q9N4RR(HK0muRw@}LCoBuKJ%wFuP=2W zO`bpI2k(E94A%5!2b2&`?mLBJsuWV~0=)^;@&O*T$a@!}E3*R+k(PrCBgTF=qz>bc zMX`t3Cx$C8&N&}E*}yZNj39!Xcz>7B)w|@Z+!|V7YcBg#>?N**D@V8QpLf}hGj z7574f5!8Awn#vCY%|NoHse1)2jZusCx{M%hrP(`w%89nizob@qxcIO)J+q&JXpLI5 z^H~i9%VWl8vxeEYABvX{F7C)cyHLa4Fn#l59F{m(MypjwQ{FBJ{BuF{7HxG!a@)z` z=25rqj%o0Thb!;yRh(_6+UZevx-IHEi+lAiNz4~2zTE<%C-;xak9>x7B{VGqV zU|LfN6ug4zaTPqf2WMH}F*ukWF!nNnvuyF06HGNVc&-U1|EhTI4JJz`JTC{+RZF}Y zB(O&&5n9{4GxOyMT*NB7awCIC1d?=`-|5&M%8kqoft08u%trV6Hm--3$47##7 z)W3|_MBSnft*I<}SSa*${YY0?w4;lks#Fwlw;zR;6$j~*MxSEpL$b0gYPqHVe{0G0 z@}@s`Ap41Z+g8^MVsm!3Pz3*|`V}262Tdy6$YxQxkR_12vh!*16&9tS==^8@c`@pI zzm<|FGCF1fa?R_FGnSsIJ9Mt8rtepjZSh$~;sSY4_wr(uVkM%vp}g4cBjvtt(a$iH z?LbPXAbPw%G^xV|Qb7eoUeZ9m?r^TmlskRCo5GSi%V3xXlwR{mUQ0T8Nj3g5h;~-| zELFVkI>o9`$je6B5kk|gO~K)FK7`L5w~MO1S5u;XGnwGyB`P-0VP=yfi5}MzJA8%~ z6%G`^{+G?OLMh$qW3N*Ll9PebiQ5bQqt(XsvoapYZE187A*j_%B6)iq#cG z{t!lMba0MEVYI3io}~;8GJDF9P@0-|gi#?IS@=+4r@jDe!6&dPRX){6 z6Ur?kIus`oB_v8j7#pY@D8XE8@-Mu8WP5#RmQ@Z=V4UH1Y)RvwS|L;~;*x^q28TL{n|6kheL$UFNFF|!NJ^dgx{fi++=P-o7qnn?* zoINSR2767)IQXiZ#`fhSC=e z#dP(Bp>(hz66)Qd^tK_UVS<6rU)H~S@P~!N!MdUfZ(Df%!#PaUU=cMvXiia4K<@Fk zrW$_(1vbJ9$p9I#uC6%H?e4^?Cd3#6r32wJ2MDZ-rcavoCfiuM^6w@@K5A;C=J}wX z(!8<{zBAQaG0;)g_6-m`v zWXfS}nTox9r>Mfr)txPVbwv$(Y3$)&*jQJ+@?uj>crra;oQ(j2y&&gk z-8P@R7vA55n4C;Cn}GU!nMOt1cK32t4c})%te5-UX;##+-aU1Ispdd3#j&;*WWOswcQSu z#l*nN#fJ?zqf%))YcVC2ma!J|Qt2{2Yqy{Ulm6-X+BOT8-e@Jg%1Dbm(q3X$toety zik|Xfu=-dkt#SpK3#nA#i8s}&u3|TN$xB_7N}b*C#w6{-d8tzASA0^JOQWj;(84w? z%U$%)wn*cvKXEUbKJPlDhgRkgOC*n|ato|`d;tL4Oti6DyJhsWxY^R&Mp|?4lSWpc z#CKBcb$S3T0PKD4TH`8?T}DfsOPdxq(x?!9=^g@64v6iRcb0Zs7x6?Q<-vUY?=-66 z0R%gqV+F*>O@H}nnsr(Z1bff*!7&wyhMn$jxfj1I=UGm>svN)`3wFy`j*$`Ah`n+i z>o|NP*2i}o=jyYjBlxCXt6mO)v^DMZ;P$Q zlS!`M>9nWgZ2P}J$&2rMqh%axAwRJuj-4udl>>D-rYv4obA-Pf!;urV!8W1QDQ)M% z{T*e^K<;}PS!aa6tPrsyP4p6*^Ob&2?BX%=sU0Vgl{e^{O{PZPa0a;;{xZ^AY*hB; zWIkZgjPaPrq-}$;#BJHhw=~W?bJU^CI4ok2Sxab z(ej?9#;cggkD5W^u?R_}9LtF@e&RUj`@SERhr_3HQy;y#HDUJDzu0~in;AlAzAvIQ zQ@9{QQ>?1V3elA=w#=l`T-OHST?67L<@a8`N?nPC0M-y$KV0l$u}W-DON;CFbZVYp zMe63F&cDk{p8I>w;tP2;cJrE4Qy=jMLAGmzrA0kz*isMGZq?*`TuXb&j#9LZnneSe z!xqzlU_P}Wa%tCsfs^wkgtR=mY!*##j(FS&1k1EG!AEX1sl9uUgh2Q-HG{ui1`X{k zASwdU>%!;;jdgxeYSn3!SfNDrv_EE1lNRXAER(0zbu-qgD^5Sk&eE{Z2BTFnDHI5; zBM^*KW7~w81A2}sk{O0>q%A=$t!g1!shecd_7<3gG|i;zEyP9^Jz`B=2NWdJsPUkx7OAc)rS{w3c{UWKm%kWXd%yVL;og%nB&0l|?RX@pR3~0@SB{ z7GLUJQ~rGH$cY=+_90^xIWZVD70_A5YR~&Wo_v*M1oonb{G@cRbSHPC{yB@XS@&|e ze563_OLVo3Xrn=7OFVd}o6OFf`Y}!+<3F2fw1O7r&*sC!Y2EgVJ@a-ilo*hgoXvJLNXUo}}Ql@MPklBVna<4L4X94+`2_CF&xxjjT?*=k?&tjn5OXgG2;h%Z& zX*!2vE-Y1VvhX2}LM&R214iiw5*Y`TW_L0Z>FK1mG;q=Tcxh zlO`!Y0KArBI4_)Pk^Q4fHVs0*y6|kC5g(@?>fWf{i#f8cpn|k)3TO?&vZ-~mfMkw- zaLIR-e$#Zsj)3G0FzLce5V=uf}J4BjzBwqp>Wi0_RayTO^YKGGlfV_y1JTcPTsD#exT#O`Jz@J%JoEkKUq%?t38F zRN|a1xl~Dyx@i(Y2`Aaex|u*ShxG{@-PmRRBNrgq4v#kuyYg7h1)wqjBb^)HAKS>` zu0%@8acfb-L>lwUm!0*i4o92V**=es!h?KH1Hr;3AzoKOA~R4a=N% z_3k)bo<4`4Ym{orKe5u5w$LBRYq2&{qASD+a1}=TOZKDChZ1_eq;b`{Fm|)ATO@ zgb#1;2sY>Ea_gBjeLDQ-j+4fix{^sP1Aw`(&D4=jZ_gdMYywnXK#$R_dd;mVDqBfpDcVFH%)#dBj6IY z$VAMo%4E+tT>G2bKb!j9os-oU637o(5cy+i@<8o8Y6IoWTkLCUMI&6b)kLonasF|O z(kSur;#9AAvyv~0Gnz6IDR?E*l~#TyGYbP&agIPUDM8AKi=w(={b`h>d`5m`8$-_w}Y$(vu>k z!uNaSpTx@p#rq;FdgP+f_Af16XY773KT^ES#5c%6zJ{dbwOz%7heYt=3A?^+3)kC1)co zIA&6JAY|3@Ie^J!%$fGST}iq9FnufR!Cm3BmKEukf4CRBWj1r0p6hnVQe;zy*Js5qm zMHY<5^82{FkR^1=Go!TwMO&ZJm&`)*_{_Xzw}esEC+=*)`Nsmgm%QAjETZwXEj#Kw zNOZu;fcrhcUN{W;;|7VgYAoH%86-wg=wCQ9H2#v%4T$5Ha5ynx13kEe7soLh$o#Sp zg$0%IrL3h4+(-{X;N$XYkIw}NSrtOwSv6`#pXbVZF#nDok5e#~BOqJYDKowxaB`K{o5Ud{F+$73$0AZ$>>)O^73X7Jj` zGvm}MAAYz^KImi)Bb(LTOsn<@9_q83so*y}Z*8VOeiPEM60&x`VC{tCa2Qnb`E)Pi zb!1+bALi7=@*0jgvH5iKd^&neu=D8(L=|+^qG$6KW&4NKU|Ss0VNJ6T)G#%y8kOEY z$+dp|0fnYD#+U=8L z6YP55fhrk!9DQ7uPc04!c9dNxc&Yc~(}_Zea5SIHkK=hMpPC&P0(~Cg<_4QjI;yV^ z3Mwk%N4cd9zS1>xFQ1AIg7B&1f|u?k`ey`Y+z!%Aa}7$9P3eX!YupHGVJrEcz$tlt zf~+P}Y)Q*m72BoiR+AWyX=H_>vLY&*~Eb+vlg`FN@I>H z=MFu!tG4r3gwSTM%;(Na#u_q43hAG8Fwv9JjtLIBr#rar+b8yNT-3KYPU|(2Q44m` z`71E<>YZeH6TJnsS6oq z9x7`T9D?R_hN!oTYj5hgh6kMExAc|~U{LObE?$MGV*#@Sp)DtFhb>9UV@hUQd+=`Q z4vM|{=q_q<4ZLw4*`y+5H-(}^zWJgsO)IVm4(vnjO*qC?eBcKV?RCTUa9)RJH=WaP zcZ$lS%`tn(?K)`xu!maQ0?%`SWX#Zotl8Hllw(KKo;JrD4g_4=xX9Y(MBXIG2Z$}&iV z9w6~13=FmS-4vn}^{BfYq}iu&s=k!ChB*A%6`i>G|4)wvP&m!HD_B$aJ%YLV*&*6~ z0@D6dxPOpBl%I;I@3d&&**RJHB9A0@ce8nbJ>Sq@lu$_xneh>VjF?}`sVQZQACK`KZg>QgZ+52ROsNN{rhvjv3!ZAQ((MfN zdbE%OUsSBM-X|O&v~gN~0FGSS6lwy)OwPO;;jm@j0QZZuV&&E?bEigI$V63 ztj@z8L(fpV^I(Ec*zj<^fLm$xf1|7maO4W-cnCD|ymcz%i}5 z9_*UGAm@HP;BZ)-h04lv6nGK+>_128c%lOpW-oO3B9c_)^ISDWl`pq@8`dhxM4hAf zu)*$>d0#?y=7s8g7bxyBJPU(p{$(LuefA>xUqKL_zeJ0Wb*bn+E=80)I)48dI!$oI7{rElJCz-t$Jjlq#y|%eTBrgfahHyzqb%$ z>lMmt88$``TPv{9s}Xi6`z?K4{qk)?Nrk1FF*r3Lo8jFEVxq$n4yq}#04G*mA-`hMI)P7&{6IiA*_bHBM>f54+# zInZGvuy0eJZAE6ZLoeD2_~9SApcmcQWi87v(ayJ|BvvZlM_jGdA9H^5Ueq{0Jw0b5 zs7W`Hyv-UsHlu-IqHXnVfHXjd^=el0bsXE9?U6_jceCMu%m75lz#q%Q#D?WEfwclw zy1-=PZx-S`Jz&QHznncjTIcg0-#nn6SwHdwT!m*HY)xpIGUb|ez^ zD*1+3HI%Yk-SN7ieWM-5O^S@ZX8iIMrRNJG9gPsH{o`e_7Sd%h_A@M1K=A(EIdgit z?qa(?EET%pq!PNaL5*2d!S09Chh3CvP=~MI_|uHOjD$M-;*Xd}(Onfub0Z;JN%Nrz z9Fbk`xdh~K*5ncXxQ`~nxW91KFiN!j^esk-H-2dir|{VgzUrmlU1N${08+~RGJe5M z_5L+8cF|PUBv;fw+o6ll`nefx8!Wo(s=ee+IOf6NBNb7TXtk zk6GAfc}@F2@tIA~$JzF_d}r--`5itp=ik#bq-U$)&CXI`jOb={dm2Yg@bf;b8fp1f zD*d`-Df<=@)>iqp5apM;bU_(^-_onMjK|6Xt8bLFsm}D%N2dLV&uox*=GZZ(&iFNr zJTLIqGuz)!l)ZG~?_=%onGF$-M>MN@G~rI)0dl?lg^6oI_q5e5iIoA%8lI@>G&|oV z{UujYi)W(o!Vu9-RZ;$C6X&p$7(;}ytU*jv8?)lXeP0Ne#89YF%%Y>)#hS)y8^yb7 zO3TNek1J_f;`iL%ie+fZSdA5>91-J<&eobn4J~3*67fG;pA>BjZmHR?CjXOSHTv?5 zxRz=JXr58sXQIE+rnSaXMfLBAUuT^aMG9=A`GFGDno-6xZ8YDhsnUGWk_vZ;xyGbJ z;&2tsZ?Ca58ro|XYv|fmu`Sg&Db}Qf7ouqN=%T^TPWz4(we;9uBT|I|vAWTzt7eeU zB_c8^CN9!BAu&E7GBG(OGAT02Ss#{^oTv{^#-EXiiSdc7EIw=qzS_lEpBx{XG&nNZ zIVLVSF(xi4CLA(2Cyj~?i#O2h?wUuGS58yE94iFL5l0!knD zIEoepY4r5eLeqr)%m#xK%4=HEmVNlEsJteSMwHXo(CDu;T5487)7@CBheoZUJr){Q zs##tWVXV_rld7^9Y={rj8M6i<8qps^rEjuYn&LOaT91+MU5A^EfC8X z^TRZnvXpmPtVdRH8gt`~A)5ATviw{0VydcOynbH%Nkxx4YRZsntR|QW%V=8A##qfg zYP&@Y$JK21l{K_{i?}W8gy>AC^2Ki{>V%k0HSUTPsC$8Eo3&T8unCBW93E-VC%Ptu zM@Po$ol}xy3`z8&K&;a!AX0WE*Oa)J;gN|+dP6|0-Vm9P>>6dzCnxBK!pGtw43UX6 zr$DS>2s5NahQ%aCI2)3Z!=n@9V`EZcofBfhhZ-WCha^SCC&oHQ=#%x)@kz;%5zd2S zm~EosW0JyR;`E85qGAk@N&2{$EyfiuQ!gRdKl zwu`6K#)REsoQk^Lf!5Ys5o>EIgvTdFN|HE3(I;<;zADPvCk7ZTZi@nb;PQ}YUnWeS z6zSvTO!`G)b!vG?^r4&k#b#OGAOx)Mh)tQBHzU8Zm|AqbBZg4GUh$qq*dC3?5ILnO$QoKR^vn$pNM+=PPgVqO3-M^7-v+_*sJJrMU9_v z%Nuc@;1r#loZuX;hpC;DVC}f%nDC@H7)EbkT2Dzd(324mV1-Jvn{GW8yBqJRSpcuO cD_T<{OU*o5@Iq{A+-s?6tTJwm(=4(29~s~Q)Bpeg diff --git a/app/common/constants.ts b/app/common/constants.ts index f95df9c7..5c4aee92 100644 --- a/app/common/constants.ts +++ b/app/common/constants.ts @@ -42,6 +42,9 @@ export enum WebviewChannels { export enum MainChannels { OPEN_EXTERNAL_WINDOW = 'open-external-window', + QUIT_AND_INSTALL = 'quit-and-update-app', + UPDATE_DOWNLOADED = 'update-downloaded', + UPDATE_NOT_AVAILABLE = 'update-not-available', // Code GET_CODE_BLOCK = 'get-code-block', diff --git a/app/dev-app-update.yml b/app/dev-app-update.yml index 7aecbecc..850dfb27 100644 --- a/app/dev-app-update.yml +++ b/app/dev-app-update.yml @@ -1,3 +1,3 @@ owner: onlook-dev -repo: studio +repo: onlook provider: github diff --git a/app/electron-builder.json5 b/app/electron-builder.json5 index 477eb94f..f65e7e79 100644 --- a/app/electron-builder.json5 +++ b/app/electron-builder.json5 @@ -13,6 +13,7 @@ category: 'public.app-category.developer-tools', hardenedRuntime: true, gatekeeperAssess: false, + target: ['zip', 'dmg'], }, win: { target: [ @@ -40,6 +41,6 @@ publish: { provider: 'github', owner: 'onlook-dev', - repo: 'studio', + repo: 'onlook', }, } diff --git a/app/electron/main/events/index.ts b/app/electron/main/events/index.ts index 62d4e86e..c3dd0d64 100644 --- a/app/electron/main/events/index.ts +++ b/app/electron/main/events/index.ts @@ -1,4 +1,5 @@ import { ipcMain, shell } from 'electron'; +import { updater } from '../update'; import { listenForAnalyticsMessages } from './analytics'; import { listenForAuthMessages } from './auth'; import { listenForCodeMessages } from './code'; @@ -22,4 +23,11 @@ function listenForGeneralMessages() { return shell.openExternal(args); }, ); + + ipcMain.handle( + MainChannels.QUIT_AND_INSTALL, + (e: Electron.IpcMainInvokeEvent, args: string) => { + return updater.quitAndInstall(); + }, + ); } diff --git a/app/electron/main/index.ts b/app/electron/main/index.ts index dedb68c8..1743fa26 100644 --- a/app/electron/main/index.ts +++ b/app/electron/main/index.ts @@ -6,9 +6,10 @@ import { fileURLToPath } from 'node:url'; import { sendAnalytics } from './analytics'; import { handleAuthCallback } from './auth'; import { listenForIpcMessages } from './events'; -import AutoUpdateManager from './update'; +import { updater } from './update'; import { APP_NAME, APP_SCHEMA } from '/common/constants'; +export let mainWindow: BrowserWindow | null = null; const require = createRequire(import.meta.url); const __dirname = path.dirname(fileURLToPath(import.meta.url)); @@ -18,6 +19,7 @@ const RENDERER_DIST = path.join(__dirname, '../../dist'); const PRELOAD_PATH = path.join(__dirname, '../preload/index.js'); const INDEX_HTML = path.join(RENDERER_DIST, 'index.html'); const VITE_DEV_SERVER_URL = process.env.VITE_DEV_SERVER_URL; +const IS_DEV = process.env.NODE_ENV === 'development'; // Environment setup const setupEnvironment = () => { @@ -51,9 +53,6 @@ const setupProtocol = () => { } }; -// Window management -export let mainWindow: BrowserWindow | null = null; - const createWindow = () => { mainWindow = new BrowserWindow({ title: APP_NAME, @@ -75,7 +74,6 @@ const initMainWindow = () => { const win = createWindow(); win.maximize(); loadWindowContent(win); - win.webContents.setWindowOpenHandler(({ url }) => { if (url.startsWith('https:')) { shell.openExternal(url); @@ -89,7 +87,7 @@ const setupAppEventListeners = () => { app.whenReady().then(initMainWindow); app.on('ready', () => { - new AutoUpdateManager(); + updater.listen(); sendAnalytics('start app'); }); diff --git a/app/electron/main/update.ts b/app/electron/main/update.ts deleted file mode 100644 index eb914055..00000000 --- a/app/electron/main/update.ts +++ /dev/null @@ -1,8 +0,0 @@ -import pkg from 'electron-updater'; -const { autoUpdater } = pkg; - -export default class AutoUpdateManager { - constructor() { - autoUpdater.checkForUpdatesAndNotify(); - } -} diff --git a/app/electron/main/update/index.ts b/app/electron/main/update/index.ts new file mode 100644 index 00000000..3aea3b49 --- /dev/null +++ b/app/electron/main/update/index.ts @@ -0,0 +1,70 @@ +import pkg from 'electron-updater'; +const { autoUpdater } = pkg; + +import log from 'electron-log'; +import { mainWindow } from '..'; +import { MainChannels } from '/common/constants'; + +class AppUpdater { + static instance: AppUpdater | null = null; + + static getInstance() { + if (!AppUpdater.instance) { + AppUpdater.instance = new AppUpdater(); + } + return AppUpdater.instance; + } + + private constructor() { + if (AppUpdater.instance) { + return AppUpdater.instance; + } + + log.transports.file.level = 'info'; + autoUpdater.logger = log; + autoUpdater.autoDownload = true; + AppUpdater.instance = this; + } + + quitAndInstall() { + autoUpdater.quitAndInstall(); + } + + listen() { + const checkForUpdates = () => { + autoUpdater.checkForUpdates().catch((err) => { + log.error('Error checking for updates:', err); + }); + }; + + checkForUpdates(); + setInterval(checkForUpdates, 60 * 60 * 1000); + + autoUpdater.on('update-available', () => { + log.info('Update available'); + }); + + autoUpdater.on('update-not-available', () => { + log.info('Update not available'); + mainWindow?.webContents.send(MainChannels.UPDATE_NOT_AVAILABLE); + }); + + autoUpdater.on('download-progress', (progress) => { + let log_message = 'Download speed: ' + progress.bytesPerSecond; + log_message = log_message + ' - Downloaded ' + progress.percent + '%'; + log_message = log_message + ' (' + progress.transferred + '/' + progress.total + ')'; + log.info(log_message); + }); + + autoUpdater.on('update-downloaded', () => { + log.info('Update downloaded'); + mainWindow?.webContents.send(MainChannels.UPDATE_DOWNLOADED); + }); + + autoUpdater.on('error', (err) => { + log.error('AutoUpdater error:', err); + }); + } +} + +export const updater = AppUpdater.getInstance(); diff --git a/app/package.json b/app/package.json index 16e396e9..e86ba2a4 100644 --- a/app/package.json +++ b/app/package.json @@ -1,6 +1,6 @@ { "productName": "Onlook", - "name": "@onlook/browser", + "name": "@onlook/onlook", "version": "0.0.24", "homepage": "https://onlook.dev", "main": "dist-electron/main/index.js", @@ -57,7 +57,8 @@ "clsx": "^2.1.1", "css-to-tailwind-translator": "^1.2.8", "culori": "^4.0.1", - "electron-updater": "^6.2.1", + "electron-log": "^5.2.0", + "electron-updater": "^6.3.4", "embla-carousel-react": "^8.3.0", "embla-carousel-wheel-gestures": "^8.0.1", "fflate": "^0.8.2", @@ -101,8 +102,8 @@ "@vitejs/plugin-react": "^4.2.1", "autoprefixer": "^10.4.19", "css-tree": "^2.3.1", - "electron": "^32.0.1", - "electron-builder": "^24.13.3", + "electron": "^32.1.0", + "electron-builder": "^25.0.5", "eslint": "8.x", "eslint-config-prettier": "^9.1.0", "eslint-plugin-react": "^7.34.3", diff --git a/app/src/components/AppBar/UpdateButton/UpdateProvider.tsx b/app/src/components/AppBar/UpdateButton/UpdateProvider.tsx new file mode 100644 index 00000000..8cf7b00a --- /dev/null +++ b/app/src/components/AppBar/UpdateButton/UpdateProvider.tsx @@ -0,0 +1,5 @@ +import { UpdateManager } from '@/lib/update'; +import { createContext, useContext } from 'react'; + +const UpdateContext = createContext(new UpdateManager()); +export const useUpdateManager = () => useContext(UpdateContext); diff --git a/app/src/components/AppBar/UpdateButton/index.tsx b/app/src/components/AppBar/UpdateButton/index.tsx new file mode 100644 index 00000000..66157860 --- /dev/null +++ b/app/src/components/AppBar/UpdateButton/index.tsx @@ -0,0 +1,26 @@ +import { Button } from '@/components/ui/button'; +import { DownloadIcon } from '@radix-ui/react-icons'; +import { observer } from 'mobx-react-lite'; +import { useUpdateManager } from './UpdateProvider'; + +const UpdateButton = observer(() => { + const updateManager = useUpdateManager(); + + return ( + updateManager.updateAvailable && ( + + ) + ); +}); + +export default UpdateButton; diff --git a/app/src/components/AppBar/index.tsx b/app/src/components/AppBar/index.tsx index 27281d58..78c83032 100644 --- a/app/src/components/AppBar/index.tsx +++ b/app/src/components/AppBar/index.tsx @@ -3,6 +3,7 @@ import { Route } from '@/lib/routes'; import { DiscordLogoIcon, GitHubLogoIcon } from '@radix-ui/react-icons'; import { observer } from 'mobx-react-lite'; import { Button } from '../ui/button'; +import UpdateButton from './UpdateButton'; import { Links } from '/common/constants'; const AppBar = observer(() => { @@ -30,17 +31,20 @@ const AppBar = observer(() => { > -
- +
+
+ +
+
); diff --git a/app/src/lib/update/index.ts b/app/src/lib/update/index.ts new file mode 100644 index 00000000..fc790689 --- /dev/null +++ b/app/src/lib/update/index.ts @@ -0,0 +1,25 @@ +import { makeAutoObservable } from 'mobx'; +import { MainChannels } from '/common/constants'; + +export class UpdateManager { + updateAvailable = false; + + constructor() { + makeAutoObservable(this); + this.listen(); + } + + listen() { + window.api.on(MainChannels.UPDATE_DOWNLOADED, async (e, args) => { + this.updateAvailable = true; + }); + + window.api.on(MainChannels.UPDATE_NOT_AVAILABLE, async (e, args) => { + this.updateAvailable = false; + }); + } + + quitAndInstall() { + window.api.invoke(MainChannels.QUIT_AND_INSTALL); + } +}