From 838a94eec1b5926d4a34a96f8ca6bbcfccd76ea8 Mon Sep 17 00:00:00 2001 From: swve Date: Wed, 13 Dec 2023 21:30:47 +0100 Subject: [PATCH] feat: init user settings --- .../course/[courseuuid]/[subpage]/page.tsx | 5 +- apps/web/app/orgs/[orgslug]/dash/page.tsx | 6 +- .../dash/user/settings/[subpage]/page.tsx | 69 ++++++++++++ .../settings/account/profile/profile.tsx | 4 +- .../EditCourseGeneral/EditCourseGeneral.tsx | 2 +- .../Buttons/NewActivityButton.tsx | 0 .../DraggableElements/ActivityElement.tsx | 0 .../DraggableElements/ChapterElement.tsx | 0 .../EditCourseStructure.tsx | 0 .../components/Dashboard/UI/BreadCrumbs.tsx | 5 +- apps/web/components/Dashboard/UI/LeftMenu.tsx | 26 +++-- .../User/UserEditGeneral/UserEditGeneral.tsx | 100 ++++++++++++++++++ .../UserEditPassword/UserEditPassword.tsx | 66 ++++++++++++ .../components/Objects/Menu/ProfileArea.tsx | 20 +--- .../components/Security/HeaderProfileBox.tsx | 4 +- apps/web/services/courses/chapters.ts | 2 +- apps/web/services/settings/profile.ts | 4 +- 17 files changed, 273 insertions(+), 40 deletions(-) create mode 100644 apps/web/app/orgs/[orgslug]/dash/user/settings/[subpage]/page.tsx rename apps/web/components/Dashboard/{ => Course}/EditCourseGeneral/EditCourseGeneral.tsx (98%) rename apps/web/components/Dashboard/{ => Course}/EditCourseStructure/Buttons/NewActivityButton.tsx (100%) rename apps/web/components/Dashboard/{ => Course}/EditCourseStructure/DraggableElements/ActivityElement.tsx (100%) rename apps/web/components/Dashboard/{ => Course}/EditCourseStructure/DraggableElements/ChapterElement.tsx (100%) rename apps/web/components/Dashboard/{ => Course}/EditCourseStructure/EditCourseStructure.tsx (100%) create mode 100644 apps/web/components/Dashboard/User/UserEditGeneral/UserEditGeneral.tsx create mode 100644 apps/web/components/Dashboard/User/UserEditPassword/UserEditPassword.tsx diff --git a/apps/web/app/orgs/[orgslug]/dash/courses/course/[courseuuid]/[subpage]/page.tsx b/apps/web/app/orgs/[orgslug]/dash/courses/course/[courseuuid]/[subpage]/page.tsx index 01e7dc3f..fb543301 100644 --- a/apps/web/app/orgs/[orgslug]/dash/courses/course/[courseuuid]/[subpage]/page.tsx +++ b/apps/web/app/orgs/[orgslug]/dash/courses/course/[courseuuid]/[subpage]/page.tsx @@ -1,5 +1,5 @@ 'use client'; -import EditCourseStructure from '../../../../../../../../components/Dashboard/EditCourseStructure/EditCourseStructure' +import EditCourseStructure from '../../../../../../../../components/Dashboard/Course/EditCourseStructure/EditCourseStructure' import BreadCrumbs from '@components/Dashboard/UI/BreadCrumbs' import PageLoading from '@components/Objects/Loaders/PageLoading'; import ClientComponentSkeleton from '@components/Utils/ClientComp'; @@ -13,7 +13,7 @@ import Link from 'next/link'; import { CourseOverviewTop } from '@components/Dashboard/UI/CourseOverviewTop'; import { CSSTransition } from 'react-transition-group'; import { motion } from 'framer-motion'; -import EditCourseGeneral from '@components/Dashboard/EditCourseGeneral/EditCourseGeneral'; +import EditCourseGeneral from '@components/Dashboard/Course/EditCourseGeneral/EditCourseGeneral'; import { GalleryVertical, GalleryVerticalEnd, Info } from 'lucide-react'; export type CourseOverviewParams = { @@ -33,7 +33,6 @@ function CourseOverviewPage({ params }: { params: CourseOverviewParams }) { return (
-
diff --git a/apps/web/app/orgs/[orgslug]/dash/page.tsx b/apps/web/app/orgs/[orgslug]/dash/page.tsx index ce5f585b..ae18e474 100644 --- a/apps/web/app/orgs/[orgslug]/dash/page.tsx +++ b/apps/web/app/orgs/[orgslug]/dash/page.tsx @@ -1,8 +1,12 @@ +import PageLoading from '@components/Objects/Loaders/PageLoading' import React from 'react' function DashboardHome() { return ( -
DashboardHome
+
+ +
This page is work in progress
+
) } diff --git a/apps/web/app/orgs/[orgslug]/dash/user/settings/[subpage]/page.tsx b/apps/web/app/orgs/[orgslug]/dash/user/settings/[subpage]/page.tsx new file mode 100644 index 00000000..56de4bcf --- /dev/null +++ b/apps/web/app/orgs/[orgslug]/dash/user/settings/[subpage]/page.tsx @@ -0,0 +1,69 @@ +'use client'; +import React, { useEffect } from 'react' +import { motion } from 'framer-motion'; +import UserEditGeneral from '@components/Dashboard/User/UserEditGeneral/UserEditGeneral'; +import UserEditPassword from '@components/Dashboard/User/UserEditPassword/UserEditPassword'; +import Link from 'next/link'; +import { getUriWithOrg } from '@services/config/config'; +import { Info, Lock } from 'lucide-react'; +import BreadCrumbs from '@components/Dashboard/UI/BreadCrumbs'; +import { useAuth } from '@components/Security/AuthContext'; + +export type SettingsParams = { + subpage: string + orgslug: string +} + +function SettingsPage({ params }: { params: SettingsParams }) { + const auth = useAuth() as any; + + + useEffect(() => { + } + , [auth]) + + return ( +
+
+ +
+
+
Account Settings
+
+
+
+ +
+ +
+ +
General
+
+
+ + +
+
+ +
Password
+
+ +
+ +
+
+
+ + {params.subpage == 'general' ? : ''} + {params.subpage == 'security' ? : ''} + +
+ ) +} + +export default SettingsPage \ No newline at end of file diff --git a/apps/web/app/orgs/[orgslug]/settings/account/profile/profile.tsx b/apps/web/app/orgs/[orgslug]/settings/account/profile/profile.tsx index d7a63ba5..3e454f06 100644 --- a/apps/web/app/orgs/[orgslug]/settings/account/profile/profile.tsx +++ b/apps/web/app/orgs/[orgslug]/settings/account/profile/profile.tsx @@ -6,6 +6,8 @@ import { updateProfile } from '@services/settings/profile'; function ProfileClient() { const auth: any = React.useContext(AuthContext); + + return (
@@ -51,7 +53,7 @@ function ProfileClient() { diff --git a/apps/web/components/Dashboard/EditCourseGeneral/EditCourseGeneral.tsx b/apps/web/components/Dashboard/Course/EditCourseGeneral/EditCourseGeneral.tsx similarity index 98% rename from apps/web/components/Dashboard/EditCourseGeneral/EditCourseGeneral.tsx rename to apps/web/components/Dashboard/Course/EditCourseGeneral/EditCourseGeneral.tsx index e9aba807..636d32e9 100644 --- a/apps/web/components/Dashboard/EditCourseGeneral/EditCourseGeneral.tsx +++ b/apps/web/components/Dashboard/Course/EditCourseGeneral/EditCourseGeneral.tsx @@ -4,7 +4,7 @@ import { AlertTriangle } from 'lucide-react' import * as Switch from '@radix-ui/react-switch'; import * as Form from '@radix-ui/react-form'; import React from 'react' -import { useCourse, useCourseDispatch } from '../../Contexts/CourseContext'; +import { useCourse, useCourseDispatch } from '../../../Contexts/CourseContext'; type EditCourseStructureProps = { diff --git a/apps/web/components/Dashboard/EditCourseStructure/Buttons/NewActivityButton.tsx b/apps/web/components/Dashboard/Course/EditCourseStructure/Buttons/NewActivityButton.tsx similarity index 100% rename from apps/web/components/Dashboard/EditCourseStructure/Buttons/NewActivityButton.tsx rename to apps/web/components/Dashboard/Course/EditCourseStructure/Buttons/NewActivityButton.tsx diff --git a/apps/web/components/Dashboard/EditCourseStructure/DraggableElements/ActivityElement.tsx b/apps/web/components/Dashboard/Course/EditCourseStructure/DraggableElements/ActivityElement.tsx similarity index 100% rename from apps/web/components/Dashboard/EditCourseStructure/DraggableElements/ActivityElement.tsx rename to apps/web/components/Dashboard/Course/EditCourseStructure/DraggableElements/ActivityElement.tsx diff --git a/apps/web/components/Dashboard/EditCourseStructure/DraggableElements/ChapterElement.tsx b/apps/web/components/Dashboard/Course/EditCourseStructure/DraggableElements/ChapterElement.tsx similarity index 100% rename from apps/web/components/Dashboard/EditCourseStructure/DraggableElements/ChapterElement.tsx rename to apps/web/components/Dashboard/Course/EditCourseStructure/DraggableElements/ChapterElement.tsx diff --git a/apps/web/components/Dashboard/EditCourseStructure/EditCourseStructure.tsx b/apps/web/components/Dashboard/Course/EditCourseStructure/EditCourseStructure.tsx similarity index 100% rename from apps/web/components/Dashboard/EditCourseStructure/EditCourseStructure.tsx rename to apps/web/components/Dashboard/Course/EditCourseStructure/EditCourseStructure.tsx diff --git a/apps/web/components/Dashboard/UI/BreadCrumbs.tsx b/apps/web/components/Dashboard/UI/BreadCrumbs.tsx index 664482d3..e20dc71a 100644 --- a/apps/web/components/Dashboard/UI/BreadCrumbs.tsx +++ b/apps/web/components/Dashboard/UI/BreadCrumbs.tsx @@ -4,7 +4,7 @@ import Link from 'next/link' import React, { use, useEffect } from 'react' type BreadCrumbsProps = { - type: 'courses' | 'users' + type: 'courses' | 'user' | 'users', last_breadcrumb?: string } @@ -17,7 +17,8 @@ function BreadCrumbs(props: BreadCrumbsProps) {
{props.type == 'courses' ?
Courses
: ''} - {props.type == 'users' ?
Users
: ''} + {props.type == 'user' ?
Account Settings
: ''} +
{props.last_breadcrumb ? : ''}
{props.last_breadcrumb}
diff --git a/apps/web/components/Dashboard/UI/LeftMenu.tsx b/apps/web/components/Dashboard/UI/LeftMenu.tsx index a4bac0f1..e3264974 100644 --- a/apps/web/components/Dashboard/UI/LeftMenu.tsx +++ b/apps/web/components/Dashboard/UI/LeftMenu.tsx @@ -35,12 +35,12 @@ function LeftMenu() { className='flex flex-col w-24 bg-black h-screen text-white shadow-xl'>
- + Learnhouse logo
- + @@ -51,15 +51,21 @@ function LeftMenu() {
- - - -
-
- -
+ + + + + +
+ +
+ +
+
+ +
alpha
+
-
{auth.user.username}
diff --git a/apps/web/components/Dashboard/User/UserEditGeneral/UserEditGeneral.tsx b/apps/web/components/Dashboard/User/UserEditGeneral/UserEditGeneral.tsx new file mode 100644 index 00000000..edb12d11 --- /dev/null +++ b/apps/web/components/Dashboard/User/UserEditGeneral/UserEditGeneral.tsx @@ -0,0 +1,100 @@ +import { useAuth } from '@components/Security/AuthContext'; +import { updateProfile } from '@services/settings/profile'; +import React, { useEffect } from 'react' +import { Formik, Form, Field, ErrorMessage } from 'formik'; + +function UserEditGeneral() { + const auth = useAuth() as any; + + + useEffect(() => { + } + , [auth, auth.user]) + + return ( +
+ {auth.user && ( + { + setTimeout(() => { + + setSubmitting(false); + updateProfile(values,auth.user.id) + }, 400); + }} + > + {({ isSubmitting }) => ( +
+ + + + + + + + + + + + + + + + + + + + + )} +
+ )} +
+ ) +} + +export default UserEditGeneral \ No newline at end of file diff --git a/apps/web/components/Dashboard/User/UserEditPassword/UserEditPassword.tsx b/apps/web/components/Dashboard/User/UserEditPassword/UserEditPassword.tsx new file mode 100644 index 00000000..f11a962b --- /dev/null +++ b/apps/web/components/Dashboard/User/UserEditPassword/UserEditPassword.tsx @@ -0,0 +1,66 @@ +import { useAuth } from '@components/Security/AuthContext'; +import { updatePassword } from '@services/settings/password'; +import { Formik, Form, Field, ErrorMessage } from 'formik'; +import React, { useEffect } from 'react' + +function UserEditPassword() { + const auth = useAuth() as any; + + const updatePasswordUI = async (values: any) => { + let user_id = auth.userInfo.user_object.user_id; + await updatePassword(user_id, values) + } + + useEffect(() => { + } + , [auth]) + + + return ( +
+ { + setTimeout(() => { + setSubmitting(false); + updatePasswordUI(values) + }, 400); + }} + > + {({ isSubmitting }) => ( +
+ + + + + + + + + + )} +
+
+ ) +} + +export default UserEditPassword \ No newline at end of file diff --git a/apps/web/components/Objects/Menu/ProfileArea.tsx b/apps/web/components/Objects/Menu/ProfileArea.tsx index a613697c..bffc5e9f 100644 --- a/apps/web/components/Objects/Menu/ProfileArea.tsx +++ b/apps/web/components/Objects/Menu/ProfileArea.tsx @@ -8,6 +8,7 @@ import { getNewAccessTokenUsingRefreshToken, getUserInfo } from "@services/auth/ import { usePathname } from "next/navigation"; import { useRouter } from "next/router"; import path from "path"; +import { Settings } from "lucide-react"; export interface Auth { access_token: string; @@ -92,7 +93,7 @@ function ProfileArea() {
- + )} @@ -104,22 +105,7 @@ const AccountArea = styled.div` display: flex; place-items: center; - a{ - // center the gear icon - display: flex; - place-items: center; - place-content: center; - width: 29px; - height: 29px; - border-radius: 19px; - background: #F5F5F5; - - // hover effect - &:hover{ - background: #E5E5E5; - - } - } + div { margin-right: 10px; diff --git a/apps/web/components/Security/HeaderProfileBox.tsx b/apps/web/components/Security/HeaderProfileBox.tsx index 6f712198..8821941c 100644 --- a/apps/web/components/Security/HeaderProfileBox.tsx +++ b/apps/web/components/Security/HeaderProfileBox.tsx @@ -30,11 +30,11 @@ export const HeaderProfileBox = () => { {auth.isAuthenticated && (
{auth.userInfo.username}
-
+
- +
)} diff --git a/apps/web/services/courses/chapters.ts b/apps/web/services/courses/chapters.ts index 26c54c81..6782c967 100644 --- a/apps/web/services/courses/chapters.ts +++ b/apps/web/services/courses/chapters.ts @@ -1,4 +1,4 @@ -import { OrderPayload } from "@components/Dashboard/EditCourseStructure/EditCourseStructure"; +import { OrderPayload } from "@components/Dashboard/Course/EditCourseStructure/EditCourseStructure"; import { getAPIUrl } from "@services/config/config"; import { RequestBody, RequestBodyWithAuthHeader, errorHandling } from "@services/utils/ts/requests"; diff --git a/apps/web/services/settings/profile.ts b/apps/web/services/settings/profile.ts index adfb3045..401d5afe 100644 --- a/apps/web/services/settings/profile.ts +++ b/apps/web/services/settings/profile.ts @@ -6,8 +6,8 @@ import { RequestBody, errorHandling } from "@services/utils/ts/requests"; GET requests are called from the frontend using SWR (https://swr.vercel.app/) */ -export async function updateProfile(data: any) { - const result: any = await fetch(`${getAPIUrl()}users/user_id/` + data.user_id, RequestBody("PUT", data, null)) +export async function updateProfile(data: any,user_id: number) { + const result: any = await fetch(`${getAPIUrl()}users/` + user_id, RequestBody("PUT", data, null)) const res = await errorHandling(result); return res; }