From 2a9a49c5ec74c9c379952bcc7b9b2e519abea9ff Mon Sep 17 00:00:00 2001 From: Sergey Elpashev Date: Fri, 24 Jan 2025 15:22:40 +0300 Subject: [PATCH] Feat: started admin panel --- .gitignore | 6 +++- .vscode/settings.json | 3 ++ bun.lockb | Bin 159524 -> 160612 bytes package.json | 4 ++- src/app/admin/actions.ts | 9 +++++ src/app/admin/admin.module.scss | 0 src/app/admin/page.tsx | 60 ++++++++++++++++++++++++++++++++ src/app/admin/panel/page.tsx | 35 +++++++++++++++++++ src/app/api/route.ts | 3 ++ src/lib/auth.ts | 3 ++ src/middleware.ts | 14 ++++++++ 11 files changed, 135 insertions(+), 2 deletions(-) create mode 100644 .vscode/settings.json create mode 100644 src/app/admin/actions.ts create mode 100644 src/app/admin/admin.module.scss create mode 100644 src/app/admin/page.tsx create mode 100644 src/app/admin/panel/page.tsx create mode 100644 src/app/api/route.ts create mode 100644 src/lib/auth.ts create mode 100644 src/middleware.ts diff --git a/.gitignore b/.gitignore index 174f2a6..bddcabc 100644 --- a/.gitignore +++ b/.gitignore @@ -41,4 +41,8 @@ yarn-error.log* next-env.d.ts # repomix -repomix-output.txt \ No newline at end of file +repomix-output.txt + +# vscode +.vscode/* +!.vscode/settings.json \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..84c191f --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "scss.lint.unknownAtRules": "ignore" +} \ No newline at end of file diff --git a/bun.lockb b/bun.lockb index 4b91f47fc95d42bab18da7a003d6d16a71423a31..02a3f781bdfa1d5d09f8bcd8b2d517451e58e0c2 100755 GIT binary patch delta 30426 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 Ls}9xj23q_tD7yLD delta 29806 zcmeIbcX(Ar*Z+O?fde@}=!ArX5_$rOq>*4C0YuuNwwW+6TzvPMwPt3`tTk)O+550_ z;*@vs5%1K*t8 zQmW=%dBQLmmuu+gzJs#|x?CIKi@RL;!!y$RjUc@mc;Ry?D0FDX7!kV;qoor3R+}z^ z2Ek8*213W#v>&u0e0yjBv=OvCGXjSM8Xcg!fn?3@q z44(`Qf!4687b+dOT*PYlJE%0c4Jr+;u<1-_1^CG}9R|&lp7bIiw6#s+p=IDlmUOvF zK}X~c&g@G^>mwJ>X$t@8{&GGLM4#8~L{=APwYFN?e=> zFY>Vrs91CrD&;ewqM#d;BKap6cxj*syfjePuGepH?il*u3V^5Y`OgJgLvk7_^~dCq zkc=2w6PJ%j@7p)M@8ArH3+c#k+k)>12vPhols57Upb~5^LZzcapw*zApb{g|P>G!Y zJO37p)IR~G$^6ftq9<=P2~jl1E-=~7$bw2xb++?kp`y5wEx!dLicUeL{;2ffnL|go zTwlS9K^y8=2JL_sj}1!CjTkUEecjv?A(k$&3o586c$7lodM5_j zz)LhQ3AYqpfr>@_>sdT;l9Aib<ZTO$1}!`5(DBJ zTlH5^PCA;AJ90$k;9OTmZqCSz;bUFVO{88g$rv^~Bg5sIO+gv-HV^Yiz{A6 zF24LK$&!zUFAv{8qwmOpP8OFjF9jgHgf3Le%bvq`k+o?u`|>k+5{@)szR9u`DJbSu@?8{yO2x0b1`PO z^YZ^7AtORpO@|F?Y1x^T8!jw7!C-2^YQa2`}T=J+ubK2(DIa$C#t6Hrlj04fdb_gNj<2`?i#B7K-FKduq& ztnw?7%Q|78s2X$)6G0kU-@)ao2|eE4+N&18OSy&cqW7MV%tPR&fGF5O0cLpq3aC_= z36+sPg<@GxhG*nv4<1Dax>$;{pv8~}K}$keN3ur`b-7k_wG440U=Q`BV`HGA*O~6= z@OiRM_(;h5F|UVJuuF<%VQx=rq1p?T7(JG1$p>Z+>o3DKAbWTOCxJoUG)sPxdeWii zDd!JOK`!-PgBL?uK!s1V`O3ZRO|C^RYrzU5qbvmyP$U($_pxGO3-Unt+N^vswtLB! z4mW(v3ex^|2XDa3n7@>6)t`z%(je>7@Qi^OV;a&S(fb7XGNeP&lPwGT+ZBF6flQJv zD3p#IW!031+G4Npze1&AcP6A*>Qno?RrA`TR=6YNO7ovUD?-;pWnh*<%^eIgMBZeO zWkxg1Fy*%YlA%&Qk=CW$LCQ;aYubESyH{5!R|)wKP~4K2zng?K{4rE2tcHr+3!&1$ z3s5m*`(TSFOd?o_a`TYOKn;LO!`19^<)IR)*Xe-hxd@eVe-d3HACzqwkP0m=bEp*w zX=p74#S;sl(qM+Ipet1TR~{-Iy@lmMFG0nhYoHS1bD)9HCm1*>p97VKSLRys{x&~) zgeC6>EiZE@V5Ai(9twyhX;2x+me6w01Y4dyCL@A{Gb7yQ%RwuW|7Ulr|&`WaVZLjbjSPc`r{6e6{QfWuekw|LlGv*!DAiA8k$Q^HA|j zO&XB=unAVfrJ+Ia&g8x}-YRDvvDwMyO|&dkQ0d5+C#;T~r<@qNb3FYQh3#>JxNIdE zfza2+t0zm;F5PO9RqwMm;>xv{p1*hX<`Vht)v2Wpxc!25zT!Rn^vbtZHz<3xi2D1RP%Um0$ifQ852}krDXRuLuFM;@?;cpxl+`SN{OD0w^QW`yIkE( z*&tF~&D4h5sgfR-tFtM4lvGDEwStsSQtoRWwJapbQ^C*W8mNX;Zd{l|KXoxA(Q}kk zx|wRq5Ikz8=G{)+B-PuLJ%WE9k(BYiDyWj|DMJ9Hs^w_NB-PDKZ6ejhOqIf$oy^pu zw^Q$s>R`%ln5iLE8y6=0+LH&tJrQ{luRY7R7@v%A^n(Y3qqzbQ|WF)K1 z>d8i~D&YE|I?FXch1EzlGE^qlMXI1ivioRhb*@H|5vsy!CL4oPCfCKPpe7k*)VZ2T z-mVO35(D5;Q3(l!Vd6|@?I^33)k-qTtFyI|jUFnjcCs;FW!6r1e^pK`t8Hc=>ZZc# zBzxwwVm4M0b&`z-xh5Jz)mhR7Dy(j@w_||I)f)AN$_a`$v?{2Z>^>8q&ecsa;#F8! zvgc(c$73p@abrIc9VqEmIo0F69}r>EEkmuU8Sg1V0Jl&VYbP3QRc3gycN%;bv+OF$ zUW9wlEPJ^|ytfVu7jsVZ)Q&eMs?2)H-lD-AAx&8nvUqj2o|qF>KiPdHSY_2uGFqsD z`pL#q>TLaF@8%GfD}lmAR8CmDyKrR{9+~9sR9R(3CV4JbHDfX|(bKw`%ax{vkXk_M z5i|7{sdO{dJJjXMG*dfB^)pjp)m^R(GxZWFtK210#5h`7){w}P)Dlvb=9{D}&1p5A zaw|z$x!zh5mr`Q@DXZKTQdVmGCh`p-*0hmH=*fm71ba62BhePI z>2+^FUAzwGr|_D$C!DyYusLt1!HGwUs>`AA-jCsA1UxEdV1iLsWyK|V6T+<8E^(uG z0vrcDMny*KLpT}hqAI6pf)TE=8Ya1$hpS}`lf0|Lt!k$Cy(Q~egIPpH)sOcKha(JP z61|&AN&gF(o%v1Va9(veB;M<*PdLIAR)mB5)%p_u-fs{}4-2WB@Obyb5$aq*lJ~g? zOGu|MVjG;TlP@&52&ofByTzV_pm9OnXXy}yVH|YR?8&ss|cGS^fQYbwu@je z$|@2ioy_Xe`GIiJmNG_TCLDn-vy8rNhm(F6RjVT6y=74-{U!#fmjNg9(V9SS!pYo* z!#&sFM5kN4?yc9%;iO(~o1-s8`7Ah@7R+OMb_7n^Gy7?TsIa!l-mx^&%hHABui>Qc zR@l{g$Qo-LK@g_FNgvF~=zirPmE}wFev6P1k?0o_Xp1)N>RsWwn|Tb2dua=m)h@|> zsfAkBF3B6l#Ij1t%+7+NF!iF6&I-#Ta2RXHco@+pgKPz3KR9Mcen~TAXTh~m z%iAS-uac70msqM4Z!}j0oszxJx3P9Q%STt?tbXOxi#J-T%+AT)vcB7)9TM;91lL?e zuy9NxB`%<5`*`nhIMmZ08O3_-XcNvOtAjTW&Whp7wc_3HwNv3;lia_xQ(0Y;jE7V~ z*JMu`jk0ibP4pZl)yGUFb~KMX$X+JJ8KrBY_iIw(5i78(a2StCTixO;Y2 zS!qe`H@d53X-S?VJ*Y#^8yhJqyl0Yoa!-}j6ES))C??TU^AUzXjwhbJq#Bs(_B2uw z&V+h+y!TTnVRk+zHQwvTj9{sd!KfbZeFVIZn#*1@Y|(>n-vK+Q=rw zL5m?SASLd$7SgkD^wj2(`>?0q=AMVMbtS}m55P$n(LS0Vd{j=cva3!bCDRk{Cnpq! z>86IHBzikNX3b$Uc06yxnH}_$O_!stbV-wXPz@Q-xG)JTvtnO!n$$}4bR>v zYqJ=Mwz9=|g8NA(=6br5vYe<$wUd_JzxPvFeUm)B`inq{7s?O~($_~xi4PfT_Wap* zxR`j)w{Wp4qI#mII1yu}yvd}jAeUeq3CA8sv#UsTF;j&G;y<&WX{5~KrgttWYf2I> z?$ZO+vWz5e=RuB}*pfX9;4E9tlS&c=MwluXkn9Gp4rx|Y_QWB=-dB#0!v|2Vi$(=JsorCNiqr!9fLOj+Q zTXQS+B*P`BA&H5eNu;999IBR50KYHGU>#HJ? z6Fud}%NII)ZnRMaBa^*@Cfp7`7SRtUsPIuqMv%%JmF(>?(dBA_+EQ|&cfUPRog0

