diff --git a/.github/workflows/preview.yaml b/.github/workflows/preview.yaml new file mode 100644 index 00000000..17580a24 --- /dev/null +++ b/.github/workflows/preview.yaml @@ -0,0 +1,21 @@ +name: Vercel Preview Deployment +env: + VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }} + VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }} +on: + push: + branches-ignore: + - main +jobs: + Deploy-Preview: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Install Vercel CLI + run: npm install --global vercel@latest + - name: Pull Vercel Environment Information + run: vercel pull --yes --environment=preview --token=${{ secrets.VERCEL_TOKEN }} + - name: Build Project Artifacts + run: vercel build --token=${{ secrets.VERCEL_TOKEN }} + - name: Deploy Project Artifacts to Vercel + run: vercel deploy --prebuilt --token=${{ secrets.VERCEL_TOKEN }} \ No newline at end of file diff --git a/apps/core/app/(landing)/become-auther/_components/auther-form.tsx b/apps/core/app/(landing)/become-auther/_components/auther-form.tsx index 77f1c637..61cbb892 100644 --- a/apps/core/app/(landing)/become-auther/_components/auther-form.tsx +++ b/apps/core/app/(landing)/become-auther/_components/auther-form.tsx @@ -32,7 +32,6 @@ const AutherForm = () => { }); const onSubmit = (data: PostRequestAuthorRequest) => { - console.log("Sign Up Data:", data); mutation.mutate(data); }; diff --git a/apps/core/app/auth/_components/auth-card.tsx b/apps/core/app/auth/_components/auth-card.tsx index 7be323ba..92b92a6c 100644 --- a/apps/core/app/auth/_components/auth-card.tsx +++ b/apps/core/app/auth/_components/auth-card.tsx @@ -8,7 +8,7 @@ import { ReactNode } from "react"; const AuthCard = ({ children }: { children: ReactNode }) => { return ( -
+
{/* logo */}
diff --git a/apps/core/app/auth/forget-password/_components/form/forgetPasswordForm.tsx b/apps/core/app/auth/forget-password/_components/form/forgetPasswordForm.tsx index be67ee55..23ab04ee 100644 --- a/apps/core/app/auth/forget-password/_components/form/forgetPasswordForm.tsx +++ b/apps/core/app/auth/forget-password/_components/form/forgetPasswordForm.tsx @@ -4,11 +4,11 @@ import { useRouter } from "next/navigation"; import { useForm } from "react-hook-form"; import { toast } from "sonner"; import { zodResolver } from "@hookform/resolvers/zod"; -import { postForgetPasswordSchema } from "@repo/apis/core/forgot-password/post/post-forget-password.schema"; -import { PostForgetPasswordRequest } from "@repo/apis/core/forgot-password/post/post-forget-password.types"; -import { UsePostForgetPassword } from "@repo/apis/core/forgot-password/post/use-post-forget-password"; import { Button } from "@repo/ui/components/button"; import { Input } from "@repo/ui/components/input"; +import { postForgetPasswordSchema } from "@repo/apis/core/accounts/users/forgot-password/post/post-forget-password.schema"; +import type { PostForgetPasswordRequest } from "@repo/apis/core/accounts/users/forgot-password/post/post-forget-password.types"; +import { UsePostForgetPassword } from "@repo/apis/core/accounts/users/forgot-password/post/use-post-forget-password"; const ForgetPasswordForm = () => { const router = useRouter(); @@ -26,12 +26,11 @@ const ForgetPasswordForm = () => { const mutation = UsePostForgetPassword({ onSuccess: (res, context) => { toast.info(res.data.message); - router.push(`/auth/set-password?username=${context.username}`); + router.replace(`/auth/set-password?username=${context.username}`); }, }); const onSubmit = (data: PostForgetPasswordRequest) => { - console.log("Sign Up Data:", data); mutation.mutate(data); }; diff --git a/apps/core/app/auth/layout.tsx b/apps/core/app/auth/layout.tsx index 77d65b6b..5c794014 100644 --- a/apps/core/app/auth/layout.tsx +++ b/apps/core/app/auth/layout.tsx @@ -1,5 +1,6 @@ import "@repo/ui/globals.scss"; import type { Metadata } from "next"; +import Image from "next/image"; export const metadata: Metadata = { title: "Docs", @@ -8,16 +9,17 @@ export const metadata: Metadata = { export default function RootLayout({ children, -}: { +}: Readonly<{ children: React.ReactNode; -}): JSX.Element { +}>): JSX.Element { return (
- background
{children}
diff --git a/apps/core/app/auth/login/_components/form/loginForm.tsx b/apps/core/app/auth/login/_components/form/loginForm.tsx index af78dec4..fe288b34 100644 --- a/apps/core/app/auth/login/_components/form/loginForm.tsx +++ b/apps/core/app/auth/login/_components/form/loginForm.tsx @@ -30,13 +30,11 @@ const LoginForm = () => { const loginMutation = usePostLogin({ onSuccess: (res) => { - console.log(res); toast.success("Logged in successfully"); setAuthTokens(res.data.data.token); router.push("/"); }, onError: (res) => { - console.log(res); toast.error(res.response?.data.message ?? "Something went wrong"); }, }); @@ -67,7 +65,7 @@ const LoginForm = () => { helperText={ Forgot password? diff --git a/apps/core/app/auth/login/page.tsx b/apps/core/app/auth/login/page.tsx index 0ef4a2f2..f8ab50b8 100644 --- a/apps/core/app/auth/login/page.tsx +++ b/apps/core/app/auth/login/page.tsx @@ -26,7 +26,7 @@ const LoginPage = () => { {/* login with google and linkedin */} {/*
-
-
-

- didnt recieved code yet? -

-
- - ); -}; - -export default Otppage; diff --git a/apps/core/app/auth/set-password/page.tsx b/apps/core/app/auth/set-password/page.tsx index a826f06c..b715a863 100644 --- a/apps/core/app/auth/set-password/page.tsx +++ b/apps/core/app/auth/set-password/page.tsx @@ -1,7 +1,5 @@ // import components "use client"; -import { PostForgetPasswordRequest } from "@repo/apis/core/forgot-password/post/post-forget-password.types"; -import { UsePostForgetPassword } from "@repo/apis/core/forgot-password/post/use-post-forget-password"; import { Button } from "@repo/ui/components/button"; import { InputOTP, @@ -9,29 +7,29 @@ import { InputOTPSlot, } from "@repo/ui/components/input-otp"; import { REGEXP_ONLY_DIGITS_AND_CHARS } from "input-otp"; -import { useRouter } from "next/navigation"; +import { useRouter, useSearchParams } from "next/navigation"; import { useForm } from "react-hook-form"; import { toast } from "sonner"; // import icons import { zodResolver } from "@hookform/resolvers/zod"; -import { postForgetPasswordSchema } from "@repo/apis/core/forgot-password/post/post-forget-password.schema"; import { Input } from "@repo/ui/components/input"; import { Suspense, useEffect } from "react"; import AuthCard from "../_components/auth-card"; +import { postResetPasswordSchema } from "@repo/apis/core/accounts/users/reset-password/post/post-reset-password.schema"; +import { usePostResetPassword } from "@repo/apis/core/accounts/users/reset-password/post/use-post-reset-password"; +import type { PostResetPasswordRequest } from "@repo/apis/core/accounts/users/reset-password/post/post-reset-password.types"; + const Setpasswordpage = () => { const router = useRouter(); - // TODO: Fix this - // const params = useSearchParams(); - // const username = params.get("username"); - - const username = "test@gmail.com"; + const params = useSearchParams(); + const username = params.get("username"); if (!username) router.replace("/auth/forget-password"); - const form = useForm({ - resolver: zodResolver(postForgetPasswordSchema.request), + const form = useForm({ + resolver: zodResolver(postResetPasswordSchema.request), }); const { @@ -41,22 +39,23 @@ const Setpasswordpage = () => { formState: { errors }, } = form; + // biome-ignore lint/correctness/useExhaustiveDependencies: useEffect(() => { setValue("username", username as string); - }, []); + }, [username]); - const mutation = UsePostForgetPassword({ + const mutation = usePostResetPassword({ onSuccess: (res) => { toast.info(res.data.message); - router.push(`/auth/login`); + router.push("/auth/login"); }, onError: (err) => { - toast.error(err.response?.data.message || "Something went wrong"); + toast.error(err.response?.data.message ?? "Something went wrong"); }, }); - const handleSubmitForm = (data: PostForgetPasswordRequest) => { + const handleSubmitForm = (data: PostResetPasswordRequest) => { mutation.mutate(data); }; @@ -70,16 +69,14 @@ const Setpasswordpage = () => {

Set your Password

We've sent the code to{" "} - - example@pixel.design - + {username}

check your email

{/* otp input */}
@@ -104,33 +101,31 @@ const Setpasswordpage = () => {
{/* input */} -
- - - {/* button reset */} -
- -
+ + + {/* button reset */} +
+
diff --git a/apps/core/app/auth/signup/otp/_components/signup-otp-form.tsx b/apps/core/app/auth/signup/otp/_components/signup-otp-form.tsx index c18aa1fb..1a6b09bd 100644 --- a/apps/core/app/auth/signup/otp/_components/signup-otp-form.tsx +++ b/apps/core/app/auth/signup/otp/_components/signup-otp-form.tsx @@ -10,23 +10,24 @@ import { REGEXP_ONLY_DIGITS_AND_CHARS } from "input-otp"; // import icons import { zodResolver } from "@hookform/resolvers/zod"; -import { postRegisterCompleteSchema } from "@repo/apis/core/accounts/register/complete/post/post-register-complete.schema"; -import type { PostRegisterCompleteRequest } from "@repo/apis/core/accounts/register/complete/post/post-register-complete.types"; -import { UsePostRegisterComplete } from "@repo/apis/core/accounts/register/complete/post/use-post-register-complete"; import { Countdown } from "@repo/ui/components/countdown"; import { useRouter } from "next/navigation"; -import { useEffect } from "react"; import { useForm } from "react-hook-form"; import { toast } from "sonner"; +import { usePostVerifyOtp } from "@repo/apis/core/accounts/users/verify_otp/post/use-post-verify-otp"; +import { postVerifyOtpSchema } from "@repo/apis/core/accounts/users/verify_otp/post/post-verify-otp.schema"; +import type { PostVerifyOtpRequest } from "@repo/apis/core/accounts/users/verify_otp/post/post-verify-otp.types"; +import { setAuthTokens } from "@repo/apis/utils/cookies"; + export interface SignupOtpFormProps { - email: string; + username: string | undefined; } export const SignupOtpForm = (props: SignupOtpFormProps) => { - const { email } = props; + const { username } = props; - const form = useForm({ - resolver: zodResolver(postRegisterCompleteSchema.request), + const form = useForm({ + resolver: zodResolver(postVerifyOtpSchema.request), }); const { @@ -37,25 +38,23 @@ export const SignupOtpForm = (props: SignupOtpFormProps) => { formState: { errors }, } = form; - useEffect(() => { - if (email) setValue("email", email); - }, [email]); - const router = useRouter(); - const muutation = UsePostRegisterComplete({ + const mutation = usePostVerifyOtp({ onSuccess: (res) => { - toast.info(res.data.message); - router.push("/auth/login"); + toast.success("Registered successfully, Welcome to Pixel Genius!"); + setAuthTokens(res.data.data.token); + router.push("/"); }, onError: (err) => { - toast.error(err.response?.data.message || "Something went wrong"); + toast.error(err.response?.data.message ?? "Something went wrong"); }, }); - const handleSubmitForm = (data: PostRegisterCompleteRequest) => { - muutation.mutate(data); + const handleSubmitForm = (data: PostVerifyOtpRequest) => { + if (username) mutation.mutate({ ...data, username }); + else toast.error("username is required"); }; const otpRegister = register("otp"); @@ -96,8 +95,8 @@ export const SignupOtpForm = (props: SignupOtpFormProps) => {
diff --git a/apps/core/app/auth/signup/otp/page.tsx b/apps/core/app/auth/signup/otp/page.tsx index a8856f72..07d1d91c 100644 --- a/apps/core/app/auth/signup/otp/page.tsx +++ b/apps/core/app/auth/signup/otp/page.tsx @@ -3,14 +3,16 @@ import AuthCard from "../../_components/auth-card"; import { SignupOtpForm } from "./_components/signup-otp-form"; import { redirect } from "next/navigation"; -type SearchParams = { otp: string | string[] | undefined }; +type SearchParams = { + username: string | string[] | undefined; + email: string | string[] | undefined; +}; const SignupOtpPage = ({ searchParams }: { searchParams: SearchParams }) => { - const email = Array.isArray(searchParams.otp) - ? searchParams.otp[0] - : searchParams.otp; - - if (!email) { + const username = Array.isArray(searchParams.username) + ? searchParams?.username[0] + : searchParams.username; + if (!searchParams.email) { redirect("/auth/signup"); } @@ -22,7 +24,7 @@ const SignupOtpPage = ({ searchParams }: { searchParams: SearchParams }) => {

We've sent the code to{" "} - {email} + {searchParams.email}

check your email

@@ -30,7 +32,7 @@ const SignupOtpPage = ({ searchParams }: { searchParams: SearchParams }) => {
{/* Form */} - + ); }; diff --git a/apps/core/app/auth/signup/page.tsx b/apps/core/app/auth/signup/page.tsx index eba0af4a..3550b3e7 100644 --- a/apps/core/app/auth/signup/page.tsx +++ b/apps/core/app/auth/signup/page.tsx @@ -1,20 +1,20 @@ "use client"; import { zodResolver } from "@hookform/resolvers/zod"; -import { postRegisterSchema } from "@repo/apis/core/accounts/register/post/post-register.schema"; -import { PostRegisterRequest } from "@repo/apis/core/accounts/register/post/post-register.types"; import { Button } from "@repo/ui/components/button"; import { Input } from "@repo/ui/components/input"; // import icons -import { UsePostRegister } from "@repo/apis/core/accounts/register/post/use-post-register"; -import { useQueryParams } from "@repo/ui/hooks/use-query-params"; -import Link from "next/link"; import { useRouter } from "next/navigation"; -import { Suspense } from "react"; import { useForm } from "react-hook-form"; import { toast } from "sonner"; import AuthCard from "../_components/auth-card"; +import { useQueryParams } from "@repo/ui/hooks/use-query-params"; +import { Suspense } from "react"; +import Link from "next/link"; +import type { PostRegisterRequest } from "@repo/apis/core/accounts/users/register/post/post-register.types"; +import { postRegisterSchema } from "@repo/apis/core/accounts/users/register/post/post-register.schema"; +import { usePostRegister } from "@repo/apis/core/accounts/users/register/post/use-post-register"; const SignUpPageComponent = () => { const router = useRouter(); @@ -30,22 +30,24 @@ const SignUpPageComponent = () => { const { createQueryStringFromObject } = useQueryParams(); - const mutation = UsePostRegister({ + const mutation = usePostRegister({ onSuccess: (data, context) => { - console.log("200: data", data); - - router.push( - "/auth/signup/otp" + - "?" + - createQueryStringFromObject({ email: context.email }), - ); - + const usernameQuery = createQueryStringFromObject({ + username: context.username ?? "", + }); + const emailQuery = createQueryStringFromObject({ + email: context.email ?? "", + }); + + router.push(`/auth/signup/otp?${usernameQuery}&${emailQuery}`); toast.success("Send OTP"); }, + onError: (err) => { + toast.error(err.response?.data.message ?? "Something went wrong"); + }, }); const onSubmit = (data: PostRegisterRequest) => { - console.log("Sign Up Data:", data); mutation.mutate(data); }; @@ -64,7 +66,7 @@ const SignUpPageComponent = () => { {/* Form */}
{ type="password" label="Confirm Password" placeholder="********" - {...register("confirmPassword")} - error={errors.confirmPassword?.message} + {...register("confirm_password")} + error={errors.password?.message} /> {/* Submit Button */} @@ -119,7 +121,7 @@ const SignUpPageComponent = () => { {/*
*/} {/* Footer */} -
+

Already have an account?

Log in diff --git a/apps/core/app/auth/template.tsx b/apps/core/app/auth/template.tsx deleted file mode 100644 index 262368cc..00000000 --- a/apps/core/app/auth/template.tsx +++ /dev/null @@ -1,22 +0,0 @@ -"use client"; - -import { AnimatePresence, motion } from "framer-motion"; -import { usePathname } from "next/navigation"; - -export default function Template({ children }: { children: React.ReactNode }) { - const pathname = usePathname(); - - return ( - window.scrollTo(0, 0)}> - - {children} - - - ); -} diff --git a/apps/core/app/layout.tsx b/apps/core/app/layout.tsx index 12d44095..d6619102 100644 --- a/apps/core/app/layout.tsx +++ b/apps/core/app/layout.tsx @@ -25,12 +25,12 @@ export default function RootLayout({ {children} - + diff --git a/bun.lockb b/bun.lockb index d4cb81ea..a6688a70 100755 Binary files a/bun.lockb and b/bun.lockb differ diff --git a/packages/apis/package.json b/packages/apis/package.json index 77456e13..5851587c 100644 --- a/packages/apis/package.json +++ b/packages/apis/package.json @@ -33,7 +33,7 @@ "@types/js-cookie": "^3.0.6", "axios": "^1.7.7", "axios-mock-adapter": "^2.0.0", - "js-cookie": "3.0.5", + "js-cookie": "^3.0.5", "zod": "^3.23.8" }, "exports": { diff --git a/packages/apis/src/schema/api-response-schema.ts b/packages/apis/src/schema/api-response-schema.ts index 95a91e22..71c16675 100644 --- a/packages/apis/src/schema/api-response-schema.ts +++ b/packages/apis/src/schema/api-response-schema.ts @@ -1,9 +1,19 @@ import z from "zod"; export const apiResponseSchema = z.object({ - data: z.union([z.array(z.any()), z.record(z.string(), z.any()), z.null()]), - message: z.union([z.string(), z.null()]), - error: z.union([z.record(z.string(), z.any()), z.array(z.unknown()), z.null()]), + data: z.union([ + z.array(z.any()), + z.record(z.string(), z.any()), + z.null(), + z.undefined(), + ]), + message: z.union([z.string(), z.null(), z.undefined()]), + error: z.union([ + z.record(z.string(), z.any()), + z.array(z.unknown()), + z.null(), + z.undefined(), + ]), meta: z.union([ z .object({ @@ -12,5 +22,6 @@ export const apiResponseSchema = z.object({ }) .optional(), z.null(), + z.undefined(), ]), }); diff --git a/packages/apis/src/services/core/accounts/register/complete/post/post-register-complete.schema.ts b/packages/apis/src/services/core/accounts/register/complete/post/post-register-complete.schema.ts deleted file mode 100644 index 70147804..00000000 --- a/packages/apis/src/services/core/accounts/register/complete/post/post-register-complete.schema.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { z } from "zod"; - -// request -export const postRegisterCompleteRequestSchemaTransformed = z - .object({ - email: z.string(), - otp:z.string(), - }) - .transform((data) => data); - -// response -export const postRegisterCompleteResponseSchemaTransofrmed = z - .object({ - message: z.string().optional(), - otp : z.array(z.string()).optional(), - }) - .transform((data) => data); - -export const postRegisterCompleteSchema = { - response: postRegisterCompleteResponseSchemaTransofrmed, - request: postRegisterCompleteRequestSchemaTransformed, -}; diff --git a/packages/apis/src/services/core/accounts/register/complete/post/post-register-complete.ts b/packages/apis/src/services/core/accounts/register/complete/post/post-register-complete.ts deleted file mode 100644 index 45c38475..00000000 --- a/packages/apis/src/services/core/accounts/register/complete/post/post-register-complete.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { coreApi } from "#instance/core-api"; -import { ApiResponse } from "@repo/apis/types/api.types"; -import { requestHandler } from "@repo/apis/utils/request-handler"; -import path from "path"; -import { postRegisterCompleteSchema as schema } from "./post-register-complete.schema"; -import { - PostRegisterCompleteRequest, - PostRegisterCompleteResponseTransformed, -} from "./post-register-complete.types"; - -export const postRegisterCompleteURL = () => path.join("/accounts/register/complete/"); - -export const postRegisterComplete = async ( - props?: PostRegisterCompleteRequest, -): Promise> => { - const payloadParsed = schema.request.parse(props); - - const URL = postRegisterCompleteURL(); - - const response = await requestHandler( - () => coreApi.post(URL, payloadParsed), - schema.response._def.schema, - { - isMock: true, - } - ); - - const dataParsed = schema.response.parse(response.data); - - return { ...response, data: dataParsed }; -}; diff --git a/packages/apis/src/services/core/accounts/register/complete/post/post-register-complete.types.ts b/packages/apis/src/services/core/accounts/register/complete/post/post-register-complete.types.ts deleted file mode 100644 index 86f1eff3..00000000 --- a/packages/apis/src/services/core/accounts/register/complete/post/post-register-complete.types.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { z } from "zod"; -import { postRegisterCompleteSchema } from "./post-register-complete.schema"; - -// Response -export type PostRegisterCompleteRequest = z.input; - -export type PostRegisterCompleteRequestTransofrmed = z.infer< - typeof postRegisterCompleteSchema.request ->; - -// Request -export type PostRegisterCompleteResponse = z.input; - -export type PostRegisterCompleteResponseTransformed = z.infer< - typeof postRegisterCompleteSchema.response ->; diff --git a/packages/apis/src/services/core/accounts/register/complete/post/use-post-register-complete.ts b/packages/apis/src/services/core/accounts/register/complete/post/use-post-register-complete.ts deleted file mode 100644 index 25e82e13..00000000 --- a/packages/apis/src/services/core/accounts/register/complete/post/use-post-register-complete.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { - ApiError, - ApiResponse, - UseMutationProps, -} from "@repo/apis/types/api.types"; -import { useMutation } from "@tanstack/react-query"; -import { postRegisterComplete } from "./post-register-complete"; -import {} from "./post-register-complete.schema"; -import { - PostRegisterCompleteRequest, - PostRegisterCompleteResponseTransformed, -} from "./post-register-complete.types"; - -export type UsePostRegisterCompleteProps = UseMutationProps< - ApiResponse, - ApiError, - PostRegisterCompleteRequest ->; - -export const postRegisterCompleteQueryKey = () => ["postRegisterComplete"]; - -export const UsePostRegisterComplete = (props?: UsePostRegisterCompleteProps) => { - const mutation = useMutation< - ApiResponse, - ApiError, - PostRegisterCompleteRequest - >({ - mutationKey: postRegisterCompleteQueryKey(), - mutationFn: (data) => postRegisterComplete(data), - ...props, - }); - - return mutation; -}; diff --git a/packages/apis/src/services/core/accounts/register/post/post-register.schema.ts b/packages/apis/src/services/core/accounts/register/post/post-register.schema.ts deleted file mode 100644 index 8d94455a..00000000 --- a/packages/apis/src/services/core/accounts/register/post/post-register.schema.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { z } from "zod"; - -// Response - -// Schema when only OTP is provided, requiring only email -const otpSchema = z.object({ - email: z.string().email("Invalid email format"), - otp: z.string(), - username: z.string().optional(), - password: z.string().optional(), - confirmPassword: z.string().optional(), -}); - -// Full registration schema without OTP -const fullRegistrationSchema = z.object({ - username: z.string().min(3, "Username must be at least 3 characters long"), - email: z.string().email("Invalid email format"), - password: z.string().min(8, "Password must be at least 8 characters long"), - confirmPassword: z - .string() - .min(8, "Confirm Password must be at least 8 characters long"), -}).refine((data) => data.password === data.confirmPassword, { - message: "Passwords do not match", - path: ["confirmPassword"], -}); - -// Combine the schemas conditionally -export const postRegisterRequestSchemaTransformed = z.union([otpSchema, fullRegistrationSchema]); - -// Request -export const postRegisterResponseSchemaTransofrmed = z - .object({ - keyBody: z.string(), - }) - .transform((data) => data); - -export const postRegisterSchema = { - response: postRegisterResponseSchemaTransofrmed, - request: postRegisterRequestSchemaTransformed, -}; diff --git a/packages/apis/src/services/core/accounts/users/forgot-password/post/post-forget-password.schema.ts b/packages/apis/src/services/core/accounts/users/forgot-password/post/post-forget-password.schema.ts new file mode 100644 index 00000000..469f6b91 --- /dev/null +++ b/packages/apis/src/services/core/accounts/users/forgot-password/post/post-forget-password.schema.ts @@ -0,0 +1,18 @@ +import { z } from "zod"; + +// Response +export const postForgetPasswordRequestSchemaTransformed = z.object({ + username: z.string().min(3, "Username must be at least 3 characters long"), +}); + +// Request +export const postForgetPasswordResponseSchemaTransofrmed = z + .object({ + message: z.string(), + }) + .transform((data) => data); + +export const postForgetPasswordSchema = { + response: postForgetPasswordResponseSchemaTransofrmed, + request: postForgetPasswordRequestSchemaTransformed, +}; diff --git a/packages/apis/src/services/core/forgot-password/post/post-forget-password.ts b/packages/apis/src/services/core/accounts/users/forgot-password/post/post-forget-password.ts similarity index 81% rename from packages/apis/src/services/core/forgot-password/post/post-forget-password.ts rename to packages/apis/src/services/core/accounts/users/forgot-password/post/post-forget-password.ts index 2625fa2e..c50efb6f 100644 --- a/packages/apis/src/services/core/forgot-password/post/post-forget-password.ts +++ b/packages/apis/src/services/core/accounts/users/forgot-password/post/post-forget-password.ts @@ -1,14 +1,14 @@ import { coreApi } from "#instance/core-api"; -import { ApiResponse } from "@repo/apis/types/api.types"; +import type { ApiResponse } from "@repo/apis/types/api.types"; import { requestHandler } from "@repo/apis/utils/request-handler"; import path from "path"; import { postForgetPasswordSchema as schema } from "./post-forget-password.schema"; -import { +import type { PostForgetPasswordRequest, PostForgetPasswordResponseTransformed, } from "./post-forget-password.types"; -export const postForgetPasswordURL = () => path.join("/api/forgot-password"); +export const postForgetPasswordURL = () => path.join("/accounts/users/forgot-password/"); export const postForgetPassword = async ( props?: PostForgetPasswordRequest, @@ -20,9 +20,7 @@ export const postForgetPassword = async ( const response = await requestHandler( () => coreApi.post(URL, payloadParsed), schema.response._def.schema, - { - isMock: true, - }, + ); const dataParsed = schema.response.parse(response.data); diff --git a/packages/apis/src/services/core/forgot-password/post/post-forget-password.types.ts b/packages/apis/src/services/core/accounts/users/forgot-password/post/post-forget-password.types.ts similarity index 79% rename from packages/apis/src/services/core/forgot-password/post/post-forget-password.types.ts rename to packages/apis/src/services/core/accounts/users/forgot-password/post/post-forget-password.types.ts index 3d07f3ac..c7c5cdb8 100644 --- a/packages/apis/src/services/core/forgot-password/post/post-forget-password.types.ts +++ b/packages/apis/src/services/core/accounts/users/forgot-password/post/post-forget-password.types.ts @@ -1,5 +1,5 @@ -import { z } from "zod"; -import { postForgetPasswordSchema } from "./post-forget-password.schema"; +import type { z } from "zod"; +import type { postForgetPasswordSchema } from "./post-forget-password.schema"; // Response export type PostForgetPasswordRequest = z.input; diff --git a/packages/apis/src/services/core/forgot-password/post/use-post-forget-password.ts b/packages/apis/src/services/core/accounts/users/forgot-password/post/use-post-forget-password.ts similarity index 92% rename from packages/apis/src/services/core/forgot-password/post/use-post-forget-password.ts rename to packages/apis/src/services/core/accounts/users/forgot-password/post/use-post-forget-password.ts index d4e100a5..d1626efc 100644 --- a/packages/apis/src/services/core/forgot-password/post/use-post-forget-password.ts +++ b/packages/apis/src/services/core/accounts/users/forgot-password/post/use-post-forget-password.ts @@ -1,4 +1,4 @@ -import { +import type { ApiError, ApiResponse, UseMutationProps, @@ -6,7 +6,7 @@ import { import { useMutation } from "@tanstack/react-query"; import { postForgetPassword } from "./post-forget-password"; import {} from "./post-forget-password.schema"; -import { +import type { PostForgetPasswordRequest, PostForgetPasswordResponseTransformed, } from "./post-forget-password.types"; @@ -23,7 +23,7 @@ export const UsePostForgetPassword = (props?: UsePostForgetPasswordProps) => { const mutation = useMutation< ApiResponse, ApiError, - Omit + PostForgetPasswordRequest >({ mutationKey: postForgetPasswordQueryKey(), mutationFn: (data) => postForgetPassword(data), diff --git a/packages/apis/src/services/core/accounts/users/register/post/post-register.schema.ts b/packages/apis/src/services/core/accounts/users/register/post/post-register.schema.ts new file mode 100644 index 00000000..9f50f227 --- /dev/null +++ b/packages/apis/src/services/core/accounts/users/register/post/post-register.schema.ts @@ -0,0 +1,50 @@ +import { apiResponseSchema } from "#schema/api-response-schema"; +import { z } from "zod"; + +// Response + +// Schema when only OTP is provided, requiring only email +const otpSchema = z.object({ + email: z.string().email("Invalid email format"), + username: z.string().optional(), + password: z.string().optional(), + confirm_password: z.string().optional(), +}); + +// Full registration schema without OTP +const fullRegistrationSchema = z + .object({ + username: z.string().min(3, "Username must be at least 3 characters long"), + email: z.string().email("Invalid email format"), + password: z.string().min(8, "Password must be at least 8 characters long"), + confirmPassword: z + .string() + .min(8, "Confirm Password must be at least 8 characters long"), + }) + .refine((data) => data.password === data.confirmPassword, { + message: "Passwords do not match", + path: ["confirmPassword"], + }); + +// Combine the schemas conditionally +export const postRegisterRequestSchemaTransformed = z.union([ + otpSchema, + fullRegistrationSchema, +]); + +// Response +export const postRegisterResponseSchemaTransofrmed = apiResponseSchema + .extend({ + data: z.object({ + user: z.object({ + username: z.string(), + email: z.string(), + }), + }), + }) + .transform((data) => data); + +export const postRegisterSchema = { + response: postRegisterResponseSchemaTransofrmed, + request: postRegisterRequestSchemaTransformed, +}; diff --git a/packages/apis/src/services/core/accounts/register/post/post-register.ts b/packages/apis/src/services/core/accounts/users/register/post/post-register.ts similarity index 76% rename from packages/apis/src/services/core/accounts/register/post/post-register.ts rename to packages/apis/src/services/core/accounts/users/register/post/post-register.ts index 6590529b..68a38cd5 100644 --- a/packages/apis/src/services/core/accounts/register/post/post-register.ts +++ b/packages/apis/src/services/core/accounts/users/register/post/post-register.ts @@ -1,14 +1,14 @@ -import { coreApi } from "#instance/core-api"; -import { ApiResponse } from "@repo/apis/types/api.types"; +import { coreApi } from "#instance/core-api"; +import type { ApiResponse } from "@repo/apis/types/api.types"; import { requestHandler } from "@repo/apis/utils/request-handler"; import path from "path"; import { postRegisterSchema as schema } from "./post-register.schema"; -import { +import type { PostRegisterRequest, PostRegisterResponseTransformed, } from "./post-register.types"; -export const postRegisterURL = () => path.join("/api/accounts/register"); +export const postRegisterURL = () => path.join("/accounts/users/"); export const postRegister = async ( props?: PostRegisterRequest, @@ -20,12 +20,8 @@ export const postRegister = async ( const response = await requestHandler( () => coreApi.post(URL, payloadParsed), schema.response._def.schema, - { - isMock: true, - } ); const dataParsed = schema.response.parse(response.data); - return { ...response, data: dataParsed }; }; diff --git a/packages/apis/src/services/core/accounts/register/post/post-register.types.ts b/packages/apis/src/services/core/accounts/users/register/post/post-register.types.ts similarity index 79% rename from packages/apis/src/services/core/accounts/register/post/post-register.types.ts rename to packages/apis/src/services/core/accounts/users/register/post/post-register.types.ts index 1460f6b6..7443ab77 100644 --- a/packages/apis/src/services/core/accounts/register/post/post-register.types.ts +++ b/packages/apis/src/services/core/accounts/users/register/post/post-register.types.ts @@ -1,5 +1,5 @@ -import { z } from "zod"; -import { postRegisterSchema } from "./post-register.schema"; +import type { z } from "zod"; +import type { postRegisterSchema } from "./post-register.schema"; // Response export type PostRegisterRequest = z.input; diff --git a/packages/apis/src/services/core/accounts/register/post/use-post-register.ts b/packages/apis/src/services/core/accounts/users/register/post/use-post-register.ts similarity index 85% rename from packages/apis/src/services/core/accounts/register/post/use-post-register.ts rename to packages/apis/src/services/core/accounts/users/register/post/use-post-register.ts index a4f8fabc..85f921b7 100644 --- a/packages/apis/src/services/core/accounts/register/post/use-post-register.ts +++ b/packages/apis/src/services/core/accounts/users/register/post/use-post-register.ts @@ -1,12 +1,11 @@ -import { +import type { ApiError, ApiResponse, UseMutationProps, } from "@repo/apis/types/api.types"; import { useMutation } from "@tanstack/react-query"; import { postRegister } from "./post-register"; -import {} from "./post-register.schema"; -import { +import type { PostRegisterRequest, PostRegisterResponseTransformed, } from "./post-register.types"; @@ -19,7 +18,7 @@ export type UsePostRegisterProps = UseMutationProps< export const postRegisterQueryKey = () => ["postRegister"]; -export const UsePostRegister = (props?: UsePostRegisterProps) => { +export const usePostRegister = (props?: UsePostRegisterProps) => { const mutation = useMutation< ApiResponse, ApiError, diff --git a/packages/apis/src/services/core/accounts/users/reset-password/post/post-reset-password.schema.ts b/packages/apis/src/services/core/accounts/users/reset-password/post/post-reset-password.schema.ts new file mode 100644 index 00000000..08c78504 --- /dev/null +++ b/packages/apis/src/services/core/accounts/users/reset-password/post/post-reset-password.schema.ts @@ -0,0 +1,24 @@ +import { apiResponseSchema } from "#schema/api-response-schema"; +import { z } from "zod"; + +// Request +export const postResetPasswordRequestSchemaTransformed = z + .object({ + new_password: z.string(), + confirm_password: z.string(), + otp: z.string(), + username: z.string(), + }) + .transform((data) => data); + +// Response +export const postResetPasswordResponseSchemaTransofrmed = apiResponseSchema + .extend({ + data: z.null(), + }) + .transform((data) => data); + +export const postResetPasswordSchema = { + response: postResetPasswordResponseSchemaTransofrmed, + request: postResetPasswordRequestSchemaTransformed, +}; diff --git a/packages/apis/src/services/core/accounts/users/reset-password/post/post-reset-password.ts b/packages/apis/src/services/core/accounts/users/reset-password/post/post-reset-password.ts new file mode 100644 index 00000000..fd5ec22d --- /dev/null +++ b/packages/apis/src/services/core/accounts/users/reset-password/post/post-reset-password.ts @@ -0,0 +1,28 @@ +import { coreApi } from "#instance/core-api"; +import type { ApiResponse } from "@repo/apis/types/api.types"; +import { requestHandler } from "@repo/apis/utils/request-handler"; +import path from "path"; +import { postResetPasswordSchema as schema } from "./post-reset-password.schema"; +import type { + PostResetPasswordRequest, + PostResetPasswordResponseTransformed, +} from "./post-reset-password.types"; + +export const postResetPasswordURL = () => path.join("accounts/users/reset-password/"); + +export const postResetPassword = async ( + props?: PostResetPasswordRequest, +): Promise> => { + const payloadParsed = schema.request.parse(props); + + const URL = postResetPasswordURL(); + + const response = await requestHandler( + () => coreApi.post(URL, payloadParsed), + schema.response._def.schema, + ); + + const dataParsed = schema.response.parse(response.data); + + return { ...response, data: dataParsed }; +}; diff --git a/packages/apis/src/services/core/accounts/users/reset-password/post/post-reset-password.types.ts b/packages/apis/src/services/core/accounts/users/reset-password/post/post-reset-password.types.ts new file mode 100644 index 00000000..6c87eb2b --- /dev/null +++ b/packages/apis/src/services/core/accounts/users/reset-password/post/post-reset-password.types.ts @@ -0,0 +1,16 @@ +import type { z } from "zod"; +import type { postResetPasswordSchema } from "./post-reset-password.schema"; + +// Response +export type PostResetPasswordRequest = z.input; + +export type PostResetPasswordRequestTransofrmed = z.infer< + typeof postResetPasswordSchema.request +>; + +// Request +export type PostResetPasswordResponse = z.input; + +export type PostResetPasswordResponseTransformed = z.infer< + typeof postResetPasswordSchema.response +>; diff --git a/packages/apis/src/services/core/accounts/users/reset-password/post/use-post-reset-password.ts b/packages/apis/src/services/core/accounts/users/reset-password/post/use-post-reset-password.ts new file mode 100644 index 00000000..ac83cf95 --- /dev/null +++ b/packages/apis/src/services/core/accounts/users/reset-password/post/use-post-reset-password.ts @@ -0,0 +1,34 @@ +import type { + ApiError, + ApiResponse, + UseMutationProps, +} from "@repo/apis/types/api.types"; +import { useMutation } from "@tanstack/react-query"; +import { postResetPassword } from "./post-reset-password"; +import {} from "./post-reset-password.schema"; +import type { + PostResetPasswordRequest, + PostResetPasswordResponseTransformed, +} from "./post-reset-password.types"; + +export type UsePostResetPasswordProps = UseMutationProps< + ApiResponse, + ApiError, + PostResetPasswordRequest +>; + +export const postResetPasswordQueryKey = () => ["postResetPassword"]; + +export const usePostResetPassword = (props?: UsePostResetPasswordProps) => { + const mutation = useMutation< + ApiResponse, + ApiError, + PostResetPasswordRequest + >({ + mutationKey: postResetPasswordQueryKey(), + mutationFn: (data) => postResetPassword(data), + ...props, + }); + + return mutation; +}; diff --git a/packages/apis/src/services/core/accounts/users/verify_otp/post/post-verify-otp.schema.ts b/packages/apis/src/services/core/accounts/users/verify_otp/post/post-verify-otp.schema.ts new file mode 100644 index 00000000..621d3bf5 --- /dev/null +++ b/packages/apis/src/services/core/accounts/users/verify_otp/post/post-verify-otp.schema.ts @@ -0,0 +1,32 @@ +import { apiResponseSchema } from "#schema/api-response-schema"; +import { z } from "zod"; + +// Request +export const postVerifyOtpRequestSchemaTransformed = z + .object({ + otp: z.string(), + username: z.string(), + }) + .transform((data) => data); + +// Response +export const postVerifyOtpResponseSchemaTransofrmed = apiResponseSchema + .extend({ + data: z.object({ + id: z.number(), + username: z.string(), + email: z.string(), + is_active: z.boolean(), + is_email_verified: z.boolean(), + token: z.object({ + refresh: z.string(), + access: z.string(), + }), + }), + }) + .transform((data) => data); + +export const postVerifyOtpSchema = { + response: postVerifyOtpResponseSchemaTransofrmed, + request: postVerifyOtpRequestSchemaTransformed, +}; diff --git a/packages/apis/src/services/core/accounts/users/verify_otp/post/post-verify-otp.ts b/packages/apis/src/services/core/accounts/users/verify_otp/post/post-verify-otp.ts new file mode 100644 index 00000000..26fc6886 --- /dev/null +++ b/packages/apis/src/services/core/accounts/users/verify_otp/post/post-verify-otp.ts @@ -0,0 +1,26 @@ +import { coreApi } from "#instance/core-api"; +import type { ApiResponse } from "@repo/apis/types/api.types"; +import { requestHandler } from "@repo/apis/utils/request-handler"; +import path from "path"; +import { postVerifyOtpSchema as schema } from "./post-verify-otp.schema"; +import type { + PostVerifyOtpRequest, + PostVerifyOtpResponseTransformed, +} from "./post-verify-otp.types"; + +export const postVerifyOtpURL = () => path.join("accounts/users/verify_otp/"); + +export const postVerifyOtp = async ( + props?: PostVerifyOtpRequest, +): Promise> => { + const payloadParsed = schema.request.parse(props); + + const URL = postVerifyOtpURL(); + const response = await requestHandler( + () => coreApi.post(URL, payloadParsed), + schema.response._def.schema, + ); + const dataParsed = schema.response.parse(response.data); + + return { ...response, data: dataParsed }; +}; diff --git a/packages/apis/src/services/core/accounts/users/verify_otp/post/post-verify-otp.types.ts b/packages/apis/src/services/core/accounts/users/verify_otp/post/post-verify-otp.types.ts new file mode 100644 index 00000000..d0333f29 --- /dev/null +++ b/packages/apis/src/services/core/accounts/users/verify_otp/post/post-verify-otp.types.ts @@ -0,0 +1,16 @@ +import type { z } from "zod"; +import type { postVerifyOtpSchema } from "./post-verify-otp.schema"; + +// Response +export type PostVerifyOtpRequest = z.input; + +export type PostVerifyOtpRequestTransofrmed = z.infer< + typeof postVerifyOtpSchema.request +>; + +// Request +export type PostVerifyOtpResponse = z.input; + +export type PostVerifyOtpResponseTransformed = z.infer< + typeof postVerifyOtpSchema.response +>; diff --git a/packages/apis/src/services/core/accounts/users/verify_otp/post/use-post-verify-otp.ts b/packages/apis/src/services/core/accounts/users/verify_otp/post/use-post-verify-otp.ts new file mode 100644 index 00000000..6977fb78 --- /dev/null +++ b/packages/apis/src/services/core/accounts/users/verify_otp/post/use-post-verify-otp.ts @@ -0,0 +1,34 @@ +import type { + ApiError, + ApiResponse, + UseMutationProps, +} from "@repo/apis/types/api.types"; +import { useMutation } from "@tanstack/react-query"; +import { postVerifyOtp } from "./post-verify-otp"; +import {} from "./post-verify-otp.schema"; +import type { + PostVerifyOtpRequest, + PostVerifyOtpResponseTransformed, +} from "./post-verify-otp.types"; + +export type UsePostVerifyOtpProps = UseMutationProps< + ApiResponse, + ApiError, + PostVerifyOtpRequest +>; + +export const postVerifyOtpQueryKey = () => ["postVerifyOtp"]; + +export const usePostVerifyOtp = (props?: UsePostVerifyOtpProps) => { + const mutation = useMutation< + ApiResponse, + ApiError, + PostVerifyOtpRequest + >({ + mutationKey: postVerifyOtpQueryKey(), + mutationFn: (data) => postVerifyOtp(data), + ...props, + }); + + return mutation; +}; diff --git a/packages/apis/src/services/core/forgot-password/post/post-forget-password.schema.ts b/packages/apis/src/services/core/forgot-password/post/post-forget-password.schema.ts deleted file mode 100644 index 49dc5779..00000000 --- a/packages/apis/src/services/core/forgot-password/post/post-forget-password.schema.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { z } from "zod"; - -// Response -export const postForgetPasswordRequestSchemaTransformed = z - .object({ - username: z.string().min(3, "Username must be at least 3 characters long"), - otp: z.string().optional(), - newPassword: z - .string() - .min(8, "New Password must be at least 8 characters long") - .optional(), - confirmPassword: z - .string() - .min(8, "Confirm Password must be at least 8 characters long") - .optional(), - }) - .refine((data) => data.newPassword === data.confirmPassword, { - message: "Passwords do not match", - path: ["confirmPassword"], - }) - .transform((data) => { - delete data.confirmPassword; - delete data.newPassword; - - return { ...data, new_password: data.newPassword }; - }); - -// Request -export const postForgetPasswordResponseSchemaTransofrmed = z - .object({ - message: z.string(), - }) - .transform((data) => data); - -export const postForgetPasswordSchema = { - response: postForgetPasswordResponseSchemaTransofrmed, - request: postForgetPasswordRequestSchemaTransformed, -}; diff --git a/packages/design-system/src/styles/base/_colors-dark.scss b/packages/design-system/src/styles/base/_colors-dark.scss index f69fcaee..a3149b18 100644 --- a/packages/design-system/src/styles/base/_colors-dark.scss +++ b/packages/design-system/src/styles/base/_colors-dark.scss @@ -29,14 +29,6 @@ --ring: var(--zinc-600); --secondary: var(--zinc-800); --secondary-foreground: var(--general-white); - --sidebar: var(--color-card); - --sidebar-accent: var(--color-background); - --sidebar-accent-foreground: var(--color-foreground); - --sidebar-border: rgba(255, 255, 255, 0.0000); - --sidebar-forground: var(--color-foreground); - --sidebar-primary: #ff0000; - --sidebar-primary-foreground: #ff0000; - --sidebar-ring: #ff0000; --success: var(--emerald-500); --success-border: var(--green-900); --success-foreground: var(--green-50); diff --git a/packages/design-system/src/styles/base/_colors-light.scss b/packages/design-system/src/styles/base/_colors-light.scss index e3994792..1fda683e 100644 --- a/packages/design-system/src/styles/base/_colors-light.scss +++ b/packages/design-system/src/styles/base/_colors-light.scss @@ -29,14 +29,6 @@ --ring: var(--zinc-400); --secondary: var(--zinc-100); --secondary-foreground: var(--zinc-900); - --sidebar: var(--color-card); - --sidebar-accent: var(--color-background); - --sidebar-accent-foreground: var(--color-foreground); - --sidebar-border: rgba(255, 255, 255, 0.0000); - --sidebar-forground: var(--color-foreground); - --sidebar-primary: #ff0000; - --sidebar-primary-foreground: #ff0000; - --sidebar-ring: #ff0000; --success: var(--green-100); --success-border: var(--green-200); --success-foreground: var(--green-700); diff --git a/packages/design-system/src/tailwind/colors.ts b/packages/design-system/src/tailwind/colors.ts index 18dea8cb..d686d64b 100644 --- a/packages/design-system/src/tailwind/colors.ts +++ b/packages/design-system/src/tailwind/colors.ts @@ -26,14 +26,6 @@ export const colors = { "ring": "hsl(var(--ring))", "secondary": "hsl(var(--secondary))", "secondary-foreground": "hsl(var(--secondary-foreground))", - "sidebar": "hsl(var(--sidebar))", - "sidebar-accent": "hsl(var(--sidebar-accent))", - "sidebar-accent-foreground": "hsl(var(--sidebar-accent-foreground))", - "sidebar-border": "hsl(var(--sidebar-border))", - "sidebar-forground": "hsl(var(--sidebar-forground))", - "sidebar-primary": "hsl(var(--sidebar-primary))", - "sidebar-primary-foreground": "hsl(var(--sidebar-primary-foreground))", - "sidebar-ring": "hsl(var(--sidebar-ring))", "success": "hsl(var(--success))", "success-border": "hsl(var(--success-border))", "success-foreground": "hsl(var(--success-foreground))", diff --git a/packages/design-system/src/tokens/token_Icon_size_Mode1.json b/packages/design-system/src/tokens/token_Icon_size_Mode1.json deleted file mode 100644 index a539571d..00000000 --- a/packages/design-system/src/tokens/token_Icon_size_Mode1.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "LG": { - "$type": "number", - "$value": 24 - }, - "MD": { - "$type": "number", - "$value": 18 - }, - "XS": { - "$type": "number", - "$value": 16 - } -} \ No newline at end of file diff --git a/packages/design-system/src/tokens/token_color_default.json b/packages/design-system/src/tokens/token_color_default.json index eb23a673..ea9b69c7 100644 --- a/packages/design-system/src/tokens/token_color_default.json +++ b/packages/design-system/src/tokens/token_color_default.json @@ -133,38 +133,6 @@ "$value": "{general.white}", "$description": "Secondary colors for