From bdcbb18592fef62da7ac74f7b93605747973d41b Mon Sep 17 00:00:00 2001 From: LittleSheep Date: Sat, 11 Jan 2025 13:58:27 +0800 Subject: [PATCH] :sparkles: Supports release assets & installers --- bun.lockb | Bin 302076 -> 303668 bytes package.json | 3 +- packages/sn/package.json | 2 +- packages/sn/src/matrix/release.ts | 19 +- src/components/matrix/MaReleaseForm.tsx | 232 ++++++++++++++---- src/pages/console/matrix/index.tsx | 75 +++--- .../console/matrix/products/[id]/index.tsx | 32 ++- 7 files changed, 270 insertions(+), 93 deletions(-) diff --git a/bun.lockb b/bun.lockb index ffb69751e3dabb4a42254e4c5bbb630d0087da56..9e6de21de48376528e3fa359e7b549aa956dd521 100755 GIT binary patch delta 50221 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 delta 49692 zcmeFacYIYv7d3p(y}6J>N$4RY5PDA_fsh8d1f>&tmli@GfslkG2%#mQ2qOImLsNQF zq)6|CB2API3J9nOh%^-?NZ?!R%-kgSsL%7h@9+E1`*UZ_UbAPh!rTsisu7CWvo`se~DOGAPcot0$u}p0~3MefgKSQ16v2(AGjRI zW^3?X2DlMXl>*)dQvVEC0XQG%VX0@y$Up+E%{UG#I$i^$!BnLW2Qt7u3L}iAR*&>l zlw!DBQIyrqK((kb;{$}v_Af_Wpfa8VQ7~iFh`7{f3~eep1w}Ik0y#=kkx%b!F%PN& zeSxgK2oV2e+(SrJfG2@$?s8yt_S-lVq=SuMX}Ac;0Mb#Kdu%h;&z(YXxa|ojJw4`G`BEf|c8 zQidr?@2&EO!6E0}Hwd4O`YSy-CMp{BTY5lePZq8zu{m_weE^+3oe(pUW)}C_7|3)G zPin~#y$a+29tJX?bqePI+46KC0~`WmfGM$2$w_cj1=9tckzogx2mVl3_Ruk4Ip`lL zoCahM4+FACy8wqW5rzatA)^wI6&C`s!r$u13U4Sp3FI2srf?aMflOC8N?{z3UA;O; z_Ec(0d|ZD7+Q+D1_lWyGSoT9`h?+UTg0QX&NHJ0W31B*c4t;+odo%!DI2P~734+)N1mPLlO zMPXB;Lq3o6ny<-OS^`L`2~A`*=4A4XONnVJOL+qsZg?}<*rL!`O#tkVJS|{;lS+S&_=`=oWHl9!otv!&y;ue9A~fW;urfoUKP&N^I3iIt&4FOlttyUT+{r zX(#Mh;UJVHrlh9D$Dx0Zw3c&aDR>4pRRwyrjhqu{QA6V`mRc4|-$+R$CM88Nfaut$ z_#wcaZKcE5s1)CU@lk`?8ME?xq#NyI|HP#)#Bb>x{pio9gzZuE0k{UAp0q1 zWK1;O9)r#>b^{sq1|a)0DJnJAcSuaya;47$vfrjDT--@U_bU+PD&`az5gW&C(1IZv z83TL^1qz_xD5IroouWg~TF%K-)#`4>yRJUz`QDHV@W-BV0iFhO-E9VPVJ-lA0>=Qk zaJvJsi)91@%L7X&{kI-6{~QpzU&bb2Mc`~8x5gBOU4Zlx0>nBmlTk)xyyz|i_zsBu zJL94ep?jo%f(62%UjSrZy#wTuNL744rMCidt_A^VR}siarfUGE=%74^f=3fOe&=WwG&+MiK8Ax4V zVzA3E3YMkHfhh#S z9eOQbQJ@#F2=K{pIYUz4l#%xavSr_ZCk`JWduVV9LcpxdPLzHI#V7WUichh$g&+1{ zLtruBL*$#QHzpxvXj($FWpGMjLLdsxL`E4HM4{!lK4v)gkH$lX$JL3C>hC^UwxkP? zL-Z+-0lJToj$c4$;NQX*1M3K652g%{PR6ck*<@rE^hkdTZ6=!<8FwHVj=}X4R z(hM5~EiU6_Ex%^STJ8c_&e@+s;}YVMqEb?BfM@^inIM~8^ex%EON##pI-~pmh;d2J znESRY5C`PyZ7@+GbPniI=nQ`kkQM$n`vH?=g--i+*u+>)pg{~QIVL4B{>>Q6(aBt? zm~nfNV8t7N90=@oi6as$7Hx{0IUZwW0IQ%g9~U@tWNX18_0m8tjq|W$1#ZykFMO&j zZ&7wXKqsHXZpP;<^b)vGW;{VbMtB=Yhu45K96Vh*?4KMJ9g||Q+=NcP+6-xzX3Q$= zk?uEBvd5K|13-o`G$wgaOn}AWt=?$Oh#kE3+eFee7UkF0NJ7gz+%7+KnA!( z@s5SE|7IzDAdvl@s&GI(-{{2n#N;=ib6h$Yy1P&M(GR2*a#L~pV*y4bCr71C`cU@w zI^?t8v**fMe*&`BU5jOZuL82!?*kdtI3SnpRoJl`GSPhIV;eD}DYHyYy9Y}xmfBn> zUm?MbBWAfA@LoVx=sbNpHS?%*d%B z(!K_Gj+6gtiIstcxlr~a!3s;mfGxwsG5h)LHL@jG(WagnEAKrUt(Eo%71}?N`RPEm zbQqBR-V?}vjsddbxP;i4O4Ep<`8a5^%Syb zb|XW!(7D-Jw@8QekzWP*HGphc+@OTSHyp!vZRxn3UnEak$9DqzoG#lbmK* zutNqElaiDig8+Wts22ZD8F*B5Vltb24?MfR;V#7wHr-neLgzJT{Vw#sIXjc%%(Hva z@PxGJ!~rp1p&+~T2$1=!f#rY;fLzoC_DXc-PgeHhfNT&OQ3Tj}pA2kpimy3eqmlpG==U7y&8}eJ6pJRgFGiZz`EiP+ypY93qbn$@}R8v z2=pS*Q=^ii`p3suk`77xPr#Q3|1SKL2c|bff)({f#Eg9F5qUDaepsIPK7h^wA3|pZ zFMup~5Xfcr5s>+FfSgMS@aF{_5YvD7Ao%Q}{9AyubME7J*PHu5dd4{>fEF^txdFX| z0SnxQL)y((Ejg|9eLx1d0?6ew704bN0c6FoK=wp8ApJ%F*@M|Pq>l4QI&YCu>La5t zGO7aIfHzPP4bKA$0e1oE=o4UJV7>1ozXZsknF(aqrUO~g2-vX)qJZ?{2V{9~AOpUJ zhBClopQHbo*a3nL#sWEeV}NW)bBrYmgaQi#@7$KWuhKW%k^Dj+18I9#&YiDL$cB`G z9WPpifNWUQ$QWFNlVe_}{M+eBuxq~r769&FFCF>*Bn#{W76QK!$jRwEMf<4yLO@n9 zATc^MIW8gQ;XS!5Zvp9V9sDtW`9oRH6rd+`=W(%OA_zv-21vvHk7bMNLuU_oKiu5Y z%&mW33iT01WaOnSMdqY9p9Np4 zpxI1|rAA0yhjzh8tLxB9x>zjr&7ARdg7lV3(~R+TgY>aVv$B-F30hrPS`Av>gw`0E zg__pL$ntk+X+}tZL;J!=!(Xeh6MwLWA^u&?2A}G>6Rt3qd+zmwRJ9B`7Dsu2A|p zJ=%YS7Hc#*)zB47q>V|l#71aSoSHSXxUs8VxbB73(My)ZsE&Zv+380=nUfdMJlGY> zad1x7ENESGwA;{nni}i5g_WHXjNTNhD7V}OXt{arn8>+aVqVd9L*tZ{{aO}lgOl3D z&;o~N9OrgboL{)NzewGHE>3{ zR+94*ZKxAu9|f&FXR-YRQuU3oVGU`}1m?1{-l*)H&UCdC8oRE5F+MohwTi{k3W{#_ z*#&5Aj7FhhdPh7h;ONUk@>m{ZeA8Ck6yS_dPfwL@Q9 zQ|?cixvYMJ<_|k}Lu(wQi`o`Tw;b)kD_T=u9F%hM7C`HiquqZ+Ym9BDLr&f-Xzg;e z8_-%iHLaGB73t8MBY;8RWJK$sMLRWnQOxuxW9)*4u1NHC()yWKw7O_F&W6gtG-z++ zXm@fn4P*WqCVF=xJ2K3^5UI{)>LF6tnZQK^az^a!(9p$9kh+OfTQjpx17~V1Qf*A` zcuuM$b}Gq5A=Qkz+BPGrqr>`ZkP+G`T(25zv4kTk^OB(rGj?`zXe*7ZP7dp%U?a41 zxZVPnAx>(G5fKoi31eqxUWu|gJM^NVa#otlU+ZL~b#Z75jGbK^`bFe$lr0=Rt*8;w z)uB%W!HRJG2@iIKf)>c(wLT3qo^=hkH^Y9=#K;Z_( zTx|k^?9HGxHX2=N=!!&Ln7WwZ9W-`!cj&(}6P!5>^&r%Wu7or0d_$mdGMldTJJ48> zT(OlM77MyVX}zGKACW_r0q9$_H}4Qj4b@^YlQT3=nI<52=HQ?p&CS@E;IRJE&3Kj&uJ`ON&Cw2+ zFE!E<9rj9ZU^6!M4r}OwL=R(ZVwn9BQeDhc?Ox0zHwmduX6kFCdLz})r8n*tO=<~J zxCX#X>*M4GBSo_?`%$C@nJK@%7E6qoGLY(Prhd*zb?E0Tu^uTIO8zLP-9V%yw;!o) zEUTC5pELc31mWtrGu2!qsSf-80q6uHJ2lL1i!pb5q*@}?!sKQlC37$2aAgOY*9X|e zA%*J$QX7zJWu~%_k|i49LMXjVL<(0F*qzDYJY&sk5IDYHB6Bw*CH-X~CCf&{IsHvU zN^+-=k|jI`J4^IMN=C32DQWi@DQVYeh?AR$lo_9P+(;Yk&!G~9jvW)G1sGXl99o7EGS*@LHi270qcLIja)~$%GT;6YQo+XFzG3#| zNfyfhlWQ}K-;$fTNHt>#>!V@DvvJ}2@ML)!!V1Oya2A@JnAjh*0>;jChZbpMr91Qw zQ{=qII>ef|42|>N+--EXRJrEO?bF@_T0b*@eMt2*gD!2PjW@T$@ecc<;auAY0h2sr zfF>`!cqS0&e+L;^CKEE* zp&c>OCOh;}>9W^wgE1t?-UeE2V{A;AJ{>9UT;|C@zpSj#woceHGn{#BOdDwI9h~SA zg7j6;{Gk;vv_3(4neon%r>L_?FiIK0?*LBmdstI~7D<6apa4!kX`;2rbj88q&p zcwPX1jVDUYPR%|BT4N)-Q<(k@QrHFMH9)Wbj%>Mk@2w|8W3AA5<$^|k@DA;c(y$9d zt31hh#o!D|hQ`=&`a|9}XzXd+UIYZ`zbXy$7B|8HlVuGU9rLQXbEZT80o*{?%j;L0 zcV(@(Y$pccvYj@|p`QX*9~PKiXtmoEd5w{)sXa8d2XP^iEzlT=>_zK)IoC<_PXlPo z%V%EvM?u4_Vx2Jk7*evYwKl;nQ&GKnIc|+q6SGow=QL|YA@d!2h1qiCu{to;Nzj_X4x`l>BM;314K>vXvObw@ zgf0lzs~a*Hd4tpknx8CyGwD=lvL88BjzQyML7Snuy)Rn{XDfnTp>Rz?K^K1lE!Xf? zj>cnd**Wr2i=FXleTC_Sh+|1iLPf z-2?>z4}->;g=vWevJDy=iW!38u`G02Msy9*Bcbuck34k!6qP4u&+(i*ddauQInOwE zTS1fErJW0Qg(AnFh6kWEgiCXm(4XfRa%}5=;Jp5zI{RQ~!CWu)3rM|gK4kIyFpq`a z4w|fn`{qn&oLS~AqkckZxP^Kj=f)Kddy~be*~nfIX8#c>>`h43T*7@0DQo-^ui7{$bxL$v0PQP~wvMyR`Jc|z3{g*knG)!WB60{Mh*qor&7t4%YtHZTK zBWtxo|9H8K3A@AfU{@$|I&kw0Tp_PuC>0%~kB8Par>DP$77oqa2(=bQ+FFO6wo5s|57LUn#;epm#IYt-)%0p9U7K6`l;H-c{T<;1{&i>kl1Ke zLSswK`(6DSG;Tt2TQ9pV?{1m`jg~la^bfLs3@w0{dHWrt!g)(&t@?>EYE!s%=qJXm zP2u|HPoyu{<6?FfTCkBlFHEnn-r1Yn{QE+Sgje%%koD&c#A%Q)u;(hn0t&xAs=lW8RC6M2c2& zVr^5JdGBNY6<c?$~N?lX1zdU??={nH$5$&|1KQc}=%xLz5S@knPSgsL`6Z-FUVm zT>l6pi^^xa%b|}Aq&VQJV0sk0JQ>|objBwH=qTg91cm)%I%b^$Gpqd7os~~zI8xv|qu~&gl!On)p36CL62(n(>%W0$++~-`WT;YA7$^8Lq!oCX{1`ki2A0Z{<;DA@(FAuhE z=JBjAH0HrA23$aEX*AjwW`BZIE2Gi;FstK$5tauB1pvkIuo_sA+KCH&L z$KZbVpmW^0mq$WtVz!WjFasL97K4B`U5CawAs1t{L-J`bu8|9Z^wH27AP-9;G|0N? zkg@Afxb@K?;~Btl*a$rwZtrpg#f?UXaZ`Yl9QW~fz*h1z-t&OBry$kYOdUlEcR#Q# zeAKx+AarZwQPb6OknK&wUyy2Mj6K}Y^_ZL?=93z0$}!{FXW{x8kO7DaQ?WsiZaXd? zP2)U*Ytd3@xZ#d$=!%3~f*g0h6GrHWxt@8kJq;~f_7R5I?X=t?O zt^PG=+zc>h(C6<$!=@V&X3wORk$t|QD-v>2aTUCFiSw8@j?<8m!E!q~3N5!=?U$V` z#_`@d=(6$bbh!N#Nwa9`S5BAah(KfS$_q-Nubmq6T0pCB=JC=q<`r!tv<7CL2Fo8* zIkO#l#VeRQW~(w61?j_~bu~4%_#`y0d}--^)p_Pbw^@5!HA2sa>xV$Lmj$qji(hlL zxi?a>m2hNTc+CjC5U$?fQG03 zr^BqDT{oUx4A(txMduBxG3VGu`}dlX9qMnL+P@>4^E8{_JXE% zHE1iK^)V}8TdcRyZL&J#^@OH;qDxmn!#NXOYPn%(=zd#Bt z>K~>@-F2=t*0=%M>+p(m?D-)5mz+EfRK$>^6onc-St?%D6cHIcK4*AJ=1~~GQ5qdLRfBBP~FWBnQdm;Dbc8K0X7(<{j40GGj zH$ZC#4IB8|LHY}59BtezV`v&Yz**E7yCqDYhZL{TD6>6Sdtiiq7p{N%&^Ze^#e*Li zyS@vz8jp-;--X*xKVowloe#5@c#JMEmwqZzSg4)D><5s-tVF8x&*t`n8j_IW6p`OP zd@pMEx;-3o14-D19#ZE*qChUACTgIFO5&cq;~20N45SaPNi{zU^SQ}=##bR9h!6TiC<`8;sO$DF4NNda`vs5HA@yUyJ=$Ns5 zn}lEGSy&6^r5Rm6Aj?N7><{FJNV^!kFhrdR^Fy>k21)f5q@!2}F%H6jhe8TL(jeqV zLCB9&y7Vqqc{F?AOp%j=rzXC%x33aN~u3QGZ5pbU_oyvTsdf@gp}KaKMI*2taKuiAxbBfg5FN)e~an=%|JPdQFi|?NEZX~ zhd4-~NYb`XN7|L9>9x>qEG79&+o zUSvm(R{UR~CL*nxhuI_JU`96?%ACjOfWWmGWS7 zKY`8!kyCmWkX`z|GWaXhjL1hG>9n2?D;h4uA1;JtK$cz!WHlcF@tCS=Ch$3G{AanwKML7j-#};J z-vN1X$^x2~WftNm2QhP)w&4#8x+t_OgS^O1u%P0Jth2B}cg5#L`YQsSSXAW`S+2O! zi>D(&$6V;-yzz$x%2H9tWO=3MMN*aUhxV0KK9R|4O8+OMNqS9Xm>21=7I1j`3*pRUO}VxuO4DdL9M#6 z<<}xSR$I2hjDB~qm^f7srwr12Rq4FQX?IBRL?%DOACA%qrJquG8ps873CQSf02$Ry zh2H{s9K8?ZClAWKIS*l0^azHG^NA{u7a2g7;)$&2nbL{u_vcC{GCy1Cd6E5UcR~F$ z$Oo^iupqrFq@%*nnePT<3;8BHKSc7Sl>Sdhzh1DTzp|=aIaRJ4cUYz?D&n7zGs6#d zm4Lk4+1$(Ok|Aefdud*Z3K|h623j3>kBJ-nxEEl7A zBKd(*&nFW`qu=FJ90Zz!HCUMwX+A{hM7kTQ_yi!clKJOP$Z{!)|0krs;V$Z8gM|4Z z(!rZbCvt9^mqdlk&rtb!k^Fe@Y{=UxKQFSvcN9YgbTC_?p$v&EI7jJ! zg`6Qvk)I1tEk4S=-cRe^da5TA52!2;nR$i0R?G;F4@C6M`%KvvLBVF!hsfOOay$PbYf z_XKjg=?^RnOa#(T3Xpz=16jXH{58_?n=mAfP&iUK7^U>lKvp;&$PbYXcw6a2mY)dZ z9GR;0X+S&Y-)tmUV2;9hKt{R<$O6lOjCdsw|5-l5ALg%D_$iR(w*nc+ZXiEIR=h{$ z?^k$G;Spdu#Bu_Eh+pCl9iIcT!V3y70a?M<3a=@=q3}C}KPbElWZ;j0^z$>2et!cp zpx=S~0MpHkKa{~sg*G&UhAu$1r~v=`7i0x)%8pn9dPN}ls*2Bx^j|F>`kyVU2?G+f z6xIf^OaT8VEDmf6oh@n(68uzG z!iZ}_*oFT-8U6Rk=yA*gUQGUdGWze6QA~qZpOA7l`uEA`zfVTljGA{b({QWv?~~D2pOErq?cXP(|2`R& zxAFfz8O{5I^xr3=d^Ys&lhJ>ljQ;y%^#AzD=yuN%+WRhzqdFJ2e*Nv>b_;%<+Ol`e z7Xe)Y(}Lda{ptO?F>7{}Oeoi4UGs8@dw(jv?QzfeE-!baCfD{E)6#q3jKslPBjz0$ zzbAhC{nA?9HDc^Rt+j~F)C!9WNNHK3!Xd4jD18vb#6uwd5NAjnBN2F5Yi-Te#Dv3I zS26Msm|J9CY9inWnCgeY%sGNWnz(rcg)Wn5`WXnDnDrTm$wxpuAz>F0M?nOC24dw= z5c$Pp5_d>+IR-)(OOJt=cNB#EIEaFx!*LKTj)B-pqOj0TfOtwG<^%|Lv5CZ*;~+|& z1W{B(odnVS1c)Ofii@J3gK#|wV)*AEN{UPpJ4jSH1;RrNI|U;4a}XCuc!~;NfGB+m z#KbQ^c!@J4j*$rb5=2=s{!0)ezW{NIgpcq)4Wjy&Am*F~Q9;}!ahXKZGaxF7S!X~@ zJ`Lgti7F!EEQsJUAXc6QQB6E1ap#QYCc2)}T4^=J(sLl@orQ({JS=L74(CC%I0s@Y z316XI0P&PW%mom2#3mAJ&Vwj<5rn^px(K5C1rSF_)DuN7fpEPDV)!Kxfg+Q{4iZ%^ zg9sACE`x}@1mXgT5K-YP5T!4JnD`ZlFmZ;&F%p4agJ>kie+^>fS0HYYa0ve^AgX^2 zV$Ky15#lC^%Osj!1@W4gbrrh!oll5Kl?O+yK!|Y$CDdI*5`tL39vNH$im20pbXWPNL|y zAY5;P82&AYE+Uh}4iZ(q1JO+k`wo9%zXfrDL=REndl03+12OS?5O0VxB#w~?yal4S z7=H`I$nQbiBGFg){{W);Ef8~l01+i_lDJHw>1`0vV%BXClYap5ghY&pxC0{iHi(sX zKnxO(N!%gP`y?vCptU<(c)JSTS-h4 z+HWA9l8E^Y#0;^C#F{4{O8yRFmWcWtMEBo793f$dqEA7%{tjaJQxJ1RCW##+s$_u> zVptZ4*ry;akeDwjJOfcW3&g}{AQp-R_Y**ipM1G zkmynX#Bs5-0El@y2zx;gCq;*XAX*dvv6aLrp%nu0ltfG+5MPQ-B-RuJQL-?IGa{-m zi0*|z93gQ|6mEk*3nFIV_A@g@mm=;v8l54 zwYlY>Zo`i~3bEjKrj6bFKWvD?HSwd?jsDg#nz&Ka>LTt`u zR3&XK32o?c;r|`K|W&$#`3ZHijr)7iFGKL70rB zn~Y>|TxuL2Rqok7%ilUFKOGe||KV#irT9A7vd-RTJOhlg5cTkQvSqW)Z8 zqHZ`USchL|xRFek{kZ*r!&+L`W(vf$+Ke-!4&sd8KCPv7_S6Ew=h#TRXLw26zi4%s z&(~kPlppfzkqT|Q-)=b@dtD9Ij%S_q@C~lolu-NxKn5yTX|A( zWs$C;%6<-HvK-{4Y8+oZX3~ee;=bhj%S@Mt#Hp5?R)!V8twV&2{*2-(BAp)d{LSXt3&c} z8sqbo;%XorrMRyZR})+bRk8Es>RRARDUL5%(;wd$@gT?k=iAmKeIccl;dOBMkN@_H z16-zu&y(q&=C0QlB6{qdEuGT`XrgESP4u39~`*F}e`R-Z;~!L);LnR8iJhE#!YIah;Jhj1C!gw%rY>%jJq4v_Ce zCOnnAhvZL?`;Z5ahmfDe{i{~5bpF2OSI85{Z;;<1d=K|Bo%OKnU9O&xC zkO)Wy^zo1hkhdV?AY&l>Sy-4je$5(`9*iV^O~&^r{2}Eb{CS%fBoi(ULJmU)LxwdFMTyZ;x!206e|KL3gO0A8sZJ{fs}{vy~@*&Gmx{8bCC0pOOUT2S0KwE z%ONWu+!W_R1Y|yBA>9Z|b(w?n>bb@q&G=aPZX$olwX#fd=@Wp+; z%+DA8eIeB$H6Z*A#WM&u*yoUJ$P36z2!HFvSHQoA+=kqN{0O-R>HP?qr4WP%q%_16 zQU=0Zxe(+g@()AKK+Zz;L-wNJKFEH^0SMoQUjkVQSq51SSpiukdf%}6*m>otBF5ja zdiZ9eH1})`R1?gI*C4M$_`5j%W{$tB<4^M1K{|*dH>~ZN)kCsAq%x!mq$;Euqz0rW zq!y$$gxmfzxcUR~9Fh%r0eJ~IZxKCjTFay-B0UU}48ehn|L(J8IOI*pNJv*mH%Jdi zeF#pL<`0kgb~E2)e*@SH!rzwhcV-nK6(D@cdH|#^gfA-EA^9NrA+8V|g8vIv(PB3-aY56(GE>@%Mzg z!Eb}?glvKE#}2&yje(4Vq(d?w6CiIvCPLnU@N&m<)KD5EKoTLfAij{o5F5k=(hRXQ zh49yrGa*Tkp%DIz)(=t|;t44U$p<+J+s`3iKpsJUhTMVt2pI>-fJ}i*hor(jJq9i5 z2jQE^wIO~GK9PP4as&KL$hVMNkRKqoAwNOxLmonYhdhO3LH>YbLta2$Lin|)4Z;h# zE2IFVAfynaFvN{-xVj@z1mX>83rWB@ZUi2M9D^K(gri#{A*~_&Z5Mx)R1D$c*4ACzK)FMTK=||3 zWXK0-#)pt4kfo57kbRISxaHg0S0Gm*(;;DyMi3rS9H^2%-zhGJ-NOHhlt+r+Av~j8 zg}e`$4w(U&2`K?72`L5fgz&iG1@VRygA|3NARN92?tnCg#6Si?Vj)8zRpH+UQVB8( z_LU&TA$Yet-I4@@VUT1956?W?dqe^3MF~Jdxp3o_jt%1;mJ@EL?^d65F2O&bK7;USCly}-?zn>d%KvuD^y<`;zU>TOrZchPu7=Z?vImgUa*CFBTX03;d`#lw1MB>F-6 zKsrHMK^O=_ZvklzX$pBA!sdlT8bLxKA&_7Q_lO{10OUI2<(|+KatC}}aNKihLux{5 zK&nGHcgk{iTm>UeLQY1Wr8qHn0X=}6tXwY)h!c$ym=oDKVY!aTQzw>&j6hjVa34rH zNO?#FNJU6xNL5G`NHs_;?v8aJeh@~Eng%GSLG zVMBgK01-eopfRKgguT-YLR<1JA?)Gwj*4stT#bT}z%~%}L~9^h&JT^}pm1AY2S|Ge zE9(vE0bx(|f^fLrfOLcOgs@x}2#1-KcLzH2x>_yyq=C4ZW%Y=oA7?(xutTUb?d0i$ zcB~8KbNn-((}i{B<@-YCA%nYJGn8dK{YBI>>{y49+y^-XIS9#w9DwYHyaV%TkX=ac zfUwWDL&ia3AapYvG6ymcvJJ8ok_I6^6tV@f8S*J488Qr#1la`H$f<82kpS5MSq~Wu z83CCOiGwhJwZJuyc*tr9C(J5H21G!nLlPk?A#))sAj=_3Axj{OAq@IM$On)`kcE&1 zoci;SmFwC7(gn70TWXod0WMQ^?>%yz!?-i>m`eCEe*}WvF z{25sR$I;mf>}pp2j^a7)>;aBFojZe`gfx9|Xz6!0WENy5WCnymOovS4_%r&+5O)1k z$a|0}kar<;LZ^8HbEfIoImsBv`w%vUL&Tos9O7KaJEYEraBi_N?{NItg1oJCX0jr- ziiXT*C7iiTGw;tjD<#L?pdABX`DqYm88*h88;YC5uAtE}h;#he5*DU0Td)}7bl|L% zPMF6)D71A3>eS83(IX!rk7=%sPax|cA46!D&I}f2CNoIp<(vgsF(*yle0KFL2qznT za7diMdmvonyCJk;CA4!6kF(5P za14kxPL4JVmaAkq$KRPj<1Zkr;1qK(+~#ZY$)q;_E@@e?K-=KW6a657Q*e56O$8&|Go=bJq6+nmSyrfbNbo@ zo;w`7c|C+aM?ko;oW3t0jjj0&bJja6XXZN)R_d(8>6E?kXO88_??#LFK*~efXM@1U zdzEOW*=lZ2)odN{1m9{a<+TMgo=9iJrXAn+Z0j%QtXiK2e)atDz$O#lZ`nNYElw?f z_qVXa1K*4%S1hsj-L8#=U0uIGKmP{!ca%gwo2|50KC}*xi8HdNeR3suO|eq2@b~lg z!{Z-sVc2Z-ym+6E=gk=hj@%s`|MT+e$^cb`iJLZCB);RW;{v-Lu)|aLjM1gTp2bb- zJdk!Fes$rgzZmOc^Yr4+THIj}GNydrUvF&N1cL@(fPsIwr&iBBY zD=R(x<6u``+N~BZX}4K;+HLhpAAlVm)o0}E{P@V4IgT2zLv4NmBBPM4j2LIP4fe94 z1KIq|ua~Q~=4|@cCA9EH{(b?7slBL>-{vX2^V!;Jy~L1wXosY{7N88f_U$e+VxQ!% zaWJ=fX`tN|y9*-xvzrXRztHc}LH1-v7wxT0rz<4X%RyxoYJ ziv!PWcma>-V83AO@FE2UT3xXkVEw~YTy?b#^g4}hWW)5thM)b|VZm;zHm-pm`ZB;W zUu-G|zbnM!5`c|jmX4}lCEZ2w0&rPXTyuv>gor8tXe~w)`iPH9q0#FL*vhEZYTJZ= zLF60~*)&isRHV`r^cEe8!(_OaLB~_XFt=P-D3;1D(F&PfOpsApU%HF-g>0qq1u|{K z*CkQ8YJl>bD9#i@$TLK5M29blePHLcu88^kG2=wVtG_Ke{C+uf8pe(D@|u_hJ8M=E zkx&?ZRU|3|H8_ftG5>=vWoJg<>D93qj{fL)U+;;1=FK?JJhx6|mnzAzS7fdlak6CJLu;njQ7g&sw79i}1&zgEsDl{KM+Ph+=& z$Wa@jTr&UA@p7%mh3^bPt$DBI7*l*}m64fm!jwuSeq5M4TqlJuC+|HNRDr>c65gM9 zlv&d>*Pw`qf&pIL8cn;lWpNh_yJbh7R$7qUq)x7#Tm@?Bo1^hhBPl28e>2Oo4*sFx zYCXL&>Sjr`5>&>k;iv^I7h%q9RdYox%~w3;Y;LW@Lu>_sapmQTYWU09*MD3RV9)J| z4CHVP705U6lXiEXAIQyFBpP|)O1%*V=*JAVjB$N7T<^0d*Fen~HHAbWZ(A8>z1F|T z^G?SawZN%Z9#>NYL7Uw zJbQPZ3RTysl`~M>EQ?w5>Lo|zH5M()K?W78b80Zv7|O->-VK1ndIk?w}0Z3(A@D zsi#lt%;J^u!+>W3T;9xUbs2HLysfDI7QR8|tSKz=S3nRSh_DK_$iQl~cQOoG=l2co{a8$&kp92G4 zMlMY#wMjo$+a=dv9dhvHe8$X2Yd&xG=I51ia}JAXEP53N?9L78>353h59j3?JV6e2 z*o+qMSX$Ly-QCE|aTixAqAzL)_ewU;<{`CZN58SrwR=q5+wmoGj<2ne!&zB>+se5& ze2OHO$l1vMd{Ql<4HSuR26(rUEzGMAzW*$UlCfE1GF%*6oyP$5Z=AReyTDN}V3$0Y zJo&0?^I;QQ(2Moz`Jor5tDNy)TB~(>%Q`kUXPNM=j0v<21|?DS;M3YqHypdaEZ5+q zh=PH3LyV@~Z?MDVG~?NO5tYWBn?F3)u8`OOgTP9dD(qWtudMfO)pNg?YY>JUcHP77 z*XFpj+Uk*;(*>_S!S^s2a8_OTG`@sNT-=vj@4V^T+)`D(o$K-kr5f9;63l(~G+jzVR_+E9?a|GWe zu%5P&aW2zcCU%24PpgICYwQAzr|660x zucmDs-tQ}1%T__VDeBaM%X<;>KE&(uDr?siEH{%gyZo3j<@*E#2(2DY(qn4bidAad zL|R1xx$MM8x~z056-P@ zVa^Ncf39{jM=aHB#l@$7w#qVq68QpINm23G4EU#lL>lKb?(d^bcYo@qgyqFKCK|e6;92X`uvu-Uf0>ONZr|_SNc&E5(iq^ilGZK*~9(C74$^jdSstFD;O>M_A%Yk z+Me4Vwh}11zYiv1Ui*4@1GY|IxIHS`)wA`j3mn_yn5QTOH&|tN!?#hbbP9w!=IaOC5tXP28mU zJn;wZmc!1x)VkiS+N$k|&ta!-U^j?5!7$hj12$*n+z)@Um+uz=19e6?CZdC}JuDU{ zVQ2ldllURn*2c?xCl>bBOT#imL;x=C&Lcxt5g7u9QQhP@{N!ezR*u0f--1DqUqGN= zhy`aJ7~tjTg@jD8H3a?hg}51lPOBuML$PWi#NtqMKRg#|Tc}+WiD9;S-rseXOKx|G zQpI}Dn2!rxeZP8UTVHe+`@-<}s7w!hGlrl#EO_vs@scwyaxFr{<1kd#MHFm^*iw|; z<|;0|>)x4IJlAfvaKNC!CKyzNqxWWHFWO$I=#RMu=a5qgIZyk{A6I|TiI=%Kzx5E) z8zP7jJ@Hi>EP5Xw*7WsOW6$PV1dB{K*Sd=<3}OuI%E7MlH~W`P`gMGnT)PFry%9E_ z%`o7eQFc^2?betJ8My|hky8da6Iw4Ga&K*cHn}-Jiry%S?Q29M^j{s(_jS}1g3AZT zw$_E^$!CUq+RGfP08Ww<;yP=(+Fu?aj^%GJn%x0_|U8Fu5)*zd*&L{5m7MEnuyV~>kd1fQVv=kG_QKs+BnxPUTlCt z;5cP)<*k9u{O5k1nQJf`IlSXswszd$2d-7nq0Z=5ifsDc4FjI}&MYlb_HgyP?Q#vy z3V#P;_(8M=cs*BD^e^>XclRmrTdrLZkq(2viUVY0Y7geZ3=0)DB%vxnR+@GV`68X$cM@556n`Ne08i7JxMTHjF9?wVE z`sv>$%88X@RaeIBQLe7#A@X?R*ZkY~rZqFS@07LUf@R506c3u?Qd>yWX$ps4Vt*6# zeXS&1?_l3*>&qM8^t#a{*S;Zgc>8ki&VmJ<>Ktl=9JP0~6@_0zuSCOu%f82`6?>nQ z{APV_(Fr2rH9YgoKTKW_9~~Z>wCK|3d_c`x5iEcrVg@|KdBcEJeCA#J#RqrYOG^*j zto)F}ReJB^n3W%%UA!$f=RfaJ{F7yOgabJj?uA7~9S>-$ql`bEa|hM4bQDF|@qIR-pvg`jiWgv9yYvf z!nxxq%SAeemt$uRsi)Q1^JbTOl&xp^yG{?Vgo~FL9IwAWd75>X5s}SMVb1tFYtp_E zixG*}li~7~D(&&s%U2wGcz)uEHz3f`TYSlqsiJIin@8FDmf<7h(!2TM)cWf63(qtA z%-o|)lfQRW-`Q%pT0};3n~T?9w~OQXUjkF!O6JQuQS;9HNOg`W{mP-l6Ti^PbBK{g zo(kUXqvgDNTygW5=%^K#JXSE=isd=9G!DWzgq9HdTiNV+PNLIW=A1;GCni<(Qx;5snc?k9NdVw|- zMVr>PD|=?q?6dfW0MniQhhN5Ix5gk#2)sQ;9zy3Iih4M++w{+1$HO%2en$=$%#t&^ zlFqm#OgD4t@=-xSaeWv(c!-!bwpzO1SiF`4yH#R-8yu~+iQ8=u#sN`uBy5h0-ox-! zOS?!c`13I233#M;-07Q>`}_=txXC3dTp z0)|gF=8BuFd^1$`oqvJH_i8pPfy?1yFr0Sgp}a&sbL<<4I`9@4hb-Q~maTZR(gD39 zuU?qZoU08c%AB6sqASgQU(84CJSbzlY3SDqkA1tD}YNM69v0sXZmTT zXxtTN<>xcysP3=5@awQHrCY(C--u$J9v2^vL$Ky@^%MuX+Uk4noh8@PsX~$Gdv1ML zgHH=^UB!JE+!g5tcO_@b=`$&RjSnN2f4bUq=Z{_A5+z>ihC7Ml;(9lPX?b6U`MUeY z)v41?Pr-MZbcG?hEsA$X+dIObD8_KW)NNhku73Ccj?|IEY_z9pyO_}(`}S=y2W3=W zif_AP$^GX8kdt$z$DCVP{~qX$tD-f)`zMt-Z*94-S~uq6e-_gx#4m_V%bqJTdf;N< zF6Q^JMf(4N#~hqncTPq(zVvWrqawIrk|&of|8YBN<_JeCTgiXi*u8q$!i3cqkMVP! zjnu`nkzu_MUhcDzpL*t8k^Zlrji7t~{A}dH8~^39!|47tFy~dwd_v)=nU5z*iHE&x zC2;}91vBq6iahQ4i@W;&ct%mzk~2_zy!Gnk{r~hC1-!5AYfB95FkfyRnafv>9o}Nv zZy08^b-aNbj_dR>NyT@hRNRFeF7^6&2UBpOcnyRBcem-oe4-{4o;Mr@yd+_vq>AzV z%%NHc@R|iXci64mIOyCv)*qU{j*AwTyCvdF7zA#B0cZAs!e6WzyD|Pd?jum3RyTZI>t*ZL8Jj6zs|(hW|YJICHYGM%g{*zP*@ssQ1X|Tu;)4 z?lhD&V>`&>KPU4Qwvw~R-)|Rk_{GctwqiM_JM*Db4RL;etpVqG47wa&e&Cr^9*Zcb z_-XWLW||MmJiQ()#hbinz|6fXlK1^~bRWi7zI|eO<-wO$MtBUw^PXiQeIR@U2)gq6 zuTR%xCHNO5v_UAfE& z*iNRjxJL&yR>}?in{6MvM|WJg#GI|>T|uDm!5InvEJjEy%yFOscs+zUM=@;5va10V zvNBejKtDEE)%`BT+XV7JuU%KKiZ`1LAFMO4v~g zx2}`-?cF1)?r&h#2Cox`<89>`;Sce)0PD4NqRdc4`cLu5ICh`?q5qncEt3!j8e7+I zq-EWDv1lmb*uP#*$$YndF5bmf;!Si1rUiP3!W>BX)Uk*x_!`cv(w=N zTh#{nEmzn1-)Fdcf4C<1tImeV@kE({UpYSQ;v0O+s+9&)8B73)$T920{55b#y zu9|=xeuEG*wRqUrvcv4MOJxa9sB%?AIr4wN!}MmYmhx0E-;$t5^?^?;o_!Yf&1)9z6-66A9S^QJU*lkiK%tXscHyhz4d zGNY1hWxRL5oU7@8+wHZ@HxFQcb4B8$mbpo6gt_-gSQLT9$emAu?4d0`h6Rs~7**xS zI};Y{@8G$JO;dr{7|Mbiwntc~zQ!TjJD ztqp_xE}!uo?$|b=xa!y(b`&;(9ob+?KSF226!-qwfMBQ3;|e(B!V`T<{C0Hz36MCD zXMO`(eU`&E;z}L) z)PG4YhQm(;0ydKruDIJ@DCALisECTO+_R*Jn=hy-ujwW4ut6YzEQpY`;l~Vy>LMBv zfxZ2wh$clS&l_(6fwgY)-uKy~DVI@4JTBkT?Tb~k& zj6{0=sDwhIf!>yi;nNb@8l$*NLWW@_G(1X~DUWOT*@HoB%!&xLk5)SOm#pu>sLw(0 zE4eF^XJ1-&4{8xfPO#R%?R|at)3)+ZmXqSr!Hf0Mf|shVDl3`or38Yc`owgrg|5(@ z&aS)D%^0NvT4K!OE@Zz-nfmN&r?np{#}?9StMFd!cTU7=MJZ1rllKJY*0{Crp!um5 zrnRM%y9?&HQc5Aa@%jLf+fquCS0j~mETibv>^)f-SLn6&<{RCfi$1IQnKmV8M+#o* zPyn!`J@f0xfrHgi?DJ_agf`OLm@;Ys2@yuB9{^dr{UiBfgJY7Joqn-whk0Xe8TrRT zjG!`lBNl-c2T1l^o^3fDNx*aaa*ExHYtM4(^C3>;ylh@C=N>$<&?YbhJ@ z$6$q(%I4UzK=%O;*hw0zGBD|ma#G_!#kM?U8!ox!6o^~nF(5btp>*GdKh(7I`^G}* z6jofYQfX|o4JdP&YFYWFoOUu&x63I#9(qGIvNKWoc06)4QT-lVRTG(+%pNA{vj(x@ zW8$sCyny-{*QO8T{h24*{Y(=zCjxSziGl%X2se?s4;F|sQOHJMrUH}IkzVSf)yX+m zczM$5b|x^_0P>KDcJ2dafr)(I!}YX@{6E08%0!{>A=A}^LRV05U3V(=_?-Q0kP|w& zYobDi@w17Bzpr%dJ;KJ(%$=pS8+mk&ed9X~R;vr$%;dBdumj9=Bo$Y*SRDyhZ!^8R z7E-)mrX;MZvq7N~xJ3*dd?VVu$5lZAJyDRELQ;SMdtU^kF&vOg!TWAUY?zbUm%WkJ zde-4K30PqnDr7?Rfx^{eorJ`r@iD8JhO7gZO)L9 zld=I!^nFbp)5UH;>6AVJYgIBd;g?ULFCfSm4|H)ONa|ssQgCrx4P1T~H>h>wIi4z- z^W&3JpZR{2wtal1gU~xix8g0r22Sn0G;26o@!qe?K z7!2gTt){J;;AYK$a0Y}jD}2-C6qTLBuwR)V;AQC8oToZKvV1aug@a@xoV@k9RP&0> zP_qE09Cjnzh%Sm1mX_p0nWi4U*VqW8r|g$!Pk$NP$eQ}vn_j~+giU2&@gu(mnIX`L zifk!U@RTzYy9MHjRBUH#O?<+U>GBrX>2uIy(Rpg(mlgSmz5$xrv}siATrVGjqu80T zdo9l+QTJ{SEt;Rr3Ja?jFpfJ`oIqWj6u07Pjls=gwo$dTlSSmTS~|8BImyvXjqJ*8 z?y4>ZCNt-`?2MU#Uc_^$_Ev#MyelnD#PRVL0Ap=;dg+_aHw)}oqsCaniT+hfU$A5? z+)cQ!#rj-$ypwPBNNMX<3qA(YwiLD2xx;mICkaxEJg)9QV0D2w)oNkgjJ)D3ZNFOf z;59;HC)2Umh@ow{qq=15OTUy@3V@C)jK+`Icp~CL|2BdaMG5y8-pHzO+uAPcrbQ*1 zn@hjbS(b@Kf^oOBRAEs=Wm+TiHpH713*opja4B%R2GdqNDgL8+3f>R*QL?d^mVL9&r{lEu&>jTZNECvw9wok%q4cp{Ek9Z(q1&PztD1eAPb z{>fui!mELtcVHWGTe7CFZlHO1ZcJ+6aWde3X#AA+bK6@yE*&e(7q2<~y#Sk@+S4Y{;K z2@|=8rQ&X^tFxA@3cXnxP^_4$RjB+Op%rKU@|VYj4&2yAE1F$}ct(9lot_p_2p5sA zA)VZM$7uh8KYUC$*$!HV8t|JLoNzJq>J{E>c`Bb2U7f$4b->z}7sG8ZANYO*cSyU+ zjs8}U-~I6VvFx1#+8R~`z0pcJV&g{t$iW`FnsEGtc?*Lm4#2Kb0&pLTwkP_x&fWs9 zQ8VIB>k|=M)c_wPPbKPRD_R82S#T z!x1TzJ&`=N~#lz~}#Y$I*UP{tUJG*Tsd{#hekXK*^+ zKyPKDqt#h#jX;@|gn0}?H>%piU5NUPA95ksr@KWrTmzUAnrPE*u=j7G7Jwao^b%{2X|EHmlZ$=2280I877l=cq9;~ZTfh0#Du;iY zF8+_Nuy?LHxtj+lKDlmfj-=j1GS-?TS#Vm%H!(mNWQ`F?TE3I#&e4aRY<(5azhZk> zIPyW+>(du&5^1fGwE-pL-z=$^TidqizkeuomAf)7`hmBCFL)S&mcDsU6?#Ri>JN&t zx=QJV+N8!*ogM|lwA7uo9;8XUT1_Hd_z93&c9hvw${;gRR*vG`U;mfRLD>o_3;x}} zUV50LyhsxcD8pBKw&Uet?Whsuwh>M(H~e|B$#j{pb?WuFy+7fe4d_!BjB(hrF2Ae} z_w1y3X>Qt{HD{)DwO)7l8*hMn?>{@aKKg8s^?KOCB}>DX1TXe`8UHf( zfZ~Q9s&_i5xb+>4uZ@^Pe?2QIYxaRY-6!I{Bktq6&2sv=i}%Gqnto6j-@{t!`+ND; ydZ$s&LFIJ*hC|9qJKN{;Z9h>a?k1-P$}{+Am=LZ4iG;( + assets: Record + installers: Record product_id: number meta: MaReleaseMeta } @@ -22,3 +23,19 @@ export interface MaReleaseMeta { attachments: string[] release_id: number } + +export interface MaReleaseAsset { + uri: string + contentType: string +} + +export interface MaReleaseInstallerPatch { + action: string + glob: string +} + +export interface MaReleaseInstaller { + workdir?: string + script?: string + patches: MaReleaseInstallerPatch[] +} diff --git a/src/components/matrix/MaReleaseForm.tsx b/src/components/matrix/MaReleaseForm.tsx index 37d65b5..8adb27d 100644 --- a/src/components/matrix/MaReleaseForm.tsx +++ b/src/components/matrix/MaReleaseForm.tsx @@ -11,15 +11,16 @@ import { Typography, Grid2 as Grid, IconButton, + Card, } from '@mui/material' import { useRouter } from 'next-nprogress-bar' import { useEffect, useState } from 'react' import { useForm } from 'react-hook-form' +import { MaProduct, MaRelease, MaReleaseAsset, MaReleaseInstaller, MaReleaseInstallerPatch } from 'solar-js-sdk' +import MonacoEditor from '@monaco-editor/react' import ErrorIcon from '@mui/icons-material/Error' import CloseIcon from '@mui/icons-material/Close' -import { MaProduct } from 'solar-js-sdk' -import { version } from 'node:os' export interface MatrixReleaseForm { version: string @@ -28,7 +29,8 @@ export interface MatrixReleaseForm { title: string description: string content: string - assets: Record + assets: Record + installers: Record attachments: string[] } @@ -41,7 +43,7 @@ export default function MaReleaseForm({ onSubmit: (data: MatrixReleaseForm) => Promise onSuccess?: () => void parent: Partial - defaultValue?: any + defaultValue?: MaRelease }) { const { handleSubmit, register } = useForm({ defaultValues: { @@ -56,17 +58,25 @@ export default function MaReleaseForm({ }) useEffect(() => { - if (defaultValue) { + if (defaultValue?.assets) { setAssets(Object.keys(defaultValue.assets).map((k) => ({ k, v: defaultValue.assets[k] }))) } + if (defaultValue?.installers) { + setInstallers(Object.keys(defaultValue.installers).map((k) => ({ k, v: defaultValue.installers[k] }))) + } }, []) const router = useRouter() - const [assets, setAssets] = useState<{ k: string; v: string }[]>([]) + const [assets, setAssets] = useState<{ k: string; v: MaReleaseAsset }[]>([]) + const [installers, setInstallers] = useState<{ k: string; v: MaReleaseInstaller }[]>([]) function addAsset() { - setAssets((val) => [...val, { k: '', v: '' }]) + setAssets((val) => [...val, { k: '', v: { uri: '', contentType: '' } }]) + } + + function addInstaller() { + setInstallers((val) => [...val, { k: '', v: { workdir: '', script: '', patches: [] } }]) } const [error, setError] = useState(null) @@ -83,7 +93,11 @@ export default function MaReleaseForm({ async function submit(data: MatrixReleaseForm) { try { setBusy(true) - await onSubmit({ ...data, assets: assets.reduce((a, { k, v }) => ({ ...a, [k]: v }), {}) }) + await onSubmit({ + ...data, + assets: assets.reduce((a, { k, v }) => ({ ...a, [k]: v }), {}), + installers: installers.reduce((a, { k, v }) => ({ ...a, [k]: v }), {}), + }) callback() } catch (err: any) { setError(err.toString()) @@ -105,7 +119,12 @@ export default function MaReleaseForm({ Type - Full Release Patch Release @@ -120,44 +139,64 @@ export default function MaReleaseForm({ - Assets + Assets {assets.map(({ k, v }, idx) => ( - - - { - setAssets((data) => - data.map((ele, index) => (index == idx ? { k: val.target.value, v: ele.v } : ele)), - ) - }} - /> - - - { - setAssets((data) => - data.map((ele, index) => (index == idx ? { v: val.target.value, k: ele.k } : ele)), - ) - }} - /> - - - { - setAssets((data) => data.filter((_, index) => index != idx)) - }} - > - - - - + + + + + { + setAssets((data) => + data.map((ele, index) => (index == idx ? { k: val.target.value, v: ele.v } : ele)), + ) + }} + /> + + + { + setAssets((data) => data.filter((_, index) => index != idx)) + }} + > + + + + + { + setAssets((data) => + data.map((ele, index) => + index == idx ? { v: { ...ele.v, uri: val.target.value }, k: ele.k } : ele, + ), + ) + }} + /> + + + { + setAssets((data) => + data.map((ele, index) => + index == idx ? { v: { ...ele.v, contentType: val.target.value }, k: ele.k } : ele, + ), + ) + }} + /> + + + + ))} @@ -167,6 +206,109 @@ export default function MaReleaseForm({ + + Installers + + {installers.map(({ k, v }, idx) => ( + + + + + { + setInstallers((data) => + data.map((ele, index) => (index == idx ? { k: val.target.value, v: ele.v } : ele)), + ) + }} + /> + + + { + setInstallers((data) => + data.map((ele, index) => + index == idx ? { k: ele.k, v: { ...ele.v, workdir: val.target.value } } : ele, + ), + ) + }} + /> + + + { + setInstallers((data) => data.filter((_, index) => index != idx)) + }} + > + + + + + + Script + + + + setInstallers((data) => + data.map((ele, index) => (index == idx ? { v: { ...ele.v, script: val }, k: ele.k } : ele)), + ) + } + /> + + + + + Patches + + + `${p.action}:${p.glob}`).join('\n')} + onChange={(val) => + setInstallers((data) => + data.map((ele, index) => + index == idx + ? { + v: { + ...ele.v, + patches: val?.split('\n')?.map((p) => ({ + action: p.split(':')[0], + glob: p.split(':')[1], + })) as MaReleaseInstallerPatch[], + }, + k: ele.k, + } + : ele, + ), + ) + } + /> + + + + + + ))} + + + + + + - - - - - - - - - ))} - - - - - + + Matrix Marketplace + + + The new way to release your app, implement version check and auto updating. + + + + + + + + + + + + {products.map((p) => ( + + + + + {p.name} + + {p.description} + + + + + + + + + + + + + ))} + diff --git a/src/pages/console/matrix/products/[id]/index.tsx b/src/pages/console/matrix/products/[id]/index.tsx index a5548c1..2fd4d97 100644 --- a/src/pages/console/matrix/products/[id]/index.tsx +++ b/src/pages/console/matrix/products/[id]/index.tsx @@ -1,7 +1,8 @@ import { ConsoleLayout, getConsoleStaticProps } from '@/components/layouts/ConsoleLayout' import { Box, Button, Container, Typography, Grid2 as Grid, Card, CardContent, CardActions } from '@mui/material' import { GetServerSideProps, InferGetServerSidePropsType } from 'next' -import { sni, MaProduct } from 'solar-js-sdk' +import { sni, MaProduct, MaRelease } from 'solar-js-sdk' +import { useEffect, useState } from 'react' import NextLink from 'next/link' export const getServerSideProps: GetServerSideProps = (async (context) => { @@ -9,28 +10,37 @@ export const getServerSideProps: GetServerSideProps = (async (context) => { const { data } = await sni.get('/cgi/ma/products/' + id) - const { data: resp } = await sni.get<{ data: any[] }>('/cgi/ma/products/' + id + '/releases', { - params: { - take: 10, - }, - }) - return getConsoleStaticProps({ props: { title: `Product "${data.name}"`, product: data, - releases: resp.data, }, }) -}) satisfies GetServerSideProps<{ product: MaProduct; releases: any[] }> +}) satisfies GetServerSideProps<{ product: MaProduct }> + +export default function ProductDetails({ product }: InferGetServerSidePropsType) { + const [releases, setReleases] = useState([]) + + async function fetchReleases() { + const { data: resp } = await sni.get<{ data: MaRelease[] }>('/cgi/ma/products/' + product.id + '/releases', { + params: { + take: 10, + }, + }) + + setReleases(resp.data) + } + + useEffect(() => { + fetchReleases() + }, []) -export default function ProductDetails({ product, releases }: InferGetServerSidePropsType) { async function deleteRelease(id: number) { const yes = confirm(`Are you sure you want to delete this release #${id}?`) if (!yes) return await sni.delete('/cgi/ma/products/' + product.id + '/releases/' + id) - window.location.reload() + await fetchReleases() } return (