From 3ffb21f8b874039cc95aa5cfb6090f0c0c58ec5d Mon Sep 17 00:00:00 2001 From: c4lyp5o Date: Tue, 7 Nov 2023 16:43:34 +0800 Subject: [PATCH] feat: change webpack to vite changed all extensions from js to jsx added proxies in vite config set up chunk for smaller distribution size remove setupProxy remove reportWebVitals --- .eslintrc.cjs | 20 ++ index.html | 13 ++ public/favicon.ico | Bin 11912 -> 0 bytes public/icon-b-192.png | Bin 6795 -> 0 bytes public/icon-b-512.png | Bin 17420 -> 0 bytes public/index.html | 43 ---- public/manifest.json | 25 --- public/vite.svg | 1 + src/App.css | 97 ++++----- src/App.js | 202 ------------------ src/App.jsx | 179 ++++++++++++++++ src/{App.test.js => App.test.jsx} | 0 src/assets/react.svg | 1 + src/index.css | 12 +- src/index.js | 21 -- src/index.jsx | 16 ++ .../{axios_instance.js => axios_instance.jsx} | 0 src/lib/{config.js => config.jsx} | 0 src/lib/{devices.js => devices.jsx} | 0 src/lib/{navdata.js => navdata.jsx} | 0 src/lib/{tasklist.js => tasklist.jsx} | 0 src/logo.svg | 1 - src/pages/{about.js => about.jsx} | 0 src/pages/{activity.js => activity.jsx} | 0 ...atisticCards.js => HomeStatisticCards.jsx} | 0 .../{SelectionCard.js => SelectionCard.jsx} | 0 .../{activity-table.js => activity-table.jsx} | 0 .../{stream_info.js => stream_info.jsx} | 0 ...mponentLoading.js => ComponentLoading.jsx} | 0 .../{ErrorBoundary.js => ErrorBoundary.jsx} | 0 .../general/{error.js => error.jsx} | 0 ...-watched-card.js => last-watched-card.jsx} | 0 .../general/{loading.js => loading.jsx} | 0 .../general/{navbar.js => navbar.jsx} | 0 .../{version-card.js => version-card.jsx} | 0 .../components/{ip-info.js => ip-info.jsx} | 0 .../{item-info.js => item-info.jsx} | 0 .../{globalStats.js => globalStats.jsx} | 0 .../{watchtimestats.js => watchtimestats.jsx} | 0 .../{item-activity.js => item-activity.jsx} | 0 .../{item-not-found.js => item-not-found.jsx} | 0 .../{more-items.js => more-items.jsx} | 0 ...more-items-card.js => more-items-card.jsx} | 0 .../{library-info.js => library-info.jsx} | 0 ...-added-card.js => recently-added-card.jsx} | 0 .../{watchtimestats.js => watchtimestats.jsx} | 0 .../{last-watched.js => last-watched.jsx} | 0 ...brary-activity.js => library-activity.jsx} | 0 .../{library-card.js => library-card.jsx} | 0 .../{library-items.js => library-items.jsx} | 0 .../{library-stats.js => library-stats.jsx} | 0 .../{recently-added.js => recently-added.jsx} | 0 ...libraryOverview.js => libraryOverview.jsx} | 0 ...omponent.js => library-stat-component.jsx} | 0 ...aybackactivity.js => playbackactivity.jsx} | 0 .../{session-card.js => session-card.jsx} | 0 .../sessions/{sessions.js => sessions.jsx} | 0 .../settings/{Tasks.js => Tasks.jsx} | 0 ...inalComponent.js => TerminalComponent.jsx} | 0 .../settings/{apiKeys.js => apiKeys.jsx} | 0 .../{backupfiles.js => backupfiles.jsx} | 0 .../components/settings/{logs.js => logs.jsx} | 0 .../settings/{security.js => security.jsx} | 0 .../{settingsConfig.js => settingsConfig.jsx} | 0 ...StatComponent.js => ItemStatComponent.jsx} | 0 ..._active_users.js => most_active_users.jsx} | 0 ...st_used_client.js => most_used_client.jsx} | 0 .../statCards/{mp_movies.js => mp_movies.jsx} | 0 .../statCards/{mp_music.js => mp_music.jsx} | 0 .../statCards/{mp_series.js => mp_series.jsx} | 0 .../{mv_libraries.js => mv_libraries.jsx} | 0 .../statCards/{mv_movies.js => mv_movies.jsx} | 0 .../statCards/{mv_music.js => mv_music.jsx} | 0 .../statCards/{mv_series.js => mv_series.jsx} | 0 .../statistics/{chart.js => chart.jsx} | 0 ...ily-play-count.js => daily-play-count.jsx} | 0 ...-stats-by-day.js => play-stats-by-day.jsx} | 0 ...tats-by-hour.js => play-stats-by-hour.jsx} | 0 .../{user-info.js => user-info.jsx} | 0 .../{globalStats.js => globalStats.jsx} | 0 .../{watchtimestats.js => watchtimestats.jsx} | 0 .../{lastplayed.js => lastplayed.jsx} | 0 .../{user-activity.js => user-activity.jsx} | 0 .../{data-debugger.js => data-debugger.jsx} | 0 src/pages/{home.js => home.jsx} | 0 src/pages/{libraries.js => libraries.jsx} | 0 ...brary_selector.js => library_selector.jsx} | 0 src/pages/{login.js => login.jsx} | 0 src/pages/{settings.js => settings.jsx} | 0 src/pages/{setup.js => setup.jsx} | 0 src/pages/{signup.js => signup.jsx} | 0 src/pages/{statistics.js => statistics.jsx} | 0 src/pages/{testing.js => testing.jsx} | 0 src/pages/{users.js => users.jsx} | 0 src/reportWebVitals.js | 13 -- src/setupProxy.js | 77 ------- vite.config.js | 33 +++ 97 files changed, 303 insertions(+), 451 deletions(-) create mode 100644 .eslintrc.cjs create mode 100644 index.html delete mode 100644 public/favicon.ico delete mode 100644 public/icon-b-192.png delete mode 100644 public/icon-b-512.png delete mode 100644 public/index.html delete mode 100644 public/manifest.json create mode 100644 public/vite.svg delete mode 100644 src/App.js create mode 100644 src/App.jsx rename src/{App.test.js => App.test.jsx} (100%) create mode 100644 src/assets/react.svg delete mode 100644 src/index.js create mode 100644 src/index.jsx rename src/lib/{axios_instance.js => axios_instance.jsx} (100%) rename src/lib/{config.js => config.jsx} (100%) rename src/lib/{devices.js => devices.jsx} (100%) rename src/lib/{navdata.js => navdata.jsx} (100%) rename src/lib/{tasklist.js => tasklist.jsx} (100%) delete mode 100644 src/logo.svg rename src/pages/{about.js => about.jsx} (100%) rename src/pages/{activity.js => activity.jsx} (100%) rename src/pages/components/{HomeStatisticCards.js => HomeStatisticCards.jsx} (100%) rename src/pages/components/LibrarySelector/{SelectionCard.js => SelectionCard.jsx} (100%) rename src/pages/components/activity/{activity-table.js => activity-table.jsx} (100%) rename src/pages/components/activity/{stream_info.js => stream_info.jsx} (100%) rename src/pages/components/general/{ComponentLoading.js => ComponentLoading.jsx} (100%) rename src/pages/components/general/{ErrorBoundary.js => ErrorBoundary.jsx} (100%) rename src/pages/components/general/{error.js => error.jsx} (100%) rename src/pages/components/general/{last-watched-card.js => last-watched-card.jsx} (100%) rename src/pages/components/general/{loading.js => loading.jsx} (100%) rename src/pages/components/general/{navbar.js => navbar.jsx} (100%) rename src/pages/components/general/{version-card.js => version-card.jsx} (100%) rename src/pages/components/{ip-info.js => ip-info.jsx} (100%) rename src/pages/components/{item-info.js => item-info.jsx} (100%) rename src/pages/components/item-info/{globalStats.js => globalStats.jsx} (100%) rename src/pages/components/item-info/globalstats/{watchtimestats.js => watchtimestats.jsx} (100%) rename src/pages/components/item-info/{item-activity.js => item-activity.jsx} (100%) rename src/pages/components/item-info/{item-not-found.js => item-not-found.jsx} (100%) rename src/pages/components/item-info/{more-items.js => more-items.jsx} (100%) rename src/pages/components/item-info/more-items/{more-items-card.js => more-items-card.jsx} (100%) rename src/pages/components/{library-info.js => library-info.jsx} (100%) rename src/pages/components/library/RecentlyAdded/{recently-added-card.js => recently-added-card.jsx} (100%) rename src/pages/components/library/globalstats/{watchtimestats.js => watchtimestats.jsx} (100%) rename src/pages/components/library/{last-watched.js => last-watched.jsx} (100%) rename src/pages/components/library/{library-activity.js => library-activity.jsx} (100%) rename src/pages/components/library/{library-card.js => library-card.jsx} (100%) rename src/pages/components/library/{library-items.js => library-items.jsx} (100%) rename src/pages/components/library/{library-stats.js => library-stats.jsx} (100%) rename src/pages/components/library/{recently-added.js => recently-added.jsx} (100%) rename src/pages/components/{libraryOverview.js => libraryOverview.jsx} (100%) rename src/pages/components/libraryStatCard/{library-stat-component.js => library-stat-component.jsx} (100%) rename src/pages/components/{playbackactivity.js => playbackactivity.jsx} (100%) rename src/pages/components/sessions/{session-card.js => session-card.jsx} (100%) rename src/pages/components/sessions/{sessions.js => sessions.jsx} (100%) rename src/pages/components/settings/{Tasks.js => Tasks.jsx} (100%) rename src/pages/components/settings/{TerminalComponent.js => TerminalComponent.jsx} (100%) rename src/pages/components/settings/{apiKeys.js => apiKeys.jsx} (100%) rename src/pages/components/settings/{backupfiles.js => backupfiles.jsx} (100%) rename src/pages/components/settings/{logs.js => logs.jsx} (100%) rename src/pages/components/settings/{security.js => security.jsx} (100%) rename src/pages/components/settings/{settingsConfig.js => settingsConfig.jsx} (100%) rename src/pages/components/statCards/{ItemStatComponent.js => ItemStatComponent.jsx} (100%) rename src/pages/components/statCards/{most_active_users.js => most_active_users.jsx} (100%) rename src/pages/components/statCards/{most_used_client.js => most_used_client.jsx} (100%) rename src/pages/components/statCards/{mp_movies.js => mp_movies.jsx} (100%) rename src/pages/components/statCards/{mp_music.js => mp_music.jsx} (100%) rename src/pages/components/statCards/{mp_series.js => mp_series.jsx} (100%) rename src/pages/components/statCards/{mv_libraries.js => mv_libraries.jsx} (100%) rename src/pages/components/statCards/{mv_movies.js => mv_movies.jsx} (100%) rename src/pages/components/statCards/{mv_music.js => mv_music.jsx} (100%) rename src/pages/components/statCards/{mv_series.js => mv_series.jsx} (100%) rename src/pages/components/statistics/{chart.js => chart.jsx} (100%) rename src/pages/components/statistics/{daily-play-count.js => daily-play-count.jsx} (100%) rename src/pages/components/statistics/{play-stats-by-day.js => play-stats-by-day.jsx} (100%) rename src/pages/components/statistics/{play-stats-by-hour.js => play-stats-by-hour.jsx} (100%) rename src/pages/components/{user-info.js => user-info.jsx} (100%) rename src/pages/components/user-info/{globalStats.js => globalStats.jsx} (100%) rename src/pages/components/user-info/globalstats/{watchtimestats.js => watchtimestats.jsx} (100%) rename src/pages/components/user-info/{lastplayed.js => lastplayed.jsx} (100%) rename src/pages/components/user-info/{user-activity.js => user-activity.jsx} (100%) rename src/pages/{data-debugger.js => data-debugger.jsx} (100%) rename src/pages/{home.js => home.jsx} (100%) rename src/pages/{libraries.js => libraries.jsx} (100%) rename src/pages/{library_selector.js => library_selector.jsx} (100%) rename src/pages/{login.js => login.jsx} (100%) rename src/pages/{settings.js => settings.jsx} (100%) rename src/pages/{setup.js => setup.jsx} (100%) rename src/pages/{signup.js => signup.jsx} (100%) rename src/pages/{statistics.js => statistics.jsx} (100%) rename src/pages/{testing.js => testing.jsx} (100%) rename src/pages/{users.js => users.jsx} (100%) delete mode 100644 src/reportWebVitals.js delete mode 100644 src/setupProxy.js create mode 100644 vite.config.js diff --git a/.eslintrc.cjs b/.eslintrc.cjs new file mode 100644 index 0000000..4dcb439 --- /dev/null +++ b/.eslintrc.cjs @@ -0,0 +1,20 @@ +module.exports = { + root: true, + env: { browser: true, es2020: true }, + extends: [ + 'eslint:recommended', + 'plugin:react/recommended', + 'plugin:react/jsx-runtime', + 'plugin:react-hooks/recommended', + ], + ignorePatterns: ['dist', '.eslintrc.cjs'], + parserOptions: { ecmaVersion: 'latest', sourceType: 'module' }, + settings: { react: { version: '18.2' } }, + plugins: ['react-refresh'], + rules: { + 'react-refresh/only-export-components': [ + 'warn', + { allowConstantExport: true }, + ], + }, +} diff --git a/index.html b/index.html new file mode 100644 index 0000000..3e25e38 --- /dev/null +++ b/index.html @@ -0,0 +1,13 @@ + + + + + + + Jellystat + + +
+ + + diff --git a/public/favicon.ico b/public/favicon.ico deleted file mode 100644 index b93b3f713da8e2fc701c4c328c9a3e52a6d3eae7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11912 zcmXw92RzjO|9_ve!%>2;_{XPDld)(vmx$%C#U$5tDyNC!ZA0#;N15k|qr3W5Ed!PnqK1m#_>X(PyWYRI7btAh_SZc)7gdF5k5i0Rj1tlL z$4U|Kwd#J(yEOr_i*6LWWJnd`RpXuDJs)o~71xAr??eAYt*eOkWW~sq=oU}imu_SJ z&sQeM=x+5OHH~UK>VxI{yv?!;N1ON5%@mgn@IGct%W^aWo{39O=5P7jMCj5+eQ1zk zlrJ-vW{Ke}>lItGRcl^YfLe+RFT-{M$lltsE6iIr0yvTLNcvkH7MqPaKFH zhedV&?8AtEPMmtyt&h~KnTD149VYkmT$8QzFnfHcbx$e?n7^D#?ncf(UQV_uvZNfX zMy!^b#ycv10A`w=x(uPYQ*pv+k@A<_wc^UnYM#BK{^dr&+3@TO)(o$TKb;IJ=0raN zGKjyT3=En-ZOmAfMP*-07t}D18t?fW`8p?t8h^ujO&WiV=l1^0%(ys*H5n%2={7{W zuJ|&H_|d%V=~$R+a+KEY5lTDSbB8bD?akg!PH=L%;1WHIWw8+mubTW`FQYo9vUbA+H`S|?EMIt}AEoAM&Q{9L zZtaS#7TD}xl(C$j?=j@qjxRf)Rg3R$*%J5^9M*_ye#||dzt|t>7gbk=Rl(+mN%NwH zgMWyfj5)a|!!s%@bN|hyNGvg%^7snWJzBPnU$|Vs`GWk%RN{i@u^4oxa7p;&B=S>~ zjZ*vhopW+m`|XfM?FE({BRKmm49qF4EAew}O@nA!qoQBNk_ZZYKX@~NBh?WWUSipS zHj7$aoWvLzjR;lpd)`dTF~1a21(_Q5Y2055JGJoCNsHPpUqW!}xG!ST{oDHK`y`*v zFsppBkHZM=t1cEhyw+FJ^75UOSSsY`ZTe<;W$gM$A*bvUzObUa%b&Q&0vpO}<`WdV z2YX&<;maf3?>anQYs~#seE-Ik5ipgSVBrK&GZ%Li_EZ1d-J&W8p`*H z#TXyFa$CB&^>%aD5JM`J%8i|Cauns6f2?Ej_|5VbZ9fg-%8IRom5r}P%@k{ho6RjA z+!;FvCu6@U6JE#I{;~W?7TSDJo16NrC!vHjX!B*b*zKOx_iJN4$J1RG{q>FY* zc8?r0T8}nRVJKjDZNkyY6K!sU$|rp9G-o8NeLNag{Kv2SGZisw@oUKcj>`%0%N=66 zjoSN?e<$biIxLHA4Md*v5N;~y+O5$+%Kfc;y1baaqNz@dOJ2c;Mc7WhA304X#U8$y zl_}LyFkOS*jUjftv*A%3<>hPXRmch~^LMpuy{?bi_TQN>lif;x>YKMQ$uSo{)pdk- z9Slg@fM_!JH;xCFSmoc|QT(Z}1KCNjvI2H%kE}8N?S^ee6&Cr#B>V_NeO6%cj_cjd zb8WkS)4xLJU_;?gr+i`SrXJs~DqnKMYb|UT;u(Ns@-f(thhU6?yKa5$vGZZ;R(cM> z9huFR;_TR~4!st0dVw8aD_E`l!K|nI@1s%@1P3IvI%$kwmm9YEOD$5e< zoKcWrQ!rQLW>Urp=-B|}N;NUtg+D4VegjO#gZ-vc)V!_p6?W}rDd1jASC^5e>P?hc zXCw^+5aMwU~-(XG@SRF44e!6))z(sQi))u-m9e|Xu0 zNfU)6+0$^WSCH-`HE2)j?xY6L%A3NU!*7XGqUm=MiI{HwguutEp!zkCAhPZYX5P?2 zuF-)k(S9UhUF?fykl-XOXix5rb1r~U+PpGJJtEA|0ge^XdF|HTplcl-kZKYVLx@c> zwD0T(P#yPiYU;Sc_^6rKK!N+n$_S!Rk$Y6uX9J5_J3e@jXtMm>leSB)&bExY7c>Q( zgG!Ht{>QM_12Cz1dLj4SEorUxA?-#LAiJ%=unt22x(<;dp}oX#HW2VNRERYc*rB_O zj=wR3Q@P(|sRh$=65wyqc{9}Ath^c1j?4rP9`JTOlyk=Kl;R}v;R|Hy(P0N2P;#xm z|I3R;8Lik8(*OhGeBi`uNt_tCS8fvTEBK_|heX?r--AaUH0TG{YQyoFV0e9&n4CW` zx2{>GN5afnjS`*n%3XA;Rpht})=Fk~m27UEdt%P(Kk}=>pF`}N!o}KLgSNGq{UTS% zLHf07f;Ks>+Kp(DEJ|9$2~1l59#L%o0JYFN1A_j{66K^vY-6pTli?iMEbBDeq=avG}^Y8#~% zYZAgr=WX(qks;)3Cn`k5iG@eeV~m!F=8+AZK5 zh$ZtD^B#HqB)(9Nj8Jt#DkLaD_k{-F+Eq;px++_%ckF@-EVdb|9 zx!Tr0H592qRPy_&4vTq%*|Q03uV+B!)R_xHmLTf1tRo1ZJ}RaQ+7<-GfzaN9CL5?# zZM#M&{$EcY+*6M04;-pUgtM^@Rj za&ks|$3PBb&Mv&d`8a7#z2o0v5NJ!fa_E3_B%#)+oC>jfJQWG82WYkZKXyQjD}?TZ zEr{ZT(eg~^inx2(K$1ml+SX}flXnsY?!5F6&*Ms*8=~lp>@FY?HB-B*sLp{;zbD^Y zdO7pqMzsUcipV?}d!~0v9#AN5Uh!J&wuM57$nhpD4r=#&@%ki-FGT}oI>`=m8X_Tc z-pu*Ab(8>!ogJu!&@W3rCS2pf6uGgQma`M|n&A}a80XxId<(l~XAR*4_gdK| zskq9`dDt#(`o56?maefMRwe>s78NPfHP$O6rX0k@h>G!w4^6mY?q~*T@)N$-`C&3! zuK_!O5#PpVO=MY`x6b4WoJ%hNSDr@<=nt&F|3pRCs$zdVWT6%-Ejw5dy|TXvTiu>F z(vM+2DY2J&t&0cp9WW*7kw^MF~)k86Nx)~(8-IAqc zCM8-f681SCmna376RPeMvM8gBsGqGg(ucMb6+*nNgQkuJ0LPdYg;d*KSIG3nN_Dkl zyl-B@;H-wj)@Yb?rxYGjM1Vg^E2doOzG=VfE!oMM*-4q%DZAY!NWFR7`S|tB5e6A` z`|C66dn?|+uBQ0tZ;bzZy1j?xQ(=Ft4lO8 zsqp1s)KI9VUGAxmC6AB!s^d#wH~3?~c8D$zU@e<1-_ldf73qJ^~ApHV9fU9NW;z(=QGfH(VxOME{hVZ|5!Ct_ro(u0bZ(v zhAW$rZ#U7xwlc>c_s7ogh@hfsh?xBi2KWi3_bWF6nGG}@Aoi>5*;ry=mmQVH>Iu8Vm@;^ z#n-^2SoTQWYz(EY^aQ5)h8uA?<9y%l)H$O^k5~y+&>=O6^8|8KsbOm~<+sWHD-iXX zprJ*N?h8BR>>y>KlgcLXTFfhl_#(V$#?dq0aFD_MNXt5DT4tCE)Q!!(S~{N*+kOz# z%jcR@cEH0)QK#8qQu5Vju(FM0NXvb*y7ekBMvWJ>lO=na(qKsz*M+xl^yW>bYeKGZoLG1}p2^+_=U;GW4hS zt@8^tm#d{a^ll>8Ms=2)Pjqs8PPz?^qq07*l3yNzm%_ju0hkhk{v8zaI!nOKn9c=Z zi__$yvSc`N%Rk^rjQ%rk+ijBl(10GBURq*6hK6~{!H1dayTyPW>>K^9^Ed4_n)pc( z!YS!16?y;}mxG~H1asB!i`{Q9TtvIx^yq^XL{)DAuiQ_yYVwjhccIIU7a(?V#KZLh z8rRM{AcducgGDe6R}g(RjS*Kkd6s497U@1oz0N?-m{Xo62> z8vIRMCM`IMnLx2#HP$5obVDGZyWq`v%M8m)B!?$#e+VQfvTRS_OHgz;iKz?2$FN61 zHC@L>TAGG<6yC+kEk(A=49JVLMf7_?!bl!epR<{R-yd{bvV#VmVa|i z_Yl4W&=qbHYDLs9G*l5=d!-Vmrp_lBUU-*~bR!jI`)$wqGqJ6o5tw5vNWyBPFtAi9 z;u;H5XRwfv{Dv?=4YI}QvrxIeW%Ls84CvxS_q$QSrP?WMhcweu^ArgOZiNS}A2n|O zm0Ok;7)Pim&)fs@!fl?O;7#o6C^l=VfVriOjc5Ar!XE~ zpC0XKY^hYN=TNWm+(=>Hqpz&$8-~A${R9D~Ib?5m0YP6V_S-M<8zf)EPlhSg0mESz z3K_ny&n1J@MyYhZepALHT) zHK}>QAMpO|yZadm8!u8bWoWY0ta!jjT^^Hk0YCcxBJMC;zlGdK;FKa~N{u9_H5!S_ z^GeybAJmcTt5sI|)I)ugj=bRhWu3LhuU)hy98B^_0jRf^^D6}!pAltf5_PQ@i}>3I z%QrpBW!akWiL_BUZ}0oFvFZ4hYz1Ve_9^h5ic~LVr`7Md`Q$r=)Yk;N5UaB}Odb5m zcy}@3t|<|p__M|^3EggtDw|O0Q@;hm`VRpb$rl~nj<&VIJpb8wBNwfEW?UrJ^4G_| zkN>c1r@XWgD)PO)mnu(EmXCy?dV6|bscZA6EVw3YP6`~Qb=+7ZqgM=<9-%~EF^iJ_ zC&MPS8NM`m@{M*&EuHSqr&;!n_Qvx&691zxE>eF>-dj^_+)~VHEtS9Ti%_bG!poY2 zUogbWE8l_o)@A#xQD66$vzPm_A8|ka*MNu%_%Z*Ss-5?GK;GfH&V)J)JQ}m}<*esYhMuXmu zTK0W5w0d6OK#9tRyFdT=-BADV?d$zT72B^pRfMF-?_ydw9kyD? zO}`FBmh?(``+3|w>9?$Vc=a4P_hz&YHRMp~mn((~Sh+E(E}vplxW8cuRa1;1dvMsx zk9pD$THiAL53A~#ZE=dC`#n8t(Qn`K_hno07S&3MBf6TRT1YUB`qK4_)-hgj%8s$; zzBO{}@p(cjX!u^x@rHV|`l>JWv&7kw&>ze)OZQ9Q7t2mLWDj|qPnJ*PpeUm5sLmD8Ro(lFKc?8 zxPM&V&1F&RG!ph-_gWe>EqLr;y&qrG0`}rli6^w^{TvAy4wyw9?Hjz=^oGL)lBRB; zTR49l=!-_b6IP3A?Y-|TG+@-fw_#1i?i`V62#;e7`umiFk5SGu&#|Qv?hI9TAP0lC zWAJBmM;z}wCJZuWnM2wom_C-|;IljV!qF=FXR%c4^~tCmIoet5`$e&t-!2rSxRq=~ ziZwyx=o9$Gu1nIVjL9+15w|YLx_qYyJ08~zdDx-Ye(Y6u&feXZo!s>tbr9lSm#Tke zF`N-(x>Avrd z&yli1?ve|@=LXfIaSY=X!+-3Qp<+T_>SMTkIYKD2(_pHSnXsNkS^7t?;>*PCaP{_kl(uy!PW;6@DnX!?I7P$W zoX)FKqE3qLHJ_;ReM~(7=HUKI*b)}Or{8zXP8s|=^4z$o45}^^C+IDppP5!=*g4wf zQ>r^RlEusT@*V7}-?@s)Nba*G%Mg0|wiy4Z5|Yxi+A6-$R}D^It@Aqb667H8pK=gs zYZ?c|)nC@S5(fD*Do)CGBT3%I!E_tKdu0Lrk%a30K%O0@H%uCJuD`GA;of7T;VT)b zIkpRqSjM1D9cnEBa%U@ZH^#yeN^11fIPW4qd0gjR&y$b`C#+Ju!JkV-7M-e8pXf`_ z1BP?Sv$D%ipKBBY_3w1bsGJBSiOK7wRF5FM@WsXsN{Wkg^+chl2?3JwZD$~ zr!#z1^eIJp=Z*iAQ;90ZMwSN5wEhsneXbcFdD_AYx-N90pGs{=1boycg{oxsDj0C6 zKBy>tuO;oi`A&-XqLNCPdnh zU}+8kV+^6xmHr9_`LY%j&HCy1+F;DVI@LPUT|R#u)f0orBoATq^$Sd7Mn9+{`|$0{ z(s#!&Ok{JhaLmC!ftkoO5AG_7Q?zhOivP_Y5p}zWpcgJ61^K`9j1zpa#qEEKNl{!W zAW3qEjQ9Lv)lK@3g)|rZBBCR>>xPd9qYrq%`tvDXN0ND1@9i>@Um-1Y#6-sQYi}mt zAT{)jAxNFDBTx_%f;g<+1?y*YUf+gi(9nz;ve$+;{5{*Yfw>mqu5}^R@{2-<1Uw;4 zv4qj2`iZ2-t4vgZD$trcewVFORRYfY8fwnwOXYV+pz6|Kk0-DbyzGN{ic@_aB50v# zoaQS&Vg?17^lF2Qb1@XS($m@neaMo_L>aR@>pz)KTahs*`I=-|D$qCjqnr%gkQ5=q z2C*~y%$g$E$oQfr($S1|ZU4y)s_LipvM49&UP8&jbOaZL#I-%?Hi<`ynVqFQ#}(XU zRn=(8>O+FJ9pn7SrexZSn{44Bzl+l5O`kaqAbyky6PJkcDx8f>p=mw1_RsBrw zgk+-nq@N7^n~&YeXn|G7m8Kg2^j^6y6-F#g5e@`CuA|=^1bHg$Jx;xuX#wp29Qi|d z#XLG&vS-DQ_&*q&LPF>V5vI~L8J#=bbIcpM*@lG1-d*cx;^f9;nYmtCl!c2DnX4@04y3gEE&$EmMuXIu^f7oRSMm2qy*5XHG@&?!%q?54?-hXz}DNmhq^xdXAglv(nY^4GBQ zh?LQLzqQxQ1g|5ZAe~Mchs8yupu6H-SYhf&PdNl=MByK-P9R(-{3CO@zcEU!Q28G@ zu9CE#RW6QfPQI*O24E9I`jIqpxcd}F-ysgHEb7OP|3gVZn+ND%BApc+M(i9O=0rRF zDAD+Fm`E}>=uk!@ud4X$rKwOR9YYoBJ&RbJsj6#IVy0UtTVI8XF7@D~Ksd=UE3pAD zTBEzn>`CP6j4W3pkdO~o+s=4kA|+F?TQNV69avd4@Nd`idsBo-JnYHSC4_VQWci)t zo+aM(5z;pJ-BmU@z+~}j0gHkX&N<|LJ z_{L1WtKzsB9*KcUTJgJFt6Va?PvV(VP82>|Yo@-QuvujG_h$m*i>JW3a^oUc+{)U& z{wOf-86mJ-0(GpE<}W6@)nJSBn1DgZ)b$9e^=V&8=H|`2TMLB{>q%uvc(^RP$!DA*+yN6JZ)r1hw zDvz~#J{Q4pjq}JY@ve-^2P6fCeg4V-TAt{vFPIL_)`$jOI==H6PM5dOB<=pyPzpS* z-MukOb&^D(URxlr^v^yf37}^mkmLHBex(!og$GoeGXp?sskWdr>SwFTIIoox{d8vF zW1P#;n>Fa?oRDt_AaoJ7=aTdhn?oA9o;qYdP@BNG*tF?Ka%tc5MR=3>55G-^F3}C-{87QG9YE zrN7c@S9QO`?O;cW3?Mija{a?hBec}AyCj0)xnA#+jM36?%gUFnOYde0BFKpxqeal$%XghFUhRb-waY0FSMffF3% zJ4=V%^u!vKfTUU!@f9ntdrvSaRv!H!1G1XBn0%Cx-*9V-Fd;t48G;P7ZRK4 zvlt?Y^M_NhAsCo0zjj6yIr_H@hI@CQK@`NtSkS{P@V&caI07!JyhJCgH)IC3A-l}?Cpy=GZ5dBusscyk^&4#2WxC>dc zX)@LIVrMloCv2o{n=bZhIZ5E-|L zk?G^^>Vv2W_&sPStsjr96U;LqfTTJkc0(q^TdaXGf1AseH&Setz40n2M$x{vY{S$q z(tQo44%*QTdbmx7wVtj2IjBS($;wC;=@udTK;``kk=kJ%*>u`NjWsXHCBReVI`d_! ztAqlX!PR;wuA9cyP7t&Swz;HJYyKNb18k20wN)N0(o(CPR>SnL>X0c!tAma{)5^vW zSrW;CuUs^NL|%G~yF-1i#7o5{A*n0;U)M%@XKp1NJE#_zY%k*-Efn~j(i(U_hSR;a z_X8=cx}pJeaL0GE#ULXROs05Ue{(JWz#{#1XT?G*bWjN=HJ>o|6zz^(aXl#TEDWHI z{O!S5z5BLd=dBtn*ZCy$C?@}4<*`X2rSux{2`#*0Q0-!tns+;sjCYE}UcMrPmt>D| zs{kF|z;+PW$mVqm(B&Qoli%MU8_yff-gmzI)Sly}x3WgtaW+r0wq;J+R4DN{pMq%@jDcOk!DBtGob6Rh_~?2=NuMK$E|pg~L1< zNZbN;-3s)z8KCS+RY8DGFJZ~YZ{s@hu@I`g!T9S&J~d~(WJxLC9?nQl3TjJ81$KNvhC$})KCD@ z8QZbkLKF|nh)BM0T$T1#a%tF?S?-qJw_w)a3IC@tGme)SO&eKEMg~Jv;U{o`-FLDh zR(9yD!>ASaXw1EYtp?PL2eXQiYnq$e5Ibs_&NO(2RvO%y3VrL`A~up1{ZSSIg4b<& z-amJ^00wjfJibubO52(jWumw;)k4^%ogW@7c<~OX-OD&_*z#0_&6M|_<<8!k)XHiz zWRY2?;(r3eso0Ol_4Z zzNrwMSD@9GW!XCBo%$usws_En z?NL_=Rgr{sMK;PW2l_d;gL`2%)vWiV$#6xa^XLW7llO{{IXanYCSXXt{+eIX9Rg;r z?k9Bo`D;yL=ATQD;^6{E#6jLu&8@0aWRA_N1#JKKFow4AFj#Wj@7wB_e^Eh~s?Bp$ zA6$Q}hV4535sO1N=ap{#Xv*HAMynixYP-gk>@tFaCcFY=(WMK_e!QyBqtajvZx&p(K}xK>Z^5|B?N6wYxfW%Psj} zGK4!!Hm^O3I1vKPRNEz$hZ6~V8e5~=N<%0r4+Qnwf85;XD&)^&_&zKLt_>f1?;JW;?9BG(f5Eo^(~aoqQBi5bcYON%{rC04ca23zKk_ciU0zf z7M&b3q0gR+H4y;B^DKi-Q^CX;-(8k2+r`8OC+S|2YA2gs$H<(Bl>=$#atbnQhqSU1 zh({|d3KDFKJ&hN3RV|&AS0tj z>K7qq@_~JWpqrV_N#8v=fyjXEL3ZceV_(zEyt8H#HZT=a@+SU0R^uP2&gi^*d22#k zX;H59fE~~QD8yK(?UFTKYmiir4;%ZveaonG-;p4wfnH3@ z^K>{FEtc&>f~6sl(n;DtRNoEKTlQ|;HN#Zi^;^pMC$}UU;Mja1dTsyp?D4Crle7h| z3g?apKUJT2(K-6ez~S3a<%Jcwy$gRJ!+`{~vD|U*rS(dA#Bk_mr#p2U^~=rbM>Y|| z7;W8Bh9fV}lQm%uOwug@gF#!4#g*JP!w|4khJeZ)xS>JN6`#cKqqjXz#d;Xl_ZuzV zsfSxGBvv82B?&fNwkNe818x1u_y|=iGvbKh@G%P$INHs)nKEMBb1$w-%8+@;N=f|* zcSo?YyKIoBYM~9|rOZs5Wy4ci?oFd!TL}y6L8GbD6cn6}i8AH>kyj-myfX5YjQrKM zpQ%gkQ7WA&f z1mcrX%0ven7Z2$0f$0yO!7(!%h@WiI#$Ut~&; z@A-<0+}LphlzV33p`E!@`^vMZ@OL___{HgqZ(aG9cS0w3zk-o!mb*D`w$AL2iIksKwPVq*JqtrD1_zL5afKC+cRZaJhzD`8$uw4Oh%nvCN#0%31Hc|7uz+orKG&%Ap!}DLp$mst0+Xq_6<}Y z(uI`rcY0(vCO7T{IJLf(`u=2vtkb)&mTp}9XISUesex$(&+RA3x5sqs3I0?_@g9+} zxk9cl7q`RfQNCNXkK$GF2b@zkzF?-LwqGx3cs@vb)e@aK*tnnl>l!3+aAwe8u&e-U z5xZ#~u^1nKJqVM=wM1d%HjP)mUHif=gN!nsLU#Ie*F{HMP`PfoO&#}=ieA7_^B-<- z$YP(l-`PZUqAC_)!i`G3s|D@yg39k>ec<7VnFAJk3U6sb-fPM(bI7K=D+o_7 zB=#%HKl;#))yG@73%O|Ndi}3Ml#MwDS&9u0s~Ju$2(RUlu{rA`&CC}(thc#pgR8l9{B`t*!^&^UTi!uhV~26Erb;v|bbM@M z3Egm@hLuAK$1gB@CN`_cmzm;C#KcANMZf*&qU&Yu*A>iO4X1bnS-*v!ig&bJQ}25Qvc>qkB{`ue-5wXseWYY*F(?Dt>`%k&0jN(Cjv*?^Tlfe%&2TPFZqI zsUFFhoG*DQAH=V|P9gRCvc^q4_`((MnDH0sBaO&wI5e!Gvr`m4Ic>cE9l6n{^g&$y zssq$D-%_@s+my3tct4K7&&t5Sa3R+uMd8m(@P(eu@8z;TCz_#UFO8`-ygWY4N;7TY iFZ9p-|K**zkLrNh?kQ(wb(5ON!3}Lgtx65M$NvZ3L|q>M diff --git a/public/icon-b-192.png b/public/icon-b-192.png deleted file mode 100644 index 6c726793ebacc8e65427de1c4015eba9e60f6776..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6795 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 diff --git a/public/icon-b-512.png b/public/icon-b-512.png deleted file mode 100644 index d6857ed12c6adf3f85118c0f4828c0eafc738668..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17420 zcmY&=cUV(R(C;Qh0xBI5=}JIEkq$~rR9ff=f`Sx5K{^Ns(h@<%LNoM^5~)g&s+538 zQF`yi0!T+X1d@C3{l5F$%Rl7VGiP>oc6N4mW`5^|fu07#QLdu^00yk4>U99%&`&s^ zqlNx$`1b7qAONtcSB!mAmd23@>}q?>eJiWCledSd5)($qxI|nE!%gdNV-J2M0vd5VzP6+&-Ug}Zb8A^ z_EO%wBMj>9|NFxyi2P866?bV~_rxk{Ii7I{m3fy&q$N0N<=IlJJ|B3R;|86y^UB7r z6uvI?%cow9-3TXc5^AGMwR+63lOt4$u|7$@T-lfaivSF~EUYCeqn2uKIM`EbVrQ4APl=Jv zi4`|?4SKYY^GFm2Jz(aM-mk47G7`3msWQ~@IJt|@Pl+W6I+PQ)Q8iA~U6rC9MiduQeVJ=yjQ8%(%cctr1K7WVx3sCAO0bA z;wZ3s83$v((S9s#R^a_hR;-xi1maBosw}e1G*CPAH4*=c$op$N5{YN(Sx5I&asMhv>byK}HS*4@et{vmhzW)l{Z5(NYny!JUXSb^54SEn&U3oEAu?EBU`OovTT)j~l%mP%~ ztC^@u*x5DL0NOVM3M-WCuF%4A7SD6sQ0Aaxxv4fcnl@`uJLhL+(_|<^awFM-sW6o-i}~9- z=VE@wn=bk=f-`qGqPAi;L{A1B6(ZQw`XAhEV-V13X4yH%ZvWkh;OBV+VW2af_$%8W zMXYzxhaJF6(up323~t7FY$+ZCN2J}R{qfDaA~8cJ)>8vpfRQShNFY|g8Fz*vr-1W&dmgnYNsy;E- zrSg_v(&^c3lzNipd1{swo4O z6ulv_zK{1&7#U=WA4)wU-*aTYL2XiBL+i6z4_~c30tAZ8ox$q&vIpHcS|{F)8W(pE zt>?$zD>$M*?9>n;^AZg)3OO}*xw+P)^t>P%^bAc}o{hu$Mbm1jz^|;8#d~EF4;kT8 z+Kax`-A=mji4&%I(bE;@a&mWR#@`mSyc)i;db{dTm(CWWrm#97%0uu5P)Hc_0Cg;#pb}ow#_|$6HB%+T-_J zFj5k5W}ML0sfn|wrFp0ik-UM29#irJ%go$g;VgJxr#rKIk()KA!4uby7TiTqS&?Vu z;4cd)TaA1O95B43-g5!l+`IQz70!$ZjAd zH}jdrN$a1To+(>@B#toimej5ARe5rNo%_V`-_8v7=l~Sx9{RRC-C0G3?YL$IzUewM z$$iEd1%60(Hbumjmbf7q!Knb@+`@4sy3==9tScj8WJ0Ex!06DhC3oc8TVJlhnbUfO zbYuGJ;%R8{N(oNC5dI%j>3ok0@WhXt+%sPPVGYZ`2n#dBlnzADWjxmeFZ1&Pzph9P zm;;QS)}k>+8XG;VQt1mlXjWR-iwgXD1Vp8W2rUUYyeEd2TC7%{7h_y!q@G3bMt=>V z!87ZYk0J}-c893JnXA>eBuTDVMG5e{<<*vC{d5X`DheQ4omZt_`0UVNrtF3dZ^#`# zN=J`zH^cg=UndiJn878xf^q$Ou(MffnjpA)fEG6~g9MHDEYAfzA?iEKem@P%seUN8 zQxQ&n3@|zYj?wttl%g-iY}V5WKPa>G6u_KUzIEe^&LVU_4C4g#yCnEyBV%wSMF_aOhMJAvp=>+#HmXJWdhqXk0`h`n^ z^r?5wpY@gDuoAQis%8jTqn~g9@84#I=Ob`$;xxBNRv+M>!@q>eS7O3KfXO#ElhBS27hv7$f
    H3G%LT%n|wMf@2VoDV&zmo=o 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 - - - - - - - - - - - - JellyStat - - - -
    - - - diff --git a/public/manifest.json b/public/manifest.json deleted file mode 100644 index dc006c0..0000000 --- a/public/manifest.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "short_name": "JellyStat", - "name": "Statistics for Jellyfin", - "icons": [ - { - "src": "favicon.ico", - "sizes": "64x64 32x32 24x24 16x16", - "type": "image/x-icon" - }, - { - "src": "icon-b-192.png", - "type": "image/png", - "sizes": "192x192" - }, - { - "src": "icon-b-512.png", - "type": "image/png", - "sizes": "512x512" - } - ], - "start_url": ".", - "display": "standalone", - "theme_color": "#000000", - "background_color": "#ffffff" -} diff --git a/public/vite.svg b/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/App.css b/src/App.css index cbef13e..97900dc 100644 --- a/src/App.css +++ b/src/App.css @@ -1,16 +1,14 @@ @import 'pages/css/variables.module.css'; @import 'pages/css/variables.module.css'; -main{ - margin-inline: 20px; +main { + margin-inline: 20px; /* width: 100%; */ overflow: auto; - margin-inline: 20px; + margin-inline: 20px; /* width: 100%; */ overflow: auto; } - - .App-logo { height: 40vmin; pointer-events: none; @@ -22,49 +20,47 @@ main{ } } -body -{ +body { background-color: var(--background-color) !important; background-color: var(--background-color) !important; /* background-color: #17151a; */ color: white; } -h1{ +h1 { color: white; font-weight: lighter !important; margin: 0 !important; - margin-top: 0.5em; - margin-bottom: 0.5em; + margin-top: 0.5em; + margin-bottom: 0.5em; } -h2{ +h2 { color: white; font-weight: lighter !important; margin: 0 !important; - margin-top: 0.5em; - margin-bottom: 0.5em; + margin-top: 0.5em; + margin-bottom: 0.5em; } - - - - - - @keyframes fade-in { - from { opacity: 0; } - to { opacity: 1; } + from { + opacity: 0; + } + to { + opacity: 1; + } } @keyframes fade-out { - from { opacity: 1; } - to { opacity: 0; } + from { + opacity: 1; + } + to { + opacity: 0; + } } - - .App-header { - /* min-height: 100vh; */ padding-bottom: 10px; display: flex; @@ -79,7 +75,6 @@ h2{ color: #61dafb; } - @keyframes App-logo-spin { from { transform: rotate(0deg); @@ -89,64 +84,49 @@ h2{ } } - -.btn-outline-primary -{ - color: white!important; +.btn-outline-primary { + color: white !important; border-color: var(--primary-color) !important; background-color: var(--background-color) !important; } -.btn-outline-primary:hover -{ +.btn-outline-primary:hover { background-color: var(--primary-color) !important; } -.btn-outline-primary.active -{ +.btn-outline-primary.active { background-color: var(--primary-color) !important; - } -.btn-outline-primary:focus -{ +.btn-outline-primary:focus { background-color: var(--primary-color) !important; - } -.btn-primary -{ - color: white!important; +.btn-primary { + color: white !important; border-color: var(--primary-color) !important; background-color: var(--primary-color) !important; } -.btn-primary:hover -{ +.btn-primary:hover { background-color: var(--primary-dark-color) !important; } -.btn-primary.active -{ +.btn-primary.active { background-color: var(--primary-color) !important; - } -.btn-primary:focus -{ +.btn-primary:focus { background-color: var(--primary-color) !important; - } -.form-select -{ - background-color:var(--secondary-background-color) !important; - border-color:var(--secondary-background-color) !important ; +.form-select { + background-color: var(--secondary-background-color) !important; + border-color: var(--secondary-background-color) !important ; color: white !important; } -.form-select:focus -{ +.form-select:focus { box-shadow: none !important; border-color: var(--primary-color) !important; color: white !important; @@ -159,12 +139,7 @@ h2{ border-color: var(--primary-color) !important; } - .form-select option:hover { background-color: var(--primary-color) !important; color: white !important; } - - - - diff --git a/src/App.js b/src/App.js deleted file mode 100644 index 8df3f72..0000000 --- a/src/App.js +++ /dev/null @@ -1,202 +0,0 @@ -// import logo from './logo.svg'; -import './App.css'; -import React, { useState, useEffect } from 'react'; -import { Routes, Route } from "react-router-dom"; -import axios from 'axios'; - - -import socket from './socket'; -import { ToastContainer, toast } from 'react-toastify'; -import 'react-toastify/dist/ReactToastify.css'; - - -import Config from './lib/config'; - -import Loading from './pages/components/general/loading'; - -import Signup from './pages/signup'; -import Setup from './pages/setup'; -import Login from './pages/login'; - - -import Navbar from './pages/components/general/navbar'; -import Home from './pages/home'; -import Settings from './pages/settings'; -import Users from './pages/users'; -import UserInfo from './pages/components/user-info'; -import Libraries from './pages/libraries'; -import LibraryInfo from './pages/components/library-info'; -import ItemInfo from './pages/components/item-info'; -import ErrorPage from './pages/components/general/error'; -import About from './pages/about'; - - -import Testing from './pages/testing'; -import Activity from './pages/activity'; -import Statistics from './pages/statistics'; -import Datadebugger from './pages/data-debugger'; - -function App() { - - const [setupState, setSetupState] = useState(0); - const [config, setConfig] = useState(null); - const [loading, setLoading] = useState(true); - const [errorFlag, seterrorFlag] = useState(false); - const token = localStorage.getItem('token'); - - - - const wsListeners=[ - {task:'PlaybackSyncTask',ref:React.useRef(null)}, - {task:'SyncTask',ref:React.useRef(null)}, - {task:'BackupTask',ref:React.useRef(null)}, - {task:'TaskError',ref:React.useRef(null)}, - ]; - - useEffect(() => { - - wsListeners.forEach((listener) => { - - socket.on(listener.task, (message) => { - - - if(message && (message.type==="Start" || !listener.ref.current)) - { - listener.ref.current = toast.info(message?.message||message, { autoClose: 15000 }); - }else if(message && message.type==="Update") - { - toast.update( listener.ref.current, {render: (message?.message||message) , type: toast.TYPE.INFO, autoClose: 15000 }); - }else if(message && message.type==="Error") - { - toast.update( listener.ref.current, {render: (message?.message||message) , type: toast.TYPE.ERROR, autoClose: 5000 }); - }else if(message && message.type==="Success") - { - toast.update( listener.ref.current, {render: (message?.message||message) , type: toast.TYPE.SUCCESS, autoClose: 5000 }); - } - - - - }); - }); - - return () => { - wsListeners.forEach((listener) => { - socket.off(listener.task); - }); - - }; - }); - - useEffect(() => { - - - const fetchConfig = async () => { - try { - const newConfig = await Config(); - if(!newConfig.response){ - setConfig(newConfig); - }else{ - if(newConfig.response.status!==403) - { - seterrorFlag(true); - } - - } - setLoading(false); - - } catch (error) { - console.log(error); - } - }; - - if(setupState===0) - { - setLoading(false); - axios - .get("/auth/isConfigured") - .then(async (response) => { - if(response.status===200) - { - setSetupState(response.data.state); - } - - - }) - .catch((error) => { - console.log(error); - seterrorFlag(true); - - }); - - } - - if (!config && setupState>=1) { - fetchConfig(); - } - -}, [config,setupState]); - -if (loading) { - return ; -} - -if (errorFlag) { - return ; -} - -if(!config && setupState===2) - { - if ((token===undefined || token===null) || !config) { - return ; - } - } - - if (setupState===0) { - return ; - } - if(setupState===1) - { - return ; - - } - - - - - - -if (config && setupState===2 && token!==null){ - return ( -
    - -
    - -
    - - } /> - } /> - } /> - } /> - } /> - } /> - } /> - } /> - } /> - } /> - } /> - } /> - -
    -
    - -
    - - ); -} - - - - -} - -export default App; diff --git a/src/App.jsx b/src/App.jsx new file mode 100644 index 0000000..46d2f99 --- /dev/null +++ b/src/App.jsx @@ -0,0 +1,179 @@ +// import logo from './logo.svg'; +import './App.css'; +import React, { useState, useEffect } from 'react'; +import { Routes, Route } from 'react-router-dom'; +import axios from 'axios'; + +import socket from './socket'; +import { ToastContainer, toast } from 'react-toastify'; +import 'react-toastify/dist/ReactToastify.css'; + +import Config from './lib/config'; + +import Loading from './pages/components/general/loading'; + +import Signup from './pages/signup'; +import Setup from './pages/setup'; +import Login from './pages/login'; + +import Navbar from './pages/components/general/navbar'; +import Home from './pages/home'; +import Settings from './pages/settings'; +import Users from './pages/users'; +import UserInfo from './pages/components/user-info'; +import Libraries from './pages/libraries'; +import LibraryInfo from './pages/components/library-info'; +import ItemInfo from './pages/components/item-info'; +import ErrorPage from './pages/components/general/error'; +import About from './pages/about'; + +import Testing from './pages/testing'; +import Activity from './pages/activity'; +import Statistics from './pages/statistics'; +import Datadebugger from './pages/data-debugger'; + +function App() { + const [setupState, setSetupState] = useState(0); + const [config, setConfig] = useState(null); + const [loading, setLoading] = useState(true); + const [errorFlag, seterrorFlag] = useState(false); + const token = localStorage.getItem('token'); + + const wsListeners = [ + { task: 'PlaybackSyncTask', ref: React.useRef(null) }, + { task: 'SyncTask', ref: React.useRef(null) }, + { task: 'BackupTask', ref: React.useRef(null) }, + { task: 'TaskError', ref: React.useRef(null) }, + ]; + + useEffect(() => { + wsListeners.forEach((listener) => { + socket.on(listener.task, (message) => { + if (message && (message.type === 'Start' || !listener.ref.current)) { + listener.ref.current = toast.info(message?.message || message, { + autoClose: 15000, + }); + } else if (message && message.type === 'Update') { + toast.update(listener.ref.current, { + render: message?.message || message, + type: toast.TYPE.INFO, + autoClose: 15000, + }); + } else if (message && message.type === 'Error') { + toast.update(listener.ref.current, { + render: message?.message || message, + type: toast.TYPE.ERROR, + autoClose: 5000, + }); + } else if (message && message.type === 'Success') { + toast.update(listener.ref.current, { + render: message?.message || message, + type: toast.TYPE.SUCCESS, + autoClose: 5000, + }); + } + }); + }); + + return () => { + wsListeners.forEach((listener) => { + socket.off(listener.task); + }); + }; + }); + + useEffect(() => { + const fetchConfig = async () => { + try { + const newConfig = await Config(); + if (!newConfig.response) { + setConfig(newConfig); + } else { + if (newConfig.response.status !== 403) { + seterrorFlag(true); + } + } + setLoading(false); + } catch (error) { + console.log(error); + } + }; + + if (setupState === 0) { + setLoading(false); + axios + .get('/auth/isConfigured') + .then(async (response) => { + if (response.status === 200) { + setSetupState(response.data.state); + } + }) + .catch((error) => { + console.log(error); + seterrorFlag(true); + }); + } + + if (!config && setupState >= 1) { + fetchConfig(); + } + }, [config, setupState]); + + if (loading) { + return ; + } + + if (errorFlag) { + return ( + + ); + } + + if (!config && setupState === 2) { + if (token === undefined || token === null || !config) { + return ; + } + } + + if (setupState === 0) { + return ; + } + if (setupState === 1) { + return ; + } + + if (config && setupState === 2 && token !== null) { + return ( +
    +
    + +
    + + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + +
    +
    + +
    + ); + } +} + +export default App; diff --git a/src/App.test.js b/src/App.test.jsx similarity index 100% rename from src/App.test.js rename to src/App.test.jsx diff --git a/src/assets/react.svg b/src/assets/react.svg new file mode 100644 index 0000000..6c87de9 --- /dev/null +++ b/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/index.css b/src/index.css index f823fdb..f311e88 100644 --- a/src/index.css +++ b/src/index.css @@ -11,15 +11,13 @@ body { sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; - color: white ; + color: white; } -* -{ +* { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', - 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',sans-serif !important; - - + 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', + sans-serif !important; } code { @@ -27,7 +25,6 @@ code { monospace; } - body { overflow: auto; /* show scrollbar when needed */ } @@ -48,4 +45,3 @@ body::-webkit-scrollbar-thumb { body::-webkit-scrollbar-thumb:hover { background-color: #88888883; /* set thumb color */ } - diff --git a/src/index.js b/src/index.js deleted file mode 100644 index 5177946..0000000 --- a/src/index.js +++ /dev/null @@ -1,21 +0,0 @@ -import React from 'react'; -import ReactDOM from 'react-dom/client'; -import './index.css'; -import App from './App'; -import reportWebVitals from './reportWebVitals'; -import { BrowserRouter } from 'react-router-dom'; -import 'bootstrap/dist/css/bootstrap.min.css'; - -const root = ReactDOM.createRoot(document.getElementById('root')); -root.render( - - - - - -); - -// 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/src/index.jsx b/src/index.jsx new file mode 100644 index 0000000..3566462 --- /dev/null +++ b/src/index.jsx @@ -0,0 +1,16 @@ +import React from 'react'; +import ReactDOM from 'react-dom/client'; +import { BrowserRouter } from 'react-router-dom'; + +import App from './App.jsx'; + +import './index.css'; +import 'bootstrap/dist/css/bootstrap.min.css'; + +ReactDOM.createRoot(document.getElementById('root')).render( + + + + + +); diff --git a/src/lib/axios_instance.js b/src/lib/axios_instance.jsx similarity index 100% rename from src/lib/axios_instance.js rename to src/lib/axios_instance.jsx diff --git a/src/lib/config.js b/src/lib/config.jsx similarity index 100% rename from src/lib/config.js rename to src/lib/config.jsx diff --git a/src/lib/devices.js b/src/lib/devices.jsx similarity index 100% rename from src/lib/devices.js rename to src/lib/devices.jsx diff --git a/src/lib/navdata.js b/src/lib/navdata.jsx similarity index 100% rename from src/lib/navdata.js rename to src/lib/navdata.jsx diff --git a/src/lib/tasklist.js b/src/lib/tasklist.jsx similarity index 100% rename from src/lib/tasklist.js rename to src/lib/tasklist.jsx diff --git a/src/logo.svg b/src/logo.svg deleted file mode 100644 index 9dfc1c0..0000000 --- a/src/logo.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/pages/about.js b/src/pages/about.jsx similarity index 100% rename from src/pages/about.js rename to src/pages/about.jsx diff --git a/src/pages/activity.js b/src/pages/activity.jsx similarity index 100% rename from src/pages/activity.js rename to src/pages/activity.jsx diff --git a/src/pages/components/HomeStatisticCards.js b/src/pages/components/HomeStatisticCards.jsx similarity index 100% rename from src/pages/components/HomeStatisticCards.js rename to src/pages/components/HomeStatisticCards.jsx diff --git a/src/pages/components/LibrarySelector/SelectionCard.js b/src/pages/components/LibrarySelector/SelectionCard.jsx similarity index 100% rename from src/pages/components/LibrarySelector/SelectionCard.js rename to src/pages/components/LibrarySelector/SelectionCard.jsx diff --git a/src/pages/components/activity/activity-table.js b/src/pages/components/activity/activity-table.jsx similarity index 100% rename from src/pages/components/activity/activity-table.js rename to src/pages/components/activity/activity-table.jsx diff --git a/src/pages/components/activity/stream_info.js b/src/pages/components/activity/stream_info.jsx similarity index 100% rename from src/pages/components/activity/stream_info.js rename to src/pages/components/activity/stream_info.jsx diff --git a/src/pages/components/general/ComponentLoading.js b/src/pages/components/general/ComponentLoading.jsx similarity index 100% rename from src/pages/components/general/ComponentLoading.js rename to src/pages/components/general/ComponentLoading.jsx diff --git a/src/pages/components/general/ErrorBoundary.js b/src/pages/components/general/ErrorBoundary.jsx similarity index 100% rename from src/pages/components/general/ErrorBoundary.js rename to src/pages/components/general/ErrorBoundary.jsx diff --git a/src/pages/components/general/error.js b/src/pages/components/general/error.jsx similarity index 100% rename from src/pages/components/general/error.js rename to src/pages/components/general/error.jsx diff --git a/src/pages/components/general/last-watched-card.js b/src/pages/components/general/last-watched-card.jsx similarity index 100% rename from src/pages/components/general/last-watched-card.js rename to src/pages/components/general/last-watched-card.jsx diff --git a/src/pages/components/general/loading.js b/src/pages/components/general/loading.jsx similarity index 100% rename from src/pages/components/general/loading.js rename to src/pages/components/general/loading.jsx diff --git a/src/pages/components/general/navbar.js b/src/pages/components/general/navbar.jsx similarity index 100% rename from src/pages/components/general/navbar.js rename to src/pages/components/general/navbar.jsx diff --git a/src/pages/components/general/version-card.js b/src/pages/components/general/version-card.jsx similarity index 100% rename from src/pages/components/general/version-card.js rename to src/pages/components/general/version-card.jsx diff --git a/src/pages/components/ip-info.js b/src/pages/components/ip-info.jsx similarity index 100% rename from src/pages/components/ip-info.js rename to src/pages/components/ip-info.jsx diff --git a/src/pages/components/item-info.js b/src/pages/components/item-info.jsx similarity index 100% rename from src/pages/components/item-info.js rename to src/pages/components/item-info.jsx diff --git a/src/pages/components/item-info/globalStats.js b/src/pages/components/item-info/globalStats.jsx similarity index 100% rename from src/pages/components/item-info/globalStats.js rename to src/pages/components/item-info/globalStats.jsx diff --git a/src/pages/components/item-info/globalstats/watchtimestats.js b/src/pages/components/item-info/globalstats/watchtimestats.jsx similarity index 100% rename from src/pages/components/item-info/globalstats/watchtimestats.js rename to src/pages/components/item-info/globalstats/watchtimestats.jsx diff --git a/src/pages/components/item-info/item-activity.js b/src/pages/components/item-info/item-activity.jsx similarity index 100% rename from src/pages/components/item-info/item-activity.js rename to src/pages/components/item-info/item-activity.jsx diff --git a/src/pages/components/item-info/item-not-found.js b/src/pages/components/item-info/item-not-found.jsx similarity index 100% rename from src/pages/components/item-info/item-not-found.js rename to src/pages/components/item-info/item-not-found.jsx diff --git a/src/pages/components/item-info/more-items.js b/src/pages/components/item-info/more-items.jsx similarity index 100% rename from src/pages/components/item-info/more-items.js rename to src/pages/components/item-info/more-items.jsx diff --git a/src/pages/components/item-info/more-items/more-items-card.js b/src/pages/components/item-info/more-items/more-items-card.jsx similarity index 100% rename from src/pages/components/item-info/more-items/more-items-card.js rename to src/pages/components/item-info/more-items/more-items-card.jsx diff --git a/src/pages/components/library-info.js b/src/pages/components/library-info.jsx similarity index 100% rename from src/pages/components/library-info.js rename to src/pages/components/library-info.jsx diff --git a/src/pages/components/library/RecentlyAdded/recently-added-card.js b/src/pages/components/library/RecentlyAdded/recently-added-card.jsx similarity index 100% rename from src/pages/components/library/RecentlyAdded/recently-added-card.js rename to src/pages/components/library/RecentlyAdded/recently-added-card.jsx diff --git a/src/pages/components/library/globalstats/watchtimestats.js b/src/pages/components/library/globalstats/watchtimestats.jsx similarity index 100% rename from src/pages/components/library/globalstats/watchtimestats.js rename to src/pages/components/library/globalstats/watchtimestats.jsx diff --git a/src/pages/components/library/last-watched.js b/src/pages/components/library/last-watched.jsx similarity index 100% rename from src/pages/components/library/last-watched.js rename to src/pages/components/library/last-watched.jsx diff --git a/src/pages/components/library/library-activity.js b/src/pages/components/library/library-activity.jsx similarity index 100% rename from src/pages/components/library/library-activity.js rename to src/pages/components/library/library-activity.jsx diff --git a/src/pages/components/library/library-card.js b/src/pages/components/library/library-card.jsx similarity index 100% rename from src/pages/components/library/library-card.js rename to src/pages/components/library/library-card.jsx diff --git a/src/pages/components/library/library-items.js b/src/pages/components/library/library-items.jsx similarity index 100% rename from src/pages/components/library/library-items.js rename to src/pages/components/library/library-items.jsx diff --git a/src/pages/components/library/library-stats.js b/src/pages/components/library/library-stats.jsx similarity index 100% rename from src/pages/components/library/library-stats.js rename to src/pages/components/library/library-stats.jsx diff --git a/src/pages/components/library/recently-added.js b/src/pages/components/library/recently-added.jsx similarity index 100% rename from src/pages/components/library/recently-added.js rename to src/pages/components/library/recently-added.jsx diff --git a/src/pages/components/libraryOverview.js b/src/pages/components/libraryOverview.jsx similarity index 100% rename from src/pages/components/libraryOverview.js rename to src/pages/components/libraryOverview.jsx diff --git a/src/pages/components/libraryStatCard/library-stat-component.js b/src/pages/components/libraryStatCard/library-stat-component.jsx similarity index 100% rename from src/pages/components/libraryStatCard/library-stat-component.js rename to src/pages/components/libraryStatCard/library-stat-component.jsx diff --git a/src/pages/components/playbackactivity.js b/src/pages/components/playbackactivity.jsx similarity index 100% rename from src/pages/components/playbackactivity.js rename to src/pages/components/playbackactivity.jsx diff --git a/src/pages/components/sessions/session-card.js b/src/pages/components/sessions/session-card.jsx similarity index 100% rename from src/pages/components/sessions/session-card.js rename to src/pages/components/sessions/session-card.jsx diff --git a/src/pages/components/sessions/sessions.js b/src/pages/components/sessions/sessions.jsx similarity index 100% rename from src/pages/components/sessions/sessions.js rename to src/pages/components/sessions/sessions.jsx diff --git a/src/pages/components/settings/Tasks.js b/src/pages/components/settings/Tasks.jsx similarity index 100% rename from src/pages/components/settings/Tasks.js rename to src/pages/components/settings/Tasks.jsx diff --git a/src/pages/components/settings/TerminalComponent.js b/src/pages/components/settings/TerminalComponent.jsx similarity index 100% rename from src/pages/components/settings/TerminalComponent.js rename to src/pages/components/settings/TerminalComponent.jsx diff --git a/src/pages/components/settings/apiKeys.js b/src/pages/components/settings/apiKeys.jsx similarity index 100% rename from src/pages/components/settings/apiKeys.js rename to src/pages/components/settings/apiKeys.jsx diff --git a/src/pages/components/settings/backupfiles.js b/src/pages/components/settings/backupfiles.jsx similarity index 100% rename from src/pages/components/settings/backupfiles.js rename to src/pages/components/settings/backupfiles.jsx diff --git a/src/pages/components/settings/logs.js b/src/pages/components/settings/logs.jsx similarity index 100% rename from src/pages/components/settings/logs.js rename to src/pages/components/settings/logs.jsx diff --git a/src/pages/components/settings/security.js b/src/pages/components/settings/security.jsx similarity index 100% rename from src/pages/components/settings/security.js rename to src/pages/components/settings/security.jsx diff --git a/src/pages/components/settings/settingsConfig.js b/src/pages/components/settings/settingsConfig.jsx similarity index 100% rename from src/pages/components/settings/settingsConfig.js rename to src/pages/components/settings/settingsConfig.jsx diff --git a/src/pages/components/statCards/ItemStatComponent.js b/src/pages/components/statCards/ItemStatComponent.jsx similarity index 100% rename from src/pages/components/statCards/ItemStatComponent.js rename to src/pages/components/statCards/ItemStatComponent.jsx diff --git a/src/pages/components/statCards/most_active_users.js b/src/pages/components/statCards/most_active_users.jsx similarity index 100% rename from src/pages/components/statCards/most_active_users.js rename to src/pages/components/statCards/most_active_users.jsx diff --git a/src/pages/components/statCards/most_used_client.js b/src/pages/components/statCards/most_used_client.jsx similarity index 100% rename from src/pages/components/statCards/most_used_client.js rename to src/pages/components/statCards/most_used_client.jsx diff --git a/src/pages/components/statCards/mp_movies.js b/src/pages/components/statCards/mp_movies.jsx similarity index 100% rename from src/pages/components/statCards/mp_movies.js rename to src/pages/components/statCards/mp_movies.jsx diff --git a/src/pages/components/statCards/mp_music.js b/src/pages/components/statCards/mp_music.jsx similarity index 100% rename from src/pages/components/statCards/mp_music.js rename to src/pages/components/statCards/mp_music.jsx diff --git a/src/pages/components/statCards/mp_series.js b/src/pages/components/statCards/mp_series.jsx similarity index 100% rename from src/pages/components/statCards/mp_series.js rename to src/pages/components/statCards/mp_series.jsx diff --git a/src/pages/components/statCards/mv_libraries.js b/src/pages/components/statCards/mv_libraries.jsx similarity index 100% rename from src/pages/components/statCards/mv_libraries.js rename to src/pages/components/statCards/mv_libraries.jsx diff --git a/src/pages/components/statCards/mv_movies.js b/src/pages/components/statCards/mv_movies.jsx similarity index 100% rename from src/pages/components/statCards/mv_movies.js rename to src/pages/components/statCards/mv_movies.jsx diff --git a/src/pages/components/statCards/mv_music.js b/src/pages/components/statCards/mv_music.jsx similarity index 100% rename from src/pages/components/statCards/mv_music.js rename to src/pages/components/statCards/mv_music.jsx diff --git a/src/pages/components/statCards/mv_series.js b/src/pages/components/statCards/mv_series.jsx similarity index 100% rename from src/pages/components/statCards/mv_series.js rename to src/pages/components/statCards/mv_series.jsx diff --git a/src/pages/components/statistics/chart.js b/src/pages/components/statistics/chart.jsx similarity index 100% rename from src/pages/components/statistics/chart.js rename to src/pages/components/statistics/chart.jsx diff --git a/src/pages/components/statistics/daily-play-count.js b/src/pages/components/statistics/daily-play-count.jsx similarity index 100% rename from src/pages/components/statistics/daily-play-count.js rename to src/pages/components/statistics/daily-play-count.jsx diff --git a/src/pages/components/statistics/play-stats-by-day.js b/src/pages/components/statistics/play-stats-by-day.jsx similarity index 100% rename from src/pages/components/statistics/play-stats-by-day.js rename to src/pages/components/statistics/play-stats-by-day.jsx diff --git a/src/pages/components/statistics/play-stats-by-hour.js b/src/pages/components/statistics/play-stats-by-hour.jsx similarity index 100% rename from src/pages/components/statistics/play-stats-by-hour.js rename to src/pages/components/statistics/play-stats-by-hour.jsx diff --git a/src/pages/components/user-info.js b/src/pages/components/user-info.jsx similarity index 100% rename from src/pages/components/user-info.js rename to src/pages/components/user-info.jsx diff --git a/src/pages/components/user-info/globalStats.js b/src/pages/components/user-info/globalStats.jsx similarity index 100% rename from src/pages/components/user-info/globalStats.js rename to src/pages/components/user-info/globalStats.jsx diff --git a/src/pages/components/user-info/globalstats/watchtimestats.js b/src/pages/components/user-info/globalstats/watchtimestats.jsx similarity index 100% rename from src/pages/components/user-info/globalstats/watchtimestats.js rename to src/pages/components/user-info/globalstats/watchtimestats.jsx diff --git a/src/pages/components/user-info/lastplayed.js b/src/pages/components/user-info/lastplayed.jsx similarity index 100% rename from src/pages/components/user-info/lastplayed.js rename to src/pages/components/user-info/lastplayed.jsx diff --git a/src/pages/components/user-info/user-activity.js b/src/pages/components/user-info/user-activity.jsx similarity index 100% rename from src/pages/components/user-info/user-activity.js rename to src/pages/components/user-info/user-activity.jsx diff --git a/src/pages/data-debugger.js b/src/pages/data-debugger.jsx similarity index 100% rename from src/pages/data-debugger.js rename to src/pages/data-debugger.jsx diff --git a/src/pages/home.js b/src/pages/home.jsx similarity index 100% rename from src/pages/home.js rename to src/pages/home.jsx diff --git a/src/pages/libraries.js b/src/pages/libraries.jsx similarity index 100% rename from src/pages/libraries.js rename to src/pages/libraries.jsx diff --git a/src/pages/library_selector.js b/src/pages/library_selector.jsx similarity index 100% rename from src/pages/library_selector.js rename to src/pages/library_selector.jsx diff --git a/src/pages/login.js b/src/pages/login.jsx similarity index 100% rename from src/pages/login.js rename to src/pages/login.jsx diff --git a/src/pages/settings.js b/src/pages/settings.jsx similarity index 100% rename from src/pages/settings.js rename to src/pages/settings.jsx diff --git a/src/pages/setup.js b/src/pages/setup.jsx similarity index 100% rename from src/pages/setup.js rename to src/pages/setup.jsx diff --git a/src/pages/signup.js b/src/pages/signup.jsx similarity index 100% rename from src/pages/signup.js rename to src/pages/signup.jsx diff --git a/src/pages/statistics.js b/src/pages/statistics.jsx similarity index 100% rename from src/pages/statistics.js rename to src/pages/statistics.jsx diff --git a/src/pages/testing.js b/src/pages/testing.jsx similarity index 100% rename from src/pages/testing.js rename to src/pages/testing.jsx diff --git a/src/pages/users.js b/src/pages/users.jsx similarity index 100% rename from src/pages/users.js rename to src/pages/users.jsx diff --git a/src/reportWebVitals.js b/src/reportWebVitals.js deleted file mode 100644 index 5253d3a..0000000 --- a/src/reportWebVitals.js +++ /dev/null @@ -1,13 +0,0 @@ -const reportWebVitals = onPerfEntry => { - if (onPerfEntry && onPerfEntry instanceof Function) { - import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => { - getCLS(onPerfEntry); - getFID(onPerfEntry); - getFCP(onPerfEntry); - getLCP(onPerfEntry); - getTTFB(onPerfEntry); - }); - } -}; - -export default reportWebVitals; diff --git a/src/setupProxy.js b/src/setupProxy.js deleted file mode 100644 index 2467e96..0000000 --- a/src/setupProxy.js +++ /dev/null @@ -1,77 +0,0 @@ -const { createProxyMiddleware } = require('http-proxy-middleware'); - -module.exports = function(app) { - app.use( - `/api`, - createProxyMiddleware({ - target: `http://127.0.0.1:${process.env.PORT || 3003}`, - changeOrigin: true, - }) - ); - app.use( - `/proxy`, - createProxyMiddleware({ - target: `http://127.0.0.1:${process.env.PORT || 3003}`, - changeOrigin: true, - }) - ); - app.use( - `/stats`, - createProxyMiddleware({ - target: `http://127.0.0.1:${process.env.PORT || 3003}`, - changeOrigin: true, - }) - ); - app.use( - `/sync`, - createProxyMiddleware({ - target: `http://127.0.0.1:${process.env.PORT || 3003}`, - changeOrigin: true, - }) - ); - app.use( - `/auth`, - createProxyMiddleware({ - target: `http://127.0.0.1:${process.env.PORT || 3003}`, - changeOrigin: true, - }) - ); - app.use( - `/backup`, - createProxyMiddleware({ - target: `http://127.0.0.1:${process.env.PORT || 3003}`, - changeOrigin: true, - }) - ); - app.use( - `/logs`, - createProxyMiddleware({ - target: `http://127.0.0.1:${process.env.PORT || 3003}`, - changeOrigin: true, - }) - ); - app.use( - '/socket.io', - createProxyMiddleware({ - target: `http://127.0.0.1:${process.env.PORT || 3003}`, - changeOrigin: true, - }) - ); - app.use( - '/swagger', - createProxyMiddleware({ - target: `http://127.0.0.1:${process.env.PORT || 3003}`, - changeOrigin: true, - }) - ); - app.use( - '/utils', - createProxyMiddleware({ - target: `http://127.0.0.1:${process.env.PORT || 3003}`, - changeOrigin: true - }) - ); - - - console.log(`Proxy middleware applied`); -}; diff --git a/vite.config.js b/vite.config.js new file mode 100644 index 0000000..f6648e2 --- /dev/null +++ b/vite.config.js @@ -0,0 +1,33 @@ +import { defineConfig, splitVendorChunkPlugin } from 'vite'; +import react from '@vitejs/plugin-react-swc'; + +// https://vitejs.dev/config/ +export default defineConfig({ + server: { + port: 3000, + proxy: { + '/api': 'http://localhost:3003', + '/proxy': 'http://localhost:3003', + '/stats': 'http://localhost:3003', + '/sync': 'http://localhost:3003', + '/auth': 'http://localhost:3003', + '/backup': 'http://localhost:3003', + '/logs': 'http://localhost:3003', + '/socket.io': 'http://localhost:3003', + '/swagger': 'http://localhost:3003', + '/utils': 'http://localhost:3003', + }, + }, + target: ['es2015'], + rollupOptions: { + output: { + manualChunks: { + react: ['react'], + axios: ['axios'], + 'react-router-dom': ['react-router-dom'], + 'react-toastify': ['react-toastify'], + }, + }, + }, + plugins: [react(), splitVendorChunkPlugin()], +});