diff --git a/.github/workflows/workflow.yml b/.github/workflows/workflow.yml new file mode 100644 index 00000000..3e440464 --- /dev/null +++ b/.github/workflows/workflow.yml @@ -0,0 +1,40 @@ +name: workRoot CI + +on: + push: + branches: + - main # main 브랜치에 푸시될 때 실행 + - dev + pull_request: + branches: + - dev + +jobs: + lint-and-build: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Set up Node.js + uses: actions/setup-node@v3 + with: + node-version: "20" # 최신 Node.js 20.x.x 버전 사용 + + - name: Cache dependencies + uses: actions/cache@v3 + with: + path: ~/.npm + key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} + restore-keys: | + ${{ runner.os }}-node- + + - name: Install dependencies + run: npm install + + - name: Run linter + run: npm run lint + + - name: Build project + run: npm run build diff --git a/src/app/(pages)/(addform)/addform/sections/WorkCondition.tsx b/src/app/(pages)/(addform)/addform/sections/WorkCondition.tsx index c059544b..5b0fccec 100644 --- a/src/app/(pages)/(addform)/addform/sections/WorkCondition.tsx +++ b/src/app/(pages)/(addform)/addform/sections/WorkCondition.tsx @@ -56,6 +56,7 @@ export default function WorkCondition({ formData, onUpdate }: WorkConditionProps if (start) setValue("workStartDate", start.toISOString()); if (end) setValue("workEndDate", end.toISOString()); }; + const errorTextStyle = "absolute -bottom-[26px] right-1 text-[13px] text-sm font-medium leading-[22px] text-state-error lg:text-base lg:leading-[26px]"; @@ -63,8 +64,9 @@ export default function WorkCondition({ formData, onUpdate }: WorkConditionProps
+ {/* 지도 API 연동 */} - +
@@ -94,7 +96,12 @@ export default function WorkCondition({ formData, onUpdate }: WorkConditionProps
- +
diff --git a/src/app/api/(file)/resume/upload/route.ts b/src/app/api/(file)/resume/upload/route.ts index e0dab208..8ce67d05 100644 --- a/src/app/api/(file)/resume/upload/route.ts +++ b/src/app/api/(file)/resume/upload/route.ts @@ -1,6 +1,6 @@ +import apiClient from "@/lib/apiClient"; import { cookies } from "next/headers"; import { NextRequest, NextResponse } from "next/server"; -import apiClientNoHeader from "@/lib/apiClientNoHeader"; export async function POST(req: NextRequest) { const accessToken = cookies().get("accessToken")?.value; @@ -22,7 +22,7 @@ export async function POST(req: NextRequest) { const uploadFormData = new FormData(); uploadFormData.append("file", file); - const response = await apiClientNoHeader.post("/resume/upload", uploadFormData, { + const response = await apiClient.post("/resume/upload", uploadFormData, { headers: { Authorization: `Bearer ${accessToken}`, "Content-Type": "multipart/form-data", diff --git a/src/app/components/button/default/CheckBtn.tsx b/src/app/components/button/default/CheckBtn.tsx index 8dc19bf2..1018cabc 100644 --- a/src/app/components/button/default/CheckBtn.tsx +++ b/src/app/components/button/default/CheckBtn.tsx @@ -6,6 +6,7 @@ interface CheckBtnProps extends InputHTMLAttributes { label: string; // 체크박스의 레이블 name: string; // 체크박스의 name 속성 value: string; // 체크박스의 value 속성 + checked?: boolean; // 체크박스가 선택된 상태인지 여부 disabled?: boolean; // 체크박스가 비활성화된 상태인지 여부 onChange?: (e: React.ChangeEvent) => void; } diff --git a/src/app/components/input/file/ImageInput/ImageInputwithPlaceHolder.tsx b/src/app/components/input/file/ImageInput/ImageInputwithPlaceHolder.tsx index 9f991f8a..e45849a5 100644 --- a/src/app/components/input/file/ImageInput/ImageInputwithPlaceHolder.tsx +++ b/src/app/components/input/file/ImageInput/ImageInputwithPlaceHolder.tsx @@ -43,7 +43,6 @@ const ImageInputwithPlaceHolder = () => { name="image" onFileAction={handleFileChange} size={size} - isImage={true} placeholder="" />
diff --git a/src/app/components/input/text/LocationInput.tsx b/src/app/components/input/text/LocationInput.tsx index 4fa95214..ea24bf67 100644 --- a/src/app/components/input/text/LocationInput.tsx +++ b/src/app/components/input/text/LocationInput.tsx @@ -3,19 +3,24 @@ import { IoLocationSharp } from "react-icons/io5"; import BaseInput from "./BaseInput"; import { BaseInputProps } from "@/types/textInput"; +import { forwardRef } from "react"; -const LocationInput = ({ type = "text", variant, errormessage, feedbackMessage, ...props }: BaseInputProps) => { - return ( - } - placeholder="위치를 입력해주세요." - errormessage={errormessage} - feedbackMessage={feedbackMessage} - {...props} - /> - ); -}; +const LocationInput = forwardRef( + ({ type = "text", variant, errormessage, feedbackMessage, ...props }, ref) => { + return ( + } + placeholder="위치를 입력해주세요." + errormessage={errormessage} + feedbackMessage={feedbackMessage} + {...props} + /> + ); + } +); + +LocationInput.displayName = "LocationInput"; export default LocationInput; diff --git a/src/app/stories/design-system/components/input/picker/DatePicker.stories.tsx b/src/app/stories/design-system/components/input/picker/DatePicker.stories.tsx index 3665c430..5abf31e4 100644 --- a/src/app/stories/design-system/components/input/picker/DatePicker.stories.tsx +++ b/src/app/stories/design-system/components/input/picker/DatePicker.stories.tsx @@ -26,5 +26,5 @@ export default meta; type Story = StoryObj; export const DatePicker: Story = { - render: () => , + render: () => {}} />, }; diff --git a/src/middleware.ts b/src/middleware.ts index 5d9e80f3..c7fdf445 100644 --- a/src/middleware.ts +++ b/src/middleware.ts @@ -75,15 +75,6 @@ export function decodeJwt(token: string) { } } -// 토큰 만료 체크 함수 -function isTokenExpired(token: string) { - const decodedToken = decodeJwt(token); - if (!decodedToken) return true; - - const currentTime = Math.floor(Date.now() / 1000); - return decodedToken.exp < currentTime; -} - export const config = { matcher: [ /* diff --git a/src/types/textInput.d.ts b/src/types/textInput.d.ts index 1794fe24..dffb186b 100644 --- a/src/types/textInput.d.ts +++ b/src/types/textInput.d.ts @@ -30,4 +30,5 @@ export interface BaseFileInputProps { placeholder: string; onChange?: (event: Event) => void; accept?: string; + isImage?: boolean; }