diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index d3ffb07..d1b17af 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -1,4 +1,20 @@
-name: Build Project
+# name: Build Project
+
+# on: [push, pull_request]
+# jobs:
+# test:
+# runs-on: ubuntu-latest
+# container:
+# image: node:20
+# steps:
+# - uses: actions/checkout@v3
+# with:
+# node-version: 20
+# - run: npm ci
+# - run: npm run build
+
+
+# # //ci
on: [push, pull_request]
jobs:
@@ -10,8 +26,9 @@ jobs:
- uses: actions/checkout@v3
with:
node-version: 20
+ - name: Install dependencies
+ run: |
+ npm install --leagcy-peer-deps
+
- run: npm ci
- - run: npm run build
-
-
- # //ci
\ No newline at end of file
+ - run: npm run build
\ No newline at end of file
diff --git a/src/app/dashboard/analytics/page.tsx b/src/app/dashboard/analytics/page.tsx
new file mode 100644
index 0000000..9aef32b
--- /dev/null
+++ b/src/app/dashboard/analytics/page.tsx
@@ -0,0 +1,13 @@
+
+
+
+function AnalyticsPage() {
+ return (
+
+
Analytics
+
Analytics page content goes here.
+
+ );
+}
+
+export default AnalyticsPage
\ No newline at end of file
diff --git a/src/app/dashboard/earnings/page.tsx b/src/app/dashboard/earnings/page.tsx
new file mode 100644
index 0000000..ee55de9
--- /dev/null
+++ b/src/app/dashboard/earnings/page.tsx
@@ -0,0 +1,15 @@
+
+
+
+function EarningsPage() {
+ return (
+
+
Earnings
+
+ This is the earnings page. You can view your earnings here.
+
+
+ );
+}
+
+export default EarningsPage;
\ No newline at end of file
diff --git a/src/app/dashboard/feedback/page.tsx b/src/app/dashboard/feedback/page.tsx
new file mode 100644
index 0000000..d4225e5
--- /dev/null
+++ b/src/app/dashboard/feedback/page.tsx
@@ -0,0 +1,12 @@
+
+
+function FeedbackPage() {
+ return (
+
+
Feedback
+
We value your feedback! Please let us know your thoughts.
+ {/* Add your feedback form or component here */}
+
+ );
+}
+export default FeedbackPage;
\ No newline at end of file
diff --git a/src/app/dashboard/layout.tsx b/src/app/dashboard/layout.tsx
index 46dd870..11f959f 100644
--- a/src/app/dashboard/layout.tsx
+++ b/src/app/dashboard/layout.tsx
@@ -8,13 +8,9 @@ export default function RootLayout({
children: React.ReactNode;
}) {
return (
-
-
-
{children}
+
{children}
-
-
);
}
diff --git a/src/app/dashboard/notifications/page.tsx b/src/app/dashboard/notifications/page.tsx
new file mode 100644
index 0000000..8cf996c
--- /dev/null
+++ b/src/app/dashboard/notifications/page.tsx
@@ -0,0 +1,11 @@
+
+
+function NotificationsPage() {
+ return (
+
+
Notifications
+
This is the notifications page.
+
+ );
+}
+export default NotificationsPage;
\ No newline at end of file
diff --git a/src/app/dashboard/profile/component/ProfileForm.tsx b/src/app/dashboard/profile/component/ProfileForm.tsx
new file mode 100644
index 0000000..723e893
--- /dev/null
+++ b/src/app/dashboard/profile/component/ProfileForm.tsx
@@ -0,0 +1,203 @@
+'use client';
+
+import { useState, useRef, ChangeEvent } from "react";
+import Image from "next/image";
+
+interface ProfileFormData {
+ firstName: string;
+ lastName: string;
+ pseudonym: string;
+ email: string;
+ bio: string;
+ profilePicture: string | null;
+ }
+
+export const ProfileForm = () => {
+
+
+ const [formData, setFormData] = useState({
+ firstName: "Joseph",
+ lastName: "Paul",
+ pseudonym: "Joe Paul",
+ email: "example@gmail.com",
+ bio: "",
+ profilePicture: null,
+ });
+
+ const [preview, setPreview] = useState(null);
+ const fileInputRef = useRef(null);
+
+ const handleInputChange = (
+ e: ChangeEvent
+ ) => {
+ const { name, value } = e.target;
+ setFormData((prev) => ({
+ ...prev,
+ [name]: value,
+ }));
+ };
+
+ const handleImageUpload = (e: ChangeEvent) => {
+ const file = e.target.files?.[0];
+ if (!file) return;
+
+ const reader = new FileReader();
+ reader.onload = () => {
+ setPreview(reader.result as string);
+ setFormData((prev) => ({
+ ...prev,
+ profilePicture: reader.result as string,
+ }));
+ };
+ reader.readAsDataURL(file);
+ };
+
+ const triggerFileInput = () => {
+ fileInputRef.current?.click();
+ };
+
+ const handleSubmit = (e: React.FormEvent) => {
+ e.preventDefault();
+ console.log("Form submitted:", formData);
+
+ };
+
+ return (
+
+ )
+}
\ No newline at end of file
diff --git a/src/app/dashboard/profile/component/Social.tsx b/src/app/dashboard/profile/component/Social.tsx
new file mode 100644
index 0000000..6500552
--- /dev/null
+++ b/src/app/dashboard/profile/component/Social.tsx
@@ -0,0 +1,116 @@
+
+
+import React, { useState } from 'react';
+
+export default function UpdateSocialLinks() {
+ const [socialLinks, setSocialLinks] = useState({
+ facebook: '',
+ instagram: '',
+ twitter: '',
+ linkedin: ''
+ });
+
+ const handleChange = (platform: keyof typeof socialLinks) => (e: React.ChangeEvent) => {
+ setSocialLinks({ ...socialLinks, [platform]: e.target.value });
+ };
+
+ const handleSubmit = () => {
+ console.log('Updated social links:', socialLinks);
+ };
+
+ const handleCancel = () => {
+ setSocialLinks({
+ facebook: '',
+ instagram: '',
+ twitter: '',
+ linkedin: ''
+ });
+ };
+
+ return (
+
+
+
Update Social Links
+
+
+
+ {/* Facebook */}
+
+
+
+
+
+ {/* Instagram */}
+
+
+
+
+
+ {/* X (Twitter) */}
+
+
+
+
+
+ {/* LinkedIn */}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/src/app/dashboard/profile/component/UpdatePasswordForm.tsx b/src/app/dashboard/profile/component/UpdatePasswordForm.tsx
new file mode 100644
index 0000000..49eb74c
--- /dev/null
+++ b/src/app/dashboard/profile/component/UpdatePasswordForm.tsx
@@ -0,0 +1,111 @@
+
+
+'use client'
+
+import { useState } from 'react'
+
+const UpdatePasswordForm = () => {
+ const [oldPassword, setOldPassword] = useState('')
+ const [newPassword, setNewPassword] = useState('')
+ const [confirmPassword, setConfirmPassword] = useState('')
+ const [errors, setErrors] = useState<{ [key: string]: string }>({})
+ const [success, setSuccess] = useState(false)
+
+ const validate = () => {
+ const newErrors: { [key: string]: string } = {}
+
+ if (!oldPassword) newErrors.oldPassword = 'Old password is required.'
+ if (!newPassword) newErrors.newPassword = 'New password is required.'
+ if (newPassword.length < 6) newErrors.newPassword = 'New password must be at least 6 characters.'
+ if (newPassword !== confirmPassword) newErrors.confirmPassword = 'Passwords do not match.'
+
+ setErrors(newErrors)
+ return Object.keys(newErrors).length === 0
+ }
+
+ const handleSubmit = (e: React.FormEvent) => {
+ e.preventDefault()
+ if (validate()) {
+ console.log({ oldPassword, newPassword })
+ setSuccess(true)
+ } else {
+ setSuccess(false)
+ }
+ }
+
+ return (
+
+ )
+}
+
+export default UpdatePasswordForm
diff --git a/src/app/dashboard/profile/component/genre.tsx b/src/app/dashboard/profile/component/genre.tsx
new file mode 100644
index 0000000..6a4e55e
--- /dev/null
+++ b/src/app/dashboard/profile/component/genre.tsx
@@ -0,0 +1,74 @@
+
+
+'use client'
+
+import { useState } from 'react'
+
+const allGenres = ['Fiction', 'Drama', 'Horror', 'Comedy', 'Sci-Fi', 'Fantasy', 'Romance']
+
+const GenreSelector = () => {
+ const [selectedGenres, setSelectedGenres] = useState([])
+
+ const handleSelect = (genre: string) => {
+ if (!selectedGenres.includes(genre)) {
+ setSelectedGenres([...selectedGenres, genre])
+ }
+ }
+
+ const removeGenre = (genre: string) => {
+ setSelectedGenres(selectedGenres.filter((g) => g !== genre))
+ }
+
+ return (
+
+
+
+
+
+
+
+
+ {selectedGenres.map((genre) => (
+
+ {genre}
+
+
+ ))}
+
+
+
+
+
+
+
+ )
+}
+
+export default GenreSelector
diff --git a/src/app/dashboard/profile/component/profileHeader.tsx b/src/app/dashboard/profile/component/profileHeader.tsx
new file mode 100644
index 0000000..cc53047
--- /dev/null
+++ b/src/app/dashboard/profile/component/profileHeader.tsx
@@ -0,0 +1,41 @@
+import { Bell } from "lucide-react";
+import Image from "next/image";
+import user from "../../../../../public/user1.svg";
+import check from "../../../public/../../../public/check.svg";
+
+interface HeaderProps {
+ title: string;
+}
+
+export function ProfileHeader() {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+ Joseph Yanum
+
+
+
@joeyyanum
+
+
+
+
+ );
+}
diff --git a/src/app/dashboard/profile/component/profilesidebar.tsx b/src/app/dashboard/profile/component/profilesidebar.tsx
new file mode 100644
index 0000000..77456ad
--- /dev/null
+++ b/src/app/dashboard/profile/component/profilesidebar.tsx
@@ -0,0 +1,63 @@
+
+
+"use client";
+
+import Link from "next/link";
+import { usePathname } from "next/navigation";
+
+export function ProfileSidebar() {
+ const pathname = usePathname();
+
+ const navItems = [
+
+ {
+
+ label: "Profile Details",
+ href: "/dashboard/profile",
+ },
+ {
+
+ label: "Genre Specialization",
+ href: "/dashboard/profile/genre",
+ },
+ {
+
+ label: "Password",
+ href: "/dashboard/profile/password",
+ },
+ {
+
+ label: "Social",
+ href: "/dashboard/profile/social",
+ },
+ ];
+
+ return (
+
+
+ Profile
+
+
+
+
+ );
+}
diff --git a/src/app/dashboard/profile/genre/page.tsx b/src/app/dashboard/profile/genre/page.tsx
new file mode 100644
index 0000000..3ae610a
--- /dev/null
+++ b/src/app/dashboard/profile/genre/page.tsx
@@ -0,0 +1,12 @@
+import GenreSelector from "../component/genre";
+
+
+
+function GenrePage() {
+ return (
+
+
+
+ );
+}
+export default GenrePage;
diff --git a/src/app/dashboard/profile/layout.tsx b/src/app/dashboard/profile/layout.tsx
new file mode 100644
index 0000000..758abcb
--- /dev/null
+++ b/src/app/dashboard/profile/layout.tsx
@@ -0,0 +1,20 @@
+import type React from "react";
+import "@/app/globals.css";
+import { ProfileSidebar } from "./component/profilesidebar";
+import { ProfileHeader } from "./component/profileHeader";
+
+export default function RootLayout({
+ children,
+}: {
+ children: React.ReactNode;
+}) {
+ return (
+ <>
+
+
+ >
+ );
+}
diff --git a/src/app/dashboard/profile/page.tsx b/src/app/dashboard/profile/page.tsx
new file mode 100644
index 0000000..c9f6e08
--- /dev/null
+++ b/src/app/dashboard/profile/page.tsx
@@ -0,0 +1,15 @@
+"use client";
+
+import { ProfileForm } from "./component/ProfileForm";
+
+function ProfilePage() {
+ return (
+
+
+
+
+ );
+}
+export default ProfilePage;
diff --git a/src/app/dashboard/profile/password/page.tsx b/src/app/dashboard/profile/password/page.tsx
new file mode 100644
index 0000000..1b12d17
--- /dev/null
+++ b/src/app/dashboard/profile/password/page.tsx
@@ -0,0 +1,11 @@
+import UpdatePasswordForm from "../component/UpdatePasswordForm";
+
+
+function PasswordPage() {
+ return (
+
+ < UpdatePasswordForm />
+
+ );
+}
+ export default PasswordPage;
\ No newline at end of file
diff --git a/src/app/dashboard/profile/social/page.tsx b/src/app/dashboard/profile/social/page.tsx
new file mode 100644
index 0000000..13391aa
--- /dev/null
+++ b/src/app/dashboard/profile/social/page.tsx
@@ -0,0 +1,13 @@
+"use client";
+
+import UpdateSocialLinks from "../component/Social";
+
+
+function SocialPage() {
+ return (
+
+
+
+ );
+}
+export default SocialPage;
\ No newline at end of file