From acf83137e19bc94737d45e213a394aa85be3685f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8C=83=E8=83=9C=E5=8F=91?= Date: Fri, 11 Mar 2022 17:22:33 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + icon.ico | Bin 0 -> 270398 bytes main.js | 35 +++++----- package-lock.json | 5 ++ package.json | 8 ++- preload.js => preload/preload.js | 1 + public/{main.js => electron.js} | 37 ++++++----- public/favicon.ico | Bin 3870 -> 16958 bytes public/package.json | 52 --------------- public/{ => preload}/preload.js | 1 + public/store.js | 20 ------ public/store/index.js | 29 ++++++++ public/store/store.js | 102 +++++++++++++++++++++++++++++ public/utils/def.js | 12 ++++ src/App.js | 55 +++++++++++++--- src/assets/logo.png | Bin 0 -> 5217 bytes src/components/todo-form/index.css | 10 +++ src/components/todo-form/index.js | 8 ++- src/components/todo/index.js | 82 ++++++++++++----------- src/index.js | 25 +++---- store.js | 20 ------ store/index.js | 29 ++++++++ store/store.js | 102 +++++++++++++++++++++++++++++ utils/def.js | 12 ++++ 24 files changed, 453 insertions(+), 193 deletions(-) create mode 100644 icon.ico rename preload.js => preload/preload.js (84%) rename public/{main.js => electron.js} (62%) delete mode 100644 public/package.json rename public/{ => preload}/preload.js (84%) delete mode 100644 public/store.js create mode 100644 public/store/index.js create mode 100644 public/store/store.js create mode 100644 public/utils/def.js create mode 100644 src/assets/logo.png delete mode 100644 store.js create mode 100644 store/index.js create mode 100644 store/store.js create mode 100644 utils/def.js diff --git a/.gitignore b/.gitignore index 4d29575..800f3a8 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,7 @@ # production /build +/dist # misc .DS_Store diff --git a/icon.ico b/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..54f784c6235517e38d9e86b0c6ef64509112d196 GIT binary patch literal 270398 zcmeI5d5~3gmggzQayllQu9=RGijIl?!ztyWZwYfMAM-jA0Pvn_TSFm_6O?9X9@C6@pwV%7Q694^MRd$_-)|O zm5UbyIo`NmkP}A_FGNl@H~tcVU58;FWWf5D>0$aGZ5f5`YmDw|jP7fU?rWR}yF6C` zGLUKC?fmIK{fFI?VZ<4*{$+ZY{?q@6cX>`8GLUKCQ=PvpAJ)v9A_yKE(0J?0avx_} zn+1v1w(Ot!aSrVATtvt~rhQIz{`8;z!|uy4WCl|8FVo+r|MWlPF3+Ds1~Tn) z==r;AhSwwJeukPk6Wuk$F;_<*C9sUghyBfnR%s^=WjBlMjJ#=4Vvpnd&#^}Dr=)T72zQ%?258c-o-Pai1*BIT` z7~R)63wL=g5@f*ol5@lKKdnU+{RcS;Aj~=6P5tg``?LNJT^7*)0+1e7G3Wia<$)Qt z#|!aZ0*&qU0<{aK3vzhJ20?DzxGqR&;j(-Jr;arWVy_oI>Bjpw>iPu8v4)ARUl60E z;a{BuU{_?Afeg@p|NTVhzQ*Xj#^}Dr`Th^x*O>liK+*_jN&o48vNDYRM<`zwOq%}F zfBK&VB4%h2^4`KsHp(5v1j?J3kI2b14_cUAuZkkmC*Rc>zG& z^}%{hFd4@hTHW!0HclLEd>qM;1_e9YAV2bbJpE5zDxv!tqx%}u|J*J*^4;&C^`rmv zKer7IxAZ}N>qpa z+-X7Z*oVfxYXS7yfMmx45{x^2tYIZ`^nk4eLj~|DOKS|6FrAmE}#hzv~tk39@m?96@%iDi>ta(o#X{ z-0zWeFJIW{+48_n&%UqB-haHac9|gOPqhl-w=MgJPPa4(5_f%YvmOILl3yQSuQ#;E z58V02D#VTdKS(P3KEKMB8l(Ffhh3g@|DOK)%OrGPWBQ+4 zrAoT}p#T2&6|?@wxB z2(qDawjkT8=L@pV-J_3$UEZjFZ_5XKH=)KWOTO^2y3Acq0PNjRBgn<`X9e-wm-(UV zSFZ|kyzzkR1H?%A`e1WSfP1F6d;S38e;$E7KH!GSk=EwMyOC&Z%Dt(F^@0BT+Yj_V z=DwB#^gp}H1p4pyH*7xWKmE^ckh zj|hBw_M{;8`Qh%~e|=_n4Ab9F(4SBF9)f^r)Vc9(xMK@Fk(14b??kfO-tbG8st?vb z>npmiF}klYy00<1ud$sTy05XFf2zx$>F?8ja9_&-`X6565K~Ci2kW2pmHzwt12(_( zpZ|IkKNYL`+`gmJD)Gqv55PN*UzR#dx*Cs)(UvuZ@fvArUe0Sr9ASaF< za_0bJv^E_QBm?dLpgu>dTc#LC505$toNj6Sk4Omhvf`&BR&^hIw z+WjxpVfs)1u}^_*e~q#2uQ9g$HD>!iWo6U)gCO7W+Ix*{dwf~(L_zv@dq|K$y`B(c z$cxnqlflAgq%Hj><%QY@}^;8L4MHx^w#e|`3@RS z|1;Y^p#T2k@mTk3jCH@pwtmODUt>F-^?&m6hW^w4G*tU-lL)GBSpO&YF(`lO9#8-2 zf1A8%2<-l8ukYEqVxAy)Z@?D7}- zuq_|f%$q7m^{laiY+P0*$i;JK-1Gfor2Ck_Dfd1EB<%CTGJX8e_6OWKLH9hw81DY( zM&wLu^DrMLo9;RTq(SMFCSiS{|JhaF+wBuHO#eH#eL(+N{|7nQnd9j{{ZFL~%qQty<)sAs(Z? zvRDwi{2ca|XSRK?a<+ROA%MpUG(LOcn2)f>1Fl`YEXeW3eeQXIG3@n1neN}Gd;a!$ zXeXKv-$2~^6DRm+KK!@tc?4~wQnz>HyFq@S`x?`KzfVE=%eL|KzvFd#y4~05(f{Pf z|FQ1Z80&tGvF_Ix>wb;1&9`h@9{NxJv0V_ff3p71uQG-H(|`2e9`D<`wo;JFnd1d{ z`I!d=vG?=Z{(P##1G+yf$jCSP3Syr(v~kI7_l~g`LFF08`^&TXs@a0zy9hL{DRu8N z0^B{Yf`mODfX5m&ZaKWiM-*-F&YY$_K4^ziT^84Wn2wxnZT?RPy4{hO{`-9>wDJMn z*O>mNw|!uJx5M<`e>?!|evPs2*O>Kxddn;NpI+as&(?Q4Y`-5gjCH@pSodq(kvbp0 z!}>qHKIK~bf&Le^|9EY`#+%(W{m9V%?)pBU|FgdrB<%TqdwgJE&&LFL|J7cC*z#)g zvQj~E&A)70-g@^wM#NqZ@J-1CLG1nfVUGv6YvTp6(|6~_-Ma&T&VPP*(&q)(`u$kL zenBprZV}|WOJ@YZV=EfFI^KtEAK3Z1cd!pZu&z%O)BnP*|84n$?rTi{Q)?esAJKh{ z(S424eU0fq>woKHXAaZ<)O-)BkLkbv_?~U=+hJ_`Ym9AwjoJQ>w!K3C3(J3dea}}T zhY0dQ*ZT!YcYojd|C)0i3HE=k>;K2-%(}7==4H!+wF}(y27&70@q!#XxLc4^j|Y7B z-FJeVYH`mC0FF1fdj)`#&F)x$k8u9l`aIR)^QT$_Ik0!9Ak${d5@gx3<$_$ha7vIX z=S~P>pPy=v57=S1{KFA@41oSeTc7578A1P3D^JjUjnRFL(S424eT~t5jnRFL>3@;0 z4}f*Q#<}iWwk<#Xr~hpK7j7GY{^z&<%S*l#*9~s=ct9u@Q4BKB%_waxoj|dX< ze(;S;=D6$sV`N+XnQzNu?;omN;NDLN;IROWn-A{t5&C$5JNJ+0*y64a$nf<5xNI7q zJ#o~>&TU%+nOQtrkSWt<3UX-w9zo>Vw}K?-?u&k=NAV{~6*bYJ6i`);R) z?rTi{v#aev|C6@|=znVG`{;jm`5n|=q5t&XI-Aa6*8kaE9?<{%^53?v`?>r3k*Lr2 z4{`4UK>9uXfP4O5jIr*SKSMB8l(Ffqx%}8`x>MB8l(Ff(|`IOrp%)M^gm4hAKU&KW7}V2Z2N1>_J4MjSM)!( z{eSVv`vnQ(@~!;V`v1~XzjN>Zi%~jplpuT7xcC17Vd^gaHvMHus^vk`-fe=UdOW~> z-#$;U^~k{+Nc{T-!}b5qxO)?j_x?f|g`!&Y8Ut`w)`Q=|G>wcX#>;K%U|6l#Xqk=?!zW>E;g7d&< z32OXq|3CP^Yx_0cywu(64`h0O=lqkGpK;~Eq8U;PRL>eK$dNr;1+o46REMu!y>bmX z(|WWKan}lLN8--soBIvy^#G?`{~tMZyh)H%H8p}vo<38Mk~w99oX~T2fIDI6RyoEs zcMcJmIm_KY0L++GB8a_T`26YPD-m>GV{}vFRNC?#`L3Nl{ZH;su9q+LpZ;UHK>zdG zcUxZ3fBH}V3(I*d1L%Kt`~UV!&kBOBrX#lX{op=N3WDeQH7=j_nGZbIud#jpC+=&E zv%j3N<-t04EC5;Ijt3x(yEhAxYX3jM_s_b&wQ=#>=?cVMAMh^Xo-Z&1!DkU_Y>x-n z=Xcxl`xno)3bJ@{g&?0#_)3s%TQ>`W#{x9I?52k-U%E_?{d;x@a{ff~6$IVaI33R8 zH0Xc!JK34#CjF=Xtp5wQOrZbtpZ?Q-uN=U(zsA`1*BIOW8mHl3Tiajz0oeA}7~B3D zW7}Wjd~5#?a?kWa-hBQkL9i{~k=S0(_tpzf3-bIE_X#rP<97tvyS7pgZ$I%qJF~6I zc|~7NdE3?d%s_eID^jjrxm1UoI@WLx(tKdoFOU;Q8!M1g$K3l00DC=wy+0SP_1Ad6 zdqy}iddzr1Dyx3Ud7D!IcQQuQ9r>aYvlT@6i9~oyn(i$@AX( zr2q7v^?%`%A)fc%C;g}Y^q>BFa1i`+%#`gT4 z9sfet-@5k)#u)qFYl7@vy;u@9*Acru!D&a(JKX7R_|m z2gJa81vEagXNwP?%n=NnJJ~WAIkJDtZAeSw{{M-%Z`x?`K`X96paeS;y@;vfB>3_IJ0oMH*W8JSY*8Lh|-LEn0f42WSvwZTr z_de-A{m1sdeINKI@4Wmg#aR1u2~}PLQc%|0Kv4qdyYl^N}A4 zGU?;tf{b&+em-==F(!=}B}hflBth)@?5>$Fh&?_~=Z~iBi1K7?CuYE9cev!_!5He8qoOaxf4F@ z`2{wb-~?$;RWevPs2*BI-5jj`_680&tGvF_K{U-#>9tnSws>wb-~?$_9^57zw} z``lk#56tcy4;jkm8T^RdU(smSh?u73*H`pXX6`g@Z*ACFYeb?4K81z&$5NXewn1(`N( zv>+2)9gW1-$NoARzpL?ApN;Y{XYyDNJpLGqW=s@h^5-85GUlWA z1sVO}dxFe%^G9qxce&gncKfBeKX}IhywBQ&Ukg%GGC`2zjRyp&-@advqO!$;)NR}* zNKpSjXna%Sj=Pa~gZzIv(|YW$ky9;=Q+*t3aL*e+8r^V=lSdoskP}UZ??n7_3qOSJ zYmDw|9Cmx#{liX={?mW@PyfAg0PB8@vF_K{)=zer^*`%>*8d%E7qI?k`=9Oq_Im-? z_SZPbENuI0>}&gLU%=P)*M2~(?$;RG{u*Q3U*n+pr+a*TMe*H;YtL63QaUEQd8xh= zFvk4p69k#=`rF8?FFqAy@@KAo115bsQV@GQecUK_d>j}v!u5xN@qhYAkgwb^bL8vs zp9oSq*`3b^md%+Wh`s*DwomrE>+=!3H$Y>1e6nt_JO2*gy#X3;T|U>x!L{Xr*!GY; zAA!dLG#)u@s1H20pz*<4H+=x_Ezo$KJ7<8{{+}K8jstj~YZgosA9E+l8sLVzo*p^< z?Il6xEUXfwWPYU}7cO2Bq_4mx?#lEKfu0!BLA`Pt?~5n?sx!z zeQ}NPT)oD4E?;Bpn``XaGd}R#w#Iu`Ej0MA_mAtZoBRE3f5=`>x79sA0om)`k%;VB zvsjRwD;Eml^^?6%JN=;f+w&>-tN@MYP95iC#Cz`u^2zXFg4DYEK@dFlps`&(yq6%+ z^@QGfd7n#)CJIu&&}~CNuAUbkZQb^pL2dnJL8ca!3DR(+SrGH{M1z0j{@6wsck3=%Q9s2Ko-cOK! z^gsFigkHJkePZ3OG1mPW`|5se3z&ac_iK!Gzs6YiYutflvojYYXTRpY*v1@s@v0CZntbYEk1Ut@G%V{~6*bYEl7d+*cc-ws>< z=s*1rQ~J>V*s(r!5bJ)8=|AiLFn(qGZ|Oh%$36ht|JiPAdY8}nKfvH?|GRN{HSD#s zz0VyhU4I`~z2Iy2y#5&WeQbTZ-Y>|@&paqdKR1j_9yLS|dwy_3rF&l>kZQj1UIUHo z?+>|a{t$c?fyRGw_YfeX-2DWI?Qb-!s}RIHF5`V}SvJRAV;E!J^e+T?chIYXjDG)Z zLFC3Y@nJgjXV0A%WcK_jK^mKy1-W+l;;)eO+LQZJGwy3y5VsHI)89Pry-##sV{~6* z`tQF#0NvNv^WOVJ_cccMHAeR}M)x)Lxvyn``G@XnjP7fU?rV(hYn=PWrgshKKkI+i z|LJuqm!?Ml=|BC?C1caOtj_--hP-b7yLI)g-|p4rf_(n&KtY~={9Zxq``G{3_ZdM3 z^?E{(zE8U21wiGD@q*avhrND@_i2|m)nR-6hCN?@V6A)qAW-z>XM*6h0vbof|%|=+~CDamj$_T{n`UadhN;msk!Y% z|Dg;(_cccMHKzacKliPVtpWXK{m=S8=0l-H^q>CI|3b4qw!Y5)eulU{oEx7vf3x@V z)s#&YIuD&b@b>!TZFrK;xye zr}%KsUfhhhXBuwxH7d7i9Q{BLq3xa#E1E0|4d^S1w+- zABpYxj5GtreJu;}#`Q$&LjV2S*Yn={r2mCgF3^A0|DOB$N&o48qIxr5{>J*B^?zX* zo_uXx|LkETUp#MbJ$BYC5~O0rI6(&Xd`u8L7NBvWK7X>m+20T7{;(kPCx0SH!^RbY z*!zdEuGYA{^}N-;$6qf{>U-z1dxvrvQdeGl8{+0W%aC*#?fUGfnjtlV*?6WLfb$GtN##>$c}1lhD=fgt8|zFfF;#m9kzhZ>Qy$B*2O1T9~ok4N`4 zj$nUDdi@TU+y6Y_SH2`)W%QcZ*RZ!tRS|(@uGWH0Aim%Hsw$62(o_hOhI<8C>3Of z8%8!SD;2~Z@9#iI-7)|M=nWwz{YMw-Gdd zj`wE(-PhQ-uVq1;L%IAnbYEk1Ut@G%WBMPr{oCBvasb`e*uQth525=Sqx%}8`x*!T zi@C4mK>Qr}mt+~B|E&M94bXwIo&F~iD#ymrfBH}Vb4=O@7k7PS@p2#fOnD^7`vcy6 z=iaBizV?$L{RQdY?IA%@>FY=F-RB;>Tac&j`?VmGJ{>7YdGQoMYTYxNGJG^00@c<;O zE8kteaTjv=;q z`aUDbyZyQe^5EV7Ly&FTcL-wp`@i_be-Xs(0FsRV_22)iAjA517sRgr7I#fB;_ClW z#C`v#NZNNmPB5bx@VT#LL5}-wmml5N*zW)IpZ;f5zzolv{P2=UgB5?gREd?eoFM3>_dy|8Bo`&jW~&YX2Xf{ikuy2Y&5iG5wEx7v~I;WPtw1>V9npu>Mc7vv5@2Wq|(E|Ge9&xk9&`0oT9ZZHT`| zEQ8k!+y1>h9&un@l_1`EK=1P%cYi(-_I+S)Jokto1A2E8#Gdbe;l+M}xDDm&1Kf7| zKNsXjfA%j0>D#@lAiG!26J*D#MGqslyd&_31(^ZkzLo{_-`(TWUcUg{*BIT`*#1NJ zHKzXssae*pH2rVi^+aU={mE^` zKkuG36@u(_=l7A7Wm5(DaA0piUg`d@AVXg4CP<<>KH1;i?DeQ11NuBGh;9G>`tH9M z#O*e5eE|I1L-+lYAiHbk3$kxbMSmnuc0;a4hBAQeYfS%>w+GODjnRFL?LTy1V{|=H zjP7fU?rV(hYn-9ohO^C+4AB4NzT36{{m+vfpR4hG2IxQirwYt~mjU;_u&q8q_V;c7 ze(Q>Pg6ykx*XslJ{A2mF&jtCyUC)mU?D?1={hxLB_5;}0*VxwQsSXcy*Zd;A9{ndl z%1Y-5(zDM?g8cZ$cL>t+$wvg)Q?pQz1M4bBA>MZ4Co>R527K;oSwR1NWd^#hF}klY zy00<1uQ9r>F}klYy00<1uW=OHoYQ0mybRF)o+pUyPs|wez98@P>*21~kI}!|L+*KfG5S6IfbV_YgZn%wNV@y`_V|FE z{#$*z3i9Z0ekDlX?oYVu_hU@^(pS{BfMxF3N2 zr)NLoRI)Pz^gns~pZ;g(e#@mwPX_2e{ZG%H#Hr+B1~yd8{%a(t{qNmp?|p7_=l78X zlRp&%uf^B+nfrh3!}jmreEumxY=1oL@LMlDEy&>BT?Mhr`{I+o6J$`YCj=Qk>@`8w z&YL1gP}PX_2e{ZG%H#Hr*%23)_s9tr9XY+N!&km@;;1t}W)p&n<-!jTcR$3RBl)n8a2@hD1L(fS^q>Cc@7~Tevl*cOtpDvk!QsNm0R5-`g|oMF zO>GA1D~ksrLG6EgzyGGCrGgx&TO!ETG_cccMHAeR}M)x&F_cccMHAeR}M)x&F_cccMHAeR}&aJJ- zrDX=fWq|&({tveY@z=SW0s2q>b9w*evZpr#^_4}nNKkt}X#CEaMS?6Z`BISA-1GgB z*PnY_5PUYE#=RfA$Hz!_{XVi`>Fl#edb7i+F$4LX0d!yEAismgqx%}8`x>MB8l(Ff z)BpV5-?(z#nUE708!wht02IzlhW}EY32C^#ywdJ#WAVKZ>pz-*ufJE`|*ZK(Z zYL7<*vCsdr&*K`@+dZETs41Ja5y`IXa%q@>?9KqXuW^vyLE{rSkAFk=HAeR}rvKT! zzi{dDD+BaDzqTjWh8ajD1N1+YZ1KCyKz?OlV|mG)NPR`|H6*CLA2fdVYInUp@Wt>q z1+ni3uG?e-LEdqM5Uh{MtHP8)hKd450fOqx%{M`5iPK-Pai1*O>lCyL~xz zW*}Jx=zp^8a2zv`-x;9)`MrI)cFaI38F0`0n}h_l?}NtgT~i^*>lTb{^#E|Qyn*alUH+HIt*$43 z#|$t7@fkq(HKzaZIpSZKfqcyX{m<7e%k^Rgf-^w>gLA}hFa!CTf!f7I{~1ZO{lB4V zwjf)VmkILmTm1xi#Xa*M8PNSJzx1pitLIId ziex4WoGUX>m>EF#HAeR}rvHVxUvRApBLnomFt#(-k{L*p0s5aPEBqTXP#785R59l- zkh+Q@L4w-3?=? zCoTmu5Jd*)e-v5eG?{_i$N>G%jqSvxWCl7T1ND_9k0L?s{~hjmfXK4qF9qrO@IMMN zW6Ur?_S9DW9nu-=$aydW%s}D{p!*ur|HOIXUzve?%mDq*$F0hBVg@>v0s7yuJn>u1 zKp|wnT^}?GvHgLKOXdi&u6&jtpS=BwAS+5HwIGF%L#`t;kgFL$_cf;fxw<8}+{{4g z8KD2E=ZwE#2J$5X^gmy=B-eu(2%iDh{-27t_lpYRjvorL!5tq!HZPq$6$!sYoB}hz z40Kio(0z^3eT~t5jnRFL(S40OYq>ceW`G$8p8@(GK8KtFGmxtpp#QnL<+$9;K>9P_ z%7YOG-#x>dmX-=qyQuhXB>hXoDKZ1hKxbvZxUXda{qL;gb3V*KhBH9_GrR#fduAYm z8KD0eOg?AL3}jgb-1R~aBkL=RE0Ed+#djcCw)k8eW`G$8kpXmHV{~6*bYJ5Tv*J&g z0cIe}GC=>cY=dxdn1N2r0R8X8WOG(F13wY-&wL^3@m;zkpMUh@%>tP9cZ2=~O#gU) zisPpr_4qEn8N|;&^6|b5CzyZa<8cOw<{$ZZm_fq%M?O9_gT(WXe08i_T~5cCGu9^ zd1(JdJzi%S>j%frKl1U;xuo-teEiL_@8%{*u>L=kjp-R5U%lVC%X$#sr9FeA^C~aP1_v14cVO@yfY*{;+&e zk8fw~+U6hG_#ZZKyVEa>@$GKj9|VYS{P#OplIiFB`0sbHB { + win.setOpacity(0); const [x, y] = win.getPosition(); if (flag) { - win.setSize(500, 300, true); - win.setPosition(x, y - 300 + 75, true); + win.setBounds({ + x, + y: y - 300 + 75, + width: 500, + height: 300, + }); } else { - win.setSize(120, 75, true); - win.setPosition(x, y + 300 - 75, true); + win.setBounds({ + x, + y: y + 300 - 75, + width: 120, + height: 75, + }); } + setTimeout(() => { + win.setOpacity(1); + }, 300); }); ipcMain.on('pos-change', (event, { x, y }) => { win.setPosition(x, y, true); }); -const { getTodo, setTodo } = require('./store'); - -ipcMain.handle('get-todo', () => { - console.log(getTodo()); - return getTodo(); -}); - -ipcMain.on('set-todo', (e, value) => { - setTodo(value); -}); - function createWindow() { win = new BrowserWindow({ width: 120, @@ -39,7 +41,7 @@ function createWindow() { frame: false, transparent: true, webPreferences: { - preload: path.join(__dirname, 'preload.js'), + preload: path.join(__dirname, 'preload/preload.js'), }, }); @@ -57,5 +59,6 @@ function createWindow() { } app.whenReady().then(() => { + storeInstall(); createWindow(); }); diff --git a/package-lock.json b/package-lock.json index 200c248..66587cf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4713,6 +4713,11 @@ "whatwg-url": "^8.0.0" } }, + "dayjs": { + "version": "1.10.8", + "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.10.8.tgz", + "integrity": "sha512-wbNwDfBHHur9UOzNUjeKUOJ0fCb0a52Wx0xInmQ7Y8FstyajiV1NmK1e00cxsr9YrE9r7yAChE0VvpuY5Rnlow==" + }, "debounce-fn": { "version": "4.0.0", "resolved": "https://registry.npmmirror.com/debounce-fn/-/debounce-fn-4.0.0.tgz", diff --git a/package.json b/package.json index 7562c97..becab88 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,7 @@ "@testing-library/jest-dom": "^5.16.2", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^13.5.0", + "dayjs": "^1.10.8", "electron-store": "^8.0.1", "react": "^17.0.2", "react-dom": "^17.0.2", @@ -22,7 +23,7 @@ "eject": "react-scripts eject", "make": "node --max-old-space-size=8192 && electron-builder --win --x64", "electron": "electron .", - "electron:build": "electron-packager ./build TimeCat --platform=win32 --arch=x64 --out=./../out --asar --app-version=0.1.0" + "electron:build": "electron-packager ./build TimeCat --platform=win32 --download.mirrorOptions.mirror=https://npmmirror.com/mirrors/electron/ --arch=x64 --out=./../out --asar --app-version=0.1.0" }, "eslintConfig": { "extends": [ @@ -49,11 +50,12 @@ }, "build": { "appId": "time-cat-v0.1.0", - "productName": "timecat", + "productName": "time cat", "win": { "target": [ "nsis" - ] + ], + "icon": "icon.ico" }, "nsis": { "oneClick": false, diff --git a/preload.js b/preload/preload.js similarity index 84% rename from preload.js rename to preload/preload.js index 1bbacb0..c020099 100644 --- a/preload.js +++ b/preload/preload.js @@ -4,5 +4,6 @@ contextBridge.exposeInMainWorld('electron', { ipcRenderer: { ...ipcRenderer, on: ipcRenderer.on, + invoke: ipcRenderer.invoke, }, }); diff --git a/public/main.js b/public/electron.js similarity index 62% rename from public/main.js rename to public/electron.js index bd4dec8..9b95233 100644 --- a/public/main.js +++ b/public/electron.js @@ -1,35 +1,37 @@ const { app, BrowserWindow, ipcMain } = require('electron'); const path = require('path'); const url = require('url'); +const { install: storeInstall } = require('./store/index'); let win = null; ipcMain.on('size-change', (event, flag) => { + win.setOpacity(0); const [x, y] = win.getPosition(); if (flag) { - win.setSize(500, 300, true); - win.setPosition(x, y - 300 + 75, true); + win.setBounds({ + x, + y: y - 300 + 75, + width: 500, + height: 300, + }); } else { - win.setSize(120, 75, true); - win.setPosition(x, y + 300 - 75, true); + win.setBounds({ + x, + y: y + 300 - 75, + width: 120, + height: 75, + }); } + setTimeout(() => { + win.setOpacity(1); + }, 300); }); ipcMain.on('pos-change', (event, { x, y }) => { win.setPosition(x, y, true); }); -const { getTodo, setTodo } = require('./store'); - -ipcMain.handle('get-todo', () => { - console.log(getTodo()); - return getTodo(); -}); - -ipcMain.on('set-todo', (e, value) => { - setTodo(value); -}); - function createWindow() { win = new BrowserWindow({ width: 120, @@ -39,13 +41,13 @@ function createWindow() { frame: false, transparent: true, webPreferences: { - preload: path.join(__dirname, 'preload.js'), + preload: path.join(__dirname, 'preload/preload.js'), }, }); win.loadURL( url.format({ - pathname: path.join(__dirname, './index.html'), + pathname: path.join(__dirname, 'build/index.html'), protocol: 'file:', slashes: true, }) @@ -57,5 +59,6 @@ function createWindow() { } app.whenReady().then(() => { + storeInstall(); createWindow(); }); diff --git a/public/favicon.ico b/public/favicon.ico index a11777cc471a4344702741ab1c8a588998b1311a..d07ecffcfa232b31c8b5cd9fab0109aaafdf1ac6 100644 GIT binary patch literal 16958 zcmds832;1Qz=&}03zl8LdAVOZlcJlLPBZLYTMXsQ1P!|{CI-(QAZ-eV4O6(M*O=8oLN z5VX~nTZ00O3=W{ZsRkXb4e_0AO+Wj-vGemJMsp=4CUZB0P znmIt{^G3(6=Z#ChPae#{J*^FKz~>o}UU(ekgUbAL487=E5Dx>rUC=aEp{uQtIjHGq zY53Lm#lbXebNB+owuUyLjtfLXSpg;{#^=pL*YhS}3!Nl8TLlkZotnl!`>uH~#5AAp z%tJQePb1$@po)a1p=w?njE#AK!TT>t8*rjBwPaj4L{0aW9 zC`gJxNm?v&X#JCI=90oU&^nnO?upE3UsM%jV6eZ}EFQ*3M+tweZapy20a_Ozc_0oH z+P0?U*5JVq3uEW`uAq6pbLlvCuK8a$o!lp`6%!}s>VfQ&dB{l!7V9PZi29OTj1CXZ z$-|4@PO%=)S}>&pQWuP5F7dLxv#sHc`Enu0DrHTM3PG+8*t`A{oZ7t+yS`ijAE&dZ z%2Jv=|FSPBnFn?JJze}nder#r3C71pXXRmXVuI$s9@>`rx$w*T+RoMn=Wb2Y-&@Lq z93$&DV@wJ2!r?8eaAN0r*zMmUfPAT895`Uyu%RmrRz z43WL?T4II{NDhR3w71kNTI;J<^>#jg%^WUxT&&l{sWHOtFC5w?@H6(a`!q-WQQ?zi^oJ{_8Jh%st~jw*5;u9Nj7Gq$nlIs`#0Yd|G2!2RL>z6+d#GrSk>m z*#YCGGy((N8cYuL2wqtiBrgpsnuNOb%#Xg&r8hMW$?l=fAh373C#Q z5gZl)zkp!W*Hi*yFQ&y++Lp#2a(r`;?B3Ad8{)SU{%7QjP_AJLFw|9S4(x zr27qU_ws{MnM54)qfgty95^2R?b_Mro?-y@i5Cz5R^$Uk$={9bo8m!mkPswdgyzcP zX?nmXlrN917Yh0Bs_%s~!ukV|Enq?ms{f?>M$FgXP^m1XGfXd5{}e(&_2P187F zoj%{aAdlfcaL&e-=-9LPCfMP?$3Qtn%v`^|-) zaTTb-MNVK&Th1dnUT&^@YDy2pwZ2Zx$>y4;OEpb3|4F(~#JZqut`{)?uLs_D0}vaZ zfNrvnp7s_>5gPx3*T5U+550fMcAG-*uxF#d?t0!<)IUlnKC*`1bKF>#7LDr6cyVwX zofZ{<%(x&tdlZA(tOPuz*lMdVip) z*TqQBs_QX6KE3YB`EzGW!>1A(*}*s3)`lTo8%8M(k}*R^Tm4UE8$+3w82UcdzT$Hf zGwWV_tu!?nm4vGzJ$7n78SfLC=@9XyH- z5c;o92th)S7kqDDhwD`bxLmn}2)fVQJ){1O#~?VMT0#cJ%3LSPFRejnbRu#KXXer^ zO=VLxq8{z@x4JY<{!?|N*2Y|_v%j=%lCKO~PIH=OXrD#Nk%$fSKp5WLi>6~ZpKCMn0k9Ar_foOR!e+*ud8Uko8KUWM@3Bn%7=NmF3iJ2=oc ztqwpozntcON;eGWeYWrP+_iL6@$)5q#uw=BA~5n?^PDqI;!Mn2)nlFR3#|H_k!_pv zEv~avW+kFLJzn@fY4a>ur`Q+V_jiNSrSrJqXb&~jW|$woFKvQ3co6D^{CGbR&oEeZ zei8gbqtVzrZC~myXTxR5b;7=h@k{+@{jAK069@Y*od%skh!Z~r?ku(vxSbd8@`LeJs*{JbDfS6n=K4AI^$gkD!qYi`xR zKO`EZ&#IXcOiqlOv~f$Yb6dh=YmCXqkVa3Qa9-7#kjZ z-%_lm+S6F<%*AV}T}7q>w=W*Uo^>Bj#oJtC+(-FGQjoi_2jJkdQE=V4fPCU?eKI%9L2`s2``04!o5gHvIv*O2rhKYf-*kZE z6(_W6DEHHUXph|@UpE^s^qkeRjcu;$=*tz{v${(^Re&^acW0m?ZCFh{b4c8*rKl*)p z9(jquC{K+-868}6G>U_?xvH?K_axGz?|qU-w!rU`{O&VZyim->zt2kwdzh#9%a-uK zcFODA4ZFi)Z$aXoP44)7IW~Rrk%+4lVSZ54x-o74jbf(4*wBA69A9m5-oFv{DFQ}@ z2J;Q?TjM+7-#s7v%vBZbo!q-=PkRX~XUxCk!QOT|_O1OjHm~{^X=#rzFg%6~bv{BV zzAC4fkz*^#dqF~&tudy_@riea2VX?dJ6a)B%+JIAQr zWb6YO|G9%(adgXPSo87!(7LVL3;FWPb@<6o{|-C0ZAFaNHIz{d!TV<7*-2rde!Eai zmj0e}z{gVT++NlYE*;s9<3>K<4B@|ca0@h3FA;p>JmpRCP$va%SSW^t{+{yVW9)A&;epq(YT9S>ay%vW6Q#|w zym;_ytY7hSv}?6!Y-|$PUwiEbuvzjd{`x0>3m3a16z3^WoD#cYp<}n!?+JT_Ir!xo zUQ6*E>%e)kbK^De)Q&Z<-L*x`{oeft1^%V4ypAP5_*3lLx`A@S7?eFuSZ%GbTce*` zWiZ7%junKVY~Zlf&ZiBzYzFoj9B%_Z@{&n z>MZ49YmC|2eb8E1Y^(!}o8$dzb&{|TMZj%%lFsuU>TLU~7fAniuKf+7qav|=_W`{6 z>TB4(aSi3b@uV4Ap^$57(faZc^suwAy_Gzs(W^49Spp1A+&cBH9Xx`&|ZwejX{OLy`)-ko#Gj5J^ zIp$@1*uU{J@t%#l{c&W|`^8NKDQ#4Dwo2Y+O}wW1BHa0s1Kt}>i}Xe49jXJ;I_Gp^ zFD}!21B{b(pKBh6=-nbdY`3lvaS-pn22$ShD9V@j8iuGQcA0GGho+wOhj@+h@M97` z+dkK_YI7e@ydDFOE2qSJGaUEc_r5N4gKJ+Qx33`1?fAxom z@nvJmRfN7H@k`0JP)YknypO=|6J0&A2i{I+#6BXwTUeWyOnzPAQTi};L!K&}|EtEL z{^TcxswH+Qx#q#|R`9zcyx#LWb^I>jHPZKj=@wVrBW0fk0gEb7xjMfe+(n~q8BQgY4H)A96F&dYkh?-I~nX2_xjY+~@_ z`+OvBDS4kG!ox}UeV%{z`Kxpm<7M4%y{L85S~yXesSx|_b9A@pZmSbR|5?sGORnd0 z-R}CCgE%5$p4CVQyfan1U337=7%=TmMi|!V*a!03&-*@H=g5o+@HeBIMcd?wGV;e% zBbus>aQ++VaShv6{Sq$c4x{v8%>G3S&dh;R{Kxy{f`c;hfhl3$*uMJLloQ&cQmvX+ zw>GoOMc0h%z?nJV7>M_DZk#)U)Nmioq64yk0TX_I&WSi5C?Fn+k|X}8ZQm4C#DNp* z0q2G4gs?x#b>9?j!)s&&x`gM#{H!*KJ*!)N@m+9q_S)~55v5+qGttF}A*6T}pgj|+3 zF65F1{euBr1E5~q_?;%nil|2-o+rCuEF-(I%-F}ijC~o(k~HKAkr0)!FCj~d>`RtpD?8b; zXOC1OD!V*IsqUwzbMF1)-gEDD=A573Z-&G7^LoAC9|WO7Xc0Cx1g^Zu0u_SjAPB3vGa^W|sj)80f#V0@M_CAZTIO(t--xg= z!sii`1giyH7EKL_+Wi0ab<)&E_0KD!3Rp2^HNB*K2@PHCs4PWSA32*-^7d{9nH2_E zmC{C*N*)(vEF1_aMamw2A{ZH5aIDqiabnFdJ|y0%aS|64E$`s2ccV~3lR!u<){eS` z#^Mx6o(iP1Ix%4dv`t@!&Za-K@mTm#vadc{0aWDV*_%EiGK7qMC_(`exc>-$Gb9~W!w_^{*pYRm~G zBN{nA;cm^w$VWg1O^^<6vY`1XCD|s_zv*g*5&V#wv&s#h$xlUilPe4U@I&UXZbL z0)%9Uj&@yd03n;!7do+bfixH^FeZ-Ema}s;DQX2gY+7g0s(9;`8GyvPY1*vxiF&|w z>!vA~GA<~JUqH}d;DfBSi^IT*#lrzXl$fNpq0_T1tA+`A$1?(gLb?e#0>UELvljtQ zK+*74m0jn&)5yk8mLBv;=@}c{t0ztT<v;Avck$S6D`Z)^c0(jiwKhQsn|LDRY&w(Fmi91I7H6S;b0XM{e zXp0~(T@k_r-!jkLwd1_Vre^v$G4|kh4}=Gi?$AaJ)3I+^m|Zyj#*?Kp@w(lQdJZf4 z#|IJW5z+S^e9@(6hW6N~{pj8|NO*>1)E=%?nNUAkmv~OY&ZV;m-%?pQ_11)hAr0oAwILrlsGawpxx4D43J&K=n+p3WLnlDsQ$b(9+4 z?mO^hmV^F8MV{4Lx>(Q=aHhQ1){0d*(e&s%G=i5rq3;t{JC zmgbn5Nkl)t@fPH$v;af26lyhH!k+#}_&aBK4baYPbZy$5aFx4}ka&qxl z$=Rh$W;U)>-=S-0=?7FH9dUAd2(q#4TCAHky!$^~;Dz^j|8_wuKc*YzfdAht@Q&ror?91Dm!N03=4=O!a)I*0q~p0g$Fm$pmr$ zb;wD;STDIi$@M%y1>p&_>%?UP($15gou_ue1u0!4(%81;qcIW8NyxFEvXpiJ|H4wz z*mFT(qVx1FKufG11hByuX%lPk4t#WZ{>8ka2efjY`~;AL6vWyQKpJun2nRiZYDij$ zP>4jQXPaP$UC$yIVgGa)jDV;F0l^n(V=HMRB5)20V7&r$jmk{UUIe zVjKroK}JAbD>B`2cwNQ&GDLx8{pg`7hbA~grk|W6LgiZ`8y`{Iq0i>t!3p2}MS6S+ zO_ruKyAElt)rdS>CtF7j{&6rP-#c=7evGMt7B6`7HG|-(WL`bDUAjyn+k$mx$CH;q2Dz4x;cPP$hW=`pFfLO)!jaCL@V2+F)So3}vg|%O*^T1j>C2lx zsURO-zIJC$^$g2byVbRIo^w>UxK}74^TqUiRR#7s_X$e)$6iYG1(PcW7un-va-S&u zHk9-6Zn&>T==A)lM^D~bk{&rFzCi35>UR!ZjQkdSiNX*-;l4z9j*7|q`TBl~Au`5& z+c)*8?#-tgUR$Zd%Q3bs96w6k7q@#tUn`5rj+r@_sAVVLqco|6O{ILX&U-&-cbVa3 zY?ngHR@%l{;`ri%H*0EhBWrGjv!LE4db?HEWb5mu*t@{kv|XwK8?npOshmzf=vZA@ zVSN9sL~!sn?r(AK)Q7Jk2(|M67Uy3I{eRy z_l&Y@A>;vjkWN5I2xvFFTLX0i+`{qz7C_@bo`ZUzDugfq4+>a3?1v%)O+YTd6@Ul7 zAfLfm=nhZ`)P~&v90$&UcF+yXm9sq!qCx3^9gzIcO|Y(js^Fj)Rvq>nQAHI92ap=P z10A4@prk+AGWCb`2)dQYFuR$|H6iDE8p}9a?#nV2}LBCoCf(Xi2@szia7#gY>b|l!-U`c}@ zLdhvQjc!BdLJvYvzzzngnw51yRYCqh4}$oRCy-z|v3Hc*d|?^Wj=l~18*E~*cR_kU z{XsxM1i{V*4GujHQ3DBpl2w4FgFR48Nma@HPgnyKoIEY-MqmMeY=I<%oG~l!f<+FN z1ZY^;10j4M4#HYXP zw5eJpA_y(>uLQ~OucgxDLuf}fVs272FaMxhn4xnDGIyLXnw>Xsd^J8XhcWIwIoQ9} z%FoSJTAGW(SRGwJwb=@pY7r$uQRK3Zd~XbxU)ts!4XsJrCycrWSI?e!IqwqIR8+Jh zlRjZ`UO1I!BtJR_2~7AbkbSm%XQqxEPkz6BTGWx8e}nQ=w7bZ|eVP4?*Tb!$(R)iC z9)&%bS*u(lXqzitAN)Oo=&Ytn>%Hzjc<5liuPi>zC_nw;Z0AE3Y$Jao_Q90R-gl~5 z_xAb2J%eArrC1CN4G$}-zVvCqF1;H;abAu6G*+PDHSYFx@Tdbfox*uEd3}BUyYY-l zTfEsOqsi#f9^FoLO;ChK<554qkri&Av~SIM*{fEYRE?vH7pTAOmu2pz3X?Wn*!ROX ztd54huAk&mFBemMooL33RV-*1f0Q3_(7hl$<#*|WF9P!;r;4_+X~k~uKEqdzZ$5Al zV63XN@)j$FN#cCD;ek1R#l zv%pGrhB~KWgoCj%GT?%{@@o(AJGt*PG#l3i>lhmb_twKH^EYvacVY-6bsCl5*^~L0 zonm@lk2UvvTKr2RS%}T>^~EYqdL1q4nD%0n&Xqr^cK^`J5W;lRRB^R-O8b&HENO||mo0xaD+S=I8RTlIfVgqN@SXDr2&-)we--K7w= zJVU8?Z+7k9dy;s;^gDkQa`0nz6N{T?(A&Iz)2!DEecLyRa&FI!id#5Z7B*O2=PsR0 zEvc|8{NS^)!d)MDX(97Xw}m&kEO@5jqRaDZ!+%`wYOI<23q|&js`&o4xvjP7D_xv@ z5hEwpsp{HezI9!~6O{~)lLR@oF7?J7i>1|5a~UuoN=q&6N}EJPV_GD`&M*v8Y`^2j zKII*d_@Fi$+i*YEW+Hbzn{iQk~yP z>7N{S4)r*!NwQ`(qcN#8SRQsNK6>{)X12nbF`*7#ecO7I)Q$uZsV+xS4E7aUn+U(K baj7?x%VD!5Cxk2YbYLNVeiXvvpMCWYo=by@ diff --git a/public/package.json b/public/package.json deleted file mode 100644 index 84ea42a..0000000 --- a/public/package.json +++ /dev/null @@ -1,52 +0,0 @@ -{ - "name": "time-cat", - "version": "0.1.0", - "private": true, - "main": "main.js", - "homepage": ".", - "dependencies": { - "@testing-library/jest-dom": "^5.16.2", - "@testing-library/react": "^12.1.3", - "@testing-library/user-event": "^13.5.0", - "electron-drag": "^2.0.0", - "electron-store": "^8.0.1", - "react": "^17.0.2", - "react-dom": "^17.0.2", - "react-scripts": "5.0.0", - "web-vitals": "^2.1.4" - }, - "scripts": { - "start": "react-scripts start", - "build": "react-scripts build", - "test": "react-scripts test", - "eject": "react-scripts eject", - "electron": "electron .", - "electron:build": "electron-packager ./build TimeCat --platform=win32 --arch=x64 --out=./../out --ar --app-version=0.1.0 --electron-version=17.1.0" - }, - "eslintConfig": { - "extends": [ - "react-app", - "react-app/jest" - ] - }, - "browserslist": { - "production": [ - ">0.2%", - "not dead", - "not op_mini all" - ], - "development": [ - "last 1 chrome version", - "last 1 firefox version", - "last 1 safari version" - ] - }, - "devDependencies": { - "electron": "^17.1.0", - "electron-builder": "^22.14.13", - "electron-packager": "^15.4.0" - }, - "build": { - "appId": "time-cat-v0.1.0" - } -} diff --git a/public/preload.js b/public/preload/preload.js similarity index 84% rename from public/preload.js rename to public/preload/preload.js index 1bbacb0..c020099 100644 --- a/public/preload.js +++ b/public/preload/preload.js @@ -4,5 +4,6 @@ contextBridge.exposeInMainWorld('electron', { ipcRenderer: { ...ipcRenderer, on: ipcRenderer.on, + invoke: ipcRenderer.invoke, }, }); diff --git a/public/store.js b/public/store.js deleted file mode 100644 index 2bf4118..0000000 --- a/public/store.js +++ /dev/null @@ -1,20 +0,0 @@ -const Store = require('electron-store'); -const store = new Store(); - -function initStore() { - if (!store.has('todo')) { - store.set('todo', []); - } -} - -initStore(); - -module.exports = { - getTodo() { - return store.get('todo'); - }, - setTodo(value) { - console.log(store.path); - return store.set('todo', value); - }, -}; diff --git a/public/store/index.js b/public/store/index.js new file mode 100644 index 0000000..b9fa242 --- /dev/null +++ b/public/store/index.js @@ -0,0 +1,29 @@ +const { ipcMain } = require('electron'); +const { TodoStore } = require('./store'); +const store = new TodoStore(); + +module.exports.install = function install() { + ipcMain.handle('get-todo', (e) => { + return store.getTodo(); + }); + + ipcMain.handle('set-todo', (e, id, value) => { + store.setTodo(id, value); + return store.getTodo(); + }); + + ipcMain.handle('add-todo', (e, value) => { + store.addTodo(value); + return store.getTodo(); + }); + + ipcMain.handle('del-todo', (e, id) => { + store.delTodo(id); + return store.getTodo(); + }); + + ipcMain.handle('clear-todo', (e, id, status) => { + store.setClear(id, status); + return store.getTodo(); + }); +}; diff --git a/public/store/store.js b/public/store/store.js new file mode 100644 index 0000000..d7e2676 --- /dev/null +++ b/public/store/store.js @@ -0,0 +1,102 @@ +const Store = require('electron-store'); +const store = new Store(); + +const { isDef, isDate } = require('../utils/def'); + +class Todo { + constructor({ id, title, time, isClear, clearTime }) { + this.id = id; + this.title = title; + this.time = isDate(time) ? new Date(time).getTime() : Date.now(); + this.isClear = isDef(isClear) ? isClear : false; + this.clearTime = isDate(clearTime) ? new Date(clearTime).getTime() : 0; + } +} + +class TodoStore { + constructor() { + this.init(); + } + + init() { + if (!store.has('todo')) { + store.set('todo', []); + } + } + + getTodo() { + return store.get('todo'); + } + + setTodo(id, value) { + const list = this.getTodo(); + const i = list.findIndex((d) => d.id === id); + + if (i > -1) { + list[i] = new Todo({ + ...value, + id, + }); + + store.set('todo', list); + return true; + } else { + return false; + } + } + + addTodo(value) { + const list = this.getTodo(); + const last = list[list.length - 1] || {}; + const id = last.id ? `${last.id + 1}` : '1'; + const newData = new Todo({ + id, + ...value, + }); + + list.push(newData); + + store.set('todo', list); + return newData; + } + + delTodo(id) { + const list = this.getTodo(); + const i = list.findIndex((d) => d.id === id); + + if (i > -1) { + list.splice(i, 1); + + store.set('todo', list); + return true; + } else { + return false; + } + } + + clearAll() { + store.set('todo', []); + return true; + } + + setClear(id, status) { + const list = this.getTodo(); + const i = list.findIndex((d) => d.id === id); + + if (i > -1) { + list[i].isClear = isDef(status) ? status : !list[i].isClear; + if (list[i].isClear) { + list[i].clearTime = Date.now(); + } else { + list[i].clearTime = 0; + } + + store.set('todo', list); + return true; + } else { + return false; + } + } +} + +module.exports.TodoStore = TodoStore; diff --git a/public/utils/def.js b/public/utils/def.js new file mode 100644 index 0000000..b1028ad --- /dev/null +++ b/public/utils/def.js @@ -0,0 +1,12 @@ +module.exports.isDef = function isDef(v) { + return v !== undefined && v !== null; +}; + +module.exports.isUnDef = function isUnDef(v) { + return v === undefined || v === null; +}; + +module.exports.isDate = function isDate(d) { + const D = new Date(d); + return !D.toString().includes('Invalid'); +}; diff --git a/src/App.js b/src/App.js index 4a0724c..f2b51a5 100644 --- a/src/App.js +++ b/src/App.js @@ -1,4 +1,4 @@ -import React, { useState } from 'react'; +import React, { useEffect, useState } from 'react'; import './App.css'; import './styles/index.css'; @@ -8,15 +8,17 @@ import Todo from './components/todo'; import catImg from './assets/img/cat.png'; function App() { - const initData = JSON.parse(localStorage.getItem('todo') || '[]'); const [show, setShow] = useState(false); - const [data, setData] = useState(initData); + const [data, setData] = useState([]); const { ipcRenderer } = window.electron; - console.log(data); + useEffect(() => { + ipcRenderer.invoke('get-todo').then((data) => { + setData(data); + }); + }, [show]); function handleMouseDown(e) { - console.log('down'); const mouseX = e.pageX; const mouseY = e.pageY; @@ -27,7 +29,6 @@ function App() { function handleMove(e) { if (!isDrag) { - console.log('move'); const cMouseX = e.pageX; const cMouseY = e.pageY; @@ -35,7 +36,6 @@ function App() { (cMouseX - mouseX) ** 2 + (cMouseY - mouseY) ** 2 ); if (dis > 10) { - console.log('drag'); isDrag = true; } } else { @@ -59,8 +59,37 @@ function App() { } function changeSize() { - setShow(!show); ipcRenderer.send('size-change', !show); + setTimeout( + () => { + setShow(!show); + }, + show ? 0 : 300 + ); + } + + function handleAdd(data) { + ipcRenderer.invoke('add-todo', data).then((result) => { + setData(result); + }); + } + + function handleEdit(data) { + ipcRenderer.invoke('set-todo', data.id, data).then((result) => { + setData(result); + }); + } + + function handleDel(id) { + ipcRenderer.invoke('del-todo', id).then((result) => { + setData(result); + }); + } + + function handleClear(id) { + ipcRenderer.invoke('clear-todo', id).then((result) => { + setData(result); + }); } return ( @@ -72,7 +101,15 @@ function App() { src={catImg} onMouseDown={handleMouseDown} /> - {show && } + {show && ( + + )} ); } diff --git a/src/assets/logo.png b/src/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..b6a359e18583608b2311e982d7887a2ea7e02691 GIT binary patch literal 5217 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%0DyKXRZMln_(rkADolodn?~YlawR{ zu5H4xEfn(^p``D-qVCIzCMHiS6^d0M60b%u94nPQ+k#80?uiXQXn`OCp(q^N#PFGu zn7DLayw=>&gXYd2n8mzs`7%~1jbQ^?1n<0MD-=6}pFj1q@V@=;d=G-5aCw^9ylzZ7 zjwj+?rLgmTVz7vxdz1_@%K&WZP*WfnyjfM1drd=sM@9V=6K`ng6symDF2V&1rZ80jV(y6+aipRpBxkS z%~alYTo|T@+jey$efC8hd3_MAZ5`OSb;qo^o*Ei{zvKIMZ7@c;A;ma->x2Xw>RM2;Hzj| zvvwBWNPWT3rSyBVM&ZX%D!-C^zwf($Ez4?XP)>e zno}LklIDPt6Vb#62>=Q~+&0fj=9gS~$x`3%= zg@ROSITwms#$`n-MX~vP>%zvh&GSBEbTa=pBbnTT5ly`z5)K}8eZGZCXQH-N ztolbf;t9SZ)8Nz#65uSu_l<{F$Ed;^CLK8DWj z4cK$*TR|XK&*kHuZ~s^!qQal5=a+?xxTntS#TSpGwyqvsU0s6Qd^2}(E0y2e-CFsU zY$k6Up3D}G`98lp8VTG@@lRKEZLL6phYmi8i|5Z^*Uh(LL*GW^au!Y;dlt!58>(v> zb}CexL!t1T)uq3woDqzC>BSe2OeUeJ8XR}=XYf|8yeneNbZ+P)%JHy5ZD%kT zns*Xpgh(WY@$qq-J9ieny&K`=uDt=ur7mBjgtvB1%u_B%=Zdn=c}i22>A6nb4cB!< z_3G~1fwdcYK@8lb;c-0k#7~fHZO5K{`;p7$spUSbq*5sXO^LF;QjF7t#zsfrZRn}& z53Z^5H*H^sp3cinD9vwVA}3ItBFhrBxs@{^IL?@Y{_FPFfErwpCN!c2O`)?7glV>(?Y_ zDSu%!1JiO4(56=X3S&^3vdkhboE^sLQ!jy9{u^$42b$a3F)=nVmB$#E?>{4@QfD}O&A{?pB@juS16hkYDTth+lC9nL&#<_q79xK3Vfd5R!>NI+8-nX?Ay5kYuje+ zw+gp6Ob5Y$vM9QndVVbs#x1wsg+MTbY&tz%*;t7f`CHHP9}px7_5V}_cI?eM_B`>)?PM|nzkbpDszez7ow7LdqSVwrQ9^i&5ay3K!6 zWO<9GDG!tvS)v!HzSH5QjT`%BF*ao(wkQ&gh!Y*FX#jdoI;RT{c*jkf(AHEl>vhX< zF`g|zQhZLl_(m{I0@J$YE24mFL56txNX-0@bVO#%pQ4wedhx&Ft_aB{#WS}Xg-rxgiPn4iqaV$Q#3-I zotgZMPEz4LsFYc9QB);;vKIcDYjC~ovQ%lzL z3NkOOB0hlNE^Sug3M9qcdl-tk1>1FzO4gunZ3|i&6HA&*CT|EpR0()E*dg20|K8`` z<3yJWGIfL(tB*sM zZGckA@sTa)h=c;zv2hJHuWyCC%wA!1GB3(BAw%wq0{v|;e3s5vVcH8f- z&K8W)Vd%~zwyaMf7FpKLxe!8w)CUBJY6li}9z)W{1)OKCp8f@rDF5=FGMK^4WOy&si zJSH*rC2)S2zsa8*xvBxg9=={W>Q1~|e^1*qA+ZuE7}n8|$^4^=Bt5RF(h1jn6F(_c b76AVb(xOQqHpgOY00000NkvXXu0mjf(_rb? literal 0 HcmV?d00001 diff --git a/src/components/todo-form/index.css b/src/components/todo-form/index.css index 4032983..9415771 100644 --- a/src/components/todo-form/index.css +++ b/src/components/todo-form/index.css @@ -44,4 +44,14 @@ .form-item__input { width: 100%; + + border: 1px solid #767676; + border-radius: 2px; + outline: none; + + box-sizing: border-box; +} + +.form-item__input:focus { + border: 1px solid #6a8af1; } diff --git a/src/components/todo-form/index.js b/src/components/todo-form/index.js index 5e2a290..c58690b 100644 --- a/src/components/todo-form/index.js +++ b/src/components/todo-form/index.js @@ -7,8 +7,12 @@ export function TodoForm(props) { function handleSubmit(e) { props.submit({ - title, - time, + data: { + ...props.data, + title, + time, + }, + status: props.status, }); props.setIsShowForm(false); e.preventDefault(); diff --git a/src/components/todo/index.js b/src/components/todo/index.js index bc84cce..2f3e5af 100644 --- a/src/components/todo/index.js +++ b/src/components/todo/index.js @@ -1,18 +1,16 @@ import React, { useState } from 'react'; +import dayjs from 'dayjs'; import './index.css'; import { TodoForm } from '../todo-form'; function Todo(props) { const [isShowForm, setIsShowForm] = useState(false); - const [editData, setEditData] = useState({ - title: '', - time: '', - }); - - const { ipcRenderer } = window.electron; + const [editData, setEditData] = useState({}); + const [status, setStatus] = useState('add'); function handleAdd() { + setStatus('add'); setEditData({ title: '', time: '', @@ -20,31 +18,32 @@ function Todo(props) { setIsShowForm(true); } - function handleEdit({ title, time }, e) { + function handleEdit({ id, title, time }, e) { + setStatus('edit'); setEditData({ + id, title, time, }); setIsShowForm(true); } - function handleSubmit(data) { - props.setData([...props.data, data]); - ipcRenderer.send('set-todo', [...props.data, data]); - localStorage.setItem('todo', JSON.stringify([...props.data, data])); + function handleSubmit({ data, status }) { + props[status](data); } - function handleDel(index) { - const temp = props.data.filter((item, i) => i !== index); - props.setData(temp); - ipcRenderer.send('set-todo', temp); - localStorage.setItem('todo', JSON.stringify(temp)); + function handleDel(id) { + props.del(id); + } + + function handleClear(id) { + props.clear(id); } return (
-

