diff --git a/README.md b/README.md index 543f94e..ea903ec 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,26 @@ # Cerify +## Score +### PEP3 ``` ------------------------------------------------------------------ Your code has been rated at 9.41/10 (previous run: 9.30/10, +0.11) +``` + +## Screenshots + + + + + + + + + + + + +## Contributor -``` \ No newline at end of file diff --git a/client/.example.env b/client/.example.env deleted file mode 100644 index e69de29..0000000 diff --git a/client/.example.env.local b/client/.example.env.local new file mode 100644 index 0000000..cec81f7 --- /dev/null +++ b/client/.example.env.local @@ -0,0 +1 @@ +BASE_URL=http://localhost:8000 \ No newline at end of file diff --git a/client/package-lock.json b/client/package-lock.json index 283638c..3ff8a58 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -1,13 +1,14 @@ { - "name": "client", + "name": "certify-client", "version": "0.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "client", + "name": "certify-client", "version": "0.1.0", "dependencies": { + "bootstrap": "^5.3.3", "next": "14.2.15", "react": "^18", "react-dom": "^18" @@ -16,6 +17,7 @@ "@types/node": "^20", "@types/react": "^18", "@types/react-dom": "^18", + "dotenv": "^16.4.5", "postcss": "^8", "tailwindcss": "^3.4.1", "typescript": "^5" @@ -304,6 +306,17 @@ "node": ">=14" } }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "license": "MIT", + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, "node_modules/@swc/counter": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", @@ -432,6 +445,25 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/bootstrap": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.3.tgz", + "integrity": "sha512-8HLCdWgyoMguSO9o+aH+iuZ+aht+mzW0u3HIMzVu7Srrpv7EBBxTnrFlSCskwdY1+EOFQSm7uMJhNQHkdPcmjg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/twbs" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/bootstrap" + } + ], + "license": "MIT", + "peerDependencies": { + "@popperjs/core": "^2.11.8" + } + }, "node_modules/brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", @@ -619,6 +651,19 @@ "dev": true, "license": "MIT" }, + "node_modules/dotenv": { + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", diff --git a/client/package.json b/client/package.json index f5e1c78..4159119 100644 --- a/client/package.json +++ b/client/package.json @@ -9,16 +9,18 @@ "lint": "next lint" }, "dependencies": { + "bootstrap": "^5.3.3", + "next": "14.2.15", "react": "^18", - "react-dom": "^18", - "next": "14.2.15" + "react-dom": "^18" }, "devDependencies": { - "typescript": "^5", "@types/node": "^20", "@types/react": "^18", "@types/react-dom": "^18", + "dotenv": "^16.4.5", "postcss": "^8", - "tailwindcss": "^3.4.1" + "tailwindcss": "^3.4.1", + "typescript": "^5" } } diff --git a/client/public/assets/header.png b/client/public/assets/header.png new file mode 100644 index 0000000..e5b9314 Binary files /dev/null and b/client/public/assets/header.png differ diff --git a/client/public/assets/logo-dark.png b/client/public/assets/logo-dark.png new file mode 100644 index 0000000..1d4d2e0 Binary files /dev/null and b/client/public/assets/logo-dark.png differ diff --git a/client/public/assets/logo.png b/client/public/assets/logo.png new file mode 100644 index 0000000..918a3c1 Binary files /dev/null and b/client/public/assets/logo.png differ diff --git a/client/public/assets/upload.svg b/client/public/assets/upload.svg new file mode 100644 index 0000000..5d4e986 --- /dev/null +++ b/client/public/assets/upload.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/src/app/certificate/page.tsx b/client/src/app/certificate/page.tsx new file mode 100644 index 0000000..aa40d19 --- /dev/null +++ b/client/src/app/certificate/page.tsx @@ -0,0 +1,124 @@ +"use client"; + +import { useState } from "react"; +// import dotenv from "dotenv"; +// dotenv.config(); +require('dotenv').config(); + +const base_url = process.env.BASE_URL; + +export default function Home() { + const [certificate, setCertificate] = useState(null); + + async function copyCertificate() { + if (!certificate) { + alert("No link to copy"); + return; + } + navigator.clipboard.writeText(certificate) + .then(() => { + alert('Copied to clipboard!'); + }) + .catch((err) => { + console.error('Failed to copy: ', err); + }); + } + + async function uploadCertificate(e: any) { + if (!e.target.files[0]) { + alert("Please upload a file"); + return; + } + const formData = new FormData(); + formData.append("file", e.target.files[0], e.target.files[0].name); + const res = await fetch(`http://localhost:8000/api/v1/template`, { + method: 'POST', + body: formData, + }); + const data = await res.json(); + if (!data.success) { + alert(data.message); + } else { + setCertificate(data.dl); + } + } + + return ( +
+ Upload your certificate template! +
+Store the template.
++ This is free service to generating certificate! +
+ + {/* */} + > + )} +Please check your email to verify your account
-Please check your email to verify your account
-Please check your email to verify your account
-