W5 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 diff --git a/package.json b/package.json index c9d540e..01bfa33 100644 --- a/package.json +++ b/package.json @@ -10,12 +10,14 @@ }, "dependencies": { "@mantine/core": "^7.16.1", + "@mantine/form": "^7.16.1", "@mantine/hooks": "^7.16.1", "@mantine/modals": "^7.16.1", "next": "15.1.5", "react": "^19.0.0", "react-dom": "^19.0.0", - "react-icons": "^5.4.0" + "react-icons": "^5.4.0", + "zod": "^3.24.1" }, "devDependencies": { "@eslint/eslintrc": "^3", diff --git a/src/app/admin/actions.ts b/src/app/admin/actions.ts new file mode 100644 index 0000000..0f9c94f --- /dev/null +++ b/src/app/admin/actions.ts @@ -0,0 +1,9 @@ +"use server"; + +import { redirect } from "next/navigation"; + +export async function login(formData: { name: string; password: string }) { + console.log("data"); + console.log(formData); + redirect("/admin/panel"); +} diff --git a/src/app/admin/admin.module.scss b/src/app/admin/admin.module.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/admin/page.tsx b/src/app/admin/page.tsx new file mode 100644 index 0000000..4da4321 --- /dev/null +++ b/src/app/admin/page.tsx @@ -0,0 +1,60 @@ +"use client"; + +import { Button, Card, Flex, PasswordInput, Text, TextInput } from "@mantine/core"; +import { hasLength, useForm } from "@mantine/form"; +import { login } from "./actions"; + +interface FormValues { + name: string; + password: string; +} + +const AdminPage = () => { + const form = useForm({ + mode: "uncontrolled", + initialValues: { + name: "", + password: "", + }, + validate: { + name: hasLength({ min: 5 }, "Too short"), + password: hasLength({ min: 5 }, "Too short"), + }, + }); + + return ( + + +

+ + Admin + + + + + + + + ); +}; + +export default AdminPage; diff --git a/src/app/admin/panel/page.tsx b/src/app/admin/panel/page.tsx new file mode 100644 index 0000000..1c45171 --- /dev/null +++ b/src/app/admin/panel/page.tsx @@ -0,0 +1,35 @@ +"use client"; +import { ActionIcon, AppShell, Burger, Flex, Group, Skeleton, useMantineColorScheme } from "@mantine/core"; +import { useDisclosure } from "@mantine/hooks"; +import { LuMoon, LuSun } from "react-icons/lu"; + +const PanelPage = () => { + const [opened, { toggle }] = useDisclosure(); + const { setColorScheme, colorScheme } = useMantineColorScheme(); + const changeColorScheme = () => { + setColorScheme(colorScheme === "light" ? "dark" : "light"); + }; + return ( + + + + + +
Logo
+
+ + {colorScheme === "light" ? : } + +
+
+ + {Array(15) + .fill(0) + .map((_, index) => ( + + ))} + +
+ ); +}; +export default PanelPage; diff --git a/src/app/api/route.ts b/src/app/api/route.ts new file mode 100644 index 0000000..a6b4ce5 --- /dev/null +++ b/src/app/api/route.ts @@ -0,0 +1,3 @@ +export async function GET() { + return Response.json({ test: 1 }); +} diff --git a/src/lib/auth.ts b/src/lib/auth.ts new file mode 100644 index 0000000..9579803 --- /dev/null +++ b/src/lib/auth.ts @@ -0,0 +1,3 @@ +export function isAuthenticated() { + return true; +} diff --git a/src/middleware.ts b/src/middleware.ts new file mode 100644 index 0000000..e387e2f --- /dev/null +++ b/src/middleware.ts @@ -0,0 +1,14 @@ +import { isAuthenticated } from "@/lib/auth"; +import { NextRequest, NextResponse } from "next/server"; + +export const config = { + matcher: "/admin/:path*", +}; + +export function middleware(request: NextRequest) { + const { pathname } = request.nextUrl; + if (pathname === "/admin" || isAuthenticated()) { + return NextResponse.next(); + } + return NextResponse.redirect(new URL("/admin", request.url)); +}