time cat

+

    - {props.data.map((todo, i) => { - return ( -
  • -
    {todo.title}
    -
    {todo.time}
    -
    - - - -
    -
  • - ); - })} + {props.data + .filter((d) => !d.isClear) + .map((todo, i) => { + return ( +
  • +
    {todo.title}
    +
    + {dayjs(todo.time).format('YYYY-MM-DD')} +
    +
    + + + +
    +
  • + ); + })}
{isShowForm && ( diff --git a/src/index.js b/src/index.js index 19417bc..ef2edf8 100644 --- a/src/index.js +++ b/src/index.js @@ -3,20 +3,15 @@ import ReactDOM from 'react-dom'; import './index.css'; import App from './App'; import reportWebVitals from './reportWebVitals'; -const { ipcRenderer } = window.electron; -console.log(1); -ipcRenderer.invoke('get-todo').then((value) => { - localStorage.setItem('todo', JSON.stringify(value)); - ReactDOM.render( - - - , - document.getElementById('root') - ); +ReactDOM.render( + + + , + document.getElementById('root') +); - // If you want to start measuring performance in your app, pass a function - // to log results (for example: reportWebVitals(console.log)) - // or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals - reportWebVitals(); -}); +// If you want to start measuring performance in your app, pass a function +// to log results (for example: reportWebVitals(console.log)) +// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals +reportWebVitals(); diff --git a/store.js b/store.js deleted file mode 100644 index 2bf4118..0000000 --- a/store.js +++ /dev/null @@ -1,20 +0,0 @@ -const Store = require('electron-store'); -const store = new Store(); - -function initStore() { - if (!store.has('todo')) { - store.set('todo', []); - } -} - -initStore(); - -module.exports = { - getTodo() { - return store.get('todo'); - }, - setTodo(value) { - console.log(store.path); - return store.set('todo', value); - }, -}; diff --git a/store/index.js b/store/index.js new file mode 100644 index 0000000..b9fa242 --- /dev/null +++ b/store/index.js @@ -0,0 +1,29 @@ +const { ipcMain } = require('electron'); +const { TodoStore } = require('./store'); +const store = new TodoStore(); + +module.exports.install = function install() { + ipcMain.handle('get-todo', (e) => { + return store.getTodo(); + }); + + ipcMain.handle('set-todo', (e, id, value) => { + store.setTodo(id, value); + return store.getTodo(); + }); + + ipcMain.handle('add-todo', (e, value) => { + store.addTodo(value); + return store.getTodo(); + }); + + ipcMain.handle('del-todo', (e, id) => { + store.delTodo(id); + return store.getTodo(); + }); + + ipcMain.handle('clear-todo', (e, id, status) => { + store.setClear(id, status); + return store.getTodo(); + }); +}; diff --git a/store/store.js b/store/store.js new file mode 100644 index 0000000..d7e2676 --- /dev/null +++ b/store/store.js @@ -0,0 +1,102 @@ +const Store = require('electron-store'); +const store = new Store(); + +const { isDef, isDate } = require('../utils/def'); + +class Todo { + constructor({ id, title, time, isClear, clearTime }) { + this.id = id; + this.title = title; + this.time = isDate(time) ? new Date(time).getTime() : Date.now(); + this.isClear = isDef(isClear) ? isClear : false; + this.clearTime = isDate(clearTime) ? new Date(clearTime).getTime() : 0; + } +} + +class TodoStore { + constructor() { + this.init(); + } + + init() { + if (!store.has('todo')) { + store.set('todo', []); + } + } + + getTodo() { + return store.get('todo'); + } + + setTodo(id, value) { + const list = this.getTodo(); + const i = list.findIndex((d) => d.id === id); + + if (i > -1) { + list[i] = new Todo({ + ...value, + id, + }); + + store.set('todo', list); + return true; + } else { + return false; + } + } + + addTodo(value) { + const list = this.getTodo(); + const last = list[list.length - 1] || {}; + const id = last.id ? `${last.id + 1}` : '1'; + const newData = new Todo({ + id, + ...value, + }); + + list.push(newData); + + store.set('todo', list); + return newData; + } + + delTodo(id) { + const list = this.getTodo(); + const i = list.findIndex((d) => d.id === id); + + if (i > -1) { + list.splice(i, 1); + + store.set('todo', list); + return true; + } else { + return false; + } + } + + clearAll() { + store.set('todo', []); + return true; + } + + setClear(id, status) { + const list = this.getTodo(); + const i = list.findIndex((d) => d.id === id); + + if (i > -1) { + list[i].isClear = isDef(status) ? status : !list[i].isClear; + if (list[i].isClear) { + list[i].clearTime = Date.now(); + } else { + list[i].clearTime = 0; + } + + store.set('todo', list); + return true; + } else { + return false; + } + } +} + +module.exports.TodoStore = TodoStore; diff --git a/utils/def.js b/utils/def.js new file mode 100644 index 0000000..b1028ad --- /dev/null +++ b/utils/def.js @@ -0,0 +1,12 @@ +module.exports.isDef = function isDef(v) { + return v !== undefined && v !== null; +}; + +module.exports.isUnDef = function isUnDef(v) { + return v === undefined || v === null; +}; + +module.exports.isDate = function isDate(d) { + const D = new Date(d); + return !D.toString().includes('Invalid'); +};