Zlr3-NFJ@NFaJlhyfcw{k^vvtGl`N9xSo**rDW4S}i
zM9{fMPWo%4wYDG~BZ18BD+}h|GQKc-g^{++3MY>}W_uq7jGHx{mwE9fZiPCoxN$+7
zrODGGJrOkcPQUB(FD5aoS4g~7#6NR^ma7-!>mHuJfY5kTe6PpNNKC9GGRiu^L31uG
z$7v`*JknQHsYB!Tm_W{a32TM099djW%5e+j0Ve_ct}IM>XLF1Ap+YvcrLV=|CKo6S
zb+9Nl3_YdKP6%Cxy@6TxZ>;4&nTneadr
z_ES90ydCev)LV!dN=#(*f}|ZORFdvkYBni^aLbUk>BajeWIOcmHP#8S)*2U~QKI%S
zyrLmtPqb&TphJ;>yAxri#;{uyk`JJqODDw%(Z=2`1uc}br^V%>j!gS)D*q*f_-qf8&D;W1dJgQMlaH5er
zN2U<%Smb7==vE}dDI8K7cKz!vs^73o9f>2sgiTzWcwY|BMYHH5%Vn7#kiw&eItCqa
zIkR2~Q}>X=Ar8W|^Ms41Fm8o6IB2_j60eOeBB1Br!boW7JnoeX6Gs)?7rW0^5psc-
zjS16yb>dFn>KPOF;imD}e!enuIniFzv}n$m2#gCCv4jM#ArwlzZ$7@9&XkFxZ4n!V
zj3dyiwW4Ki2QG{@i>yuZXQizw_OkZI^-3otXC{!(lUpJF33gI60ak;Uqitp74|B6I
zgg{b=Iz}WkhCGj1M=hu4#Aw173YxIVbISaoc
z-nLZC*6Tgivd5V`K%GxhBsp@SUU60-rfc$=wb>zdJzXS&-5(NRRodFk;Kxk!S(O(a0e7oY=E(
zAyS;Ow?6Q&XA+cnkCb{28_1N8H#?J!*$MmIwLq^*T_9-z^&UE@A(z9oGYtFy6EZef
LrJugUA?W`A8`#=m
diff --git a/app/layout.tsx b/app/layout.tsx
index ebd52ca..7e8f296 100644
--- a/app/layout.tsx
+++ b/app/layout.tsx
@@ -4,32 +4,32 @@ import "./globals.css";
import { ThemeProvider } from "@/components/shared/providers/themeprovider";
const poppins = Poppins({
- weight: ["400", "600", "700", "900"],
- subsets: ["latin"],
+ weight: ["400", "600", "700", "900"],
+ subsets: ["latin"],
});
export const metadata: Metadata = {
- title: "SVRJS - A Web Server running on Nodejs",
- description: "Open Source Software Library",
+ title: "SVRJS - A Web Server running on Nodejs",
+ description: "Open Source Software Library",
};
export default function RootLayout({
- children,
+ children,
}: Readonly<{
- children: React.ReactNode;
+ children: React.ReactNode;
}>) {
- return (
-
-
-
- {children}
-
-
-
- );
+ return (
+
+
+
+ {children}
+
+
+
+ );
}
diff --git a/app/(auth)/login/page.tsx b/app/login/page.tsx
similarity index 100%
rename from app/(auth)/login/page.tsx
rename to app/login/page.tsx
diff --git a/components/ui/form.tsx b/components/ui/form.tsx
new file mode 100644
index 0000000..4603f8b
--- /dev/null
+++ b/components/ui/form.tsx
@@ -0,0 +1,176 @@
+import * as React from "react"
+import * as LabelPrimitive from "@radix-ui/react-label"
+import { Slot } from "@radix-ui/react-slot"
+import {
+ Controller,
+ ControllerProps,
+ FieldPath,
+ FieldValues,
+ FormProvider,
+ useFormContext,
+} from "react-hook-form"
+
+import { cn } from "@/lib/utils"
+import { Label } from "@/components/ui/label"
+
+const Form = FormProvider
+
+type FormFieldContextValue<
+ TFieldValues extends FieldValues = FieldValues,
+ TName extends FieldPath = FieldPath
+> = {
+ name: TName
+}
+
+const FormFieldContext = React.createContext(
+ {} as FormFieldContextValue
+)
+
+const FormField = <
+ TFieldValues extends FieldValues = FieldValues,
+ TName extends FieldPath = FieldPath
+>({
+ ...props
+}: ControllerProps) => {
+ return (
+
+
+
+ )
+}
+
+const useFormField = () => {
+ const fieldContext = React.useContext(FormFieldContext)
+ const itemContext = React.useContext(FormItemContext)
+ const { getFieldState, formState } = useFormContext()
+
+ const fieldState = getFieldState(fieldContext.name, formState)
+
+ if (!fieldContext) {
+ throw new Error("useFormField should be used within ")
+ }
+
+ const { id } = itemContext
+
+ return {
+ id,
+ name: fieldContext.name,
+ formItemId: `${id}-form-item`,
+ formDescriptionId: `${id}-form-item-description`,
+ formMessageId: `${id}-form-item-message`,
+ ...fieldState,
+ }
+}
+
+type FormItemContextValue = {
+ id: string
+}
+
+const FormItemContext = React.createContext(
+ {} as FormItemContextValue
+)
+
+const FormItem = React.forwardRef<
+ HTMLDivElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => {
+ const id = React.useId()
+
+ return (
+
+
+
+ )
+})
+FormItem.displayName = "FormItem"
+
+const FormLabel = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => {
+ const { error, formItemId } = useFormField()
+
+ return (
+
+ )
+})
+FormLabel.displayName = "FormLabel"
+
+const FormControl = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ ...props }, ref) => {
+ const { error, formItemId, formDescriptionId, formMessageId } = useFormField()
+
+ return (
+
+ )
+})
+FormControl.displayName = "FormControl"
+
+const FormDescription = React.forwardRef<
+ HTMLParagraphElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => {
+ const { formDescriptionId } = useFormField()
+
+ return (
+
+ )
+})
+FormDescription.displayName = "FormDescription"
+
+const FormMessage = React.forwardRef<
+ HTMLParagraphElement,
+ React.HTMLAttributes
+>(({ className, children, ...props }, ref) => {
+ const { error, formMessageId } = useFormField()
+ const body = error ? String(error?.message) : children
+
+ if (!body) {
+ return null
+ }
+
+ return (
+
+ {body}
+
+ )
+})
+FormMessage.displayName = "FormMessage"
+
+export {
+ useFormField,
+ Form,
+ FormItem,
+ FormLabel,
+ FormControl,
+ FormDescription,
+ FormMessage,
+ FormField,
+}
diff --git a/components/ui/label.tsx b/components/ui/label.tsx
new file mode 100644
index 0000000..5341821
--- /dev/null
+++ b/components/ui/label.tsx
@@ -0,0 +1,26 @@
+"use client"
+
+import * as React from "react"
+import * as LabelPrimitive from "@radix-ui/react-label"
+import { cva, type VariantProps } from "class-variance-authority"
+
+import { cn } from "@/lib/utils"
+
+const labelVariants = cva(
+ "text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70"
+)
+
+const Label = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef &
+ VariantProps
+>(({ className, ...props }, ref) => (
+
+))
+Label.displayName = LabelPrimitive.Root.displayName
+
+export { Label }
diff --git a/constants/index.tsx b/constants/index.tsx
index b0e85a6..c6e72d7 100644
--- a/constants/index.tsx
+++ b/constants/index.tsx
@@ -96,7 +96,7 @@ export const questions = [
key: "item-3",
question: "How was SVR.JS created?",
answer:
- "Someone in 2018 wanted to create a website, but he didn't know about setting up popular web server software like Apache httpd, NGINX, or IIS... So he created his own web server in Node.JS to serve his website! And he saved it in a file called svr.js. Since then, this web server has been gradually turned from a web server intended for one website into a general-purpose web server, which is what SVR.JS is today!",
+ "Someone in 2018 wanted to create a website, but he didnt know about setting up popular web server software like Apache httpd, NGINX, or IIS... So he created his own web server in Node.JS to serve his website! And he saved it in a file called svr.js. Since then, this web server has been gradually turned from a web server intended for one website into a general-purpose web server, which is what SVR.JS is today!",
},
{
key: "item-4",
@@ -108,7 +108,7 @@ export const questions = [
key: "item-5",
question: "What is Node.JS?",
answer:
- "Node.JS is an asynchronous event-driven JavaScript runtime built on Chromium's V8 engine. Node.JS is designed to build scalable network applications.",
+ "Node.JS is an asynchronous event-driven JavaScript runtime built on Chromiums V8 engine. Node.JS is designed to build scalable network applications.",
},
{
key: "item-6",
diff --git a/lib/validations/validation.ts b/lib/validations/validation.ts
new file mode 100644
index 0000000..e67736c
--- /dev/null
+++ b/lib/validations/validation.ts
@@ -0,0 +1,7 @@
+import { z } from "zod";
+
+export const downloadSchema = z.object({
+ username: z.string().min(2, {
+ message: "Username must be at least 2 characters.",
+ }),
+});
diff --git a/package-lock.json b/package-lock.json
index 2c19f0f..f0f2278 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -11,11 +11,13 @@
"@fortawesome/fontawesome-svg-core": "^6.5.2",
"@fortawesome/free-regular-svg-icons": "^6.5.2",
"@fortawesome/react-fontawesome": "^0.2.2",
+ "@hookform/resolvers": "^3.6.0",
"@radix-ui/react-accordion": "^1.1.2",
"@radix-ui/react-dialog": "^1.0.5",
"@radix-ui/react-dropdown-menu": "^2.0.6",
+ "@radix-ui/react-label": "^2.1.0",
"@radix-ui/react-navigation-menu": "^1.1.4",
- "@radix-ui/react-slot": "^1.0.2",
+ "@radix-ui/react-slot": "^1.1.0",
"@radix-ui/themes": "^3.0.5",
"@types/cookie": "^0.6.0",
"class-variance-authority": "^0.7.0",
@@ -29,8 +31,10 @@
"react": "^18",
"react-dom": "^18",
"react-fontawesome": "^1.7.1",
+ "react-hook-form": "^7.52.0",
"tailwind-merge": "^2.3.0",
- "tailwindcss-animate": "^1.0.7"
+ "tailwindcss-animate": "^1.0.7",
+ "zod": "^3.23.8"
},
"devDependencies": {
"@types/node": "^20",
@@ -200,6 +204,15 @@
"react": ">=16.3"
}
},
+ "node_modules/@hookform/resolvers": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-3.6.0.tgz",
+ "integrity": "sha512-UBcpyOX3+RR+dNnqBd0lchXpoL8p4xC21XP8H6Meb8uve5Br1GCnmg0PcBoKKqPKgGu9GHQ/oygcmPrQhetwqw==",
+ "license": "MIT",
+ "peerDependencies": {
+ "react-hook-form": "^7.0.0"
+ }
+ },
"node_modules/@humanwhocodes/config-array": {
"version": "0.11.14",
"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz",
@@ -613,6 +626,25 @@
}
}
},
+ "node_modules/@radix-ui/react-alert-dialog/node_modules/@radix-ui/react-slot": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.2.tgz",
+ "integrity": "sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-compose-refs": "1.0.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
"node_modules/@radix-ui/react-arrow": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.0.3.tgz",
@@ -772,6 +804,25 @@
}
}
},
+ "node_modules/@radix-ui/react-collection/node_modules/@radix-ui/react-slot": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.2.tgz",
+ "integrity": "sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-compose-refs": "1.0.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
"node_modules/@radix-ui/react-compose-refs": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.1.tgz",
@@ -871,6 +922,25 @@
}
}
},
+ "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-slot": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.2.tgz",
+ "integrity": "sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-compose-refs": "1.0.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
"node_modules/@radix-ui/react-direction": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.0.1.tgz",
@@ -1014,6 +1084,30 @@
}
}
},
+ "node_modules/@radix-ui/react-form/node_modules/@radix-ui/react-label": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.0.2.tgz",
+ "integrity": "sha512-N5ehvlM7qoTLx7nWPodsPYPgMzA5WM8zZChQg8nyFJKnDO5WHdba1vv5/H6IO5LtJMfD2Q3wh1qHFGNtK0w3bQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-primitive": "1.0.3"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0",
+ "react-dom": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
"node_modules/@radix-ui/react-hover-card": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/@radix-ui/react-hover-card/-/react-hover-card-1.0.7.tgz",
@@ -1064,18 +1158,41 @@
}
},
"node_modules/@radix-ui/react-label": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.0.2.tgz",
- "integrity": "sha512-N5ehvlM7qoTLx7nWPodsPYPgMzA5WM8zZChQg8nyFJKnDO5WHdba1vv5/H6IO5LtJMfD2Q3wh1qHFGNtK0w3bQ==",
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.0.tgz",
+ "integrity": "sha512-peLblDlFw/ngk3UWq0VnYaOLy6agTZZ+MUO/WhVfm14vJGML+xH4FAl2XQGLqdefjNb7ApRg6Yn7U42ZhmYXdw==",
+ "license": "MIT",
"dependencies": {
- "@babel/runtime": "^7.13.10",
- "@radix-ui/react-primitive": "1.0.3"
+ "@radix-ui/react-primitive": "2.0.0"
},
"peerDependencies": {
"@types/react": "*",
"@types/react-dom": "*",
- "react": "^16.8 || ^17.0 || ^18.0",
- "react-dom": "^16.8 || ^17.0 || ^18.0"
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-label/node_modules/@radix-ui/react-primitive": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz",
+ "integrity": "sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-slot": "1.1.0"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
},
"peerDependenciesMeta": {
"@types/react": {
@@ -1126,6 +1243,25 @@
}
}
},
+ "node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-slot": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.2.tgz",
+ "integrity": "sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-compose-refs": "1.0.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
"node_modules/@radix-ui/react-navigation-menu": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/@radix-ui/react-navigation-menu/-/react-navigation-menu-1.1.4.tgz",
@@ -1199,6 +1335,25 @@
}
}
},
+ "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-slot": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.2.tgz",
+ "integrity": "sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-compose-refs": "1.0.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
"node_modules/@radix-ui/react-popper": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.1.3.tgz",
@@ -1301,6 +1456,25 @@
}
}
},
+ "node_modules/@radix-ui/react-primitive/node_modules/@radix-ui/react-slot": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.2.tgz",
+ "integrity": "sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-compose-refs": "1.0.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
"node_modules/@radix-ui/react-progress": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/@radix-ui/react-progress/-/react-progress-1.0.3.tgz",
@@ -1462,6 +1636,25 @@
}
}
},
+ "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-slot": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.2.tgz",
+ "integrity": "sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-compose-refs": "1.0.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
"node_modules/@radix-ui/react-slider": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/@radix-ui/react-slider/-/react-slider-1.1.2.tgz",
@@ -1496,16 +1689,31 @@
}
},
"node_modules/@radix-ui/react-slot": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.2.tgz",
- "integrity": "sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz",
+ "integrity": "sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==",
+ "license": "MIT",
"dependencies": {
- "@babel/runtime": "^7.13.10",
- "@radix-ui/react-compose-refs": "1.0.1"
+ "@radix-ui/react-compose-refs": "1.1.0"
},
"peerDependencies": {
"@types/react": "*",
- "react": "^16.8 || ^17.0 || ^18.0"
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-slot/node_modules/@radix-ui/react-compose-refs": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz",
+ "integrity": "sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
},
"peerDependenciesMeta": {
"@types/react": {
@@ -1660,6 +1868,25 @@
}
}
},
+ "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-slot": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.2.tgz",
+ "integrity": "sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-compose-refs": "1.0.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
"node_modules/@radix-ui/react-use-callback-ref": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.1.tgz",
@@ -5267,6 +5494,22 @@
"react": ">=0.12.0"
}
},
+ "node_modules/react-hook-form": {
+ "version": "7.52.0",
+ "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.52.0.tgz",
+ "integrity": "sha512-mJX506Xc6mirzLsmXUJyqlAI3Kj9Ph2RhplYhUVffeOQSnubK2uVqBFOBJmvKikvbFV91pxVXmDiR+QMF19x6A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.22.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/react-hook-form"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17 || ^18 || ^19"
+ }
+ },
"node_modules/react-is": {
"version": "16.13.1",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
@@ -6448,6 +6691,15 @@
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
+ },
+ "node_modules/zod": {
+ "version": "3.23.8",
+ "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz",
+ "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/colinhacks"
+ }
}
}
}
diff --git a/package.json b/package.json
index 7055764..7f3de55 100644
--- a/package.json
+++ b/package.json
@@ -12,11 +12,13 @@
"@fortawesome/fontawesome-svg-core": "^6.5.2",
"@fortawesome/free-regular-svg-icons": "^6.5.2",
"@fortawesome/react-fontawesome": "^0.2.2",
+ "@hookform/resolvers": "^3.6.0",
"@radix-ui/react-accordion": "^1.1.2",
"@radix-ui/react-dialog": "^1.0.5",
"@radix-ui/react-dropdown-menu": "^2.0.6",
+ "@radix-ui/react-label": "^2.1.0",
"@radix-ui/react-navigation-menu": "^1.1.4",
- "@radix-ui/react-slot": "^1.0.2",
+ "@radix-ui/react-slot": "^1.1.0",
"@radix-ui/themes": "^3.0.5",
"@types/cookie": "^0.6.0",
"class-variance-authority": "^0.7.0",
@@ -30,8 +32,10 @@
"react": "^18",
"react-dom": "^18",
"react-fontawesome": "^1.7.1",
+ "react-hook-form": "^7.52.0",
"tailwind-merge": "^2.3.0",
- "tailwindcss-animate": "^1.0.7"
+ "tailwindcss-animate": "^1.0.7",
+ "zod": "^3.23.8"
},
"devDependencies": {
"@types/node": "^20",
--
2.39.5
From e7f3d487a2002d198abe0efe50cb20b007640aad Mon Sep 17 00:00:00 2001
From: Proxyy587
Date: Thu, 20 Jun 2024 23:16:48 +0530
Subject: [PATCH 004/149] download feature box thing is complete
---
.env.example | 7 +
app/(auth)/admin/downloads/page.tsx | 147 ++++++----
app/(root)/downloads/page.tsx | 76 ++----
app/api/upload/route.ts | 20 ++
app/api/uploadthing/core.ts | 22 ++
app/api/uploadthing/route.ts | 6 +
lib/db.ts | 24 ++
lib/uploadthing.ts | 9 +
lib/validations/validation.ts | 7 +-
package-lock.json | 401 +++++++++++++++++++++++++++-
package.json | 3 +
11 files changed, 619 insertions(+), 103 deletions(-)
create mode 100644 .env.example
create mode 100644 app/api/upload/route.ts
create mode 100644 app/api/uploadthing/core.ts
create mode 100644 app/api/uploadthing/route.ts
create mode 100644 lib/db.ts
create mode 100644 lib/uploadthing.ts
diff --git a/.env.example b/.env.example
new file mode 100644
index 0000000..dc0218b
--- /dev/null
+++ b/.env.example
@@ -0,0 +1,7 @@
+MONGO_URI=
+
+UPLOADTHING_SECRET=
+UPLOADTHING_APP_ID=
+
+ADMIN_USERNAME=
+ADMIN_PASSWORD=
\ No newline at end of file
diff --git a/app/(auth)/admin/downloads/page.tsx b/app/(auth)/admin/downloads/page.tsx
index 0625f43..5d0b28f 100644
--- a/app/(auth)/admin/downloads/page.tsx
+++ b/app/(auth)/admin/downloads/page.tsx
@@ -1,70 +1,125 @@
"use client";
-import { downloadSchema } from "@/lib/validations/validation";
-import { zodResolver } from "@hookform/resolvers/zod";
-import { useForm } from "react-hook-form";
-import { z } from "zod";
+import React from "react";
+import { useForm, SubmitHandler } from "react-hook-form";
+import { zodResolver } from "@hookform/resolvers/zod";
+import { z } from "zod";
import { Button } from "@/components/ui/button";
import {
Form,
FormControl,
- FormDescription,
FormField,
FormItem,
FormLabel,
FormMessage,
} from "@/components/ui/form";
import { Input } from "@/components/ui/input";
+import { UploadButton, UploadDropzone } from "@/lib/uploadthing";
+import { downloadSchema } from "@/lib/validations/validation";
-const DownloadPage = () => {
+const AdminPage = () => {
const form = useForm>({
resolver: zodResolver(downloadSchema),
- defaultValues: {
- username: "",
- },
});
- function onSubmit(values: z.infer) {
- // Do something with the form values.
- // ✅ This will be type-safe and validated.
- console.log(values);
- }
+ const onSubmit: SubmitHandler> = async (
+ data
+ ) => {
+ const response = await fetch("/api/upload", {
+ method: "POST",
+ headers: {
+ "Content-Type": "application/json",
+ },
+ body: JSON.stringify(data),
+ });
+
+ if (response.ok) {
+ console.log("Upload successful");
+ alert("Uploaded");
+ form.reset();
+ } else {
+ console.error("Upload failed");
+ alert("Upload Failed");
+ }
+ };
return (
-
- Download Section
-
-
-
-
-
+ Submit
+
+
+
);
};
-export default DownloadPage;
+export default AdminPage;
diff --git a/app/(root)/downloads/page.tsx b/app/(root)/downloads/page.tsx
index 4f2662d..f256830 100644
--- a/app/(root)/downloads/page.tsx
+++ b/app/(root)/downloads/page.tsx
@@ -4,46 +4,19 @@ import {
TableBody,
TableCaption,
TableCell,
- TableFooter,
TableHead,
TableHeader,
TableRow,
} from "@/components/ui/table";
import { Download } from "lucide-react";
import Link from "next/link";
+import clientPromise from "@/lib/db";
-const downloads = [
- {
- date: "2024-06-01",
- fileName: "SVRJS_v1.0.0.zip",
- version: "1.0.0",
- fileSize: "15MB",
- downloadLink: "/downloads/SVRJS_v1.0.0.zip",
- },
- {
- date: "2024-06-10",
- fileName: "SVRJS_v1.1.0.zip",
- version: "1.1.0",
- fileSize: "18MB",
- downloadLink: "/downloads/SVRJS_v1.1.0.zip",
- },
- {
- date: "2024-06-15",
- fileName: "SVRJS_v1.2.0.zip",
- version: "1.2.0",
- fileSize: "20MB",
- downloadLink: "/downloads/SVRJS_v1.2.0.zip",
- },
- {
- date: "2024-06-20",
- fileName: "SVRJS_v1.3.0.zip",
- version: "1.3.0",
- fileSize: "22MB",
- downloadLink: "/downloads/SVRJS_v1.3.0.zip",
- },
-];
+const DownloadPage = async () => {
+ const client = await clientPromise;
+ const db = client.db("downloadsDatabase");
+ const downloads = await db.collection("downloads").find().toArray();
-const DownloadPage = () => {
return (
{
Date
File Name
Version
- Download Link
- File Size
+ File Size
+ Download Link
- {downloads.map((download) => (
-
- {download.date}
- {download.fileName}
- {download.version}
- {download.fileSize}
-
-
-
-
-
-
- ))}
+ {downloads
+ .slice()
+ .reverse()
+ .map((download: any) => (
+
+ {download.date}
+ {download.fileName}
+ {download.version}
+ {download.fileSize}
+
+
+
+
+
+
+ ))}
diff --git a/app/api/upload/route.ts b/app/api/upload/route.ts
new file mode 100644
index 0000000..abe2283
--- /dev/null
+++ b/app/api/upload/route.ts
@@ -0,0 +1,20 @@
+import { NextResponse } from "next/server";
+import clientPromise from "@/lib/db";
+
+export async function POST(request: Request) {
+ const body = await request.json();
+ const { fileName, version, downloadLink, fileSize } = body;
+
+ const client = await clientPromise;
+ const db = client.db("downloadsDatabase");
+
+ const result = await db.collection("downloads").insertOne({
+ date: new Date().toISOString().split("T")[0],
+ fileName,
+ version,
+ downloadLink,
+ fileSize,
+ });
+
+ return NextResponse.json({ success: true, id: result.insertedId });
+}
diff --git a/app/api/uploadthing/core.ts b/app/api/uploadthing/core.ts
new file mode 100644
index 0000000..3a26bf3
--- /dev/null
+++ b/app/api/uploadthing/core.ts
@@ -0,0 +1,22 @@
+import { createUploadthing, type FileRouter } from "uploadthing/next";
+import { UploadThingError } from "uploadthing/server";
+
+const f = createUploadthing();
+
+// const auth = (req: Request) => ({ id: "fakeId" });
+
+export const ourFileRouter = {
+ imageUploader: f({ "application/zip": { maxFileSize: "8MB" } })
+ // .middleware(async ({ req }) => {
+ // const user = await auth(req);
+ // if (!user) throw new UploadThingError("Unauthorized");
+ // return { userId: user.id };
+ // })
+ .onUploadComplete(async ({ metadata, file }) => {
+ // console.log("Upload complete for userId:", metadata.userId);
+ console.log("file url", file.url);
+ // return { uploadedBy: metadata.userId };
+ }),
+} satisfies FileRouter;
+
+export type OurFileRouter = typeof ourFileRouter;
diff --git a/app/api/uploadthing/route.ts b/app/api/uploadthing/route.ts
new file mode 100644
index 0000000..f8f1912
--- /dev/null
+++ b/app/api/uploadthing/route.ts
@@ -0,0 +1,6 @@
+import { createRouteHandler } from "uploadthing/next";
+import { ourFileRouter } from "./core";
+
+export const { GET, POST } = createRouteHandler({
+ router: ourFileRouter,
+});
diff --git a/lib/db.ts b/lib/db.ts
new file mode 100644
index 0000000..6e6ea2e
--- /dev/null
+++ b/lib/db.ts
@@ -0,0 +1,24 @@
+import { MongoClient } from "mongodb";
+
+if (!process.env.MONGODB_URI) {
+ throw new Error('Invalid/Missing environment variable: "MONGODB_URI"');
+}
+
+const uri = process.env.MONGODB_URI;
+const options = {};
+
+let client;
+let clientPromise: Promise;
+
+if (process.env.NODE_ENV === "development") {
+ if (!(global as any)._mongoClientPromise) {
+ client = new MongoClient(uri!, options);
+ (global as any)._mongoClientPromise = client.connect();
+ }
+ clientPromise = (global as any)._mongoClientPromise;
+} else {
+ client = new MongoClient(uri!, options);
+ clientPromise = client.connect();
+}
+
+export default clientPromise;
diff --git a/lib/uploadthing.ts b/lib/uploadthing.ts
new file mode 100644
index 0000000..eded484
--- /dev/null
+++ b/lib/uploadthing.ts
@@ -0,0 +1,9 @@
+import {
+ generateUploadButton,
+ generateUploadDropzone,
+} from "@uploadthing/react";
+
+import type { OurFileRouter } from "@/app/api/uploadthing/core";
+
+export const UploadButton = generateUploadButton();
+export const UploadDropzone = generateUploadDropzone();
diff --git a/lib/validations/validation.ts b/lib/validations/validation.ts
index e67736c..4cbcaab 100644
--- a/lib/validations/validation.ts
+++ b/lib/validations/validation.ts
@@ -1,7 +1,8 @@
import { z } from "zod";
export const downloadSchema = z.object({
- username: z.string().min(2, {
- message: "Username must be at least 2 characters.",
- }),
+ fileName: z.string().nonempty(),
+ version: z.string().nonempty(),
+ downloadLink: z.string().url().nonempty(),
+ fileSize: z.string().nonempty(),
});
diff --git a/package-lock.json b/package-lock.json
index f0f2278..19cd20c 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -20,12 +20,14 @@
"@radix-ui/react-slot": "^1.1.0",
"@radix-ui/themes": "^3.0.5",
"@types/cookie": "^0.6.0",
+ "@uploadthing/react": "^6.6.0",
"class-variance-authority": "^0.7.0",
"clsx": "^2.1.1",
"cookie": "^0.6.0",
"framer-motion": "^11.2.10",
"lucide-react": "^0.394.0",
"mini-svg-data-uri": "^1.4.4",
+ "mongoose": "^8.4.3",
"next": "14.2.3",
"next-themes": "^0.3.0",
"react": "^18",
@@ -34,6 +36,7 @@
"react-hook-form": "^7.52.0",
"tailwind-merge": "^2.3.0",
"tailwindcss-animate": "^1.0.7",
+ "uploadthing": "^6.12.0",
"zod": "^3.23.8"
},
"devDependencies": {
@@ -69,6 +72,16 @@
"node": ">=6.9.0"
}
},
+ "node_modules/@effect/schema": {
+ "version": "0.66.16",
+ "resolved": "https://registry.npmjs.org/@effect/schema/-/schema-0.66.16.tgz",
+ "integrity": "sha512-sT/k5NOgKslGPzs3DUaCFuM6g2JQoIIT8jpwEorAZooplPIMK2xIspr7ECz6pp6Dc7Wz/ppXGk7HVyGZQsIYEQ==",
+ "license": "MIT",
+ "peerDependencies": {
+ "effect": "^3.1.3",
+ "fast-check": "^3.13.2"
+ }
+ },
"node_modules/@eslint-community/eslint-utils": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz",
@@ -332,6 +345,15 @@
"@jridgewell/sourcemap-codec": "^1.4.14"
}
},
+ "node_modules/@mongodb-js/saslprep": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.7.tgz",
+ "integrity": "sha512-dCHW/oEX0KJ4NjDULBo3JiOaK5+6axtpBbS+ao2ZInoAL9/YRQLhXzSNAFz7hP4nzLkIqsfYAK/PDE3+XHny0Q==",
+ "license": "MIT",
+ "dependencies": {
+ "sparse-bitfield": "^3.0.3"
+ }
+ },
"node_modules/@next/env": {
"version": "14.2.3",
"resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.3.tgz",
@@ -2183,6 +2205,21 @@
"@types/react": "*"
}
},
+ "node_modules/@types/webidl-conversions": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz",
+ "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==",
+ "license": "MIT"
+ },
+ "node_modules/@types/whatwg-url": {
+ "version": "11.0.5",
+ "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-11.0.5.tgz",
+ "integrity": "sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/webidl-conversions": "*"
+ }
+ },
"node_modules/@typescript-eslint/parser": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.2.0.tgz",
@@ -2316,6 +2353,74 @@
"integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==",
"dev": true
},
+ "node_modules/@uploadthing/dropzone": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/@uploadthing/dropzone/-/dropzone-0.4.1.tgz",
+ "integrity": "sha512-RHSpo/2kg/mrRSYQA4EKlyvkOCYWOeE2+QQYW9YiUvWCuawnTfD7DQvk8RN/nYXi1Sw7/v0NegmQpiVELVGtnA==",
+ "license": "MIT",
+ "dependencies": {
+ "file-selector": "^0.6.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0",
+ "solid-js": "^1.7.11",
+ "svelte": "^4.2.12",
+ "vue": "^3.4.0"
+ },
+ "peerDependenciesMeta": {
+ "react": {
+ "optional": true
+ },
+ "solid-js": {
+ "optional": true
+ },
+ "svelte": {
+ "optional": true
+ },
+ "vue": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@uploadthing/mime-types": {
+ "version": "0.2.10",
+ "resolved": "https://registry.npmjs.org/@uploadthing/mime-types/-/mime-types-0.2.10.tgz",
+ "integrity": "sha512-kz3F0oEgAyts25NAGXlUBCWh3mXonbSOQJFGFMawHuIgbUbnzXbe4w5WI+0XdneCbjNmikfWrdWrs8m/7HATfQ==",
+ "license": "MIT"
+ },
+ "node_modules/@uploadthing/react": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/@uploadthing/react/-/react-6.6.0.tgz",
+ "integrity": "sha512-jLN4Oy21d0n8F6CNPl9qjEu0/Q1rnddSxny/02Lm89L/sYuR4RXfk1vBgBGPAGXBak0BO9z5eEmYURLrXXUAJQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@uploadthing/dropzone": "0.4.1",
+ "@uploadthing/shared": "6.7.5",
+ "file-selector": "^0.6.0",
+ "tailwind-merge": "^2.2.1"
+ },
+ "peerDependencies": {
+ "next": "*",
+ "react": "^17.0.2 || ^18.0.0",
+ "uploadthing": "6.12.0"
+ },
+ "peerDependenciesMeta": {
+ "next": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@uploadthing/shared": {
+ "version": "6.7.5",
+ "resolved": "https://registry.npmjs.org/@uploadthing/shared/-/shared-6.7.5.tgz",
+ "integrity": "sha512-BZXzvh6zGEt4ip//mxfXdRTNWYw9XJ6tommL6A1TEo2l8jvdNbUpPUwXnMVWBMwio2b48BO7D9V3siYIKMD4pg==",
+ "license": "MIT",
+ "dependencies": {
+ "@uploadthing/mime-types": "0.2.10",
+ "effect": "^3.1.0",
+ "std-env": "^3.7.0"
+ }
+ },
"node_modules/acorn": {
"version": "8.11.3",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz",
@@ -2670,6 +2775,15 @@
"node": ">=8"
}
},
+ "node_modules/bson": {
+ "version": "6.7.0",
+ "resolved": "https://registry.npmjs.org/bson/-/bson-6.7.0.tgz",
+ "integrity": "sha512-w2IquM5mYzYZv6rs3uN2DZTOBe2a0zXLj53TGDqwF4l6Sz/XsISrisXOJihArF9+BZ6Cq/GjVht7Sjfmri7ytQ==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=16.20.1"
+ }
+ },
"node_modules/busboy": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz",
@@ -2854,6 +2968,15 @@
"integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
"dev": true
},
+ "node_modules/consola": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz",
+ "integrity": "sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==",
+ "license": "MIT",
+ "engines": {
+ "node": "^14.18.0 || >=16.10.0"
+ }
+ },
"node_modules/cookie": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz",
@@ -2953,7 +3076,6 @@
"version": "4.3.5",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz",
"integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==",
- "dev": true,
"dependencies": {
"ms": "2.1.2"
},
@@ -3059,6 +3181,12 @@
"resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
"integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="
},
+ "node_modules/effect": {
+ "version": "3.3.5",
+ "resolved": "https://registry.npmjs.org/effect/-/effect-3.3.5.tgz",
+ "integrity": "sha512-ehDpb+3zRTYsCqDWY32rT4oxtG0BJ797+HSog+FPjiWKjNxnPgpslUIQha8CoxqFZln2ZeBRv00tzGIhUAQKsw==",
+ "license": "MIT"
+ },
"node_modules/emoji-regex": {
"version": "9.2.2",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
@@ -3659,6 +3787,28 @@
"node": ">=0.10.0"
}
},
+ "node_modules/fast-check": {
+ "version": "3.19.0",
+ "resolved": "https://registry.npmjs.org/fast-check/-/fast-check-3.19.0.tgz",
+ "integrity": "sha512-CO2JX/8/PT9bDGO1iXa5h5ey1skaKI1dvecERyhH4pp3PGjwd3KIjMAXEg79Ps9nclsdt4oPbfqiAnLU0EwrAQ==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/dubzzz"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/fast-check"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "pure-rand": "^6.1.0"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
"node_modules/fast-deep-equal": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
@@ -3723,6 +3873,18 @@
"node": "^10.12.0 || >=12.0.0"
}
},
+ "node_modules/file-selector": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-0.6.0.tgz",
+ "integrity": "sha512-QlZ5yJC0VxHxQQsQhXvBaC7VRJ2uaxTf+Tfpu4Z/OcVQJVpZO+DGU0rkoVW5ce2SccxugvpBJoMvUs59iILYdw==",
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "^2.4.0"
+ },
+ "engines": {
+ "node": ">= 12"
+ }
+ },
"node_modules/fill-range": {
"version": "7.1.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
@@ -4682,6 +4844,15 @@
"node": ">=4.0"
}
},
+ "node_modules/kareem": {
+ "version": "2.6.3",
+ "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.6.3.tgz",
+ "integrity": "sha512-C3iHfuGUXK2u8/ipq9LfjFfXFxAZMQJJq7vLS45r3D9Y2xQ/m4S8zaR4zMLFWh9AsNPXmcFfUDhTEO8UIC/V6Q==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
"node_modules/keyv": {
"version": "4.5.4",
"resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
@@ -4783,6 +4954,12 @@
"react": "^16.5.1 || ^17.0.0 || ^18.0.0"
}
},
+ "node_modules/memory-pager": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz",
+ "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==",
+ "license": "MIT"
+ },
"node_modules/merge2": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
@@ -4841,11 +5018,115 @@
"node": ">=16 || 14 >=14.17"
}
},
+ "node_modules/mongodb": {
+ "version": "6.6.2",
+ "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.6.2.tgz",
+ "integrity": "sha512-ZF9Ugo2JCG/GfR7DEb4ypfyJJyiKbg5qBYKRintebj8+DNS33CyGMkWbrS9lara+u+h+yEOGSRiLhFO/g1s1aw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@mongodb-js/saslprep": "^1.1.5",
+ "bson": "^6.7.0",
+ "mongodb-connection-string-url": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=16.20.1"
+ },
+ "peerDependencies": {
+ "@aws-sdk/credential-providers": "^3.188.0",
+ "@mongodb-js/zstd": "^1.1.0",
+ "gcp-metadata": "^5.2.0",
+ "kerberos": "^2.0.1",
+ "mongodb-client-encryption": ">=6.0.0 <7",
+ "snappy": "^7.2.2",
+ "socks": "^2.7.1"
+ },
+ "peerDependenciesMeta": {
+ "@aws-sdk/credential-providers": {
+ "optional": true
+ },
+ "@mongodb-js/zstd": {
+ "optional": true
+ },
+ "gcp-metadata": {
+ "optional": true
+ },
+ "kerberos": {
+ "optional": true
+ },
+ "mongodb-client-encryption": {
+ "optional": true
+ },
+ "snappy": {
+ "optional": true
+ },
+ "socks": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/mongodb-connection-string-url": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-3.0.1.tgz",
+ "integrity": "sha512-XqMGwRX0Lgn05TDB4PyG2h2kKO/FfWJyCzYQbIhXUxz7ETt0I/FqHjUeqj37irJ+Dl1ZtU82uYyj14u2XsZKfg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@types/whatwg-url": "^11.0.2",
+ "whatwg-url": "^13.0.0"
+ }
+ },
+ "node_modules/mongoose": {
+ "version": "8.4.3",
+ "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.4.3.tgz",
+ "integrity": "sha512-GxPVLD+I/dxVkgcts2r2QmJJvS62/++btVj3RFt8YnHt+DSOp1Qjj62YEvgZaElwIOTcc4KGJM95X5LlrU1qQg==",
+ "license": "MIT",
+ "dependencies": {
+ "bson": "^6.7.0",
+ "kareem": "2.6.3",
+ "mongodb": "6.6.2",
+ "mpath": "0.9.0",
+ "mquery": "5.0.0",
+ "ms": "2.1.3",
+ "sift": "17.1.3"
+ },
+ "engines": {
+ "node": ">=16.20.1"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mongoose"
+ }
+ },
+ "node_modules/mongoose/node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "license": "MIT"
+ },
+ "node_modules/mpath": {
+ "version": "0.9.0",
+ "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz",
+ "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/mquery": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/mquery/-/mquery-5.0.0.tgz",
+ "integrity": "sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg==",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "4.x"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
"node_modules/ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
},
"node_modules/mz": {
"version": "2.7.0",
@@ -5433,11 +5714,26 @@
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
"integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
- "dev": true,
"engines": {
"node": ">=6"
}
},
+ "node_modules/pure-rand": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz",
+ "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/dubzzz"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/fast-check"
+ }
+ ],
+ "license": "MIT"
+ },
"node_modules/queue-microtask": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
@@ -5871,6 +6167,12 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/sift": {
+ "version": "17.1.3",
+ "resolved": "https://registry.npmjs.org/sift/-/sift-17.1.3.tgz",
+ "integrity": "sha512-Rtlj66/b0ICeFzYTuNvX/EF1igRbbnGSvEyT79McoZa/DeGhMyC5pWKOEsZKnpkqtSeovd5FL/bjHWC3CIIvCQ==",
+ "license": "MIT"
+ },
"node_modules/signal-exit": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
@@ -5899,6 +6201,21 @@
"node": ">=0.10.0"
}
},
+ "node_modules/sparse-bitfield": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz",
+ "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==",
+ "license": "MIT",
+ "dependencies": {
+ "memory-pager": "^1.0.2"
+ }
+ },
+ "node_modules/std-env": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz",
+ "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==",
+ "license": "MIT"
+ },
"node_modules/streamsearch": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz",
@@ -6254,6 +6571,18 @@
"node": ">=8.0"
}
},
+ "node_modules/tr46": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz",
+ "integrity": "sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==",
+ "license": "MIT",
+ "dependencies": {
+ "punycode": "^2.3.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
"node_modules/ts-api-utils": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz",
@@ -6419,6 +6748,48 @@
"integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==",
"dev": true
},
+ "node_modules/uploadthing": {
+ "version": "6.12.0",
+ "resolved": "https://registry.npmjs.org/uploadthing/-/uploadthing-6.12.0.tgz",
+ "integrity": "sha512-uoWG1riH6z2IHCcbMo3xnGe6p/+sx2PPOOLOsk5DeqGv5HtlY7ISauFFRXW8H+jdhevZm1n/j4Je/Z+bbIziSg==",
+ "license": "MIT",
+ "dependencies": {
+ "@effect/schema": "^0.66.12",
+ "@uploadthing/mime-types": "0.2.10",
+ "@uploadthing/shared": "6.7.5",
+ "consola": "^3.2.3",
+ "effect": "^3.1.0",
+ "fast-check": "^3.18.0",
+ "std-env": "^3.7.0"
+ },
+ "engines": {
+ "node": ">=18.13.0"
+ },
+ "peerDependencies": {
+ "express": "*",
+ "fastify": "*",
+ "h3": "*",
+ "next": "*",
+ "tailwindcss": "*"
+ },
+ "peerDependenciesMeta": {
+ "express": {
+ "optional": true
+ },
+ "fastify": {
+ "optional": true
+ },
+ "h3": {
+ "optional": true
+ },
+ "next": {
+ "optional": true
+ },
+ "tailwindcss": {
+ "optional": true
+ }
+ }
+ },
"node_modules/uri-js": {
"version": "4.4.1",
"resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
@@ -6474,6 +6845,28 @@
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
},
+ "node_modules/webidl-conversions": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
+ "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/whatwg-url": {
+ "version": "13.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-13.0.0.tgz",
+ "integrity": "sha512-9WWbymnqj57+XEuqADHrCJ2eSXzn8WXIW/YSGaZtb2WKAInQ6CHfaUUcTyyver0p8BDg5StLQq8h1vtZuwmOig==",
+ "license": "MIT",
+ "dependencies": {
+ "tr46": "^4.1.1",
+ "webidl-conversions": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
"node_modules/which": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
diff --git a/package.json b/package.json
index 7f3de55..f44a3cf 100644
--- a/package.json
+++ b/package.json
@@ -21,12 +21,14 @@
"@radix-ui/react-slot": "^1.1.0",
"@radix-ui/themes": "^3.0.5",
"@types/cookie": "^0.6.0",
+ "@uploadthing/react": "^6.6.0",
"class-variance-authority": "^0.7.0",
"clsx": "^2.1.1",
"cookie": "^0.6.0",
"framer-motion": "^11.2.10",
"lucide-react": "^0.394.0",
"mini-svg-data-uri": "^1.4.4",
+ "mongoose": "^8.4.3",
"next": "14.2.3",
"next-themes": "^0.3.0",
"react": "^18",
@@ -35,6 +37,7 @@
"react-hook-form": "^7.52.0",
"tailwind-merge": "^2.3.0",
"tailwindcss-animate": "^1.0.7",
+ "uploadthing": "^6.12.0",
"zod": "^3.23.8"
},
"devDependencies": {
--
2.39.5
From cf0cb92c539956e8fbe82e562b547986b72cbf23 Mon Sep 17 00:00:00 2001
From: Proxyy587
Date: Thu, 20 Jun 2024 23:41:35 +0530
Subject: [PATCH 005/149] font fixed
---
app/layout.tsx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/layout.tsx b/app/layout.tsx
index 7e8f296..895d1bc 100644
--- a/app/layout.tsx
+++ b/app/layout.tsx
@@ -20,7 +20,7 @@ export default function RootLayout({
}>) {
return (
-
+
Date: Fri, 21 Jun 2024 00:16:05 +0530
Subject: [PATCH 006/149] maybe i fixed it pls?
---
app/(auth)/admin/downloads/page.tsx | 2 +-
app/(root)/downloads/page.tsx | 49 +++++++++++++++++++++++++----
app/api/downloads/route.ts | 17 ++++++++++
3 files changed, 61 insertions(+), 7 deletions(-)
create mode 100644 app/api/downloads/route.ts
diff --git a/app/(auth)/admin/downloads/page.tsx b/app/(auth)/admin/downloads/page.tsx
index 5d0b28f..286cfaf 100644
--- a/app/(auth)/admin/downloads/page.tsx
+++ b/app/(auth)/admin/downloads/page.tsx
@@ -34,9 +34,9 @@ const AdminPage = () => {
});
if (response.ok) {
+ form.reset();
console.log("Upload successful");
alert("Uploaded");
- form.reset();
} else {
console.error("Upload failed");
alert("Upload Failed");
diff --git a/app/(root)/downloads/page.tsx b/app/(root)/downloads/page.tsx
index f256830..6dcfb5a 100644
--- a/app/(root)/downloads/page.tsx
+++ b/app/(root)/downloads/page.tsx
@@ -1,3 +1,6 @@
+"use client";
+
+import { useEffect, useState } from "react";
import { Button } from "@/components/ui/button";
import {
Table,
@@ -10,12 +13,45 @@ import {
} from "@/components/ui/table";
import { Download } from "lucide-react";
import Link from "next/link";
-import clientPromise from "@/lib/db";
-const DownloadPage = async () => {
- const client = await clientPromise;
- const db = client.db("downloadsDatabase");
- const downloads = await db.collection("downloads").find().toArray();
+interface Download {
+ _id: string;
+ date: string;
+ fileName: string;
+ version: string;
+ fileSize: string;
+ downloadLink: string;
+}
+
+const DownloadPage: React.FC = () => {
+ const [downloads, setDownloads] = useState([]);
+ const [error, setError] = useState("");
+
+ const fetchDownloads = async () => {
+ try {
+ const response = await fetch("/api/downloads", {
+ method: "GET",
+ });
+ if (response.ok) {
+ const data: Download[] = await response.json();
+ setDownloads(data);
+ } else {
+ throw new Error(`HTTP error! status: ${response.status}`);
+ }
+ } catch (error: any) {
+ setError(error);
+ }
+ };
+
+ useEffect(() => {
+ fetchDownloads();
+
+ const interval = setInterval(() => {
+ fetchDownloads();
+ }, 10000);
+
+ return () => clearInterval(interval);
+ }, []);
return (
{
Get all the latest version of SVRJS download and compiled Files here!
+ {error && {error} }
A list of all available downloads.
@@ -43,7 +80,7 @@ const DownloadPage = async () => {
{downloads
.slice()
.reverse()
- .map((download: any) => (
+ .map((download) => (
{download.date}
{download.fileName}
diff --git a/app/api/downloads/route.ts b/app/api/downloads/route.ts
new file mode 100644
index 0000000..23a04df
--- /dev/null
+++ b/app/api/downloads/route.ts
@@ -0,0 +1,17 @@
+import { NextRequest, NextResponse } from "next/server";
+import clientPromise from "@/lib/db";
+
+// Handler for GET requests
+export async function GET(req: NextRequest) {
+ try {
+ const client = await clientPromise;
+ const db = client.db("downloadsDatabase");
+ const downloads = await db.collection("downloads").find().toArray();
+ return NextResponse.json(downloads, { status: 200 });
+ } catch (error) {
+ return NextResponse.json(
+ { error: "Failed to fetch downloads" },
+ { status: 500 }
+ );
+ }
+}
--
2.39.5
From 5328af6265e2fe34e6a3f827845743412b920562 Mon Sep 17 00:00:00 2001
From: Proxyy587
Date: Fri, 21 Jun 2024 00:26:44 +0530
Subject: [PATCH 007/149] oof i hate this mongodb update thing
---
app/(root)/downloads/page.tsx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/(root)/downloads/page.tsx b/app/(root)/downloads/page.tsx
index 6dcfb5a..5311df4 100644
--- a/app/(root)/downloads/page.tsx
+++ b/app/(root)/downloads/page.tsx
@@ -78,8 +78,8 @@ const DownloadPage: React.FC = () => {
{downloads
- .slice()
.reverse()
+ .slice(10)
.map((download) => (
{download.date}
--
2.39.5
From 8db4d65295c3c775e0209abb2b4d7967c55765e1 Mon Sep 17 00:00:00 2001
From: Proxyy587
Date: Fri, 21 Jun 2024 00:37:05 +0530
Subject: [PATCH 008/149] downloads page.tsx line 81
---
app/(root)/downloads/page.tsx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/(root)/downloads/page.tsx b/app/(root)/downloads/page.tsx
index 5311df4..78b33c2 100644
--- a/app/(root)/downloads/page.tsx
+++ b/app/(root)/downloads/page.tsx
@@ -78,8 +78,8 @@ const DownloadPage: React.FC = () => {
{downloads
+ .slice(0, 10)
.reverse()
- .slice(10)
.map((download) => (
{download.date}
--
2.39.5
From 04af299887a5bef7873a18fc6b14782d714a3816 Mon Sep 17 00:00:00 2001
From: Proxyy587
Date: Sat, 22 Jun 2024 14:00:51 +0530
Subject: [PATCH 009/149] maybe fixed
---
.env.example | 2 +-
actions/login.action.ts | 20 +++--
app/(auth)/admin/changelogs/page.tsx | 123 +++++++++++++++++++++++++++
app/(auth)/admin/mods/page.tsx | 123 +++++++++++++++++++++++++++
app/(root)/blog/page.tsx | 4 +
app/(root)/changelogs/page.tsx | 92 ++++++++++++++++++++
app/(root)/docs/page.tsx | 16 +++-
app/(root)/layout.tsx | 23 +++--
app/(root)/mods/layout.tsx | 11 +++
app/(root)/mods/page.tsx | 112 +++++++++++++-----------
app/api/downloads/route.ts | 1 +
app/api/logs/route.ts | 17 ++++
app/api/mods/route.ts | 17 ++++
app/api/uploadlogs/route.ts | 20 +++++
app/api/uploadmods/route.ts | 20 +++++
components/shared/Sidebar.tsx | 24 ++++++
lib/db.ts | 33 ++++---
lib/validations/validation.ts | 14 +++
package-lock.json | 67 +--------------
package.json | 4 -
tsconfig.json | 2 +-
21 files changed, 594 insertions(+), 151 deletions(-)
create mode 100644 app/(auth)/admin/changelogs/page.tsx
create mode 100644 app/(auth)/admin/mods/page.tsx
create mode 100644 app/(root)/changelogs/page.tsx
create mode 100644 app/(root)/mods/layout.tsx
create mode 100644 app/api/logs/route.ts
create mode 100644 app/api/mods/route.ts
create mode 100644 app/api/uploadlogs/route.ts
create mode 100644 app/api/uploadmods/route.ts
create mode 100644 components/shared/Sidebar.tsx
diff --git a/.env.example b/.env.example
index dc0218b..8d88136 100644
--- a/.env.example
+++ b/.env.example
@@ -1,4 +1,4 @@
-MONGO_URI=
+MONGODB_URI=
UPLOADTHING_SECRET=
UPLOADTHING_APP_ID=
diff --git a/actions/login.action.ts b/actions/login.action.ts
index ffa2912..a2cc4a4 100644
--- a/actions/login.action.ts
+++ b/actions/login.action.ts
@@ -1,9 +1,13 @@
-"use server";
+// 'use server';
+// import { NextApiRequest } from 'next';
+// import { NextResponse } from 'next/server';
-export function CheckLoggedIn(username: string, password: string) {
- if (
- username === process.env.ADMIN_USERNAME &&
- password === process.env.ADMIN_PASSWORD
- ) {
- }
-}
+// export async function POST(req: NextApiRequest) {
+// const { username, password } = await req.body;
+
+// if (username === process.env.USERNAME && password === process.env.PASSWORD) {
+// return NextResponse.json({ success: true });
+// } else {
+// return NextResponse.json({ success: false });
+// }
+// }
diff --git a/app/(auth)/admin/changelogs/page.tsx b/app/(auth)/admin/changelogs/page.tsx
new file mode 100644
index 0000000..ae89cb2
--- /dev/null
+++ b/app/(auth)/admin/changelogs/page.tsx
@@ -0,0 +1,123 @@
+"use client";
+
+import React from "react";
+import { useForm, SubmitHandler } from "react-hook-form";
+import { zodResolver } from "@hookform/resolvers/zod";
+import { z } from "zod";
+import { Button } from "@/components/ui/button";
+import {
+ Form,
+ FormControl,
+ FormField,
+ FormItem,
+ FormLabel,
+ FormMessage,
+} from "@/components/ui/form";
+import { Input } from "@/components/ui/input";
+import { UploadButton, UploadDropzone } from "@/lib/uploadthing";
+import { logsSchema } from "@/lib/validations/validation";
+
+const AdminPage = () => {
+ const form = useForm>({
+ resolver: zodResolver(logsSchema),
+ });
+
+ const onSubmit: SubmitHandler> = async (data) => {
+ const response = await fetch("/api/uploadlogs", {
+ method: "POST",
+ headers: {
+ "Content-Type": "application/json",
+ },
+ body: JSON.stringify(data),
+ });
+
+ if (response.ok) {
+ form.reset();
+ console.log("Upload successful");
+ alert("Uploaded");
+ } else {
+ console.error("Upload failed");
+ alert("Upload Failed");
+ }
+ };
+
+ return (
+
+ Admin Upload Section
+
+
+
+ );
+};
+
+export default AdminPage;
diff --git a/app/(auth)/admin/mods/page.tsx b/app/(auth)/admin/mods/page.tsx
new file mode 100644
index 0000000..131f3fb
--- /dev/null
+++ b/app/(auth)/admin/mods/page.tsx
@@ -0,0 +1,123 @@
+"use client";
+
+import React from "react";
+import { useForm, SubmitHandler } from "react-hook-form";
+import { zodResolver } from "@hookform/resolvers/zod";
+import { z } from "zod";
+import { Button } from "@/components/ui/button";
+import {
+ Form,
+ FormControl,
+ FormField,
+ FormItem,
+ FormLabel,
+ FormMessage,
+} from "@/components/ui/form";
+import { Input } from "@/components/ui/input";
+import { UploadButton, UploadDropzone } from "@/lib/uploadthing";
+import { modsSchema } from "@/lib/validations/validation";
+
+const AdminPage = () => {
+ const form = useForm>({
+ resolver: zodResolver(modsSchema),
+ });
+
+ const onSubmit: SubmitHandler> = async (data) => {
+ const response = await fetch("/api/uploadmods", {
+ method: "POST",
+ headers: {
+ "Content-Type": "application/json",
+ },
+ body: JSON.stringify(data),
+ });
+
+ if (response.ok) {
+ form.reset();
+ console.log("Upload successful");
+ alert("Uploaded");
+ } else {
+ console.error("Upload failed");
+ alert("Upload Failed");
+ }
+ };
+
+ return (
+
+ Admin Upload Section
+
+
+
+ );
+};
+
+export default AdminPage;
diff --git a/app/(root)/blog/page.tsx b/app/(root)/blog/page.tsx
index 96f2896..fc1f38e 100644
--- a/app/(root)/blog/page.tsx
+++ b/app/(root)/blog/page.tsx
@@ -1,5 +1,9 @@
import React from "react";
+import { Metadata } from "next";
+export const metadata: Metadata = {
+ title: "Blog - SVRJS",
+};
const BlogPage = () => {
return BlogPage ;
};
diff --git a/app/(root)/changelogs/page.tsx b/app/(root)/changelogs/page.tsx
new file mode 100644
index 0000000..685d275
--- /dev/null
+++ b/app/(root)/changelogs/page.tsx
@@ -0,0 +1,92 @@
+"use client";
+
+import { useEffect, useState } from "react";
+import { Button } from "@/components/ui/button";
+import {
+ Table,
+ TableBody,
+ TableCaption,
+ TableCell,
+ TableHead,
+ TableHeader,
+ TableRow,
+} from "@/components/ui/table";
+import { Download } from "lucide-react";
+import Link from "next/link";
+
+interface LOGS {
+ _id: string;
+ date: string;
+ fileName: string;
+ version: string;
+ fileSize: string;
+ downloadLink: string;
+}
+
+const DownloadPage: React.FC = () => {
+ const [downloads, setDownloads] = useState([]);
+ const [error, setError] = useState("");
+
+ const fetchDownloads = async () => {
+ try {
+ const response = await fetch("/api/logs", {
+ method: "GET",
+ });
+ if (response.ok) {
+ const data: LOGS[] = await response.json();
+ setDownloads(data);
+ } else {
+ throw new Error(`HTTP error! status: ${response.status}`);
+ }
+ } catch (error: any) {
+ setError(error);
+ }
+ };
+
+ useEffect(() => {
+ fetchDownloads();
+
+ const interval = setInterval(() => {
+ fetchDownloads();
+ }, 10000);
+
+ return () => clearInterval(interval);
+ }, []);
+
+ return (
+
+
+ Server LOGS
+
+
+ Get all the latest version of SVRJS download and compiled Files here!
+
+ {error && {error} }
+
+ {downloads
+ .slice(0, 10)
+ .reverse()
+ .map((download) => (
+
+ {download.date}
+ {download.fileName}
+ {download.version}
+ {download.fileSize}
+
+
+
+
+
+
+ ))}
+
+ );
+};
+
+export default DownloadPage;
diff --git a/app/(root)/docs/page.tsx b/app/(root)/docs/page.tsx
index d6f0108..6947113 100644
--- a/app/(root)/docs/page.tsx
+++ b/app/(root)/docs/page.tsx
@@ -1,7 +1,15 @@
-import React from "react";
+import Sidebar from "@/components/shared/Sidebar";
-const Docs = () => {
- return Docs ;
+import { Metadata } from "next";
+
+export const metadata: Metadata = {
+ title: "Docs - SVRJS",
};
-export default Docs;
+export default function Page() {
+ return (
+ <>
+
+ >
+ );
+}
diff --git a/app/(root)/layout.tsx b/app/(root)/layout.tsx
index 1776783..2a90436 100644
--- a/app/(root)/layout.tsx
+++ b/app/(root)/layout.tsx
@@ -1,16 +1,21 @@
import Footer from "@/components/shared/Footer";
import Navbar from "@/components/shared/Navbar";
+import { Metadata } from "next";
+
+export const metadata: Metadata = {
+ title: "Home - SVRJS",
+};
export default function PageLayout({
- children,
+ children,
}: {
- children: React.ReactNode;
+ children: React.ReactNode;
}) {
- return (
-
-
- {children}
-
-
- );
+ return (
+
+
+ {children}
+
+
+ );
}
diff --git a/app/(root)/mods/layout.tsx b/app/(root)/mods/layout.tsx
new file mode 100644
index 0000000..b638106
--- /dev/null
+++ b/app/(root)/mods/layout.tsx
@@ -0,0 +1,11 @@
+import { Metadata } from "next";
+
+export const metadata: Metadata = {
+ title: "MOD - SVRJS",
+};
+
+const ModLayout = ({ children }: { children: React.ReactNode }) => {
+ return {children};
+};
+
+export default ModLayout;
diff --git a/app/(root)/mods/page.tsx b/app/(root)/mods/page.tsx
index b83bb73..55f91cc 100644
--- a/app/(root)/mods/page.tsx
+++ b/app/(root)/mods/page.tsx
@@ -1,3 +1,6 @@
+"use client";
+
+import { useEffect, useState } from "react";
import { Button } from "@/components/ui/button";
import {
Table,
@@ -11,38 +14,45 @@ import {
import { Download } from "lucide-react";
import Link from "next/link";
-const downloads = [
- {
- date: "2024-06-01",
- fileName: "SVRJS_v1.0.0.zip",
- version: "1.0.0",
- fileSize: "15MB",
- downloadLink: "/downloads/SVRJS_v1.0.0.zip",
- },
- {
- date: "2024-06-10",
- fileName: "SVRJS_v1.1.0.zip",
- version: "1.1.0",
- fileSize: "18MB",
- downloadLink: "/downloads/SVRJS_v1.1.0.zip",
- },
- {
- date: "2024-06-15",
- fileName: "SVRJS_v1.2.0.zip",
- version: "1.2.0",
- fileSize: "20MB",
- downloadLink: "/downloads/SVRJS_v1.2.0.zip",
- },
- {
- date: "2024-06-20",
- fileName: "SVRJS_v1.3.0.zip",
- version: "1.3.0",
- fileSize: "22MB",
- downloadLink: "/downloads/SVRJS_v1.3.0.zip",
- },
-];
+interface Mods {
+ _id: string;
+ date: string;
+ fileName: string;
+ version: string;
+ fileSize: string;
+ downloadLink: string;
+}
+
+const ModsPage: React.FC = () => {
+ const [downloads, setDownloads] = useState([]);
+ const [error, setError] = useState("");
+
+ const fetchDownloads = async () => {
+ try {
+ const response = await fetch("/api/mods", {
+ method: "GET",
+ });
+ if (response.ok) {
+ const data: Mods[] = await response.json();
+ setDownloads(data);
+ } else {
+ throw new Error(`HTTP error! status: ${response.status}`);
+ }
+ } catch (error: any) {
+ setError(error);
+ }
+ };
+
+ useEffect(() => {
+ fetchDownloads();
+
+ const interval = setInterval(() => {
+ fetchDownloads();
+ }, 10000);
+
+ return () => clearInterval(interval);
+ }, []);
-const Mods = () => {
return (
{
SvrJS Mods
- Get all the latest version of SVRJS Mods and compiled Files here!
+ Get all the latest version of SVRJS Mods and compiled Files here!{" "}
+ {error && {error} }
A list of all available downloads.
@@ -66,26 +77,29 @@ const Mods = () => {
- {downloads.map((download) => (
-
- {download.date}
- {download.fileName}
- {download.version}
- {download.fileSize}
-
-
-
-
-
-
- ))}
+ {downloads
+ .slice(0, 10)
+ .reverse()
+ .map((download) => (
+
+ {download.date}
+ {download.fileName}
+ {download.version}
+ {download.fileSize}
+
+
+
+
+
+
+ ))}
);
};
-export default Mods;
+export default ModsPage;
diff --git a/app/api/downloads/route.ts b/app/api/downloads/route.ts
index 23a04df..7557a71 100644
--- a/app/api/downloads/route.ts
+++ b/app/api/downloads/route.ts
@@ -9,6 +9,7 @@ export async function GET(req: NextRequest) {
const downloads = await db.collection("downloads").find().toArray();
return NextResponse.json(downloads, { status: 200 });
} catch (error) {
+ console.log(`Error Messge ${error}`);
return NextResponse.json(
{ error: "Failed to fetch downloads" },
{ status: 500 }
diff --git a/app/api/logs/route.ts b/app/api/logs/route.ts
new file mode 100644
index 0000000..76d777a
--- /dev/null
+++ b/app/api/logs/route.ts
@@ -0,0 +1,17 @@
+import { NextRequest, NextResponse } from "next/server";
+import clientPromise from "@/lib/db";
+
+// Handler for GET requests
+export async function GET(req: NextRequest) {
+ try {
+ const client = await clientPromise;
+ const db = client.db("downloadsDatabase");
+ const downloads = await db.collection("logs").find().toArray();
+ return NextResponse.json(downloads, { status: 200 });
+ } catch (error) {
+ return NextResponse.json(
+ { error: "Failed to fetch logs" },
+ { status: 500 }
+ );
+ }
+}
diff --git a/app/api/mods/route.ts b/app/api/mods/route.ts
new file mode 100644
index 0000000..172e6e2
--- /dev/null
+++ b/app/api/mods/route.ts
@@ -0,0 +1,17 @@
+import { NextRequest, NextResponse } from "next/server";
+import clientPromise from "@/lib/db";
+
+// Handler for GET requests
+export async function GET(req: NextRequest) {
+ try {
+ const client = await clientPromise;
+ const db = client.db("downloadsDatabase");
+ const downloads = await db.collection("mods").find().toArray();
+ return NextResponse.json(downloads, { status: 200 });
+ } catch (error) {
+ return NextResponse.json(
+ { error: "Failed to fetch mods" },
+ { status: 500 }
+ );
+ }
+}
diff --git a/app/api/uploadlogs/route.ts b/app/api/uploadlogs/route.ts
new file mode 100644
index 0000000..2bc660d
--- /dev/null
+++ b/app/api/uploadlogs/route.ts
@@ -0,0 +1,20 @@
+import { NextResponse } from "next/server";
+import clientPromise from "@/lib/db";
+
+export async function POST(request: Request) {
+ const body = await request.json();
+ const { fileName, version, downloadLink, fileSize } = body;
+
+ const client = await clientPromise;
+ const db = client.db("downloadsDatabase");
+
+ const result = await db.collection("logs").insertOne({
+ date: new Date().toISOString().split("T")[0],
+ fileName,
+ version,
+ downloadLink,
+ fileSize,
+ });
+
+ return NextResponse.json({ success: true, id: result.insertedId });
+}
diff --git a/app/api/uploadmods/route.ts b/app/api/uploadmods/route.ts
new file mode 100644
index 0000000..230fcc0
--- /dev/null
+++ b/app/api/uploadmods/route.ts
@@ -0,0 +1,20 @@
+import { NextResponse } from "next/server";
+import clientPromise from "@/lib/db";
+
+export async function POST(request: Request) {
+ const body = await request.json();
+ const { fileName, version, downloadLink, fileSize } = body;
+
+ const client = await clientPromise;
+ const db = client.db("downloadsDatabase");
+
+ const result = await db.collection("mods").insertOne({
+ date: new Date().toISOString().split("T")[0],
+ fileName,
+ version,
+ downloadLink,
+ fileSize,
+ });
+
+ return NextResponse.json({ success: true, id: result.insertedId });
+}
diff --git a/components/shared/Sidebar.tsx b/components/shared/Sidebar.tsx
new file mode 100644
index 0000000..f132711
--- /dev/null
+++ b/components/shared/Sidebar.tsx
@@ -0,0 +1,24 @@
+import React from "react";
+
+const Sidebar = () => {
+ return (
+
+
+ First use
+
+ - System requirements
+ - Installation
+ - Features
+ - SVR.JS files
+ - SVR.JS utilities
+ - SVR.JS commands
+ - Updating SVR.JS
+ - Common problems
+ - Bun support
+
+
+
+ );
+};
+
+export default Sidebar;
diff --git a/lib/db.ts b/lib/db.ts
index 6e6ea2e..b093401 100644
--- a/lib/db.ts
+++ b/lib/db.ts
@@ -1,24 +1,35 @@
import { MongoClient } from "mongodb";
+// Ensure the environment variable is set
if (!process.env.MONGODB_URI) {
throw new Error('Invalid/Missing environment variable: "MONGODB_URI"');
}
const uri = process.env.MONGODB_URI;
-const options = {};
+const options = {
+ // Add any SSL/TLS options if needed, for example:
+ // ssl: true,
+ // tlsAllowInvalidCertificates: true,
+};
-let client;
+let client: MongoClient;
let clientPromise: Promise;
-if (process.env.NODE_ENV === "development") {
- if (!(global as any)._mongoClientPromise) {
- client = new MongoClient(uri!, options);
- (global as any)._mongoClientPromise = client.connect();
- }
- clientPromise = (global as any)._mongoClientPromise;
-} else {
- client = new MongoClient(uri!, options);
- clientPromise = client.connect();
+declare global {
+ var _mongoClientPromise: Promise | undefined;
}
+// if (process.env.NODE_ENV === "development") {
+// // In development mode, use a global variable to ensure the client is not recreated
+// if (!global._mongoClientPromise) {
+// client = new MongoClient(uri, options);
+// global._mongoClientPromise = client.connect();
+// }
+// clientPromise = global._mongoClientPromise;
+// } else {
+// In production mode, create a new client for each request
+client = new MongoClient(uri, options);
+clientPromise = client.connect();
+// }
+
export default clientPromise;
diff --git a/lib/validations/validation.ts b/lib/validations/validation.ts
index 4cbcaab..4b4dcb5 100644
--- a/lib/validations/validation.ts
+++ b/lib/validations/validation.ts
@@ -6,3 +6,17 @@ export const downloadSchema = z.object({
downloadLink: z.string().url().nonempty(),
fileSize: z.string().nonempty(),
});
+
+export const modsSchema = z.object({
+ fileName: z.string().nonempty(),
+ version: z.string().nonempty(),
+ downloadLink: z.string().url().nonempty(),
+ fileSize: z.string().nonempty(),
+});
+
+export const logsSchema = z.object({
+ fileName: z.string().nonempty(),
+ version: z.string().nonempty(),
+ downloadLink: z.string().url().nonempty(),
+ fileSize: z.string().nonempty(),
+});
diff --git a/package-lock.json b/package-lock.json
index 19cd20c..6178b13 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -8,9 +8,6 @@
"name": "svrjs",
"version": "0.1.0",
"dependencies": {
- "@fortawesome/fontawesome-svg-core": "^6.5.2",
- "@fortawesome/free-regular-svg-icons": "^6.5.2",
- "@fortawesome/react-fontawesome": "^0.2.2",
"@hookform/resolvers": "^3.6.0",
"@radix-ui/react-accordion": "^1.1.2",
"@radix-ui/react-dialog": "^1.0.5",
@@ -32,7 +29,6 @@
"next-themes": "^0.3.0",
"react": "^18",
"react-dom": "^18",
- "react-fontawesome": "^1.7.1",
"react-hook-form": "^7.52.0",
"tailwind-merge": "^2.3.0",
"tailwindcss-animate": "^1.0.7",
@@ -172,51 +168,6 @@
"resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.2.tgz",
"integrity": "sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw=="
},
- "node_modules/@fortawesome/fontawesome-common-types": {
- "version": "6.5.2",
- "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.5.2.tgz",
- "integrity": "sha512-gBxPg3aVO6J0kpfHNILc+NMhXnqHumFxOmjYCFfOiLZfwhnnfhtsdA2hfJlDnj+8PjAs6kKQPenOTKj3Rf7zHw==",
- "hasInstallScript": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/@fortawesome/fontawesome-svg-core": {
- "version": "6.5.2",
- "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.5.2.tgz",
- "integrity": "sha512-5CdaCBGl8Rh9ohNdxeeTMxIj8oc3KNBgIeLMvJosBMdslK/UnEB8rzyDRrbKdL1kDweqBPo4GT9wvnakHWucZw==",
- "hasInstallScript": true,
- "dependencies": {
- "@fortawesome/fontawesome-common-types": "6.5.2"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/@fortawesome/free-regular-svg-icons": {
- "version": "6.5.2",
- "resolved": "https://registry.npmjs.org/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-6.5.2.tgz",
- "integrity": "sha512-iabw/f5f8Uy2nTRtJ13XZTS1O5+t+anvlamJ3zJGLEVE2pKsAWhPv2lq01uQlfgCX7VaveT3EVs515cCN9jRbw==",
- "hasInstallScript": true,
- "dependencies": {
- "@fortawesome/fontawesome-common-types": "6.5.2"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/@fortawesome/react-fontawesome": {
- "version": "0.2.2",
- "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.2.2.tgz",
- "integrity": "sha512-EnkrprPNqI6SXJl//m29hpaNzOp1bruISWaOiRtkMi/xSvHJlzc2j2JAYS7egxt/EbjSNV/k6Xy0AQI6vB2+1g==",
- "dependencies": {
- "prop-types": "^15.8.1"
- },
- "peerDependencies": {
- "@fortawesome/fontawesome-svg-core": "~1 || ~6",
- "react": ">=16.3"
- }
- },
"node_modules/@hookform/resolvers": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-3.6.0.tgz",
@@ -5704,6 +5655,7 @@
"version": "15.8.1",
"resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
"integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
+ "dev": true,
"dependencies": {
"loose-envify": "^1.4.0",
"object-assign": "^4.1.1",
@@ -5776,20 +5728,6 @@
"react": "^18.3.1"
}
},
- "node_modules/react-fontawesome": {
- "version": "1.7.1",
- "resolved": "https://registry.npmjs.org/react-fontawesome/-/react-fontawesome-1.7.1.tgz",
- "integrity": "sha512-kottReWW1I9Uupub6A5YX4VK7qfpFnEjAcm5zB4Aepst7iofONT27GJYdTcRsj7q5uQu9PXBL7GsxAFKANNUVg==",
- "dependencies": {
- "prop-types": "^15.5.6"
- },
- "engines": {
- "node": ">=0.10.0"
- },
- "peerDependencies": {
- "react": ">=0.12.0"
- }
- },
"node_modules/react-hook-form": {
"version": "7.52.0",
"resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.52.0.tgz",
@@ -5809,7 +5747,8 @@
"node_modules/react-is": {
"version": "16.13.1",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
- "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
+ "dev": true
},
"node_modules/react-remove-scroll": {
"version": "2.5.5",
diff --git a/package.json b/package.json
index f44a3cf..a8b80fe 100644
--- a/package.json
+++ b/package.json
@@ -9,9 +9,6 @@
"lint": "next lint"
},
"dependencies": {
- "@fortawesome/fontawesome-svg-core": "^6.5.2",
- "@fortawesome/free-regular-svg-icons": "^6.5.2",
- "@fortawesome/react-fontawesome": "^0.2.2",
"@hookform/resolvers": "^3.6.0",
"@radix-ui/react-accordion": "^1.1.2",
"@radix-ui/react-dialog": "^1.0.5",
@@ -33,7 +30,6 @@
"next-themes": "^0.3.0",
"react": "^18",
"react-dom": "^18",
- "react-fontawesome": "^1.7.1",
"react-hook-form": "^7.52.0",
"tailwind-merge": "^2.3.0",
"tailwindcss-animate": "^1.0.7",
diff --git a/tsconfig.json b/tsconfig.json
index e7ff90f..f834b79 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -21,6 +21,6 @@
"@/*": ["./*"]
}
},
- "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
+ "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts", "lib/Hoc/withAuth.jsx"],
"exclude": ["node_modules"]
}
--
2.39.5
From 6aed03b2b734eac26fd7bb68922223d2a7aca30a Mon Sep 17 00:00:00 2001
From: Proxyy587
Date: Sat, 22 Jun 2024 14:53:31 +0530
Subject: [PATCH 010/149] prod db #1
---
app/api/downloads/route.ts | 1 +
components/shared/Footer.tsx | 2 +-
constants/index.tsx | 2 ++
lib/db.ts | 10 ----------
4 files changed, 4 insertions(+), 11 deletions(-)
diff --git a/app/api/downloads/route.ts b/app/api/downloads/route.ts
index 7557a71..f3f80b5 100644
--- a/app/api/downloads/route.ts
+++ b/app/api/downloads/route.ts
@@ -7,6 +7,7 @@ export async function GET(req: NextRequest) {
const client = await clientPromise;
const db = client.db("downloadsDatabase");
const downloads = await db.collection("downloads").find().toArray();
+ // console.log("Downloads fetched:", downloads);
return NextResponse.json(downloads, { status: 200 });
} catch (error) {
console.log(`Error Messge ${error}`);
diff --git a/components/shared/Footer.tsx b/components/shared/Footer.tsx
index 0b4d868..9ed0c81 100644
--- a/components/shared/Footer.tsx
+++ b/components/shared/Footer.tsx
@@ -9,7 +9,7 @@ const Footer = () => {
<>
|