From 524bbd76244525b045e4c8600aac557856c0539b Mon Sep 17 00:00:00 2001 From: Red-Asuka Date: Wed, 11 Dec 2024 14:09:22 +0800 Subject: [PATCH 1/6] feat(about): add about page --- apps/desktop/src/renderer/components.d.ts | 2 + apps/desktop/src/renderer/src/pages/about.vue | 3 ++ apps/desktop/typed-router.d.ts | 1 + apps/web/components.d.ts | 2 + apps/web/src/pages/about.vue | 3 ++ apps/web/typed-router.d.ts | 1 + packages/ui/components.d.ts | 2 + .../src/assets/images/about/emq-logo-dark.png | Bin 0 -> 773 bytes .../assets/images/about/emq-logo-light.png | Bin 0 -> 780 bytes .../ui/src/assets/images/about/mqttx-dark.png | Bin 0 -> 10082 bytes .../src/assets/images/about/mqttx-light.png | Bin 0 -> 10332 bytes .../ui/src/assets/images/about/wx_qr_code.png | Bin 0 -> 3287 bytes packages/ui/src/components/about/Info.vue | 43 ++++++++++++++++++ packages/ui/src/components/about/View.vue | 32 +++++++++++++ .../ui/src/components/common/LeftMenu.vue | 2 +- packages/ui/src/i18n/about.ts | 7 +++ 16 files changed, 97 insertions(+), 1 deletion(-) create mode 100644 apps/desktop/src/renderer/src/pages/about.vue create mode 100644 apps/web/src/pages/about.vue create mode 100644 packages/ui/src/assets/images/about/emq-logo-dark.png create mode 100644 packages/ui/src/assets/images/about/emq-logo-light.png create mode 100644 packages/ui/src/assets/images/about/mqttx-dark.png create mode 100644 packages/ui/src/assets/images/about/mqttx-light.png create mode 100644 packages/ui/src/assets/images/about/wx_qr_code.png create mode 100644 packages/ui/src/components/about/Info.vue create mode 100644 packages/ui/src/components/about/View.vue diff --git a/apps/desktop/src/renderer/components.d.ts b/apps/desktop/src/renderer/components.d.ts index c31097493..415be918f 100644 --- a/apps/desktop/src/renderer/components.d.ts +++ b/apps/desktop/src/renderer/components.d.ts @@ -7,6 +7,8 @@ export {} /* prettier-ignore */ declare module 'vue' { export interface GlobalComponents { + AboutInfo: typeof import('./../../../../packages/ui/src/components/about/Info.vue')['default'] + AboutView: typeof import('./../../../../packages/ui/src/components/about/View.vue')['default'] CommonEmptyView: typeof import('./../../../../packages/ui/src/components/common/EmptyView.vue')['default'] CommonLeftMenu: typeof import('./../../../../packages/ui/src/components/common/LeftMenu.vue')['default'] CommonMainView: typeof import('./../../../../packages/ui/src/components/common/MainView.vue')['default'] diff --git a/apps/desktop/src/renderer/src/pages/about.vue b/apps/desktop/src/renderer/src/pages/about.vue new file mode 100644 index 000000000..b25db2d70 --- /dev/null +++ b/apps/desktop/src/renderer/src/pages/about.vue @@ -0,0 +1,3 @@ + diff --git a/apps/desktop/typed-router.d.ts b/apps/desktop/typed-router.d.ts index 07087aabb..dd95cc4a7 100644 --- a/apps/desktop/typed-router.d.ts +++ b/apps/desktop/typed-router.d.ts @@ -18,6 +18,7 @@ declare module 'vue-router/auto-routes' { * Route name map generated by unplugin-vue-router */ export interface RouteNamedMap { + '/about': RouteRecordInfo<'/about', '/about', Record, Record>, '/connections/': RouteRecordInfo<'/connections/', '/connections', Record, Record>, '/connections/[id]': RouteRecordInfo<'/connections/[id]', '/connections/:id', { id: ParamValue }, { id: ParamValue }>, '/help': RouteRecordInfo<'/help', '/help', Record, Record>, diff --git a/apps/web/components.d.ts b/apps/web/components.d.ts index ead027120..9350380fc 100644 --- a/apps/web/components.d.ts +++ b/apps/web/components.d.ts @@ -7,6 +7,8 @@ export {} /* prettier-ignore */ declare module 'vue' { export interface GlobalComponents { + AboutInfo: typeof import('./../../packages/ui/src/components/about/Info.vue')['default'] + AboutView: typeof import('./../../packages/ui/src/components/about/View.vue')['default'] CommonEmptyView: typeof import('./../../packages/ui/src/components/common/EmptyView.vue')['default'] CommonLeftMenu: typeof import('./../../packages/ui/src/components/common/LeftMenu.vue')['default'] CommonMainView: typeof import('./../../packages/ui/src/components/common/MainView.vue')['default'] diff --git a/apps/web/src/pages/about.vue b/apps/web/src/pages/about.vue new file mode 100644 index 000000000..b25db2d70 --- /dev/null +++ b/apps/web/src/pages/about.vue @@ -0,0 +1,3 @@ + diff --git a/apps/web/typed-router.d.ts b/apps/web/typed-router.d.ts index 07087aabb..dd95cc4a7 100644 --- a/apps/web/typed-router.d.ts +++ b/apps/web/typed-router.d.ts @@ -18,6 +18,7 @@ declare module 'vue-router/auto-routes' { * Route name map generated by unplugin-vue-router */ export interface RouteNamedMap { + '/about': RouteRecordInfo<'/about', '/about', Record, Record>, '/connections/': RouteRecordInfo<'/connections/', '/connections', Record, Record>, '/connections/[id]': RouteRecordInfo<'/connections/[id]', '/connections/:id', { id: ParamValue }, { id: ParamValue }>, '/help': RouteRecordInfo<'/help', '/help', Record, Record>, diff --git a/packages/ui/components.d.ts b/packages/ui/components.d.ts index 0f88d63cd..d9969770f 100644 --- a/packages/ui/components.d.ts +++ b/packages/ui/components.d.ts @@ -7,6 +7,8 @@ export {} /* prettier-ignore */ declare module 'vue' { export interface GlobalComponents { + AboutInfo: typeof import('./src/components/about/Info.vue')['default'] + AboutView: typeof import('./src/components/about/View.vue')['default'] CommonEmptyView: typeof import('./src/components/common/EmptyView.vue')['default'] CommonLeftMenu: typeof import('./src/components/common/LeftMenu.vue')['default'] CommonMainView: typeof import('./src/components/common/MainView.vue')['default'] diff --git a/packages/ui/src/assets/images/about/emq-logo-dark.png b/packages/ui/src/assets/images/about/emq-logo-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..b22f6ca2c471a5feb8ff71fcd27eef7dbb70ffbf GIT binary patch literal 773 zcmeAS@N?(olHy`uVBq!ia0vp^0YEIl!3-p$j&#ifQZoa5LR^9L-~`IDSyO>7Gb#!4 z3uag-cka>g%@Gy0pO_E2|CqEw95STV_j>a26t^i?1>Ex zfdR4KeG?cM7+-q2IEGl9UVG){q*Vq2Y!6<%IKhxu%*b-IHYUyb??3+XU7Wg}GZyWb z@!x53$mfYI4KMuP{Qh^-xUH_>MCR_~<+pZ8|1Y|leJShKS&d~y2i|8#d_3l%n^I#wmzg>;BTUU(>w8XY;ISqJ{g5C;b*$Y@#C6zj`5CT$HZ*UiTp0& zkXR(K@}1~zZMK(;=eOMA`Mq3m!RKE4%DcAADyq#tWW?M)axSkwJad2K&RY+7_19ML z@jEJC-Zn)`e-UHQcY5>MH@Tqg|9>8X z)!mErB%&59vXh$T=$XuBu{u83|J<4--{j1?m$okFSruGtc)+^vjcdKcnT6*(4OZ-9 znD1t|SLdk1hMO}@n{BSFNo!Tth-1z@8SvqNz6bX{!3UgO?d(_nFKV}uSn^o3hd1EI zTfKXBSATv8G4GGt9XXXvVs}N4?*|9>cdK*uOF62AJo^ys#4K_zFk-=vg|#zkmS?}r zX=wXxzhSX@hTHC-sPK0`UG&uMhCHqdSo@1*&Z&c@&llN&bY3+<%*uCSnH4O dDRH;|@!#B0Sy3oCa|$Rid%F6$taD0e0sy=K8^!#8OLp0p%TG&ZX)fKECX) zwa*d0EIvuiV!i0^ee;D6e`T1y{LIGdYYtDXw|QxpYAl;2l5D}8`{l-8E*s^a2P}n8 z9XD#L*_1wuJE7!agZVN>alv4&mAVsRMc4P4B#0`d|8w0RT*4kL==yj2!cCi5+BUMt z&15ov_neFaJmu9B(;7>(6%3d@zObCZw4>#$RE1OUhLyYq ztzM~jY*>3lnL5PZWNj3^!7ja^ynViF_OpVgTNw`7p6PkOyrihn{QrxWSJ>koWGLTz z_^jlB@S0Y}JzFi8=PbzPf0486)sLRF-55ucTKaSQ5aF%=nHi2$dd;g?v>2Fj7(8A5T-G@yGywpmIH@ZD literal 0 HcmV?d00001 diff --git a/packages/ui/src/assets/images/about/mqttx-dark.png b/packages/ui/src/assets/images/about/mqttx-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..13abc8c1d6ebb106370a7ebf7d30e11e523924c3 GIT binary patch literal 10082 zcmch7g;!fa6E9i<6!$_Q1&T`xB?Ko(f#MFuDOQSw;!q^GLn+eYUMPj)?oiy_Ex3Eo zy!89Nciw;S?wP&&+nL|Y?CzbjxjE;CtEtEl;61}bLqj7_keAUwLqm^4HGcpmN>f$a zWr^z0KWoTIq0jYk`Jo25PV)Mn(a`Y8{xx*8A8FKRXc!Y}N?Nig<2({6G8Y4$i2%=s zffqvrXTt;+LjNa=C=eouQZ5GnGyMnu2ZW-O;JI+2$tdC3Xvy_N@LU*ZAsFQ=G##aZ z{0*LtL|FyrLPe&dg=V4z=R?8M5t2&@BD1k5CMu5De5~Mnu;4r@U8vxAq~K&EXf6ar z6GCO54Sm0qp0?MextMZvcUg2aAUGAVe|L^VB6n_2Q85+gzrk;gR}qJx=`hf2h|FB< z!u6indB*hBHfSn*>=G_A6Nw5kc(K-VzTA1X*m62ocRU4}38_392hD_*9*!0r4&?9m zqudj>+hezy!?x;Cj-csKe|Xj7gp+5O`KXfgu2{;T+4=;q<>)ACOgIcu-ida2<0 z;ns91`{LmS<#Kv|4VnrQnTmwW#Gv?~$uRx742_u|pm7uq2aQF7Cc-5qVnf#Jq01%a z^Le20aL{nnKkG;oN_>guq~wz)-ZnVDvv16c~<#jK!m9DE&XqP>k?!Ea)F65`-d*Lv zJn(;&{ZRt_(f_0`nnO^IgM{$Crq58|G_AlD36>WD~~t|{8#?bxI|GA_(YZdaZs3B@*kf|L{CqT=|2(J`6T}v z3N=J|p)iW@|GF4m&^1m~y+lS|O$m^zJeGnxe9vQ%i`O1EjktIp~DXkBZ6p1`i zmqJz8zbZo_ZT@pd)f=kEMi&2X^uO*F)%X1eyZt}I!arDpY6Zyc|7uf^dg(}HY#3^E zhD1&vk>; zK3eRI4fNOuTDs5#T;0>f4`Q6fknX15nyzM99QpX?b9|hdE32;(X*rRyrxDW)CsOSc zF`WrVLu2Apkb!7bu$%2%j_39|PlKYa z+RppMgRU6+`RZEe*9Wqo5mj)hcJ1(z_YRNka<1Hnae7Q=hD6`Zr(=$`?dM*#cGGh1 z-_I$Un;|hf`+tYTh7+D&Q*}kQsmVoU_B5Mlv{f)?0QtZkQS7?GpTZzri0!|aLt7{Wp$ge z*MyC2UVviwpBD-rp;qExrIH|T-a&fMO-jD{lAvn=B=}pwCT+382=|Qs%sQNG zlb|>DSf_ZQ%_7^okhI71XhY#8!H}wrS%YpHo5NHKmPi?vm{5zI$MRa&gbVGDrxyo$ z<7MzX-(Js$(S(O&rsdLnA;oVy-VtPNH8V~!BHGHO2;62RWG>y%Jfm*nMdb(TyAqRD zy7T4k24#oAo#k?@Zk}6L2IrB5+BZ~&7#H?q!-VsXFCXr*P2gp|g$7` zn%sABp|@tbm&a7Jj!T-gr_n_D>F;i@kB_I1*`gHJ;fE@MthnLpAU2IVCf3BPcimUo zO-;G=7=$^VA_p11bzX7-3leV2ZvGCeZ|J|(NEt&%iF!&Xmxr_r2qPB2F)z~c0#j}A zJ4;J3GK7Blp+V1U3isSXd@t-R@8BhmM`d>b@9YKAAHH-*NGR4nx5=Lfd%D$3{Of zb*S%oN@kprs6y2AELE<<^t6xkSu`BXs>M$#1?BJk%_O|_M!t@{z zd{f4&@&aP98_Qe5URYRjF1jkjsPee4sF49&zmWd1-KJQn2i{ZTpM80kw zAMEEu=FbI#*IAotbTH}X=jq$Ch%kS8H`<)x75&;q=a^xp=Z)okO#e16OuZ-z=zkx0 z)@-m3he*p2R{O~{w1<_%M90?g$pSF?RzzAu6a>29q3rx#8 z$8ds=A`orAK8o2vOmEI>Xm;lp@Y_F)o(nL^{q5BkTja-zlQ2n*CyS4t!BUEjHyPLq zz(U`W(5&5ehGk%uXIsYPU+q^Q5UzA$8Z&|CwS7Gfe{-g5pq6f3b8boX=+soL8HJ%= zLi}TAq-w97{qYA*c8{N!(mY0oue70_0s6g1>rm@y=Qw|VoGaUE|J(KC^3%^ZURnHD zK20$V4>PMa;hg?_$Jurkc7}O!d$+H825J{N3u@G7z)4=b=IgCwy8+nf436@?)%#*z z$wF^qqV8_qX4BUI&0>;Gq?wxg`whg&rzyDQAB_2mQp*V_+a7Z|>G&pA*#87l6}xzu7u zeDUm1hMI2>SBPB>mgnGKxP2}%EzPj8Y3~%ZcD~~Mazig}(rER<(Dz!* zR&11p^a|1G>RpLGYIm{YY@y;wK21&vD>Aogo)g(bkd5vLS--N0D6GkjN(H;UgLr$IU9Z)yrUDwX^BQ44_O z6`~FY>5IBzIxo=(*5=6aWP4f9dRp^d=9feO=K*E^3vxO9QFN~;^yJVj+~eS5BXwi- zHEPf^2@X%mxJhooUlR#*1wD>`+Xkf1Er_&SdrpH7JD@tHTM$SbWA@nw0s6N(XQi;S zQ6Kr7DK_}cDgr#OSneuAW%p=F0_aV|c;bCfEHzFOa2$>?YyD4?>~{;^s2?mdU2_sbz@#A2(PW{5Z}M~vB=#p=98ex;$F zQTnD06}`tn3>TV^XaaruB-Xm&y+fH4T7%()hzVU?j|(TQ_d9d0YNGYTYWw35vO^ zeyY2a5goSvZYAj5vF^|fEN@ssE{&mBF7M0^e(L#Xz4sTgeqx#{tnzxfhmnF5c>ywp~6J^5Uaxb zgIaZjS+sO+3nc5bhz&>>#oVRQbYfp+60Q4<9xk#`uRnX;lH=?HY|%30k>9IO#N0&! z#x^n+lt->LxX`uW*;6dULN}#JlaD zYK0+f*la}I?ua@MSh9`>z8#2gB&*9k4t9`_E|W^qx_MEs{tlv{8|6B|nN(6=$G*7T z>4CA0sQKxPS!~;6ANYXRI|a*oyL4QD!;UKLY;lIaWFFrI7I}OvDJr^sy8^H`&>$MQ zf9rM`(3n-0oIj_Ggq~szvpsyVq=+fv*q-qv*dRtFh=EQhf^3200e<39tWK>3FE+|) zw1+Xpm(1wE*Q3fr8t@teX&=<;95+>Tdtx}~)U>rTjL>`;>}sl#jhpJ97RkfUoIKCA z3jt`s4Qr=}NYCmv@k!WS1@z0~MiZ4~szw~dk!i!{xm zbiN@D$dJE9+QXhP$TS>q=x>F_X+@%@53$DdgsO|_X4WgDGbw6xb?-(Mi4GSDy@#IK6ZbfB!m$ydxC*$OT#wD5(n0t4+S z8N;*i<;Xa?3My$1*W_e+kh6!$#hIEYl)uzKOI;^uiwH(8G^0qQ#q8xNpHVklLZ)8M zx_+j5k;B2PdsG&5D#9z~bfs`{Ml1?lXjhf$E<1~e&6N6_#prO`_vc1`BPW@)w{XYJ zNl#RiWWhhs);tkO9wUMA?4)i?nJB%Tx>*!Gqb@p;p%gFU`0-a99T;n~0B86#{aLdp zO$HdkqTGeu^FmTpH(5BEX7i@xJO7V>qY$Hlbj|9;y3D7rl z*}(^rIu<dLM!k#IBL+DYrJ9U1DvRVIdxDM%Y zYFw>6X#2Z0*a5QaD};s2m0gT;ZZG6lvZ-RQ8mM-HvfjvJG@AhQ2yC-1t$15fg!b3gQvjGYP zIo^?jt|hAXI_w-R)&#!k1gKwtQ!S2Gmlh*oFVC%=D+h9=lufK8TAfNO%l2&P043kK zgHo4^GiIoM)#XgobK?}*&CdZ7RN$MJs5D~($-U8-^sb+lX{L6{=gY!7&+FT8#TW01 z@U}_wbCY=ksPvPj>Ko?6xvxL!Xo*vK$g%bErY$AL7`Mnch)>`oKYy5gZHd&D+f);i zxsi>?V@l@zzQC_fR-8`OH2=C2#7c^DWu_3rn&OxoW7r~7vzsJ9m%bSzwnLSEN&^0q ztm`HE=+o!|KYRIS1IsLf?0t|zwvZE@3{>>!3FdC^rs57uO80CK%@mK7w%lr4ycDWL zQ4?1m5aiEZ=rR_sZ20lVO2>xKVAxY|)q_rUd~IL@SVYTi(D|zp%c%x;NACc&{z>zf zRk-CPH|pGO=xMPOmp1X(ySWSH>d^PDml*f^qIG_zgsJ5SAj0F~CW%m=K9+a#aAqe( zQ+bX&1k*Y$1S~$qnBSS$vmLwV_Q^%bAP$%Ro)HUY*o(;3#~HQtTAqBO(DM@hon0Ji zKFfBPEjZL(`AWWbgUnrE_tj?K2`+B)PPbl|)TaRJZ|9_40i1AGa)PE&^WFIM%wq6(vW*-{}E@#5kob*bKaFm=Sro z@Uo1!oigLh!`L}4RW-scnXXA%Vq`EzC&*5BO6F~NF7tEX(@ z3$%Vpa{Za3F|tJYk#VwMzQZ1DhZF@Nr&zL+Q|hDW(ZXD~pJAosd9PYRk0^~Up0jJ+MmXYP zV0`VI)xlMm$Y_jRLvy1`pTIW`nh4b8PTIyf-z5qfMt*ZJ0X=p5xuXgOvXG z)tjkkT(Xcz5ZJ;G4VoHs%Uld2bE*fne*e{SLKJ?9UeI_~rxnM!&2hdR z$Li2YL-Nkrs$(!XWdMujGD_I*2%)j$YX?@spOvNVUn7OQ6~pb#6v^ln0Qk6k-=(Q8 z3BelZh8dnRGy4sD(5C~F1j?Q~%?5U61Tiq<=w+Pvx|51!7;VWd@ZC%G%EF#{lO{>% zinb^Cd9WE9l2wh@CT?Otc)UqdB;#;&($c=bh8)bR+H-vcAH-tM)pi&We|=GqSGsDR$;A#$2_ zw3*ebCP5D6x+Gj~QJYRNKq}S5yx3q?CqWhg)T?*4wZX3FB)E)v7|(eOtbYqe^!t1o zdoKFyl{<~4ZwNo^-Zt&c7dlZWZFA@7rM|_I^NQYf_*NBgJ2s&(Hh|T~A&r`Kq-!fD zbaNnigNmyVO9&}0d%Jkv)41nmIQ+_TuHwBN522(Tf2RWEs97~peA~y0VaZ|O1q*l2 z7LQ5HVX09|)MgOS&sYAt__pY=18(5XZHc|b?@w=HWJ4sR_p+5TKV{(Xms@~6SwK~k zGX&LOdUkqZct$ArxMwhPXyr*)`!~z#>Rt_Gz!nYUs6O@Dx5>wfelSXN)y(df{o&dC zd=xF;A{9JFr2e>P;Jg7HI_k<^L;k_@_eK!#8moQ-@_1K%CQ6I7mg}Md#CpCFxJUu7 z!NET6>C05SIul^~QBv%R`HDD2+#Rd_P-pD!^;scVoroi|i^38VK!z`jhW62?cq>!hWVvVNih5yMC;!kn718aB0&FqfA zRcxdHeJ!>puy^kYr) z*EC-V$`;|VJ8PLPvXQ&^dKT*JX#cX_gkazc=vIz^+Z*B6yOYb&L1lwTLN4(irFt9K zY;M82o;F*bN$V@U1GBa{1cjUXy_K0(74df;1K(x_m#R*eKp%3_B@&M@fzB?TqN|bb zSA=d6oeIlsWiLjriv)~=Zby4QCGT9xF|{?xM!)^49qe(}p5w9kL*UbC+17R;+4b*B zA*o$Whpf_<8RlEnig+Kucvy||@An&@$nH1H))$om$jc0^MJ%7Y5qMQ(Zfq7b$R_~ln0M8Yu>9I@x9UaX(^y}paK}gF4OqatK}*?B0g>% z0D==3jDzlVLjCw{fGy_X^;LM$EU~|hw;L;YR>w+iiamq*Kh;9UEc@OabO=jS?LYJ9 zO*fehtkTc6X~U1~1(z8lQ<$9EWGj={JGpqSJANwvu%9M(K^I@yoNO=3S0!m zLSN_XR27_WD|;h~^6_;`-ikYSuccy9P8H0bT@0nA{{M85gQr{T*7B1D zTh8_hh8h&dJx&;j_Ot6}&Yc|t;68_!t*xh4&9T27o15)BMb5Yk>MVn$Z0vqA{ju~A zED0oU*B$8ug(;HMoI4+@SuIqZiy8mDUU@W4W}eY;(9f2Xn@t}=zsh2|Prtc7BC<^K z?V{h-u6L}ESEy3h~6h6!PUptKN9Z z!tB(m=&{5t&jm>#SI@1MNe#hYdYJDG54GA0TMLIjQXH;sQvfPQou5A?X&{vlft$=7*VwHuPCq3&#DO!7!MvT2NjM~HQv);^toUEr_Aj8QljN&nX z`Io;<_3^Gm-nh3+l0@0SOWq>q7Owt2vY=*ZDe(P}+yc>~5!CUXz+?yYV+f z2o~wbC;Px)dCIdDv7NwBL1xjKbL^V@%2Xc$`uyy|@hAP)9A0pEmted2qw)d)pGX)( z5tC2Za7WF)iRNJ^=r5&wq=N!hk)LeFsb5D_3D7Rx8-aNhmbzjUn_ucy4e0nd(+XUc z_$xD`F6-}2+@P(!S-ylpPYnURZYIcdDl3khP1^df861vU1GR_@_#W^9_or;F1FtZKz_x+MKMc9Vr@Xsjj zd%bB6mo;dz6o_k#Rv4(QE&t~Gb2q%CfZOYfD@eTH27Go?B)sSOyngBc3mkn3SSWS8 zUh$5mNuGbg6FpmY+4xd=KlSCq&NtxxM+QGe+6#+Pl@@jCEJflP-s?Yp@xxWYqm)Zu z@fd%#B02ls;+_dVJc9H+ug0&LD*i~0vHRc`U=GO$XM-NtB zB1t#DD#5d{vpeP2Or|9+%M=nmkq6z_iS~rjB;$?c7?c2IqFd!&b;vI3kLtGN0WX>} z_KN%FWli||X-VeOp?Dot`#3dDfAh7dj+l2Ac}b{>U<#Zf;b#*@^(b~`^j~eUnGFfNDp?+D$Qp91B?6eChdDyUT4c!d?{~T`hM9Z6M2Z(Q$qXlk| z-57TUP*x^k=)0Tp#j@|)X4Jw^_$biQEZah{cHo5NL~Q6R@%g+l-0{oz4mQ8KBMhSVzZ3s3D%s_1&cbF zOxS6`Z<~vstJow}`;D8;IT$Bct($ePQ9@7Q>eHTDBKepk8;)RGeipe8h;ikeVJr*8+6 z4|ZbUIyNpXgn$u0r*Ho_BXM9xMhn53X->Ntusy+^Q&cJ-GE^bkF4$j$Q3V~9ou3r= z_!2PqKuR)UNc<>bl3dS)G$cg>aJ?lVRw`MRt(PSy=9n7(xvHig_blt zP7IJD48BXqMUvc?39{z5Vc)1#OsX{hfCb1C=aip#Uxp`4q*lMAuwc4mk&K(!;ZvB& zw51BF9Apc$&sJn2g?FxQeiLj>`q_K0P^$siF({DUW3v-Lu*{>XN%Ba@rIp~5&N3j(NJ zxLH?Jlq-Sb3e|vdOI5njn=giFb)Y%{k?MEAVh^`}GhL$NJsEp}xDg+EIYn|I9fPV<=0yO?@t@BqFHRmr(ps*ITE z9OM_M6I=D2&^PHaSDHR+VVVDmCv^n9dGUG^R2TZgFz(9*>(95K-Q9r*Y_Dh7H%a|F zIz0!!6;f^@`5!@uYkQ|}(GAH{eVT3@!h5W$8O03AmYo3Pn2l@|cceGn9S#fQJD zZQaNNsd<&^kHsVUJ-801O_0e&g>ggNjn^}(vnx$I5ja>ZqCmw)h7mz2mkAuS;&psd z{BjudyZR#xbmTl3~~A$zpO^TTQgs|%?3)XZJ6#F{dO6MOA< z)@*weSqbvn(iyJWxh)A?b_)xU!m&$q5aa!)8`p*B9q|#PrtMPpd*UOO*%dp$ywd^D zn$@$ngn%3NXW@W<*{U>Re+5(dD*v-Oj2!9)D7>C}0;q@-8Li)#&~2$$2y+)-bUHCO zqKrAqX2%i6GIQ*n`&x1LwWGxuHY{VpTPejqgO3I&QSK1qcOL-l;#?%y5(gcQY!Wn< zll>ubYAp=GNDrqBdiYUNdOFc+~}EDqUqsv!HZ zn>+Zi<@P;>!`mIMC}3)lhv~KM6Fl=T@d@ua-5@E-V*Bp+!g;$Nt1jcv?Syd_aNiPi z{xOLHP;}kuH{b^oJIk(9!l@T>@XIp52EiQe{JH#pU}_}o4&MQkUGt1f&(r`#j8Oaz z-|u^7Ykb7RMvF7WsU*UfoV{M=Zr3laq|kZ7sy`KGA@vBqGrmUg%Kh!$1kk{>4`Xpi zg3|0egv6u)=9$d>$9#(;^;C&$q-8+agOnvgg~8A8h2Mzx2Et-;#OC*rpB>5G5f6B2 z-^)^gS{}`3Lemz!${A1bNUt=KDsSVE&%MQW;B*ieZPF==cqn;S%N*R#yVi)-ubyNo zOd?2~SqBnRZW83CB@Fv}(_qsr=yZ_R)~NOfJO`EaIODs9*^d*s{4u+$)k^N078JjY z70mndz0y{7Qup@R;camY4N$MRE@Q} z^Tdaiw{ei#XW|8hbcml}cz&AIrhGy`AQgWNT*`Y=-`%2Aw&lJjEB>Uu=e25lETi2w z>o`ohP9q4;3_^N!bdH6E?&72`ma66EH_3GK==IPre&VSf_ay+j+Bk|I>9iWBwC P5SoIlicG1LDeV6MDG%qG literal 0 HcmV?d00001 diff --git a/packages/ui/src/assets/images/about/mqttx-light.png b/packages/ui/src/assets/images/about/mqttx-light.png new file mode 100644 index 0000000000000000000000000000000000000000..222377d52e4c9238a89982dcdd763938dbf06804 GIT binary patch literal 10332 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 literal 0 HcmV?d00001 diff --git a/packages/ui/src/assets/images/about/wx_qr_code.png b/packages/ui/src/assets/images/about/wx_qr_code.png new file mode 100644 index 0000000000000000000000000000000000000000..5a31a4eac4c28499622882a63bfa8d05bffd9f60 GIT binary patch literal 3287 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 +// TODO: Implement update function, and display data collection policy. +import type { PlatformType } from 'mqttx' + +const { about } = useLinks() + +const platformType = inject('platformType', 'web') + + + + + diff --git a/packages/ui/src/components/about/View.vue b/packages/ui/src/components/about/View.vue new file mode 100644 index 000000000..a8cb937a5 --- /dev/null +++ b/packages/ui/src/components/about/View.vue @@ -0,0 +1,32 @@ + + + diff --git a/packages/ui/src/components/common/LeftMenu.vue b/packages/ui/src/components/common/LeftMenu.vue index f0996cfe0..2d931f688 100644 --- a/packages/ui/src/components/common/LeftMenu.vue +++ b/packages/ui/src/components/common/LeftMenu.vue @@ -80,7 +80,7 @@ const menus = reactive({ diff --git a/packages/ui/src/components/about/View.vue b/packages/ui/src/components/about/View.vue index a8cb937a5..498112fd2 100644 --- a/packages/ui/src/components/about/View.vue +++ b/packages/ui/src/components/about/View.vue @@ -16,7 +16,7 @@ const version = computed(() => `${t('common.version')} v${window.__APP_VERSION__

{{ $t('about.about') }}

-
+
MQTTX
diff --git a/packages/ui/src/i18n/about.ts b/packages/ui/src/i18n/about.ts index 78269150a..3efe8d1d2 100644 --- a/packages/ui/src/i18n/about.ts +++ b/packages/ui/src/i18n/about.ts @@ -48,6 +48,13 @@ export default { ja: 'MQTTXは、EMQによるオープンソースのMQTT 5.0クロスプラットフォーム・デスクスクライアントで、開発者がMQTTサービスおよびアプリケーションをより速く開発およびデバッグできるよう設計されています。', hu: 'Az MQTTX egy nyílt forráskódú MQTT 5.0 cross-platform asztali kliens az EMQ-tól, amelynek célja, hogy segítse a fejlesztőket az MQTT szolgáltatások és alkalmazások gyorsabb fejlesztésében és hibakeresésében.', }, + mqttxWebDesc: { + zh: 'MQTTX Web 是一款开源的可在浏览器运行的 MQTT 5.0 WebSocket 客户端工具,无需本地安装即可帮助您更快地调试 MQTT 服务及应用。', + en: 'MQTTX Web is an open-source MQTT 5.0 WebSocket client on the browser to help you debug your MQTT services and applications faster.', + tr: 'MQTTX Web, MQTT hizmetlerinizi ve uygulamalarınızı daha hızlı hata ayıklamanıza yardımcı olmak için tarayıcıda çalışan açık kaynak kodlu bir MQTT 5.0 WebSocket istemcisidir.', + ja: 'MQTTX Webは、オープンソースのMQTT 5.0 WebSocketクライアントで、ブラウザ上でMQTTサービスやアプリケーションのデバッグを高速化することができます。', + hu: 'Az MQTTX Web egy nyílt forráskódú MQTT 5.0 WebSocket kliens a böngészőben, amely segít gyorsabban hibakeresni az MQTT szolgáltatásokat és alkalmazásokat.', + }, cloudTitle: { zh: '立即获取一个您专属的 MQTT 服务!', en: 'Get Your Dedicated MQTT Server Now!', From 66155f8326a47ab6c719d6d3559ad24da315fe69 Mon Sep 17 00:00:00 2001 From: Red-Asuka Date: Wed, 11 Dec 2024 15:38:05 +0800 Subject: [PATCH 3/6] feat(about): add footer section --- apps/desktop/src/renderer/components.d.ts | 1 + apps/web/components.d.ts | 1 + packages/ui/src/components/about/Footer.vue | 76 +++++++++++++++++++++ packages/ui/src/components/about/View.vue | 1 + 4 files changed, 79 insertions(+) create mode 100644 packages/ui/src/components/about/Footer.vue diff --git a/apps/desktop/src/renderer/components.d.ts b/apps/desktop/src/renderer/components.d.ts index 7fd450a3a..160f4b0c9 100644 --- a/apps/desktop/src/renderer/components.d.ts +++ b/apps/desktop/src/renderer/components.d.ts @@ -34,6 +34,7 @@ declare module 'vue' { ElInputNumber: typeof import('element-plus/es')['ElInputNumber'] ElMain: typeof import('element-plus/es')['ElMain'] ElOption: typeof import('element-plus/es')['ElOption'] + ElPopover: typeof import('element-plus/es')['ElPopover'] ElRow: typeof import('element-plus/es')['ElRow'] ElSelect: typeof import('element-plus/es')['ElSelect'] ElSwitch: typeof import('element-plus/es')['ElSwitch'] diff --git a/apps/web/components.d.ts b/apps/web/components.d.ts index d615d8a19..c5f4e2c0c 100644 --- a/apps/web/components.d.ts +++ b/apps/web/components.d.ts @@ -34,6 +34,7 @@ declare module 'vue' { ElInputNumber: typeof import('element-plus/es')['ElInputNumber'] ElMain: typeof import('element-plus/es')['ElMain'] ElOption: typeof import('element-plus/es')['ElOption'] + ElPopover: typeof import('element-plus/es')['ElPopover'] ElRow: typeof import('element-plus/es')['ElRow'] ElSelect: typeof import('element-plus/es')['ElSelect'] ElSwitch: typeof import('element-plus/es')['ElSwitch'] diff --git a/packages/ui/src/components/about/Footer.vue b/packages/ui/src/components/about/Footer.vue new file mode 100644 index 000000000..d44a89da0 --- /dev/null +++ b/packages/ui/src/components/about/Footer.vue @@ -0,0 +1,76 @@ + + + diff --git a/packages/ui/src/components/about/View.vue b/packages/ui/src/components/about/View.vue index 498112fd2..3a79c47e4 100644 --- a/packages/ui/src/components/about/View.vue +++ b/packages/ui/src/components/about/View.vue @@ -24,6 +24,7 @@ const version = computed(() => `${t('common.version')} v${window.__APP_VERSION__ {{ version }}
+
From a685ce9144f8a402a229d2335ffd0e7d47d46675 Mon Sep 17 00:00:00 2001 From: Red-Asuka Date: Wed, 11 Dec 2024 17:09:56 +0800 Subject: [PATCH 4/6] docs(links): update cloud trial link --- packages/ui/src/composables/useLinks.ts | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/packages/ui/src/composables/useLinks.ts b/packages/ui/src/composables/useLinks.ts index e5d03bb4e..79540d3f3 100644 --- a/packages/ui/src/composables/useLinks.ts +++ b/packages/ui/src/composables/useLinks.ts @@ -15,10 +15,25 @@ export default function useLinks() { return 'https://emqx.com/en' }) - const forumSite = computed(() => locale.value === 'zh' ? 'https://askemq.com/c/tools/11' : 'https://github.com/emqx/MQTTX/discussions') + const authSite = computed(() => { + if (['ja'].includes(locale.value)) { + return `https://accounts.emqx.com/${locale.value}` + } + if (locale.value === 'zh') { + return 'https://accounts-zh.emqx.com' + } + return 'https://accounts.emqx.com' + }) const utm = '?utm_source=mqttx&utm_medium=referral&utm_campaign=' + const cloudTrial = computed(() => { + const query = `${utm}mqttx-to-cloud&continue=https%3A%2F%2Fcloud.emqx.com%2Fconsole%2Fdeployments%2Fnew` + return `${authSite.value}/signup${query}` + }) + + const forumSite = computed(() => locale.value === 'zh' ? 'https://askemq.com/c/tools/11' : 'https://github.com/emqx/MQTTX/discussions') + const leftBarLogo = computed(() => `${MQTTXSite.value}${utm}logo-to-homepage`) const empty = computed(() => ({ @@ -31,7 +46,7 @@ export default function useLinks() { faq: `${MQTTXSite.value}/docs/faq${utm}about-to-faq`, MQTTX: `${MQTTXSite.value}${utm}about-to-mqttx`, EMQ: `${EMQSite.value}${utm}mqttx-to-homepage`, - EMQXCloud: `${EMQSite.value}/cloud${utm}mqttx-to-cloud`, + EMQXCloud: cloudTrial.value, })) const help = computed(() => ({ @@ -46,6 +61,8 @@ export default function useLinks() { return { MQTTXSite, EMQSite, + authSite, + cloudTrial, forumSite, leftBarLogo, empty, From d2fabe7a3cda5211e34d79367760616d78f6db3a Mon Sep 17 00:00:00 2001 From: Red-Asuka Date: Wed, 11 Dec 2024 17:17:23 +0800 Subject: [PATCH 5/6] feat(useLinks): update unit tests --- packages/ui/components.d.ts | 2 ++ .../src/composables/__test__/useLinks.test.ts | 28 +++++++++++++++++-- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/packages/ui/components.d.ts b/packages/ui/components.d.ts index 34cd40865..9d3f59138 100644 --- a/packages/ui/components.d.ts +++ b/packages/ui/components.d.ts @@ -25,12 +25,14 @@ declare module 'vue' { ElIconDelete: typeof import('@element-plus/icons-vue')['Delete'] ElIconDownload: typeof import('@element-plus/icons-vue')['Download'] ElIconPrinter: typeof import('@element-plus/icons-vue')['Printer'] + ElIconRight: typeof import('@element-plus/icons-vue')['Right'] ElIconUpload: typeof import('@element-plus/icons-vue')['Upload'] ElIconWarning: typeof import('@element-plus/icons-vue')['Warning'] ElInput: typeof import('element-plus/es')['ElInput'] ElInputNumber: typeof import('element-plus/es')['ElInputNumber'] ElMain: typeof import('element-plus/es')['ElMain'] ElOption: typeof import('element-plus/es')['ElOption'] + ElPopover: typeof import('element-plus/es')['ElPopover'] ElRow: typeof import('element-plus/es')['ElRow'] ElSelect: typeof import('element-plus/es')['ElSelect'] ElSwitch: typeof import('element-plus/es')['ElSwitch'] diff --git a/packages/ui/src/composables/__test__/useLinks.test.ts b/packages/ui/src/composables/__test__/useLinks.test.ts index 5425e2715..08c934993 100644 --- a/packages/ui/src/composables/__test__/useLinks.test.ts +++ b/packages/ui/src/composables/__test__/useLinks.test.ts @@ -99,7 +99,7 @@ describe('useLinks', () => { faq: 'https://mqttx.app/zh/docs/faq?utm_source=mqttx&utm_medium=referral&utm_campaign=about-to-faq', MQTTX: 'https://mqttx.app/zh?utm_source=mqttx&utm_medium=referral&utm_campaign=about-to-mqttx', EMQ: 'https://emqx.com/zh?utm_source=mqttx&utm_medium=referral&utm_campaign=mqttx-to-homepage', - EMQXCloud: 'https://emqx.com/zh/cloud?utm_source=mqttx&utm_medium=referral&utm_campaign=mqttx-to-cloud', + EMQXCloud: 'https://accounts-zh.emqx.com/signup?utm_source=mqttx&utm_medium=referral&utm_campaign=mqttx-to-cloud&continue=https%3A%2F%2Fcloud.emqx.com%2Fconsole%2Fdeployments%2Fnew', }) await setupI18n('en') @@ -108,7 +108,7 @@ describe('useLinks', () => { faq: 'https://mqttx.app/docs/faq?utm_source=mqttx&utm_medium=referral&utm_campaign=about-to-faq', MQTTX: 'https://mqttx.app?utm_source=mqttx&utm_medium=referral&utm_campaign=about-to-mqttx', EMQ: 'https://emqx.com/en?utm_source=mqttx&utm_medium=referral&utm_campaign=mqttx-to-homepage', - EMQXCloud: 'https://emqx.com/en/cloud?utm_source=mqttx&utm_medium=referral&utm_campaign=mqttx-to-cloud', + EMQXCloud: 'https://accounts.emqx.com/signup?utm_source=mqttx&utm_medium=referral&utm_campaign=mqttx-to-cloud&continue=https%3A%2F%2Fcloud.emqx.com%2Fconsole%2Fdeployments%2Fnew', }) }) @@ -135,4 +135,28 @@ describe('useLinks', () => { blogUtm: '?utm_source=mqttx&utm_medium=referral&utm_campaign=mqttx-help-to-blog', }) }) + + it('should return correct authSite based on locale', async () => { + await setupI18n('zh') + const wrapper = mount(createTestComponent(), { global: { plugins: [i18n] } }) + expect(wrapper.vm.authSite).toBe('https://accounts-zh.emqx.com') + + await setupI18n('ja') + expect(wrapper.vm.authSite).toBe('https://accounts.emqx.com/ja') + + await setupI18n('en') + expect(wrapper.vm.authSite).toBe('https://accounts.emqx.com') + }) + + it('should return correct cloudTrial link', async () => { + await setupI18n('zh') + const wrapper = mount(createTestComponent(), { global: { plugins: [i18n] } }) + expect(wrapper.vm.cloudTrial).toBe('https://accounts-zh.emqx.com/signup?utm_source=mqttx&utm_medium=referral&utm_campaign=mqttx-to-cloud&continue=https%3A%2F%2Fcloud.emqx.com%2Fconsole%2Fdeployments%2Fnew') + + await setupI18n('ja') + expect(wrapper.vm.cloudTrial).toBe('https://accounts.emqx.com/ja/signup?utm_source=mqttx&utm_medium=referral&utm_campaign=mqttx-to-cloud&continue=https%3A%2F%2Fcloud.emqx.com%2Fconsole%2Fdeployments%2Fnew') + + await setupI18n('en') + expect(wrapper.vm.cloudTrial).toBe('https://accounts.emqx.com/signup?utm_source=mqttx&utm_medium=referral&utm_campaign=mqttx-to-cloud&continue=https%3A%2F%2Fcloud.emqx.com%2Fconsole%2Fdeployments%2Fnew') + }) }) From 36da48be40bf743a97d39e0c81d65bc50c4d88b5 Mon Sep 17 00:00:00 2001 From: Red-Asuka Date: Wed, 11 Dec 2024 17:22:42 +0800 Subject: [PATCH 6/6] chore(deploy): remove caching and environment setup steps --- .github/workflows/deploy_web.yaml | 18 ++---------------- 1 file changed, 2 insertions(+), 16 deletions(-) diff --git a/.github/workflows/deploy_web.yaml b/.github/workflows/deploy_web.yaml index 02a05ba35..f74f49daa 100644 --- a/.github/workflows/deploy_web.yaml +++ b/.github/workflows/deploy_web.yaml @@ -22,30 +22,16 @@ jobs: with: node-version-file: .nvmrc - - name: use pnpm + - name: Use pnpm uses: pnpm/action-setup@v2 with: version: 8 - - name: Cache pnpm modules - uses: actions/cache@v3 - with: - path: ~/.pnpm-store - key: ${{ runner.os }}-pnpm-${{ hashFiles('**/pnpm-lock.yaml') }} - restore-keys: | - ${{ runner.os }}-pnpm- - - - name: Set env - run: | - cd apps/web - echo "VUE_APP_PAGE_TITLE=Easy-to-Use Online MQTT Client | Try Now" > .env.local - echo "VUE_APP_PAGE_DESCRIPTION=Online MQTT 5.0 client on the web, using MQTT over WebSocket to connect to the MQTT Broker and test message publishing and receiving in the browser." >> .env.local - - name: Install dependencies run: | pnpm install - - name: build + - name: Build run: | pnpm run build:web