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/auth/login/_components/form/loginForm.tsx b/apps/core/app/auth/login/_components/form/loginForm.tsx index f7ae5698..56c36e66 100644 --- a/apps/core/app/auth/login/_components/form/loginForm.tsx +++ b/apps/core/app/auth/login/_components/form/loginForm.tsx @@ -1,9 +1,9 @@ "use client"; import { zodResolver } from "@hookform/resolvers/zod"; -import { postLoginSchema } from "@repo/apis/core/accounts/login/post/post-login.schema"; -import { PostLoginRequest } from "@repo/apis/core/accounts/login/post/post-login.types"; -import { UsePostLogin } from "@repo/apis/core/accounts/login/post/use-post-login"; +import { postLoginSchema } from "@repo/apis/core/accounts/users/login/post/post-login.schema"; +import type { PostLoginRequest } from "@repo/apis/core/accounts/users/login/post/post-login.types"; +import { usePostLogin } from "@repo/apis/core/accounts/users/login/post/use-post-login"; import { setAuthTokens } from "@repo/apis/utils/cookies"; import { Button } from "@repo/ui/components/button"; import { Input } from "@repo/ui/components/input"; @@ -17,8 +17,8 @@ const LoginForm = () => { const form = useForm({ resolver: zodResolver(postLoginSchema.request), defaultValues: { - password: "abcd@1234", - username: "admin", + password: "", + username: "", }, }); @@ -28,19 +28,19 @@ const LoginForm = () => { formState: { errors }, } = form; - const loginMutation = UsePostLogin({ + const loginMutation = usePostLogin({ onSuccess: (res) => { + console.log(res); toast.success("Logged in successfully"); - setAuthTokens(res.data); + setAuthTokens(res.data.data.token); router.push("/"); }, onError: (res) => { - toast.error(res.response?.data.message || "Something went wrong"); + console.log(res); + toast.error(res.response?.data.message ?? "Something went wrong"); }, }); - console.log("ispendimng", loginMutation.isPending); - const handleSubmitForm = handleSubmit(() => { const values = form.getValues(); loginMutation.mutate(values); diff --git a/apps/core/app/auth/login/page.tsx b/apps/core/app/auth/login/page.tsx index fc6bbce5..c0fda491 100644 --- a/apps/core/app/auth/login/page.tsx +++ b/apps/core/app/auth/login/page.tsx @@ -16,9 +16,9 @@ const LoginPage = () => { {/* line */}
-
+

OR

-
+
{/* login with google and linkedin */}
@@ -41,7 +41,7 @@ const LoginPage = () => {
{/* forgot password */}
-

Don’t have an account?

{" "} +

Don’t have an account?

Sign up

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 14cb7549..02913097 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 @@ -11,7 +11,7 @@ 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 { PostRegisterCompleteRequest } from "@repo/apis/core/accounts/register/complete/post/post-register-complete.types"; +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"; @@ -46,7 +46,7 @@ export const SignupOtpForm = (props: SignupOtpFormProps) => { const muutation = UsePostRegisterComplete({ onSuccess: (res) => { toast.info(res.data.message); - router.push(`/auth/login`); + router.push("/auth/login"); }, onError: (err) => { diff --git a/apps/core/middleware.ts b/apps/core/middleware.ts index d4dcb385..654c0df6 100644 --- a/apps/core/middleware.ts +++ b/apps/core/middleware.ts @@ -1,4 +1,4 @@ -import { NextRequest, NextResponse } from "next/server"; +import { type NextRequest, NextResponse } from "next/server"; import { COOKIES } from "@repo/ui/constant/cookie"; export function middleware(request: NextRequest) { diff --git a/bun.lockb b/bun.lockb index 8315f38d..73ece2db 100755 Binary files a/bun.lockb and b/bun.lockb differ diff --git a/packages/apis/package.json b/packages/apis/package.json index c9717a8b..ec4fcc82 100644 --- a/packages/apis/package.json +++ b/packages/apis/package.json @@ -14,6 +14,7 @@ "devDependencies": { "@repo/eslint-config": "workspace:*", "@repo/typescript-config": "workspace:*", + "@types/js-cookie": "^3.0.6", "@types/node": "^20", "@types/react": "^18", "autoprefixer": "^10.4.19", @@ -31,7 +32,7 @@ "@tanstack/react-query-devtools": "^5.62.2", "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/instance/core-api.ts b/packages/apis/src/instance/core-api.ts index b217bf97..7ffc8b40 100644 --- a/packages/apis/src/instance/core-api.ts +++ b/packages/apis/src/instance/core-api.ts @@ -1,13 +1,13 @@ import { COOKIES } from "@repo/ui/constant/cookie"; import { postRefreshToken } from "../services/core/accounts/refresh/post/post-refresh-token"; -import axios, { AxiosError } from "axios"; +import axios, { type AxiosError } from "axios"; import Cookie from "js-cookie"; let isRefreshing = false; let failedQueue: any[] = []; export const coreApi = axios.create({ - baseURL: "http://37.152.182.32/", // You can set your base URL here + baseURL: "https://api.pixelgenius.design", // You can set your base URL here headers: { "Content-Type": "application/json", }, diff --git a/packages/apis/src/instance/guest-api.ts b/packages/apis/src/instance/guest-api.ts index 59227c86..8565a3fd 100644 --- a/packages/apis/src/instance/guest-api.ts +++ b/packages/apis/src/instance/guest-api.ts @@ -1,7 +1,7 @@ import axios from "axios"; export const guestApi = axios.create({ - baseURL: "http://37.152.182.32/", // You can set your base URL here + baseURL: "https://api.pixelgenius.design", // You can set your base URL here headers: { "Content-Type": "application/json", }, diff --git a/packages/apis/src/schema/api-response-schema.ts b/packages/apis/src/schema/api-response-schema.ts new file mode 100644 index 00000000..71c16675 --- /dev/null +++ b/packages/apis/src/schema/api-response-schema.ts @@ -0,0 +1,27 @@ +import z from "zod"; + +export const apiResponseSchema = z.object({ + 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({ + page: z.number(), + per_page: z.number(), + }) + .optional(), + z.null(), + z.undefined(), + ]), +}); diff --git a/packages/apis/src/services/core/accounts/login/post/post-login.schema.ts b/packages/apis/src/services/core/accounts/users/login/post/post-login.schema.ts similarity index 52% rename from packages/apis/src/services/core/accounts/login/post/post-login.schema.ts rename to packages/apis/src/services/core/accounts/users/login/post/post-login.schema.ts index cded1047..45bcbf77 100644 --- a/packages/apis/src/services/core/accounts/login/post/post-login.schema.ts +++ b/packages/apis/src/services/core/accounts/users/login/post/post-login.schema.ts @@ -1,17 +1,26 @@ +import { apiResponseSchema } from "#schema/api-response-schema"; import { z } from "zod"; export const postLoginRequestSchemaTransformed = z .object({ username: z.string().min(3, "Username must be at least 3 characters long"), password: z.string().min(8, "Password must be at least 8 characters long"), - otp: z.string().optional(), }) .transform((data) => data); -export const postLoginResponseSchemaTransofrmed = z - .object({ - refresh: z.string(), - access: z.string(), +export const postLoginResponseSchemaTransofrmed = 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); diff --git a/packages/apis/src/services/core/accounts/login/post/post-login.ts b/packages/apis/src/services/core/accounts/users/login/post/post-login.ts similarity index 83% rename from packages/apis/src/services/core/accounts/login/post/post-login.ts rename to packages/apis/src/services/core/accounts/users/login/post/post-login.ts index 85212a52..4ab884bf 100644 --- a/packages/apis/src/services/core/accounts/login/post/post-login.ts +++ b/packages/apis/src/services/core/accounts/users/login/post/post-login.ts @@ -1,15 +1,15 @@ -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 { postLoginSchema as schema } from "./post-login.schema"; -import { +import type { PostLoginRequest, PostLoginResponseTransformed, } from "./post-login.types"; import { guestApi } from "#instance/guest-api"; -export const postLoginURL = () => path.join("/accounts/login/"); +export const postLoginURL = () => path.join("accounts/users/login/"); export const postLogin = async ( props?: PostLoginRequest, diff --git a/packages/apis/src/services/core/accounts/login/post/post-login.types.ts b/packages/apis/src/services/core/accounts/users/login/post/post-login.types.ts similarity index 79% rename from packages/apis/src/services/core/accounts/login/post/post-login.types.ts rename to packages/apis/src/services/core/accounts/users/login/post/post-login.types.ts index 6d377a22..7a94d497 100644 --- a/packages/apis/src/services/core/accounts/login/post/post-login.types.ts +++ b/packages/apis/src/services/core/accounts/users/login/post/post-login.types.ts @@ -1,14 +1,14 @@ -import { z } from "zod"; -import { postLoginSchema } from "./post-login.schema"; +import type { z } from "zod"; +import type { postLoginSchema } from "./post-login.schema"; -// Response +// Request export type PostLoginRequest = z.input; export type PostLoginRequestTransofrmed = z.infer< typeof postLoginSchema.request >; -// Request +// Response export type PostLoginResponse = z.input; export type PostLoginResponseTransformed = z.infer< diff --git a/packages/apis/src/services/core/accounts/login/post/use-post-login.ts b/packages/apis/src/services/core/accounts/users/login/post/use-post-login.ts similarity index 88% rename from packages/apis/src/services/core/accounts/login/post/use-post-login.ts rename to packages/apis/src/services/core/accounts/users/login/post/use-post-login.ts index b0f88f93..c31df96e 100644 --- a/packages/apis/src/services/core/accounts/login/post/use-post-login.ts +++ b/packages/apis/src/services/core/accounts/users/login/post/use-post-login.ts @@ -1,11 +1,11 @@ -import { +import type { ApiError, ApiResponse, UseMutationProps, } from "@repo/apis/types/api.types"; import { useMutation } from "@tanstack/react-query"; import { postLogin } from "./post-login"; -import { +import type { PostLoginRequest, PostLoginResponseTransformed, } from "./post-login.types"; @@ -18,7 +18,7 @@ export type UsePostLoginProps = UseMutationProps< export const postLoginQueryKey = () => ["postLogin"]; -export const UsePostLogin = (props?: UsePostLoginProps) => { +export const usePostLogin = (props?: UsePostLoginProps) => { const mutation = useMutation< ApiResponse, ApiError, diff --git a/packages/apis/src/types/api.types.ts b/packages/apis/src/types/api.types.ts index 074656ee..51eea339 100644 --- a/packages/apis/src/types/api.types.ts +++ b/packages/apis/src/types/api.types.ts @@ -1,9 +1,11 @@ +import { apiResponseSchema } from "#schema/api-response-schema.js"; import { DefinedInitialDataOptions, QueryKey, UseMutationOptions, } from "@tanstack/react-query"; import { AxiosError, AxiosResponse } from "axios"; +import z from "zod"; export type ApiResponse = AxiosResponse; @@ -25,6 +27,4 @@ export type UseMutationProps< TContext = unknown, > = Partial>; -export type ApiError = AxiosError<{ - message: string; -}>; +export type ApiError = AxiosError>; diff --git a/packages/apis/turbo/generators/templates/hook.useMutation.hbs b/packages/apis/turbo/generators/templates/hook.useMutation.hbs index bb07ad89..571aa024 100644 --- a/packages/apis/turbo/generators/templates/hook.useMutation.hbs +++ b/packages/apis/turbo/generators/templates/hook.useMutation.hbs @@ -19,7 +19,7 @@ export type Use{{pascalCase method}}{{pascalCase name}}Props = UseMutationProps< export const {{method}}{{pascalCase name}}QueryKey = () => ["{{method}}{{pascalCase name}}"]; -export const Use{{pascalCase method}}{{pascalCase name}} = (props?: Use{{pascalCase method}}{{pascalCase name}}Props) => { +export const use{{pascalCase method}}{{pascalCase name}} = (props?: Use{{pascalCase method}}{{pascalCase name}}Props) => { const mutation = useMutation< ApiResponse<{{pascalCase method}}{{pascalCase name}}ResponseTransformed>, ApiError, diff --git a/packages/apis/turbo/generators/templates/schema.hbs b/packages/apis/turbo/generators/templates/schema.hbs index e75e63c4..eb1599b4 100644 --- a/packages/apis/turbo/generators/templates/schema.hbs +++ b/packages/apis/turbo/generators/templates/schema.hbs @@ -1,18 +1,19 @@ +import { apiResponseSchema } from "#schema/api-response-schema"; import { z } from "zod"; -// Response +// Request export const {{method}}{{pascalCase name}}RequestSchemaTransformed = z .object({ keyPayload: z.string(), }) .transform((data) => data); -// Request -export const {{method}}{{pascalCase name}}ResponseSchemaTransofrmed = z - .object({ +// Response +export const {{method}}{{pascalCase name}}ResponseSchemaTransofrmed = apiResponseSchema.extend({ + data: z.object({ keyBody: z.string(), - }) - .transform((data) => data); + }), +}).transform((data) => data);; export const {{method}}{{pascalCase name}}Schema = { response: {{method}}{{pascalCase name}}ResponseSchemaTransofrmed,