{"version":3,"file":"main-0c22b5b48910d7624ca4.js","mappings":"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","sources":["webpack://unresume-frontend/webpack/runtime/chunk loaded","webpack://unresume-frontend/webpack/runtime/create fake namespace object","webpack://unresume-frontend/./frontend/js/api/core/ApiError.ts","webpack://unresume-frontend/./frontend/js/api/core/CancelablePromise.ts","webpack://unresume-frontend/./frontend/js/api/core/OpenAPI.ts","webpack://unresume-frontend/./frontend/js/api/core/request.ts","webpack://unresume-frontend/./frontend/js/api/services.gen.ts","webpack://unresume-frontend/./frontend/js/components/candidate/Notifications.jsx","webpack://unresume-frontend/./frontend/js/components/candidate/HomeNavbar.jsx","webpack://unresume-frontend/./frontend/js/utils/formatRelativeDate.js","webpack://unresume-frontend/./frontend/js/utils/formatSalary.js","webpack://unresume-frontend/./frontend/js/components/candidate/all_matches/components/JobExpand.jsx","webpack://unresume-frontend/./frontend/js/components/candidate/all_matches/components/JobCard.jsx","webpack://unresume-frontend/./frontend/js/constants/AlertProvider.jsx","webpack://unresume-frontend/./frontend/js/components/common/SkeletonLoader.jsx","webpack://unresume-frontend/./frontend/js/components/candidate/all_matches/components/JobList.jsx","webpack://unresume-frontend/./frontend/js/components/candidate/all_matches/components/FilterBar.jsx","webpack://unresume-frontend/./frontend/js/components/candidate/all_matches/Jobs.jsx","webpack://unresume-frontend/./frontend/js/components/common/ImageCropper.tsx","webpack://unresume-frontend/./frontend/js/components/common/useImageCropper.ts","webpack://unresume-frontend/./frontend/js/components/common/croputils.ts","webpack://unresume-frontend/./frontend/js/components/common/ImageModal.tsx","webpack://unresume-frontend/./frontend/js/components/candidate/edit_profile/EditProfileHeader.jsx","webpack://unresume-frontend/./frontend/js/components/candidate/edit_profile/EditPersonalInfo.jsx","webpack://unresume-frontend/./frontend/js/components/candidate/edit_profile/EditEducation.jsx","webpack://unresume-frontend/./frontend/js/components/candidate/edit_profile/EditSkills.jsx","webpack://unresume-frontend/./frontend/js/components/candidate/edit_profile/EditWorkExp.jsx","webpack://unresume-frontend/./frontend/js/components/candidate/edit_profile/EditProfile.jsx","webpack://unresume-frontend/./frontend/js/constants/Navbar.jsx","webpack://unresume-frontend/./frontend/js/components/candidate/onboarding/OnboardingLinks.jsx","webpack://unresume-frontend/./frontend/js/components/common/Select.tsx","webpack://unresume-frontend/./frontend/js/components/common/LocationPicker.jsx","webpack://unresume-frontend/./frontend/js/components/candidate/onboarding/OnboardingPreferences.jsx","webpack://unresume-frontend/./frontend/js/utils/getUserDetails.js","webpack://unresume-frontend/./frontend/js/components/candidate/onboarding/AddEducation.jsx","webpack://unresume-frontend/./frontend/js/components/candidate/onboarding/AddWorkExp.jsx","webpack://unresume-frontend/./frontend/js/components/candidate/onboarding/AddSkills.jsx","webpack://unresume-frontend/./frontend/js/components/candidate/onboarding/AddProjects.jsx","webpack://unresume-frontend/./frontend/js/components/candidate/ResumeUploader.jsx","webpack://unresume-frontend/./frontend/js/components/candidate/onboarding/OnboardingProfile.jsx","webpack://unresume-frontend/./frontend/js/components/candidate/onboarding/OnboardingSkills.jsx","webpack://unresume-frontend/./frontend/js/components/candidate/Volunteer.jsx","webpack://unresume-frontend/./frontend/js/utils/universalFormatter.ts","webpack://unresume-frontend/./frontend/js/components/candidate/your_matches/components/JobCard.jsx","webpack://unresume-frontend/./frontend/js/utils/slugify.ts","webpack://unresume-frontend/./frontend/js/components/candidate/your_matches/components/Matched.jsx","webpack://unresume-frontend/./frontend/js/components/candidate/your_matches/components/Saved.jsx","webpack://unresume-frontend/./frontend/js/components/candidate/your_matches/components/Shortlisted.jsx","webpack://unresume-frontend/./frontend/js/components/candidate/your_matches/components/Header.jsx","webpack://unresume-frontend/./frontend/js/components/candidate/your_matches/components/Navigator.jsx","webpack://unresume-frontend/./frontend/js/components/candidate/your_matches/YourMatches.jsx","webpack://unresume-frontend/./frontend/js/components/recruiter/RecHomeNavbar.jsx","webpack://unresume-frontend/./frontend/js/components/recruiter/CandidateMatches.jsx","webpack://unresume-frontend/./frontend/js/components/common/LocationSelector.jsx","webpack://unresume-frontend/./frontend/js/utils/getLocationObject.js","webpack://unresume-frontend/./frontend/js/components/recruiter/JobPost.jsx","webpack://unresume-frontend/./frontend/js/components/recruiter/my_jobs/components/StatusBadge.jsx","webpack://unresume-frontend/./frontend/js/components/recruiter/my_jobs/components/JobCard.jsx","webpack://unresume-frontend/./frontend/js/components/recruiter/my_jobs/components/JobsTable.jsx","webpack://unresume-frontend/./frontend/js/components/recruiter/my_jobs/components/JobsFilter.jsx","webpack://unresume-frontend/./frontend/js/components/recruiter/my_jobs/components/JobsStats.jsx","webpack://unresume-frontend/./frontend/js/components/recruiter/my_jobs/hooks/useUserJobStats.js","webpack://unresume-frontend/./frontend/js/components/recruiter/my_jobs/MyJobs.jsx","webpack://unresume-frontend/./frontend/js/components/recruiter/RecPreferences.jsx","webpack://unresume-frontend/./frontend/js/utils/authUtils.js","webpack://unresume-frontend/./frontend/js/constants/Login.jsx","webpack://unresume-frontend/./frontend/js/constants/schemas/signupSchema.js","webpack://unresume-frontend/./frontend/js/constants/RecSignup.jsx","webpack://unresume-frontend/./frontend/js/constants/SbSignup.jsx","webpack://unresume-frontend/./frontend/js/constants/Signup.jsx","webpack://unresume-frontend/./frontend/js/components/candidate/WorkExp.jsx","webpack://unresume-frontend/./frontend/js/components/candidate/Skills.jsx","webpack://unresume-frontend/./frontend/js/components/candidate/Education.jsx","webpack://unresume-frontend/./frontend/js/components/candidate/Projects.jsx","webpack://unresume-frontend/./frontend/js/components/candidate/Contact.jsx","webpack://unresume-frontend/./frontend/js/pages/CandidateProfile.jsx","webpack://unresume-frontend/./frontend/js/pages/Home.jsx","webpack://unresume-frontend/./frontend/js/pages/JobShare.jsx","webpack://unresume-frontend/./frontend/js/components/common/RolePopup.jsx","webpack://unresume-frontend/./frontend/js/pages/LandingPage.jsx","webpack://unresume-frontend/./frontend/js/components/recruiter/org_home/rec_home/components/Header.jsx","webpack://unresume-frontend/./frontend/js/components/recruiter/org_home/rec_home/components/SearchBar.jsx","webpack://unresume-frontend/./frontend/js/components/recruiter/org_home/rec_home/components/TalentList.jsx","webpack://unresume-frontend/./frontend/js/components/recruiter/org_home/rec_home/RecHome.jsx","webpack://unresume-frontend/./frontend/js/pages/OrgHome.jsx","webpack://unresume-frontend/./frontend/js/components/recruiter/RecProfile.jsx","webpack://unresume-frontend/./frontend/js/pages/OrgProfile.jsx","webpack://unresume-frontend/./frontend/js/pages/Profile.jsx","webpack://unresume-frontend/./frontend/js/routes/ProtectedRoutes.jsx","webpack://unresume-frontend/./frontend/js/routes/SetProfileGuard.jsx","webpack://unresume-frontend/./frontend/js/App.tsx","webpack://unresume-frontend/./frontend/js/index.tsx","webpack://unresume-frontend/webpack/bootstrap","webpack://unresume-frontend/webpack/runtime/compat get default export","webpack://unresume-frontend/webpack/runtime/define property getters","webpack://unresume-frontend/webpack/runtime/hasOwnProperty shorthand","webpack://unresume-frontend/webpack/runtime/make namespace object","webpack://unresume-frontend/webpack/runtime/publicPath","webpack://unresume-frontend/webpack/runtime/jsonp chunk loading","webpack://unresume-frontend/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","var getProto = Object.getPrototypeOf ? (obj) => (Object.getPrototypeOf(obj)) : (obj) => (obj.__proto__);\nvar leafPrototypes;\n// create a fake namespace object\n// mode & 1: value is a module id, require it\n// mode & 2: merge all properties of value into the ns\n// mode & 4: return value when already ns object\n// mode & 16: return value when it's Promise-like\n// mode & 8|1: behave like require\n__webpack_require__.t = function(value, mode) {\n\tif(mode & 1) value = this(value);\n\tif(mode & 8) return value;\n\tif(typeof value === 'object' && value) {\n\t\tif((mode & 4) && value.__esModule) return value;\n\t\tif((mode & 16) && typeof value.then === 'function') return value;\n\t}\n\tvar ns = Object.create(null);\n\t__webpack_require__.r(ns);\n\tvar def = {};\n\tleafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)];\n\tfor(var current = mode & 2 && value; (typeof current == 'object' || typeof current == 'function') && !~leafPrototypes.indexOf(current); current = getProto(current)) {\n\t\tObject.getOwnPropertyNames(current).forEach((key) => (def[key] = () => (value[key])));\n\t}\n\tdef['default'] = () => (value);\n\t__webpack_require__.d(ns, def);\n\treturn ns;\n};","import type { ApiRequestOptions } from \"./ApiRequestOptions\";\nimport type { ApiResult } from \"./ApiResult\";\n\nexport class ApiError extends Error {\n  public readonly url: string;\n  public readonly status: number;\n  public readonly statusText: string;\n  public readonly body: unknown;\n  public readonly request: ApiRequestOptions;\n\n  constructor(\n    request: ApiRequestOptions,\n    response: ApiResult,\n    message: string,\n  ) {\n    super(message);\n\n    this.name = \"ApiError\";\n    this.url = response.url;\n    this.status = response.status;\n    this.statusText = response.statusText;\n    this.body = response.body;\n    this.request = request;\n  }\n}\n","export class CancelError extends Error {\n  constructor(message: string) {\n    super(message);\n    this.name = \"CancelError\";\n  }\n\n  public get isCancelled(): boolean {\n    return true;\n  }\n}\n\nexport interface OnCancel {\n  readonly isResolved: boolean;\n  readonly isRejected: boolean;\n  readonly isCancelled: boolean;\n\n  (cancelHandler: () => void): void;\n}\n\nexport class CancelablePromise<T> implements Promise<T> {\n  private _isResolved: boolean;\n  private _isRejected: boolean;\n  private _isCancelled: boolean;\n  readonly cancelHandlers: (() => void)[];\n  readonly promise: Promise<T>;\n  private _resolve?: (value: T | PromiseLike<T>) => void;\n  private _reject?: (reason?: unknown) => void;\n\n  constructor(\n    executor: (\n      resolve: (value: T | PromiseLike<T>) => void,\n      reject: (reason?: unknown) => void,\n      onCancel: OnCancel,\n    ) => void,\n  ) {\n    this._isResolved = false;\n    this._isRejected = false;\n    this._isCancelled = false;\n    this.cancelHandlers = [];\n    this.promise = new Promise<T>((resolve, reject) => {\n      this._resolve = resolve;\n      this._reject = reject;\n\n      const onResolve = (value: T | PromiseLike<T>): void => {\n        if (this._isResolved || this._isRejected || this._isCancelled) {\n          return;\n        }\n        this._isResolved = true;\n        if (this._resolve) this._resolve(value);\n      };\n\n      const onReject = (reason?: unknown): void => {\n        if (this._isResolved || this._isRejected || this._isCancelled) {\n          return;\n        }\n        this._isRejected = true;\n        if (this._reject) this._reject(reason);\n      };\n\n      const onCancel = (cancelHandler: () => void): void => {\n        if (this._isResolved || this._isRejected || this._isCancelled) {\n          return;\n        }\n        this.cancelHandlers.push(cancelHandler);\n      };\n\n      Object.defineProperty(onCancel, \"isResolved\", {\n        get: (): boolean => this._isResolved,\n      });\n\n      Object.defineProperty(onCancel, \"isRejected\", {\n        get: (): boolean => this._isRejected,\n      });\n\n      Object.defineProperty(onCancel, \"isCancelled\", {\n        get: (): boolean => this._isCancelled,\n      });\n\n      return executor(onResolve, onReject, onCancel as OnCancel);\n    });\n  }\n\n  get [Symbol.toStringTag]() {\n    return \"Cancellable Promise\";\n  }\n\n  public then<TResult1 = T, TResult2 = never>(\n    onFulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null,\n    onRejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null,\n  ): Promise<TResult1 | TResult2> {\n    return this.promise.then(onFulfilled, onRejected);\n  }\n\n  public catch<TResult = never>(\n    onRejected?: ((reason: unknown) => TResult | PromiseLike<TResult>) | null,\n  ): Promise<T | TResult> {\n    return this.promise.catch(onRejected);\n  }\n\n  public finally(onFinally?: (() => void) | null): Promise<T> {\n    return this.promise.finally(onFinally);\n  }\n\n  public cancel(): void {\n    if (this._isResolved || this._isRejected || this._isCancelled) {\n      return;\n    }\n    this._isCancelled = true;\n    if (this.cancelHandlers.length) {\n      try {\n        for (const cancelHandler of this.cancelHandlers) {\n          cancelHandler();\n        }\n      } catch (error) {\n        console.warn(\"Cancellation threw an error\", error);\n        return;\n      }\n    }\n    this.cancelHandlers.length = 0;\n    if (this._reject) this._reject(new CancelError(\"Request aborted\"));\n  }\n\n  public get isCancelled(): boolean {\n    return this._isCancelled;\n  }\n}\n","import type { AxiosRequestConfig, AxiosResponse } from \"axios\";\nimport type { ApiRequestOptions } from \"./ApiRequestOptions\";\n\ntype Headers = Record<string, string>;\ntype Middleware<T> = (value: T) => T | Promise<T>;\ntype Resolver<T> = (options: ApiRequestOptions) => Promise<T>;\n\nexport class Interceptors<T> {\n  _fns: Middleware<T>[];\n\n  constructor() {\n    this._fns = [];\n  }\n\n  eject(fn: Middleware<T>) {\n    const index = this._fns.indexOf(fn);\n    if (index !== -1) {\n      this._fns = [...this._fns.slice(0, index), ...this._fns.slice(index + 1)];\n    }\n  }\n\n  use(fn: Middleware<T>) {\n    this._fns = [...this._fns, fn];\n  }\n}\n\nexport type OpenAPIConfig = {\n  BASE: string;\n  CREDENTIALS: \"include\" | \"omit\" | \"same-origin\";\n  ENCODE_PATH?: ((path: string) => string) | undefined;\n  HEADERS?: Headers | Resolver<Headers> | undefined;\n  PASSWORD?: string | Resolver<string> | undefined;\n  TOKEN?: string | Resolver<string> | undefined;\n  USERNAME?: string | Resolver<string> | undefined;\n  VERSION: string;\n  WITH_CREDENTIALS: boolean;\n  interceptors: {\n    request: Interceptors<AxiosRequestConfig>;\n    response: Interceptors<AxiosResponse>;\n  };\n};\n\nexport const OpenAPI: OpenAPIConfig = {\n  BASE: \"\",\n  CREDENTIALS: \"include\",\n  ENCODE_PATH: undefined,\n  HEADERS: undefined,\n  PASSWORD: undefined,\n  TOKEN: undefined,\n  USERNAME: undefined,\n  VERSION: \"0.1.0\",\n  WITH_CREDENTIALS: false,\n  interceptors: {\n    request: new Interceptors(),\n    response: new Interceptors(),\n  },\n};\n","import axios from \"axios\";\nimport type {\n  AxiosError,\n  AxiosRequestConfig,\n  AxiosResponse,\n  AxiosInstance,\n} from \"axios\";\n\nimport { ApiError } from \"./ApiError\";\nimport type { ApiRequestOptions } from \"./ApiRequestOptions\";\nimport type { ApiResult } from \"./ApiResult\";\nimport { CancelablePromise } from \"./CancelablePromise\";\nimport type { OnCancel } from \"./CancelablePromise\";\nimport type { OpenAPIConfig } from \"./OpenAPI\";\n\nexport const isString = (value: unknown): value is string => {\n  return typeof value === \"string\";\n};\n\nexport const isStringWithValue = (value: unknown): value is string => {\n  return isString(value) && value !== \"\";\n};\n\nexport const isBlob = (value: any): value is Blob => {\n  return value instanceof Blob;\n};\n\nexport const isFormData = (value: unknown): value is FormData => {\n  return value instanceof FormData;\n};\n\nexport const isSuccess = (status: number): boolean => {\n  return status >= 200 && status < 300;\n};\n\nexport const base64 = (str: string): string => {\n  try {\n    return btoa(str);\n  } catch (err) {\n    // @ts-ignore\n    return Buffer.from(str).toString(\"base64\");\n  }\n};\n\nexport const getQueryString = (params: Record<string, unknown>): string => {\n  const qs: string[] = [];\n\n  const append = (key: string, value: unknown) => {\n    qs.push(`${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`);\n  };\n\n  const encodePair = (key: string, value: unknown) => {\n    if (value === undefined || value === null) {\n      return;\n    }\n\n    if (value instanceof Date) {\n      append(key, value.toISOString());\n    } else if (Array.isArray(value)) {\n      value.forEach((v) => encodePair(key, v));\n    } else if (typeof value === \"object\") {\n      Object.entries(value).forEach(([k, v]) => encodePair(`${key}[${k}]`, v));\n    } else {\n      append(key, value);\n    }\n  };\n\n  Object.entries(params).forEach(([key, value]) => encodePair(key, value));\n\n  return qs.length ? `?${qs.join(\"&\")}` : \"\";\n};\n\nconst getUrl = (config: OpenAPIConfig, options: ApiRequestOptions): string => {\n  const encoder = config.ENCODE_PATH || encodeURI;\n\n  const path = options.url\n    .replace(\"{api-version}\", config.VERSION)\n    .replace(/{(.*?)}/g, (substring: string, group: string) => {\n      if (options.path?.hasOwnProperty(group)) {\n        return encoder(String(options.path[group]));\n      }\n      return substring;\n    });\n\n  const url = config.BASE + path;\n  return options.query ? url + getQueryString(options.query) : url;\n};\n\nexport const getFormData = (\n  options: ApiRequestOptions,\n): FormData | undefined => {\n  if (options.formData) {\n    const formData = new FormData();\n\n    const process = (key: string, value: unknown) => {\n      if (isString(value) || isBlob(value)) {\n        formData.append(key, value);\n      } else {\n        formData.append(key, JSON.stringify(value));\n      }\n    };\n\n    Object.entries(options.formData)\n      .filter(([, value]) => value !== undefined && value !== null)\n      .forEach(([key, value]) => {\n        if (Array.isArray(value)) {\n          value.forEach((v) => process(key, v));\n        } else {\n          process(key, value);\n        }\n      });\n\n    return formData;\n  }\n  return undefined;\n};\n\ntype Resolver<T> = (options: ApiRequestOptions) => Promise<T>;\n\nexport const resolve = async <T>(\n  options: ApiRequestOptions,\n  resolver?: T | Resolver<T>,\n): Promise<T | undefined> => {\n  if (typeof resolver === \"function\") {\n    return (resolver as Resolver<T>)(options);\n  }\n  return resolver;\n};\n\nexport const getHeaders = async (\n  config: OpenAPIConfig,\n  options: ApiRequestOptions,\n): Promise<Record<string, string>> => {\n  const [token, username, password, additionalHeaders] = await Promise.all([\n    resolve(options, config.TOKEN),\n    resolve(options, config.USERNAME),\n    resolve(options, config.PASSWORD),\n    resolve(options, config.HEADERS),\n  ]);\n\n  const headers = Object.entries({\n    Accept: \"application/json\",\n    ...additionalHeaders,\n    ...options.headers,\n  })\n    .filter(([, value]) => value !== undefined && value !== null)\n    .reduce(\n      (headers, [key, value]) => ({\n        ...headers,\n        [key]: String(value),\n      }),\n      {} as Record<string, string>,\n    );\n\n  if (isStringWithValue(token)) {\n    headers[\"Authorization\"] = `Bearer ${token}`;\n  }\n\n  if (isStringWithValue(username) && isStringWithValue(password)) {\n    const credentials = base64(`${username}:${password}`);\n    headers[\"Authorization\"] = `Basic ${credentials}`;\n  }\n\n  if (options.body !== undefined) {\n    if (options.mediaType) {\n      headers[\"Content-Type\"] = options.mediaType;\n    } else if (isBlob(options.body)) {\n      headers[\"Content-Type\"] = options.body.type || \"application/octet-stream\";\n    } else if (isString(options.body)) {\n      headers[\"Content-Type\"] = \"text/plain\";\n    } else if (!isFormData(options.body)) {\n      headers[\"Content-Type\"] = \"application/json\";\n    }\n  } else if (options.formData !== undefined) {\n    if (options.mediaType) {\n      headers[\"Content-Type\"] = options.mediaType;\n    }\n  }\n\n  return headers;\n};\n\nexport const getRequestBody = (options: ApiRequestOptions): unknown => {\n  if (options.body) {\n    return options.body;\n  }\n  return undefined;\n};\n\nexport const sendRequest = async <T>(\n  config: OpenAPIConfig,\n  options: ApiRequestOptions,\n  url: string,\n  body: unknown,\n  formData: FormData | undefined,\n  headers: Record<string, string>,\n  onCancel: OnCancel,\n  axiosClient: AxiosInstance,\n): Promise<AxiosResponse<T>> => {\n  const controller = new AbortController();\n\n  let requestConfig: AxiosRequestConfig = {\n    data: body ?? formData,\n    headers,\n    method: options.method,\n    signal: controller.signal,\n    url,\n    withCredentials: config.WITH_CREDENTIALS,\n  };\n\n  onCancel(() => controller.abort());\n\n  for (const fn of config.interceptors.request._fns) {\n    requestConfig = await fn(requestConfig);\n  }\n\n  try {\n    return await axiosClient.request(requestConfig);\n  } catch (error) {\n    const axiosError = error as AxiosError<T>;\n    if (axiosError.response) {\n      return axiosError.response;\n    }\n    throw error;\n  }\n};\n\nexport const getResponseHeader = (\n  response: AxiosResponse<unknown>,\n  responseHeader?: string,\n): string | undefined => {\n  if (responseHeader) {\n    const content = response.headers[responseHeader];\n    if (isString(content)) {\n      return content;\n    }\n  }\n  return undefined;\n};\n\nexport const getResponseBody = (response: AxiosResponse<unknown>): unknown => {\n  if (response.status !== 204) {\n    return response.data;\n  }\n  return undefined;\n};\n\nexport const catchErrorCodes = (\n  options: ApiRequestOptions,\n  result: ApiResult,\n): void => {\n  const errors: Record<number, string> = {\n    400: \"Bad Request\",\n    401: \"Unauthorized\",\n    402: \"Payment Required\",\n    403: \"Forbidden\",\n    404: \"Not Found\",\n    405: \"Method Not Allowed\",\n    406: \"Not Acceptable\",\n    407: \"Proxy Authentication Required\",\n    408: \"Request Timeout\",\n    409: \"Conflict\",\n    410: \"Gone\",\n    411: \"Length Required\",\n    412: \"Precondition Failed\",\n    413: \"Payload Too Large\",\n    414: \"URI Too Long\",\n    415: \"Unsupported Media Type\",\n    416: \"Range Not Satisfiable\",\n    417: \"Expectation Failed\",\n    418: \"Im a teapot\",\n    421: \"Misdirected Request\",\n    422: \"Unprocessable Content\",\n    423: \"Locked\",\n    424: \"Failed Dependency\",\n    425: \"Too Early\",\n    426: \"Upgrade Required\",\n    428: \"Precondition Required\",\n    429: \"Too Many Requests\",\n    431: \"Request Header Fields Too Large\",\n    451: \"Unavailable For Legal Reasons\",\n    500: \"Internal Server Error\",\n    501: \"Not Implemented\",\n    502: \"Bad Gateway\",\n    503: \"Service Unavailable\",\n    504: \"Gateway Timeout\",\n    505: \"HTTP Version Not Supported\",\n    506: \"Variant Also Negotiates\",\n    507: \"Insufficient Storage\",\n    508: \"Loop Detected\",\n    510: \"Not Extended\",\n    511: \"Network Authentication Required\",\n    ...options.errors,\n  };\n\n  const error = errors[result.status];\n  if (error) {\n    throw new ApiError(options, result, error);\n  }\n\n  if (!result.ok) {\n    const errorStatus = result.status ?? \"unknown\";\n    const errorStatusText = result.statusText ?? \"unknown\";\n    const errorBody = (() => {\n      try {\n        return JSON.stringify(result.body, null, 2);\n      } catch (e) {\n        return undefined;\n      }\n    })();\n\n    throw new ApiError(\n      options,\n      result,\n      `Generic Error: status: ${errorStatus}; status text: ${errorStatusText}; body: ${errorBody}`,\n    );\n  }\n};\n\n/**\n * Request method\n * @param config The OpenAPI configuration object\n * @param options The request options from the service\n * @param axiosClient The axios client instance to use\n * @returns CancelablePromise<T>\n * @throws ApiError\n */\nexport const request = <T>(\n  config: OpenAPIConfig,\n  options: ApiRequestOptions,\n  axiosClient: AxiosInstance = axios,\n): CancelablePromise<T> => {\n  return new CancelablePromise(async (resolve, reject, onCancel) => {\n    try {\n      const url = getUrl(config, options);\n      const formData = getFormData(options);\n      const body = getRequestBody(options);\n      const headers = await getHeaders(config, options);\n\n      if (!onCancel.isCancelled) {\n        let response = await sendRequest<T>(\n          config,\n          options,\n          url,\n          body,\n          formData,\n          headers,\n          onCancel,\n          axiosClient,\n        );\n\n        for (const fn of config.interceptors.response._fns) {\n          response = await fn(response);\n        }\n\n        const responseBody = getResponseBody(response);\n        const responseHeader = getResponseHeader(\n          response,\n          options.responseHeader,\n        );\n\n        const result: ApiResult = {\n          url,\n          ok: isSuccess(response.status),\n          status: response.status,\n          statusText: response.statusText,\n          body: responseHeader ?? responseBody,\n        };\n\n        catchErrorCodes(options, result);\n\n        resolve(result.body);\n      }\n    } catch (error) {\n      reject(error);\n    }\n  });\n};\n","// This file is auto-generated by @hey-api/openapi-ts\n\nimport type { CancelablePromise } from \"./core/CancelablePromise\";\nimport { OpenAPI } from \"./core/OpenAPI\";\nimport { request as __request } from \"./core/request\";\nimport type {\n  ApiApplicationListData,\n  ApiApplicationListResponse,\n  ApiApplicationCreateData,\n  ApiApplicationCreateResponse,\n  ApiApplicationRetrieveData,\n  ApiApplicationRetrieveResponse,\n  ApiApplicationUpdateData,\n  ApiApplicationUpdateResponse,\n  ApiApplicationPartialUpdateData,\n  ApiApplicationPartialUpdateResponse,\n  ApiApplicationDestroyData,\n  ApiApplicationDestroyResponse,\n  ApiAwardListData,\n  ApiAwardListResponse,\n  ApiAwardCreateData,\n  ApiAwardCreateResponse,\n  ApiAwardRetrieveData,\n  ApiAwardRetrieveResponse,\n  ApiAwardUpdateData,\n  ApiAwardUpdateResponse,\n  ApiAwardPartialUpdateData,\n  ApiAwardPartialUpdateResponse,\n  ApiAwardDestroyData,\n  ApiAwardDestroyResponse,\n  ApiCandidatePreferencesRetrieveResponse,\n  ApiCandidatePreferencesUpdateData,\n  ApiCandidatePreferencesUpdateResponse,\n  ApiCertificationListData,\n  ApiCertificationListResponse,\n  ApiCertificationCreateData,\n  ApiCertificationCreateResponse,\n  ApiCertificationRetrieveData,\n  ApiCertificationRetrieveResponse,\n  ApiCertificationUpdateData,\n  ApiCertificationUpdateResponse,\n  ApiCertificationPartialUpdateData,\n  ApiCertificationPartialUpdateResponse,\n  ApiCertificationDestroyData,\n  ApiCertificationDestroyResponse,\n  ApiCompanyListData,\n  ApiCompanyListResponse,\n  ApiCompanyCreateData,\n  ApiCompanyCreateResponse,\n  ApiCompanyRetrieveData,\n  ApiCompanyRetrieveResponse,\n  ApiCompanyUpdateData,\n  ApiCompanyUpdateResponse,\n  ApiCompanyPartialUpdateData,\n  ApiCompanyPartialUpdateResponse,\n  ApiCompanyDestroyData,\n  ApiCompanyDestroyResponse,\n  ApiEducationListData,\n  ApiEducationListResponse,\n  ApiEducationCreateData,\n  ApiEducationCreateResponse,\n  ApiEducationRetrieveData,\n  ApiEducationRetrieveResponse,\n  ApiEducationUpdateData,\n  ApiEducationUpdateResponse,\n  ApiEducationPartialUpdateData,\n  ApiEducationPartialUpdateResponse,\n  ApiEducationDestroyData,\n  ApiEducationDestroyResponse,\n  ApiEventsListData,\n  ApiEventsListResponse,\n  ApiEventsCreateData,\n  ApiEventsCreateResponse,\n  ApiEventsRetrieveData,\n  ApiEventsRetrieveResponse,\n  ApiEventsUpdateData,\n  ApiEventsUpdateResponse,\n  ApiEventsPartialUpdateData,\n  ApiEventsPartialUpdateResponse,\n  ApiEventsDestroyData,\n  ApiEventsDestroyResponse,\n  ApiEventsIncrementParticipantsCreateData,\n  ApiEventsIncrementParticipantsCreateResponse,\n  ApiEventsTodayRetrieveResponse,\n  ApiEventsUpcomingRetrieveResponse,\n  ApiExperienceListData,\n  ApiExperienceListResponse,\n  ApiExperienceCreateData,\n  ApiExperienceCreateResponse,\n  ApiExperienceRetrieveData,\n  ApiExperienceRetrieveResponse,\n  ApiExperienceUpdateData,\n  ApiExperienceUpdateResponse,\n  ApiExperiencePartialUpdateData,\n  ApiExperiencePartialUpdateResponse,\n  ApiExperienceDestroyData,\n  ApiExperienceDestroyResponse,\n  ApiGoogleloginCreateData,\n  ApiGoogleloginCreateResponse,\n  ApiJobSkillMatricesListData,\n  ApiJobSkillMatricesListResponse,\n  ApiJobSkillMatricesCreateData,\n  ApiJobSkillMatricesCreateResponse,\n  ApiJobSkillMatricesRetrieveData,\n  ApiJobSkillMatricesRetrieveResponse,\n  ApiJobSkillMatricesUpdateData,\n  ApiJobSkillMatricesUpdateResponse,\n  ApiJobSkillMatricesPartialUpdateData,\n  ApiJobSkillMatricesPartialUpdateResponse,\n  ApiJobSkillMatricesDestroyData,\n  ApiJobSkillMatricesDestroyResponse,\n  ApiJobSkillMatricesUpdateSkillCreateData,\n  ApiJobSkillMatricesUpdateSkillCreateResponse,\n  ApiJobprofileListData,\n  ApiJobprofileListResponse,\n  ApiJobprofileCreateData,\n  ApiJobprofileCreateResponse,\n  ApiJobprofileRetrieveData,\n  ApiJobprofileRetrieveResponse,\n  ApiJobprofileUpdateData,\n  ApiJobprofileUpdateResponse,\n  ApiJobprofilePartialUpdateData,\n  ApiJobprofilePartialUpdateResponse,\n  ApiJobprofileDestroyData,\n  ApiJobprofileDestroyResponse,\n  ApiLoginCreateData,\n  ApiLoginCreateResponse,\n  ApiLogoutCreateResponse,\n  ApiMatchResultsListData,\n  ApiMatchResultsListResponse,\n  ApiMatchResultsRetrieveData,\n  ApiMatchResultsRetrieveResponse,\n  ApiMatchingSessionsListData,\n  ApiMatchingSessionsListResponse,\n  ApiMatchingSessionsRetrieveData,\n  ApiMatchingSessionsRetrieveResponse,\n  ApiMatchingSkillsListData,\n  ApiMatchingSkillsListResponse,\n  ApiMatchingSkillsRetrieveData,\n  ApiMatchingSkillsRetrieveResponse,\n  ApiMatchingSkillsAutocompleteRetrieveResponse,\n  ApiMatchingAnalyticsRetrieveResponse,\n  ApiMatchingExtractSkillsCreateData,\n  ApiMatchingExtractSkillsCreateResponse,\n  ApiMatchingMatchRetrieveResponse,\n  ApiMatchingMatchCreateData,\n  ApiMatchingMatchCreateResponse,\n  ApiMatchingTaskStatusRetrieveResponse,\n  ApiNonprofitProfileListData,\n  ApiNonprofitProfileListResponse,\n  ApiNonprofitProfileCreateData,\n  ApiNonprofitProfileCreateResponse,\n  ApiNonprofitProfileRetrieveData,\n  ApiNonprofitProfileRetrieveResponse,\n  ApiNonprofitProfileUpdateData,\n  ApiNonprofitProfileUpdateResponse,\n  ApiNonprofitProfilePartialUpdateData,\n  ApiNonprofitProfilePartialUpdateResponse,\n  ApiNonprofitProfileDestroyData,\n  ApiNonprofitProfileDestroyResponse,\n  ApiProfileListData,\n  ApiProfileListResponse,\n  ApiProfileCreateData,\n  ApiProfileCreateResponse,\n  ApiProfileRetrieveData,\n  ApiProfileRetrieveResponse,\n  ApiProfileUpdateData,\n  ApiProfileUpdateResponse,\n  ApiProfilePartialUpdateData,\n  ApiProfilePartialUpdateResponse,\n  ApiProfileDestroyData,\n  ApiProfileDestroyResponse,\n  ApiProjectListData,\n  ApiProjectListResponse,\n  ApiProjectCreateData,\n  ApiProjectCreateResponse,\n  ApiProjectRetrieveData,\n  ApiProjectRetrieveResponse,\n  ApiProjectUpdateData,\n  ApiProjectUpdateResponse,\n  ApiProjectPartialUpdateData,\n  ApiProjectPartialUpdateResponse,\n  ApiProjectDestroyData,\n  ApiProjectDestroyResponse,\n  ApiPublicationListData,\n  ApiPublicationListResponse,\n  ApiPublicationCreateData,\n  ApiPublicationCreateResponse,\n  ApiPublicationRetrieveData,\n  ApiPublicationRetrieveResponse,\n  ApiPublicationUpdateData,\n  ApiPublicationUpdateResponse,\n  ApiPublicationPartialUpdateData,\n  ApiPublicationPartialUpdateResponse,\n  ApiPublicationDestroyData,\n  ApiPublicationDestroyResponse,\n  ApiResourcesListData,\n  ApiResourcesListResponse,\n  ApiResourcesCreateData,\n  ApiResourcesCreateResponse,\n  ApiResourcesRetrieveData,\n  ApiResourcesRetrieveResponse,\n  ApiResourcesUpdateData,\n  ApiResourcesUpdateResponse,\n  ApiResourcesPartialUpdateData,\n  ApiResourcesPartialUpdateResponse,\n  ApiResourcesDestroyData,\n  ApiResourcesDestroyResponse,\n  ApiResourcesIncrementDownloadsCreateData,\n  ApiResourcesIncrementDownloadsCreateResponse,\n  ApiResourcesIncrementViewsCreateData,\n  ApiResourcesIncrementViewsCreateResponse,\n  ApiResourcesFreeRetrieveResponse,\n  ApiResourcesPopularRetrieveResponse,\n  ApiRestRestCheckRetrieveResponse,\n  ApiSessionRetrieveResponse,\n  ApiSignupCreateData,\n  ApiSignupCreateResponse,\n  ApiSkillListData,\n  ApiSkillListResponse,\n  ApiSkillCreateData,\n  ApiSkillCreateResponse,\n  ApiSkillCategoriesListData,\n  ApiSkillCategoriesListResponse,\n  ApiSkillCategoriesRetrieveData,\n  ApiSkillCategoriesRetrieveResponse,\n  ApiSkillRetrieveData,\n  ApiSkillRetrieveResponse,\n  ApiSkillUpdateData,\n  ApiSkillUpdateResponse,\n  ApiSkillPartialUpdateData,\n  ApiSkillPartialUpdateResponse,\n  ApiSkillDestroyData,\n  ApiSkillDestroyResponse,\n  ApiSmallbizProfileListData,\n  ApiSmallbizProfileListResponse,\n  ApiSmallbizProfileCreateData,\n  ApiSmallbizProfileCreateResponse,\n  ApiSmallbizProfileRetrieveData,\n  ApiSmallbizProfileRetrieveResponse,\n  ApiSmallbizProfileUpdateData,\n  ApiSmallbizProfileUpdateResponse,\n  ApiSmallbizProfilePartialUpdateData,\n  ApiSmallbizProfilePartialUpdateResponse,\n  ApiSmallbizProfileDestroyData,\n  ApiSmallbizProfileDestroyResponse,\n  ApiTagsListData,\n  ApiTagsListResponse,\n  ApiTagsRetrieveData,\n  ApiTagsRetrieveResponse,\n  ApiTagsPopularRetrieveResponse,\n  ApiUserSkillMatricesListData,\n  ApiUserSkillMatricesListResponse,\n  ApiUserSkillMatricesCreateData,\n  ApiUserSkillMatricesCreateResponse,\n  ApiUserSkillMatricesRetrieveData,\n  ApiUserSkillMatricesRetrieveResponse,\n  ApiUserSkillMatricesUpdateData,\n  ApiUserSkillMatricesUpdateResponse,\n  ApiUserSkillMatricesPartialUpdateData,\n  ApiUserSkillMatricesPartialUpdateResponse,\n  ApiUserSkillMatricesDestroyData,\n  ApiUserSkillMatricesDestroyResponse,\n  ApiUserSkillMatricesUpdateSkillCreateData,\n  ApiUserSkillMatricesUpdateSkillCreateResponse,\n  ApiUsersListData,\n  ApiUsersListResponse,\n  ApiUsersCreateData,\n  ApiUsersCreateResponse,\n  ApiUsersRetrieveData,\n  ApiUsersRetrieveResponse,\n  ApiUsersUpdateData,\n  ApiUsersUpdateResponse,\n  ApiUsersPartialUpdateData,\n  ApiUsersPartialUpdateResponse,\n  ApiUsersDestroyData,\n  ApiUsersDestroyResponse,\n  ApiUsersDashboardJobSearchStatsRetrieveData,\n  ApiUsersDashboardJobSearchStatsRetrieveResponse,\n  ApiUsersDashboardProfileCompletionRetrieveResponse,\n  ApiUsersDashboardRecentActivityRetrieveResponse,\n  ApiVolunteerOpportunitiesListData,\n  ApiVolunteerOpportunitiesListResponse,\n  ApiVolunteerOpportunitiesCreateData,\n  ApiVolunteerOpportunitiesCreateResponse,\n  ApiVolunteerOpportunitiesRetrieveData,\n  ApiVolunteerOpportunitiesRetrieveResponse,\n  ApiVolunteerOpportunitiesUpdateData,\n  ApiVolunteerOpportunitiesUpdateResponse,\n  ApiVolunteerOpportunitiesPartialUpdateData,\n  ApiVolunteerOpportunitiesPartialUpdateResponse,\n  ApiVolunteerOpportunitiesDestroyData,\n  ApiVolunteerOpportunitiesDestroyResponse,\n  ApiVolunteerOpportunitiesMyOpportunitiesRetrieveResponse,\n  ApiWhoamiRetrieveResponse,\n  ApiCandidateProfileRetrieveData,\n  ApiCandidateProfileRetrieveResponse,\n  ApiSearchCandidatesRetrieveData,\n  ApiSearchCandidatesRetrieveResponse,\n  ApiSearchCandidatesCreateData,\n  ApiSearchCandidatesCreateResponse,\n  ApiSearchSuggestionsRetrieveData,\n  ApiSearchSuggestionsRetrieveResponse,\n  ApiSendEmailCreateData,\n  ApiSendEmailCreateResponse,\n  CommonRestCheckRetrieveResponse,\n  CommonResumeAutoPrefillRetrieveData,\n  CommonResumeAutoPrefillRetrieveResponse,\n  CommonResumeEnhancedCreateData,\n  CommonResumeEnhancedCreateResponse,\n  CommonResumeResultRetrieveData,\n  CommonResumeResultRetrieveResponse,\n  CommonResumeUploadRetrieveResponse,\n  CommonResumeUploadCreateData,\n  CommonResumeUploadCreateResponse,\n  CommonResumeUploadUpdateData,\n  CommonResumeUploadUpdateResponse,\n  CommonResumeUploadDestroyResponse,\n} from \"./types.gen\";\n\nexport class ApiService {\n  /**\n   * @param data The data for the request.\n   * @param data.limit Number of results to return per page.\n   * @param data.offset The initial index from which to return the results.\n   * @returns PaginatedApplicationList\n   * @throws ApiError\n   */\n  public static apiApplicationList(\n    data: ApiApplicationListData = {},\n  ): CancelablePromise<ApiApplicationListResponse> {\n    return __request(OpenAPI, {\n      method: \"GET\",\n      url: \"/api/application/\",\n      query: {\n        limit: data.limit,\n        offset: data.offset,\n      },\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.requestBody\n   * @returns Application\n   * @throws ApiError\n   */\n  public static apiApplicationCreate(\n    data: ApiApplicationCreateData,\n  ): CancelablePromise<ApiApplicationCreateResponse> {\n    return __request(OpenAPI, {\n      method: \"POST\",\n      url: \"/api/application/\",\n      body: data.requestBody,\n      mediaType: \"application/json\",\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.id\n   * @returns Application\n   * @throws ApiError\n   */\n  public static apiApplicationRetrieve(\n    data: ApiApplicationRetrieveData,\n  ): CancelablePromise<ApiApplicationRetrieveResponse> {\n    return __request(OpenAPI, {\n      method: \"GET\",\n      url: \"/api/application/{id}/\",\n      path: {\n        id: data.id,\n      },\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.id\n   * @param data.requestBody\n   * @returns Application\n   * @throws ApiError\n   */\n  public static apiApplicationUpdate(\n    data: ApiApplicationUpdateData,\n  ): CancelablePromise<ApiApplicationUpdateResponse> {\n    return __request(OpenAPI, {\n      method: \"PUT\",\n      url: \"/api/application/{id}/\",\n      path: {\n        id: data.id,\n      },\n      body: data.requestBody,\n      mediaType: \"application/json\",\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.id\n   * @param data.requestBody\n   * @returns Application\n   * @throws ApiError\n   */\n  public static apiApplicationPartialUpdate(\n    data: ApiApplicationPartialUpdateData,\n  ): CancelablePromise<ApiApplicationPartialUpdateResponse> {\n    return __request(OpenAPI, {\n      method: \"PATCH\",\n      url: \"/api/application/{id}/\",\n      path: {\n        id: data.id,\n      },\n      body: data.requestBody,\n      mediaType: \"application/json\",\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.id\n   * @returns void No response body\n   * @throws ApiError\n   */\n  public static apiApplicationDestroy(\n    data: ApiApplicationDestroyData,\n  ): CancelablePromise<ApiApplicationDestroyResponse> {\n    return __request(OpenAPI, {\n      method: \"DELETE\",\n      url: \"/api/application/{id}/\",\n      path: {\n        id: data.id,\n      },\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.limit Number of results to return per page.\n   * @param data.offset The initial index from which to return the results.\n   * @returns PaginatedAwardList\n   * @throws ApiError\n   */\n  public static apiAwardList(\n    data: ApiAwardListData = {},\n  ): CancelablePromise<ApiAwardListResponse> {\n    return __request(OpenAPI, {\n      method: \"GET\",\n      url: \"/api/award/\",\n      query: {\n        limit: data.limit,\n        offset: data.offset,\n      },\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.requestBody\n   * @returns Award\n   * @throws ApiError\n   */\n  public static apiAwardCreate(\n    data: ApiAwardCreateData,\n  ): CancelablePromise<ApiAwardCreateResponse> {\n    return __request(OpenAPI, {\n      method: \"POST\",\n      url: \"/api/award/\",\n      body: data.requestBody,\n      mediaType: \"application/json\",\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.id\n   * @returns Award\n   * @throws ApiError\n   */\n  public static apiAwardRetrieve(\n    data: ApiAwardRetrieveData,\n  ): CancelablePromise<ApiAwardRetrieveResponse> {\n    return __request(OpenAPI, {\n      method: \"GET\",\n      url: \"/api/award/{id}/\",\n      path: {\n        id: data.id,\n      },\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.id\n   * @param data.requestBody\n   * @returns Award\n   * @throws ApiError\n   */\n  public static apiAwardUpdate(\n    data: ApiAwardUpdateData,\n  ): CancelablePromise<ApiAwardUpdateResponse> {\n    return __request(OpenAPI, {\n      method: \"PUT\",\n      url: \"/api/award/{id}/\",\n      path: {\n        id: data.id,\n      },\n      body: data.requestBody,\n      mediaType: \"application/json\",\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.id\n   * @param data.requestBody\n   * @returns Award\n   * @throws ApiError\n   */\n  public static apiAwardPartialUpdate(\n    data: ApiAwardPartialUpdateData,\n  ): CancelablePromise<ApiAwardPartialUpdateResponse> {\n    return __request(OpenAPI, {\n      method: \"PATCH\",\n      url: \"/api/award/{id}/\",\n      path: {\n        id: data.id,\n      },\n      body: data.requestBody,\n      mediaType: \"application/json\",\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.id\n   * @returns void No response body\n   * @throws ApiError\n   */\n  public static apiAwardDestroy(\n    data: ApiAwardDestroyData,\n  ): CancelablePromise<ApiAwardDestroyResponse> {\n    return __request(OpenAPI, {\n      method: \"DELETE\",\n      url: \"/api/award/{id}/\",\n      path: {\n        id: data.id,\n      },\n    });\n  }\n\n  /**\n   * Get candidate preferences\n   * Returns current preferences with available choices\n   * @returns CandidatePreferences\n   * @throws ApiError\n   */\n  public static apiCandidatePreferencesRetrieve(): CancelablePromise<ApiCandidatePreferencesRetrieveResponse> {\n    return __request(OpenAPI, {\n      method: \"GET\",\n      url: \"/api/candidate-preferences/\",\n    });\n  }\n\n  /**\n   * Update candidate preferences\n   * Update candidate preferences\n   * @param data The data for the request.\n   * @param data.requestBody\n   * @returns CandidatePreferences\n   * @throws ApiError\n   */\n  public static apiCandidatePreferencesUpdate(\n    data: ApiCandidatePreferencesUpdateData = {},\n  ): CancelablePromise<ApiCandidatePreferencesUpdateResponse> {\n    return __request(OpenAPI, {\n      method: \"PUT\",\n      url: \"/api/candidate-preferences/\",\n      body: data.requestBody,\n      mediaType: \"application/json\",\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.limit Number of results to return per page.\n   * @param data.offset The initial index from which to return the results.\n   * @returns PaginatedCertificationList\n   * @throws ApiError\n   */\n  public static apiCertificationList(\n    data: ApiCertificationListData = {},\n  ): CancelablePromise<ApiCertificationListResponse> {\n    return __request(OpenAPI, {\n      method: \"GET\",\n      url: \"/api/certification/\",\n      query: {\n        limit: data.limit,\n        offset: data.offset,\n      },\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.requestBody\n   * @returns Certification\n   * @throws ApiError\n   */\n  public static apiCertificationCreate(\n    data: ApiCertificationCreateData,\n  ): CancelablePromise<ApiCertificationCreateResponse> {\n    return __request(OpenAPI, {\n      method: \"POST\",\n      url: \"/api/certification/\",\n      body: data.requestBody,\n      mediaType: \"application/json\",\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.id\n   * @returns Certification\n   * @throws ApiError\n   */\n  public static apiCertificationRetrieve(\n    data: ApiCertificationRetrieveData,\n  ): CancelablePromise<ApiCertificationRetrieveResponse> {\n    return __request(OpenAPI, {\n      method: \"GET\",\n      url: \"/api/certification/{id}/\",\n      path: {\n        id: data.id,\n      },\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.id\n   * @param data.requestBody\n   * @returns Certification\n   * @throws ApiError\n   */\n  public static apiCertificationUpdate(\n    data: ApiCertificationUpdateData,\n  ): CancelablePromise<ApiCertificationUpdateResponse> {\n    return __request(OpenAPI, {\n      method: \"PUT\",\n      url: \"/api/certification/{id}/\",\n      path: {\n        id: data.id,\n      },\n      body: data.requestBody,\n      mediaType: \"application/json\",\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.id\n   * @param data.requestBody\n   * @returns Certification\n   * @throws ApiError\n   */\n  public static apiCertificationPartialUpdate(\n    data: ApiCertificationPartialUpdateData,\n  ): CancelablePromise<ApiCertificationPartialUpdateResponse> {\n    return __request(OpenAPI, {\n      method: \"PATCH\",\n      url: \"/api/certification/{id}/\",\n      path: {\n        id: data.id,\n      },\n      body: data.requestBody,\n      mediaType: \"application/json\",\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.id\n   * @returns void No response body\n   * @throws ApiError\n   */\n  public static apiCertificationDestroy(\n    data: ApiCertificationDestroyData,\n  ): CancelablePromise<ApiCertificationDestroyResponse> {\n    return __request(OpenAPI, {\n      method: \"DELETE\",\n      url: \"/api/certification/{id}/\",\n      path: {\n        id: data.id,\n      },\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.limit Number of results to return per page.\n   * @param data.offset The initial index from which to return the results.\n   * @returns PaginatedCompanyList\n   * @throws ApiError\n   */\n  public static apiCompanyList(\n    data: ApiCompanyListData = {},\n  ): CancelablePromise<ApiCompanyListResponse> {\n    return __request(OpenAPI, {\n      method: \"GET\",\n      url: \"/api/company/\",\n      query: {\n        limit: data.limit,\n        offset: data.offset,\n      },\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.requestBody\n   * @returns Company\n   * @throws ApiError\n   */\n  public static apiCompanyCreate(\n    data: ApiCompanyCreateData,\n  ): CancelablePromise<ApiCompanyCreateResponse> {\n    return __request(OpenAPI, {\n      method: \"POST\",\n      url: \"/api/company/\",\n      body: data.requestBody,\n      mediaType: \"application/json\",\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.id A unique integer value identifying this company.\n   * @returns Company\n   * @throws ApiError\n   */\n  public static apiCompanyRetrieve(\n    data: ApiCompanyRetrieveData,\n  ): CancelablePromise<ApiCompanyRetrieveResponse> {\n    return __request(OpenAPI, {\n      method: \"GET\",\n      url: \"/api/company/{id}/\",\n      path: {\n        id: data.id,\n      },\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.id A unique integer value identifying this company.\n   * @param data.requestBody\n   * @returns Company\n   * @throws ApiError\n   */\n  public static apiCompanyUpdate(\n    data: ApiCompanyUpdateData,\n  ): CancelablePromise<ApiCompanyUpdateResponse> {\n    return __request(OpenAPI, {\n      method: \"PUT\",\n      url: \"/api/company/{id}/\",\n      path: {\n        id: data.id,\n      },\n      body: data.requestBody,\n      mediaType: \"application/json\",\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.id A unique integer value identifying this company.\n   * @param data.requestBody\n   * @returns Company\n   * @throws ApiError\n   */\n  public static apiCompanyPartialUpdate(\n    data: ApiCompanyPartialUpdateData,\n  ): CancelablePromise<ApiCompanyPartialUpdateResponse> {\n    return __request(OpenAPI, {\n      method: \"PATCH\",\n      url: \"/api/company/{id}/\",\n      path: {\n        id: data.id,\n      },\n      body: data.requestBody,\n      mediaType: \"application/json\",\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.id A unique integer value identifying this company.\n   * @returns void No response body\n   * @throws ApiError\n   */\n  public static apiCompanyDestroy(\n    data: ApiCompanyDestroyData,\n  ): CancelablePromise<ApiCompanyDestroyResponse> {\n    return __request(OpenAPI, {\n      method: \"DELETE\",\n      url: \"/api/company/{id}/\",\n      path: {\n        id: data.id,\n      },\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.limit Number of results to return per page.\n   * @param data.offset The initial index from which to return the results.\n   * @returns PaginatedEducationList\n   * @throws ApiError\n   */\n  public static apiEducationList(\n    data: ApiEducationListData = {},\n  ): CancelablePromise<ApiEducationListResponse> {\n    return __request(OpenAPI, {\n      method: \"GET\",\n      url: \"/api/education/\",\n      query: {\n        limit: data.limit,\n        offset: data.offset,\n      },\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.requestBody\n   * @returns Education\n   * @throws ApiError\n   */\n  public static apiEducationCreate(\n    data: ApiEducationCreateData,\n  ): CancelablePromise<ApiEducationCreateResponse> {\n    return __request(OpenAPI, {\n      method: \"POST\",\n      url: \"/api/education/\",\n      body: data.requestBody,\n      mediaType: \"application/json\",\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.id\n   * @returns Education\n   * @throws ApiError\n   */\n  public static apiEducationRetrieve(\n    data: ApiEducationRetrieveData,\n  ): CancelablePromise<ApiEducationRetrieveResponse> {\n    return __request(OpenAPI, {\n      method: \"GET\",\n      url: \"/api/education/{id}/\",\n      path: {\n        id: data.id,\n      },\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.id\n   * @param data.requestBody\n   * @returns Education\n   * @throws ApiError\n   */\n  public static apiEducationUpdate(\n    data: ApiEducationUpdateData,\n  ): CancelablePromise<ApiEducationUpdateResponse> {\n    return __request(OpenAPI, {\n      method: \"PUT\",\n      url: \"/api/education/{id}/\",\n      path: {\n        id: data.id,\n      },\n      body: data.requestBody,\n      mediaType: \"application/json\",\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.id\n   * @param data.requestBody\n   * @returns Education\n   * @throws ApiError\n   */\n  public static apiEducationPartialUpdate(\n    data: ApiEducationPartialUpdateData,\n  ): CancelablePromise<ApiEducationPartialUpdateResponse> {\n    return __request(OpenAPI, {\n      method: \"PATCH\",\n      url: \"/api/education/{id}/\",\n      path: {\n        id: data.id,\n      },\n      body: data.requestBody,\n      mediaType: \"application/json\",\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.id\n   * @returns void No response body\n   * @throws ApiError\n   */\n  public static apiEducationDestroy(\n    data: ApiEducationDestroyData,\n  ): CancelablePromise<ApiEducationDestroyResponse> {\n    return __request(OpenAPI, {\n      method: \"DELETE\",\n      url: \"/api/education/{id}/\",\n      path: {\n        id: data.id,\n      },\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.limit Number of results to return per page.\n   * @param data.offset The initial index from which to return the results.\n   * @returns PaginatedEventListList\n   * @throws ApiError\n   */\n  public static apiEventsList(\n    data: ApiEventsListData = {},\n  ): CancelablePromise<ApiEventsListResponse> {\n    return __request(OpenAPI, {\n      method: \"GET\",\n      url: \"/api/events/\",\n      query: {\n        limit: data.limit,\n        offset: data.offset,\n      },\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.requestBody\n   * @returns Event\n   * @throws ApiError\n   */\n  public static apiEventsCreate(\n    data: ApiEventsCreateData,\n  ): CancelablePromise<ApiEventsCreateResponse> {\n    return __request(OpenAPI, {\n      method: \"POST\",\n      url: \"/api/events/\",\n      body: data.requestBody,\n      mediaType: \"application/json\",\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.id A unique integer value identifying this event.\n   * @returns Event\n   * @throws ApiError\n   */\n  public static apiEventsRetrieve(\n    data: ApiEventsRetrieveData,\n  ): CancelablePromise<ApiEventsRetrieveResponse> {\n    return __request(OpenAPI, {\n      method: \"GET\",\n      url: \"/api/events/{id}/\",\n      path: {\n        id: data.id,\n      },\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.id A unique integer value identifying this event.\n   * @param data.requestBody\n   * @returns Event\n   * @throws ApiError\n   */\n  public static apiEventsUpdate(\n    data: ApiEventsUpdateData,\n  ): CancelablePromise<ApiEventsUpdateResponse> {\n    return __request(OpenAPI, {\n      method: \"PUT\",\n      url: \"/api/events/{id}/\",\n      path: {\n        id: data.id,\n      },\n      body: data.requestBody,\n      mediaType: \"application/json\",\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.id A unique integer value identifying this event.\n   * @param data.requestBody\n   * @returns Event\n   * @throws ApiError\n   */\n  public static apiEventsPartialUpdate(\n    data: ApiEventsPartialUpdateData,\n  ): CancelablePromise<ApiEventsPartialUpdateResponse> {\n    return __request(OpenAPI, {\n      method: \"PATCH\",\n      url: \"/api/events/{id}/\",\n      path: {\n        id: data.id,\n      },\n      body: data.requestBody,\n      mediaType: \"application/json\",\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.id A unique integer value identifying this event.\n   * @returns void No response body\n   * @throws ApiError\n   */\n  public static apiEventsDestroy(\n    data: ApiEventsDestroyData,\n  ): CancelablePromise<ApiEventsDestroyResponse> {\n    return __request(OpenAPI, {\n      method: \"DELETE\",\n      url: \"/api/events/{id}/\",\n      path: {\n        id: data.id,\n      },\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.id A unique integer value identifying this event.\n   * @param data.requestBody\n   * @returns Event\n   * @throws ApiError\n   */\n  public static apiEventsIncrementParticipantsCreate(\n    data: ApiEventsIncrementParticipantsCreateData,\n  ): CancelablePromise<ApiEventsIncrementParticipantsCreateResponse> {\n    return __request(OpenAPI, {\n      method: \"POST\",\n      url: \"/api/events/{id}/increment_participants/\",\n      path: {\n        id: data.id,\n      },\n      body: data.requestBody,\n      mediaType: \"application/json\",\n    });\n  }\n\n  /**\n   * Get events happening today\n   * @returns Event\n   * @throws ApiError\n   */\n  public static apiEventsTodayRetrieve(): CancelablePromise<ApiEventsTodayRetrieveResponse> {\n    return __request(OpenAPI, {\n      method: \"GET\",\n      url: \"/api/events/today/\",\n    });\n  }\n\n  /**\n   * Get upcoming events (next 30 days)\n   * @returns Event\n   * @throws ApiError\n   */\n  public static apiEventsUpcomingRetrieve(): CancelablePromise<ApiEventsUpcomingRetrieveResponse> {\n    return __request(OpenAPI, {\n      method: \"GET\",\n      url: \"/api/events/upcoming/\",\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.limit Number of results to return per page.\n   * @param data.offset The initial index from which to return the results.\n   * @returns PaginatedExperienceList\n   * @throws ApiError\n   */\n  public static apiExperienceList(\n    data: ApiExperienceListData = {},\n  ): CancelablePromise<ApiExperienceListResponse> {\n    return __request(OpenAPI, {\n      method: \"GET\",\n      url: \"/api/experience/\",\n      query: {\n        limit: data.limit,\n        offset: data.offset,\n      },\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.requestBody\n   * @returns Experience\n   * @throws ApiError\n   */\n  public static apiExperienceCreate(\n    data: ApiExperienceCreateData,\n  ): CancelablePromise<ApiExperienceCreateResponse> {\n    return __request(OpenAPI, {\n      method: \"POST\",\n      url: \"/api/experience/\",\n      body: data.requestBody,\n      mediaType: \"application/json\",\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.id\n   * @returns Experience\n   * @throws ApiError\n   */\n  public static apiExperienceRetrieve(\n    data: ApiExperienceRetrieveData,\n  ): CancelablePromise<ApiExperienceRetrieveResponse> {\n    return __request(OpenAPI, {\n      method: \"GET\",\n      url: \"/api/experience/{id}/\",\n      path: {\n        id: data.id,\n      },\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.id\n   * @param data.requestBody\n   * @returns Experience\n   * @throws ApiError\n   */\n  public static apiExperienceUpdate(\n    data: ApiExperienceUpdateData,\n  ): CancelablePromise<ApiExperienceUpdateResponse> {\n    return __request(OpenAPI, {\n      method: \"PUT\",\n      url: \"/api/experience/{id}/\",\n      path: {\n        id: data.id,\n      },\n      body: data.requestBody,\n      mediaType: \"application/json\",\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.id\n   * @param data.requestBody\n   * @returns Experience\n   * @throws ApiError\n   */\n  public static apiExperiencePartialUpdate(\n    data: ApiExperiencePartialUpdateData,\n  ): CancelablePromise<ApiExperiencePartialUpdateResponse> {\n    return __request(OpenAPI, {\n      method: \"PATCH\",\n      url: \"/api/experience/{id}/\",\n      path: {\n        id: data.id,\n      },\n      body: data.requestBody,\n      mediaType: \"application/json\",\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.id\n   * @returns void No response body\n   * @throws ApiError\n   */\n  public static apiExperienceDestroy(\n    data: ApiExperienceDestroyData,\n  ): CancelablePromise<ApiExperienceDestroyResponse> {\n    return __request(OpenAPI, {\n      method: \"DELETE\",\n      url: \"/api/experience/{id}/\",\n      path: {\n        id: data.id,\n      },\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.requestBody\n   * @returns GoogleAuth\n   * @throws ApiError\n   */\n  public static apiGoogleloginCreate(\n    data: ApiGoogleloginCreateData,\n  ): CancelablePromise<ApiGoogleloginCreateResponse> {\n    return __request(OpenAPI, {\n      method: \"POST\",\n      url: \"/api/googlelogin/\",\n      body: data.requestBody,\n      mediaType: \"application/json\",\n    });\n  }\n\n  /**\n   * API endpoint for job skill matrices\n   * @param data The data for the request.\n   * @param data.limit Number of results to return per page.\n   * @param data.offset The initial index from which to return the results.\n   * @returns PaginatedJobSkillMatrixList\n   * @throws ApiError\n   */\n  public static apiJobSkillMatricesList(\n    data: ApiJobSkillMatricesListData = {},\n  ): CancelablePromise<ApiJobSkillMatricesListResponse> {\n    return __request(OpenAPI, {\n      method: \"GET\",\n      url: \"/api/job-skill-matrices/\",\n      query: {\n        limit: data.limit,\n        offset: data.offset,\n      },\n    });\n  }\n\n  /**\n   * API endpoint for job skill matrices\n   * @param data The data for the request.\n   * @param data.requestBody\n   * @returns JobSkillMatrix\n   * @throws ApiError\n   */\n  public static apiJobSkillMatricesCreate(\n    data: ApiJobSkillMatricesCreateData,\n  ): CancelablePromise<ApiJobSkillMatricesCreateResponse> {\n    return __request(OpenAPI, {\n      method: \"POST\",\n      url: \"/api/job-skill-matrices/\",\n      body: data.requestBody,\n      mediaType: \"application/json\",\n    });\n  }\n\n  /**\n   * API endpoint for job skill matrices\n   * @param data The data for the request.\n   * @param data.id\n   * @returns JobSkillMatrix\n   * @throws ApiError\n   */\n  public static apiJobSkillMatricesRetrieve(\n    data: ApiJobSkillMatricesRetrieveData,\n  ): CancelablePromise<ApiJobSkillMatricesRetrieveResponse> {\n    return __request(OpenAPI, {\n      method: \"GET\",\n      url: \"/api/job-skill-matrices/{id}/\",\n      path: {\n        id: data.id,\n      },\n    });\n  }\n\n  /**\n   * API endpoint for job skill matrices\n   * @param data The data for the request.\n   * @param data.id\n   * @param data.requestBody\n   * @returns JobSkillMatrix\n   * @throws ApiError\n   */\n  public static apiJobSkillMatricesUpdate(\n    data: ApiJobSkillMatricesUpdateData,\n  ): CancelablePromise<ApiJobSkillMatricesUpdateResponse> {\n    return __request(OpenAPI, {\n      method: \"PUT\",\n      url: \"/api/job-skill-matrices/{id}/\",\n      path: {\n        id: data.id,\n      },\n      body: data.requestBody,\n      mediaType: \"application/json\",\n    });\n  }\n\n  /**\n   * API endpoint for job skill matrices\n   * @param data The data for the request.\n   * @param data.id\n   * @param data.requestBody\n   * @returns JobSkillMatrix\n   * @throws ApiError\n   */\n  public static apiJobSkillMatricesPartialUpdate(\n    data: ApiJobSkillMatricesPartialUpdateData,\n  ): CancelablePromise<ApiJobSkillMatricesPartialUpdateResponse> {\n    return __request(OpenAPI, {\n      method: \"PATCH\",\n      url: \"/api/job-skill-matrices/{id}/\",\n      path: {\n        id: data.id,\n      },\n      body: data.requestBody,\n      mediaType: \"application/json\",\n    });\n  }\n\n  /**\n   * API endpoint for job skill matrices\n   * @param data The data for the request.\n   * @param data.id\n   * @returns void No response body\n   * @throws ApiError\n   */\n  public static apiJobSkillMatricesDestroy(\n    data: ApiJobSkillMatricesDestroyData,\n  ): CancelablePromise<ApiJobSkillMatricesDestroyResponse> {\n    return __request(OpenAPI, {\n      method: \"DELETE\",\n      url: \"/api/job-skill-matrices/{id}/\",\n      path: {\n        id: data.id,\n      },\n    });\n  }\n\n  /**\n   * Update a specific skill in the job's matrix\n   * @param data The data for the request.\n   * @param data.id\n   * @param data.requestBody\n   * @returns JobSkillMatrix\n   * @throws ApiError\n   */\n  public static apiJobSkillMatricesUpdateSkillCreate(\n    data: ApiJobSkillMatricesUpdateSkillCreateData,\n  ): CancelablePromise<ApiJobSkillMatricesUpdateSkillCreateResponse> {\n    return __request(OpenAPI, {\n      method: \"POST\",\n      url: \"/api/job-skill-matrices/{id}/update_skill/\",\n      path: {\n        id: data.id,\n      },\n      body: data.requestBody,\n      mediaType: \"application/json\",\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.limit Number of results to return per page.\n   * @param data.offset The initial index from which to return the results.\n   * @returns PaginatedJobProfileList\n   * @throws ApiError\n   */\n  public static apiJobprofileList(\n    data: ApiJobprofileListData = {},\n  ): CancelablePromise<ApiJobprofileListResponse> {\n    return __request(OpenAPI, {\n      method: \"GET\",\n      url: \"/api/jobprofile/\",\n      query: {\n        limit: data.limit,\n        offset: data.offset,\n      },\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.requestBody\n   * @returns JobProfile\n   * @throws ApiError\n   */\n  public static apiJobprofileCreate(\n    data: ApiJobprofileCreateData,\n  ): CancelablePromise<ApiJobprofileCreateResponse> {\n    return __request(OpenAPI, {\n      method: \"POST\",\n      url: \"/api/jobprofile/\",\n      body: data.requestBody,\n      mediaType: \"application/json\",\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.id A unique integer value identifying this job profile.\n   * @returns JobProfile\n   * @throws ApiError\n   */\n  public static apiJobprofileRetrieve(\n    data: ApiJobprofileRetrieveData,\n  ): CancelablePromise<ApiJobprofileRetrieveResponse> {\n    return __request(OpenAPI, {\n      method: \"GET\",\n      url: \"/api/jobprofile/{id}/\",\n      path: {\n        id: data.id,\n      },\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.id A unique integer value identifying this job profile.\n   * @param data.requestBody\n   * @returns JobProfile\n   * @throws ApiError\n   */\n  public static apiJobprofileUpdate(\n    data: ApiJobprofileUpdateData,\n  ): CancelablePromise<ApiJobprofileUpdateResponse> {\n    return __request(OpenAPI, {\n      method: \"PUT\",\n      url: \"/api/jobprofile/{id}/\",\n      path: {\n        id: data.id,\n      },\n      body: data.requestBody,\n      mediaType: \"application/json\",\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.id A unique integer value identifying this job profile.\n   * @param data.requestBody\n   * @returns JobProfile\n   * @throws ApiError\n   */\n  public static apiJobprofilePartialUpdate(\n    data: ApiJobprofilePartialUpdateData,\n  ): CancelablePromise<ApiJobprofilePartialUpdateResponse> {\n    return __request(OpenAPI, {\n      method: \"PATCH\",\n      url: \"/api/jobprofile/{id}/\",\n      path: {\n        id: data.id,\n      },\n      body: data.requestBody,\n      mediaType: \"application/json\",\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.id A unique integer value identifying this job profile.\n   * @returns void No response body\n   * @throws ApiError\n   */\n  public static apiJobprofileDestroy(\n    data: ApiJobprofileDestroyData,\n  ): CancelablePromise<ApiJobprofileDestroyResponse> {\n    return __request(OpenAPI, {\n      method: \"DELETE\",\n      url: \"/api/jobprofile/{id}/\",\n      path: {\n        id: data.id,\n      },\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.requestBody\n   * @returns Login\n   * @throws ApiError\n   */\n  public static apiLoginCreate(\n    data: ApiLoginCreateData,\n  ): CancelablePromise<ApiLoginCreateResponse> {\n    return __request(OpenAPI, {\n      method: \"POST\",\n      url: \"/api/login/\",\n      body: data.requestBody,\n      mediaType: \"application/json\",\n    });\n  }\n\n  /**\n   * @returns unknown No response body\n   * @throws ApiError\n   */\n  public static apiLogoutCreate(): CancelablePromise<ApiLogoutCreateResponse> {\n    return __request(OpenAPI, {\n      method: \"POST\",\n      url: \"/api/logout/\",\n    });\n  }\n\n  /**\n   * API endpoint for match results\n   * @param data The data for the request.\n   * @param data.limit Number of results to return per page.\n   * @param data.offset The initial index from which to return the results.\n   * @returns PaginatedMatchResultList\n   * @throws ApiError\n   */\n  public static apiMatchResultsList(\n    data: ApiMatchResultsListData = {},\n  ): CancelablePromise<ApiMatchResultsListResponse> {\n    return __request(OpenAPI, {\n      method: \"GET\",\n      url: \"/api/match-results/\",\n      query: {\n        limit: data.limit,\n        offset: data.offset,\n      },\n    });\n  }\n\n  /**\n   * API endpoint for match results\n   * @param data The data for the request.\n   * @param data.id\n   * @returns MatchResult\n   * @throws ApiError\n   */\n  public static apiMatchResultsRetrieve(\n    data: ApiMatchResultsRetrieveData,\n  ): CancelablePromise<ApiMatchResultsRetrieveResponse> {\n    return __request(OpenAPI, {\n      method: \"GET\",\n      url: \"/api/match-results/{id}/\",\n      path: {\n        id: data.id,\n      },\n    });\n  }\n\n  /**\n   * API endpoint for matching sessions\n   * @param data The data for the request.\n   * @param data.limit Number of results to return per page.\n   * @param data.offset The initial index from which to return the results.\n   * @returns PaginatedMatchingSessionList\n   * @throws ApiError\n   */\n  public static apiMatchingSessionsList(\n    data: ApiMatchingSessionsListData = {},\n  ): CancelablePromise<ApiMatchingSessionsListResponse> {\n    return __request(OpenAPI, {\n      method: \"GET\",\n      url: \"/api/matching-sessions/\",\n      query: {\n        limit: data.limit,\n        offset: data.offset,\n      },\n    });\n  }\n\n  /**\n   * API endpoint for matching sessions\n   * @param data The data for the request.\n   * @param data.id\n   * @returns MatchingSession\n   * @throws ApiError\n   */\n  public static apiMatchingSessionsRetrieve(\n    data: ApiMatchingSessionsRetrieveData,\n  ): CancelablePromise<ApiMatchingSessionsRetrieveResponse> {\n    return __request(OpenAPI, {\n      method: \"GET\",\n      url: \"/api/matching-sessions/{id}/\",\n      path: {\n        id: data.id,\n      },\n    });\n  }\n\n  /**\n   * API endpoint for viewing skills\n   * @param data The data for the request.\n   * @param data.limit Number of results to return per page.\n   * @param data.offset The initial index from which to return the results.\n   * @returns PaginatedSkillList\n   * @throws ApiError\n   */\n  public static apiMatchingSkillsList(\n    data: ApiMatchingSkillsListData = {},\n  ): CancelablePromise<ApiMatchingSkillsListResponse> {\n    return __request(OpenAPI, {\n      method: \"GET\",\n      url: \"/api/matching-skills/\",\n      query: {\n        limit: data.limit,\n        offset: data.offset,\n      },\n    });\n  }\n\n  /**\n   * API endpoint for viewing skills\n   * @param data The data for the request.\n   * @param data.id A unique integer value identifying this skill.\n   * @returns Skill\n   * @throws ApiError\n   */\n  public static apiMatchingSkillsRetrieve(\n    data: ApiMatchingSkillsRetrieveData,\n  ): CancelablePromise<ApiMatchingSkillsRetrieveResponse> {\n    return __request(OpenAPI, {\n      method: \"GET\",\n      url: \"/api/matching-skills/{id}/\",\n      path: {\n        id: data.id,\n      },\n    });\n  }\n\n  /**\n   * Get skills for autocomplete - supports prefix search and category filtering\n   * @returns Skill\n   * @throws ApiError\n   */\n  public static apiMatchingSkillsAutocompleteRetrieve(): CancelablePromise<ApiMatchingSkillsAutocompleteRetrieveResponse> {\n    return __request(OpenAPI, {\n      method: \"GET\",\n      url: \"/api/matching-skills/autocomplete/\",\n    });\n  }\n\n  /**\n   * Get matching analytics for the user\n   * @returns MatchingSession\n   * @throws ApiError\n   */\n  public static apiMatchingAnalyticsRetrieve(): CancelablePromise<ApiMatchingAnalyticsRetrieveResponse> {\n    return __request(OpenAPI, {\n      method: \"GET\",\n      url: \"/api/matching/analytics/\",\n    });\n  }\n\n  /**\n   * Extract skills from job description\n   * @param data The data for the request.\n   * @param data.requestBody\n   * @returns Skill\n   * @throws ApiError\n   */\n  public static apiMatchingExtractSkillsCreate(\n    data: ApiMatchingExtractSkillsCreateData,\n  ): CancelablePromise<ApiMatchingExtractSkillsCreateResponse> {\n    return __request(OpenAPI, {\n      method: \"POST\",\n      url: \"/api/matching/extract-skills/\",\n      body: data.requestBody,\n      mediaType: \"application/json\",\n    });\n  }\n\n  /**\n   * Get user's recent matches\n   * @returns MatchResult\n   * @throws ApiError\n   */\n  public static apiMatchingMatchRetrieve(): CancelablePromise<ApiMatchingMatchRetrieveResponse> {\n    return __request(OpenAPI, {\n      method: \"GET\",\n      url: \"/api/matching/match/\",\n    });\n  }\n\n  /**\n   * Run matching for the authenticated user\n   * @param data The data for the request.\n   * @param data.requestBody\n   * @returns MatchResult\n   * @throws ApiError\n   */\n  public static apiMatchingMatchCreate(\n    data: ApiMatchingMatchCreateData,\n  ): CancelablePromise<ApiMatchingMatchCreateResponse> {\n    return __request(OpenAPI, {\n      method: \"POST\",\n      url: \"/api/matching/match/\",\n      body: data.requestBody,\n      mediaType: \"application/json\",\n    });\n  }\n\n  /**\n   * Get status of a Celery task\n   * @returns unknown No response body\n   * @throws ApiError\n   */\n  public static apiMatchingTaskStatusRetrieve(): CancelablePromise<ApiMatchingTaskStatusRetrieveResponse> {\n    return __request(OpenAPI, {\n      method: \"GET\",\n      url: \"/api/matching/task-status/\",\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.limit Number of results to return per page.\n   * @param data.offset The initial index from which to return the results.\n   * @returns PaginatedNonProfitProfileList\n   * @throws ApiError\n   */\n  public static apiNonprofitProfileList(\n    data: ApiNonprofitProfileListData = {},\n  ): CancelablePromise<ApiNonprofitProfileListResponse> {\n    return __request(OpenAPI, {\n      method: \"GET\",\n      url: \"/api/nonprofit-profile/\",\n      query: {\n        limit: data.limit,\n        offset: data.offset,\n      },\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.requestBody\n   * @returns NonProfitProfile\n   * @throws ApiError\n   */\n  public static apiNonprofitProfileCreate(\n    data: ApiNonprofitProfileCreateData,\n  ): CancelablePromise<ApiNonprofitProfileCreateResponse> {\n    return __request(OpenAPI, {\n      method: \"POST\",\n      url: \"/api/nonprofit-profile/\",\n      body: data.requestBody,\n      mediaType: \"application/json\",\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.id A unique integer value identifying this non profit profile.\n   * @returns NonProfitProfile\n   * @throws ApiError\n   */\n  public static apiNonprofitProfileRetrieve(\n    data: ApiNonprofitProfileRetrieveData,\n  ): CancelablePromise<ApiNonprofitProfileRetrieveResponse> {\n    return __request(OpenAPI, {\n      method: \"GET\",\n      url: \"/api/nonprofit-profile/{id}/\",\n      path: {\n        id: data.id,\n      },\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.id A unique integer value identifying this non profit profile.\n   * @param data.requestBody\n   * @returns NonProfitProfile\n   * @throws ApiError\n   */\n  public static apiNonprofitProfileUpdate(\n    data: ApiNonprofitProfileUpdateData,\n  ): CancelablePromise<ApiNonprofitProfileUpdateResponse> {\n    return __request(OpenAPI, {\n      method: \"PUT\",\n      url: \"/api/nonprofit-profile/{id}/\",\n      path: {\n        id: data.id,\n      },\n      body: data.requestBody,\n      mediaType: \"application/json\",\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.id A unique integer value identifying this non profit profile.\n   * @param data.requestBody\n   * @returns NonProfitProfile\n   * @throws ApiError\n   */\n  public static apiNonprofitProfilePartialUpdate(\n    data: ApiNonprofitProfilePartialUpdateData,\n  ): CancelablePromise<ApiNonprofitProfilePartialUpdateResponse> {\n    return __request(OpenAPI, {\n      method: \"PATCH\",\n      url: \"/api/nonprofit-profile/{id}/\",\n      path: {\n        id: data.id,\n      },\n      body: data.requestBody,\n      mediaType: \"application/json\",\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.id A unique integer value identifying this non profit profile.\n   * @returns void No response body\n   * @throws ApiError\n   */\n  public static apiNonprofitProfileDestroy(\n    data: ApiNonprofitProfileDestroyData,\n  ): CancelablePromise<ApiNonprofitProfileDestroyResponse> {\n    return __request(OpenAPI, {\n      method: \"DELETE\",\n      url: \"/api/nonprofit-profile/{id}/\",\n      path: {\n        id: data.id,\n      },\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.limit Number of results to return per page.\n   * @param data.offset The initial index from which to return the results.\n   * @returns PaginatedProfileList\n   * @throws ApiError\n   */\n  public static apiProfileList(\n    data: ApiProfileListData = {},\n  ): CancelablePromise<ApiProfileListResponse> {\n    return __request(OpenAPI, {\n      method: \"GET\",\n      url: \"/api/profile/\",\n      query: {\n        limit: data.limit,\n        offset: data.offset,\n      },\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.requestBody\n   * @returns Profile\n   * @throws ApiError\n   */\n  public static apiProfileCreate(\n    data: ApiProfileCreateData,\n  ): CancelablePromise<ApiProfileCreateResponse> {\n    return __request(OpenAPI, {\n      method: \"POST\",\n      url: \"/api/profile/\",\n      body: data.requestBody,\n      mediaType: \"application/json\",\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.id\n   * @returns Profile\n   * @throws ApiError\n   */\n  public static apiProfileRetrieve(\n    data: ApiProfileRetrieveData,\n  ): CancelablePromise<ApiProfileRetrieveResponse> {\n    return __request(OpenAPI, {\n      method: \"GET\",\n      url: \"/api/profile/{id}/\",\n      path: {\n        id: data.id,\n      },\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.id\n   * @param data.requestBody\n   * @returns Profile\n   * @throws ApiError\n   */\n  public static apiProfileUpdate(\n    data: ApiProfileUpdateData,\n  ): CancelablePromise<ApiProfileUpdateResponse> {\n    return __request(OpenAPI, {\n      method: \"PUT\",\n      url: \"/api/profile/{id}/\",\n      path: {\n        id: data.id,\n      },\n      body: data.requestBody,\n      mediaType: \"application/json\",\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.id\n   * @param data.requestBody\n   * @returns Profile\n   * @throws ApiError\n   */\n  public static apiProfilePartialUpdate(\n    data: ApiProfilePartialUpdateData,\n  ): CancelablePromise<ApiProfilePartialUpdateResponse> {\n    return __request(OpenAPI, {\n      method: \"PATCH\",\n      url: \"/api/profile/{id}/\",\n      path: {\n        id: data.id,\n      },\n      body: data.requestBody,\n      mediaType: \"application/json\",\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.id\n   * @returns void No response body\n   * @throws ApiError\n   */\n  public static apiProfileDestroy(\n    data: ApiProfileDestroyData,\n  ): CancelablePromise<ApiProfileDestroyResponse> {\n    return __request(OpenAPI, {\n      method: \"DELETE\",\n      url: \"/api/profile/{id}/\",\n      path: {\n        id: data.id,\n      },\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.limit Number of results to return per page.\n   * @param data.offset The initial index from which to return the results.\n   * @returns PaginatedProjectList\n   * @throws ApiError\n   */\n  public static apiProjectList(\n    data: ApiProjectListData = {},\n  ): CancelablePromise<ApiProjectListResponse> {\n    return __request(OpenAPI, {\n      method: \"GET\",\n      url: \"/api/project/\",\n      query: {\n        limit: data.limit,\n        offset: data.offset,\n      },\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.requestBody\n   * @returns Project\n   * @throws ApiError\n   */\n  public static apiProjectCreate(\n    data: ApiProjectCreateData,\n  ): CancelablePromise<ApiProjectCreateResponse> {\n    return __request(OpenAPI, {\n      method: \"POST\",\n      url: \"/api/project/\",\n      body: data.requestBody,\n      mediaType: \"application/json\",\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.id\n   * @returns Project\n   * @throws ApiError\n   */\n  public static apiProjectRetrieve(\n    data: ApiProjectRetrieveData,\n  ): CancelablePromise<ApiProjectRetrieveResponse> {\n    return __request(OpenAPI, {\n      method: \"GET\",\n      url: \"/api/project/{id}/\",\n      path: {\n        id: data.id,\n      },\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.id\n   * @param data.requestBody\n   * @returns Project\n   * @throws ApiError\n   */\n  public static apiProjectUpdate(\n    data: ApiProjectUpdateData,\n  ): CancelablePromise<ApiProjectUpdateResponse> {\n    return __request(OpenAPI, {\n      method: \"PUT\",\n      url: \"/api/project/{id}/\",\n      path: {\n        id: data.id,\n      },\n      body: data.requestBody,\n      mediaType: \"application/json\",\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.id\n   * @param data.requestBody\n   * @returns Project\n   * @throws ApiError\n   */\n  public static apiProjectPartialUpdate(\n    data: ApiProjectPartialUpdateData,\n  ): CancelablePromise<ApiProjectPartialUpdateResponse> {\n    return __request(OpenAPI, {\n      method: \"PATCH\",\n      url: \"/api/project/{id}/\",\n      path: {\n        id: data.id,\n      },\n      body: data.requestBody,\n      mediaType: \"application/json\",\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.id\n   * @returns void No response body\n   * @throws ApiError\n   */\n  public static apiProjectDestroy(\n    data: ApiProjectDestroyData,\n  ): CancelablePromise<ApiProjectDestroyResponse> {\n    return __request(OpenAPI, {\n      method: \"DELETE\",\n      url: \"/api/project/{id}/\",\n      path: {\n        id: data.id,\n      },\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.limit Number of results to return per page.\n   * @param data.offset The initial index from which to return the results.\n   * @returns PaginatedPublicationList\n   * @throws ApiError\n   */\n  public static apiPublicationList(\n    data: ApiPublicationListData = {},\n  ): CancelablePromise<ApiPublicationListResponse> {\n    return __request(OpenAPI, {\n      method: \"GET\",\n      url: \"/api/publication/\",\n      query: {\n        limit: data.limit,\n        offset: data.offset,\n      },\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.requestBody\n   * @returns Publication\n   * @throws ApiError\n   */\n  public static apiPublicationCreate(\n    data: ApiPublicationCreateData,\n  ): CancelablePromise<ApiPublicationCreateResponse> {\n    return __request(OpenAPI, {\n      method: \"POST\",\n      url: \"/api/publication/\",\n      body: data.requestBody,\n      mediaType: \"application/json\",\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.id\n   * @returns Publication\n   * @throws ApiError\n   */\n  public static apiPublicationRetrieve(\n    data: ApiPublicationRetrieveData,\n  ): CancelablePromise<ApiPublicationRetrieveResponse> {\n    return __request(OpenAPI, {\n      method: \"GET\",\n      url: \"/api/publication/{id}/\",\n      path: {\n        id: data.id,\n      },\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.id\n   * @param data.requestBody\n   * @returns Publication\n   * @throws ApiError\n   */\n  public static apiPublicationUpdate(\n    data: ApiPublicationUpdateData,\n  ): CancelablePromise<ApiPublicationUpdateResponse> {\n    return __request(OpenAPI, {\n      method: \"PUT\",\n      url: \"/api/publication/{id}/\",\n      path: {\n        id: data.id,\n      },\n      body: data.requestBody,\n      mediaType: \"application/json\",\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.id\n   * @param data.requestBody\n   * @returns Publication\n   * @throws ApiError\n   */\n  public static apiPublicationPartialUpdate(\n    data: ApiPublicationPartialUpdateData,\n  ): CancelablePromise<ApiPublicationPartialUpdateResponse> {\n    return __request(OpenAPI, {\n      method: \"PATCH\",\n      url: \"/api/publication/{id}/\",\n      path: {\n        id: data.id,\n      },\n      body: data.requestBody,\n      mediaType: \"application/json\",\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.id\n   * @returns void No response body\n   * @throws ApiError\n   */\n  public static apiPublicationDestroy(\n    data: ApiPublicationDestroyData,\n  ): CancelablePromise<ApiPublicationDestroyResponse> {\n    return __request(OpenAPI, {\n      method: \"DELETE\",\n      url: \"/api/publication/{id}/\",\n      path: {\n        id: data.id,\n      },\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.limit Number of results to return per page.\n   * @param data.offset The initial index from which to return the results.\n   * @returns PaginatedResourceListList\n   * @throws ApiError\n   */\n  public static apiResourcesList(\n    data: ApiResourcesListData = {},\n  ): CancelablePromise<ApiResourcesListResponse> {\n    return __request(OpenAPI, {\n      method: \"GET\",\n      url: \"/api/resources/\",\n      query: {\n        limit: data.limit,\n        offset: data.offset,\n      },\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.requestBody\n   * @returns Resource\n   * @throws ApiError\n   */\n  public static apiResourcesCreate(\n    data: ApiResourcesCreateData,\n  ): CancelablePromise<ApiResourcesCreateResponse> {\n    return __request(OpenAPI, {\n      method: \"POST\",\n      url: \"/api/resources/\",\n      body: data.requestBody,\n      mediaType: \"application/json\",\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.id A unique integer value identifying this resource.\n   * @returns Resource\n   * @throws ApiError\n   */\n  public static apiResourcesRetrieve(\n    data: ApiResourcesRetrieveData,\n  ): CancelablePromise<ApiResourcesRetrieveResponse> {\n    return __request(OpenAPI, {\n      method: \"GET\",\n      url: \"/api/resources/{id}/\",\n      path: {\n        id: data.id,\n      },\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.id A unique integer value identifying this resource.\n   * @param data.requestBody\n   * @returns Resource\n   * @throws ApiError\n   */\n  public static apiResourcesUpdate(\n    data: ApiResourcesUpdateData,\n  ): CancelablePromise<ApiResourcesUpdateResponse> {\n    return __request(OpenAPI, {\n      method: \"PUT\",\n      url: \"/api/resources/{id}/\",\n      path: {\n        id: data.id,\n      },\n      body: data.requestBody,\n      mediaType: \"application/json\",\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.id A unique integer value identifying this resource.\n   * @param data.requestBody\n   * @returns Resource\n   * @throws ApiError\n   */\n  public static apiResourcesPartialUpdate(\n    data: ApiResourcesPartialUpdateData,\n  ): CancelablePromise<ApiResourcesPartialUpdateResponse> {\n    return __request(OpenAPI, {\n      method: \"PATCH\",\n      url: \"/api/resources/{id}/\",\n      path: {\n        id: data.id,\n      },\n      body: data.requestBody,\n      mediaType: \"application/json\",\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.id A unique integer value identifying this resource.\n   * @returns void No response body\n   * @throws ApiError\n   */\n  public static apiResourcesDestroy(\n    data: ApiResourcesDestroyData,\n  ): CancelablePromise<ApiResourcesDestroyResponse> {\n    return __request(OpenAPI, {\n      method: \"DELETE\",\n      url: \"/api/resources/{id}/\",\n      path: {\n        id: data.id,\n      },\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.id A unique integer value identifying this resource.\n   * @param data.requestBody\n   * @returns Resource\n   * @throws ApiError\n   */\n  public static apiResourcesIncrementDownloadsCreate(\n    data: ApiResourcesIncrementDownloadsCreateData,\n  ): CancelablePromise<ApiResourcesIncrementDownloadsCreateResponse> {\n    return __request(OpenAPI, {\n      method: \"POST\",\n      url: \"/api/resources/{id}/increment_downloads/\",\n      path: {\n        id: data.id,\n      },\n      body: data.requestBody,\n      mediaType: \"application/json\",\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.id A unique integer value identifying this resource.\n   * @param data.requestBody\n   * @returns Resource\n   * @throws ApiError\n   */\n  public static apiResourcesIncrementViewsCreate(\n    data: ApiResourcesIncrementViewsCreateData,\n  ): CancelablePromise<ApiResourcesIncrementViewsCreateResponse> {\n    return __request(OpenAPI, {\n      method: \"POST\",\n      url: \"/api/resources/{id}/increment_views/\",\n      path: {\n        id: data.id,\n      },\n      body: data.requestBody,\n      mediaType: \"application/json\",\n    });\n  }\n\n  /**\n   * Get free resources only\n   * @returns Resource\n   * @throws ApiError\n   */\n  public static apiResourcesFreeRetrieve(): CancelablePromise<ApiResourcesFreeRetrieveResponse> {\n    return __request(OpenAPI, {\n      method: \"GET\",\n      url: \"/api/resources/free/\",\n    });\n  }\n\n  /**\n   * Get most popular resources by views\n   * @returns Resource\n   * @throws ApiError\n   */\n  public static apiResourcesPopularRetrieve(): CancelablePromise<ApiResourcesPopularRetrieveResponse> {\n    return __request(OpenAPI, {\n      method: \"GET\",\n      url: \"/api/resources/popular/\",\n    });\n  }\n\n  /**\n   * Check REST API\n   * This endpoint checks if the REST API is working.\n   * @returns Message\n   * @throws ApiError\n   */\n  public static apiRestRestCheckRetrieve(): CancelablePromise<ApiRestRestCheckRetrieveResponse> {\n    return __request(OpenAPI, {\n      method: \"GET\",\n      url: \"/api/rest/rest-check/\",\n    });\n  }\n\n  /**\n   * @returns Session\n   * @throws ApiError\n   */\n  public static apiSessionRetrieve(): CancelablePromise<ApiSessionRetrieveResponse> {\n    return __request(OpenAPI, {\n      method: \"GET\",\n      url: \"/api/session/\",\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.requestBody\n   * @returns Signup\n   * @throws ApiError\n   */\n  public static apiSignupCreate(\n    data: ApiSignupCreateData,\n  ): CancelablePromise<ApiSignupCreateResponse> {\n    return __request(OpenAPI, {\n      method: \"POST\",\n      url: \"/api/signup/\",\n      body: data.requestBody,\n      mediaType: \"application/json\",\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.limit Number of results to return per page.\n   * @param data.offset The initial index from which to return the results.\n   * @returns PaginatedApplicationSkillList\n   * @throws ApiError\n   */\n  public static apiSkillList(\n    data: ApiSkillListData = {},\n  ): CancelablePromise<ApiSkillListResponse> {\n    return __request(OpenAPI, {\n      method: \"GET\",\n      url: \"/api/skill/\",\n      query: {\n        limit: data.limit,\n        offset: data.offset,\n      },\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.requestBody\n   * @returns ApplicationSkill\n   * @throws ApiError\n   */\n  public static apiSkillCreate(\n    data: ApiSkillCreateData,\n  ): CancelablePromise<ApiSkillCreateResponse> {\n    return __request(OpenAPI, {\n      method: \"POST\",\n      url: \"/api/skill/\",\n      body: data.requestBody,\n      mediaType: \"application/json\",\n    });\n  }\n\n  /**\n   * API endpoint for viewing skill categories\n   * @param data The data for the request.\n   * @param data.limit Number of results to return per page.\n   * @param data.offset The initial index from which to return the results.\n   * @returns PaginatedSkillCategoryList\n   * @throws ApiError\n   */\n  public static apiSkillCategoriesList(\n    data: ApiSkillCategoriesListData = {},\n  ): CancelablePromise<ApiSkillCategoriesListResponse> {\n    return __request(OpenAPI, {\n      method: \"GET\",\n      url: \"/api/skill-categories/\",\n      query: {\n        limit: data.limit,\n        offset: data.offset,\n      },\n    });\n  }\n\n  /**\n   * API endpoint for viewing skill categories\n   * @param data The data for the request.\n   * @param data.id A unique integer value identifying this skill category.\n   * @returns SkillCategory\n   * @throws ApiError\n   */\n  public static apiSkillCategoriesRetrieve(\n    data: ApiSkillCategoriesRetrieveData,\n  ): CancelablePromise<ApiSkillCategoriesRetrieveResponse> {\n    return __request(OpenAPI, {\n      method: \"GET\",\n      url: \"/api/skill-categories/{id}/\",\n      path: {\n        id: data.id,\n      },\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.id\n   * @returns ApplicationSkill\n   * @throws ApiError\n   */\n  public static apiSkillRetrieve(\n    data: ApiSkillRetrieveData,\n  ): CancelablePromise<ApiSkillRetrieveResponse> {\n    return __request(OpenAPI, {\n      method: \"GET\",\n      url: \"/api/skill/{id}/\",\n      path: {\n        id: data.id,\n      },\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.id\n   * @param data.requestBody\n   * @returns ApplicationSkill\n   * @throws ApiError\n   */\n  public static apiSkillUpdate(\n    data: ApiSkillUpdateData,\n  ): CancelablePromise<ApiSkillUpdateResponse> {\n    return __request(OpenAPI, {\n      method: \"PUT\",\n      url: \"/api/skill/{id}/\",\n      path: {\n        id: data.id,\n      },\n      body: data.requestBody,\n      mediaType: \"application/json\",\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.id\n   * @param data.requestBody\n   * @returns ApplicationSkill\n   * @throws ApiError\n   */\n  public static apiSkillPartialUpdate(\n    data: ApiSkillPartialUpdateData,\n  ): CancelablePromise<ApiSkillPartialUpdateResponse> {\n    return __request(OpenAPI, {\n      method: \"PATCH\",\n      url: \"/api/skill/{id}/\",\n      path: {\n        id: data.id,\n      },\n      body: data.requestBody,\n      mediaType: \"application/json\",\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.id\n   * @returns void No response body\n   * @throws ApiError\n   */\n  public static apiSkillDestroy(\n    data: ApiSkillDestroyData,\n  ): CancelablePromise<ApiSkillDestroyResponse> {\n    return __request(OpenAPI, {\n      method: \"DELETE\",\n      url: \"/api/skill/{id}/\",\n      path: {\n        id: data.id,\n      },\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.limit Number of results to return per page.\n   * @param data.offset The initial index from which to return the results.\n   * @returns PaginatedSmallBusinessProfileList\n   * @throws ApiError\n   */\n  public static apiSmallbizProfileList(\n    data: ApiSmallbizProfileListData = {},\n  ): CancelablePromise<ApiSmallbizProfileListResponse> {\n    return __request(OpenAPI, {\n      method: \"GET\",\n      url: \"/api/smallbiz-profile/\",\n      query: {\n        limit: data.limit,\n        offset: data.offset,\n      },\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.requestBody\n   * @returns SmallBusinessProfile\n   * @throws ApiError\n   */\n  public static apiSmallbizProfileCreate(\n    data: ApiSmallbizProfileCreateData,\n  ): CancelablePromise<ApiSmallbizProfileCreateResponse> {\n    return __request(OpenAPI, {\n      method: \"POST\",\n      url: \"/api/smallbiz-profile/\",\n      body: data.requestBody,\n      mediaType: \"application/json\",\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.id A unique integer value identifying this small business profile.\n   * @returns SmallBusinessProfile\n   * @throws ApiError\n   */\n  public static apiSmallbizProfileRetrieve(\n    data: ApiSmallbizProfileRetrieveData,\n  ): CancelablePromise<ApiSmallbizProfileRetrieveResponse> {\n    return __request(OpenAPI, {\n      method: \"GET\",\n      url: \"/api/smallbiz-profile/{id}/\",\n      path: {\n        id: data.id,\n      },\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.id A unique integer value identifying this small business profile.\n   * @param data.requestBody\n   * @returns SmallBusinessProfile\n   * @throws ApiError\n   */\n  public static apiSmallbizProfileUpdate(\n    data: ApiSmallbizProfileUpdateData,\n  ): CancelablePromise<ApiSmallbizProfileUpdateResponse> {\n    return __request(OpenAPI, {\n      method: \"PUT\",\n      url: \"/api/smallbiz-profile/{id}/\",\n      path: {\n        id: data.id,\n      },\n      body: data.requestBody,\n      mediaType: \"application/json\",\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.id A unique integer value identifying this small business profile.\n   * @param data.requestBody\n   * @returns SmallBusinessProfile\n   * @throws ApiError\n   */\n  public static apiSmallbizProfilePartialUpdate(\n    data: ApiSmallbizProfilePartialUpdateData,\n  ): CancelablePromise<ApiSmallbizProfilePartialUpdateResponse> {\n    return __request(OpenAPI, {\n      method: \"PATCH\",\n      url: \"/api/smallbiz-profile/{id}/\",\n      path: {\n        id: data.id,\n      },\n      body: data.requestBody,\n      mediaType: \"application/json\",\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.id A unique integer value identifying this small business profile.\n   * @returns void No response body\n   * @throws ApiError\n   */\n  public static apiSmallbizProfileDestroy(\n    data: ApiSmallbizProfileDestroyData,\n  ): CancelablePromise<ApiSmallbizProfileDestroyResponse> {\n    return __request(OpenAPI, {\n      method: \"DELETE\",\n      url: \"/api/smallbiz-profile/{id}/\",\n      path: {\n        id: data.id,\n      },\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.limit Number of results to return per page.\n   * @param data.offset The initial index from which to return the results.\n   * @returns PaginatedTagList\n   * @throws ApiError\n   */\n  public static apiTagsList(\n    data: ApiTagsListData = {},\n  ): CancelablePromise<ApiTagsListResponse> {\n    return __request(OpenAPI, {\n      method: \"GET\",\n      url: \"/api/tags/\",\n      query: {\n        limit: data.limit,\n        offset: data.offset,\n      },\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.id A unique integer value identifying this tag.\n   * @returns Tag\n   * @throws ApiError\n   */\n  public static apiTagsRetrieve(\n    data: ApiTagsRetrieveData,\n  ): CancelablePromise<ApiTagsRetrieveResponse> {\n    return __request(OpenAPI, {\n      method: \"GET\",\n      url: \"/api/tags/{id}/\",\n      path: {\n        id: data.id,\n      },\n    });\n  }\n\n  /**\n   * Get most used tags\n   * @returns Tag\n   * @throws ApiError\n   */\n  public static apiTagsPopularRetrieve(): CancelablePromise<ApiTagsPopularRetrieveResponse> {\n    return __request(OpenAPI, {\n      method: \"GET\",\n      url: \"/api/tags/popular/\",\n    });\n  }\n\n  /**\n   * API endpoint for user skill matrices\n   * @param data The data for the request.\n   * @param data.limit Number of results to return per page.\n   * @param data.offset The initial index from which to return the results.\n   * @returns PaginatedUserSkillMatrixList\n   * @throws ApiError\n   */\n  public static apiUserSkillMatricesList(\n    data: ApiUserSkillMatricesListData = {},\n  ): CancelablePromise<ApiUserSkillMatricesListResponse> {\n    return __request(OpenAPI, {\n      method: \"GET\",\n      url: \"/api/user-skill-matrices/\",\n      query: {\n        limit: data.limit,\n        offset: data.offset,\n      },\n    });\n  }\n\n  /**\n   * API endpoint for user skill matrices\n   * @param data The data for the request.\n   * @param data.requestBody\n   * @returns UserSkillMatrix\n   * @throws ApiError\n   */\n  public static apiUserSkillMatricesCreate(\n    data: ApiUserSkillMatricesCreateData = {},\n  ): CancelablePromise<ApiUserSkillMatricesCreateResponse> {\n    return __request(OpenAPI, {\n      method: \"POST\",\n      url: \"/api/user-skill-matrices/\",\n      body: data.requestBody,\n      mediaType: \"application/json\",\n    });\n  }\n\n  /**\n   * API endpoint for user skill matrices\n   * @param data The data for the request.\n   * @param data.id\n   * @returns UserSkillMatrix\n   * @throws ApiError\n   */\n  public static apiUserSkillMatricesRetrieve(\n    data: ApiUserSkillMatricesRetrieveData,\n  ): CancelablePromise<ApiUserSkillMatricesRetrieveResponse> {\n    return __request(OpenAPI, {\n      method: \"GET\",\n      url: \"/api/user-skill-matrices/{id}/\",\n      path: {\n        id: data.id,\n      },\n    });\n  }\n\n  /**\n   * API endpoint for user skill matrices\n   * @param data The data for the request.\n   * @param data.id\n   * @param data.requestBody\n   * @returns UserSkillMatrix\n   * @throws ApiError\n   */\n  public static apiUserSkillMatricesUpdate(\n    data: ApiUserSkillMatricesUpdateData,\n  ): CancelablePromise<ApiUserSkillMatricesUpdateResponse> {\n    return __request(OpenAPI, {\n      method: \"PUT\",\n      url: \"/api/user-skill-matrices/{id}/\",\n      path: {\n        id: data.id,\n      },\n      body: data.requestBody,\n      mediaType: \"application/json\",\n    });\n  }\n\n  /**\n   * API endpoint for user skill matrices\n   * @param data The data for the request.\n   * @param data.id\n   * @param data.requestBody\n   * @returns UserSkillMatrix\n   * @throws ApiError\n   */\n  public static apiUserSkillMatricesPartialUpdate(\n    data: ApiUserSkillMatricesPartialUpdateData,\n  ): CancelablePromise<ApiUserSkillMatricesPartialUpdateResponse> {\n    return __request(OpenAPI, {\n      method: \"PATCH\",\n      url: \"/api/user-skill-matrices/{id}/\",\n      path: {\n        id: data.id,\n      },\n      body: data.requestBody,\n      mediaType: \"application/json\",\n    });\n  }\n\n  /**\n   * API endpoint for user skill matrices\n   * @param data The data for the request.\n   * @param data.id\n   * @returns void No response body\n   * @throws ApiError\n   */\n  public static apiUserSkillMatricesDestroy(\n    data: ApiUserSkillMatricesDestroyData,\n  ): CancelablePromise<ApiUserSkillMatricesDestroyResponse> {\n    return __request(OpenAPI, {\n      method: \"DELETE\",\n      url: \"/api/user-skill-matrices/{id}/\",\n      path: {\n        id: data.id,\n      },\n    });\n  }\n\n  /**\n   * Update a specific skill in the user's matrix\n   * @param data The data for the request.\n   * @param data.id\n   * @param data.requestBody\n   * @returns UserSkillMatrix\n   * @throws ApiError\n   */\n  public static apiUserSkillMatricesUpdateSkillCreate(\n    data: ApiUserSkillMatricesUpdateSkillCreateData,\n  ): CancelablePromise<ApiUserSkillMatricesUpdateSkillCreateResponse> {\n    return __request(OpenAPI, {\n      method: \"POST\",\n      url: \"/api/user-skill-matrices/{id}/update_skill/\",\n      path: {\n        id: data.id,\n      },\n      body: data.requestBody,\n      mediaType: \"application/json\",\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.isActive\n   * @param data.isLookingForJob\n   * @param data.limit Number of results to return per page.\n   * @param data.offset The initial index from which to return the results.\n   * @param data.role * `admin` - Admin\n   * * `staff` - Staff\n   * * `candidate` - Candidate\n   * * `recruiter` - Recruiter\n   * * `smallbiz_owner` - Small Business Owner\n   * * `nonprofit` - Nonprofit Organization\n   * @param data.search A search term.\n   * @returns PaginatedUserList\n   * @throws ApiError\n   */\n  public static apiUsersList(\n    data: ApiUsersListData = {},\n  ): CancelablePromise<ApiUsersListResponse> {\n    return __request(OpenAPI, {\n      method: \"GET\",\n      url: \"/api/users/\",\n      query: {\n        is_active: data.isActive,\n        is_looking_for_job: data.isLookingForJob,\n        limit: data.limit,\n        offset: data.offset,\n        role: data.role,\n        search: data.search,\n      },\n    });\n  }\n\n  /**\n   * Override to add permission checking for user creation\n   * @param data The data for the request.\n   * @param data.requestBody\n   * @returns User\n   * @throws ApiError\n   */\n  public static apiUsersCreate(\n    data: ApiUsersCreateData,\n  ): CancelablePromise<ApiUsersCreateResponse> {\n    return __request(OpenAPI, {\n      method: \"POST\",\n      url: \"/api/users/\",\n      body: data.requestBody,\n      mediaType: \"application/json\",\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.id A unique integer value identifying this user.\n   * @returns User\n   * @throws ApiError\n   */\n  public static apiUsersRetrieve(\n    data: ApiUsersRetrieveData,\n  ): CancelablePromise<ApiUsersRetrieveResponse> {\n    return __request(OpenAPI, {\n      method: \"GET\",\n      url: \"/api/users/{id}/\",\n      path: {\n        id: data.id,\n      },\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.id A unique integer value identifying this user.\n   * @param data.requestBody\n   * @returns User\n   * @throws ApiError\n   */\n  public static apiUsersUpdate(\n    data: ApiUsersUpdateData,\n  ): CancelablePromise<ApiUsersUpdateResponse> {\n    return __request(OpenAPI, {\n      method: \"PUT\",\n      url: \"/api/users/{id}/\",\n      path: {\n        id: data.id,\n      },\n      body: data.requestBody,\n      mediaType: \"application/json\",\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.id A unique integer value identifying this user.\n   * @param data.requestBody\n   * @returns User\n   * @throws ApiError\n   */\n  public static apiUsersPartialUpdate(\n    data: ApiUsersPartialUpdateData,\n  ): CancelablePromise<ApiUsersPartialUpdateResponse> {\n    return __request(OpenAPI, {\n      method: \"PATCH\",\n      url: \"/api/users/{id}/\",\n      path: {\n        id: data.id,\n      },\n      body: data.requestBody,\n      mediaType: \"application/json\",\n    });\n  }\n\n  /**\n   * @param data The data for the request.\n   * @param data.id A unique integer value identifying this user.\n   * @returns void No response body\n   * @throws ApiError\n   */\n  public static apiUsersDestroy(\n    data: ApiUsersDestroyData,\n  ): CancelablePromise<ApiUsersDestroyResponse> {\n    return __request(OpenAPI, {\n      method: \"DELETE\",\n      url: \"/api/users/{id}/\",\n      path: {\n        id: data.id,\n      },\n    });\n  }\n\n  /**\n   * Get job search stats for the user\n   * Returns job search statistics for the authenticated user over a given time period.\n   * @param data The data for the request.\n   * @param data.days Number of days to look back for stats (default: 30)\n   * @returns unknown\n   * @throws ApiError\n   */\n  public static apiUsersDashboardJobSearchStatsRetrieve(\n    data: ApiUsersDashboardJobSearchStatsRetrieveData = {},\n  ): CancelablePromise<ApiUsersDashboardJobSearchStatsRetrieveResponse> {\n    return __request(OpenAPI, {\n      method: \"GET\",\n      url: \"/api/users/dashboard/job-search-stats/\",\n      query: {\n        days: data.days,\n      },\n    });\n  }\n\n  /**\n   * Get profile completion percentage and checklist\n   * Returns the profile completion percentage and a checklist of completed sections for the authenticated user.\n   * @returns unknown\n   * @throws ApiError\n   */\n  public static apiUsersDashboardProfileCompletionRetrieve(): CancelablePromise<ApiUsersDashboardProfileCompletionRetrieveResponse> {\n    return __request(OpenAPI, {\n      method: \"GET\",\n      url: \"/api/users/dashboard/profile-completion/\",\n    });\n  }\n\n  /**\n   * Get recent job application activity\n   * Returns a list of recent job application activities for the authenticated user.\n   * @returns unknown\n   * @throws ApiError\n   */\n  public static apiUsersDashboardRecentActivityRetrieve(): CancelablePromise<ApiUsersDashboardRecentActivityRetrieveResponse> {\n    return __request(OpenAPI, {\n      method: \"GET\",\n      url: \"/api/users/dashboard/recent-activity/\",\n    });\n  }\n\n  /**\n   * API endpoint for volunteer opportunities\n   * @param data The data for the request.\n   * @param data.limit Number of results to return per page.\n   * @param data.offset The initial index from which to return the results.\n   * @returns PaginatedVolunteerOpportunityList\n   * @throws ApiError\n   */\n  public static apiVolunteerOpportunitiesList(\n    data: ApiVolunteerOpportunitiesListData = {},\n  ): CancelablePromise<ApiVolunteerOpportunitiesListResponse> {\n    return __request(OpenAPI, {\n      method: \"GET\",\n      url: \"/api/volunteer-opportunities/\",\n      query: {\n        limit: data.limit,\n        offset: data.offset,\n      },\n    });\n  }\n\n  /**\n   * API endpoint for volunteer opportunities\n   * @param data The data for the request.\n   * @param data.requestBody\n   * @returns VolunteerOpportunity\n   * @throws ApiError\n   */\n  public static apiVolunteerOpportunitiesCreate(\n    data: ApiVolunteerOpportunitiesCreateData,\n  ): CancelablePromise<ApiVolunteerOpportunitiesCreateResponse> {\n    return __request(OpenAPI, {\n      method: \"POST\",\n      url: \"/api/volunteer-opportunities/\",\n      body: data.requestBody,\n      mediaType: \"application/json\",\n    });\n  }\n\n  /**\n   * API endpoint for volunteer opportunities\n   * @param data The data for the request.\n   * @param data.id A unique integer value identifying this volunteer opportunity.\n   * @returns VolunteerOpportunity\n   * @throws ApiError\n   */\n  public static apiVolunteerOpportunitiesRetrieve(\n    data: ApiVolunteerOpportunitiesRetrieveData,\n  ): CancelablePromise<ApiVolunteerOpportunitiesRetrieveResponse> {\n    return __request(OpenAPI, {\n      method: \"GET\",\n      url: \"/api/volunteer-opportunities/{id}/\",\n      path: {\n        id: data.id,\n      },\n    });\n  }\n\n  /**\n   * API endpoint for volunteer opportunities\n   * @param data The data for the request.\n   * @param data.id A unique integer value identifying this volunteer opportunity.\n   * @param data.requestBody\n   * @returns VolunteerOpportunity\n   * @throws ApiError\n   */\n  public static apiVolunteerOpportunitiesUpdate(\n    data: ApiVolunteerOpportunitiesUpdateData,\n  ): CancelablePromise<ApiVolunteerOpportunitiesUpdateResponse> {\n    return __request(OpenAPI, {\n      method: \"PUT\",\n      url: \"/api/volunteer-opportunities/{id}/\",\n      path: {\n        id: data.id,\n      },\n      body: data.requestBody,\n      mediaType: \"application/json\",\n    });\n  }\n\n  /**\n   * API endpoint for volunteer opportunities\n   * @param data The data for the request.\n   * @param data.id A unique integer value identifying this volunteer opportunity.\n   * @param data.requestBody\n   * @returns VolunteerOpportunity\n   * @throws ApiError\n   */\n  public static apiVolunteerOpportunitiesPartialUpdate(\n    data: ApiVolunteerOpportunitiesPartialUpdateData,\n  ): CancelablePromise<ApiVolunteerOpportunitiesPartialUpdateResponse> {\n    return __request(OpenAPI, {\n      method: \"PATCH\",\n      url: \"/api/volunteer-opportunities/{id}/\",\n      path: {\n        id: data.id,\n      },\n      body: data.requestBody,\n      mediaType: \"application/json\",\n    });\n  }\n\n  /**\n   * API endpoint for volunteer opportunities\n   * @param data The data for the request.\n   * @param data.id A unique integer value identifying this volunteer opportunity.\n   * @returns void No response body\n   * @throws ApiError\n   */\n  public static apiVolunteerOpportunitiesDestroy(\n    data: ApiVolunteerOpportunitiesDestroyData,\n  ): CancelablePromise<ApiVolunteerOpportunitiesDestroyResponse> {\n    return __request(OpenAPI, {\n      method: \"DELETE\",\n      url: \"/api/volunteer-opportunities/{id}/\",\n      path: {\n        id: data.id,\n      },\n    });\n  }\n\n  /**\n   * Get volunteer opportunities created by the user's company\n   * @returns VolunteerOpportunity\n   * @throws ApiError\n   */\n  public static apiVolunteerOpportunitiesMyOpportunitiesRetrieve(): CancelablePromise<ApiVolunteerOpportunitiesMyOpportunitiesRetrieveResponse> {\n    return __request(OpenAPI, {\n      method: \"GET\",\n      url: \"/api/volunteer-opportunities/my_opportunities/\",\n    });\n  }\n\n  /**\n   * @returns WhoAmI\n   * @throws ApiError\n   */\n  public static apiWhoamiRetrieve(): CancelablePromise<ApiWhoamiRetrieveResponse> {\n    return __request(OpenAPI, {\n      method: \"GET\",\n      url: \"/api/whoami/\",\n    });\n  }\n}\n\nexport class CandidatesService {\n  /**\n   * Get candidate profile for recruiters\n   * Returns comprehensive candidate profile data including user info, application, skills, experience, and education. Only accessible by recruiters, staff, and admins.\n   * @param data The data for the request.\n   * @param data.candidateId ID of the candidate to view\n   * @returns CandidatePublicProfile\n   * @throws ApiError\n   */\n  public static apiCandidateProfileRetrieve(\n    data: ApiCandidateProfileRetrieveData,\n  ): CancelablePromise<ApiCandidateProfileRetrieveResponse> {\n    return __request(OpenAPI, {\n      method: \"GET\",\n      url: \"/api/candidate-profile/{candidate_id}/\",\n      path: {\n        candidate_id: data.candidateId,\n      },\n      errors: {\n        403: \"Access denied - only recruiters, staff, and admins can view candidate profiles\",\n        404: \"Candidate not found or not looking for jobs\",\n      },\n    });\n  }\n\n  /**\n   * Search candidates using GET method\n   * Alternative GET method for candidate search with query parameters\n   * @param data The data for the request.\n   * @param data.q Search query\n   * @param data.limit Maximum number of results\n   * @returns SearchResponse\n   * @throws ApiError\n   */\n  public static apiSearchCandidatesRetrieve(\n    data: ApiSearchCandidatesRetrieveData,\n  ): CancelablePromise<ApiSearchCandidatesRetrieveResponse> {\n    return __request(OpenAPI, {\n      method: \"GET\",\n      url: \"/api/search/candidates/\",\n      query: {\n        limit: data.limit,\n        q: data.q,\n      },\n      errors: {\n        400: \"Invalid request parameters\",\n        403: \"Access denied\",\n        500: \"Internal server error\",\n      },\n    });\n  }\n\n  /**\n   * Search candidates using natural language\n   *\n   * Search for candidates using natural language queries. The system will:\n   * - Parse job roles, locations, experience levels, and skills from your query\n   * - Search across candidate profiles, experiences, education, and skills\n   * - Rank results by relevance using both text search and matching algorithms\n   * - Return detailed candidate information with match scores\n   *\n   * Example queries:\n   * - \"backend engineer with 5 years experience around DC\"\n   * - \"frontend developer skilled in React and TypeScript\"\n   * - \"data scientist with machine learning experience in San Francisco\"\n   * - \"product manager with startup experience\"\n   *\n   * @param data The data for the request.\n   * @param data.query Natural language search query\n   * @param data.requestBody\n   * @param data.limit Maximum number of results (default: 20, max: 100)\n   * @returns SearchResponse\n   * @throws ApiError\n   */\n  public static apiSearchCandidatesCreate(\n    data: ApiSearchCandidatesCreateData,\n  ): CancelablePromise<ApiSearchCandidatesCreateResponse> {\n    return __request(OpenAPI, {\n      method: \"POST\",\n      url: \"/api/search/candidates/\",\n      query: {\n        limit: data.limit,\n        query: data.query,\n      },\n      body: data.requestBody,\n      mediaType: \"application/json\",\n      errors: {\n        400: \"Invalid request data\",\n        403: \"Access denied - only recruiters can search candidates\",\n        500: \"Internal server error\",\n      },\n    });\n  }\n}\n\nexport class RecruitersService {\n  /**\n   * Get candidate profile for recruiters\n   * Returns comprehensive candidate profile data including user info, application, skills, experience, and education. Only accessible by recruiters, staff, and admins.\n   * @param data The data for the request.\n   * @param data.candidateId ID of the candidate to view\n   * @returns CandidatePublicProfile\n   * @throws ApiError\n   */\n  public static apiCandidateProfileRetrieve(\n    data: ApiCandidateProfileRetrieveData,\n  ): CancelablePromise<ApiCandidateProfileRetrieveResponse> {\n    return __request(OpenAPI, {\n      method: \"GET\",\n      url: \"/api/candidate-profile/{candidate_id}/\",\n      path: {\n        candidate_id: data.candidateId,\n      },\n      errors: {\n        403: \"Access denied - only recruiters, staff, and admins can view candidate profiles\",\n        404: \"Candidate not found or not looking for jobs\",\n      },\n    });\n  }\n}\n\nexport class SearchService {\n  /**\n   * Search candidates using GET method\n   * Alternative GET method for candidate search with query parameters\n   * @param data The data for the request.\n   * @param data.q Search query\n   * @param data.limit Maximum number of results\n   * @returns SearchResponse\n   * @throws ApiError\n   */\n  public static apiSearchCandidatesRetrieve(\n    data: ApiSearchCandidatesRetrieveData,\n  ): CancelablePromise<ApiSearchCandidatesRetrieveResponse> {\n    return __request(OpenAPI, {\n      method: \"GET\",\n      url: \"/api/search/candidates/\",\n      query: {\n        limit: data.limit,\n        q: data.q,\n      },\n      errors: {\n        400: \"Invalid request parameters\",\n        403: \"Access denied\",\n        500: \"Internal server error\",\n      },\n    });\n  }\n\n  /**\n   * Search candidates using natural language\n   *\n   * Search for candidates using natural language queries. The system will:\n   * - Parse job roles, locations, experience levels, and skills from your query\n   * - Search across candidate profiles, experiences, education, and skills\n   * - Rank results by relevance using both text search and matching algorithms\n   * - Return detailed candidate information with match scores\n   *\n   * Example queries:\n   * - \"backend engineer with 5 years experience around DC\"\n   * - \"frontend developer skilled in React and TypeScript\"\n   * - \"data scientist with machine learning experience in San Francisco\"\n   * - \"product manager with startup experience\"\n   *\n   * @param data The data for the request.\n   * @param data.query Natural language search query\n   * @param data.requestBody\n   * @param data.limit Maximum number of results (default: 20, max: 100)\n   * @returns SearchResponse\n   * @throws ApiError\n   */\n  public static apiSearchCandidatesCreate(\n    data: ApiSearchCandidatesCreateData,\n  ): CancelablePromise<ApiSearchCandidatesCreateResponse> {\n    return __request(OpenAPI, {\n      method: \"POST\",\n      url: \"/api/search/candidates/\",\n      query: {\n        limit: data.limit,\n        query: data.query,\n      },\n      body: data.requestBody,\n      mediaType: \"application/json\",\n      errors: {\n        400: \"Invalid request data\",\n        403: \"Access denied - only recruiters can search candidates\",\n        500: \"Internal server error\",\n      },\n    });\n  }\n\n  /**\n   * Get search suggestions\n   * Get search suggestions based on partial query input\n   * @param data The data for the request.\n   * @param data.q Partial search query\n   * @returns unknown Search suggestions\n   * @throws ApiError\n   */\n  public static apiSearchSuggestionsRetrieve(\n    data: ApiSearchSuggestionsRetrieveData,\n  ): CancelablePromise<ApiSearchSuggestionsRetrieveResponse> {\n    return __request(OpenAPI, {\n      method: \"GET\",\n      url: \"/api/search/suggestions/\",\n      query: {\n        q: data.q,\n      },\n      errors: {\n        400: \"Invalid request\",\n        403: \"Access denied\",\n      },\n    });\n  }\n}\n\nexport class SuggestionsService {\n  /**\n   * Get search suggestions\n   * Get search suggestions based on partial query input\n   * @param data The data for the request.\n   * @param data.q Partial search query\n   * @returns unknown Search suggestions\n   * @throws ApiError\n   */\n  public static apiSearchSuggestionsRetrieve(\n    data: ApiSearchSuggestionsRetrieveData,\n  ): CancelablePromise<ApiSearchSuggestionsRetrieveResponse> {\n    return __request(OpenAPI, {\n      method: \"GET\",\n      url: \"/api/search/suggestions/\",\n      query: {\n        q: data.q,\n      },\n      errors: {\n        400: \"Invalid request\",\n        403: \"Access denied\",\n      },\n    });\n  }\n}\n\nexport class UsersService {\n  /**\n   * Send an email from the authenticated user to any recipient.\n   * @param data The data for the request.\n   * @param data.requestBody\n   * @returns unknown Email sent successfully.\n   * @throws ApiError\n   */\n  public static apiSendEmailCreate(\n    data: ApiSendEmailCreateData,\n  ): CancelablePromise<ApiSendEmailCreateResponse> {\n    return __request(OpenAPI, {\n      method: \"POST\",\n      url: \"/api/send-email/\",\n      body: data.requestBody,\n      mediaType: \"application/json\",\n      errors: {\n        400: \"Validation error.\",\n        500: \"Failed to send email.\",\n      },\n    });\n  }\n}\n\nexport class CommonService {\n  /**\n   * Check REST API\n   * This endpoint checks if the REST API is working.\n   * @returns Message\n   * @throws ApiError\n   */\n  public static commonRestCheckRetrieve(): CancelablePromise<CommonRestCheckRetrieveResponse> {\n    return __request(OpenAPI, {\n      method: \"GET\",\n      url: \"/common/rest-check/\",\n    });\n  }\n\n  /**\n   * API endpoint to get auto-prefill data for application forms.\n   * @param data The data for the request.\n   * @param data.taskId\n   * @returns Message\n   * @throws ApiError\n   */\n  public static commonResumeAutoPrefillRetrieve(\n    data: CommonResumeAutoPrefillRetrieveData,\n  ): CancelablePromise<CommonResumeAutoPrefillRetrieveResponse> {\n    return __request(OpenAPI, {\n      method: \"GET\",\n      url: \"/common/resume/auto-prefill/{task_id}/\",\n      path: {\n        task_id: data.taskId,\n      },\n    });\n  }\n\n  /**\n   * API endpoint specifically for enhanced resume parsing with auto-prefill data.\n   * @param data The data for the request.\n   * @param data.requestBody\n   * @returns Message\n   * @throws ApiError\n   */\n  public static commonResumeEnhancedCreate(\n    data: CommonResumeEnhancedCreateData,\n  ): CancelablePromise<CommonResumeEnhancedCreateResponse> {\n    return __request(OpenAPI, {\n      method: \"POST\",\n      url: \"/common/resume/enhanced/\",\n      body: data.requestBody,\n      mediaType: \"application/json\",\n    });\n  }\n\n  /**\n   * API endpoint to fetch the parsed resume data using the task ID.\n   * @param data The data for the request.\n   * @param data.taskId\n   * @returns Message\n   * @throws ApiError\n   */\n  public static commonResumeResultRetrieve(\n    data: CommonResumeResultRetrieveData,\n  ): CancelablePromise<CommonResumeResultRetrieveResponse> {\n    return __request(OpenAPI, {\n      method: \"GET\",\n      url: \"/common/resume/result/{task_id}/\",\n      path: {\n        task_id: data.taskId,\n      },\n    });\n  }\n}\n\nexport class ResumeService {\n  /**\n   * Get current user's resume\n   * Retrieve the current authenticated user's resume information including URL, filename, and size.\n   * @returns unknown Resume information retrieved successfully\n   * @throws ApiError\n   */\n  public static commonResumeUploadRetrieve(): CancelablePromise<CommonResumeUploadRetrieveResponse> {\n    return __request(OpenAPI, {\n      method: \"GET\",\n      url: \"/common/resume/upload/\",\n      errors: {\n        401: \"User not authenticated\",\n        404: \"No resume found for user\",\n      },\n    });\n  }\n\n  /**\n   * Upload a new resume\n   * Upload a new resume file for the authenticated user. The file will be saved and processed asynchronously. Accepts both 'file' and 'resume' field names.\n   * @param data The data for the request.\n   * @param data.formData\n   * @returns unknown Resume uploaded and processing started\n   * @throws ApiError\n   */\n  public static commonResumeUploadCreate(\n    data: CommonResumeUploadCreateData = {},\n  ): CancelablePromise<CommonResumeUploadCreateResponse> {\n    return __request(OpenAPI, {\n      method: \"POST\",\n      url: \"/common/resume/upload/\",\n      formData: data.formData,\n      mediaType: \"multipart/form-data\",\n      errors: {\n        400: \"No file uploaded\",\n        401: \"User not authenticated\",\n      },\n    });\n  }\n\n  /**\n   * Replace resume file\n   * Replace the entire resume file for the authenticated user (idempotent operation). The old file will be deleted before saving the new one. Accepts both 'file' and 'resume' field names.\n   * @param data The data for the request.\n   * @param data.formData\n   * @returns unknown Resume replaced and processing started\n   * @throws ApiError\n   */\n  public static commonResumeUploadUpdate(\n    data: CommonResumeUploadUpdateData = {},\n  ): CancelablePromise<CommonResumeUploadUpdateResponse> {\n    return __request(OpenAPI, {\n      method: \"PUT\",\n      url: \"/common/resume/upload/\",\n      formData: data.formData,\n      mediaType: \"multipart/form-data\",\n      errors: {\n        400: \"No file uploaded\",\n        401: \"User not authenticated\",\n      },\n    });\n  }\n\n  /**\n   * Delete resume\n   * Remove the resume file from the authenticated user's profile. The file will be deleted from storage and the resume field will be cleared.\n   * @returns unknown Resume deleted successfully\n   * @throws ApiError\n   */\n  public static commonResumeUploadDestroy(): CancelablePromise<CommonResumeUploadDestroyResponse> {\n    return __request(OpenAPI, {\n      method: \"DELETE\",\n      url: \"/common/resume/upload/\",\n      errors: {\n        401: \"User not authenticated\",\n        404: \"No resume found for user\",\n      },\n    });\n  }\n}\n","import { Transition } from \"@headlessui/react\";\nimport { BellIcon, XMarkIcon } from \"@heroicons/react/24/solid\";\n\nexport default function Notifications({ onClose }) {\n    const notifications = []; \n\n    return (\n        <div className=\"p-6 flex flex-col h-full\">\n            {/* Header */}\n            <div className=\"flex items-center justify-between mb-4\">\n                <div className=\"flex items-center gap-2\">\n                    <BellIcon className=\"w-6 h-6 text-blue-600\" />\n                    <h3 className=\"text-xl font-semibold text-gray-900\">Notifications</h3>\n                </div>\n                <button\n                    onClick={onClose}\n                    className=\"p-1 rounded-full hover:bg-blue-100 text-gray-600 hover:text-blue-600 transition-colors duration-200 focus:outline-none focus:ring-2 focus:ring-blue-400\"\n                >\n                    <XMarkIcon className=\"w-6 h-6\" />\n                </button>\n            </div>\n\n            {/* Divider */}\n            <hr className=\"border-blue-200 mb-6\" />\n\n            {/* Notifications Content */}\n            <Transition\n                show={true}\n                enter=\"transition-opacity duration-300\"\n                enterFrom=\"opacity-0\"\n                enterTo=\"opacity-100\"\n                leave=\"transition-opacity duration-200\"\n                leaveFrom=\"opacity-100\"\n                leaveTo=\"opacity-0\"\n            >\n                {notifications.length === 0 ? (\n                    <div className=\"flex flex-col items-center justify-center flex-grow text-center\">\n                        <BellIcon className=\"w-12 h-12 text-blue-300 mb-4\" />\n                        <p className=\"text-gray-500 text-sm\">You have no new notifications.</p>\n                    </div>\n                ) : (\n                    <div className=\"space-y-4 overflow-y-auto\">\n                        <p> Notifications will be shown here.</p>\n                    </div>\n                )}\n            </Transition>\n        </div>\n    );\n}","import axios from \"axios\";\nimport Cookies from \"js-cookie\";\nimport { useEffect, useState } from \"react\";\nimport { Link, useNavigate, useLocation } from \"react-router-dom\";\nimport { Menu, MenuButton, MenuItem, MenuItems, Transition } from \"@headlessui/react\";\nimport { ChevronDownIcon, BellIcon } from \"@heroicons/react/24/solid\";\n\nimport Logo from \"../../../assets/images/un_resume_logo2.png\";\nimport ProfilePic from \"../../../assets/images/blank-profile-pic.png\";\nimport Notifications from \"./Notifications\";\n\nexport default function HomeNavbar() {\n    const navigate = useNavigate();\n    const location = useLocation();\n    const currentPath = location.pathname;\n    const [showNotifications, setShowNotifications] = useState(false);\n    const [userData, setUserData] = useState({ name: \"\", profile_picture: \"\" });\n\n    const toggleNotifications = () => setShowNotifications(!showNotifications);\n\n\n    const handleLogout = async () => {\n        try {\n            const csrfToken = Cookies.get(\"csrftoken\");\n            await axios.post(\"/api/logout/\", null, {\n                headers: {\n                    \"X-CSRFToken\": csrfToken,\n                    \"Content-Type\": \"application/json\",\n                },\n            });\n            navigate(\"/login\");\n        } catch (error) {\n            console.error(\"Error during logout:\", error);\n        }\n    };\n\n    useEffect(() => {\n        const userId = Cookies.get(\"id\");\n        if (!userId) {\n            console.error(\"User ID not found\");\n            return;\n        }\n        axios\n            .get(`/api/users/${userId}/`, { withCredentials: true })\n            .then((response) => {\n                const { name, profile_picture } = response.data;\n                setUserData({ name, profile_picture });\n            })\n            .catch((error) => {\n                console.error(\"Error fetching user data:\", error);\n            });\n    }, []);\n\n    return (\n        <nav\n            className=\"border-b border-b-gray-300 fixed top-0 left-0 right-0 z-50 flex justify-between items-center h-16 px-4 sm:px-6 lg:px-8 transition-all duration-300 bg-white w-full\"\n        >\n            {/* Logo */}\n            <div className=\"flex items-center gap-2\">\n                <img alt=\"UnResume Logo\" className=\"w-9 h-9 rounded-full shadow-sm\" src={Logo} />\n                <Link className=\"text-xl font-bold text-gray-900 transition-colors duration-200 tracking-tighter\">\n                    UnResumé\n                </Link>\n                <div className=\"hidden ml-6 md:flex flex-row gap-x-6\">\n                    <div className={`h-16 flex items-center ${currentPath === \"/home\" ? \"border-b-3 border-blue-700\" : \"\"}`}>\n                        <Link\n                            to=\"/home\"\n                            className={`text-sm font-medium transition-colors duration-200 ${currentPath === \"/home\" ? \"text-blue-600\" : \"text-gray-700 hover:text-blue-600\"\n                                }`}\n                        >\n                            Matches\n                        </Link>\n                    </div>\n\n                    <div className={`h-16 flex items-center ${currentPath === \"/jobs\" ? \"border-b-3 border-blue-700\" : \"\"}`}>\n                        <Link\n                            to=\"#\"\n                            className={`text-sm font-medium transition-colors duration-200 ${currentPath === \"/volunteer\" ? \"text-blue-600 font-semibold\" : \"text-gray-700 hover:text-blue-600\"\n                                }`}\n                        >\n                            Explore\n                        </Link>\n                    </div>\n                    <div className={`h-16 flex items-center ${currentPath === \"/jobs\" ? \"border-b-3 border-blue-700\" : \"\"}`}>\n                        <Link\n                            to=\"#\"\n                            className={`text-sm font-medium transition-colors duration-200 ${currentPath === \"/jobs\" ? \"text-blue-600 font-semibold\" : \"text-gray-700 hover:text-blue-600\"\n                                }`}\n                        >\n                            Resources\n                        </Link>\n                    </div>\n                </div>\n            </div>\n\n            {/* Desktop Menu */}\n            <div className=\"hidden md:flex items-center gap-2\">\n                {/* Notifications */}\n                <button\n                    onClick={toggleNotifications}\n                    className=\"p-2 rounded-full hover:bg-blue-100 transition-colors duration-200 focus:outline-none\"\n                >\n                    <BellIcon className=\"w-6 h-6 text-gray-400\" />\n                </button>\n\n                {/* Profile Dropdown */}\n                <Menu as=\"div\" className=\"relative\">\n                    <MenuButton className=\"flex items-center gap-2 p-2 rounded-full hover:bg-blue-100 transition-colors duration-200 focus:outline-none\">\n                        <img alt=\"Profile Pic\" className=\"w-8 h-8 rounded-full border-2 border-blue-200\" src={userData.profile_picture || ProfilePic} />\n                        <ChevronDownIcon className=\"w-4 h-4 text-blue-600\" />\n                    </MenuButton>\n                    <Transition\n                        enter=\"transition ease-out duration-200\"\n                        enterFrom=\"opacity-0 scale-95\"\n                        enterTo=\"opacity-100 scale-100\"\n                        leave=\"transition ease-in duration-150\"\n                        leaveFrom=\"opacity-100 scale-100\"\n                        leaveTo=\"opacity-0 scale-95\"\n                    >\n                        <MenuItems className=\"absolute right-0 mt-2 w-48 bg-white shadow-lg focus:outline-none rounded-lg py-2 ring-1 ring-blue-200/20\">\n                            <MenuItem>\n                                {({ active }) => (\n                                    <Link\n                                        to=\"/profile\"\n                                        className={`block px-4 py-2 text-sm text-gray-700 ${active ? \"bg-blue-50 text-blue-600\" : \"\"}`}\n                                    >\n                                        Profile\n                                    </Link>\n                                )}\n                            </MenuItem>\n                            <MenuItem>\n                                {({ active }) => (\n                                    <button\n                                        onClick={handleLogout}\n                                        className={`block w-full text-left px-4 py-2 text-sm text-red-600 ${active ? \"bg-red-50\" : \"\"}`}\n                                    >\n                                        Logout\n                                    </button>\n                                )}\n                            </MenuItem>\n                        </MenuItems>\n                    </Transition>\n                </Menu>\n            </div>\n\n            {/* Mobile Menu */}\n            <Menu as=\"div\" className=\"relative md:hidden flex flex-row gap-x-2\">\n                <button\n                    onClick={toggleNotifications}\n                    className=\"p-2 rounded-full hover:bg-blue-100 transition-colors duration-200 focus:outline-none\"\n                >\n                    <BellIcon className=\"w-6 h-6 text-gray-400\" />\n                </button>\n                <MenuButton className=\"flex items-center gap-2 p-2 rounded-full hover:bg-blue-100 transition-colors duration-200 focus:outline-none\">\n                    <img alt=\"Profile Pic\" className=\"w-8 h-8 rounded-full border-2 border-blue-200\" src={userData.profile_picture || ProfilePic} />\n                    <ChevronDownIcon className=\"w-4 h-4 text-blue-600\" />\n                </MenuButton>\n                <Transition\n                    enter=\"transition ease-out duration-200\"\n                    enterFrom=\"opacity-0 scale-95\"\n                    enterTo=\"opacity-100 scale-100\"\n                    leave=\"transition ease-in duration-150\"\n                    leaveFrom=\"opacity-100 scale-100\"\n                    leaveTo=\"opacity-0 scale-95\"\n                >\n                    <MenuItems className=\"absolute right-0 mt-2 w-48 bg-white shadow-lg focus:outline-none rounded-lg py-2 ring-1 ring-blue-200/20\">\n                        <MenuItem>\n                            {({ active }) => (\n                                <Link\n                                    to=\"/home\"\n                                    className={`block px-4 py-2 text-sm text-gray-700 ${active ? \"bg-blue-50 text-blue-600\" : \"\"}`}\n                                >\n                                    Matches\n                                </Link>\n                            )}\n                        </MenuItem>\n                        <MenuItem>\n                            {({ active }) => (\n                                <Link\n                                    to=\"#\"\n                                    className={`block px-4 py-2 text-sm text-gray-700 ${active ? \"bg-blue-50 text-blue-600\" : \"\"}`}\n                                >\n                                    Explore\n                                </Link>\n                            )}\n                        </MenuItem>\n                        <MenuItem>\n                            {({ active }) => (\n                                <Link\n                                    to=\"#\"\n                                    className={`block px-4 py-2 text-sm text-gray-700 ${active ? \"bg-blue-50 text-blue-600\" : \"\"}`}\n                                >\n                                    Resources\n                                </Link>\n                            )}\n                        </MenuItem>\n                        <MenuItem>\n                            {({ active }) => (\n                                <Link\n                                    to=\"/profile\"\n                                    className={`block px-4 py-2 text-sm text-gray-700 ${active ? \"bg-blue-50 text-blue-600\" : \"\"}`}\n                                >\n                                    Profile\n                                </Link>\n                            )}\n                        </MenuItem>\n                        <MenuItem>\n                            {({ active }) => (\n                                <button\n                                    onClick={handleLogout}\n                                    className={`block w-full text-left px-4 py-2 text-sm text-red-600 ${active ? \"bg-red-50\" : \"\"}`}\n                                >\n                                    Logout\n                                </button>\n                            )}\n                        </MenuItem>\n                    </MenuItems>\n                </Transition>\n            </Menu>\n\n            {/* Notifications */}\n            <Transition\n                show={showNotifications}\n                enter=\"transition ease-out duration-300\"\n                enterFrom=\"opacity-0 translate-x-10\"\n                enterTo=\"opacity-100 translate-x-0\"\n                leave=\"transition ease-in duration-200\"\n                leaveFrom=\"opacity-100 translate-x-0\"\n                leaveTo=\"opacity-0 translate-x-10\"\n            >\n                <div className=\"fixed z-[9999] top-16 right-4 w-80 max-w-xs mt-2 h-[90vh] bg-white rounded-xl shadow-xl overflow-auto border border-blue-200/50\">\n                    <Notifications onClose={toggleNotifications} />\n                </div>\n            </Transition>\n        </nav>\n    );\n}","import { formatDistanceToNow } from \"date-fns\";\n\nexport function formatRelativeDate(dateString) {\n  if (!dateString) return \"\";\n  return formatDistanceToNow(new Date(dateString), { addSuffix: true });\n}\n","export function formatSalary(salary) {\n  if (salary === null || salary === undefined || salary === \"\") return \"\";\n  const num = Number(salary);\n  if (isNaN(num)) return salary;\n  return num % 1 === 0 ? num.toFixed(0) : num.toString();\n}\n","import { XIcon } from 'lucide-react'\nimport { formatSalary } from '../../../../utils/formatSalary';\nimport { formatRelativeDate } from '../../../../utils/formatRelativeDate';\n\nexport function JobExpand({\n    job,\n    company,\n    onClose,\n}) {\n    const keywords = typeof job.keywords === 'string'\n        ? job.keywords.split(',').map(s => s.trim()).filter(Boolean)\n        : Array.isArray(job.keywords) ? job.keywords : [];\n\n    const benefits = typeof job.benefits_and_perks === 'string'\n        ? job.benefits_and_perks.split(',').map(s => s.trim()).filter(Boolean)\n        : Array.isArray(job.benefits_and_perks) ? job.benefits_and_perks : [];\n\n    return (\n        <div className=\"fixed inset-0 flex items-center justify-center z-50 bg-gray-300/20 backdrop-blur-md p-4\">\n            <div className=\"bg-white rounded-xl shadow-xl w-full max-w-3xl max-h-[90vh] overflow-y-auto\">\n                <div className=\"sticky top-0 bg-white border-b border-gray-200 p-6 flex justify-between items-center rounded-t-lg\">\n                    <h2 className=\"text-2xl font-bold text-gray-800\">\n                        {job.title}\n                    </h2>\n                    <button\n                        onClick={onClose}\n                        className=\"text-gray-500 hover:text-gray-700 focus:outline-none\"\n                        aria-label=\"Close modal\"\n                    >\n                        <XIcon size={24} />\n                    </button>\n                </div>\n                <div className=\"p-6 space-y-6\">\n                    <div className=\"grid grid-cols-1 md:grid-cols-4 gap-4 pb-4 border-b border-gray-200\">\n                        <InfoItem label=\"Salary\" value={`$ ${formatSalary(job.salary_min)} - $ ${formatSalary(job.salary_max)}`} />\n                        <InfoItem label=\"Job Mode\" value={job.is_remote ? \"Remote\" : \"On-site\"} />\n                        <InfoItem label=\"Job Type\" value={job.job_type} />\n                        <InfoItem label=\"Job Type\" value={`${job.city}, ${job.country}, ${job.state}`} />\n                    </div>\n                    <div className=\"space-y-4 pb-4 border-b border-gray-200\">\n                        <h3 className=\"text-lg font-semibold text-gray-800\">Description</h3>\n                        <p className=\"text-gray-700\">{job.description}</p>\n                    </div>\n                    <div className=\"space-y-4 pb-4 border-b border-gray-200\">\n                        <h3 className=\"text-lg font-semibold text-gray-800\">Skills</h3>\n                        <div className=\"flex flex-wrap gap-2\">\n                            {keywords.length > 0 ? keywords.map((skill, index) => (\n                                <span\n                                    key={index}\n                                    className=\"px-3 py-1 bg-blue-100 text-blue-800 rounded-full text-sm\"\n                                >\n                                    {skill}\n                                </span>\n                            )) : <span className=\"text-gray-400\">None</span>}\n                        </div>\n                    </div>\n                    <div className=\"grid grid-cols-1 md:grid-cols-2 gap-6 pb-4 border-b border-gray-200\">\n                        <div className=\"space-y-2\">\n                            <h3 className=\"text-lg font-semibold text-gray-800\">\n                                Requirements\n                            </h3>\n                            <InfoItem\n                                label=\"Education\"\n                                value={job.degree_requirements}\n                            />\n                            <InfoItem\n                                label=\"Experience\"\n                                value={job.years_of_experience}\n                            />\n                        </div>\n                        <div className=\"space-y-2\">\n                            <h3 className=\"text-lg font-semibold text-gray-800\">\n                                Additional Info\n                            </h3>\n                            <InfoItem\n                                label=\"Visa Sponsorship\"\n                                value={job.visa_sponsor ? \"Available\" : \"Not available\"}\n                            />\n                            <InfoItem label=\"Posted\" value={formatRelativeDate(job.created_at)} />\n                        </div>\n                    </div>\n                    <div className=\"space-y-4\">\n                        <h3 className=\"text-lg font-semibold text-gray-800\">\n                            Benefits & Perks\n                        </h3>\n                        <ul className=\"list-disc pl-5 space-y-1\">\n                            {benefits.length > 0 ? benefits.map((benefit, index) => (\n                                <li key={index} className=\"text-gray-700\">\n                                    {benefit}\n                                </li>\n                            )) : <li className=\"text-gray-400\">None</li>}\n                        </ul>\n                    </div>\n                </div>\n            </div>\n        </div>\n    )\n}\nconst InfoItem = ({ label, value }) => {\n    return (\n        <div className=\"space-y-1\">\n            <p className=\"text-sm font-medium text-gray-500\">{label}</p>\n            <p className=\"text-gray-800\">{value}</p>\n        </div>\n    )\n}\n","import { useState } from 'react'\nimport {\n    MapPinIcon,\n    ClockIcon,\n    DollarSignIcon,\n    BookmarkIcon,\n    StarIcon,\n    Building,\n} from 'lucide-react'\nimport { formatRelativeDate } from '../../../../utils/formatRelativeDate';\nimport { formatSalary } from '../../../../utils/formatSalary';\nimport { JobExpand } from './JobExpand'\n\nexport function JobCard({ job, company }) {\n    const tags = [];\n    const [isJobExpanded, setIsJobExpanded] = useState(false);\n\n    if (job.is_remote) tags.push('Remote');\n    else tags.push('On-site');\n    if (job.job_type === 'full-time') tags.push('Full-time');\n    else if (job.job_type === 'intern') tags.push('Internship');\n\n    function getInitials(name) {\n        if (!name) return '';\n        return name.split(' ').map(w => w[0]).join('').toUpperCase().slice(0, 2);\n    }\n\n    const bgColors = [\n        \"bg-purple-200\",\n        \"bg-blue-200\",\n        \"bg-green-200\"\n    ];\n\n    // Function to pick a color based on company name (repeatable)\n    function getBgColor(name) {\n        if (!name) return bgColors[0];\n        // Simple hash: sum char codes and mod by colors length\n        const hash = name.split('').reduce((acc, c) => acc + c.charCodeAt(0), 0);\n        return bgColors[hash % bgColors.length];\n    }\n\n    const toggleJobExpand = () => {\n        setIsJobExpanded((prev) => !prev);\n    }\n\n    const companyName = company?.name || '';\n    const companyLogo = company?.logo || null;\n    const logoBgColor = getBgColor(companyName);\n\n    return (\n        <div className=\"bg-white border border-gray-200 rounded-lg p-5 mb-4 hover:shadow-md transition-shadow\">\n            <div className=\"flex items-start justify-between\">\n                <div className=\"flex items-start\">\n                    <div className={`h-12 w-12 flex-shrink-0 rounded flex items-center justify-center overflow-hidden mr-4 ${!companyLogo ? logoBgColor : ''}`}>\n                        {companyLogo ? (\n                            <img\n                                src={companyLogo}\n                                alt={`${companyName} logo`}\n                                className=\"h-full w-full object-cover\"\n                            />\n                        ) : (\n                            <span className=\"text-xl font-bold text-gray-600\">\n                                {getInitials(companyName)}\n                            </span>\n                        )}\n                    </div>\n                    <div>\n                        <h3 className=\"font-semibold text-lg text-gray-900\">{job.title}</h3>\n                        <div className=\"mt-2 flex flex-wrap items-center text-sm text-gray-500 gap-y-1\">\n                            <div className='flex items-center justify-center gap-x-1'>\n                                <Building className='text-gray-600 w-4 h-4' />\n                                <p className=\"text-gray-600 font-medium\">{companyName}</p>\n                            </div>\n                        </div>\n                        <div className=\"mt-2 flex flex-wrap items-center text-sm text-gray-500 gap-y-1\">\n                            <div className=\"flex items-center mr-4 gap-x-1\">\n                                <MapPinIcon size={14} className=\"mr-1\" />\n                                <span>{job.city}, {job.state}, {job.country}</span>\n                            </div>\n                            <div className=\"flex items-center\">\n                                <DollarSignIcon size={14} className=\"mr-1\" />\n                                <span>{formatSalary(job.salary_min)} - {formatSalary(job.salary_max)}</span>\n                            </div>\n                        </div>\n                    </div>\n                </div>\n                <div className=\"flex flex-col items-end\">\n                    <div\n                        className={`flex items-center px-2 py-1 rounded-full text-xs font-medium ${job.matchScore >= 90 ? 'bg-green-100 text-green-800' : job.matchScore >= 70 ? 'bg-blue-100 text-blue-800' : 'bg-gray-100 text-gray-800'}`}\n                    >\n                        <StarIcon size={12} className=\"mr-1\" />\n                        85% Match\n                    </div>\n                    <span className=\"mt-1 text-xs text-gray-500\">\n                        Posted {formatRelativeDate(job.created_at)}\n                    </span>\n                </div>\n            </div>\n            <div className=\"mt-4 flex items-center justify-between\">\n                <div className=\"flex flex-wrap gap-2\">\n                    {tags.map((tag, index) => (\n                        <span\n                            key={index}\n                            className=\"inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium bg-gray-100 text-gray-800\"\n                        >\n                            {tag}\n                        </span>\n                    ))}\n                </div>\n                <div className=\"flex items-center\">\n                    <button onClick={toggleJobExpand} type='button' className='w-14 h-8 bg-blue-200 hover:bg-blue-300 font-semidbold text-md text-blue-600 rounded-md'>\n                        {isJobExpanded ? \"Hide\" : \"View\"}\n                    </button>\n                    <button\n                        className={`p-2 rounded-full ${job.isSaved ? 'text-blue-600' : 'text-gray-400 hover:text-gray-600'}`}\n                    >\n                        <BookmarkIcon\n                            size={18}\n                            fill={job.isSaved ? 'currentColor' : 'none'}\n                        />\n                    </button>\n                </div>\n            </div>\n            {isJobExpanded &&\n                <JobExpand className=\"rounded-md bg-amber-200\" job={job} company={company} onClose={toggleJobExpand} />\n            }\n        </div>\n    )\n}\n","import { createContext, useContext, useState, useEffect } from \"react\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport { XMarkIcon, CheckCircleIcon, ExclamationCircleIcon } from \"@heroicons/react/24/solid\";\n\nconst AlertContext = createContext(() => {});\n\nexport const useAlert = () => useContext(AlertContext);\n\nexport const AlertProvider = ({ children }) => {\n  const [alert, setAlert] = useState(null);\n  const [progress, setProgress] = useState(100);\n\n  const showAlert = (msg, type = \"success\") => {\n    setAlert({ msg, type });\n    setProgress(100);\n  };\n\n  useEffect(() => {\n    if (alert) {\n      const interval = setInterval(() => {\n        setProgress((prev) => {\n          if (prev <= 0) {\n            setAlert(null);\n            return 0;\n          }\n          return prev - 2;\n        });\n      }, 40); // ~2 seconds total\n      return () => clearInterval(interval);\n    }\n  }, [alert]);\n\n  const handleClose = () => {\n    setAlert(null);\n    setProgress(0);\n  };\n\n  return (\n    <AlertContext.Provider value={showAlert}>\n      {children}\n      <div className=\"fixed top-6 right-6 z-50 space-y-3\">\n        <AnimatePresence>\n          {alert && (\n            <motion.div\n              initial={{ opacity: 0, x: 150 }}\n              animate={{ opacity: 1, x: 0 }}\n              exit={{ opacity: 0, x: 150 }}\n              transition={{ type: \"spring\", stiffness: 100, damping: 20 }}\n              className={`relative flex items-start w-80 p-4 rounded-lg shadow-xl text-gray-700 \n                ${alert.type === \"success\" ? \"bg-gray-50\" : \"bg-gray-50\"} \n                border border-opacity-20 border-white/20 backdrop-blur-sm`}\n            >\n              <div className=\"flex-shrink-0 mr-3\">\n                {alert.type === \"success\" ? (\n                  <CheckCircleIcon className=\"h-6 w-6 text-green-500\" />\n                ) : (\n                  <ExclamationCircleIcon className=\"h-6 w-6 text-red-500\" />\n                )}\n              </div>\n              <div className=\"flex-1\">\n                <p className=\"text-sm font-medium leading-5\">{alert.msg}</p>\n                <div className=\"mt-2 h-1 bg-white/20 rounded-full overflow-hidden\">\n                  <motion.div\n                    className={`h-1 ${alert.type === \"success\" ? \"bg-green-500\" : \"bg-red-500\"}`}\n                    initial={{ width: \"100%\" }}\n                    animate={{ width: `${progress}%` }}\n                    transition={{ ease: \"linear\" }}\n                  />\n                </div>\n              </div>\n              <button\n                onClick={handleClose}\n                className=\"ml-3 flex-shrink-0 p-1 rounded-full hover:bg-white/10 transition-colors\"\n              >\n                <XMarkIcon className=\"h-5 w-5\" />\n              </button>\n            </motion.div>\n          )}\n        </AnimatePresence>\n      </div>\n    </AlertContext.Provider>\n  );\n};","import Skeleton from 'react-loading-skeleton'\nimport 'react-loading-skeleton/dist/skeleton.css'\n\nexport function SkeletonLoader() {\n    return (\n        <div className=\"bg-white border border-gray-200 rounded-lg p-5 mb-4\">\n            <div className=\"flex items-start\">\n                <Skeleton circle width={48} height={48} className=\"mr-4\" />\n                <div className=\"flex-1\">\n                    <Skeleton height={24} width=\"60%\" className=\"mb-2\" />\n                    <Skeleton height={16} width=\"40%\" className=\"mb-2\" />\n                    <Skeleton height={16} width=\"80%\" className=\"mb-2\" />\n                    <Skeleton height={12} width=\"30%\" />\n                </div>\n            </div>\n            <div className=\"mt-4 flex gap-2\">\n                <Skeleton width={60} height={24} />\n                <Skeleton width={60} height={24} />\n            </div>\n        </div>\n    )\n}","import { useState, useEffect } from 'react'\nimport { JobCard } from './JobCard'\nimport { ApiService } from '../../../../api/services.gen'\nimport { useAlert } from '../../../../constants/AlertProvider'\nimport { SkeletonLoader } from '../../../common/SkeletonLoader'\n\nexport function JobList({ activeFilter, sortBy }) {\n    // Mock job data\n    const [jobs, setJobs] = useState([])\n    const [companyCache, setCompanyCache] = useState({})\n    const [isLoading, setIsLoading] = useState(true)\n    const showAlert = useAlert()\n\n    useEffect(() => {\n        setIsLoading(true);\n        ApiService.apiJobprofileList()\n            .then(response => {\n                setJobs(response.results || []);\n                setIsLoading(false);\n            })\n            .catch(error => {\n                showAlert(\"Error fetching jobs\", \"error\");\n                console.error(\"Error fetching jobs\", error);\n                setIsLoading(false);\n            });\n    }, []);\n\n    useEffect(() => {\n        const uniqueCompanyIds = [\n            ...new Set(jobs.map(job => job.company).filter(Boolean))\n        ].filter(id => !(id in companyCache));\n        if (uniqueCompanyIds.length === 0) return;\n\n        uniqueCompanyIds.forEach(id => {\n            ApiService.apiCompanyRetrieve({ id })\n                .then(company => {\n                    setCompanyCache(prev => ({ ...prev, [id]: company }))\n                })\n                .catch(e => {\n                    console.error(\"Error fetching company\", id, e)\n                })\n        });\n    }, [jobs, companyCache]);\n\n    // Filter jobs based on active filter\n    let filteredJobs = jobs\n    if (activeFilter === 'saved') {\n        filteredJobs = jobs.filter((job) => job.isSaved)\n    }\n\n    if (sortBy === 'match') {\n        filteredJobs.sort((a, b) => (b.match_score || 0) - (a.match_score || 0))\n    } else if (sortBy === 'recent') {\n        filteredJobs.sort((a, b) => new Date(b.created_at) - new Date(a.created_at))\n    } else if (sortBy === 'salary') {\n        filteredJobs.sort((a, b) => (b.salary_max || 0) - (a.salary_max || 0))\n    }\n\n    return (\n        <div>\n            {isLoading ? (\n                // Show 3 skeleton cards while loading\n                Array.from({ length: 3 }).map((_, idx) => <SkeletonLoader key={idx} />)\n            ) : (\n                filteredJobs.length > 0 ? (\n                    filteredJobs.map((job) => <JobCard key={job.id} job={job} company={companyCache[job.company]} />)\n                ) : (\n                    <div className=\"text-center py-10\">\n                        <p className=\"text-gray-500\">No jobs found matching your criteria</p>\n                    </div>\n                )\n            )}\n        </div>\n    )\n}\n","import React from 'react'\nimport { ArrowDownIcon } from 'lucide-react'\nexport function FilterBar({\n    activeFilter,\n    setActiveFilter,\n    sortBy,\n    setSortBy,\n}) {\n    const filters = [\n        {\n            id: 'all',\n            label: 'All Jobs',\n        },\n        {\n            id: 'saved',\n            label: 'Saved',\n        },\n    ]\n    return (\n        <div className=\"flex flex-col md:flex-row md:items-center justify-between mb-6 gap-4\">\n            <div className=\"flex overflow-x-auto pb-2 md:pb-0 hide-scrollbar\">\n                {filters.map((filter) => (\n                    <button\n                        key={filter.id}\n                        className={`whitespace-nowrap px-4 py-2 text-sm font-medium rounded-full mr-2 ${activeFilter === filter.id ? 'bg-blue-100 text-blue-700' : 'bg-white text-gray-700 hover:bg-gray-100'}`}\n                        onClick={() => setActiveFilter(filter.id)}\n                    >\n                        {filter.label}\n                    </button>\n                ))}\n            </div>\n            <div className=\"flex items-center space-x-2\">\n                <div className=\"relative\">\n                    <select\n                        value={sortBy}\n                        onChange={(e) => setSortBy(e.target.value)}\n                        className=\"appearance-none pl-3 pr-8 py-2 bg-white border border-gray-300 rounded-md text-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500\"\n                    >\n                        <option value=\"match\">Match Score</option>\n                        <option value=\"recent\">Most Recent</option>\n                        <option value=\"salary\">Salary: High to Low</option>\n                    </select>\n                    <div className=\"pointer-events-none absolute inset-y-0 right-0 flex items-center px-2 text-gray-500\">\n                        <ArrowDownIcon size={16} />\n                    </div>\n                </div>\n            </div>\n        </div>\n    )\n}\n","import { useEffect, useState } from 'react'\nimport HomeNavbar from '../HomeNavbar'\nimport { JobList } from './components/JobList'\nimport { FilterBar } from './components/FilterBar'\nimport { ApiService } from '../../../api/services.gen'\nimport { useAlert } from '../../../constants/AlertProvider'\n\nexport default function Jobs() {\n    const [activeFilter, setActiveFilter] = useState('all')\n    const [sortBy, setSortBy] = useState('match')\n    const [count, setCount] = useState()\n    const showAlert = useAlert()\n\n    useEffect(() => {\n        try {\n            ApiService.apiJobprofileList().then(\n                response => {\n                    setCount(response.count || 0)\n                }\n            )\n        } catch (error) {\n            showAlert(\"Error Occurred\", \"error\")\n            console.error(\"Error Occurred\", error)\n        }\n    }, [])\n    return (\n        <>\n            <HomeNavbar />\n            <div className=\"mt-14 flex flex-col min-h-screen bg-gray-50 p-6\">\n                <div className=\"flex flex-1\">\n                    <main className=\"flex-1 px-4 py-6 md:px-8\">\n                        <h1 className=\"text-3xl font-semibold text-gray-800 mb-2\">\n                            Your Job Matches\n                        </h1>\n                        <p className=\"text-gray-600 mb-6\">\n                            We found {count} jobs that match your profile\n                        </p>\n                        <FilterBar\n                            activeFilter={activeFilter}\n                            setActiveFilter={setActiveFilter}\n                            sortBy={sortBy}\n                            setSortBy={setSortBy}\n                        />\n                        <JobList activeFilter={activeFilter} sortBy={sortBy} />\n                    </main>\n                </div>\n            </div>\n        </>\n    )\n}\n","// components/ImageCropper.tsx\nimport { useState, useEffect } from \"react\";\nimport ReactCrop from \"react-image-crop\";\nimport { type Crop } from \"react-image-crop\";\n\nimport \"react-image-crop/dist/ReactCrop.css\";\nimport { canvasPreview, getCroppedBlob } from \"./croputils\";\nimport { useImageCropper } from \"./useImageCropper\";\n\ninterface ImageCropperProps {\n  onCropComplete: (file: File) => void;\n  aspectRatio?: number;\n  minDimension?: number;\n}\n\nexport default function ImageCropper({\n  onCropComplete,\n  aspectRatio = 1,\n  minDimension = 150,\n}: ImageCropperProps) {\n  const {\n    imgSrc,\n    crop,\n    setCrop,\n    completedCrop,\n    setCompletedCrop,\n    error,\n    imgRef,\n    previewCanvasRef,\n    onSelectFile,\n    onImageLoad,\n    reset,\n  } = useImageCropper(aspectRatio);\n\n  const [isLoading, setIsLoading] = useState(false);\n\n  // Live preview effect\n  useEffect(() => {\n    if (\n      completedCrop?.width &&\n      completedCrop?.height &&\n      imgRef.current &&\n      previewCanvasRef.current\n    ) {\n      canvasPreview(imgRef.current, previewCanvasRef.current, completedCrop);\n    }\n  }, [completedCrop]);\n\n  const handleCrop = async () => {\n    if (!imgRef.current || !completedCrop) {\n      return;\n    }\n\n    setIsLoading(true);\n    const croppedFile = await getCroppedBlob(\n      imgRef.current,\n      completedCrop,\n      \"cropped-image.jpeg\",\n    );\n\n    if (croppedFile) {\n      onCropComplete(croppedFile);\n    }\n    setIsLoading(false);\n  };\n\n  return (\n    <section className=\"flex flex-col items-center gap-4 p-4\">\n      {!imgSrc ? (\n        <label\n          className=\"flex flex-col items-center justify-center w-full h-64 border-2 border-gray-400 border-dashed rounded-lg cursor-pointer bg-gray-200 hover:bg-gray-300 transition-colors\"\n          htmlFor=\"image-upload\"\n        >\n          <div className=\"flex flex-col items-center justify-center pt-5 pb-6\">\n            <svg\n              className=\"w-8 h-8 mb-4 text-gray-500\" /* ... SVG icon ... */\n            />\n            <p className=\"mb-2 text-sm text-gray-600\">\n              <span className=\"font-semibold\">Click to upload</span> or drag and\n              drop\n            </p>\n            <p className=\"text-xs text-gray-500\">PNG, JPG, or WEBP</p>\n          </div>\n          <input\n            accept=\"image/*\"\n            className=\"hidden\"\n            id=\"image-upload\"\n            type=\"file\"\n            onChange={onSelectFile}\n          />\n        </label>\n      ) : (\n        <div className=\"w-full flex flex-col md:flex-row items-center justify-center gap-8\">\n          {/* Left Side: Cropper */}\n          <div className=\"flex flex-col items-center gap-2\">\n            <ReactCrop\n              aspect={aspectRatio}\n              circularCrop\n              crop={crop}\n              keepSelection\n              minWidth={minDimension}\n              onChange={(_, percentCrop) => setCrop(percentCrop)}\n              onComplete={(c) => setCompletedCrop(c)}\n            >\n              <img\n                ref={imgRef}\n                alt=\"Upload\"\n                src={imgSrc}\n                style={{ maxHeight: \"60vh\" }}\n                onLoad={onImageLoad}\n              />\n            </ReactCrop>\n            <button\n              className=\"border border-gray-300 p-2 text-sm text-gray-600 rounded-lg hover:text-blue-600 transition-colors\"\n              type=\"button\"\n              onClick={reset}\n            >\n              Change Image\n            </button>\n          </div>\n\n          {/* Right Side: Preview & Actions */}\n          <div className=\"flex flex-col items-center gap-4\">\n            <h3 className=\"text-lg font-medium text-gray-700\">Preview</h3>\n            <canvas\n              ref={previewCanvasRef}\n              className=\"rounded-full border\"\n              style={{\n                objectFit: \"contain\",\n                width: Math.min(minDimension, 150),\n                height: Math.min(minDimension, 150),\n              }}\n            />\n            <button\n              className=\"w-full px-4 py-2 text-blue-700 text-[14px] font-medium hover:text-blue-500 disabled:bg-gray-400 transition-all cursor-pointer\"\n              disabled={!completedCrop || isLoading}\n              type=\"button\"\n              onClick={handleCrop}\n            >\n              {isLoading ? \"Cropping...\" : \"Crop & Upload Image\"}\n            </button>\n          </div>\n        </div>\n      )}\n      {error && <p className=\"text-red-500 text-sm mt-2\">{error}</p>}\n    </section>\n  );\n}\n","// hooks/useImageCropper.ts\nimport { useState, useRef, type ChangeEvent, type SyntheticEvent } from \"react\";\nimport { type Crop, centerCrop, makeAspectCrop } from \"react-image-crop\";\n\nexport function useImageCropper(aspectRatio: number = 1) {\n  const [imgSrc, setImgSrc] = useState<string>(\"\");\n  const [crop, setCrop] = useState<Crop>();\n  const [completedCrop, setCompletedCrop] = useState<Crop>();\n  const [error, setError] = useState<string>(\"\");\n  const imgRef = useRef<HTMLImageElement | null>(null);\n  const previewCanvasRef = useRef<HTMLCanvasElement | null>(null);\n\n  const onSelectFile = (e: ChangeEvent<HTMLInputElement>) => {\n    const file = e.target.files?.[0];\n    if (!file) return;\n\n    if (!file.type.startsWith(\"image/\")) {\n      setError(\"Please select a valid image file.\");\n      return;\n    }\n\n    const reader = new FileReader();\n    reader.addEventListener(\"load\", () => {\n      setImgSrc(reader.result?.toString() || \"\");\n      setError(\"\");\n    });\n    reader.readAsDataURL(file);\n  };\n\n  const onImageLoad = (e: SyntheticEvent<HTMLImageElement>) => {\n    imgRef.current = e.currentTarget;\n    const { width, height } = e.currentTarget;\n\n    const crop = centerCrop(\n      makeAspectCrop(\n        {\n          unit: \"%\",\n          width: 90,\n        },\n        aspectRatio,\n        width,\n        height,\n      ),\n      width,\n      height,\n    );\n    setCrop(crop);\n    setCompletedCrop(crop);\n  };\n\n  const reset = () => {\n    setImgSrc(\"\");\n    setCrop(undefined);\n    setCompletedCrop(undefined);\n    setError(\"\");\n  };\n\n  return {\n    imgSrc,\n    crop,\n    setCrop,\n    completedCrop,\n    setCompletedCrop,\n    error,\n    imgRef,\n    previewCanvasRef,\n    onSelectFile,\n    onImageLoad,\n    reset,\n  };\n}\n","// utils/cropUtils.ts\nimport { type Crop } from \"react-image-crop\";\n\nexport async function canvasPreview(\n  image: HTMLImageElement,\n  canvas: HTMLCanvasElement,\n  crop: Crop,\n) {\n  const ctx = canvas.getContext(\"2d\");\n\n  if (!ctx) {\n    throw new Error(\"No 2d context\");\n  }\n\n  const scaleX = image.naturalWidth / image.width;\n  const scaleY = image.naturalHeight / image.height;\n  const pixelRatio = window.devicePixelRatio;\n\n  canvas.width = Math.floor(crop.width * scaleX * pixelRatio);\n  canvas.height = Math.floor(crop.height * scaleY * pixelRatio);\n\n  ctx.scale(pixelRatio, pixelRatio);\n  ctx.imageSmoothingQuality = \"high\";\n\n  const cropX = crop.x * scaleX;\n  const cropY = crop.y * scaleY;\n\n  ctx.save();\n\n  // The live preview will be a circle\n  ctx.beginPath();\n  ctx.arc(\n    canvas.width / (2 * pixelRatio),\n    canvas.height / (2 * pixelRatio),\n    canvas.width / (2 * pixelRatio),\n    0,\n    2 * Math.PI,\n  );\n  ctx.clip();\n\n  ctx.drawImage(\n    image,\n    cropX,\n    cropY,\n    crop.width * scaleX,\n    crop.height * scaleY,\n    0,\n    0,\n    crop.width * scaleX,\n    crop.height * scaleY,\n  );\n\n  ctx.restore();\n}\n\nexport async function getCroppedBlob(\n  image: HTMLImageElement,\n  crop: Crop,\n  fileName: string,\n): Promise<File | null> {\n  const canvas = document.createElement(\"canvas\");\n  const scaleX = image.naturalWidth / image.width;\n  const scaleY = image.naturalHeight / image.height;\n  canvas.width = crop.width * scaleX;\n  canvas.height = crop.height * scaleY;\n  const ctx = canvas.getContext(\"2d\");\n\n  if (!ctx) return null;\n\n  ctx.drawImage(\n    image,\n    crop.x * scaleX,\n    crop.y * scaleY,\n    crop.width * scaleX,\n    crop.height * scaleY,\n    0,\n    0,\n    crop.width * scaleX,\n    crop.height * scaleY,\n  );\n\n  return new Promise((resolve) => {\n    canvas.toBlob(\n      (blob) => {\n        if (!blob) {\n          resolve(null);\n          return;\n        }\n        const file = new File([blob], fileName, { type: \"image/jpeg\" });\n        resolve(file);\n      },\n      \"image/jpeg\",\n      0.95,\n    ); // Use 95% quality for a good balance\n  });\n}\n","// components/ImageModal.tsx\nimport { XMarkIcon } from \"@heroicons/react/24/solid\";\nimport React, { forwardRef } from \"react\";\n\nimport ImageCropper from \"./ImageCropper\";\n\ninterface ImageModalProps {\n  closeModal: () => void;\n  onImageCropped: (file: File) => void;\n}\n\nconst ImageModal = forwardRef<HTMLDivElement, ImageModalProps>(\n  ({ closeModal, onImageCropped }, ref) => {\n    return (\n      <div ref={ref} className=\"relative z-10\">\n        <div className=\"fixed inset-0 transition-all bg-black/30\" />\n        <div className=\"fixed inset-0 z-10 w-screen overflow-y-auto\">\n          <div className=\"flex min-h-full items-center justify-center p-4 text-center\">\n            <div className=\"relative w-full max-w-4xl transform rounded-lg bg-white text-left shadow-xl transition-all\">\n              <button\n                className=\"cursor-pointer rounded-md p-1 inline-flex items-center justify-center text-gray-500 hover:text-gray-700 focus:outline-none absolute top-3 right-3 z-20\"\n                type=\"button\"\n                onClick={closeModal}\n              >\n                <span className=\"sr-only\">Close menu</span>\n                <XMarkIcon className=\"w-6 h-6\" />\n              </button>\n              <ImageCropper\n                onCropComplete={(file) => {\n                  onImageCropped(file);\n                  closeModal();\n                }}\n              />\n            </div>\n          </div>\n        </div>\n      </div>\n    );\n  },\n);\n\nexport default ImageModal;\n","import React, { useState, useEffect } from 'react'\nimport { CameraIcon } from 'lucide-react'\nimport BlankProfileImage from '../../../../assets/images/blank-profile-pic.png'\nimport axios from 'axios'\nimport { useAlert } from '../../../constants/AlertProvider'\nimport Cookies from 'js-cookie'\nimport ImageModal from '../../common/ImageModal'\n\nexport default function EditProfileHeader() {\n    const [profileImage, setProfileImage] = useState(BlankProfileImage)\n    const [name, setName] = useState('')\n    const [title, setTitle] = useState('')\n    const [previewImage, setPreviewImage] = useState(null);\n    const [isModalOpen, setIsModalOpen] = useState(false);\n    const showAlert = useAlert();\n\n    // Fetch user info (name, title, image) on mount\n    useEffect(() => {\n        const fetchProfile = async () => {\n            try {\n                const userId = Cookies.get(\"id\");\n                const res = await axios.get(`/api/users/${userId}/`);\n                setName(res.data.name || 'Jane Cooper');\n                setTitle(res.data.title || 'Software Developer');\n                if (res.data.profile_picture) {\n                    setPreviewImage(res.data.profile_picture);\n                    setProfileImage(res.data.profile_picture);\n                }\n            } catch (e) {\n                showAlert(\"Failed to load profile info\", \"error\");\n            }\n        }\n        fetchProfile();\n    }, []);\n\n    const handleImageCropped = async (croppedFile) => {\n        setPreviewImage(URL.createObjectURL(croppedFile));\n        setIsModalOpen(false);\n\n        const userId = Cookies.get(\"id\");\n        const csrfToken = Cookies.get(\"csrftoken\");\n        try {\n            const formData = new FormData();\n            formData.append(\"profile_picture\", croppedFile);\n\n            await axios.patch(\n                `/api/users/${userId}/`,\n                formData,\n                {\n                    headers: {\n                        \"Content-Type\": \"multipart/form-data\",\n                        \"X-CSRFToken\": csrfToken,\n                    },\n                    withCredentials: true,\n                }\n            );\n            showAlert(\"Profile image updated\", \"success\");\n        } catch (e) {\n            showAlert(\"Failed to upload image\", \"error\");\n        }\n    };\n\n    const toggleModal = () => {\n        setIsModalOpen(!isModalOpen);\n    }\n\n    return (\n        <div className=\"bg-white rounded-lg shadow-sm border border-gray-200\">\n            <div className=\"h-32 bg-gradient-to-r from-blue-300 to-blue-600\"></div>\n            <div className=\"px-6 pb-6 relative\">\n                <div className=\"absolute -top-24 flex items-end\">\n                    <div className=\"relative\">\n                        <div className=\"inline-block p-[4px] bg-gradient-to-r from-blue-300 via-indigo-400 to-purple-500 rounded-full\">\n                            <img\n                                src={previewImage || profileImage}\n                                alt=\"Profile\"\n                                className=\"w-32 h-32 rounded-full object-cover bg-white\"\n                            />\n                        </div>\n                        <div className=\"absolute bottom-0 right-0\">\n                            <button\n                                type=\"button\"\n                                onClick={toggleModal}\n                                className=\"flex items-center justify-center w-10 h-10 rounded-full bg-blue-600 hover:bg-blue-700 cursor-pointer border-2 border-white\"\n                            >\n                                <CameraIcon size={18} className=\"text-white\" />\n                            </button>\n                            {isModalOpen && (\n                                <ImageModal\n                                    closeModal={toggleModal}\n                                    onImageCropped={handleImageCropped}\n                                />\n                            )}\n                        </div>\n                    </div>\n                    <div className=\"ml-4\">\n                        <h2 className=\"text-xl font-bold text-gray-800\">{name}</h2>\n                        <p className=\"text-gray-500\">{title}</p>\n                    </div>\n                </div>\n            </div>\n        </div>\n    )\n}","import React, { useState, useEffect } from 'react'\nimport axios from 'axios'\nimport { useAlert } from '../../../constants/AlertProvider'\nimport Cookies from 'js-cookie'\nimport { Country, State, City } from \"country-state-city\";\nimport { AtSignIcon, PhoneIcon, MapPinIcon, UserIcon } from 'lucide-react'\n\nexport default function EditPersonalInfo({ address, setAddress }) {\n    const [countries] = useState(Country.getAllCountries());\n    const [states, setStates] = useState([]);\n    const [cities, setCities] = useState([]);\n    const [street, setStreet] = useState(\"\");\n    const [zip, setZip] = useState(\"\");\n    const [selectedCountry, setSelectedCountry] = useState(null);\n    const [selectedState, setSelectedState] = useState(null);\n    const [selectedCity, setSelectedCity] = useState(\"\");\n    const [userInfo, setUserInfo] = useState({\n        name: '',\n        email: '',\n        phone_number: '',\n        address: '',\n    })\n    const showAlert = useAlert();\n\n    // Fetch user info on mount\n    useEffect(() => {\n        const fetchPersonalInfo = async () => {\n            try {\n                const userId = Cookies.get(\"id\");\n                const res = await axios.get(`/api/users/${userId}/`);\n                setUserInfo({\n                    name: res.data.name || '',\n                    email: res.data.email || '',\n                    phone_number: res.data.phone_number || '',\n                    address: res.data.address || '',\n                });\n\n                // Parse address into fields if present\n                if (res.data.address) {\n                    const parts = res.data.address.split(\", \");\n                    if (parts.length >= 4) {\n                        setStreet(parts[0]);\n                        setZip(parts[parts.length - 1]);\n                        const city = parts[parts.length - 3];\n                        const stateName = parts[parts.length - 2];\n                        setSelectedCity(city);\n\n                        // Find country and state objects\n                        const country = countries.find((c) =>\n                            State.getStatesOfCountry(c.isoCode).some((s) => s.name === stateName)\n                        );\n                        if (country) {\n                            setSelectedCountry(country);\n                            const stateList = State.getStatesOfCountry(country.isoCode);\n                            setStates(stateList);\n                            const state = stateList.find((s) => s.name === stateName);\n                            if (state) {\n                                setSelectedState(state);\n                                setCities(City.getCitiesOfState(country.isoCode, state.isoCode));\n                            }\n                        }\n                    }\n                }\n            } catch (e) {\n                showAlert(\"Failed to load personal info\", \"error\");\n                console.error(\"Failed to load personal info\", e);\n            }\n        }\n        fetchPersonalInfo();\n        // eslint-disable-next-line\n    }, []);\n\n    useEffect(() => {\n        if (street && selectedCity && selectedState && zip && selectedCountry) {\n            const fullAddress = `${street}, ${selectedCity}, ${selectedState.name}, ${zip}`;\n            setAddress(fullAddress); // <-- Only update local state, not backend\n        }\n        // eslint-disable-next-line\n    }, [street, selectedCity, selectedState, zip, selectedCountry]);\n\n    // Update user info field (except address)\n    const updateUserInfo = async (field, value) => {\n        const userId = Cookies.get(\"id\");\n        setUserInfo(prev => ({ ...prev, [field]: value }));\n        try {\n            await axios.patch(\n                `/api/users/${userId}/`,\n                { [field]: value },\n                {\n                    headers: {\n                        'Content-Type': 'application/json',\n                        'X-CSRFToken': Cookies.get('csrftoken'),\n                    },\n                    withCredentials: true,\n                }\n            );\n            showAlert(\"Personal info updated\", \"success\");\n        } catch (e) {\n            showAlert(\"Failed to update personal info\", \"error\");\n        }\n    };\n\n    // Handlers for country/state/city changes\n    const handleCountryChange = (isoCode) => {\n        const country = countries.find((c) => c.isoCode === isoCode);\n        setSelectedCountry(country);\n        const stateList = State.getStatesOfCountry(isoCode);\n        setStates(stateList);\n        setSelectedState(null);\n        setCities([]);\n        setSelectedCity(\"\");\n    };\n\n    const handleStateChange = (isoCode) => {\n        const state = states.find((s) => s.isoCode === isoCode);\n        setSelectedState(state);\n        if (selectedCountry) {\n            setCities(City.getCitiesOfState(selectedCountry.isoCode, isoCode));\n        } else {\n            setCities([]);\n        }\n        setSelectedCity(\"\");\n    };\n\n    return (\n        <div className=\"grid grid-cols-1 md:grid-cols-2 gap-6\">\n            <div>\n                <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n                    Full Name\n                </label>\n                <div className=\"relative\">\n                    <div className=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\n                        <UserIcon size={18} className=\"text-gray-400\" />\n                    </div>\n                    <input\n                        type=\"text\"\n                        value={userInfo.name}\n                        className=\"block w-full pl-10 pr-3 py-2 border border-gray-300 rounded-full shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500\"\n                        onChange={e => updateUserInfo('name', e.target.value)}\n                    />\n                </div>\n            </div>\n            <div>\n                <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n                    Email Address\n                </label>\n                <div className=\"relative\">\n                    <div className=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\n                        <AtSignIcon size={18} className=\"text-gray-400\" />\n                    </div>\n                    <input\n                        type=\"email\"\n                        value={userInfo.email}\n                        className=\"block w-full pl-10 pr-3 py-2 border border-gray-300 rounded-full shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500\"\n                        onChange={e => updateUserInfo('email', e.target.value)}\n                        disabled\n                    />\n                </div>\n            </div>\n            <div>\n                <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n                    Phone Number\n                </label>\n                <div className=\"relative\">\n                    <div className=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\n                        <PhoneIcon size={18} className=\"text-gray-400\" />\n                    </div>\n                    <input\n                        type=\"tel\"\n                        value={userInfo.phone_number}\n                        className=\"block w-full pl-10 pr-3 py-2 border border-gray-300 rounded-full shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500\"\n                        onChange={e => updateUserInfo('phone_number', e.target.value)}\n                    />\n                </div>\n            </div>\n            <div>\n                <label className=\"text-sm font-medium text-gray-700\">Street Address</label>\n                <div className=\"relative\">\n                    <div className=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\n                        <MapPinIcon size={18} className=\"text-gray-400\" />\n                    </div>\n                    <input\n                        type=\"text\"\n                        value={street}\n                        onChange={(e) => setStreet(e.target.value)}\n                        placeholder=\"Enter street address\"\n                        className=\"block w-full pl-10 pr-3 py-2 border border-gray-300 rounded-full shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500\"\n                    />\n                </div>\n            </div>\n            {/* Country */}\n            <div>\n                <label className=\"text-sm font-medium text-gray-700\">Country</label>\n                <select\n                    value={selectedCountry?.isoCode || \"\"}\n                    onChange={(e) => handleCountryChange(e.target.value)}\n                    className=\"block w-full pl-3 pr-3 py-2 border border-gray-300 rounded-full shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500\"\n                >\n                    <option value=\"\">Select a country</option>\n                    {countries.map((country) => (\n                        <option key={country.isoCode} value={country.isoCode}>\n                            {country.name}\n                        </option>\n                    ))}\n                </select>\n            </div>\n            {/* State, City, ZIP */}\n            <div className=\"grid grid-cols-1 sm:grid-cols-3 gap-4\">\n                <div>\n                    <label className=\"text-sm font-medium text-gray-700\">State</label>\n                    <select\n                        value={selectedState?.isoCode || \"\"}\n                        onChange={(e) => handleStateChange(e.target.value)}\n                        disabled={!selectedCountry}\n                        className=\"block w-full pl-3 pr-3 py-2 border border-gray-300 rounded-full shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500\"\n                    >\n                        <option value=\"\">Select a state</option>\n                        {states.map((state) => (\n                            <option key={state.isoCode} value={state.isoCode}>\n                                {state.name}\n                            </option>\n                        ))}\n                    </select>\n                </div>\n                <div>\n                    <label className=\"text-sm font-medium text-gray-700\">City</label>\n                    <select\n                        value={selectedCity}\n                        onChange={(e) => setSelectedCity(e.target.value)}\n                        disabled={!selectedState}\n                        className=\"block w-full pl-3 pr-3 py-2 border border-gray-300 rounded-full shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500\"\n                    >\n                        <option value=\"\">Select a city</option>\n                        {cities.map((city) => (\n                            <option key={city.name} value={city.name}>\n                                {city.name}\n                            </option>\n                        ))}\n                    </select>\n                </div>\n                <div>\n                    <label className=\"text-sm font-medium text-gray-700\">ZIP / Postal Code</label>\n                    <input\n                        type=\"text\"\n                        value={zip}\n                        onChange={(e) => setZip(e.target.value)}\n                        placeholder=\"Enter ZIP code\"\n                        className=\"block w-full pl-3 pr-3 py-2 border border-gray-300 rounded-full shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500\"\n                    />\n                </div>\n            </div>\n        </div>\n    )\n}","import React, { useState, useEffect } from 'react'\nimport { PlusCircleIcon, TrashIcon, GraduationCapIcon } from 'lucide-react'\nimport { ApiService } from '../../../api/services.gen'\nimport { useAlert } from '../../../constants/AlertProvider'\n\nexport default function EditEducation({ applicationId }) {\n    const [educationList, setEducationList] = useState([])\n    const showAlert = useAlert();\n\n    // Fetch existing education\n    useEffect(() => {\n        const fetchEducation = async () => {\n            if (!applicationId) return\n            try {\n                const res = await ApiService.apiEducationList({ application: applicationId })\n                setEducationList(res.results || res)\n            } catch (e) {\n                showAlert(\"Failed to load education\", \"error\");\n            }\n        }\n        fetchEducation()\n    }, [applicationId])\n\n    // POST: Add new experience\n    const addEducation = async () => {\n        if (educationList.length >= 2) {\n            showAlert(\"Only 2 education can be added\", \"error\");\n            return;\n        }\n        const newEdu = {\n            institution: \"Institution name\",\n            degree: \"Degree\",\n            field_of_study: \"Major\",\n            start_date: \"2020-10-10\",\n            end_date: \"2024-10-10\",\n            application: applicationId,\n        }\n        try {\n            const res = await ApiService.apiEducationCreate({ requestBody: newEdu })\n            setEducationList([...educationList, res])\n        } catch (error) {\n            showAlert(\"Failed to add education\", \"error\");\n            console.log(\"Failed to add education\", error);\n        }\n    }\n\n    // PATCH: Update education\n    const updateEducation = async (id, field, value) => {\n        setEducationList(\n            educationList.map((edu) =>\n                edu.id === id ? { ...edu, [field]: value } : edu\n            )\n        )\n        try {\n            const edu = educationList.find((edu) => edu.id === id)\n            await ApiService.apiEducationPartialUpdate({\n                id,\n                requestBody: { ...edu, [field]: value },\n            })\n        } catch (e) {\n            showAlert(\"Failed to update education\", \"error\");\n        }\n    }\n\n    // DELETE: Remove education\n    const removeEducation = async (id) => {\n        setEducationList(educationList.filter((edu) => edu.id !== id))\n        try {\n            await ApiService.apiEducationDestroy({ id })\n        } catch (e) {\n            showAlert(\"Failed to delete education\", \"error\");\n        }\n    }\n    return (\n        <div className=\"space-y-6\">\n            {educationList.map((education, index) => (\n                <div\n                    key={education.id}\n                    className=\"pt-4 first:pt-0 border-t first:border-t-0 border-gray-200\"\n                >\n                    {index > 0 && (\n                        <div className=\"flex justify-end mb-2\">\n                            <button\n                                onClick={() => removeEducation(education.id)}\n                                className=\"text-sm text-red-600 hover:text-red-800 flex items-center gap-1\"\n                            >\n                                <TrashIcon size={16} />\n                                Remove\n                            </button>\n                        </div>\n                    )}\n                    <div className=\"grid grid-cols-1 md:grid-cols-2 gap-6\">\n                        <div className=\"md:col-span-2\">\n                            <label\n                                htmlFor={`institution-${education.id}`}\n                                className=\"block text-sm font-medium text-gray-700 mb-1\"\n                            >\n                                School / University\n                            </label>\n                            <div className=\"relative\">\n                                <div className=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\n                                    <GraduationCapIcon size={18} className=\"text-gray-400\" />\n                                </div>\n                                <input\n                                    type=\"text\"\n                                    id={`institution-${education.id}`}\n                                    value={education.institution}\n                                    onChange={(e) =>\n                                        updateEducation(education.id, 'institution', e.target.value)\n                                    }\n                                    className=\"block w-full pl-10 pr-3 py-2 border border-gray-300 rounded-full shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500\"\n                                />\n                            </div>\n                        </div>\n                        <div>\n                            <label\n                                htmlFor={`degree-${education.id}`}\n                                className=\"block text-sm font-medium text-gray-700 mb-1\"\n                            >\n                                Degree\n                            </label>\n                            <input\n                                type=\"text\"\n                                id={`degree-${education.id}`}\n                                value={education.degree}\n                                onChange={(e) =>\n                                    updateEducation(education.id, 'degree', e.target.value)\n                                }\n                                className=\"block w-full px-3 py-2 border border-gray-300 rounded-full shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500\"\n                            />\n                        </div>\n                        <div>\n                            <label\n                                htmlFor={`field_of_study-${education.id}`}\n                                className=\"block text-sm font-medium text-gray-700 mb-1\"\n                            >\n                                Field of Study\n                            </label>\n                            <input\n                                type=\"text\"\n                                id={`field_of_study-${education.id}`}\n                                value={education.field_of_study}\n                                onChange={(e) =>\n                                    updateEducation(education.id, 'field_of_study', e.target.value)\n                                }\n                                className=\"block w-full px-3 py-2 border border-gray-300 rounded-full shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500\"\n                            />\n                        </div>\n                        <div>\n                            <label\n                                htmlFor={`start_date-${education.id}`}\n                                className=\"block text-sm font-medium text-gray-700 mb-1\"\n                            >\n                                Start Date\n                            </label>\n                            <input\n                                type=\"date\"\n                                id={`start_date-${education.id}`}\n                                value={education.start_date}\n                                onChange={(e) =>\n                                    updateEducation(education.id, 'start_date', e.target.value)\n                                }\n                                className=\"block w-full px-3 py-2 border border-gray-300 rounded-full shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500\"\n                            />\n                        </div>\n                        <div>\n                            <label\n                                htmlFor={`end_date-${education.id}`}\n                                className=\"block text-sm font-medium text-gray-700 mb-1\"\n                            >\n                                End Date (or Expected)\n                            </label>\n                            <input\n                                type=\"date\"\n                                id={`end_date-${education.id}`}\n                                value={education.end_date}\n                                onChange={(e) =>\n                                    updateEducation(education.id, 'end_date', e.target.value)\n                                }\n                                className=\"block w-full px-3 py-2 border border-gray-300 rounded-full shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500\"\n                            />\n                        </div>\n                    </div>\n                </div>\n            ))}\n            <div className=\"pt-4\">\n                <button\n                    type=\"button\"\n                    onClick={addEducation}\n                    className=\"flex items-center text-blue-600 hover:text-blue-800\"\n                >\n                    <PlusCircleIcon size={20} className=\"mr-1\" />\n                    Add Education\n                </button>\n            </div>\n        </div>\n    )\n}\n","import React, { useState, useEffect } from 'react'\nimport { XIcon } from 'lucide-react'\nimport { ApiService } from '../../../api/services.gen'\nimport { useAlert } from '../../../constants/AlertProvider'\n\nexport default function EditSkills({ applicationId }) {\n    const [skills, setSkills] = useState([])\n    const [allSkills, setAllSkills] = useState([])\n    const [selectedSkill, setSelectedSkill] = useState('')\n    const [newSkillScore, setNewSkillScore] = useState(5)\n    const [search, setSearch] = useState('')\n    const showAlert = useAlert();\n\n    // Fetch user's skills\n    useEffect(() => {\n        const fetchUserSkills = async () => {\n            try {\n                const res = await ApiService.apiSkillList({ application: applicationId })\n                setSkills(res.results || [])\n            } catch (e) {\n                showAlert(\"Error fetching skills\", \"error\");\n            }\n        }\n        fetchUserSkills()\n    }, [applicationId])\n\n    // Fetch all available skills\n    useEffect(() => {\n        const fetchAllSkills = async () => {\n            try {\n                const res = await ApiService.apiMatchingSkillsList({ limit: 1000 })\n                setAllSkills(res.results || res)\n            } catch (e) {\n                setAllSkills([])\n                showAlert(\"Error fetching skills\", \"error\");\n            }\n        }\n        fetchAllSkills()\n    }, [])\n\n    // Add skill\n    const addSkill = async (e) => {\n        e.preventDefault()\n        if (!selectedSkill || skills.some(s => s.id === Number(selectedSkill))) return\n        try {\n            const res = await ApiService.apiSkillCreate({\n                requestBody: {\n                    application: applicationId,\n                    name: selectedSkill.name,\n                    score: newSkillScore,\n                }\n            })\n            setSkills([...skills, res])\n            setSelectedSkill('')\n            setNewSkillScore(5)\n            setSearch('')\n            showAlert(\"Skill added successfully\", \"success\");\n        } catch (e) {\n            showAlert(\"Error adding skills\", \"error\");\n            console.error(e)\n        }\n    }\n\n    // Remove skill\n    const removeSkill = async (skillId) => {\n        try {\n            await ApiService.apiSkillDestroy({ id: skillId })\n            setSkills(skills.filter((s) => s.id !== skillId))\n        } catch (e) {\n            console.error(e)\n        }\n    }\n\n    // const updateSkill = async (skillId, field, value) => {\n    //     try {\n    //         // Update on backend\n    //         await ApiService.apiSkillPartialUpdate({\n    //             id: skillId,\n    //             requestBody: { [field]: value }\n    //         });\n    //         // Update in local state\n    //         setSkills(skills =>\n    //             skills.map(skill =>\n    //                 skill.id === skillId ? { ...skill, [field]: value } : skill\n    //             )\n    //         );\n    //     } catch (e) {\n    //         console.error(e);\n    //     }\n    // };\n\n    const filteredSkills = allSkills\n        .filter(skill => !skills.some(s => s.name === skill.name))\n        .filter(skill => skill.name.toLowerCase().includes(search.toLowerCase()));\n\n    return (\n        <div>\n            <div className=\"flex flex-wrap gap-2 mb-4\">\n                {skills.map((skill) => (\n                    <div\n                        key={skill.id}\n                        className=\"flex flex-col items-start bg-blue-100 text-blue-800 px-3 py-1 rounded-full text-sm mb-2\"\n                    >\n                        <div className=\"flex items-center\">\n                            {skill.name}\n                            <button\n                                type=\"button\"\n                                onClick={() => removeSkill(skill.id)}\n                                className=\"ml-1 text-blue-600 hover:text-blue-800 focus:outline-none\"\n                            >\n                                <XIcon size={16} />\n                            </button>\n                        </div>\n                    </div>\n                ))}\n            </div>\n            <form onSubmit={addSkill} className=\"flex flex-col gap-y-2\">\n                <input\n                    type=\"text\"\n                    placeholder=\"Search skills...\"\n                    value={search}\n                    onChange={e => {\n                        setSearch(e.target.value)\n                        setSelectedSkill('')\n                    }}\n                    className=\"block px-3 py-2 border border-gray-300 rounded-full shadow-sm focus:ring-blue-500 focus:border-blue-500\"\n                />\n                <div className=\"max-h-48 overflow-y-auto border border-gray-200 rounded-lg bg-white shadow-sm mt-1 mb-2\">\n                    {filteredSkills.length === 0 && (\n                        <div className=\"p-2 text-gray-400 text-sm\">No skills found</div>\n                    )}\n                    {filteredSkills.map(skill => (\n                        <div\n                            key={skill.id}\n                            className={`px-3 py-2 cursor-pointer hover:bg-blue-100 ${selectedSkill && selectedSkill.id === skill.id ? 'bg-blue-200' : ''}`}\n                            onClick={() => setSelectedSkill(skill)}\n                        >\n                            {skill.name}\n                        </div>\n                    ))}\n                </div>\n                {selectedSkill && (\n                    <div className=\"flex flex-col items-center mt-2 mb-2\">\n                        <label className=\"text-md font-medium text-gray-700\">\n                            Proficiency: <span className=\"text-blue-600 font-semibold\">{newSkillScore}</span>/10\n                        </label>\n                        <input\n                            type=\"range\"\n                            min={0}\n                            max={10}\n                            value={newSkillScore}\n                            onChange={e => setNewSkillScore(Number(e.target.value))}\n                            className=\"w-full h-2 bg-blue-100 rounded-lg appearance-none cursor-pointer accent-blue-500 hover:bg-blue-200 transition-all duration-200\"\n                        />\n                    </div>\n                )}\n                <div className='flex justify-end'>\n                <button\n                    type=\"submit\"\n                    disabled={!selectedSkill}\n                    className=\"bg-blue-600 hover:bg-blue-700 text-white px-4 py-2 rounded-full disabled:bg-blue-300\"\n                >\n                    Add\n                </button>\n                </div>\n            </form>\n            <div className=\"mt-4 text-sm text-gray-500\">\n                Add skills that showcase your abilities and make you stand out to\n                employers.\n            </div>\n        </div>\n    )\n}","import React, { useState, useEffect } from 'react'\nimport { PlusCircleIcon, TrashIcon, BriefcaseIcon } from 'lucide-react'\nimport { ApiService } from '../../../api/services.gen'\nimport { useAlert } from '../../../constants/AlertProvider'\n\nexport default function EditWorkExp({ applicationId }) {\n    const [experiences, setExperiences] = useState([])\n    const showAlert = useAlert();\n\n    // Fetch existing experiences\n    useEffect(() => {\n        const fetchExperiences = async () => {\n            if (!applicationId) return\n            try {\n                const res = await ApiService.apiExperienceList({ application: applicationId })\n                setExperiences(res.results || res)\n            } catch (e) {\n                showAlert(\"Failed to load experiences\", \"error\");\n            }\n        }\n        fetchExperiences()\n    }, [applicationId])\n\n    // POST: Add new experience\n    const addExperience = async () => {\n        if (experiences.length >= 3) {\n            showAlert(\"Only 3 experiences can be added\", \"error\");\n            return;\n        }\n        const newExp = {\n            company: 'Company Name',\n            duration: 'Software Engineer',\n            city: 'City',\n            state: 'State',\n            country: 'Country',\n            is_remote: false,\n            start_date: '2023-01-01',\n            end_date: '2023-01-01',\n            responsibilities: 'Job responsibilities',\n            application: applicationId,\n        }\n        try {\n            const res = await ApiService.apiExperienceCreate({ requestBody: newExp })\n            setExperiences([...experiences, res])\n        } catch (error) {\n            showAlert(\"Failed to add experiences\", \"error\");\n            console.log(\"Failed to add experiences\", error);\n        }\n    }\n\n    // PATCH: Update experience\n    const updateExperience = async (id, field, value) => {\n        // Optimistically update the UI\n        setExperiences(\n            experiences.map((exp) =>\n                exp.id === id ? { ...exp, [field]: value } : exp\n            )\n        );\n        try {\n            // Send only the updated field to the backend to avoid race conditions\n            await ApiService.apiExperiencePartialUpdate({\n                id,\n                requestBody: { [field]: value },\n            });\n        } catch (e) {\n            showAlert(\"Failed to update experiences\", \"error\");\n        }\n    }\n\n    // DELETE: Remove experience\n    const removeExperience = async (id) => {\n        setExperiences(experiences.filter((exp) => exp.id !== id))\n        try {\n            await ApiService.apiExperienceDestroy({ id })\n        } catch (e) {\n            showAlert(\"Failed to delete experiences\", \"error\");\n        }\n    }\n\n    return (\n        <div className=\"space-y-8\">\n            {experiences.map((experience, index) => (\n                <div\n                    key={experience.id}\n                    className=\"pt-6 first:pt-0 border-t first:border-t-0 border-gray-200\"\n                >\n                    <div className=\"flex justify-between items-center mb-4\">\n                        <h3 className=\"text-lg font-medium text-gray-800\">\n                            Experience {index + 1}\n                        </h3>\n                        {index > 0 && (\n                            <button\n                                onClick={() => removeExperience(experience.id)}\n                                className=\"text-sm text-red-600 hover:text-red-800 flex items-center gap-1\"\n                            >\n                                <TrashIcon size={16} />\n                                Remove\n                            </button>\n                        )}\n                    </div>\n                    <div className=\"grid grid-cols-1 md:grid-cols-2 gap-6\">\n                        <div>\n                            <label\n                                htmlFor={`title-${experience.id}`}\n                                className=\"block text-sm font-medium text-gray-700 mb-1\"\n                            >\n                                Job Title\n                            </label>\n                            <div className=\"relative\">\n                                <div className=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\n                                    <BriefcaseIcon size={18} className=\"text-gray-400\" />\n                                </div>\n                                <input\n                                    type=\"text\"\n                                    id={`title-${experience.id}`}\n                                    value={experience.duration}\n                                    onChange={(e) =>\n                                        updateExperience(experience.id, 'duration', e.target.value)\n                                    }\n                                    className=\"block w-full pl-10 pr-3 py-2 border border-gray-300 rounded-full shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500\"\n                                    placeholder='Software Engineer'\n                                />\n                            </div>\n                        </div>\n                        <div>\n                            <label\n                                htmlFor={`company-${experience.id}`}\n                                className=\"block text-sm font-medium text-gray-700 mb-1\"\n                            >\n                                Company\n                            </label>\n                            <input\n                                type=\"text\"\n                                id={`company-${experience.id}`}\n                                value={experience.company}\n                                onChange={(e) =>\n                                    updateExperience(experience.id, 'company', e.target.value)\n                                }\n                                className=\"block w-full px-3 py-2 border border-gray-300 rounded-full shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500\"\n                                placeholder='TechCorp Ltd.'\n                            />\n                        </div>\n                        <div>\n                            <label\n                                htmlFor={`city-${experience.id}`}\n                                className=\"block text-sm font-medium text-gray-700 mb-1\"\n                            >\n                                City\n                            </label>\n                            <input\n                                type=\"text\"\n                                id={`city-${experience.id}`}\n                                value={experience.city}\n                                onChange={(e) =>\n                                    updateExperience(experience.id, 'city', e.target.value)\n                                }\n                                className=\"block w-full px-3 py-2 border border-gray-300 rounded-full shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500\"\n                            />\n                        </div>\n                        <div>\n                            <label\n                                htmlFor={`state-${experience.id}`}\n                                className=\"block text-sm font-medium text-gray-700 mb-1\"\n                            >\n                                State\n                            </label>\n                            <input\n                                type=\"text\"\n                                id={`state-${experience.id}`}\n                                value={experience.state}\n                                onChange={(e) =>\n                                    updateExperience(experience.id, 'state', e.target.value)\n                                }\n                                className=\"block w-full px-3 py-2 border border-gray-300 rounded-full shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500\"\n                            />\n                        </div>\n                        <div>\n                            <label\n                                htmlFor={`country-${experience.id}`}\n                                className=\"block text-sm font-medium text-gray-700 mb-1\"\n                            >\n                                Country\n                            </label>\n                            <input\n                                type=\"text\"\n                                id={`country-${experience.id}`}\n                                value={experience.country}\n                                onChange={(e) =>\n                                    updateExperience(experience.id, 'country', e.target.value)\n                                }\n                                className=\"block w-full px-3 py-2 border border-gray-300 rounded-full shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500\"\n                            />\n                        </div>\n                        <div>\n                            <label\n                                htmlFor={`startDate-${experience.id}`}\n                                className=\"block text-sm font-medium text-gray-700 mb-1\"\n                            >\n                                Start Date\n                            </label>\n                            <input\n                                type=\"date\"\n                                id={`startDate-${experience.id}`}\n                                value={experience.start_date}\n                                onChange={(e) =>\n                                    updateExperience(experience.id, 'start_date', e.target.value)\n                                }\n                                className=\"block w-full px-3 py-2 border border-gray-300 rounded-full shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500\"\n                            />\n                        </div>\n                        <div className=\"relative\">\n                            <label\n                                htmlFor={`endDate-${experience.id}`}\n                                className=\"block text-sm font-medium text-gray-700 mb-1\"\n                            >\n                                End Date\n                            </label>\n                            <input\n                                type=\"date\"\n                                id={`endDate-${experience.id}`}\n                                value={experience.end_date}\n                                onChange={(e) =>\n                                    updateExperience(experience.id, 'end_date', e.target.value)\n                                }\n                                className={`block w-full px-3 py-2 border border-gray-300 rounded-full shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 ${experience.current ? 'bg-gray-100' : ''}`}\n                            />\n                        </div>\n                        <div>\n                            <div className=\"flex items-center mt-6\">\n                                <input\n                                    id={`is_remote-${experience.id}`}\n                                    type=\"checkbox\"\n                                    checked={experience.is_remote}\n                                    onChange={(e) => {\n                                        updateExperience(experience.id, 'is_remote', e.target.checked)\n                                        if (e.target.checked) {\n                                            updateExperience(experience.id, 'endDate', '')\n                                        }\n                                    }}\n                                    className=\"h-4 w-4 text-blue-600 focus:ring-blue-500 border-gray-300 rounded\"\n                                />\n                                <label\n                                    htmlFor={`is_remote-${experience.id}`}\n                                    className=\"ml-2 block text-sm text-gray-700\"\n                                >\n                                    This is a Remote Position\n                                </label>\n                            </div>\n                        </div>\n                        <div className=\"md:col-span-2\">\n                            <label\n                                htmlFor={`description-${experience.id}`}\n                                className=\"block text-sm font-medium text-gray-700 mb-1\"\n                            >\n                                Responsibilities\n                            </label>\n                            <textarea\n                                id={`responsibilities-${experience.id}`}\n                                rows={4}\n                                value={experience.responsibilities}\n                                onChange={(e) =>\n                                    updateExperience(experience.id, 'responsibilities', e.target.value)\n                                }\n                                className=\"block w-full px-6 py-4 border border-gray-300 rounded-full shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500\"\n                                placeholder=\"Describe your responsibilities and achievements\"\n                            />\n                        </div>\n                    </div>\n                </div>\n            ))}\n            <div className=\"pt-4\">\n                <button\n                    type=\"button\"\n                    onClick={addExperience}\n                    // disabled={experiences.length >= 3}\n                    className=\"flex items-center text-blue-600 hover:text-blue-800\"\n                >\n                    <PlusCircleIcon size={20} className=\"mr-1\" />\n                    Add Work Experience\n                </button>\n            </div>\n        </div>\n    )\n}\n","import React, { useEffect, useState } from 'react'\nimport EditProfileHeader from './EditProfileHeader'\nimport EditPersonalInfo from './EditPersonalInfo'\nimport EditEducation from './EditEducation'\nimport EditSkills from './EditSkills'\nimport EditWorkExp from './EditWorkExp'\nimport axios from 'axios'\nimport Cookies from 'js-cookie'\nimport { useNavigate } from 'react-router-dom'\nimport { useAlert } from '../../../constants/AlertProvider'\nimport { CheckCircleIcon, ArrowLeftIcon } from '@heroicons/react/24/solid'\n\nexport default function EditProfile() {\n    const [applicationId, setApplicationId] = useState(\"\");\n    const [saveStatus, setSaveStatus] = useState(null);\n    const [address, setAddress] = useState(\"\");\n    const [isScrolled, setIsScrolled] = useState(false);\n    const navigate = useNavigate();\n\n    useEffect(() => {\n        const handleScroll = () => {\n            setIsScrolled(window.scrollY > 50);\n        };\n        window.addEventListener(\"scroll\", handleScroll);\n        return () => window.removeEventListener(\"scroll\", handleScroll);\n    }, []);\n\n    const handleSave = async () => {\n        setSaveStatus('saving');\n        try {\n            const userId = Cookies.get(\"id\");\n            await axios.patch(\n                `/api/users/${userId}/`,\n                { address },\n                {\n                    headers: {\n                        'Content-Type': 'application/json',\n                        'X-CSRFToken': Cookies.get('csrftoken'),\n                    },\n                    withCredentials: true,\n                }\n            );\n            setSaveStatus('saved');\n            showAlert(\"Profile saved!\", \"success\");\n            setTimeout(() => setSaveStatus(null), 3000);\n        } catch (e) {\n            setSaveStatus(null);\n            showAlert(\"Failed to save profile\", \"error\");\n        }\n    };\n    const showAlert = useAlert();\n\n    useEffect(() => {\n        const fetchApplicationId = async () => {\n            const userId = Cookies.get(\"id\");\n            try {\n                const userRes = await axios.get(`/api/users/${userId}/`, { withCredentials: true });\n                const appIds = userRes.data.applicationids;\n                if (appIds && appIds.length > 0) {\n                    setApplicationId(appIds[0].id);\n                }\n            } catch (error) {\n                showAlert(\"Failed to fetch data\", \"error\");\n                console.log(error);\n            }\n        }\n        fetchApplicationId();\n    }, []);\n\n    return (\n        <div className=\"max-w-4xl mx-auto px-4 py-8 gap-y-4\">\n            <div className={`border-b border-b-gray-300 fixed top-0 left-0 right-0 z-50 flex justify-between items-center h-16 px-4 sm:px-6 lg:px-8 transition-all duration-300 ${isScrolled\n                ? \"bg-gray-300/20 backdrop-blur-md shadow-lg w-11/12 mx-auto rounded-b-xl\"\n                : \"bg-white w-full\"\n                }`}>\n                <h1 className=\"text-2xl font-bold text-gray-800\">Edit Profile</h1>\n                <div className='flex flex-row gap-x-2'>\n                    <button\n                        onClick={handleSave}\n                        disabled={saveStatus === 'saving'}\n                        className=\"flex items-center gap-2 bg-blue-600 hover:bg-blue-700 text-white px-4 py-2 rounded-full transition-colors disabled:bg-blue-400\"\n                    >\n                        {saveStatus === 'saving' ? (\n                            'Saving...'\n                        ) : saveStatus === 'saved' ? (\n                            <>\n                                <CheckCircleIcon className=\"w-5 h-5\" />\n                                Saved\n                            </>\n                        ) : (\n                            'Save Changes'\n                        )}\n                    </button>\n\n                    <button\n                        onClick={() => navigate(-1)}\n                        className=\"flex items-center gap-2 bg-gray-200 hover:bg-gray-300 text-gray-800 px-4 py-2 rounded-full transition-colors\"\n                    >\n                        <ArrowLeftIcon className=\"w-5 h-5\" />\n                        Go back\n                    </button>\n                </div>\n            </div>\n            <div className=\"space-y-6\">\n                <EditProfileHeader />\n                <div className=\"bg-white rounded-lg shadow-sm border border-gray-200 overflow-hidden\">\n                    <div className=\"px-6 py-4 bg-gray-50 border-b border-gray-200\">\n                        <h2 className=\"text-lg font-medium text-gray-800\">\n                            Personal Information\n                        </h2>\n                    </div>\n                    <div className=\"p-6\">\n                        <EditPersonalInfo address={address} setAddress={setAddress} />\n                    </div>\n                </div>\n                <div className=\"bg-white rounded-lg shadow-sm border border-gray-200 overflow-hidden\">\n                    <div className=\"px-6 py-4 bg-gray-50 border-b border-gray-200\">\n                        <h2 className=\"text-lg font-medium text-gray-800\">Education</h2>\n                    </div>\n                    <div className=\"p-6\">\n                        <EditEducation applicationId={applicationId} />\n                    </div>\n                </div>\n                <div className=\"bg-white rounded-lg shadow-sm border border-gray-200 overflow-hidden\">\n                    <div className=\"px-6 py-4 bg-gray-50 border-b border-gray-200\">\n                        <h2 className=\"text-lg font-medium text-gray-800\">Skills</h2>\n                    </div>\n                    <div className=\"p-6\">\n                        <EditSkills applicationId={applicationId} />\n                    </div>\n                </div>\n                <div className=\"bg-white rounded-lg shadow-sm border border-gray-200 overflow-hidden\">\n                    <div className=\"px-6 py-4 bg-gray-50 border-b border-gray-200\">\n                        <h2 className=\"text-lg font-medium text-gray-800\">\n                            Work Experience\n                        </h2>\n                    </div>\n                    <div className=\"p-6\">\n                        <EditWorkExp applicationId={applicationId} />\n                    </div>\n                </div>\n            </div>\n        </div>\n    )\n}\n","import Logo from '../../assets/images/un_resume_logo2.png'\n\nexport default function Navbar(){\n    return(\n        <nav className=\"flex items-center justify-start p-2 md:p-4 border-b border-b-gray-200\">\n            <div className='ml-4 flex flex-row gap-x-2 items-center'>\n                <img src={Logo} alt=\"Company Logo\" className='size-10'/>\n                <h2 className='font-bold text-xl tracking-tighter'>UnResumé</h2>\n            </div>\n        </nav>\n    );\n}","import { XMarkIcon } from \"@heroicons/react/24/outline\";\nimport Navbar from \"../../../constants/Navbar\"\nimport { useNavigate } from \"react-router\";\nimport LinkOutlinedIcon from \"@mui/icons-material/LinkOutlined\";\nexport default function OnboardingLinks() {\n    const navigate = useNavigate();\n    return (\n        <>\n            <Navbar />\n            <div className=\"p-4 flex flex-col items-center\">\n                <div className=\"flex flex-col items-center justify-center p-6 w-3/5 gap-y-6\">\n                    <div className=\"w-full flex flex-col text-center items-center justify-center p-6 gap-y-4\">\n                        <h1 className=\"text-gray-900 font-bold text-3xl\">Show, Don’t tell us!</h1>\n                        <p className=\"text-gray-900 font-light text-[14px]\">Link to your best work. This is the most important part of your profile. A live demo, a GitHub repo, a design portfolio, or a blog post just anything that shows what you can do.</p>\n                    </div>\n\n                    <div className=\"w-full flex flex-col items-center gap-y-4\">\n                        <div className=\"w-4/5 mb-4\">\n                            <div className=\"relative\">\n                                <LinkOutlinedIcon  className=\"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-gray-500\" />\n                                <input\n                                    type=\"text\"\n                                    id=\"links\"\n                                    className=\"w-full pl-10 pr-4 h-12 text-gray-900 text- border-2 border-gray-300 rounded-lg outline-none focus:border-blue-500\"\n                                    placeholder=\"Drop links here!\"\n                                />\n                            </div>\n                        </div>\n                        <div className=\"w-4/5 flex flex-row gap-x-4\">\n                            <div className=\"p-4 h-12 border border-gray-300 bg-gray-50 flex flex-row gap-x-2 items-center rounded-lg\">\n                                <span className=\"text-gray-600 text-[16px] font-medium\">Your-Portfolio.com</span>\n                                <button type=\"button\">\n                                    <XMarkIcon className=\"size-4 text-blue-600/50 cursor-pointer\" />\n                                </button>\n                            </div>\n                        </div>\n                    </div>\n                </div>\n            </div>\n            <div className=\"fixed bottom-6 right-8 z-50\">\n                <button type=\"button\" onClick={() => navigate(\"/setprofile\")} className=\"text-white h-10 text-center font-medium text-sm bg-blue-700 px-4 rounded-lg cursor-pointer hover:bg-blue-600\">\n                    Next, review your profile\n                </button>\n            </div>\n        </>\n    );\n}","import React from \"react\";\n\ninterface Option {\n  value: string;\n  label: string;\n}\n\ninterface SelectProps {\n  label?: string;\n  name: string;\n  value: string;\n  options: Option[];\n  onChange: (e: React.ChangeEvent<HTMLSelectElement>) => void;\n  placeholder?: string;\n  className?: string;\n  disabled?: boolean;\n}\n\nconst Select: React.FC<SelectProps> = ({\n  label,\n  name,\n  value,\n  options,\n  onChange,\n  placeholder,\n  className = \"\",\n  disabled = false,\n}) => (\n  <div className=\"flex flex-col gap-y-2\">\n    {label && (\n      <label className=\"text-sm text-gray-900 font-medium\" htmlFor={name}>\n        {label}\n      </label>\n    )}\n    <select\n      className={`border border-gray-300 p-2 rounded-lg text-sm text-gray-900 font-normal focus:outline-none focus:border-blue-500 ${className}`}\n      disabled={disabled}\n      id={name}\n      name={name}\n      value={value}\n      onChange={onChange}\n    >\n      {placeholder && (\n        <option disabled value=\"\">\n          {placeholder}\n        </option>\n      )}\n      {options.map((opt) => (\n        <option key={opt.value} value={opt.value}>\n          {opt.label}\n        </option>\n      ))}\n    </select>\n  </div>\n);\n\nexport default Select;\n","import { useState } from \"react\";\nimport { AsyncPaginate } from \"react-select-async-paginate\";\n\nconst LocationPicker = ({ value = [], onChange }) => {\n  const [selected, setSelected] = useState(\n    value.map((loc) => ({ value: loc, label: loc }))\n  );\n\n  const loadOptions = async (search) => {\n    if (!search) return { options: [] };\n\n    const res = await fetch(\n      `https://nominatim.openstreetmap.org/search?format=json&q=${encodeURIComponent(\n        search\n      )}`\n    );\n    const data = await res.json();\n\n    return {\n      options: data.map((place) => ({\n        value: place.place_id,       // unique id to avoid duplicates\n        label: place.display_name,   // user-facing string\n        raw: place,                  // keep raw data if needed later\n      })),\n    };\n  };\n\n  const handleChange = (newValue) => {\n    setSelected(newValue);\n    // Save display_name strings into preferences (not place_id)\n    onChange(newValue.map((v) => v.label));\n  };\n\n  return (\n    <AsyncPaginate\n      isMulti\n      value={selected}\n      loadOptions={loadOptions}\n      onChange={handleChange}\n      placeholder=\"Search cities or countries...\"\n      styles={{\n        control: (base, state) => ({\n          ...base,\n          padding: \"0.25rem\",\n          border: \"1px solid #D1D5DB\",\n          borderRadius: \"0.5rem\",\n          fontSize: \"0.875rem\",\n          outline: \"none\",\n          boxShadow: \"none\",\n          \"&:hover\": { borderColor: \"#3B82F6\" },\n          borderColor: state.isFocused ? \"#3B82F6\" : \"#D1D5DB\",\n        }),\n        placeholder: (base) => ({\n          ...base,\n          color: \"#9CA3AF\",\n        }),\n        menu: (base) => ({\n          ...base,\n          border: \"1px solid #D1D5DB\",\n          borderRadius: \"0.5rem\",\n          marginTop: \"0.25rem\",\n          boxShadow: \"0 2px 6px rgba(0,0,0,0.1)\",\n        }),\n        multiValue: (base) => ({\n          ...base,\n          display: \"flex\",\n          alignItems: \"center\",\n          gap: \"0.25rem\",\n          backgroundColor: \"#DBEAFE\",\n          color: \"#1D4ED8\",\n          borderRadius: \"9999px\",\n          padding: \"0.25rem 0.4rem\",\n          fontSize: \"0.975rem\",\n          fontWeight: 500,\n        }),\n        multiValueLabel: (base) => ({\n          ...base,\n          color: \"#1D4ED8\",\n          padding: 0,\n        }),\n        multiValueRemove: (base) => ({\n          ...base,\n          color: \"#6B7280\",\n          cursor: \"pointer\",\n          \":hover\": {\n            color: \"#374151\",\n            backgroundColor: \"transparent\",\n          },\n        }),\n      }}\n    />\n  );\n};\n\nexport default LocationPicker;\n","import { useState, useEffect } from \"react\";\nimport { Switch } from '@headlessui/react'\nimport Navbar from \"../../../constants/Navbar\";\nimport { useNavigate } from \"react-router\";\nimport Select from \"../../common/Select\";\nimport LocationPicker from \"../../common/LocationPicker\";\nimport { useLocation } from \"react-router-dom\";\nimport { X } from \"lucide-react\";\nimport { ApiService } from \"../../../api\";\nimport { useAlert } from \"../../../constants/AlertProvider\";\nimport CircularProgress from '@mui/material/CircularProgress';\nimport HomeNavbar from \"../HomeNavbar\";\nimport JobRoles from \"../../../constants/JobRoles.json\";\n\nconst JOB_TYPES = ['Full Time', 'Contract', 'Internship', 'Co-Founder'];\nconst COMPANY_SIZES = [\n    '1-10 employees', '11-50 employees', '51-200 employees', '201-500 employees',\n    '501-1000 employees', '1001-5000 employees', '5000+ employees',\n];\nconst INVESTMENT_STAGES = ['NA', 'Seed', 'Series A', 'Series B', 'Growth', 'IPO', 'Acquired'];\n\nconst opportunityTypeOptions = [\n    { value: \"All\", label: \"All\" },\n    { value: \"Full Time\", label: \"Full Time\" },\n    { value: \"Part Time\", label: \"Part Time\" },\n    { value: \"Volunteer\", label: \"Volunteer\" },\n    { value: \"AI gig\", label: \"AI gig\" },\n];\n\nconst salaryOptions = [\n    { value: \"10K - 100K\", label: \"10K - 100K\" },\n    { value: \"100K - 200K\", label: \"100K - 200K\" },\n    { value: \"200K - 300K\", label: \"200K - 300K\" },\n    { value: \"More than 300K\", label: \"More than 300K\" },\n];\n\nexport default function OnboardingPreferences() {\n    const navigate = useNavigate();\n    const location = useLocation();\n    const [isLoading, setIsLoading] = useState(true);\n    const [roleInput, setRoleInput] = useState(\"\");\n    const [roles, setRoles] = useState([]);\n    const [suggestions, setSuggestions] = useState([]);\n    const isEditMode = location.state?.from === \"editpreferences\";\n    const showAlert = useAlert();\n\n    const [preferences, setPreferences] = useState({\n        locations: [],\n        opportunity_type: \"All\",\n        preferred_salary: \"10K - 100K\",\n        job_types: [],\n        company_sizes: [],\n        investment_stages: [],\n        open_to_remote: false,\n        requires_visa_sponsorship: false,\n    });\n\n    useEffect(() => {\n        const fetchPreferences = async () => {\n            setIsLoading(true);\n            try {\n                const res = await ApiService.apiCandidatePreferencesRetrieve();\n\n                const prefs = res.preferences || {};\n                const choices = res.choices || {};\n\n                // Sanitize and set preferences\n                setPreferences({\n                    locations: prefs.locations || [],\n                    opportunity_type: prefs.opportunity_type || \"All\",\n                    preferred_salary: prefs.preferred_salary || \"10K - 100K\",\n                    job_types: prefs.job_types || [],\n                    company_sizes: prefs.company_sizes || [],\n                    investment_stages: prefs.investment_stages || [],\n                    open_to_remote: prefs.open_to_remote ?? false,\n                    requires_visa_sponsorship: prefs.requires_visa_sponsorship ?? false,\n                });\n\n                // Handle roles\n                if (prefs.role) {\n                    setRoles(\n                        prefs.role\n                            .split(\",\")\n                            .map((r) => r.trim())\n                            .filter(Boolean)\n                    );\n                }\n\n            } catch (error) {\n                console.error(\"Failed to fetch preferences:\", error);\n            } finally {\n                setIsLoading(false);\n            }\n        };\n\n        fetchPreferences();\n    }, []);\n\n    const handleRoleInputChange = (e) => {\n        const value = e.target.value;\n        setRoleInput(value);\n        if (value.trim().length > 0) {\n            const filteredRoles = JobRoles.filter((role) =>\n                role.title.toLowerCase().includes(value.toLowerCase()) && !roles.includes(role.title)\n            ).map((role) => role.title);\n            setSuggestions(filteredRoles.slice(0, 10));\n        } else {\n            setSuggestions([]);\n        }\n    };\n\n    const handleSelectRole = (role) => {\n        if (!roles.includes(role)) {\n            setRoles([...roles, role]);\n        }\n        setRoleInput(\"\");\n        setSuggestions([]);\n    };\n\n    const handleKeyDown = (e) => {\n        if (e.key === \"Enter\" && roleInput.trim() !== \"\") {\n            e.preventDefault();\n            if (!roles.includes(roleInput.trim())) {\n                setRoles([...roles, roleInput.trim()]);\n            }\n            setRoleInput(\"\");\n            setSuggestions([]);\n        }\n    };\n\n    const removeRole = (role) => {\n        setRoles(roles.filter((r) => r !== role));\n    };\n\n    const handleChange = (e) => {\n        const { name, value } = e.target;\n        setPreferences(prev => ({ ...prev, [name]: value }));\n    };\n\n    const handleCheckboxChange = (e) => {\n        const { name, value, checked } = e.target;\n        setPreferences(prev => {\n            const currentValues = prev[name] || [];\n            if (checked) {\n                return { ...prev, [name]: [...currentValues, value] };\n            }\n            return { ...prev, [name]: currentValues.filter(item => item !== value) };\n        });\n    };\n\n    const handleSwitchChange = (field, value) => {\n        setPreferences(prev => ({ ...prev, [field]: value }));\n    };\n\n    const handleClearCheckboxes = (fieldName) => {\n        setPreferences(prev => ({ ...prev, [fieldName]: [] }));\n    };\n\n    const handleSave = async (e) => {\n        e.preventDefault();\n        if (!roles || roles.length === 0) {\n            showAlert(\"Please enter at least one role.\", \"error\");\n            return;\n        }\n\n        if (!preferences.locations || preferences.locations.length === 0) {\n            showAlert(\"Please select at least one location.\", \"error\");\n            return;\n        }\n        if (!preferences.opportunity_type) {\n            showAlert(\"Please select an opportunity type.\", \"error\");\n            return;\n        }\n        if (!preferences.preferred_salary) {\n            showAlert(\"Please select a preferred salary.\", \"error\");\n            return;\n        }\n        const payload = {\n            ...preferences,\n            role: roles.join(', '),\n        };\n        try {\n            await ApiService.apiCandidatePreferencesUpdate({ requestBody: payload });\n            navigate(\"/home\");\n        } catch (error) {\n            console.error(\"Failed to save preferences:\", error);\n        }\n    };\n\n    if (isLoading) {\n        return (\n            <>\n                {isEditMode ? <HomeNavbar /> : <Navbar />}\n                <div className={`max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-10 text-center ${isEditMode && \"mt-14\"}`}>\n                    <h1 className=\"text-2xl font-bold\">Loading Your Preferences...</h1>\n                </div>\n            </>\n        );\n    }\n\n    return (\n        <>\n            {isEditMode ? <HomeNavbar /> : <Navbar />}\n            <form onSubmit={handleSave}>\n                <div className={`max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-10 ${isEditMode && \"mt-14\"}`}>\n                    <div className=\"mb-10\">\n                        <h1 className=\"text-2xl md:text-3xl font-bold text-gray-900\">{isEditMode ? \"Update your preferences\" : \"Help us find your match!\"}</h1>\n                    </div>\n\n                    <div className=\"grid grid-cols-1 lg:grid-cols-3 gap-x-8 gap-y-10\">\n                        <div className=\"lg:col-span-1\">\n                            <h3 className=\"text-lg font-semibold text-gray-900\">Preferences</h3>\n                            <p className=\"mt-1 text-sm text-gray-600\">This will be used to match you with the right opportunities.</p>\n                        </div>\n\n                        <div className=\"lg:col-span-2 space-y-8\">\n                            {/* Basic Info */}\n                            <div className=\"space-y-6\">\n                                <div className=\"flex flex-col gap-y-2\">\n                                    <label htmlFor=\"role\" className=\"text-sm font-medium text-gray-900\">\n                                        Role*\n                                    </label>\n\n                                    <div className=\"flex flex-wrap items-center gap-2 border border-gray-300 p-2 rounded-lg\">\n                                        {roles.map((role, index) => (\n                                            <span\n                                                key={index}\n                                                className=\"flex items-center gap-1 bg-blue-100 text-blue-700 px-2 py-1 rounded-full text-sm\"\n                                            >\n                                                {role}\n                                                <button\n                                                    type=\"button\"\n                                                    onClick={() => removeRole(role)}\n                                                    className=\"text-gray-500 hover:text-gray-700\"\n                                                >\n                                                    <X size={14} />\n                                                </button>\n                                            </span>\n                                        ))}\n\n                                        <div className=\"relative flex-1 min-w-[100px]\">\n                                            <input\n                                                id=\"role\"\n                                                value={roleInput}\n                                                onChange={handleRoleInputChange}\n                                                onKeyDown={handleKeyDown}\n                                                className=\"w-full p-1 text-sm focus:outline-none\"\n                                                placeholder=\"Software Engineer...\"\n                                                autoComplete=\"off\"\n                                            />\n                                            {suggestions.length > 0 && (\n                                                <ul className=\"absolute top-full left-0 mt-1 w-full border border-gray-300 rounded-lg bg-white shadow-lg max-h-48 overflow-y-auto z-10\">\n                                                    {suggestions.map((role, index) => (\n                                                        <li\n                                                            key={index}\n                                                            onClick={() => handleSelectRole(role)}\n                                                            className=\"p-2 hover:bg-gray-100 cursor-pointer text-sm text-gray-900\"\n                                                        >\n                                                            {role}\n                                                        </li>\n                                                    ))}\n                                                </ul>\n                                            )}\n                                        </div>\n                                    </div>\n                                </div>\n                                <div className=\"flex flex-col gap-y-2\">\n                                    <label\n                                        htmlFor=\"locations\"\n                                        className=\"text-sm font-medium text-gray-900\"\n                                    >\n                                        What locations do you want to work in?*\n                                    </label>\n                                    <LocationPicker\n                                        value={preferences.locations}\n                                        onChange={(locations) =>\n                                            setPreferences((prev) => ({ ...prev, locations }))\n                                        }\n                                    />\n                                </div>\n                                <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-6\">\n                                    <Select\n                                        label=\"Opportunity Type*\"\n                                        name=\"opportunity_type\"\n                                        value={preferences.opportunity_type}\n                                        onChange={handleChange}\n                                        options={opportunityTypeOptions}\n                                    />\n                                    <Select\n                                        label=\"Preferred Salary\"\n                                        name=\"preferred_salary\"\n                                        value={preferences.preferred_salary}\n                                        onChange={handleChange}\n                                        options={salaryOptions}\n                                    />\n                                </div>\n                            </div>\n\n                            <hr className=\"border-gray-200\" />\n\n                            {/* Job & Company Details */}\n                            <div className=\"space-y-8\">\n                                <CheckboxGroup title=\"Job Types\" name=\"job_types\" options={JOB_TYPES} checkedValues={preferences.job_types} onChange={handleCheckboxChange} onClear={handleClearCheckboxes} />\n                                <CheckboxGroup title=\"Company Size\" name=\"company_sizes\" options={COMPANY_SIZES} checkedValues={preferences.company_sizes} onChange={handleCheckboxChange} onClear={handleClearCheckboxes} />\n                                <CheckboxGroup title=\"Investment Stage\" name=\"investment_stages\" options={INVESTMENT_STAGES} checkedValues={preferences.investment_stages} onChange={handleCheckboxChange} onClear={handleClearCheckboxes} />\n                            </div>\n\n                            <hr className=\"border-gray-200\" />\n\n                            {/* Toggles */}\n                            <div className=\"space-y-6\">\n                                <SwitchControl label=\"Remote culture\" description=\"Only show jobs at companies that are mostly or fully remote\" checked={preferences.open_to_remote} onChange={(val) => handleSwitchChange('open_to_remote', val)} />\n                                <SwitchControl label=\"Immigration\" description=\"Only show companies that can sponsor a visa\" checked={preferences.requires_visa_sponsorship} onChange={(val) => handleSwitchChange('requires_visa_sponsorship', val)} />\n                            </div>\n                        </div>\n                    </div>\n                </div>\n                <div className=\"border-t border-gray-200\">\n                    <div className=\"max-w-7xl mx-auto flex justify-end p-6\">\n                        <button type=\"submit\" className=\"text-white h-10 text-center font-medium text-sm bg-blue-700 px-6 rounded-lg cursor-pointer hover:bg-blue-600 disabled:bg-blue-400 disabled:cursor-not-allowed\">\n                            {isLoading ? (\n                                <>\n                                    <CircularProgress size={20} color=\"inherit\" />\n                                    Saving...\n                                </>\n                            ) : (\n                                <>{isEditMode ? \"Update Preferences\" : \"Start Matching!\"}</>\n                            )}\n                        </button>\n                    </div>\n                </div>\n            </form>\n        </>\n    );\n}\n\nconst CheckboxGroup = ({ title, name, options, checkedValues, onChange, onClear }) => (\n    <div>\n        <div className=\"flex justify-between items-center mb-2\">\n            <h4 className=\"text-sm font-medium text-gray-900\">{title}</h4>\n            <button type=\"button\" onClick={() => onClear(name)} className=\"text-sm font-medium text-blue-700 hover:text-blue-500\">Clear</button>\n        </div>\n        <div className=\"p-4 border border-gray-200 rounded-lg space-y-3\">\n            <div className=\"grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 gap-x-4 gap-y-3\">\n                {options.map((option) => (\n                    <div key={option} className=\"flex items-center gap-x-2\">\n                        <input id={`${name}-${option}`} name={name} value={option} type=\"checkbox\" checked={checkedValues.includes(option)} onChange={onChange} className=\"h-4 w-4 text-blue-600 border-gray-300 rounded focus:ring-blue-500\" />\n                        <label htmlFor={`${name}-${option}`} className=\"text-sm text-gray-700\">{option}</label>\n                    </div>\n                ))}\n            </div>\n        </div>\n    </div>\n);\n\nconst SwitchControl = ({ label, description, checked, onChange }) => (\n    <div className=\"flex items-center justify-between\">\n        <div className=\"flex-grow pr-4\">\n            <p className=\"text-sm font-medium text-gray-900\">{label}</p>\n            <p className=\"text-sm text-gray-500\">{description}</p>\n        </div>\n        <Switch\n            checked={checked}\n            onChange={onChange}\n            className={`${checked ? \"bg-blue-600\" : \"bg-gray-200\"}\n        relative inline-flex h-6 w-11 flex-shrink-0 cursor-pointer rounded-full border-2 border-transparent transition-colors duration-200 ease-in-out focus:outline-none`}\n        >\n            <span\n                aria-hidden=\"true\"\n                className={`${checked ? \"translate-x-5\" : \"translate-x-0\"}\n          pointer-events-none inline-block h-5 w-5 transform rounded-full bg-white shadow ring-0 transition duration-200 ease-in-out`}\n            />\n        </Switch>\n    </div>\n);\n","import { ApiService } from \"../api/services.gen\";\n\nexport async function getUserDetails() {\n  try {\n    const user = await ApiService.apiWhoamiRetrieve();\n    return {\n      id: user.id,\n      role: user.role,\n      company: user.company,\n    };\n  } catch (error) {\n    console.error(\"Failed to fetch user details:\", error);\n    return null;\n  }\n}\n","import { useState, useEffect } from 'react'\nimport { ApiService } from '../../../api/services.gen'\nimport { useAlert } from '../../../constants/AlertProvider'\nimport { XMarkIcon } from \"@heroicons/react/24/solid\";\nimport DatePicker from \"react-datepicker\";\nimport \"react-datepicker/dist/react-datepicker.css\";\n\nexport function AddEducation({ applicationId }) {\n    const [educationList, setEducationList] = useState([]);\n    const [institution, setInstitution] = useState(\"\");\n    const [degree, setDegree] = useState(\"\");\n    const [major, setMajor] = useState(\"\");\n    const [gpa, setGpa] = useState(\"\");\n    const [startYear, setStartYear] = useState(null);\n    const [endYear, setEndYear] = useState(null);\n    const showAlert = useAlert();\n\n    useEffect(() => {\n        const fetchEducation = async () => {\n            if (!applicationId) return\n            try {\n                const res = await ApiService.apiEducationList({ application: applicationId })\n                setEducationList(res.results || res)\n            } catch (e) {\n                showAlert(\"Failed to load education\", \"error\");\n            }\n        }\n        fetchEducation();\n    }, [applicationId, showAlert])\n\n    const addEducation = async () => {\n        if (educationList.length >= 2) {\n            showAlert(\"Only 2 education can be added\", \"error\");\n            return;\n        }\n        const newEdu = {\n            institution,\n            degree,\n            field_of_study: major,\n            gpa,\n            start_date: startYear ? `${startYear.getFullYear()}-01-01` : null,\n            end_date: endYear ? `${endYear.getFullYear()}-01-01` : null,\n            application: applicationId,\n        }\n        try {\n            const res = await ApiService.apiEducationCreate({ requestBody: newEdu })\n            setEducationList([...educationList, res])\n            // Reset form\n            setInstitution(\"\"); setDegree(\"\"); setMajor(\"\"); setGpa(\"\"); setStartYear(null); setEndYear(null);\n        } catch (error) {\n            showAlert(\"Failed to add education\", \"error\");\n            console.log(\"Failed to add education\", error);\n        }\n    }\n\n    const handleFieldChange = (id, field, value) => {\n        setEducationList(\n            educationList.map((edu) =>\n                edu.id === id ? { ...edu, [field]: value } : edu\n            )\n        );\n    };\n\n    const updateEducation = async (id) => {\n        const updatedEdu = educationList.find((edu) => edu.id === id);\n        if (!updatedEdu) return;\n\n        try {\n            await ApiService.apiEducationPartialUpdate({\n                id,\n                requestBody: updatedEdu,\n            });\n            showAlert(\"Education updated successfully!\", \"success\");\n        } catch (e) {\n            showAlert(\"Failed to update education\", \"error\");\n        }\n    };\n\n    const removeEducation = async (id) => {\n        try {\n            await ApiService.apiEducationDestroy({ id })\n            setEducationList(educationList.filter((edu) => edu.id !== id))\n        } catch (e) {\n            showAlert(\"Failed to delete education\", \"error\");\n        }\n    }\n\n    return (\n        <div className=\"flex flex-col gap-y-4\">\n            {educationList.map((edu) => (\n                <div key={edu.id} className=\"p-2 flex flex-col gap-2 mb-2 bg-gray-50\">\n                    <div className=\"flex justify-between items-center\">\n                        <span className=\"text-[16px] font-semibold text-gray-900\">{edu.degree} in {edu.field_of_study} from {edu.institution}</span>\n                        <button\n                            className=\"text-gray-400 flex flex-row gap-x-2 items-center justify-center hover:text-gray-500 cursor-pointer\"\n                            onClick={() => removeEducation(edu.id)}\n                        >\n                            <XMarkIcon className=\"size-4\" />\n                            <span className=\"text-[14px] font-medium\">Remove</span>\n                        </button>\n                    </div>\n                    <div className=\"grid grid-cols-2 gap-4\">\n                        <div className=\"flex flex-col gap-y-2\">\n                            <label className=\"font-medium text-gray-900 text-[14px]\">School</label>\n                            <input\n                                type=\"text\"\n                                value={edu.institution || \"\"}\n                                onChange={e => handleFieldChange(edu.id, \"institution\", e.target.value)}\n                                className=\"text-[14px] text-gray-900 border border-gray-300 rounded-lg p-2\"\n                            />\n                        </div>\n                        <div className=\"flex flex-col gap-y-2\">\n                            <label className=\"font-medium text-gray-900 text-[14px]\">Degree</label>\n                            <input\n                                type=\"text\"\n                                value={edu.degree || \"\"}\n                                onChange={e => handleFieldChange(edu.id, \"degree\", e.target.value)}\n                                className=\"text-[14px] text-gray-900 border border-gray-300 rounded-lg p-2\"\n                            />\n                        </div>\n                        <div className=\"flex flex-col gap-y-2\">\n                            <label className=\"font-medium text-gray-900 text-[14px]\">Major</label>\n                            <input\n                                type=\"text\"\n                                value={edu.field_of_study || \"\"}\n                                onChange={e => handleFieldChange(edu.id, \"field_of_study\", e.target.value)}\n                                className=\"text-[14px] text-gray-900 border border-gray-300 rounded-lg p-2\"\n                            />\n                        </div>\n                        <div className=\"flex flex-col gap-y-2\">\n                            <label className=\"font-medium text-gray-900 text-[14px]\">GPA</label>\n                            <input\n                                type=\"number\"\n                                value={edu.gpa || \"\"}\n                                onChange={e => handleFieldChange(edu.id, \"gpa\", e.target.value)}\n                                className=\"text-[14px] text-gray-900 border border-gray-300 rounded-lg p-2\"\n                            />\n                        </div>\n                        <div className=\"flex flex-col gap-y-2\">\n                            <label className=\"font-medium text-gray-900 text-[14px]\">Start year</label>\n                            <DatePicker\n                                selected={edu.start_date ? new Date(edu.start_date) : null}\n                                onChange={date => handleFieldChange(edu.id, \"start_date\", date ? `${date.getFullYear()}-01-01` : null)}\n                                showYearPicker\n                                dateFormat=\"yyyy\"\n                                minDate={new Date(1990, 0, 1)}\n                                maxDate={new Date(2030, 11, 31)}\n                                className=\"w-full text-[14px] text-gray-900 border border-gray-300 rounded-lg p-2\"\n                            />\n                        </div>\n                        <div className=\"flex flex-col gap-y-2\">\n                            <label className=\"font-medium text-gray-900 text-[14px]\">End year</label>\n                            <DatePicker\n                                selected={edu.end_date ? new Date(edu.end_date) : null}\n                                onChange={date => handleFieldChange(edu.id, \"end_date\", date ? `${date.getFullYear()}-01-01` : null)}\n                                showYearPicker\n                                dateFormat=\"yyyy\"\n                                minDate={new Date(1990, 0, 1)}\n                                maxDate={new Date(2030, 11, 31)}\n                                className=\"w-full text-[14px] text-gray-900 border border-gray-300 rounded-lg p-2\"\n                            />\n                        </div>\n                    </div>\n                    <div className='flex justify-end'>\n                        <button\n                            type=\"button\"\n                            className=\"text-[14px] font-semibold text-blue-700 cursor-pointer hover:text-blue-600 flex items-center gap-1\"\n                            onClick={() => updateEducation(edu.id)}\n                        >\n                            Update\n                        </button>\n                    </div>\n                </div>\n            ))}\n\n            {educationList.length < 2 ? (\n                <div className=\"grid grid-cols-2 gap-4\">\n                    <div className=\"flex flex-col gap-y-2\">\n                        <label className=\"font-medium text-gray-900 text-[14px]\">School</label>\n                        <input\n                            type=\"text\"\n                            value={institution}\n                            onChange={e => setInstitution(e.target.value)}\n                            className=\"text-[14px] text-gray-900 border border-gray-300 focus:outline-none focus:border-blue-500 rounded-lg p-2\"\n                        />\n                    </div>\n\n                    <div className=\"flex flex-col gap-y-2\">\n                        <label className=\"font-medium text-gray-900 text-[14px]\">Degree</label>\n                        <input\n                            type=\"text\"\n                            value={degree}\n                            onChange={e => setDegree(e.target.value)}\n                            className=\"text-[14px] text-gray-900 border border-gray-300 focus:outline-none focus:border-blue-500 rounded-lg p-2\"\n                        />\n                    </div>\n\n                    <div className=\"flex flex-col gap-y-2\">\n                        <label className=\"font-medium text-gray-900 text-[14px]\">Start year</label>\n                        <DatePicker\n                            selected={startYear}\n                            onChange={date => setStartYear(date)}\n                            showYearPicker\n                            dateFormat=\"yyyy\"\n                            minDate={new Date(1990, 0, 1)}\n                            maxDate={new Date(2030, 11, 31)}\n                            className=\"w-full text-[14px] text-gray-900 border border-gray-300 focus:outline-none focus:border-blue-500 rounded-lg p-2\"\n                        />\n                    </div>\n\n                    <div className=\"flex flex-col gap-y-2\">\n                        <label className=\"font-medium text-gray-900 text-[14px]\">End year</label>\n                        <DatePicker\n                            selected={endYear}\n                            onChange={date => setEndYear(date)}\n                            showYearPicker\n                            dateFormat=\"yyyy\"\n                            minDate={new Date(1990, 0, 1)}\n                            maxDate={new Date(2030, 11, 31)}\n                            className=\"w-full text-[14px] text-gray-900 border border-gray-300 focus:outline-none focus:border-blue-500 rounded-lg p-2\"\n                        />\n                    </div>\n\n                    <div className=\"flex flex-col gap-y-2\">\n                        <label className=\"font-medium text-gray-900 text-[14px]\">Major</label>\n                        <input\n                            type=\"text\"\n                            value={major}\n                            onChange={e => setMajor(e.target.value)}\n                            className=\"text-[14px] text-gray-900 border border-gray-300 focus:outline-none focus:border-blue-500 rounded-lg p-2\"\n                        />\n                    </div>\n\n                    <div className=\"flex flex-col gap-y-2\">\n                        <label className=\"font-medium text-gray-900 text-[14px]\">GPA</label>\n                        <input\n                            type=\"number\"\n                            value={gpa}\n                            onChange={e => setGpa(e.target.value)}\n                            className=\"text-[14px] text-gray-900 border border-gray-300 focus:outline-none focus:border-blue-500 rounded-lg p-2\"\n                        />\n                    </div>\n                </div>\n            ) : (\n                <div className=\"text-sm text-gray-500\">You can only add up to 2 education entries.</div>\n            )}\n\n            <div className=\"flex justify-end\">\n                <button\n                    type=\"button\"\n                    onClick={addEducation}\n                    className={`text-[14px] font-semibold ${educationList.length >= 2 ? \"cursor-none text-blue-300\" : \"text-blue-700 hover:text-blue-600 cursor-pointer\"} flex items-center gap-1`}\n                    disabled={educationList.length >= 2}\n                >\n                    Add Education\n                </button>\n            </div>\n\n        </div>\n    );\n}","import { useState, useEffect } from \"react\";\nimport { XMarkIcon } from \"@heroicons/react/24/solid\";\nimport DatePicker from \"react-datepicker\";\nimport \"react-datepicker/dist/react-datepicker.css\";\nimport { ApiService } from '../../../api/services.gen'\nimport { useAlert } from '../../../constants/AlertProvider'\n\nexport function AddWorkExp({ applicationId }) {\n    const [experiences, setExperiences] = useState([]);\n    // States for new experience form\n    const [company, setCompany] = useState(\"\");\n    const [title, setTitle] = useState(\"\"); // Renamed from 'role' for clarity. API field is 'duration'.\n    const [city, setCity] = useState(\"\");\n    const [state, setState] = useState(\"\");\n    const [country, setCountry] = useState(\"\");\n    const [isRemote, setIsRemote] = useState(false);\n    const [startYear, setStartYear] = useState(null);\n    const [endYear, setEndYear] = useState(null);\n    const [isCurrentJob, setIsCurrentJob] = useState(false);\n    const [responsibilities, setResponsibilities] = useState(\"\");\n    const showAlert = useAlert();\n\n    // Fetch existing experiences\n    useEffect(() => {\n        const fetchExperiences = async () => {\n            if (!applicationId) return\n            try {\n                const res = await ApiService.apiExperienceList({ application: applicationId })\n                setExperiences(res.results || res)\n            } catch (e) {\n                showAlert(\"Failed to load experiences\", \"error\");\n            }\n        }\n        fetchExperiences();\n    }, [applicationId, showAlert])\n\n    // POST: Add new experience\n    const addExperience = async () => {\n        if (experiences.length >= 3) {\n            showAlert(\"Only 3 experiences can be added\", \"error\");\n            return;\n        }\n        const newExp = {\n            company,\n            duration: title, // API expects 'duration' for the job title.\n            city,\n            state,\n            country,\n            is_remote: isRemote,\n            start_date: startYear ? `${startYear.getFullYear()}-01-01` : null,\n            end_date: isCurrentJob ? null : (endYear ? `${endYear.getFullYear()}-01-01` : null),\n            responsibilities,\n            application: applicationId,\n        }\n        try {\n            const res = await ApiService.apiExperienceCreate({ requestBody: newExp })\n            setExperiences([...experiences, res])\n            // Reset form\n            setCompany(\"\"); setTitle(\"\"); setCity(\"\"); setState(\"\"); setCountry(\"\"); setIsRemote(false);\n            setStartYear(null); setEndYear(null); setResponsibilities(\"\"); setIsCurrentJob(false);\n        } catch (error) {\n            showAlert(\"Failed to add experiences\", \"error\");\n            console.log(\"Failed to add experiences\", error);\n        }\n    }\n\n    // PATCH: Update experience\n    const handleFieldChange = (id, field, value) => {\n        setExperiences(\n            experiences.map((exp) =>\n                exp.id === id ? { ...exp, [field]: value } : exp\n            )\n        );\n    };\n\n    const handleCurrentJobChange = (id, checked) => {\n        setExperiences(\n            experiences.map((exp) =>\n                exp.id === id ? { ...exp, is_current: checked, end_date: checked ? null : exp.end_date } : exp\n            )\n        );\n    };\n\n    const updateExperience = async (id) => {\n        const updatedExp = experiences.find((exp) => exp.id === id);\n        if (!updatedExp) return;\n\n        try {\n            // The 'is_current' field is frontend-only and should not be sent to the backend.\n            await ApiService.apiExperiencePartialUpdate({\n                id,\n                requestBody: updatedExp,\n            });\n            showAlert(\"Experience updated successfully!\", \"success\");\n        } catch (e) {\n            showAlert(\"Failed to update experiences\", \"error\");\n        }\n    }\n\n    // DELETE: Remove experience\n    const removeExperience = async (id) => {\n        try {\n            await ApiService.apiExperienceDestroy({ id })\n            setExperiences(experiences.filter((exp) => exp.id !== id))\n        } catch (e) {\n            showAlert(\"Failed to delete experiences\", \"error\");\n        }\n    }\n\n    return (\n        <div className=\"flex flex-col gap-y-4\">\n            {experiences.map((exp) => (\n                <div key={exp.id} className=\"p-2 flex flex-col gap-2 mb-2 bg-gray-50 rounded-lg\">\n                    <div className=\"flex justify-between items-center\">\n                        <span className=\"text-[16px] font-semibold text-gray-900\">{exp.duration || 'Role'} at {exp.company}</span>\n                        <button\n                            className=\"text-gray-400 flex flex-row gap-x-2 items-center justify-center hover:text-gray-500 cursor-pointer\"\n                            onClick={() => removeExperience(exp.id)}\n                        >\n                            <XMarkIcon className=\"size-4\" />\n                            <span className=\"text-[14px] font-medium\">Remove</span>\n                        </button>\n                    </div>\n                    <div className=\"grid grid-cols-2 gap-4\">\n                        <div className=\"flex flex-col gap-y-2\">\n                            <label className=\"font-medium text-gray-900 text-[14px]\">Company</label>\n                            <input\n                                type=\"text\"\n                                value={exp.company || \"\"}\n                                onChange={e => handleFieldChange(exp.id, \"company\", e.target.value)}\n                                className=\"text-[14px] text-gray-900 border border-gray-300 focus:outline-none focus:border-blue-500 rounded-lg p-2\"\n                            />\n                        </div>\n                        <div className=\"flex flex-col gap-y-2\">\n                            <label className=\"font-medium text-gray-900 text-[14px]\">Title</label>\n                            <input\n                                type=\"text\"\n                                value={exp.duration || \"\"}\n                                onChange={e => handleFieldChange(exp.id, \"duration\", e.target.value)}\n                                className=\"text-[14px] text-gray-900 border border-gray-300 focus:outline-none focus:border-blue-500 rounded-lg p-2\"\n                            />\n                        </div>\n                        <div className=\"flex flex-col gap-y-2\">\n                            <label className=\"font-medium text-gray-900 text-[14px]\">End year</label>\n                            <DatePicker\n                                selected={exp.end_date ? new Date(exp.end_date) : null}\n                                onChange={date => handleFieldChange(exp.id, \"end_date\", date ? `${date.getFullYear()}-01-01` : null)}\n                                showYearPicker\n                                dateFormat=\"yyyy\"\n                                minDate={new Date(1990, 0, 1)}\n                                maxDate={new Date(2030, 11, 31)}\n                                disabled={exp.is_current}\n                                className=\"w-full text-[14px] text-gray-900 border border-gray-300 focus:outline-none focus:border-blue-500 rounded-lg p-2 disabled:bg-gray-200\"\n                            />\n                        </div>\n                        <div className=\"flex flex-col gap-y-2\">\n                            <label className=\"font-medium text-gray-900 text-[14px]\">Start year</label>\n                            <DatePicker\n                                selected={exp.start_date ? new Date(exp.start_date) : null}\n                                onChange={date => handleFieldChange(exp.id, \"start_date\", date ? `${date.getFullYear()}-01-01` : null)}\n                                showYearPicker\n                                dateFormat=\"yyyy\"\n                                minDate={new Date(1990, 0, 1)}\n                                maxDate={new Date()}\n                                className=\"w-full text-[14px] text-gray-900 border border-gray-300 focus:outline-none focus:border-blue-500 rounded-lg p-2\"\n                            />\n                        </div>\n                        <div className=\"flex items-center gap-x-2 pt-5\">\n                            <input\n                                type=\"checkbox\"\n                                id={`current-${exp.id}`}\n                                checked={exp.is_current || false}\n                                onChange={(e) => handleCurrentJobChange(exp.id, e.target.checked)}\n                                className=\"size-4\"\n                            />\n                            <label htmlFor={`current-${exp.id}`} className=\"font-medium text-gray-900 text-[14px]\">I currently work here</label>\n                        </div>\n                    </div>\n                    <div className=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\n                        <div className=\"flex flex-col gap-y-2\">\n                            <label className=\"font-medium text-gray-900 text-[14px]\">City</label>\n                            <input\n                                type=\"text\"\n                                value={exp.city || \"\"}\n                                onChange={e => handleFieldChange(exp.id, \"city\", e.target.value)}\n                                className=\"text-[14px] text-gray-900 border border-gray-300 focus:outline-none focus:border-blue-500 rounded-lg p-2\"\n                            />\n                        </div>\n                        <div className=\"flex flex-col gap-y-2\">\n                            <label className=\"font-medium text-gray-900 text-[14px]\">State</label>\n                            <input\n                                type=\"text\"\n                                value={exp.state || \"\"}\n                                onChange={e => handleFieldChange(exp.id, \"state\", e.target.value)}\n                                className=\"text-[14px] text-gray-900 border border-gray-300 focus:outline-none focus:border-blue-500 rounded-lg p-2\"\n                            />\n                        </div>\n                        <div className=\"flex flex-col gap-y-2\">\n                            <label className=\"font-medium text-gray-900 text-[14px]\">Country</label>\n                            <input\n                                type=\"text\"\n                                value={exp.country || \"\"}\n                                onChange={e => handleFieldChange(exp.id, \"country\", e.target.value)}\n                                className=\"text-[14px] text-gray-900 border border-gray-300 focus:outline-none focus:border-blue-500 rounded-lg p-2\"\n                            />\n                        </div>\n                    </div>\n                    <div className=\"px-2 flex flex-col gap-y-2\">\n                        <label className=\"font-medium text-gray-900 text-[14px]\">Description</label>\n                        <textarea\n                            rows=\"4\"\n                            maxLength={1500}\n                            value={exp.responsibilities || \"\"}\n                            onChange={e => handleFieldChange(exp.id, \"responsibilities\", e.target.value)}\n                            className=\"p-2 resize-none border border-gray-300 text-[14px] focus:outline-none focus:border-blue-500 rounded-lg\"\n                        />\n                    </div>\n                    <div className='flex justify-end'>\n                        <button\n                            type=\"button\"\n                            className=\"text-[14px] font-semibold text-blue-700 cursor-pointer hover:text-blue-600 flex items-center gap-1\"\n                            onClick={() => updateExperience(exp.id)}\n                        >\n                            Update\n                        </button>\n                    </div>\n                </div>\n            ))}\n            {experiences.length < 3 ? (\n                <>\n                    <div className=\"p-4 border border-gray-200 rounded-lg flex flex-col gap-y-4\">\n                        <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n                            <div className=\"flex flex-col gap-y-2\">\n                                <label className=\"font-medium text-gray-900 text-[14px]\">Company</label>\n                                <input type=\"text\" value={company} onChange={e => setCompany(e.target.value)} className=\"text-[14px] text-gray-900 border border-gray-300 focus:outline-none focus:border-blue-500 rounded-lg p-2\" />\n                            </div>\n                            <div className=\"flex flex-col gap-y-2\">\n                                <label className=\"font-medium text-gray-900 text-[14px]\">Title</label>\n                                <input type=\"text\" value={title} onChange={e => setTitle(e.target.value)} className=\"text-[14px] text-gray-900 border border-gray-300 focus:outline-none focus:border-blue-500 rounded-lg p-2\" />\n                            </div>\n                        </div>\n\n                        <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n                            <div className=\"flex flex-col gap-y-2\">\n                                <label className=\"font-medium text-gray-900 text-[14px]\">Start year</label>\n                                <DatePicker\n                                    selected={startYear}\n                                    onChange={date => setStartYear(date)}\n                                    showYearPicker\n                                    dateFormat=\"yyyy\"\n                                    minDate={new Date(1990, 0, 1)}\n                                    maxDate={new Date()}\n                                    className=\"w-full text-[14px] text-gray-900 border border-gray-300 focus:outline-none focus:border-blue-500 rounded-lg p-2\"\n                                />\n                            </div>\n                            <div className=\"flex flex-col gap-y-2\">\n                                <label className=\"font-medium text-gray-900 text-[14px]\">End year</label>\n                                <DatePicker\n                                    selected={endYear}\n                                    onChange={date => setEndYear(date)}\n                                    showYearPicker\n                                    dateFormat=\"yyyy\"\n                                    minDate={startYear || new Date(1990, 0, 1)}\n                                    maxDate={new Date()}\n                                    disabled={isCurrentJob}\n                                    className=\"w-full text-[14px] text-gray-900 border border-gray-300 focus:outline-none focus:border-blue-500 rounded-lg p-2 disabled:bg-gray-200\"\n                                />\n                            </div>\n                        </div>\n                        <div className=\"flex items-center gap-x-2\">\n                            <input id=\"isCurrent\" type=\"checkbox\" checked={isCurrentJob} onChange={e => setIsCurrentJob(e.target.checked)} className=\"size-4\" />\n                            <label htmlFor=\"isCurrent\" className=\"font-medium text-gray-900 text-[14px]\">I currently work here</label>\n                        </div>\n\n                        <div className=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\n                            <div className=\"flex flex-col gap-y-2\">\n                                <label className=\"font-medium text-gray-900 text-[14px]\">City</label>\n                                <input type=\"text\" value={city} onChange={e => setCity(e.target.value)} className=\"text-[14px] text-gray-900 border border-gray-300 focus:outline-none focus:border-blue-500 rounded-lg p-2\" />\n                            </div>\n                            <div className=\"flex flex-col gap-y-2\">\n                                <label className=\"font-medium text-gray-900 text-[14px]\">State</label>\n                                <input type=\"text\" value={state} onChange={e => setState(e.target.value)} className=\"text-[14px] text-gray-900 border border-gray-300 focus:outline-none focus:border-blue-500 rounded-lg p-2\" />\n                            </div>\n                            <div className=\"flex flex-col gap-y-2\">\n                                <label className=\"font-medium text-gray-900 text-[14px]\">Country</label>\n                                <input type=\"text\" value={country} onChange={e => setCountry(e.target.value)} className=\"text-[14px] text-gray-900 border border-gray-300 focus:outline-none focus:border-blue-500 rounded-lg p-2\" />\n                            </div>\n                        </div>\n                        <div className=\"flex flex-row gap-x-2 items-center\">\n                            <input id=\"isRemote\" type=\"checkbox\" checked={isRemote} onChange={e => setIsRemote(e.target.checked)} className=\"size-4\" />\n                            <label htmlFor=\"isRemote\" className=\"font-medium text-gray-900 text-[14px]\">This is a remote role</label>\n                        </div>\n                    </div>\n                    <div className=\"px-2 flex flex-col gap-y-2\">\n                        <label className=\"font-medium text-gray-900 text-[14px]\">Description</label>\n                        <textarea\n                            rows=\"4\"\n                            maxLength={1500}\n                            value={responsibilities}\n                            onChange={e => setResponsibilities(e.target.value)}\n                            className=\"p-2 resize-none border border-gray-300 text-[14px] focus:outline-none focus:border-blue-500 rounded-lg\"\n                        />\n                    </div>\n                </>\n            ) : (\n                <div className=\"text-sm text-gray-500\">You can only add up to 3 experience entries.</div>\n            )}\n            <div className='flex justify-end'>\n                <button\n                    type=\"button\"\n                    onClick={addExperience}\n                    className={`text-[14px] font-semibold ${experiences.length >= 3 ? \"cursor-none text-blue-300\" : \"text-blue-700 hover:text-blue-600 cursor-pointer\"} flex items-center gap-1`}\n                    disabled={experiences.length >= 3}\n                >\n                    Add Experience\n                </button>\n            </div>\n        </div>\n    );\n}","import { useState, useEffect, useRef } from \"react\";\nimport { MagnifyingGlassIcon, XMarkIcon } from \"@heroicons/react/24/outline\";\nimport { useAlert } from '../../../constants/AlertProvider';\nimport { ApiService } from \"../../../api/services.gen\";\nimport axios from \"axios\";\n\nconst SkillLevelModal = ({ skill, onSave, onCancel, isLoading }) => {\n    const [level, setLevel] = useState('Intermediate');\n\n    const levels = {\n        'Beginner': 2,\n        'Intermediate': 4,\n        'Advanced': 6,\n        'Expert': 8,\n        'Master': 10\n    };\n\n    const handleSave = () => {\n        onSave(levels[level]);\n    };\n\n    return (\n        <div className=\"fixed inset-0 z-20 flex items-center justify-center bg-black/40\">\n            <div className=\"w-full max-w-md rounded-xl bg-white p-6 shadow-2xl\">\n                {/* Header */}\n                <div className=\"mb-5 flex items-start justify-between gap-3\">\n                    <div>\n                        <p className=\"text-xs font-semibold uppercase tracking-wide text-gray-400\">\n                            Skill level\n                        </p>\n                        <h3 className=\"mt-1 text-lg font-semibold text-gray-900\">\n                            Set your level for{\" \"}\n                            <span className=\"text-blue-600\">\"{skill.name}\"</span>\n                        </h3>\n                        <p className=\"mt-1 text-sm text-gray-500\">\n                            Choose the option that best matches your current proficiency.\n                        </p>\n                    </div>\n\n                    <button\n                        type=\"button\"\n                        onClick={onCancel}\n                        className=\"rounded-full p-1.5 text-gray-400 hover:bg-gray-100 hover:text-gray-600 transition\"\n                    >\n                        <span className=\"sr-only\">Close</span>\n                        ✕\n                    </button>\n                </div>\n\n                {/* Levels */}\n                <div className=\"mb-6 space-y-2\">\n                    {Object.keys(levels).map((levelName) => (\n                        <label\n                            key={levelName}\n                            className={`flex items-center justify-between rounded-lg border p-3 text-sm cursor-pointer transition\n            ${level === levelName\n                                    ? \"border-blue-600 bg-blue-50/70\"\n                                    : \"border-gray-200 hover:bg-gray-50\"\n                                }`}\n                        >\n                            <div className=\"flex items-center gap-3\">\n                                {/* Custom radio bullet */}\n                                <span\n                                    className={`flex h-4 w-4 items-center justify-center rounded-full border\n                ${level === levelName\n                                            ? \"border-blue-600 bg-blue-600\"\n                                            : \"border-gray-300 bg-white\"\n                                        }`}\n                                >\n                                    {level === levelName && (\n                                        <span className=\"h-1.5 w-1.5 rounded-full bg-white\" />\n                                    )}\n                                </span>\n\n                                <span className=\"font-medium text-gray-800\">{levelName}</span>\n                            </div>\n\n                            <input\n                                type=\"radio\"\n                                name=\"skillLevel\"\n                                value={levelName}\n                                checked={level === levelName}\n                                onChange={() => setLevel(levelName)}\n                                className=\"sr-only\"\n                            />\n                        </label>\n                    ))}\n                </div>\n\n                {/* Actions */}\n                <div className=\"flex justify-end gap-2\">\n                    <button\n                        type=\"button\"\n                        onClick={onCancel}\n                        disabled={isLoading}\n                        className=\"rounded-md border border-gray-300 px-4 py-2 text-sm font-medium text-gray-700 hover:bg-gray-50 disabled:cursor-not-allowed disabled:opacity-60\"\n                    >\n                        Cancel\n                    </button>\n                    <button\n                        type=\"button\"\n                        onClick={handleSave}\n                        disabled={isLoading}\n                        className=\"rounded-md bg-blue-600 px-4 py-2 text-sm font-semibold text-white hover:bg-blue-700 disabled:bg-blue-300 disabled:cursor-not-allowed\"\n                    >\n                        {isLoading ? \"Saving...\" : \"Save\"}\n                    </button>\n                </div>\n            </div>\n        </div>\n\n    );\n};\n\nexport function AddSkills({ applicationId }) {\n    const [query, setQuery] = useState(\"\");\n    const [suggestions, setSuggestions] = useState([]);\n    const [selectedSkills, setSelectedSkills] = useState([]);\n    const [isLoading, setIsLoading] = useState(false); // To manage loading state for add/remove\n    const [isModalOpen, setIsModalOpen] = useState(false);\n    const [skillToAdd, setSkillToAdd] = useState(null);\n    const showAlert = useAlert();\n\n    useEffect(() => {\n        if (!applicationId) return;\n\n        const fetchExistingSkills = async () => {\n            try {\n                const skiResponse = await axios.get(`/api/skill/?application_id=${applicationId}`, { withCredentials: true });\n                if (skiResponse.data && Array.isArray(skiResponse.data.results)) {\n                    setSelectedSkills(skiResponse.data.results);\n                }\n            } catch (err) {\n                console.error(\"Error fetching existing skills:\", err);\n                showAlert(\"Failed to load existing skills\", \"error\");\n            }\n        };\n\n        fetchExistingSkills();\n    }, [applicationId]);\n\n    useEffect(() => {\n        const fetchSkills = async () => {\n            if (query.trim().length < 2) {\n                setSuggestions([]);\n                return;\n            }\n            try {\n                const res = await axios.get(`/api/matching-skills/autocomplete/?q=${query}`);\n                console.log(\"Fetching Suggs...\", res.data.skills); //debug\n                setSuggestions(res.data.skills);\n            } catch (err) {\n                console.error(\"Error fetching skills:\", err);\n            }\n        };\n        const delayDebounce = setTimeout(fetchSkills, 300);\n        return () => clearTimeout(delayDebounce);\n    }, [query]);\n\n    const handleSelectSkill = (skillObj) => {\n        if (isLoading) return;\n        // Prevent duplicates\n        if (selectedSkills.some(s => s.name.toLowerCase() === skillObj.name.toLowerCase())) {\n            setQuery(\"\");\n            setSuggestions([]);\n            return;\n        }\n        setSkillToAdd(skillObj);\n        setIsModalOpen(true);\n    };\n\n    const saveSkillWithLevel = async (score) => {\n        if (!skillToAdd) return;\n\n        setIsLoading(true);\n        try {\n            // Create the new skill and get its response to add to state\n            const newSkill = await ApiService.apiSkillCreate({\n                requestBody: {\n                    application: applicationId,\n                    name: skillToAdd.name,\n                    score: score,\n                    matching_skill_id: skillToAdd.id || null,\n                }\n            });\n            // Add the newly created skill to our local state\n            setSelectedSkills(prevSkills => [...prevSkills, newSkill]);\n            showAlert(\"Skill added!\", \"success\");\n        } catch (err) {\n            showAlert(\"Failed to add skill\", \"error\");\n            console.error(\"Failed to add skill:\", err);\n        } finally {\n            setIsLoading(false);\n        }\n        setIsModalOpen(false);\n        setSkillToAdd(null);\n        setQuery(\"\");\n        setSuggestions([]);\n    };\n\n    const removeSkill = async (skillToRemove) => {\n        if (isLoading) return; // Prevent action if already loading\n        setIsLoading(true);\n        try {\n            await ApiService.apiSkillDestroy({ id: skillToRemove.id.toString() });\n            setSelectedSkills(selectedSkills.filter((s) => s.id !== skillToRemove.id));\n            showAlert(\"Skill removed!\", \"success\");\n        } catch (err) {\n            showAlert(\"Failed to remove skill\", \"error\");\n            console.error(\"Failed to remove skill:\", err);\n        } finally {\n            setIsLoading(false);\n        }\n    };\n\n    const handleKeyDown = (e) => {\n        if (e.key === \"Enter\" && query.trim() !== \"\") {\n            e.preventDefault();\n            handleSelectSkill({ name: query.trim(), id: null });\n        }\n    };\n\n    return (\n        <div className=\"w-full flex flex-col items-center gap-y-4\">\n            <div className=\"w-full relative\">\n                <MagnifyingGlassIcon className=\"absolute left-3 top-1/2 -translate-y-1/2 h-5 w-5 text-gray-500\" />\n                <input\n                    type=\"text\"\n                    id=\"skill\"\n                    value={query}\n                    onChange={(e) => setQuery(e.target.value)}\n                    onKeyDown={handleKeyDown}\n                    className=\"w-full pl-10 pr-4 h-10 text-gray-900 border-2 border-gray-300 rounded-lg outline-none focus:border-blue-500 disabled:bg-gray-100\"\n                    placeholder=\"Search...\"\n                    disabled={isLoading}\n                    required\n                />\n                {suggestions.length > 0 && (\n                    <ul className=\"absolute top-full mt-1 w-full border border-gray-300 rounded-lg bg-white shadow-lg max-h-48 overflow-y-auto z-10\">\n                        {suggestions.map((skill, idx) => (\n                            <li\n                                key={skill.id || idx}\n                                // Prevent adding skill if already loading\n                                onClick={() => !isLoading && handleSelectSkill(skill)}\n                                className={`p-2 hover:bg-gray-100 text-[14px] text-gray-900 ${isLoading ? 'cursor-not-allowed' : 'cursor-pointer'}`}\n                            >\n                                {skill.name}\n                            </li>\n                        ))}\n                    </ul>\n                )}\n            </div>\n            <div className=\"w-full flex flex-wrap gap-2\">\n                {selectedSkills.map((skill) => (\n                    <div\n                        key={skill.id}\n                        className=\"p-2 h-8 border-2 border-blue-700 bg-blue-50 flex flex-row gap-x-2 items-center rounded-lg\"\n                    >\n                        <span className=\"text-blue-700 text-[14px] font-medium\">{skill.name}</span>\n                        <button type=\"button\" onClick={() => removeSkill(skill)} disabled={isLoading}>\n                            <XMarkIcon className=\"size-4 text-blue-700/50 cursor-pointer\" />\n                        </button>\n                    </div>\n                ))}\n            </div>\n            {isModalOpen && skillToAdd && (\n                <SkillLevelModal\n                    skill={skillToAdd}\n                    onSave={saveSkillWithLevel}\n                    onCancel={() => { setIsModalOpen(false); setSkillToAdd(null); }}\n                    isLoading={isLoading}\n                />\n            )}\n        </div>\n    );\n}","import { useState, useEffect } from \"react\";\nimport { XMarkIcon } from \"@heroicons/react/24/solid\";\nimport DatePicker from \"react-datepicker\";\nimport \"react-datepicker/dist/react-datepicker.css\";\nimport { ApiService } from '../../../api/services.gen'\nimport { useAlert } from '../../../constants/AlertProvider'\n\nexport function AddProjects({ applicationId }) {\n    const [projects, setProjects] = useState([]);\n    // States for new project form\n    const [name, setName] = useState(\"\");\n    const [description, setDescription] = useState(\"\");\n    const [link, setLink] = useState(\"\");\n    const [startDate, setStartDate] = useState(null);\n    const [endDate, setEndDate] = useState(null);\n    const showAlert = useAlert();\n\n    // Fetch existing projects\n    useEffect(() => {\n        const fetchProjects = async () => {\n            if (!applicationId) return\n            try {\n                const res = await ApiService.apiProjectList({ application: applicationId })\n                setProjects(res.results || res)\n            } catch (e) {\n                showAlert(\"Failed to load projects\", \"error\");\n            }\n        }\n        fetchProjects();\n    }, [applicationId, showAlert])\n\n    // POST: Add new project\n    const addProject = async () => {\n        if (projects.length >= 5) {\n            showAlert(\"Only 5 projects can be added\", \"error\");\n            return;\n        }\n        const newProject = {\n            name,\n            description,\n            link,\n            start_date: startDate ? `${startDate.getFullYear()}-${String(startDate.getMonth() + 1).padStart(2, '0')}-01` : null,\n            end_date: endDate ? `${endDate.getFullYear()}-${String(endDate.getMonth() + 1).padStart(2, '0')}-01` : null,\n            application: applicationId,\n        }\n\n        if (!newProject.name || !newProject.description || !newProject.start_date) {\n            showAlert(\"Project Name, Description, and Start Date are required.\", \"error\");\n            return;\n        }\n\n        try {\n            const res = await ApiService.apiProjectCreate({ requestBody: newProject })\n            setProjects([...projects, res])\n            // Reset form\n            setName(\"\"); setDescription(\"\"); setLink(\"\"); setStartDate(null); setEndDate(null);\n        } catch (error) {\n            showAlert(\"Failed to add project\", \"error\");\n            console.log(\"Failed to add project\", error);\n        }\n    }\n\n    // PATCH: Update project\n    const handleFieldChange = (id, field, value) => {\n        setProjects(\n            projects.map((proj) =>\n                proj.id === id ? { ...proj, [field]: value } : proj\n            )\n        );\n    };\n\n    const updateProject = async (id) => {\n        const updatedProject = projects.find((proj) => proj.id === id);\n        if (!updatedProject) return;\n\n        try {\n            await ApiService.apiProjectPartialUpdate({\n                id,\n                requestBody: updatedProject,\n            });\n            showAlert(\"Project updated successfully!\", \"success\");\n        } catch (e) {\n            showAlert(\"Failed to update project\", \"error\");\n        }\n    };\n\n    const removeProject = async (id) => {\n        try {\n            await ApiService.apiProjectDestroy({ id });\n            setProjects(projects.filter((proj) => proj.id !== id));\n            showAlert(\"Project removed successfully!\", \"success\");\n        } catch (e) {\n            showAlert(\"Failed to delete project\", \"error\");\n        }\n    };\n\n    return (\n        <div className=\"flex flex-col gap-y-4\">\n            {projects.map((proj) => (\n                <div key={proj.id} className=\"p-2 flex flex-col gap-2 mb-2 bg-gray-50 rounded-lg\">\n                    <div className=\"flex justify-between items-center\">\n                        <span className=\"text-[16px] font-semibold text-gray-900\">{proj.name}</span>\n                        <button className=\"text-gray-400 flex flex-row gap-x-2 items-center justify-center hover:text-gray-500 cursor-pointer\" onClick={() => removeProject(proj.id)}>\n                            <XMarkIcon className=\"size-4\" />\n                            <span className=\"text-[14px] font-medium\">Remove</span>\n                        </button>\n                    </div>\n                    <div className=\"grid grid-cols-2 gap-4\">\n                        <div className=\"flex flex-col gap-y-2\">\n                            <label className=\"font-medium text-gray-900 text-[14px]\">Project Name</label>\n                            <input type=\"text\" value={proj.name || \"\"} onChange={e => handleFieldChange(proj.id, \"name\", e.target.value)} className=\"text-[14px] text-gray-900 border border-gray-300 focus:outline-none focus:border-blue-500 rounded-lg p-2\" />\n                        </div>\n                        <div className=\"flex flex-col gap-y-2\">\n                            <label className=\"font-medium text-gray-900 text-[14px]\">Project URL</label>\n                            <input type=\"url\" value={proj.link || \"\"} onChange={e => handleFieldChange(proj.id, \"link\", e.target.value)} className=\"text-[14px] text-gray-900 border border-gray-300 focus:outline-none focus:border-blue-500 rounded-lg p-2\" />\n                        </div>\n                        <div className=\"flex flex-col gap-y-2\">\n                            <label className=\"font-medium text-gray-900 text-[14px]\">Start Date</label>\n                            <DatePicker selected={proj.start_date ? new Date(proj.start_date) : null} onChange={date => handleFieldChange(proj.id, \"start_date\", date ? `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-01` : null)} dateFormat=\"yyyy/MM\" showMonthYearPicker className=\"w-full text-[14px] text-gray-900 border border-gray-300 focus:outline-none focus:border-blue-500 rounded-lg p-2\" />\n                        </div>\n                        <div className=\"flex flex-col gap-y-2\">\n                            <label className=\"font-medium text-gray-900 text-[14px]\">End Date</label>\n                            <DatePicker selected={proj.end_date ? new Date(proj.end_date) : null} onChange={date => handleFieldChange(proj.id, \"end_date\", date ? `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-01` : null)} dateFormat=\"yyyy/MM\" showMonthYearPicker className=\"w-full text-[14px] text-gray-900 border border-gray-300 focus:outline-none focus:border-blue-500 rounded-lg p-2\" />\n                        </div>\n                    </div>\n                    <div className=\"px-2 flex flex-col gap-y-2\">\n                        <label className=\"font-medium text-gray-900 text-[14px]\">Description</label>\n                        <textarea rows=\"4\" maxLength={1500} value={proj.description || \"\"} onChange={e => handleFieldChange(proj.id, \"description\", e.target.value)} className=\"p-2 resize-none border border-gray-300 text-[14px] focus:outline-none focus:border-blue-500 rounded-lg\" />\n                    </div>\n                    <div className='flex justify-end'>\n                        <button type=\"button\" className=\"text-[14px] font-semibold text-blue-700 cursor-pointer hover:text-blue-600 flex items-center gap-1\" onClick={() => updateProject(proj.id)}>Update</button>\n                    </div>\n                </div>\n            ))}\n            {projects.length < 5 ? (\n                <>\n                    <div className=\"grid grid-cols-2 gap-4\">\n                        <div className=\"flex flex-col gap-y-2\"><label className=\"font-medium text-gray-900 text-[14px]\">Project Name</label><input type=\"text\" value={name} onChange={e => setName(e.target.value)} className=\"text-[14px] text-gray-900 border border-gray-300 focus:outline-none focus:border-blue-500 rounded-lg p-2\" /></div>\n                        <div className=\"flex flex-col gap-y-2\"><label className=\"font-medium text-gray-900 text-[14px]\">Project URL</label><input type=\"url\" value={link} onChange={e => setLink(e.target.value)} className=\"text-[14px] text-gray-900 border border-gray-300 focus:outline-none focus:border-blue-500 rounded-lg p-2\" placeholder=\"https://my-project.com\"/></div>\n                        <div className=\"flex flex-col gap-y-2\"><label className=\"font-medium text-gray-900 text-[14px]\">Start Date</label><DatePicker selected={startDate} onChange={date => setStartDate(date)} dateFormat=\"yyyy/MM\" showMonthYearPicker className=\"w-full text-[14px] text-gray-900 border border-gray-300 focus:outline-none focus:border-blue-500 rounded-lg p-2\" /></div>\n                        <div className=\"flex flex-col gap-y-2\"><label className=\"font-medium text-gray-900 text-[14px]\">End Date</label><DatePicker selected={endDate} onChange={date => setEndDate(date)} dateFormat=\"yyyy/MM\" showMonthYearPicker className=\"w-full text-[14px] text-gray-900 border border-gray-300 focus:outline-none focus:border-blue-500 rounded-lg p-2\" /></div>\n                    </div>\n                    <div className=\"px-2 flex flex-col gap-y-2\">\n                        <label className=\"font-medium text-gray-900 text-[14px]\">Description</label>\n                        <textarea rows=\"4\" maxLength={1500} value={description} onChange={e => setDescription(e.target.value)} className=\"p-2 resize-none border border-gray-300 text-[14px] focus:outline-none focus:border-blue-500 rounded-lg\" />\n                    </div>\n                </>\n            ) : (\n                <div className=\"text-sm text-gray-500\">You can only add up to 5 project entries.</div>\n            )}\n            <div className='flex justify-end'>\n                <button type=\"button\" onClick={addProject} className={`text-[14px] font-semibold ${projects.length >= 5 ? \"cursor-none text-blue-300\" : \"text-blue-700 hover:text-blue-600 cursor-pointer\"} flex items-center gap-1`} disabled={projects.length >= 5}>\n                    Add Project\n                </button>\n            </div>\n        </div>\n    );\n}","import { useState, useEffect } from \"react\";\nimport { useNavigate, useLocation } from \"react-router-dom\";\nimport axios from \"axios\";\nimport Cookies from \"js-cookie\";\nimport { getUserDetails } from \"../../utils/getUserDetails\";\nimport { DocumentArrowUpIcon, TrashIcon } from \"@heroicons/react/20/solid\";\nimport { useAlert } from \"../../constants/AlertProvider\";\n\nexport default function ResumeUploader() {\n    const navigate = useNavigate();\n    const location = useLocation();\n    const [resumeUrl, setResumeUrl] = useState(null);\n    const [file, setFile] = useState(null);\n    const [isLoading, setIsLoading] = useState(false);\n    const [error, setError] = useState(null);\n    const showAlert = useAlert();\n    const showEditProfileButton = location.pathname === \"/profile\";\n\n    /* -------------------- Fetch Resume -------------------- */\n    useEffect(() => {\n        const fetchResume = async () => {\n            try {\n                const userDetails = await getUserDetails();\n                const userId = userDetails?.id;\n\n                if (!userId) {\n                    showAlert(\"You are logged out\", \"error\");\n                    return;\n                }\n\n                const response = await axios.get(`/api/users/${userId}/`, {\n                    withCredentials: true,\n                });\n\n                setResumeUrl(response.data.resume || null);\n            } catch (error) {\n                console.error(\"Error fetching user data:\", error);\n            }\n        };\n\n        fetchResume();\n    }, []);\n\n\n    /* -------------------- Helpers -------------------- */\n    const getFileName = (url) => {\n        if (typeof url !== \"string\") return \"\";\n        return url.split(\"/\").pop();\n    };\n\n    /* -------------------- File Select -------------------- */\n    const handleFileChange = (e) => {\n        const selectedFile = e.target.files[0];\n\n        if (\n            selectedFile &&\n            (selectedFile.type === \"application/pdf\" ||\n                selectedFile.name.toLowerCase().endsWith(\".pdf\"))\n        ) {\n            setFile(selectedFile);\n            setError(null);\n        } else {\n            setError(\"Please upload a valid PDF file\");\n            setFile(null);\n        }\n    };\n\n    /* -------------------- Upload / Update -------------------- */\n    const handleUpload = async () => {\n        if (!file) return;\n\n        setIsLoading(true);\n        try {\n            const formData = new FormData();\n            formData.append(\"file\", file); // MUST match backend field name\n\n            const response = await axios.post(\n                \"/common/resume/upload/\",\n                formData,\n                {\n                    headers: {\n                        \"X-CSRFToken\": Cookies.get(\"csrftoken\"),\n                    },\n                    withCredentials: true,\n                }\n            );\n\n            setResumeUrl(response.data.resume);\n            setFile(null);\n        } catch (err) {\n            console.error(err);\n            setError(\"Resume upload failed\");\n        } finally {\n            setIsLoading(false);\n        }\n    };\n\n    /* -------------------- Delete -------------------- */\n    const handleDelete = async () => {\n        setIsLoading(true);\n        try {\n            await axios.delete(\"/common/resume/upload/\", {\n                headers: {\n                    \"X-CSRFToken\": Cookies.get(\"csrftoken\"),\n                },\n                withCredentials: true,\n            });\n\n            setResumeUrl(null);\n        } catch (err) {\n            console.error(err);\n            setError(\"Failed to delete resume\");\n        } finally {\n            setIsLoading(false);\n        }\n    };\n\n    /* -------------------- UI -------------------- */\n    return (\n        <div className=\"p-6\">\n            <div className=\"flex items-center justify-between mb-6\">\n                <h3 className=\"text-lg font-semibold text-gray-900\">Resume</h3>\n                {showEditProfileButton && (\n                    <button\n                        onClick={() => navigate(\"/editprofile\")}\n                        className=\"inline-flex items-center px-3 py-1.5 text-sm font-medium text-blue-600 hover:text-blue-800\"\n                    >\n                        <DocumentArrowUpIcon className=\"mr-1 h-4 w-4\" />\n                        Edit Profile\n                    </button>\n                )}\n            </div>\n\n            {error && (\n                <div className=\"mb-4 p-2 text-red-600 bg-red-50 rounded-md\">\n                    {error}\n                </div>\n            )}\n\n            {isLoading ? (\n                <div className=\"flex justify-center py-6\">\n                    <div className=\"animate-spin rounded-full h-8 w-8 border-b-2 border-blue-600\"></div>\n                </div>\n            ) : resumeUrl ? (\n                /* ---------- Resume Exists ---------- */\n                <div className=\"space-y-4\">\n                    <div className=\"flex items-center justify-between p-3 bg-gray-50 rounded-md\">\n                        <div className=\"flex items-center space-x-3\">\n                            <DocumentArrowUpIcon className=\"h-6 w-6 text-gray-400\" />\n                            <a\n                                href={resumeUrl}\n                                target=\"_blank\"\n                                rel=\"noopener noreferrer\"\n                                className=\"text-blue-600 hover:underline\"\n                            >\n                                {getFileName(resumeUrl)}\n                            </a>\n                        </div>\n                        <button\n                            onClick={handleDelete}\n                            className=\"text-red-600 hover:text-red-800\"\n                        >\n                            <TrashIcon className=\"h-5 w-5\" />\n                        </button>\n                    </div>\n\n                    <div>\n                        <input\n                            type=\"file\"\n                            accept=\"application/pdf\"\n                            onChange={handleFileChange}\n                            className=\"block w-full text-sm text-gray-500\n                                file:mr-4 file:py-2 file:px-4\n                                file:rounded-md file:border-0\n                                file:text-sm file:font-semibold\n                                file:bg-blue-50 file:text-blue-700\n                                hover:file:bg-blue-100\"\n                        />\n                        {file && (\n                            <button\n                                onClick={handleUpload}\n                                className=\"mt-3 w-full px-4 py-2 text-sm font-medium text-white bg-blue-600 rounded-md hover:bg-blue-700\"\n                            >\n                                Replace Resume\n                            </button>\n                        )}\n                    </div>\n                </div>\n            ) : (\n                /* ---------- No Resume ---------- */\n                <div className=\"space-y-4\">\n                    <div className=\"text-center py-6 bg-gray-100 rounded-md\">\n                        <DocumentArrowUpIcon className=\"mx-auto h-12 w-12 text-gray-400\" />\n                        <p className=\"mt-2 text-sm text-gray-500\">\n                            No resume uploaded yet\n                        </p>\n                    </div>\n\n                    <input\n                        type=\"file\"\n                        accept=\"application/pdf\"\n                        onChange={handleFileChange}\n                        className=\"block w-full text-sm text-gray-500\n                            file:mr-4 file:py-2 file:px-4\n                            file:rounded-md file:border-0\n                            file:text-sm file:font-semibold\n                            file:bg-blue-50 file:text-blue-700\n                            hover:file:bg-blue-100\"\n                    />\n\n                    {file && (\n                        <button\n                            onClick={handleUpload}\n                            className=\"w-full px-4 py-2 text-sm font-medium text-white bg-blue-600 rounded-md hover:bg-blue-700\"\n                        >\n                            Upload Resume\n                        </button>\n                    )}\n                </div>\n            )}\n        </div>\n    );\n}\n","import { useState, useEffect } from \"react\";\nimport axios from \"axios\";\nimport Cookies from \"js-cookie\";\nimport { useLocation } from \"react-router-dom\";\nimport { useAlert } from '../../../constants/AlertProvider';\nimport { useNavigate } from \"react-router\";\nimport { ApiService } from \"../../../api/services.gen\";\nimport { getUserDetails } from \"../../../utils/getUserDetails\";\nimport { AddEducation } from \"./AddEducation\";\nimport { AddWorkExp } from \"./AddWorkExp\";\nimport { AddSkills } from \"./AddSkills\";\nimport { AddProjects } from \"./AddProjects\";\nimport { Country, State, City } from \"country-state-city\";\nimport ProfilePic from \"../../../../assets/images/blank-profile-pic.png\";\nimport ImageModal from \"../../common/ImageModal\";\nimport CircularProgress from '@mui/material/CircularProgress';\nimport Navbar from \"../../../constants/Navbar\"\nimport HomeNavbar from \"../HomeNavbar\";\nimport ResumeUploader from \"../ResumeUploader\";\n\nexport default function OnboardingProfile() {\n    const location = useLocation();\n    const isEditMode = location.state?.from === \"edit\";\n    const [isLoading, setIsLoading] = useState(true);\n    const [userData, setUserData] = useState({ profile_picture: \"\", address: \"\" });\n    const [appData, setAppData] = useState({ summary: \"\", linkedin: \"\", portfolio: \"\", github: \"\", description: \"\" }); //description is been used as candidate title\n    const [applicationId, setApplicationId] = useState(null);\n    const [showImageModal, setShowImageModal] = useState(false);\n    const [profilePic, setProfilePic] = useState(\"\");\n    const [showAddEducation, setShowAddEducation] = useState(false);\n    const [showAddWorkExp, setShowAddWorkExp] = useState(false);\n    const [showAddSkills, setShowAddSkills] = useState(false);\n    const [showAddProjects, setShowAddProjects] = useState(false);\n    const [loading, setLoading] = useState(false);\n    const navigate = useNavigate();\n    const showAlert = useAlert();\n\n    // Location state\n    const [city, setCity] = useState(\"\");\n    const [country, setCountry] = useState(\"\");\n    const [state, setState] = useState(\"\");\n    const [countries, setCountries] = useState([]);\n    const [states, setStates] = useState([]);\n    const [cities, setCities] = useState([]);\n    const [selectedCountry, setSelectedCountry] = useState(null);\n    const [selectedState, setSelectedState] = useState(null);\n    const [latitude, setLatitude] = useState(null);\n    const [longitude, setLongitude] = useState(null);\n\n    useEffect(() => {\n        const fetchProfile = async () => {\n            setIsLoading(true);\n            const userDetails = await getUserDetails();\n            const userId = userDetails?.id;\n            try {\n                const userRes = await axios.get(`/api/users/${userId}/`, { withCredentials: true })\n                setUserData(userRes.data);\n\n                const allCountries = Country.getAllCountries();\n                setCountries(allCountries);\n\n                const address = userRes.data.address_details;\n                const userCountryName = address?.country;\n                const userStateName = address?.state_province;\n                const userCityName = address?.city;\n                setLatitude(address?.latitude);\n                setLongitude(address?.longitude);\n\n                if (userCountryName) {\n                    const countryObj = allCountries.find(c => c.name === userCountryName);\n                    if (countryObj) {\n                        setSelectedCountry(countryObj);\n                        setCountry(countryObj.name);\n                        const countryStates = State.getStatesOfCountry(countryObj.isoCode);\n                        setStates(countryStates);\n\n                        if (userStateName) {\n                            const stateObj = countryStates.find(s => s.name === userStateName);\n                            if (stateObj) {\n                                setSelectedState(stateObj);\n                                setState(stateObj.name);\n                                setCities(City.getCitiesOfState(countryObj.isoCode, stateObj.isoCode));\n                            }\n                        }\n                    }\n                }//tt\n                setCity(userCityName || \"\");\n                setProfilePic(userRes.data.profile_picture || \"\");\n\n                const appId = userRes.data.applicationids[0].id;\n                setApplicationId(appId);\n\n                const appRes = await axios.get(`/api/application/${appId}/`, { withCredentials: true });\n                setAppData(appRes.data);\n            } catch (error) {\n                showAlert(\"Error fetching user data\", \"error\");\n                console.error(\"Error fetching user data:\", error);\n            } finally {\n                setIsLoading(false);\n            }\n        }\n        fetchProfile();\n    }, []);\n\n    const handleImageCropped = async (file) => {\n        try {\n            const userDetails = await getUserDetails();\n            const userId = userDetails?.id;\n            const formData = new FormData();\n            formData.append(\"profile_picture\", file);\n\n            // Get CSRF token from cookies\n            const csrftoken = Cookies.get(\"csrftoken\")\n\n            const response = await axios.patch(\n                `/api/users/${userId}/`,\n                formData,\n                {\n                    headers: {\n                        \"Content-Type\": \"multipart/form-data\",\n                        ...(csrftoken && { \"X-CSRFTOKEN\": csrftoken }),\n                    },\n                    withCredentials: true,\n                }\n            );\n            setProfilePic(response.data.profile_picture || URL.createObjectURL(file));\n            setShowImageModal(false);\n            showAlert(\"Profile updated!\", \"success\");\n        } catch (error) {\n            setShowImageModal(false);\n            showAlert(\"Failed to update profile\", \"error\");\n            console.error(\"error\", error);\n        }\n    };\n\n    const handleSave = async () => {\n        setLoading(true);\n\n        // --- Validation ---\n        if (!appData.summary.trim()) {\n            showAlert(\"Please provide a professional summary.\", \"error\");\n            setLoading(false);\n            return;\n        }\n        if (!country || !state) {\n            showAlert(\"Please select your full location (Country, State).\", \"error\");\n            setLoading(false);\n            return;\n        }\n\n        const isValidUrl = (urlString) => {\n            if (!urlString.trim()) return true; // Allow empty fields\n            try {\n                new URL(urlString);\n                return true;\n            } catch (_) {\n                return false;\n            }\n        };\n\n        if (!isValidUrl(appData.linkedin)) {\n            showAlert(\"Please enter a valid LinkedIn URL\", \"error\");\n            setLoading(false);\n            return;\n        }\n\n        try {\n            const userDetails = await getUserDetails();\n            const userId = userDetails?.id;\n            if (!userId) {\n                showAlert(\"User not found\", \"error\");\n                return;\n            }\n\n            // --- User and Address Data Handling ---\n            const addressDetails = userData.address_details;\n            const hasAddressChanged = city !== (addressDetails?.city || \"\") || state !== (addressDetails?.state_province || \"\") || country !== (addressDetails?.country || \"\");\n\n            if (hasAddressChanged) {\n                // The backend now handles nested address updates.\n                // We send the address details as part of the user update, using 'address_details'\n                // which is consistent with how data is read.\n                await ApiService.apiUsersPartialUpdate({\n                    id: userId,\n                    requestBody: {\n                        address_data: { city, state_province: state, country, latitude, longitude }\n                    }\n                });\n            }\n\n            // --- Application Data Handling ---\n            await ApiService.apiApplicationPartialUpdate({\n                id: applicationId,\n                requestBody: {\n                    summary: appData.summary,\n                    linkedin: appData.linkedin,\n                    portfolio: appData.portfolio,\n                    github: appData.github,\n                    description: appData.description,\n                }\n            });\n\n            showAlert(\"Profile updated!\", \"success\");\n            if (isEditMode) {\n                navigate(\"/profile\");\n            } else {\n                navigate(\"/setpreferences\");\n            }\n        } catch (error) {\n            showAlert(\"Failed to update profile\", \"error\");\n            console.error(\"error\", error);\n        } finally {\n            setLoading(false);\n        }\n    };\n\n    const handleCountryChange = (isoCode) => {\n        const countryObj = countries.find((c) => c.isoCode === isoCode);\n        setSelectedCountry(countryObj);\n        setCountry(countryObj ? countryObj.name : \"\");\n        setStates(State.getStatesOfCountry(isoCode));\n        setSelectedState(null);\n        setCities([]);\n        setCity(\"\");\n    };\n\n    const handleStateChange = (isoCode) => {\n        const stateObj = states.find((s) => s.isoCode === isoCode);\n        setSelectedState(stateObj);\n        setState(stateObj ? stateObj.name : \"\");\n        if (selectedCountry) {\n            setCities(City.getCitiesOfState(selectedCountry.isoCode, isoCode));\n        } else {\n            setCities([]);\n        }\n        setCity(\"\");\n    };\n\n    const handleUseCurrentLocation = () => {\n        if (!navigator.geolocation) {\n            showAlert(\"Geolocation is not supported by your browser.\", \"error\");\n            return;\n        }\n\n        setLoading(true);\n        navigator.geolocation.getCurrentPosition(\n            async (position) => {\n                const { latitude, longitude } = position.coords;\n                setLatitude(latitude);\n                setLongitude(longitude);\n\n                try {\n                    const response = await fetch(`https://nominatim.openstreetmap.org/reverse?format=json&lat=${latitude}&lon=${longitude}`);\n                    const data = await response.json();\n\n                    if (data.address) {\n                        const { city, state: stateName, country: countryName } = data.address;\n                        const allCountries = Country.getAllCountries();\n                        const countryObj = allCountries.find(c => c.name.toLowerCase() === countryName.toLowerCase());\n                        if (countryObj) {\n                            handleCountryChange(countryObj.isoCode);\n                            const countryStates = State.getStatesOfCountry(countryObj.isoCode);\n                            const stateObj = countryStates.find(s => s.name.toLowerCase() === stateName.toLowerCase());\n                            if (stateObj) {\n                                handleStateChange(stateObj.isoCode);\n                                setCity(city || \"\");\n                            }\n                        }\n                    }\n                    showAlert(\"Location updated!\", \"success\");\n                } catch (error) {\n                    showAlert(\"Could not fetch location details.\", \"error\");\n                } finally {\n                    setLoading(false);\n                }\n            },\n            () => {\n                setLoading(false);\n                showAlert(\"Unable to retrieve your location. Please enable location services.\", \"error\");\n            }\n        );\n    };\n\n    if (isLoading) {\n        return (\n            <>\n                {isEditMode ? <HomeNavbar /> : <Navbar />}\n                <div className={`max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-10 text-center ${isEditMode && \"mt-14\"}`}>\n                    <h1 className=\"text-2xl font-bold\">Loading Your Profile...</h1>\n                </div>\n            </>\n        );\n    }\n\n    return (\n        <>\n            {isEditMode ? <HomeNavbar /> : <Navbar />}\n            <div className={`p-2 flex flex-col items-center ${isEditMode && \"mt-14\"}`}>\n                <div className=\"flex flex-col p-4 md:p-6 w-full max-w-6xl gap-y-2\">\n                    <div className=\"w-full flex flex-col p-2 mb-4\">\n                        <h1 className=\"text-gray-900 font-bold text-lg md:text-3xl tracking-tight\">{isEditMode ? \"Update Your Info\" : \"A last few details, and we'll get your profile ready for matches!\"}</h1>\n                    </div>\n\n                    <div className=\"flex flex-col lg:flex-row w-full gap-4\">\n                        <div className=\"w-full md:w-lg p-2 md:p-4\">\n                            <p className=\"text-lg font-semibold\">Profile</p>\n                            <p className=\"text-gray-600 text-[14px]\">This will be used to match you with the right opportunities</p>\n                        </div>\n\n                        <div className=\"flex flex-col flex-1 text-gray-900 p-2 md:p-4\">\n                            {/* <ResumeUploader /> */}\n                            <ResumeUploader isOnboarding={true} />\n                            <div className=\"flex flex-col gap-y-2 mb-8\">\n                                <label htmlFor=\"summary\" className=\"text-[14px] font-medium\">Summary*</label>\n                                <textarea rows=\"2\" cols=\"25\" maxLength={500} value={appData.summary} onChange={e => setAppData({ ...appData, summary: e.target.value })} className=\"p-2 resize-none border-2 border-gray-300 text-[14px] focus:outline-none focus:border-blue-500 rounded-lg\"></textarea>\n                                <p className=\"text-gray-600 text-[14px] font-light\">Describe your expertise and add profile summary in your own words</p>\n                            </div>\n                            <div className=\"flex flex-col gap-y-2 mb-8\">\n                                <label htmlFor=\"summary\" className=\"text-[14px] font-medium\">I'm a*</label>\n                                <input value={appData.description} onChange={e => setAppData({ ...appData, description: e.target.value })} className=\"p-2 border-2 border-gray-300 text-[14px] focus:outline-none focus:border-blue-500 rounded-lg\" placeholder=\"eg., Software Engineer\"/>\n                            </div>\n\n                            <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4 mb-8\">\n                                <div className=\"md:col-span-2 flex items-end justify-between\">\n                                    <p className=\"text-[14px] font-medium\">Address*</p>\n                                    <button\n                                        type=\"button\"\n                                        onClick={handleUseCurrentLocation}\n                                        className=\"text-sm font-medium text-blue-600 hover:text-blue-800\"\n                                    >\n                                        Use my current location\n                                    </button>\n                                </div>\n                                <div>\n                                    <label className=\"text-[14px] font-medium\">Country*</label>\n                                    <select\n                                        value={selectedCountry?.isoCode || \"\"}\n                                        onChange={(e) => handleCountryChange(e.target.value)}\n                                        className=\"w-full p-2 text-sm border-2 border-gray-300 focus:outline-none focus:border-blue-500 rounded-lg\"\n                                        required\n                                    >\n                                        <option value=\"\">Select Country</option>\n                                        {countries.map((c) => (\n                                            <option key={c.isoCode} value={c.isoCode}>\n                                                {c.name}\n                                            </option>\n                                        ))}\n                                    </select>\n                                </div>\n                                <div>\n                                    <label className=\"text-[14px] font-medium\">State*</label>\n                                    <select\n                                        value={selectedState?.isoCode || \"\"}\n                                        onChange={(e) => handleStateChange(e.target.value)}\n                                        disabled={!selectedCountry}\n                                        className=\"w-full p-2 text-sm border-2 border-gray-300 focus:outline-none focus:border-blue-500 rounded-lg disabled:bg-gray-100\"\n                                    >\n                                        <option value=\"\">Select State</option>\n                                        {states.map((s) => (\n                                            <option key={s.isoCode} value={s.isoCode}>\n                                                {s.name}\n                                            </option>\n                                        ))}\n                                    </select>\n                                </div>\n                                <div className=\"md:col-span-2\">\n                                    <label className=\"text-[14px] font-medium\">City*</label>\n                                    <select\n                                        value={city}\n                                        onChange={(e) => setCity(e.target.value)}\n                                        disabled={!selectedState}\n                                        className=\"w-full p-2 text-sm border-2 border-gray-300 focus:outline-none focus:border-blue-500 rounded-lg disabled:bg-gray-100\"\n                                        required\n                                    >\n                                        <option value=\"\">Select City</option>\n                                        {cities.map((c) => (\n                                            <option key={c.name} value={c.name}>\n                                                {c.name}\n                                            </option>\n                                        ))}\n                                    </select>\n                                </div>\n                            </div>\n\n                            {/* social links */}\n                            <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4 mb-8\">\n                                <div className=\"flex flex-col gap-y-2\">\n                                    <label htmlFor=\"linkedin\" className=\"text-[14px] font-medium\">Linkedin*</label>\n                                    <input name=\"linkedin\" id=\"linkedin\" type=\"url\" value={appData.linkedin} onChange={e => setAppData({ ...appData, linkedin: e.target.value })} className=\"max-w-md p-2 text-sm border-2 border-gray-300 focus:outline-none focus:border-blue-500 rounded-lg\" placeholder=\"https://www.linkedin.com/in/...\" />\n                                </div>\n                                <div className=\"flex flex-col gap-y-2\">\n                                    <label htmlFor=\"portfolio\" className=\"text-[14px] font-medium\">Portfolio</label>\n                                    <input name=\"portfolio\" id=\"portfolio\" type=\"url\" value={appData.portfolio} onChange={e => setAppData({ ...appData, portfolio: e.target.value })} className=\"max-w-md p-2 text-sm border-2 border-gray-300 focus:outline-none focus:border-blue-500 rounded-lg\" placeholder=\"https://my-portfolio.com\" />\n                                </div>\n                            </div>\n\n                            <div className=\"flex flex-col gap-y-2 mb-8\">\n                                <label htmlFor=\"github\" className=\"text-[14px] font-medium\">Github</label>\n                                <input name=\"github\" id=\"github\" type=\"url\" value={appData.github} onChange={e => setAppData({ ...appData, github: e.target.value })} className=\"max-w-md p-2 text-sm border-2 border-gray-300 focus:outline-none focus:border-blue-500 rounded-lg\" placeholder=\"https://github.com/your-username\" />\n                            </div>\n                            {/* profile-photo */}\n                            <div className=\"flex flex-col gap-y-2\">\n                                <p className=\"text-[14px] font-medium text-gray-900\">Photo</p>\n                                <div className=\"flex flex-row gap-x-4 items-center mb-8\">\n                                    <div className=\"w-12 h-12 rounded-full flex items-center justify-center shadow-md overflow-hidden\">\n                                        <img\n                                            src={profilePic || ProfilePic}\n                                            alt=\"Profile\"\n                                            className=\"w-full h-full object-cover\"\n                                        />\n                                    </div>\n                                    <button className=\"w-18 h-8 border-2 border-gray-300 rounded-lg hover:bg-gray-100 text-[14px] font-semibold\"\n                                        onClick={() => setShowImageModal(true)}\n                                    >\n                                        Change\n                                    </button>\n                                </div>\n                                {showImageModal && (\n                                    <ImageModal\n                                        closeModal={() => setShowImageModal(false)}\n                                        onImageCropped={handleImageCropped}\n                                    />\n                                )}\n                            </div>\n\n                            <div className=\"mt-2 flex flex-col w-full gap-y-4 mb-4\">\n                                {/* Education Section */}\n                                <div className=\"flex flex-row justify-between\">\n                                    <h1 className=\"text-[24px] font-bold text-gray-900\">Education</h1>\n                                    <button\n                                        type=\"button\"\n                                        className=\"text-[14px] font-semibold text-blue-700 cursor-pointer hover:text-blue-600 flex items-center gap-1\"\n                                        onClick={() => setShowAddEducation((prev) => !prev)}\n                                    >\n                                        <span className=\"text-[24px] font-light\">{showAddEducation ? \"-\" : \"+\"}</span>\n                                        <span>{showAddEducation ? \"Collapse\" : \"Add Education\"}</span>\n                                    </button>\n                                </div>\n                                {showAddEducation && applicationId && (\n                                    <AddEducation applicationId={applicationId} />\n                                )}\n                                <div className=\"flex flex-row justify-between\">\n                                    <h1 className=\"text-[24px] font-bold text-gray-900\">Experience</h1>\n                                    <button type=\"button\" onClick={() => setShowAddWorkExp((prev) => !prev)} className=\"text-[14px] font-semibold text-blue-700 cursor-pointer hover:text-blue-600 flex items-center gap-1\">\n                                        <span className=\"text-[24px] font-light\">{showAddWorkExp ? \"-\" : \"+\"}</span>\n                                        <span>{showAddWorkExp ? \"Collapse\" : \"Add Work Experience\"}</span>\n                                    </button>\n                                </div>\n                                {showAddWorkExp && applicationId && (\n                                    <AddWorkExp applicationId={applicationId} />\n                                )}\n                                <div className=\"flex flex-row justify-between\">\n                                    <h1 className=\"text-[24px] font-bold text-gray-900\">Skills</h1>\n                                    <button type=\"button\" onClick={() => setShowAddSkills((prev) => !prev)} className=\"text-[14px] font-semibold text-blue-700 cursor-pointer hover:text-blue-600 flex items-center gap-1\">\n                                        <span className=\"text-[24px] font-light\">{showAddSkills ? \"-\" : \"+\"}</span>\n                                        <span>{showAddSkills ? \"Collapse\" : \"Add Skills\"}</span>\n                                    </button>\n                                </div>\n                                {showAddSkills && applicationId && (\n                                    <AddSkills applicationId={applicationId} />\n                                )}\n\n                                <div className=\"flex flex-row justify-between\">\n                                    <h1 className=\"text-[24px] font-bold text-gray-900\">Projects</h1>\n                                    <button type=\"button\" onClick={() => setShowAddProjects((prev) => !prev)} className=\"text-[14px] font-semibold text-blue-700 cursor-pointer hover:text-blue-600 flex items-center gap-1\">\n                                        <span className=\"text-[24px] font-light\">{showAddProjects ? \"-\" : \"+\"}</span>\n                                        <span>{showAddProjects ? \"Collapse\" : \"Add Projects\"}</span>\n                                    </button>\n                                </div>\n                                {showAddProjects && applicationId && (\n                                    <AddProjects applicationId={applicationId} />\n                                )}\n                            </div>\n                        </div>\n                    </div>\n                    <hr className=\"w-full text-gray-300\" />\n                </div>\n                <div className=\"w-full flex justify-end p-6\">\n                    <button\n                        type=\"button\"\n                        onClick={handleSave}\n                        disabled={loading} // optional: disable button while saving\n                        className=\"text-white min-w-[180px] h-10 text-center font-medium text-sm bg-blue-700 px-4 rounded-lg cursor-pointer hover:bg-blue-600 flex items-center justify-center gap-2\"\n                    >\n                        {loading ? (\n                            <>\n                                <CircularProgress size={20} color=\"inherit\" />\n                                Saving...\n                            </>\n                        ) : (\n                            <>{isEditMode ? \"Update Profile\" : \"Next, Add Preferences\"}</>\n                        )}\n                    </button>\n                </div>\n\n            </div>\n        </>\n    );\n}","import { useState, useEffect } from \"react\";\nimport { MagnifyingGlassIcon, XMarkIcon } from \"@heroicons/react/24/outline\";\nimport Navbar from \"../../../constants/Navbar\";\nimport { useAlert } from '../../../constants/AlertProvider';\nimport { useNavigate } from \"react-router\";\nimport { ApiService } from \"../../../api/services.gen\";\nimport { getUserDetails } from \"../../../utils/getUserDetails\";\nimport axios from \"axios\";\n\nexport default function OnboardingSkills() {\n    const [query, setQuery] = useState(\"\");\n    const [suggestions, setSuggestions] = useState([]);\n    const [selectedSkills, setSelectedSkills] = useState([]);\n    const [applicationId, setApplicationId] = useState(null);\n    const navigate = useNavigate();\n    const showAlert = useAlert();\n\n    useEffect(() => {\n        const fetchProfile = async () => {\n            const userDetails = await getUserDetails();\n            const userId = userDetails?.id;\n            if (!userId) {\n                console.error(\"User ID not found\");\n                return;\n            }\n            try {\n                const userRes = await axios.get(`/api/users/${userId}/`, { withCredentials: true })\n                const appId = userRes.data.applicationids[0].id;\n                setApplicationId(appId);\n            } catch {\n                showAlert(\"Unable to fetch app ID\", \"error\");\n            }\n        };\n        fetchProfile();\n    }, []);\n\n    useEffect(() => {\n        const fetchSkills = async () => {\n            if (query.trim().length < 2) {\n                setSuggestions([]);\n                return;\n            }\n            try {\n                const res = await axios.get(`/api/matching-skills/autocomplete/?q=${query}`);\n                setSuggestions(res.data.skills);\n            } catch (err) {\n                console.error(\"Error fetching skills:\", err);\n            }\n        };\n        const delayDebounce = setTimeout(fetchSkills, 300);\n        return () => clearTimeout(delayDebounce);\n    }, [query]);\n\n    const addSkill = (skillObj) => {\n        if (!selectedSkills.some(s => s.id === skillObj.id)) {\n            setSelectedSkills([...selectedSkills, skillObj]);\n        }\n        setQuery(\"\");\n        setSuggestions([]);\n    };\n\n    const removeSkill = (skillObj) => {\n        setSelectedSkills(selectedSkills.filter((s) => s.id !== skillObj.id));\n    };\n\n    const handleKeyDown = (e) => {\n        if (e.key === \"Enter\" && query.trim() !== \"\") {\n            e.preventDefault();\n            addSkill({ name: query.trim(), id: null });\n        }\n    };\n\n    const handleNext = async () => {\n        if (!applicationId) {\n            showAlert(\"Application ID not found\", \"error\");\n            return;\n        }\n        try {\n            for (const skill of selectedSkills) {\n                await ApiService.apiSkillCreate({\n                    requestBody: {\n                        application: applicationId,\n                        name: skill.name,\n                        score: 5,\n                        matching_skill_id: skill.id || null\n                    }\n                });\n            }\n            navigate(\"/setprofile\");\n        } catch (err) {\n            showAlert(\"Failed to save skills\", \"error\");\n            console.error(\"Failed to save skills:\", err);\n        }\n    };\n\n    return (\n        <>\n            <Navbar />\n            <div className=\"p-4 flex flex-col items-center\">\n                <div className=\"flex flex-col items-center justify-center p-4 md:p-6 w-full md:w-3/5 gap-y-6\">\n                    <div className=\"w-full flex flex-col items-center justify-center p-6 gap-y-4\">\n                        <h1 className=\"text-gray-900 font-bold text-xl md:text-3xl\">What are you great at?</h1>\n                        <p className=\"text-gray-900 font-normal text-[10px] md:text-[14px]\">Add your core expertise and skills. This is how we match you to the right projects. Be specific and you can add more later!</p>\n                    </div>\n                    <div className=\"w-full flex flex-col items-center gap-y-4\">\n                        <div className=\"w-full md:w-4/5 flex flex-col gap-y-2 mb-4\">\n                            <label htmlFor=\"skill\" className=\"text-gray-900 font-semibold text-[16px]\">\n                                Skills and Expertise\n                            </label>\n                            <div className=\"relative\">\n                                <MagnifyingGlassIcon className=\"absolute left-3 top-1/2 -translate-y-1/2 h-5 w-5 text-gray-500\" />\n                                <input\n                                    type=\"text\"\n                                    id=\"skill\"\n                                    value={query}\n                                    onChange={(e) => setQuery(e.target.value)}\n                                    onKeyDown={handleKeyDown}\n                                    className=\"w-full pl-10 pr-4 h-12 text-gray-900 border-2 border-gray-300 rounded-lg outline-none focus:border-blue-500\"\n                                    placeholder=\"Search...\"\n                                    required\n                                />\n                                {suggestions.length > 0 && (\n                                    <ul className=\"absolute top-full mt-1 w-full border border-gray-300 rounded-lg bg-white shadow-lg max-h-48 overflow-y-auto z-10\">\n                                        {suggestions.map((skill, idx) => (\n                                            <li\n                                                key={skill.id || idx}\n                                                onClick={() => addSkill(skill)}\n                                                className=\"p-2 hover:bg-gray-100 cursor-pointer text-[14px] text-gray-900\"\n                                            >\n                                                {skill.name}\n                                            </li>\n                                        ))}\n                                    </ul>\n                                )}\n                            </div>\n                        </div>\n                        <div className=\"w-4/5 flex flex-wrap gap-2\">\n                            {selectedSkills.map((skill, idx) => (\n                                <div\n                                    key={skill.id || idx}\n                                    className=\"p-2 h-10 border-2 border-blue-700 bg-blue-50 flex flex-row gap-x-2 items-center rounded-lg\"\n                                >\n                                    <span className=\"text-blue-700 text-[16px] font-medium\">{skill.name}</span>\n                                    <button type=\"button\" onClick={() => removeSkill(skill)}>\n                                        <XMarkIcon className=\"size-4 text-blue-700/50 cursor-pointer\" />\n                                    </button>\n                                </div>\n                            ))}\n                        </div>\n                    </div>\n                </div>\n            </div>\n            <div className=\"fixed bottom-6 right-8 z-50\">\n                <button type=\"button\" onClick={handleNext} className=\"text-white h-10 font-medium text-sm bg-blue-700 px-4 rounded-lg cursor-pointer hover:bg-blue-600\">\n                    Next, review your profile\n                </button>\n            </div>\n        </>\n    );\n}","import HomeNavbar from \"./HomeNavbar\"\nimport { motion, AnimatePresence } from \"framer-motion\";\nimport CompanyLogo from \"../../../assets/images/un_resume_logo2.png\";\nimport { MapPinIcon, ClockIcon, CalendarIcon, TagIcon, SearchIcon } from 'lucide-react'\n\nexport default function Volunteer() {\n\n    // const filteredJobs = useMemo(() => {\n    //     return jobs.filter(job => {\n    //         const matchesSearch =\n    //             job.title.toLowerCase().includes(searchQuery.toLowerCase()) ||\n    //             job.companyName.toLowerCase().includes(searchQuery.toLowerCase());\n\n    //         const matchesFilters =\n    //             (!filters.location || job.location.toLowerCase().includes(filters.location.toLowerCase())) &&\n    //             (!filters.minSalary || parseInt(job.salary) >= parseInt(filters.minSalary)) &&\n    //             (!filters.jobType || job.type === filters.jobType);\n\n    //         return matchesSearch && matchesFilters;\n    //     });\n    // }, [jobs, searchQuery, filters]);\n\n    return (\n        <>\n            <HomeNavbar />\n            <div className=\"mt-16 p-6 bg-gray-50\">\n                {/* Header */}\n                <div className=\"p-4 mt-6 mb-8\">\n                    <h1 className=\"text-4xl text-gray-800 font-semibold mb-6\">Volunteer Opportunities</h1>\n                    <p className=\"text-gray-600 mb-8 font-extralight\">\n                        Find meaningful volunteer positions with small and medium-sized enterprises. Help local businesses grow <br /> while gaining valuable experience and making a difference in your community.\n                    </p>\n                </div>\n\n                {/* Search box */}\n                <div className=\"bg-white p-6 rounded-lg shadow-sm mb-8\">\n                    <div className=\"flex flex-col md:flex-row md:items-center gap-4 mb-6\">\n                        <div className=\"relative flex-grow\">\n                            <SearchIcon className=\"absolute left-3 top-3 h-5 w-5 text-gray-400\" />\n                            <input\n                                type=\"text\"\n                                placeholder=\"Search for volunteer opportunities...\"\n                                className=\"w-full pl-10 pr-4 py-2 border border-gray-300 rounded-full focus:outline-none focus:ring-2 focus:ring-blue-500\"\n                            />\n                        </div>\n                        <div className=\"flex gap-2\">\n                            <button className=\"px-4 py-2 bg-blue-600 text-white rounded-full hover:bg-blue-700 transition-colors\">\n                                Search\n                            </button>\n                            <button className=\"px-4 py-2 border border-gray-300 text-gray-700 rounded-full hover:bg-gray-50 transition-colors\">\n                                Clear\n                            </button>\n                        </div>\n                    </div>\n                    <div className=\"flex flex-wrap gap-4\">\n                        <div className=\"w-full sm:w-auto\">\n                            <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n                                Location\n                            </label>\n                            <div className=\"relative\">\n                                <MapPinIcon className=\"absolute left-3 top-2 h-5 w-5 text-gray-400\" />\n                                <select className=\"w-full pl-10 pr-8 py-2 border border-gray-300 rounded-full appearance-none focus:outline-none focus:ring-2 focus:ring-blue-500\">\n                                    <option value=\"\">Any Location</option>\n                                    <option value=\"remote\">Remote</option>\n                                    <option value=\"london\">London</option>\n                                    <option value=\"manchester\">Manchester</option>\n                                    <option value=\"birmingham\">Birmingham</option>\n                                    <option value=\"edinburgh\">Edinburgh</option>\n                                </select>\n                            </div>\n                        </div>\n                        <div className=\"w-full sm:w-auto\">\n                            <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n                                Time Commitment\n                            </label>\n                            <div className=\"relative\">\n                                <ClockIcon className=\"absolute left-3 top-2 h-5 w-5 text-gray-400\" />\n                                <select className=\"w-full pl-10 pr-8 py-2 border border-gray-300 rounded-full appearance-none focus:outline-none focus:ring-2 focus:ring-blue-500\">\n                                    <option value=\"\">Any Time</option>\n                                    <option value=\"one-time\">One-time</option>\n                                    <option value=\"weekly\">Weekly</option>\n                                    <option value=\"monthly\">Monthly</option>\n                                    <option value=\"flexible\">Flexible</option>\n                                </select>\n                            </div>\n                        </div>\n                        <div className=\"w-full sm:w-auto\">\n                            <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n                                Category\n                            </label>\n                            <div className=\"relative\">\n                                <TagIcon className=\"absolute left-3 top-2 h-5 w-5 text-gray-400\" />\n                                <select className=\"w-full pl-10 pr-8 py-2 border border-gray-300 rounded-full appearance-none focus:outline-none focus:ring-2 focus:ring-blue-500\">\n                                    <option value=\"\">All Categories</option>\n                                    <option value=\"marketing\">Marketing</option>\n                                    <option value=\"tech\">Technology</option>\n                                    <option value=\"design\">Design</option>\n                                    <option value=\"finance\">Finance</option>\n                                    <option value=\"operations\">Operations</option>\n                                </select>\n                            </div>\n                        </div>\n                    </div>\n                </div>\n\n                {/*Volunteer Job Cards */}\n                <div\n                    className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6\">\n                    <div className=\"bg-white rounded-lg shadow-sm overflow-hidden border border-gray-100 hover:shadow-md transition-shadow duration-200\">\n                        <div\n                            className=\"h-3\"\n                            style={{\n                                backgroundColor: \"pink\",\n                            }}\n                        ></div>\n                        <motion.div\n                            whileHover={{ scale: 1.02 }}\n                            whileTap={{ scale: 0.98 }}\n                            className=\"p-6\">\n                            <div className=\"flex items-start justify-between mb-3\">\n                                <div>\n                                    <h3 className=\"font-bold text-lg text-gray-800 mb-1\">\n                                        title\n                                    </h3>\n                                    <p className=\"text-gray-600 font-medium\">company</p>\n                                </div>\n                                <img\n                                    src={CompanyLogo}\n                                    alt={'Company logo'}\n                                    className=\"w-12 h-12 object-contain rounded\"\n                                />\n                            </div>\n                            <div className=\"space-y-2 mb-4\">\n                                <div className=\"flex items-center text-gray-500\">\n                                    <MapPinIcon className=\"h-4 w-4 mr-2\" />\n                                    <span className=\"text-sm\">location</span>\n                                </div>\n                                <div className=\"flex items-center text-gray-500\">\n                                    <ClockIcon className=\"h-4 w-4 mr-2\" />\n                                    <span className=\"text-sm\">commitment</span>\n                                </div>\n                                <div className=\"flex items-center text-gray-500\">\n                                    <CalendarIcon className=\"h-4 w-4 mr-2\" />\n                                    <span className=\"text-sm\">Posted a week ago</span>\n                                </div>\n                            </div>\n                            <p className=\"text-gray-600 mb-4 line-clamp-3\">description</p>\n                            <div className=\"mb-4\">\n                                <div className=\"flex flex-wrap gap-2\">\n                                    <span\n                                        className=\"px-2 py-1 bg-gray-100 text-gray-700 rounded text-xs font-medium\"\n                                    >\n                                        skill\n                                    </span>\n                                    <span className=\"px-2 py-1 bg-gray-100 text-gray-500 rounded text-xs font-medium\">\n                                        +2 more\n                                    </span>\n                                </div>\n                            </div>\n                            <div className=\"flex justify-between items-center\">\n                                <button className=\"px-4 py-2 bg-blue-600 text-white rounded-md hover:bg-blue-700 transition-colors text-sm font-medium\">\n                                    Apply Now\n                                </button>\n                                <button className=\"px-4 py-2 text-blue-600 hover:bg-blue-50 rounded-md transition-colors text-sm font-medium\">\n                                    Learn More\n                                </button>\n                            </div>\n                        </motion.div>\n                    </div>\n                </div>\n            </div>\n        </>\n    )\n}","export function formatField(key: string, value: string | number): string {\n  if (!value) return \"\";\n\n  switch (key) {\n    case \"job_type\":\n      return value\n        .toString()\n        .replace(\"-\", \" \")\n        .replace(/\\b\\w/g, (c) => c.toUpperCase()); // full-time → Full Time\n\n    case \"employee_count\":\n      return value.toString().replace(\"_\", \"-\"); // 31_50 → 31-50\n\n    case \"salary\": {\n      const num = typeof value === \"string\" ? parseFloat(value) : value;\n      if (isNaN(num)) return value.toString();\n      return num.toLocaleString(\"en-US\", {\n        minimumFractionDigits: 0,\n        maximumFractionDigits: 2,\n      }); // 120.00 → 120 / 10,000.50 → 10,000.5\n    }\n\n    default:\n      return value.toString();\n  }\n}\n","import { useState } from \"react\";\nimport { MapPinIcon, BriefcaseIcon, UsersIcon, CubeIcon, CurrencyDollarIcon, BuildingOfficeIcon } from \"@heroicons/react/24/outline\";\nimport { Heart, ThumbsUp, ThumbsDown, Copy, ChevronDown } from \"lucide-react\";\nimport { formatField } from '../../../../utils/universalFormatter';\nimport { slugify } from \"../../../../utils/slugify\";\nimport { Disclosure, Transition } from '@headlessui/react'\n\nexport function JobCard({ job }) {\n    const [saved, setSaved] = useState(false);\n    const [copied, setCopied] = useState(false);\n    const [vote, setVote] = useState(null);\n\n    // Split the keywords string into an array, handling potential empty strings\n    const keywordTags = job.keywords ? job.keywords.split(',').map(k => k.trim()).filter(Boolean) : [];\n\n    const handleShare = (job) => {\n        const slug = slugify(job.title, job.companyData.name, job.id);\n        const url = `${window.location.origin}/job/${slug}/${job.id}`;\n\n        navigator.clipboard.writeText(url);\n        setCopied(true);\n\n        setTimeout(() => setCopied(false), 2000);\n    };\n\n    return (\n        <div className=\"w-full\">\n            <Disclosure as=\"div\" className=\"border border-gray-100 rounded-lg hover:shadow-md transition-shadow duration-300\">\n                {({ open }) => (\n                    <>\n                        <Disclosure.Button className=\"w-full p-4 text-left\">\n                            <div className=\"flex flex-row gap-x-4 items-start\">\n                                {/* Company Logo or Fallback */}\n                                {job.companyData.logo ? (\n                                    <img src={job.companyData.logo} alt={`${job.companyData.name} logo`} className=\"w-10 h-10 object-contain\" />\n                                ) : (\n                                    <div className=\"w-10 h-10 flex items-center justify-center bg-gray-100 rounded-md\">\n                                        <BuildingOfficeIcon className=\"w-6 h-6 text-gray-400\" />\n                                    </div>\n                                )}\n\n                                {/* Job Info */}\n                                <div className=\"flex-grow flex flex-col gap-y-2\">\n                                    {/* Job Title */}\n                                    <h1 className=\"text-gray-900 font-bold text-[16px]\">\n                                        {job.title}, <span className=\"font-semibold\">{job.companyData.name}</span>\n                                    </h1>\n\n                                    {/* Meta Info */}\n                                    <div className=\"w-4/5 flex flex-wrap gap-x-6 gap-y-2 text-gray-600 text-[13px]\">\n                                        <div className=\"flex items-center gap-x-1\">\n                                            <BriefcaseIcon className=\"w-4 h-4\" />\n                                            <span>{formatField(\"job_type\", job.job_type)}</span>\n                                        </div>\n                                        <div className=\"flex items-center gap-x-1\">\n                                            <CubeIcon className=\"w-4 h-4\" />\n                                            <span className=\"text-sm\">{job.keywords}</span>\n                                        </div>\n                                        <div className=\"flex items-center gap-x-1\">\n                                            <CurrencyDollarIcon className=\"w-4 h-4\" />\n                                            <span> {formatField(\"salary\", job.salary_min)}K - {formatField(\"salary\", job.salary_max)}K</span>\n                                        </div>\n                                        <div className=\"flex items-center gap-x-1\">\n                                            <MapPinIcon className=\"w-4 h-4\" />\n                                            <span>{job.city}, {job.state}</span>\n                                        </div>\n                                        <div className=\"flex items-center gap-x-1\">\n                                            <BriefcaseIcon className=\"w-4 h-4\" />\n                                            <span>{job.years_of_experience} Years of Experience</span>\n                                        </div>\n                                        <div className=\"flex items-center gap-x-1\">\n                                            <UsersIcon className=\"w-4 h-4\" />\n                                            <span>{formatField(\"employee_count\", job.companyData.employee_count)} Employees</span>\n                                        </div>\n                                    </div>\n                                </div>\n                                <ChevronDown className={`${open ? 'rotate-180' : ''} h-5 w-5 text-gray-500 transition-transform duration-300`} />\n                            </div>\n                        </Disclosure.Button>\n\n                        <Transition\n                            enter=\"transition duration-300 ease-out\"\n                            enterFrom=\"transform -translate-y-4 opacity-0\"\n                            enterTo=\"transform translate-y-0 opacity-100\"\n                            leave=\"transition duration-200 ease-out\"\n                            leaveFrom=\"transform translate-y-0 opacity-100\"\n                            leaveTo=\"transform -translate-y-4 opacity-0\"\n                        >\n                            <Disclosure.Panel className=\"px-4 pb-4 flex flex-col gap-y-4\">\n                                {/* Description */}\n                                <p className=\"text-[13px] font-normal text-gray-500 pt-4 border-t border-gray-100\">\n                                    {job.description}\n                                </p>\n\n                                <div className=\"flex flex-row gap-x-4 mb-4\">\n                                    {keywordTags.map((tag, index) => (\n                                        <div key={index} className=\"bg-blue-100 text-blue-700 px-2 text-[12px] rounded-md\">\n                                            {tag}\n                                        </div>\n                                    ))}\n                                </div>\n\n                                <div className=\"w-full border border-gray-100 rounded-lg grid grid-cols-4\">\n                                    {/* Save Button */}\n                                    <button\n                                        onClick={() => setSaved(!saved)}\n                                        className=\"group p-4 border-r border-gray-100 bg-white hover:bg-gray-50 flex items-center justify-center cursor-pointer flex-row gap-x-2 transition rounded-l-lg\"\n                                    >\n                                        <span>\n                                            <Heart\n                                                size={14}\n                                                className={`transition-colors ${saved ? \"fill-[#E11D48] text-[#E11D48]\" : \"text-gray-500 group-hover:fill-[#E11D48] group-hover:text-[#E11D48]\"}`}\n                                            />\n                                        </span>\n                                        <span className=\"text-[14px] font-semibold transition-colors text-gray-900\">\n                                            {saved ? \"Saved!\" : \"Save\"}\n                                        </span>\n                                    </button>\n\n                                    {/* Not for Me */}\n                                    <button\n                                        onClick={() => setVote(vote === \"notForMe\" ? null : \"notForMe\")}\n                                        className=\"group p-4 border-r border-gray-100 bg-white hover:bg-gray-50 flex items-center justify-center cursor-pointer flex-row gap-x-2 transition\"\n                                    >\n                                        <span>\n                                            <ThumbsDown\n                                                size={14}\n                                                className={`transition-colors ${vote === \"notForMe\" ? \"fill-blue-500 text-blue-500\" : \"text-gray-500 group-hover:text-blue-500 group-hover:fill-blue-500\"}`}\n                                            />\n                                        </span>\n                                        <span className=\"text-[14px] font-semibold transition-colors text-gray-900\">\n                                            Not for Me\n                                        </span>\n                                    </button>\n\n                                    {/* Good fit */}\n                                    <button\n                                        onClick={() => setVote(vote === \"forMe\" ? null : \"forMe\")}\n                                        className=\"group p-4 border-r border-gray-100 bg-white hover:bg-gray-50 flex items-center justify-center cursor-pointer flex-row gap-x-2 transition\"\n                                    >\n                                        <span>\n                                            <ThumbsUp\n                                                size={14}\n                                                className={`transition-colors ${vote === \"forMe\" ? \"fill-blue-500 text-blue-500\" : \"text-gray-500 group-hover:text-blue-500 group-hover:fill-blue-500\"}`}\n                                            />\n                                        </span>\n                                        <span className=\"text-[14px] font-semibold transition-colors text-gray-900\">\n                                            Good fit\n                                        </span>\n                                    </button>\n\n                                    {/* share */}\n                                    <button\n                                        onClick={() => handleShare(job)}\n                                        className=\"group p-4 bg-white hover:bg-gray-50 flex items-center justify-center cursor-pointer flex-row gap-x-2 transition rounded-r-lg\"\n                                    >\n                                        <span>\n                                            <Copy\n                                                size={14}\n                                                className={`transition-colors ${copied ? \"fill-blue-500 text-blue-500\" : \"text-gray-500 group-hover:text-blue-500 group-hover:fill-blue-500\"}`}\n                                            />\n                                        </span>\n                                        <span className=\"text-[14px] font-semibold transition-colors text-gray-900\">\n                                            {copied ? \"Link Copied!\" : \"Share\"}\n                                        </span>\n                                    </button>\n                                </div>\n                            </Disclosure.Panel>\n                        </Transition>\n                    </>\n                )}\n            </Disclosure>\n        </div >\n    );\n}","export function slugify(title: string, company: string, id: string) {\n  return `${title}-${company}-${id}`\n    .toLowerCase()\n    .replace(/[^a-z0-9]+/g, \"-\") // replace spaces & symbols with -\n    .replace(/^-+|-+$/g, \"\"); // trim - from start & end\n}\n","import { useState, useEffect } from \"react\";\nimport axios from 'axios';\nimport { useAlert } from '../../../../constants/AlertProvider'\nimport { SkeletonLoader } from '../../../common/SkeletonLoader'\nimport { Star } from \"lucide-react\";\nimport { JobCard } from \"./JobCard\";\n\nconst SHOW_MATCHED_JOBS = true;\n\nexport function Matched() {\n    const [jobData, setJobData] = useState([]);\n    const showAlert = useAlert()\n    const [isLoading, setIsLoading] = useState(false);\n\n    useEffect(() => {\n        setIsLoading(true);\n        const fetchJobs = async () => {\n            try {\n                const jobRes = await axios.get(\"/api/jobprofile/\", { withCredentials: true });\n                const jobs = jobRes.data.results;\n\n                // Fetch company info for each job\n                const jobsWithCompany = await Promise.all(\n                    jobs.map(async (job) => {\n                        const companyRes = await axios.get(`/api/company/${job.company}/`, { withCredentials: true });\n                        return { ...job, companyData: companyRes.data };\n                    })\n                );\n                setJobData(jobsWithCompany);\n            } catch (error) {\n                showAlert(\"Error fetching jobs\", \"error\");\n                console.error(\"error:\", error);\n            } finally {\n                setIsLoading(false);\n            }\n        };\n        fetchJobs();\n    }, []);\n\n\n    return (\n        <main className=\"flex flex-col gap-y-4\">\n            {SHOW_MATCHED_JOBS ?\n                (\n                    isLoading ?\n                        (\n                            // Show 3 skeleton cards while loading\n                            Array.from({ length: 3 }).map((_, idx) => <SkeletonLoader key={idx} />)\n                        )\n                        :\n                        (\n                            jobData.map((job) => (\n                                <JobCard key={job.id} job={job} />\n                            ))\n                        )\n                )\n                : (\n                    <div className=\"flex items-center justify-center min-h-[250px]\">\n                        <div className=\"flex flex-col gap-y-4 items-center justify-center text-gray-400\">\n                            <Star className=\"size-10\" />\n                            <h2 className=\"text-md font-medium\">\n                                No jobs found. Matching opportunities shortly!\n                            </h2>\n                        </div>\n                    </div>\n                )}\n\n        </main>\n    );\n}\n","import { Heart } from \"lucide-react\";\n\nexport function Saved() {\n    return (\n        <div className=\"flex items-center justify-center min-h-[250px]\">\n            <div className=\"flex flex-col gap-y-4 items-center justify-center text-gray-400\">\n                <Heart className=\"size-10\"/>\n                <h2 className=\"text-md font-medium\">\n                    You haven&apos;t saved any jobs yet.\n                </h2>\n            </div>\n        </div>\n    );\n}","import { CheckCircle } from \"lucide-react\";\n\nexport function Shortlisted() {\n    return (\n        <div className=\"flex items-center justify-center min-h-[250px]\">\n            <div className=\"flex flex-col gap-y-4 items-center justify-center text-gray-400\">\n                <CheckCircle className=\"size-10\" />\n                <h2 className=\"text-md  font-medium\">\n                    Once you&apos;re shortlisted, the jobs will appear here.\n                </h2>\n            </div>\n        </div>\n    );\n}","import { Switch } from '@headlessui/react'\nimport { useNavigate } from \"react-router-dom\";\nimport { Pencil } from \"lucide-react\";\n\nexport function Header({ isOn, setIsOn }) {\n    const navigate = useNavigate();\n\n    return (\n        <div className=\"w-full flex flex-col gap-y-4 md:flex-row md:justify-between md:items-center flex-wrap\">\n            <div className=\"flex flex-col gap-y-2 min-w-0 w-full md:w-auto\">\n                <h1 className=\"text-gray-900 font-bold text-xl md:text-2xl\">Job Matches</h1>\n                <p className=\"text-gray-700 text-sm md:text-base font-normal\">Tailored matches based on your profile and preferences</p>\n            </div>\n            <div className=\"flex flex-col gap-y-2 w-full md:w-auto md:flex-row md:gap-x-6 md:items-center md:justify-center\">\n                <div className='flex md:flex-row md:items-center justify-between gap-x-2'>\n                    <h1 className=\"text-gray-900 font-semibold text-sm md:text-base\">Matching On</h1>\n                    <Switch\n                        checked={isOn}\n                        onChange={setIsOn}\n                        className=\"group inline-flex h-4 w-10 md:h-6 md:w-11 items-center rounded-full bg-gray-200 transition data-checked:bg-blue-700\"\n                    >\n                        <span className=\"size-3 md:size-4 translate-x-1 rounded-full bg-white transition group-data-checked:translate-x-6\" />\n                    </Switch>\n                </div>\n                <button\n                    type='button'\n                    onClick={() => navigate('/setpreferences', { state: { from: \"editpreferences\" } })}\n                    className=\"flex flex-row items-center justify-center gap-x-2 text-blue-700 text-sm md:text-base font-semibold hover:text-blue-600 cursor-pointer mt-2 md:mt-0\"\n                >\n                    <span><Pencil className=\"size-3\" /></span>\n                    <span>Edit Preferences</span>\n                </button>\n            </div>\n        </div>\n    );\n}","import { useState, useEffect } from \"react\";\nimport { useNavigate } from \"react-router-dom\";\nimport { Matched } from \"./Matched\";\nimport { Saved } from \"./Saved\";\nimport { Shortlisted } from \"./Shortlisted\";\nimport { Transition } from \"@headlessui/react\";\nimport { Header } from \"./Header\";\n\nexport function Navigator() {\n    const [activeTab, setActiveTab] = useState(\"matched\");\n    const [isOn, setIsOn] = useState(true);\n\n    const tabs = [\n        { id: \"matched\", label: \"Matched for you!\" },\n        { id: \"saved\", label: \"Saved\" },\n        { id: \"shortlisted\", label: \"Shortlisted\" },\n    ];\n\n    const tabContent = {\n        matched: <Matched />,\n        saved: <Saved />,\n        shortlisted: <Shortlisted />,\n    };\n\n    const handleTabClick = (tab) => {\n        setActiveTab(tab);\n    };\n\n    return (\n        <div className=\"p-2 md:p-4\">\n            <Header isOn={isOn} setIsOn={setIsOn} />\n            <div className=\"mt-12 p-2 md:p-4 flex flex-row md:flex-wrap gap-4\">\n                {tabs.map((tab) => (\n                    <button\n                        key={tab.id}\n                        onClick={() => handleTabClick(tab.id)}\n                        className={`flex items-center gap-2 px-5 py-3 font-medium text-xs md:text-[14px] rounded-lg transition-all duration-300 cursor-pointer ${activeTab === tab.id\n                            ? \"bg-blue-100 text-blue-700\"\n                            : \"text-gray-500 hover:bg-gray-100 hover:text-blue-700\"\n                            }`}\n                    >\n                        {tab.label}\n                    </button>\n                ))}\n            </div>\n\n            {/* Tab Content */}\n            <Transition\n                key={activeTab}\n                appear={true}\n                show={true}\n                enter=\"transition-all duration-500 ease-out\"\n                enterFrom=\"opacity-0 translate-y-4\"\n                enterTo=\"opacity-100 translate-y-0\"\n            >\n                <div className=\"mt-6\">\n                    {isOn ? (\n                        tabContent[activeTab]\n                    ) : (\n                        <div className=\"mt-6 flex flex-col gap-y-2 items-center justify-center\">\n                            <h1 className=\"text-gray-900 font-semibold text-xs md:text-[14px]\">Matching paused</h1>\n                            <p className=\"text-gray-500 font-normal text-xs md:text-[14px]\">Your matches will appear here once you are ready!</p>\n                        </div>\n                    )}\n                </div>\n            </Transition>\n        </div>\n    );\n}","import { Header } from \"./components/Header\";\nimport { Navigator } from \"./components/Navigator\";\n\nexport default function YourMatches() {\n    return (\n            <div className=\"mt-10 min-h-screen flex flex-col p-6 md:px-24 md:py-10\">\n                {/* <Header /> */}\n                <Navigator />\n            </div>\n    );\n}\n\n\n\n\n","import axios from \"axios\";\nimport Cookies from \"js-cookie\";\nimport { useEffect, useState } from \"react\";\nimport { Link, useNavigate, useLocation } from \"react-router-dom\";\nimport { Menu, MenuButton, MenuItem, MenuItems, Transition } from \"@headlessui/react\";\nimport { ChevronDownIcon, BellIcon } from \"@heroicons/react/24/solid\";\nimport { getUserDetails } from \"../../utils/getUserDetails\";\nimport { useAlert } from \"../../constants/AlertProvider\";\nimport Logo from \"../../../assets/images/un_resume_logo2.png\";\nimport ProfilePic from \"../../../assets/images/blank-profile-pic.png\";\nimport Notifications from \"../candidate/Notifications\";\n\nexport default function HomeNavbar() {\n  const navigate = useNavigate();\n  const location = useLocation();\n  const currentPath = location.pathname;\n  const [showNotifications, setShowNotifications] = useState(false);\n  const [userData, setUserData] = useState({ name: \"\" });\n  const [logo, setLogo] = useState(\"\");\n  const showAlert = useAlert();\n\n  const toggleNotifications = () => setShowNotifications(!showNotifications);\n\n\n  const handleLogout = async () => {\n    try {\n      const csrfToken = Cookies.get(\"csrftoken\");\n      await axios.post(\"/api/logout/\", null, {\n        headers: {\n          \"X-CSRFToken\": csrfToken,\n          \"Content-Type\": \"application/json\",\n        },\n      });\n      navigate(\"/login\");\n    } catch (error) {\n      console.error(\"Error during logout:\", error);\n    }\n  };\n\n  useEffect(() => {\n    const fetchData = async () => {\n      try {\n        const userDetails = await getUserDetails();\n        if (!userDetails?.id || !userDetails.company) {\n          showAlert(\"User or Company details not found.\", \"error\");\n          return;\n        }\n\n        const [userRes, companyRes] = await Promise.all([\n          axios.get(`/api/users/${userDetails.id}/`, { withCredentials: true }),\n          axios.get(`/api/company/${userDetails.company}/`, { withCredentials: true })\n        ]);\n\n        setUserData({ name: userRes.data.name });\n        setLogo(companyRes.data.logo);\n      } catch (error) {\n        showAlert(\"Error Fetching Profile Data.\", \"error\");\n        console.error(\"error\", error);\n      }\n    }\n\n    fetchData();\n  }, [showAlert]);\n\n  return (\n    <nav\n      className=\"border-b border-b-gray-300 fixed top-0 left-0 right-0 z-50 flex justify-between items-center h-16 px-4 sm:px-6 lg:px-8 transition-all duration-300 bg-white w-full\"\n    >\n      {/* Logo */}\n      <div className=\"flex items-center gap-2\">\n        <img alt=\"UnResume Logo\" className=\"w-9 h-9 rounded-full shadow-sm\" src={Logo} />\n        <Link className=\"text-xl font-bold text-gray-900 transition-colors duration-200 tracking-tighter\">\n          UnResumé\n        </Link>\n        <div className=\"hidden ml-6 md:flex flex-row gap-x-6\">\n          <div className={`h-16 flex items-center ${currentPath === \"/orghome\" ? \"border-b-3 border-blue-700\" : \"\"}`}>\n            <Link\n              to=\"/orghome\"\n              className={`text-sm font-medium transition-colors duration-200 ${currentPath === \"/orghome\" ? \"text-blue-600\" : \"text-gray-700 hover:text-blue-600\"\n                }`}\n            >\n              Talent\n            </Link>\n          </div>\n\n          <div className={`h-16 flex items-center ${currentPath === \"/matches\" ? \"border-b-3 border-blue-700\" : \"\"}`}>\n            <Link\n              to=\"/matches\"\n              className={`text-sm font-medium transition-colors duration-200 ${currentPath === \"/matches\" ? \"text-blue-600\" : \"text-gray-700 hover:text-blue-600\"\n                }`}\n            >\n              Matches\n            </Link>\n          </div>\n          <div className={`h-16 flex items-center ${currentPath === \"/myjobs\" ? \"border-b-3 border-blue-700\" : \"\"}`}>\n            <Link\n              to=\"/myjobs\"\n              className={`text-sm font-medium transition-colors duration-200 ${currentPath === \"/myjobs\" ? \"text-blue-600 font-semibold\" : \"text-gray-700 hover:text-blue-600\"\n                }`}\n            >\n              Opportunities\n            </Link>\n          </div>\n          <div className={`h-16 flex items-center ${currentPath === \"/\" ? \"border-b-3 border-blue-700\" : \"\"}`}>\n            <Link\n              to=\"#\"\n              className={`text-sm font-medium transition-colors duration-200 ${currentPath === \"/\" ? \"text-blue-600 font-semibold\" : \"text-gray-700 hover:text-blue-600\"\n                }`}\n            >\n              Community\n            </Link>\n          </div>\n        </div>\n      </div>\n\n      {/* Desktop Menu */}\n      <div className=\"hidden md:flex items-center gap-2\">\n        {/* Notifications */}\n        <button\n          onClick={toggleNotifications}\n          className=\"p-2 rounded-full hover:bg-blue-100 transition-colors duration-200 focus:outline-none\"\n        >\n          <BellIcon className=\"w-6 h-6 text-gray-400\" />\n        </button>\n\n        {/* Profile Dropdown */}\n        <Menu as=\"div\" className=\"relative\">\n          <MenuButton className=\"flex items-center gap-2 p-2 rounded-full hover:bg-blue-100 transition-colors duration-200 focus:outline-none\">\n            <img alt=\"Profile Pic\" className=\"w-8 h-8 rounded-full border-2 border-blue-200\" src={logo || ProfilePic} />\n            <ChevronDownIcon className=\"w-4 h-4 text-blue-600\" />\n          </MenuButton>\n          <Transition\n            enter=\"transition ease-out duration-200\"\n            enterFrom=\"opacity-0 scale-95\"\n            enterTo=\"opacity-100 scale-100\"\n            leave=\"transition ease-in duration-150\"\n            leaveFrom=\"opacity-100 scale-100\"\n            leaveTo=\"opacity-0 scale-95\"\n          >\n            <MenuItems className=\"absolute right-0 mt-2 w-48 bg-white shadow-lg focus:outline-none rounded-lg py-2 ring-1 ring-blue-200/20\">\n              <p className={\"block px-4 py-2 text-base font-semibold text-gray-700\"}>Hello, {userData.name}</p>\n              <MenuItem>\n                {({ active }) => (\n                  <Link\n                    to=\"/orgprofile\"\n                    className={`block px-4 py-2 text-sm text-gray-700 ${active ? \"bg-blue-50 text-blue-600\" : \"\"}`}\n                  >\n                    Profile\n                  </Link>\n                )}\n              </MenuItem>\n              <MenuItem>\n                {({ active }) => (\n                  <button\n                    onClick={handleLogout}\n                    className={`block w-full text-left px-4 py-2 text-sm text-red-600 ${active ? \"bg-red-50\" : \"\"}`}\n                  >\n                    Logout\n                  </button>\n                )}\n              </MenuItem>\n            </MenuItems>\n          </Transition>\n        </Menu>\n      </div>\n\n      {/* Mobile Menu */}\n      <Menu as=\"div\" className=\"relative md:hidden flex flex-row gap-x-2\">\n        <button\n          onClick={toggleNotifications}\n          className=\"p-2 rounded-full hover:bg-blue-100 transition-colors duration-200 focus:outline-none\"\n        >\n          <BellIcon className=\"w-6 h-6 text-gray-400\" />\n        </button>\n        <MenuButton className=\"flex items-center gap-2 p-2 rounded-full hover:bg-blue-100 transition-colors duration-200 focus:outline-none\">\n          <img alt=\"Profile Pic\" className=\"w-8 h-8 rounded-full border-2 border-blue-200\" src={logo || ProfilePic} />\n          <ChevronDownIcon className=\"w-4 h-4 text-blue-600\" />\n        </MenuButton>\n        <Transition\n          enter=\"transition ease-out duration-200\"\n          enterFrom=\"opacity-0 scale-95\"\n          enterTo=\"opacity-100 scale-100\"\n          leave=\"transition ease-in duration-150\"\n          leaveFrom=\"opacity-100 scale-100\"\n          leaveTo=\"opacity-0 scale-95\"\n        >\n          <MenuItems className=\"absolute right-0 mt-2 w-48 bg-white shadow-lg focus:outline-none rounded-lg py-2 ring-1 ring-blue-200/20\">\n            <p className={\"block px-4 py-2 text-base font-semibold text-gray-700\"}>Hello, {userData.name}</p>\n            <MenuItem>\n              {({ active }) => (\n                <Link\n                  to=\"/orghome\"\n                  className={`block px-4 py-2 text-sm text-gray-700 ${active ? \"bg-blue-50 text-blue-600\" : \"\"}`}\n                >\n                  Talent\n                </Link>\n              )}\n            </MenuItem>\n            <MenuItem>\n              {({ active }) => (\n                <Link\n                  to=\"/matches\"\n                  className={`block px-4 py-2 text-sm text-gray-700 ${active ? \"bg-blue-50 text-blue-600\" : \"\"}${currentPath === \"/matches\" ? \" font-semibold text-blue-600\" : \"\"}`}\n                >\n                  Matches\n                </Link>\n              )}\n            </MenuItem>\n            <MenuItem>\n              {({ active }) => (\n                <Link\n                  to=\"/myjobs\"\n                  className={`block px-4 py-2 text-sm text-gray-700 ${active ? \"bg-blue-50 text-blue-600\" : \"\"}`}\n                >\n                  Opportunities\n                </Link>\n              )}\n            </MenuItem>\n            <MenuItem>\n              {({ active }) => (\n                <Link\n                  to=\"#\"\n                  className={`block px-4 py-2 text-sm text-gray-700 ${active ? \"bg-blue-50 text-blue-600\" : \"\"}`}\n                >\n                  Community\n                </Link>\n              )}\n            </MenuItem>\n            <MenuItem>\n              {({ active }) => (\n                <Link\n                  to=\"/orgprofile\"\n                  className={`block px-4 py-2 text-sm text-gray-700 ${active ? \"bg-blue-50 text-blue-600\" : \"\"}`}\n                >\n                  Profile\n                </Link>\n              )}\n            </MenuItem>\n            <MenuItem>\n              {({ active }) => (\n                <button\n                  onClick={handleLogout}\n                  className={`block w-full text-left px-4 py-2 text-sm text-red-600 ${active ? \"bg-red-50\" : \"\"}`}\n                >\n                  Logout\n                </button>\n              )}\n            </MenuItem>\n          </MenuItems>\n        </Transition>\n      </Menu>\n\n      {/* Notifications */}\n      <Transition\n        show={showNotifications}\n        enter=\"transition ease-out duration-300\"\n        enterFrom=\"opacity-0 translate-x-10\"\n        enterTo=\"opacity-100 translate-x-0\"\n        leave=\"transition ease-in duration-200\"\n        leaveFrom=\"opacity-100 translate-x-0\"\n        leaveTo=\"opacity-0 translate-x-10\"\n      >\n        <div className=\"fixed z-[9999] top-16 right-4 w-80 max-w-xs mt-2 h-[90vh] bg-white rounded-xl shadow-xl overflow-auto border border-blue-200/50\">\n          <Notifications onClose={toggleNotifications} />\n        </div>\n      </Transition>\n    </nav>\n  );\n}","import { useEffect, useState } from 'react';\nimport axios from 'axios';\nimport Cookies from 'js-cookie';\nimport { Link } from 'react-router-dom';\nimport { useAlert } from '../../constants/AlertProvider';\nimport { getUserDetails } from '../../utils/getUserDetails';\nimport { SkeletonLoader } from '../common/SkeletonLoader';\nimport RecHomeNavbar from \"./RecHomeNavbar\";\nimport { BriefcaseIcon, PercentIcon, Cog } from 'lucide-react';\n\nexport default function CandidateMatches() {\n    const [jobs, setJobs] = useState([]);\n    const [matches, setMatches] = useState([]);\n    const [loading, setLoading] = useState(true);\n    const showAlert = useAlert();\n\n    useEffect(() => {\n        const fetchJobsAndMatches = async () => {\n            setLoading(true);\n            try {\n                const userDetails = await getUserDetails();\n                if (!userDetails?.company) {\n                    showAlert(\"Company details not found for this recruiter.\", \"warning\");\n                    setLoading(false);\n                    return;\n                }\n\n                const csrftoken = Cookies.get(\"csrftoken\");\n                const headers = { \"X-CSRFToken\": csrftoken };\n\n                // 1. Fetch jobs for the recruiter's company\n                const jobsResponse = await axios.get(`/api/jobprofile/?company=${userDetails.company}`, { headers });\n                const postedJobs = jobsResponse.data.results;\n                setJobs(postedJobs);\n\n                if (postedJobs.length === 0) {\n                    setLoading(false);\n                    return; // No jobs, so no matches to fetch\n                }\n\n                // 2. Fetch matches for each job\n                const matchPromises = postedJobs.map(job =>\n                    axios.get(`/api/match-results/?job=${job.id}`, { headers })\n                );\n\n                const matchResponses = await Promise.all(matchPromises);\n                const allMatches = matchResponses.flatMap(res => res.data.results);\n                setMatches(allMatches);\n\n            } catch (error) {\n                showAlert(\"Error fetching matches. Please try again later.\", \"error\");\n                console.error(\"Error fetching jobs and matches:\", error);\n            } finally {\n                setLoading(false);\n            }\n        };\n\n        fetchJobsAndMatches();\n    }, [showAlert]);\n\n    if (loading) {\n        return (\n            <>\n                <RecHomeNavbar />\n                <div className=\"mt-14 bg-gray-50 min-h-[calc(100vh-56px)] flex flex-col justify-center items-center\">\n                    <div className=\"relative flex items-center justify-center\">\n                        <Cog className=\"w-20 h-20 text-blue-500 animate-spin\" style={{ animationDuration: '3s' }} />\n                        <Cog className=\"w-12 h-12 text-blue-600 absolute animate-spin-reverse\" style={{ animationDuration: '2s' }} />\n                    </div>\n                    <p className=\"mt-6 text-lg font-semibold text-gray-900\">\n                        Finding your perfect matches...\n                    </p>\n                </div>\n            </>\n        );\n    }\n\n    if (jobs.length === 0) {\n        return (\n            <>\n                <RecHomeNavbar />\n                <div className=\"mt-14 text-center p-10 bg-gray-50 min-h-[calc(100vh-56px)] flex flex-col justify-center items-center\">\n                    <BriefcaseIcon className=\"w-16 h-16 text-gray-400 mb-4\" />\n                    <h2 className=\"text-2xl font-bold text-gray-800\">No Jobs Posted Yet</h2>\n                    <p className=\"text-gray-600 mt-2 mb-6\">Post a job to start seeing matched candidates.</p>\n                    <Link to=\"/jobpost\" className=\"bg-blue-600 text-white font-semibold px-6 py-2 rounded-lg hover:bg-blue-700 transition\">\n                        Post a Job\n                    </Link>\n                </div>\n            </>\n        );\n    }\n\n    return (\n        <>\n            <RecHomeNavbar />\n            <div className=\"mt-14 p-4 sm:p-6 lg:p-8 bg-gray-50 min-h-screen\">\n                <h1 className=\"text-3xl font-bold text-gray-900 mb-6\">Matched Candidates</h1>\n                {matches.length > 0 ? (\n                    <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6\">\n                        {matches.map(match => (\n                            <div key={match.id} className=\"bg-white rounded-lg shadow-md p-6 border border-gray-200 hover:shadow-lg transition-shadow\">\n                                <div className=\"flex items-center justify-between mb-4\">\n                                    <h3 className=\"text-xl font-semibold text-gray-800\">{match.user_name}</h3>\n                                    <div className=\"flex items-center gap-2 text-green-600 font-bold\">\n                                        <PercentIcon className=\"h-5 w-5\" />\n                                        <span>{(match.confidence_score * 100).toFixed(0)}%</span>\n                                    </div>\n                                </div>\n                                <p className=\"text-sm text-gray-600 mb-2\">Match for: <span className=\"font-medium text-gray-800\">{match.job_title}</span></p>\n                                <p className=\"text-sm text-gray-500 mb-4\">at <span className=\"font-medium\">{match.job_company}</span></p>\n                                <div className=\"border-t border-gray-200 pt-4 flex justify-end\">\n                                    <Link to={`/candidate/${match.user}`} className=\"text-blue-600 hover:text-blue-800 font-semibold text-sm\">\n                                        View Profile\n                                    </Link>\n                                </div>\n                            </div>\n                        ))}\n                    </div>\n                ) : (\n                    <p className=\"text-center text-gray-500 mt-10\">No matches found for your current job postings.</p>\n                )}\n            </div>\n        </>\n    );\n}","import React, { useEffect, useState } from \"react\";\nimport { Country, State, City } from \"country-state-city\";\nimport { getLocationObject } from \"../../utils/getLocationObject\";\nimport { MapPinIcon } from \"lucide-react\";\n\nconst LocationSelector = ({ onChange, defaultValue = {} }) => {\n    const [countries] = useState(Country.getAllCountries());\n    const [states, setStates] = useState([]);\n    const [cities, setCities] = useState([]);\n\n    const [selected, setSelected] = useState({\n        country: defaultValue.country || \"\",\n        state: defaultValue.state || \"\",\n        city: defaultValue.city || \"\",\n    });\n\n    useEffect(() => {\n        const country = countries.find(c => c.name === selected.country);\n        if (country) setStates(State.getStatesOfCountry(country.isoCode));\n    }, [selected.country, countries]);\n\n    useEffect(() => {\n        const country = countries.find(c => c.name === selected.country);\n        const state = states.find(s => s.name === selected.state);\n        if (country && state) {\n            setCities(City.getCitiesOfState(country.isoCode, state.isoCode));\n        }\n    }, [selected.state, selected.country, states]);\n\n    const handleCountryChange = (e) => {\n        const country = countries.find(c => c.isoCode === e.target.value);\n        setSelected({ country: country?.name || \"\", state: \"\", city: \"\" });\n        setStates(State.getStatesOfCountry(e.target.value));\n        setCities([]);\n        onChange({ countryName: country?.name, stateName: \"\", cityName: \"\" });\n    };\n\n    const handleStateChange = (e) => {\n        const state = states.find(s => s.isoCode === e.target.value);\n        setSelected(prev => ({ ...prev, state: state?.name || \"\", city: \"\" }));\n        const country = countries.find(c => c.name === selected.country);\n        setCities(City.getCitiesOfState(country?.isoCode, e.target.value));\n        onChange({ countryName: selected.country, stateName: state?.name, cityName: \"\" });\n    };\n\n    const handleCityChange = (e) => {\n        const cityName = e.target.value;\n        setSelected(prev => ({ ...prev, city: cityName }));\n\n        const loc = getLocationObject({\n            countryName: selected.country,\n            stateName: selected.state,\n            cityName,\n        });\n\n        if (loc) {\n            onChange({\n                countryName: loc.country,\n                stateName: loc.state,\n                cityName: loc.city,\n            });\n        }\n    };\n\n    return (\n        <>\n            <div className=\"sm:col-span-2\">\n                <label className=\"block text-sm font-medium text-gray-700\">Country*</label>\n                <div className=\"mt-1 relative rounded-md shadow-sm\">\n                    <div className=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\n                        <MapPinIcon className=\"h-5 w-5 text-gray-400\" />\n                    </div>\n                    <select\n                        value={countries.find(c => c.name === selected.country)?.isoCode || \"\"}\n                        onChange={handleCountryChange}\n                        required\n                        className=\"focus:outline-none focus:ring-blue-500 focus:border-blue-500 block w-full pl-10 sm:text-sm border-gray-300 rounded-md p-2 border\"\n                    >\n                        <option value=\"\">Select Country</option>\n                        {countries.map(c => (\n                            <option key={c.isoCode} value={c.isoCode}>{c.name}</option>\n                        ))}\n                    </select>\n                </div>\n            </div>\n\n            <div className=\"sm:col-span-2\">\n                <label className=\"block text-sm font-medium text-gray-700\">State*</label>\n                <div className=\"mt-1 relative rounded-md shadow-sm\">\n                    <div className=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\n                        <MapPinIcon className=\"h-5 w-5 text-gray-400\" />\n                    </div>\n                    <select\n                        value={states.find(s => s.name === selected.state)?.isoCode || \"\"}\n                        onChange={handleStateChange}\n                        disabled={!states.length}\n                        required\n                        className=\"focus:outline-none focus:ring-blue-500 focus:border-blue-500 block w-full pl-10 sm:text-sm border-gray-300 rounded-md p-2 border\"\n                    >\n                        <option value=\"\">Select State</option>\n                        {states.map(s => (\n                            <option key={s.isoCode} value={s.isoCode}>{s.name}</option>\n                        ))}\n                    </select>\n                </div>\n            </div>\n\n            <div className=\"sm:col-span-2\">\n                <label className=\"block text-sm font-medium text-gray-700\">City*</label>\n                <div className=\"mt-1 relative rounded-md shadow-sm\">\n                    <div className=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\n                        <MapPinIcon className=\"h-5 w-5 text-gray-400\" />\n                    </div>\n                    <select\n                        value={selected.city}\n                        onChange={handleCityChange}\n                        disabled={!cities.length}\n                        required\n                        className=\"focus:outline-none focus:ring-blue-500 focus:border-blue-500 block w-full pl-10 sm:text-sm border-gray-300 rounded-md p-2 border\"\n                    >\n                        <option value=\"\">Select City</option>\n                        {cities.map(c => (\n                            <option key={c.name} value={c.name}>{c.name}</option>\n                        ))}\n                    </select>\n                </div>\n            </div>\n        </>\n    );\n};\n\nexport default LocationSelector;\n","import { Country, State, City } from \"country-state-city\";\n\nexport function getLocationObject({ countryName, stateName, cityName }) {\n  const country = Country.getAllCountries().find((c) => c.name === countryName);\n  if (!country) return null;\n  const state = State.getStatesOfCountry(country.isoCode).find(\n    (s) => s.name === stateName,\n  );\n  if (!state) return null;\n  const city = City.getCitiesOfState(country.isoCode, state.isoCode).find(\n    (c) => c.name === cityName,\n  );\n  if (!city) return null;\n\n  return {\n    country: country.name,\n    state: state.name,\n    city: city.name,\n    countryCode: country.isoCode,\n    stateCode: state.isoCode,\n    cityId: city.id,\n    formatted: `${city.name}, ${state.name}, ${country.name}`,\n  };\n}\n","import { useState, useEffect } from \"react\";\nimport LocationSelector from \"../common/LocationSelector\";\nimport Cookies from \"js-cookie\";\nimport { ApiService } from \"../../api/services.gen\";\nimport { useParams, useNavigate } from \"react-router-dom\";\nimport { useAlert } from \"../../constants/AlertProvider\";\nimport {\n    BriefcaseIcon,\n    BuildingIcon,\n    MapPinIcon,\n    DollarSignIcon,\n    GraduationCapIcon,\n    ClockIcon,\n    SendIcon,\n} from 'lucide-react'\nimport RecHomeNavbar from \"./RecHomeNavbar\";\n\nexport default function JobPost() {\n    const showAlert = useAlert();\n    const [formData, setFormData] = useState({\n        title: \"\",\n        description: \"\",\n        keywords: \"\",\n        salary_min: \"\",\n        salary_max: \"\",\n        city: \"\",\n        state: \"\",\n        country: \"\",\n        created_by: \"\",\n        company: \"\",\n        is_remote: false,\n        job_type: \"\",\n        degree_requirements: \"\",\n        years_of_experience: null,\n        benefits_and_perks: \"\",\n        visa_sponsor: false,\n    });\n    const [error, setError] = useState(null);\n    const [createdById, setCreatedById] = useState(null);\n    const [companyId, setCompanyId] = useState(null);\n    const [companyName, setCompanyName] = useState(null);\n    const { id } = useParams();\n    const navigate = useNavigate();\n\n    useEffect(() => {\n        if (id) {\n            // Fetch job data and prefill form\n            ApiService.apiJobprofileRetrieve({ id }).then(job => {\n                setFormData(prev => ({\n                    ...prev,\n                    ...job,\n                    country: job.country || \"\",\n                    state: job.state || \"\",\n                    city: job.city || \"\",\n                }));\n            });\n        }\n    }, [id]);\n\n    useEffect(() => {\n        const fetchData = async () => {\n            try {\n                const userId = Cookies.get(\"id\");\n                if (!userId) {\n                    console.error(\"User ID not found in cookies\");\n                    return;\n                }\n                setCreatedById(userId);\n                const userRes = await ApiService.apiUsersRetrieve({ id: userId });\n                const companyIdFromUser = userRes.company;\n                setCompanyId(companyIdFromUser);\n\n                if (companyIdFromUser) {\n                    const companyRes = await ApiService.apiCompanyRetrieve({ id: companyIdFromUser });\n                    setCompanyName(companyRes.name);\n                }\n            } catch (error) {\n                console.error(\"Error fetching company data:\", error);\n            }\n        };\n        fetchData();\n    }, []);\n\n    const handleChange = (e) => {\n        const { name, value } = e.target;\n        setFormData((prevData) => ({ ...prevData, [name]: value }));\n    };\n\n    const handleLocationChange = ({ countryName, stateName, cityName }) => {\n        setFormData(prev => ({\n            ...prev,\n            country: countryName || \"\",\n            state: stateName || \"\",\n            city: cityName || \"\",\n        }));\n    };\n\n    const handleSubmit = async (e) => {\n        e.preventDefault();\n        const jobData = {\n            ...formData,\n            salary_min: Number(formData.salary_min),\n            salary_max: Number(formData.salary_max),\n            created_by: createdById,\n            company: companyId,\n        };\n\n        try {\n            if (id) {\n                // Edit mode: update job\n                await ApiService.apiJobprofilePartialUpdate({\n                    id,\n                    requestBody: jobData,\n                });\n                showAlert(\"Job updated successfully!\", \"success\");\n            } else {\n                // Create mode: create job\n                await ApiService.apiJobprofileCreate({\n                    requestBody: jobData,\n                });\n                showAlert(\"Job posted successfully!\", \"success\");\n            }\n            setError(null);\n            navigate(\"/myjobs\");\n        } catch (error) {\n            console.error(\"Error posting/updating job:\", error);\n            showAlert(\"Failed to post/update job.\", \"error\");\n        }\n    };\n\n    const handleCancel = () => {\n        if (id) {\n            navigate(\"/myjobs\");\n        } else {\n            setFormData({\n                title: \"\",\n                description: \"\",\n                keywords: \"\",\n                salary_min: \"\",\n                salary_max: \"\",\n                city: \"\",\n                state: \"\",\n                country: \"\",\n                created_by: createdById,\n                company: companyId,\n                is_remote: false,\n                job_type: \"\",\n                degree_requirements: \"\",\n                years_of_experience: null,\n                benefits_and_perks: \"\",\n                visa_sponsor: false,\n            });\n        }\n    };\n\n    return (\n        <>\n            <RecHomeNavbar />\n            <div className=\"mt-14 min-h-screen bg-gray-50 w-full\">\n                {/* header */}\n                <header className=\"w-full mx-auto px-4 py-8 sm:px-6 lg:px-8\">\n                    <h1 className=\"text-3xl font-bold text-gray-900 flex items-center\">\n                        <BriefcaseIcon className=\"mr-2 h-6 w-6 text-blue-600\" />\n                        Post a New Job\n                    </h1>\n                </header>\n                {/* main-content */}\n                <main className=\"w-full mx-auto px-4 py-8 sm:px-6 lg:px-8\">\n                    <div className=\"bg-white shadow rounded-lg\">\n                        <form onSubmit={handleSubmit}>\n                            <div className=\"p-6 border-b border-gray-200\">\n                                <h2 className=\"text-lg font-medium text-gray-900\">\n                                    Basic Information\n                                </h2>\n                                <p className=\"mt-1 text-sm text-gray-500\">\n                                    Provide the basic details about the job position.\n                                </p>\n                                <div className=\"mt-6 grid grid-cols-1 gap-y-6 gap-x-4 sm:grid-cols-6\">\n                                    {/* job-title */}\n                                    <div className=\"sm:col-span-3\">\n                                        <label\n                                            htmlFor=\"title\"\n                                            className=\"block text-sm font-medium text-gray-700\"\n                                        >\n                                            Job Title*\n                                        </label>\n                                        <div className=\"mt-1 relative rounded-md shadow-sm\">\n                                            <div className=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\n                                                <BriefcaseIcon className=\"h-5 w-5 text-gray-400\" />\n                                            </div>\n                                            <input\n                                                type=\"text\"\n                                                name=\"title\"\n                                                id=\"title\"\n                                                value={formData.title}\n                                                onChange={handleChange}\n                                                required\n                                                className=\"focus:outline-none focus:ring-blue-500 focus:border-blue-500 block w-full pl-10 sm:text-sm border-gray-300 rounded-md p-2 border\"\n                                                placeholder=\"e.g. Senior Software Engineer\"\n                                            />\n                                        </div>\n                                    </div>\n\n                                    {/* comapny-name */}\n                                    <div className=\"sm:col-span-3\">\n                                        <label\n                                            htmlFor=\"company\"\n                                            className=\"block text-sm font-medium text-gray-700\"\n                                        >\n                                            Company Name*\n                                        </label>\n                                        <div className=\"mt-1 relative rounded-md shadow-sm\">\n                                            <div className=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\n                                                <BuildingIcon className=\"h-5 w-5 text-gray-400\" />\n                                            </div>\n                                            <input\n                                                type=\"text\"\n                                                name=\"company\"\n                                                id=\"company\"\n                                                value={companyName || \"\"}\n                                                onChange={handleChange}\n                                                disabled\n                                                className=\"focus:outline-none focus:ring-blue-500 focus:border-blue-500 block w-full pl-10 sm:text-sm border-gray-300 rounded-md p-2 border\"\n                                                placeholder=\"e.g. Acme Inc.\"\n                                            />\n                                        </div>\n                                    </div>\n\n                                    {/* location */}\n                                    <LocationSelector\n                                        key={`${formData.country}-${formData.state}-${formData.city}`}\n                                        onChange={handleLocationChange}\n                                        defaultValue={{\n                                            country: formData.country,\n                                            state: formData.state,\n                                            city: formData.city,\n                                        }}\n                                    />\n\n                                    {/* job-type */}\n                                    <div className=\"sm:col-span-2\">\n                                        <label\n                                            htmlFor=\"job_type\"\n                                            className=\"block text-sm font-medium text-gray-700\"\n                                        >\n                                            Job Type\n                                        </label>\n                                        <div className=\"mt-1 relative rounded-md shadow-sm\">\n                                            <div className=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\n                                                <ClockIcon className=\"h-5 w-5 text-gray-400\" />\n                                            </div>\n                                            <select\n                                                id=\"job_type\"\n                                                name=\"job_type\"\n                                                value={formData.job_type}\n                                                onChange={handleChange}\n                                                className=\"focus:outline-none focus:ring-blue-500 focus:border-blue-500 block w-full pl-10 sm:text-sm border-gray-300 rounded-md p-2 border\"\n                                            >\n                                                <option value=\"\">Select job type</option>\n                                                <option value=\"full-time\">Full-time</option>\n                                                <option value=\"intern\">Internship</option>\n                                                <option value=\"volunteering\">Volunteering</option>\n                                            </select>\n                                        </div>\n                                    </div>\n\n                                    {/* salary */}\n                                    <div className=\"sm:col-span-2\">\n                                        <label\n                                            htmlFor=\"salary_min\"\n                                            className=\"block text-sm font-medium text-gray-700\"\n                                        >\n                                            Salary Range (Min)\n                                        </label>\n                                        <div className=\"mt-1 relative rounded-md shadow-sm\">\n                                            <div className=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\n                                                <DollarSignIcon className=\"h-5 w-5 text-gray-400\" />\n                                            </div>\n                                            <input\n                                                type=\"number\"\n                                                name=\"salary_min\"\n                                                id=\"salary_min\"\n                                                value={formData.salary_min}\n                                                onChange={handleChange}\n                                                min={0}\n                                                className=\"focus:outline-none focus:ring-blue-500 focus:border-blue-500 block w-full pl-10 sm:text-sm border-gray-300 rounded-md p-2 border\"\n                                                placeholder=\"e.g. 50,000\"\n                                            />\n                                        </div>\n                                    </div>\n                                    <div className=\"sm:col-span-2\">\n                                        <label\n                                            htmlFor=\"salary_max\"\n                                            className=\"block text-sm font-medium text-gray-700\"\n                                        >\n                                            Salary Range (Max)\n                                        </label>\n                                        <div className=\"mt-1 relative rounded-md shadow-sm\">\n                                            <div className=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\n                                                <DollarSignIcon className=\"h-5 w-5 text-gray-400\" />\n                                            </div>\n                                            <input\n                                                type=\"number\"\n                                                name=\"salary_max\"\n                                                id=\"salary_max\"\n                                                value={formData.salary_max}\n                                                onChange={handleChange}\n                                                min={0}\n                                                className=\"focus:outline-none focus:ring-blue-500 focus:border-blue-500 block w-full pl-10 sm:text-sm border-gray-300 rounded-md p-2 border\"\n                                                placeholder=\"e.g. 80,000\"\n                                            />\n                                        </div>\n                                    </div>\n                                    {/* <div className=\"sm:col-span-2\">\n                                        <label\n                                            htmlFor=\"currency\"\n                                            className=\"block text-sm font-medium text-gray-700\"\n                                        >\n                                            Currency\n                                        </label>\n                                        <select\n                                            id=\"currency\"\n                                            name=\"currency\"\n                                            className=\"mt-1 block w-full pl-3 pr-10 py-2 text-base border-gray-300 focus:outline-none focus:ring-blue-500 focus:border-blue-500 sm:text-sm rounded-md border\"\n                                        >\n                                            <option>USD</option>\n                                            <option>EUR</option>\n                                            <option>GBP</option>\n                                            <option>CAD</option>\n                                            <option>INR</option>\n                                        </select>\n                                    </div> */}\n                                </div>\n                            </div>\n                            {/* JD */}\n                            <div className=\"p-6 border-b border-gray-200\">\n                                <h2 className=\"text-lg font-medium text-gray-900\">\n                                    Job Description\n                                </h2>\n                                <p className=\"mt-1 text-sm text-gray-500\">\n                                    Provide detailed information about the role and\n                                    responsibilities.\n                                </p>\n                                <div className=\"mt-6\">\n                                    <label\n                                        htmlFor=\"description\"\n                                        className=\"block text-sm font-medium text-gray-700\"\n                                    >\n                                        Description*\n                                    </label>\n                                    <div className=\"mt-1\">\n                                        <textarea\n                                            id=\"description\"\n                                            name=\"description\"\n                                            rows={6}\n                                            value={formData.description}\n                                            onChange={handleChange}\n                                            required\n                                            className=\"shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 block w-full sm:text-sm border-gray-300 rounded-md p-2 border\"\n                                            placeholder=\"Describe the role, responsibilities, and what a typical day looks like...\"\n                                        />\n                                    </div>\n                                </div>\n                            </div>\n                            <div className=\"p-6 border-b border-gray-200\">\n                                <h2 className=\"text-lg font-medium text-gray-900\">\n                                    Skills\n                                </h2>\n                                <p className=\"mt-1 text-sm text-gray-500\">\n                                    List the required skills, experience, and qualifications.\n                                </p>\n                                <div className=\"mt-6\">\n                                    <label\n                                        htmlFor=\"keywords\"\n                                        className=\"block text-sm font-medium text-gray-700\"\n                                    >\n                                        Skills*\n                                    </label>\n                                    <div className=\"mt-1\">\n                                        <textarea\n                                            id=\"keywords\"\n                                            name=\"keywords\"\n                                            rows={4}\n                                            required\n                                            value={formData.keywords}\n                                            onChange={handleChange}\n                                            className=\"shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 block w-full sm:text-sm border-gray-300 rounded-md p-2 border\"\n                                            placeholder=\"List the required skills\"\n                                        />\n                                    </div>\n                                </div>\n                                <div className=\"mt-6\">\n                                    <label\n                                        htmlFor=\"degree_requirements\"\n                                        className=\"block text-sm font-medium text-gray-700\"\n                                    >\n                                        Education\n                                    </label>\n                                    <div className=\"mt-1 relative rounded-md shadow-sm\">\n                                        <div className=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\n                                            <GraduationCapIcon className=\"h-5 w-5 text-gray-400\" />\n                                        </div>\n                                        <input\n                                            type=\"text\"\n                                            name=\"degree_requirements\"\n                                            id=\"degree_requirements\"\n                                            value={formData.degree_requirements}\n                                            onChange={handleChange}\n                                            className=\"focus:outline-none focus:ring-blue-500 focus:border-blue-500 block w-full pl-10 sm:text-sm border-gray-300 rounded-md p-2 border\"\n                                            placeholder=\"e.g. Bachelor's degree in Computer Science or related field\"\n                                        />\n                                    </div>\n                                </div>\n                                <div className=\"mt-6\">\n                                    <label\n                                        htmlFor=\"years_of_experience\"\n                                        className=\"block text-sm font-medium text-gray-700\"\n                                    >\n                                        Years of experience*\n                                    </label>\n                                    <div className=\"mt-1 relative rounded-md shadow-sm\">\n                                        <div className=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\n                                            <BriefcaseIcon className=\"h-5 w-5 text-gray-400\" />\n                                        </div>\n                                        <input\n                                            type=\"number\"\n                                            name=\"years_of_experience\"\n                                            id=\"years_of_experience\"\n                                            value={formData.years_of_experience ?? \"\"}\n                                            onChange={handleChange}\n                                            className=\"focus:outline-none focus:ring-blue-500 focus:border-blue-500 block w-full pl-10 sm:text-sm border-gray-300 rounded-md p-2 border\"\n                                            placeholder=\"e.g. 4\"\n                                            required\n                                        />\n                                    </div>\n                                </div>\n                            </div>\n                            <div className=\"p-6 border-b border-gray-200\">\n                                <h2 className=\"text-lg font-medium text-gray-900\">\n                                    Benefits & Perks\n                                </h2>\n                                <p className=\"mt-1 text-sm text-gray-500\">\n                                    Highlight the benefits and perks offered with this position.\n                                </p>\n                                <div className=\"mt-6\">\n                                    <label\n                                        htmlFor=\"benefits_and_perks\"\n                                        className=\"block text-sm font-medium text-gray-700\"\n                                    >\n                                        Benefits & Perks\n                                    </label>\n                                    <div className=\"mt-1\">\n                                        <textarea\n                                            id=\"benefits_and_perks\"\n                                            name=\"benefits_and_perks\"\n                                            rows={4}\n                                            value={formData.benefits_and_perks}\n                                            onChange={handleChange}\n                                            className=\"shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 block w-full sm:text-sm border-gray-300 rounded-md p-2 border\"\n                                            placeholder=\"List health insurance, retirement plans, vacation policy, remote work options, etc...\"\n                                        />\n                                    </div>\n                                </div>\n                            </div>\n                            <div className=\"p-6 border-b border-gray-200\">\n                                <h2 className=\"text-lg font-medium text-gray-900\">\n                                    Additional Information\n                                </h2>\n                                <p className=\"mt-1 text-sm text-gray-500\">\n                                    Add work place and visa sponsorship.\n                                </p>\n                                <div className=\"mt-6 grid grid-cols-1 gap-y-6 gap-x-4 sm:grid-cols-6\">\n                                    <div className=\"sm:col-span-3\">\n                                        <label\n                                            htmlFor=\"is_remote\"\n                                            className=\"block text-sm font-medium text-gray-700\"\n                                        >\n                                            Is this a remote position?\n                                        </label>\n                                        <input\n                                            id=\"is_remote\"\n                                            name=\"is_remote\"\n                                            type=\"checkbox\"\n                                            checked={formData.is_remote}\n                                            onChange={e => setFormData(prev => ({ ...prev, is_remote: e.target.checked }))}\n                                            className=\"w-4 h-4 text-blue-600 bg-gray-100 border-gray-300 rounded-sm focus:ring-blue-500 focus:ring-1\"\n                                        />\n                                    </div>\n                                    <div className=\"sm:col-span-3\">\n                                        <label\n                                            htmlFor=\"visa_sponsor\"\n                                            className=\"block text-sm font-medium text-gray-700\"\n                                        >\n                                            Is Visa Sponsorship available?\n                                        </label>\n                                        <input\n                                            id=\"visa_sponsor\"\n                                            name=\"visa_sponsor\"\n                                            type=\"checkbox\"\n                                            checked={formData.visa_sponsor}\n                                            onChange={e => setFormData(prev => ({ ...prev, visa_sponsor: e.target.checked }))}\n                                            className=\"w-4 h-4 text-blue-600 bg-gray-100 border-gray-300 rounded-sm focus:ring-blue-500 focus:ring-1\"\n                                        />\n                                    </div>\n                                </div>\n                            </div>\n                            <div className=\"p-6 flex items-center justify-end space-x-3\">\n                                <button\n                                    type=\"button\"\n                                    onClick={handleCancel}\n                                    className=\"bg-white py-2 px-4 border border-gray-300 rounded-md shadow-sm text-sm font-medium text-gray-700 hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500\"\n                                >\n                                    Cancel\n                                </button>\n                                <button\n                                    type=\"submit\"\n                                    className=\"inline-flex justify-center py-2 px-4 border border-transparent shadow-sm text-sm font-medium rounded-md text-white bg-blue-600 hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500\"\n                                >\n                                    <SendIcon className=\"mr-2 h-5 w-5\" />\n                                    {id ? \"Update Job\" : \"Post Job\"}\n                                </button>\n                            </div>\n                        </form>\n                    </div>\n                </main>\n            </div>\n        </>\n    );\n}","export const StatusBadge = ({ status }) => {\n  let badgeClass = ''\n  switch (status.toLowerCase()) {\n    case 'active':\n      badgeClass = 'bg-green-100 text-green-800'\n      break\n    case 'closed':\n      badgeClass = 'bg-blue-100 text-blue-800'\n      break\n    default:\n      badgeClass = 'bg-gray-100 text-gray-800'\n  }\n  return (\n    <span\n      className={`inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium ${badgeClass}`}\n    >\n      {status}\n    </span>\n  )\n}\n","import React from 'react'\nimport {\n  CalendarIcon,\n  MapPinIcon,\n  UsersIcon,\n  MoreVerticalIcon,\n} from 'lucide-react'\nimport { StatusBadge } from './StatusBadge'\nimport { useNavigate } from \"react-router-dom\";\n\nexport const JobCard = ({ job }) => {\n  const navigate = useNavigate();\n\n  return (\n    <div className=\"bg-white shadow rounded-lg overflow-hidden\">\n      <div className=\"p-5\">\n        <div className=\"flex justify-between\">\n          <h3 className=\"text-lg font-medium text-gray-900 truncate\">\n            {job.title}\n          </h3>\n          <div className=\"relative\">\n            <button className=\"text-gray-400 hover:text-gray-600\">\n              <MoreVerticalIcon className=\"h-5 w-5\" />\n            </button>\n          </div>\n        </div>\n        <p className=\"mt-1 text-sm text-gray-500\">{job.department}</p>\n        <div className=\"mt-4\">\n          <StatusBadge status={job.is_active ? 'Active' : 'Closed'} />\n        </div>\n        <div className=\"mt-6 flex items-center text-sm text-gray-500\">\n          <MapPinIcon className=\"flex-shrink-0 mr-1.5 h-4 w-4 text-gray-400\" />\n          <span>{`${job.city || \"City\"}, ${job.country || \"Country\"}`}</span>\n        </div>\n        <div className=\"mt-2 flex items-center text-sm text-gray-500\">\n          <CalendarIcon className=\"flex-shrink-0 mr-1.5 h-4 w-4 text-gray-400\" />\n          <span>Posted on {new Date(job.created_at).toLocaleDateString()}</span>\n        </div>\n        {/* <div className=\"mt-2 flex items-center text-sm text-gray-500\">\n          <UsersIcon className=\"flex-shrink-0 mr-1.5 h-4 w-4 text-gray-400\" />\n          <span>{job.applicants} applicants</span>\n        </div> */}\n        <div className=\"mt-5 flex justify-between items-center\">\n          {/* {job.daysLeft > 0 ? (\n            <span className=\"text-sm font-medium text-gray-500\">\n              {job.daysLeft} days left\n            </span>\n          ) : (\n            <span className=\"text-sm font-medium text-gray-500\">-</span>\n          )} */}\n          <button className=\"inline-flex items-center px-3 py-1.5 border border-transparent text-xs font-medium rounded shadow-sm text-white bg-blue-600 hover:bg-blue-700\" onClick={() => navigate(`/jobpost/${job.id}`)}>\n            View Details\n          </button>\n        </div>\n      </div>\n    </div>\n  )\n}\n","import React, { useState, useEffect } from 'react';\nimport axios from 'axios';\nimport Cookies from 'js-cookie';\nimport {\n    MoreVerticalIcon,\n    EditIcon,\n    TrashIcon,\n    UsersIcon,\n    EyeIcon,\n} from 'lucide-react'\nimport { StatusBadge } from './StatusBadge'\nimport { JobCard } from './JobCard'\nimport { useNavigate } from \"react-router-dom\";\n\nexport const JobsTable = ({\n    filterStatus,\n    searchQuery,\n}) => {\n    const [viewMode, setViewMode] = useState < 'table' | 'cards' > ('table')\n    const [jobs, setJobs] = useState([]);\n    const navigate = useNavigate();\n\n    useEffect(() => {\n        const fetchJobs = async () => {\n            try {\n                const userId = Cookies.get(\"id\");\n                const jobRes = await axios.get('/api/jobprofile/', { withCredentials: true });\n                const userJobs = jobRes.data.results.filter((job) => String(job.created_by) === String(userId));\n                setJobs(userJobs);\n            } catch (error) {\n                console.error(\"Error while fetching jobs\", error);\n            }\n        }\n        fetchJobs();\n    }, []);\n\n    const handleDeleteJob = async (jobId) => {\n        const csrfToken = Cookies.get(\"csrftoken\");\n        try {\n            await axios.delete(`/api/jobprofile/${jobId}/`, {\n                withCredentials: true,\n                headers: {\n                    \"X-CSRFToken\": csrfToken,\n                    \"Content-Type\": \"application/json\",\n                },\n            });\n            setJobs((prevJobs) => prevJobs.filter((job) => job.id !== jobId));\n        } catch (error) {\n            console.error(\"Failed to delete job:\", error);\n        }\n    }\n\n    // Filter jobs based on status and search query\n    const filteredJobs = jobs.filter((job) => {\n        const matchesStatus =\n            filterStatus === 'all' ||\n            (filterStatus === 'active' && job.is_active) ||\n            (filterStatus === 'closed' && !job.is_active)\n        const matchesSearch =\n            job.title.toLowerCase().includes(searchQuery.toLowerCase()) ||\n            job.country.toLowerCase().includes(searchQuery.toLowerCase()) ||\n            job.city.toLowerCase().includes(searchQuery.toLowerCase())\n        return matchesStatus && matchesSearch\n    })\n    return (\n        <div>\n            <div className=\"flex justify-end mb-4\">\n                <div className=\"inline-flex rounded-md shadow-sm\">\n                    <button\n                        onClick={() => setViewMode('table')}\n                        className={`px-4 py-2 text-sm font-medium rounded-l-md border ${viewMode === 'table' ? 'bg-blue-50 text-blue-700 border-blue-300' : 'bg-white text-gray-700 border-gray-300 hover:bg-gray-50'}`}\n                    >\n                        Table View\n                    </button>\n                    <button\n                        onClick={() => setViewMode('cards')}\n                        className={`px-4 py-2 text-sm font-medium rounded-r-md border ${viewMode === 'cards' ? 'bg-blue-50 text-blue-700 border-blue-300' : 'bg-white text-gray-700 border-gray-300 hover:bg-gray-50'}`}\n                    >\n                        Card View\n                    </button>\n                </div>\n            </div>\n            {viewMode === 'table' ? (\n                <div className=\"overflow-x-auto\">\n                    <table className=\"min-w-full divide-y divide-gray-200 bg-white shadow rounded-lg overflow-hidden\">\n                        <thead className=\"bg-gray-50\">\n                            <tr>\n                                <th\n                                    scope=\"col\"\n                                    className=\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider\"\n                                >\n                                    Job\n                                </th>\n                                <th\n                                    scope=\"col\"\n                                    className=\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider\"\n                                >\n                                    Location\n                                </th>\n                                <th\n                                    scope=\"col\"\n                                    className=\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider\"\n                                >\n                                    Status\n                                </th>\n                                <th\n                                    scope=\"col\"\n                                    className=\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider\"\n                                >\n                                    Posted\n                                </th>\n                                {/* <th\n                                    scope=\"col\"\n                                    className=\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider\"\n                                >\n                                    Applicants\n                                </th> */}\n                                <th scope=\"col\" className=\"px-6 py-3 text-right text-xs font-medium text-gray-500 uppercase tracking-wider\">\n                                    Actions\n                                </th>\n                            </tr>\n                        </thead>\n                        <tbody className=\"divide-y divide-gray-200\">\n                            {filteredJobs.length > 0 ? (\n                                filteredJobs.map((job) => (\n                                    <tr key={job.id}>\n                                        <td className=\"px-6 py-4 whitespace-nowrap\">\n                                            <div>\n                                                <div className=\"font-medium text-gray-900\">\n                                                    {job.title}\n                                                </div>\n                                                {/* <div className=\"text-sm text-gray-500\">\n                                                    {job.department}\n                                                </div> */}\n                                            </div>\n                                        </td>\n                                        <td className=\"px-6 py-4 whitespace-nowrap text-sm text-gray-500\">\n                                            {`${job.city || \"City\"}, ${job.country || \"Country\"}`}\n                                        </td>\n                                        <td className=\"px-6 py-4 whitespace-nowrap\">\n                                            <StatusBadge status={job.is_active ? 'Active' : 'Closed'} />\n                                        </td>\n\n                                        <td className=\"px-6 py-4 whitespace-nowrap text-sm text-gray-500\">\n                                            {new Date(job.created_at).toLocaleDateString('en-GB')}\n                                        </td>\n                                        {/* <td className=\"px-6 py-4 whitespace-nowrap text-sm text-gray-500\">\n                                            {job.applicants}\n                                        </td> */}\n                                        <td className=\"px-6 py-4 whitespace-nowrap text-right text-sm font-medium\">\n                                            <div className=\"flex items-center justify-end space-x-2\">\n                                                <button className=\"text-blue-600 hover:text-blue-900\" onClick={() => navigate(`/jobpost/${job.id}`)}>\n                                                    <EyeIcon className=\"h-5 w-5\" />\n                                                </button>\n                                                {/* <button className=\"text-gray-600 hover:text-gray-900\">\n                                                    <EditIcon className=\"h-5 w-5\" />\n                                                </button> */}\n                                                <button onClick={() => handleDeleteJob(job.id)} className=\"text-red-600 hover:text-red-900\">\n                                                    <TrashIcon className=\"h-5 w-5\" />\n                                                </button>\n                                            </div>\n                                        </td>\n                                    </tr>\n                                ))\n                            ) : (\n                                <tr>\n                                    <td\n                                        colSpan={7}\n                                        className=\"px-6 py-4 text-center text-gray-500\"\n                                    >\n                                        No jobs found matching your criteria.\n                                    </td>\n                                </tr>\n                            )}\n                        </tbody>\n                    </table>\n                </div>\n            ) : (\n                <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n                    {filteredJobs.length > 0 ? (\n                        filteredJobs.map((job) => <JobCard key={job.id} job={job} />)\n                    ) : (\n                        <div className=\"col-span-full text-center py-8 text-gray-500\">\n                            No jobs found matching your criteria.\n                        </div>\n                    )}\n                </div>\n            )}\n        </div>\n    )\n}\n","import { SearchIcon, FilterIcon } from 'lucide-react'\nimport { useNavigate } from 'react-router'\n\nexport const JobsFilter = ({\n    filterStatus,\n    setFilterStatus,\n    searchQuery,\n    setSearchQuery,\n}) => {\n    const navigate = useNavigate();\n\n    return (\n        <div className=\"flex flex-col space-y-4 md:flex-row md:items-center md:justify-between md:space-y-0\">\n            <div className=\"relative rounded-md shadow-sm max-w-lg\">\n                <div className=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\n                    <SearchIcon className=\"h-5 w-5 text-gray-400\" />\n                </div>\n                <input\n                    type=\"text\"\n                    className=\"focus:outline-none focus:ring-blue-500 focus:border-blue-500 block w-full pl-10 sm:text-sm border-gray-300 rounded-md py-2 px-4 border\"\n                    placeholder=\"Search job titles or locations...\"\n                    value={searchQuery}\n                    onChange={(e) => setSearchQuery(e.target.value)}\n                />\n            </div>\n            <div className=\"flex items-center space-x-4\">\n                <div className=\"flex items-center\">\n                    <FilterIcon className=\"h-5 w-5 text-gray-400 mr-2\" />\n                    <span className=\"text-sm text-gray-500\">Filter:</span>\n                </div>\n                <select\n                    className=\"block w-full py-2 px-3 border border-gray-300 bg-white rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 sm:text-sm\"\n                    value={filterStatus}\n                    onChange={(e) => setFilterStatus(e.target.value)}\n                >\n                    <option value=\"all\">All Jobs</option>\n                    <option value=\"active\">Active</option>\n                    <option value=\"closed\">Closed</option>\n                </select>\n                <button onClick={() => navigate(\"/jobpost\")} className=\"inline-flex items-center px-4 py-2 border border-transparent text-sm font-medium rounded-md shadow-sm text-white bg-blue-600 hover:bg-blue-700\">\n                    + New Job\n                </button>\n            </div>\n        </div>\n    )\n}\n","import {\n    UsersIcon,\n    ClockIcon,\n    CheckCircleIcon,\n    AlertCircleIcon,\n} from 'lucide-react'\nimport useUserJobStats from '../hooks/useUserJobStats'\n\nexport const JobsStats = () => {\n\n    const { total, active, closed } = useUserJobStats();\n\n    return (\n        <div className=\"grid grid-cols-1 gap-5 sm:grid-cols-2 lg:grid-cols-4\">\n            <div className=\"bg-white overflow-hidden shadow rounded-lg\">\n                <div className=\"px-4 py-5 sm:p-6\">\n                    <div className=\"flex items-center\">\n                        <div className=\"flex-shrink-0 bg-blue-100 rounded-md p-3\">\n                            <UsersIcon className=\"h-6 w-6 text-blue-600\" />\n                        </div>\n                        <div className=\"ml-5 w-0 flex-1\">\n                            <dl>\n                                <dt className=\"text-sm font-medium text-gray-500 truncate\">\n                                    Total Jobs\n                                </dt>\n                                <dd className=\"text-3xl font-semibold text-gray-900\">{total}</dd>\n                            </dl>\n                        </div>\n                    </div>\n                </div>\n            </div>\n            <div className=\"bg-white overflow-hidden shadow rounded-lg\">\n                <div className=\"px-4 py-5 sm:p-6\">\n                    <div className=\"flex items-center\">\n                        <div className=\"flex-shrink-0 bg-green-100 rounded-md p-3\">\n                            <CheckCircleIcon className=\"h-6 w-6 text-green-600\" />\n                        </div>\n                        <div className=\"ml-5 w-0 flex-1\">\n                            <dl>\n                                <dt className=\"text-sm font-medium text-gray-500 truncate\">\n                                    Active Jobs\n                                </dt>\n                                <dd className=\"text-3xl font-semibold text-gray-900\">{active}</dd>\n                            </dl>\n                        </div>\n                    </div>\n                </div>\n            </div>\n\n            <div className=\"bg-white overflow-hidden shadow rounded-lg\">\n                <div className=\"px-4 py-5 sm:p-6\">\n                    <div className=\"flex items-center\">\n                        <div className=\"flex-shrink-0 bg-red-100 rounded-md p-3\">\n                            <AlertCircleIcon className=\"h-6 w-6 text-red-600\" />\n                        </div>\n                        <div className=\"ml-5 w-0 flex-1\">\n                            <dl>\n                                <dt className=\"text-sm font-medium text-gray-500 truncate\">\n                                    Closed\n                                </dt>\n                                <dd className=\"text-3xl font-semibold text-gray-900\">{closed}</dd>\n                            </dl>\n                        </div>\n                    </div>\n                </div>\n            </div>\n        </div>\n    )\n}\n","import axios from \"axios\";\nimport Cookies from \"js-cookie\";\nimport { useState, useEffect } from \"react\";\n\nexport default function useUserJobStats() {\n  const [userjobStats, setUserJobStats] = useState({\n    total: 0,\n    active: 0,\n    closed: 0,\n  });\n\n  useEffect(() => {\n    const fetchJobs = async () => {\n      try {\n        const userId = Cookies.get(\"id\");\n        const jobRes = await axios.get(\"/api/jobprofile/\", {\n          withCredentials: true,\n        });\n        const userJobs = jobRes.data.results.filter(\n          (job) => String(job.created_by) === String(userId),\n        );\n\n        const total = userJobs.length;\n        const active = userJobs.filter((job) => job.is_active).length;\n        const closed = userJobs.filter((job) => !job.is_active).length;\n\n        setUserJobStats({ total, active, closed });\n      } catch (error) {\n        console.error(\"Error while fetching stats\", error);\n      }\n    };\n    fetchJobs();\n  }, []);\n\n  return userjobStats;\n}\n","import { useEffect, useState } from \"react\";\nimport { useNavigate } from \"react-router-dom\";\nimport axios from \"axios\";\nimport Cookies from \"js-cookie\";\nimport RecHomeNavbar from \"../RecHomeNavbar\";\nimport { JobsTable } from './components/JobsTable'\nimport { JobsFilter } from './components/JobsFilter'\nimport { JobsStats } from './components/JobsStats'\n\nexport default function MyJobs() {\n    const [filterStatus, setFilterStatus] = useState('all')\n    const [searchQuery, setSearchQuery] = useState('')\n\n    return (\n        <>\n            <RecHomeNavbar />\n            <div className=\"mt-12 p-4 flex flex-col min-h-screen bg-gray-50\">\n                <main className=\"flex-1 container mx-auto px-4 py-8\">\n                    <div className=\"mb-8\">\n                        <h1 className=\"text-3xl font-bold text-gray-900\">Job Listings</h1>\n                        <p className=\"text-gray-600 mt-1\">\n                            Manage your posted job opportunities\n                        </p>\n                    </div>\n                    <JobsStats />\n                    <div className=\"mt-8\">\n                        <JobsFilter\n                            filterStatus={filterStatus}\n                            setFilterStatus={setFilterStatus}\n                            searchQuery={searchQuery}\n                            setSearchQuery={setSearchQuery}\n                        />\n                    </div>\n                    <div className=\"mt-6\">\n                        <JobsTable filterStatus={filterStatus} searchQuery={searchQuery} />\n                    </div>\n                </main>\n            </div>\n        </>\n    );\n}","import axios from 'axios';\nimport Cookies from 'js-cookie';\nimport { useState, useEffect } from 'react';\nimport Navbar from \"../../constants/Navbar\";\nimport { useNavigate } from \"react-router\";\nimport { useAlert } from \"../../constants/AlertProvider\";\nimport { getUserDetails } from \"../../utils/getUserDetails\"\n\nexport default function RecPreferences() {\n    const navigate = useNavigate();\n    const showAlert = useAlert();\n    const [companyId, setCompanyId] = useState(null);\n    const [companyData, setCompanyData] = useState({\n        hiring_goals: \"\",\n        roles_hiring_for: \"\",\n        // hiring_timeline: \"\",\n        // positions_to_hire: \"\",\n        // work_setting: \"\",\n        // location: \"\",\n    });\n\n    useEffect(() => {\n        const fetchData = async () => {\n            try {\n                const userDetails = await getUserDetails();\n                const fetchedCompanyId = userDetails.company;\n                if (fetchedCompanyId) {\n                    setCompanyId(fetchedCompanyId);\n                    const companyRes = await axios.get(`/api/company/${fetchedCompanyId}/`, { withCredentials: true });\n                    setCompanyData(prev => ({ ...prev, ...companyRes.data }));\n                } else {\n                    showAlert(\"No company associated with this user.\", \"error\");\n                }\n            } catch (error) {\n                showAlert(\"Something went wrong while fetching data!\", \"error\");\n                console.error(\"error\", error);\n            }\n        }\n\n        fetchData();\n    }, [showAlert]);\n\n    const handleChange = (e) => {\n        const { name, value } = e.target;\n        setCompanyData((prev) => ({ ...prev, [name]: value }));\n    };\n\n    const handleSave = async (e) => {\n        e.preventDefault();\n        if (!companyId) {\n            showAlert(\"Company not found. Cannot save preferences.\", \"error\");\n            return;\n        }\n        try {\n            const { logo, positions_to_hire, ...patchData } = companyData;\n            await axios.patch(`/api/company/${companyId}/`, patchData, {\n                headers: {\n                    'Content-Type': 'application/json',\n                    'X-CSRFToken': Cookies.get('csrftoken'),\n                },\n                withCredentials: true,\n            });\n            showAlert('Preferences saved!', \"success\");\n            navigate('/orghome');\n        } catch (error) {\n            showAlert('Something went wrong!', \"error\");\n            console.error(\"error\", error);\n        }\n    }\n\n    return (\n        <div className=\"min-h-screen bg-white\">\n            {/* Navbar */}\n            <Navbar />\n\n            {/* Main Container */}\n            <form onSubmit={handleSave} className=\"flex flex-col px-4 sm:px-6 lg:px-8 py-10\">\n                <main className=\"w-full max-w-7xl mx-auto bg-white\">\n                    {/* Heading */}\n                    <h1 className=\"text-2xl md:text-3xl font-bold text-gray-900 mb-10 text-center lg:text-left\">\n                        Help us find your match!\n                    </h1>\n                    <div className=\"flex flex-col gap-y-12\">\n                        <div className=\"grid grid-cols-1 lg:grid-cols-3 gap-x-8 gap-y-6\">\n                            <div className=\"lg:col-span-1 flex flex-col gap-y-2\">\n                                <h3 className=\"text-base text-gray-900 font-semibold\">Preferences</h3>\n                                <p className=\"text-sm text-gray-600 font-normal\">This will be used to match you with the right talent</p>\n                            </div>\n                            <div className=\"lg:col-span-2 flex flex-col\">\n                                <div className=\"flex flex-col gap-y-2 mb-8\">\n                                    <label htmlFor=\"hiring-goals\" className=\"text-sm text-gray-900 font-medium\">Hiring Goals</label>\n                                    <select id=\"hiring-goals\" name=\"hiring_goals\" value={companyData.hiring_goals || ''} onChange={handleChange} className=\"w-full md:w-4/5 border border-gray-300 p-2 rounded-lg text-sm text-gray-900 font-normal focus:outline-none focus:border-blue-500\">\n                                        <option value=\"Find full-time employees\" className=\"text-gray-700\">Find full-time employees</option>\n                                        <option value=\"Source contract\" className=\"text-gray-700\">Source contract or freelance talent</option>\n                                        <option value=\"talent pipeline\" className=\"text-gray-700\">Build a talent pipeline</option>\n                                        <option value=\"Collaborate\" className=\"text-gray-700\">Collaborate with students or volunteers</option>\n                                    </select>\n                                </div>\n                                <div className=\"w-full md:w-4/5 grid grid-cols-1 sm:grid-cols-2 gap-x-6 gap-y-4 mb-8\">\n                                    <div className=\"flex flex-col gap-y-2\">\n                                        <label htmlFor=\"role-type\" className=\"text-sm text-gray-900 font-medium\">What type of roles you are looking to fill?</label>\n                                        <select id=\"role-type\" name=\"roles_hiring_for\" value={companyData.roles_hiring_for || \"\"} onChange={handleChange} className=\"border border-gray-300 p-2 rounded-lg text-sm text-gray-900 font-normal focus:outline-none focus:border-blue-500\">\n                                            <option value=\"All\" className=\"text-gray-700\">All</option>\n                                            <option value=\"Full time\" className=\"text-gray-700\">Full time</option>\n                                            <option value=\"Part time\" className=\"text-gray-700\">Part time</option>\n                                            <option value=\"Volunteer\" className=\"text-gray-700\">Volunteer</option>\n                                            <option value=\"AI gig\" className=\"text-gray-700\">AI gig</option>\n                                        </select>\n                                    </div>\n                                    <div className=\"flex flex-col gap-y-2\">\n                                        <label htmlFor=\"how-soon\" className=\"text-sm text-gray-900 font-medium\">How soon do you need someone</label>\n                                        <select id=\"how-soon\" name=\"hiring_timeline\" value={''} onChange={handleChange} className=\"border border-gray-300 p-2 rounded-lg text-sm text-gray-900 font-normal focus:outline-none focus:border-blue-500\">\n                                            <option value=\"ASAP\" className=\"text-gray-700\">ASAP</option>\n                                            <option value=\"1-3 months\" className=\"text-gray-700\">1-3 months</option>\n                                            <option value=\"3-6 months\" className=\"text-gray-700\">3-6 months</option>\n                                            <option value=\"Flexible\" className=\"text-gray-700\">Flexible</option>\n                                        </select>\n                                    </div>\n                                </div>\n\n                                {/* What roles */}\n                                <div className=\"w-full md:w-4/5 flex flex-col gap-y-2 mb-8\">\n                                    <label htmlFor=\"roles\" className=\"text-sm text-gray-900 font-medium\">What positions would you want to hire?</label>\n                                    <input id=\"roles\" name=\"roles_hiring_for\" value={companyData.roles_hiring_for || ''} onChange={handleChange} className=\"border border-gray-300 p-2 rounded-lg text-sm text-gray-900 font-medium focus:outline-none focus:border-blue-500\" />\n                                </div>\n\n                                <div className=\"w-full md:w-2/3 flex flex-col gap-y-2 mb-8\">\n                                    <label htmlFor=\"work-setting\" className=\"text-sm text-gray-900 font-medium\">Where will the talent you hire be based?</label>\n                                    <select id=\"work-setting\" name=\"work_setting\" value={''} onChange={handleChange} className=\"border border-gray-300 p-2 rounded-lg text-sm text-gray-900 font-normal focus:outline-none focus:border-blue-500\">\n                                        <option value=\"Remote\" className=\"text-gray-700\">Remote</option>\n                                        <option value=\"On-site\" className=\"text-gray-700\">On-site</option>\n                                        <option value=\"Hybrid\" className=\"text-gray-700\">Hybrid</option>\n                                    </select>\n                                </div>\n\n                                <div className=\"w-full md:w-2/3 flex flex-col gap-y-2 mb-8\">\n                                    <label htmlFor=\"location\" className=\"text-sm text-gray-900 font-medium\">Location</label>\n                                    <input id=\"location\" name=\"location\" value={''} onChange={handleChange} className=\"border border-gray-300 p-2 rounded-lg text-sm text-gray-900 font-medium focus:outline-none focus:border-blue-500\" />\n                                </div>\n                            </div>\n                        </div>\n                    </div>\n                </main>\n                <div className=\"w-full flex justify-end p-6\">\n                    <button type=\"submit\" className=\"text-white h-10 text-center font-medium text-sm bg-blue-700 px-4 rounded-lg cursor-pointer hover:bg-blue-600\">\n                        Start Matching!\n                    </button>\n                </div>\n            </form>\n        </div>\n    );\n}","import axios from \"axios\";\n\nimport { getUserDetails } from \"./getUserDetails\";\n\nexport const checkAndRedirectByRole = async (navigate) => {\n  try {\n    const response = await axios.get(\"/api/session/\", {\n      withCredentials: true,\n    });\n    if (response.data.isAuthenticated) {\n      const userDetails = await getUserDetails();\n      const userId = userDetails?.id;\n      const userResponse = await axios.get(`/api/users/${userId}/`, {\n        withCredentials: true,\n      });\n      const role = userDetails?.role;\n      const company = userResponse.data?.company;\n\n      // Check if candidate is new (no applicationids or empty array)\n      if (role === \"candidate\") {\n        const isNewUser =\n          !userResponse.data.applicationids ||\n          userResponse.data.applicationids.length === 0;\n        if (isNewUser) {\n          navigate(\"/setprofile\", { replace: true });\n          return;\n        }\n      }\n\n      if (role) {\n        if (\n          (role === \"recruiter\" ||\n            role === \"smallbiz_owner\" ||\n            role === \"nonprofit\") &&\n          !company\n        ) {\n          navigate(\"/orgprofile\", { replace: true });\n        } else {\n          // Normal navigation\n          let path = \"/\";\n          if (role === \"candidate\") path = \"/home\";\n          else path = \"/orghome\";\n          navigate(path, { replace: true });\n        }\n      } else {\n        console.error(\"User role missing\");\n      }\n    }\n  } catch (error) {\n    console.error(\"Error checking authentication status\", error);\n  }\n};\n","import { GoogleOAuthProvider, GoogleLogin } from \"@react-oauth/google\";\nimport axios from \"axios\";\nimport Cookies from \"js-cookie\";\nimport { useEffect, useState } from \"react\";\nimport { Link, useNavigate } from \"react-router-dom\";\nimport { checkAndRedirectByRole } from \"../utils/authUtils\";\nimport { Transition } from \"@headlessui/react\";\nimport { EyeIcon, EyeSlashIcon } from \"@heroicons/react/24/solid\";\nimport { useAlert } from \"../constants/AlertProvider\";\nimport { getUserDetails } from \"../utils/getUserDetails\";\nimport Navbar from \"./Navbar\";\n\nexport default function Login() {\n  const [formData, setFormData] = useState({ email: \"\", password: \"\" });\n  const [touchedFields, setTouchedFields] = useState({ email: false, password: false });\n  const { email, password } = formData;\n  const [loading, setLoading] = useState(false);\n  const [showPassword, setShowPassword] = useState(false);\n  const navigate = useNavigate();\n  const showAlert = useAlert();\n\n  useEffect(() => {\n    const verifySession = async () => {\n      const id = Cookies.get(\"id\");\n      const role = Cookies.get(\"role\");\n      if (id || role) {\n        try {\n          await getUserDetails();\n          checkAndRedirectByRole(navigate);\n        } catch (error) {\n          Cookies.remove(\"id\");\n          Cookies.remove(\"role\");\n          Cookies.remove(\"csrftoken\");\n        }\n      }\n    };\n    verifySession();\n  }, [navigate]);\n\n  const handleChange = (e) => {\n    setFormData({ ...formData, [e.target.name]: e.target.value });\n    if (!touchedFields[e.target.name]) {\n      setTouchedFields({ ...touchedFields, [e.target.name]: true });\n    }\n  };\n\n  const handleSubmit = async (e) => {\n    e.preventDefault();\n    setLoading(true);\n    setTouchedFields({ email: true, password: true });\n\n    if (!email || !password) {\n      showAlert(\"Please fill in all fields\", \"error\");\n      setLoading(false);\n      return;\n    }\n\n    try {\n      const csrfToken = Cookies.get(\"csrftoken\");\n      const payload = { email, password };\n      const loginResponse = await axios.post(\"/api/login/\", payload, {\n        headers: { \"X-CSRFToken\": csrfToken, \"Content-Type\": \"application/json\" },\n        withCredentials: true,\n      });\n\n      if (loginResponse.data?.id) {\n        const userDetails = await getUserDetails();\n        const userId = userDetails?.id;\n        Cookies.set(\"id\", userId, { expires: 7 });\n\n        const userResponse = await axios.get(`/api/users/${userId}/`, { withCredentials: true });\n        const role = userDetails?.role;\n        const company = userResponse.data?.company;\n\n        // Check if candidate is new (no applicationids or empty array)\n        if (role === \"candidate\") {\n          const isNewUser =\n            !userResponse.data.applicationids ||\n            userResponse.data.applicationids.length === 0;\n          if (isNewUser) {\n            navigate(\"/setprofile\", { replace: true });\n            return;\n          }\n        }\n\n        if (role) {\n          Cookies.set(\"role\", role, { expires: 7 });\n          if ((role === \"recruiter\" || role === \"smallbiz_owner\" || role === \"nonprofit\") && !company) {\n            navigate(\"/orgprofile\", { replace: true });\n          } else {\n            // Normal navigation\n            let path = \"/\";\n            if (role === \"candidate\") path = \"/home\";\n            else path = \"/orghome\";\n            navigate(path, { replace: true });\n          }\n        } else {\n          showAlert(\"User role missing\", \"error\");\n        }\n      }\n    } catch (error) {\n      const status = error.response?.status;\n      if (status === 400) {\n        showAlert(\"Invalid email or password.\", \"error\");\n      } else if (status === 404) {\n        showAlert(\"User not found.\", \"error\");\n      } else if (status) {\n        showAlert(\"Login Failed\", \"error\");\n      } else if (error.request) {\n        showAlert(\"Network issue.\", \"error\");\n      } else {\n        showAlert(\"Unexpected error. Please try again.\", \"error\");\n      }\n    } finally {\n      setLoading(false);\n    }\n  };\n\n  const toggleShowPassword = () => setShowPassword((prev) => !prev);\n\n  const handleGoogleSuccess = async (response) => {\n    try {\n      const csrfToken = Cookies.get(\"csrftoken\");\n      const payload = { token: response.credential };\n      const res = await axios.post(\"/api/googlelogin/\", payload, {\n        headers: { \"X-CSRFToken\": csrfToken, \"Content-Type\": \"application/json\" },\n        withCredentials: true,\n      });\n\n      if (res.status === 200 && res.data.user?.id) {\n        const userId = res.data.user.id;\n        Cookies.set(\"id\", userId, { expires: 7 });\n\n        const userRes = await axios.get(`/api/users/${userId}/`, { withCredentials: true });\n\n        const role = userRes.data?.role;\n        const company = userRes.data?.company;\n\n        if (role) {\n          Cookies.set(\"role\", role, { expires: 7 });\n\n          if ((role === \"recruiter\" || role === \"smallbiz_owner\" || role === \"nonprofit\") && !company) {\n            navigate(\"/orgprofile\", { replace: true });\n          } else {\n            // Normal navigation\n            let path = \"/\";\n            if (role === \"candidate\") {\n              path = \"/setprofile\";\n              navigate(path, { replace: true, state: { from: \"login\" } });\n            }\n            else path = \"/orghome\";\n            navigate(path, { replace: true });\n          }\n        } else {\n          showAlert(\"User role missing\", \"error\");\n        }\n      } else {\n        showAlert(\"Failed to sign up with Google\", \"error\");\n      }\n    } catch (error) {\n      showAlert(\"Google signup failed\", \"error\");\n    }\n  };\n\n  const handleGoogleFailure = () => showAlert(\"Google login failed\", \"error\");\n\n  return (\n    <GoogleOAuthProvider clientId=\"637231094750-2iviubrnmb70qmt9g89nr1nb1u6cqd43.apps.googleusercontent.com\">\n      <Navbar />\n      <div className=\"bg-white flex justify-center\">\n        <Transition\n          appear={true}\n          show={true}\n          enter=\"transition-all duration-700 ease-out\"\n          enterFrom=\"opacity-0 scale-95\"\n          enterTo=\"opacity-100 scale-100\"\n        >\n          <div className=\"p-4 flex flex-col items-center justify-center w-full max-w-4xl\">\n            <h3 className=\"m-8 text-2xl font-bold text-gray-900 text-center\">Welcome Back!</h3>\n            <div className=\"flex flex-col p-6 md:p-10 w-full md:w-3/5 shadow-md rounded-md mb-8\">\n              {/* Form */}\n              <form onSubmit={handleSubmit} className=\"flex flex-col gap-6\">\n                <div className=\"flex flex-col gap-y-2\">\n                  <label htmlFor=\"email\" className=\"text-sm font-medium text-gray-900\">Email address</label>\n                  <input\n                    className={`w-full h-10 p-2 rounded-lg border-2 ${touchedFields.email && !email ? \"border-red-500\" : \"border-gray-200\"} focus:outline-none focus:border-blue-500 transition-all duration-200 bg-white`}\n                    name=\"email\"\n                    required\n                    type=\"email\"\n                    value={email}\n                    onChange={handleChange}\n                  />\n                </div>\n                <div className=\"relative flex flex-col gap-y-2\">\n                  <label htmlFor=\"password\" className=\"text-sm font-medium text-gray-900\">Password</label>\n                  <input\n                    className={`w-full px-4 py-2 rounded-lg border-2 ${touchedFields.password && !password ? \"border-red-500\" : \"border-gray-200\"} focus:outline-none focus:border-blue-500 transition-all duration-200 bg-white`}\n                    name=\"password\"\n                    required\n                    type={showPassword ? \"text\" : \"password\"}\n                    value={password}\n                    onChange={handleChange}\n                  />\n                  <button\n                    type=\"button\"\n                    onClick={toggleShowPassword}\n                    className=\"absolute right-3 top-12 transform -translate-y-1/2 text-gray-500 hover:text-blue-500 transition-colors duration-200\"\n                  >\n                    {showPassword ? <EyeSlashIcon className=\"w-5 h-5\" /> : <EyeIcon className=\"w-5 h-5\" />}\n                  </button>\n                </div>\n\n                <div className=\"flex justify-between\">\n                  <div className=\"flex flex-row items-center gap-x-4\">\n                    <input className=\"w-4 h-4 border border-gray-300 focus:outline-none accent-blue-500\" type=\"checkbox\" name=\"remember\" id=\"remember\" />\n                    <label className=\"text-sm font-light text-gray-900\" htmlFor=\"remember\">Remember Me</label>\n                  </div>\n                  <Link to=\"/login\" className=\"text-sm font-semibold text-blue-700\">Forgot password?</Link>\n                </div>\n\n                <button\n                  className=\"w-full h-[40px] cursor-pointer bg-blue-700 text-white font-medium rounded-lg shadow-md hover:bg-blue-600 disabled:bg-blue-300 transition-all duration-300 transform focus:outline-none focus:ring focus:ring-blue-400\"\n                  disabled={loading}\n                  type=\"submit\"\n                >\n                  {loading ? \"Logging In...\" : \"Log In\"}\n                </button>\n              </form>\n\n              <div className=\"m-6 relative flex items-center justify-center\">\n                <div className=\"absolute inset-0 flex items-center\">\n                  <div className=\"w-full border-t border-gray-300\"></div>\n                </div>\n                <span className=\"relative bg-white px-3 text-sm font-medium text-gray-900\">or continue with</span>\n              </div>\n\n              {/* Google Login */}\n              <div className=\"m-2 flex justify-center\">\n                <GoogleLogin\n                  onSuccess={handleGoogleSuccess}\n                  onError={handleGoogleFailure}\n                  // theme=\"filled_blue\"\n                  size=\"large\"\n                  text=\"signin_with\"\n                  // shape=\"pill\"\n                  width=\"300\"\n                />\n              </div>\n            </div>\n            <p className=\"text-sm text-gray-600 text-center\">\n              Don’t have an account?{\" \"}\n              <Link to=\"/landingpage\" className=\"text-blue-500 font-semibold hover:text-blue-600 transition-colors duration-200\">\n                Sign Up\n              </Link>\n            </p>\n          </div>\n        </Transition>\n      </div>\n    </GoogleOAuthProvider>\n  );\n}\n\n\n\n// ","import { z } from \"zod\";\n\nexport const signupSchema = z.object({\n  username: z.string().min(1, \"Username is required\"),\n  email: z\n    .string()\n    .email(\"Invalid email address\")\n    .max(255, \"Email cannot exceed 255 characters\")\n    .trim()\n    .toLowerCase()\n    .refine(\n      (val) => {\n        const [, domain] = val.split(\"@\");\n        return domain && ![\"example.com\", \"test.com\"].includes(domain);\n      },\n      {\n        message: \"Email domain is not allowed\",\n      },\n    ),\n\n  password: z\n    .string()\n    .min(6, \"Password must be at least 6 characters\")\n    .max(30, \"Password cannot exceed 30 characters\")\n    .regex(\n      /^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[@$!%*?&])[A-Za-z\\d@$!%*?&]{6,}$/,\n      \"Password must contain at least one uppercase letter, one lowercase letter, one number, and one special character\",\n    ),\n  role: z.enum([\"candidate\", \"recruiter\", \"smallbiz_owner\", \"nonprofit\"], {\n    errorMap: () => ({ message: \"Please select a valid role\" }),\n  }),\n});\n","import { Transition } from \"@headlessui/react\";\nimport { EyeIcon, EyeSlashIcon } from \"@heroicons/react/24/solid\";\nimport { zodResolver } from \"@hookform/resolvers/zod\";\nimport { GoogleLogin, GoogleOAuthProvider } from \"@react-oauth/google\";\nimport axios from \"axios\";\nimport Cookies from \"js-cookie\";\nimport { useEffect, useState } from \"react\";\nimport { useForm } from \"react-hook-form\";\nimport { Link, useLocation, useNavigate } from \"react-router-dom\";\nimport { ApiService } from \"../api/services.gen\";\nimport { useAlert } from \"../constants/AlertProvider\";\nimport { checkAndRedirectByRole } from \"../utils/authUtils\";\nimport Navbar from \"./Navbar\";\nimport { signupSchema } from \"./schemas/signupSchema\";\nimport { getUserDetails } from \"../utils/getUserDetails\";\n\nexport default function RecSignup() {\n  const location = useLocation();\n  const recRole = location.state?.recRole || \"recruiter\";\n  const {\n    register,\n    handleSubmit,\n    formState: { errors, isSubmitting },\n  } = useForm({\n    resolver: zodResolver(signupSchema),\n    defaultValues: {\n      username: \"\",\n      email: \"\",\n      password: \"\",\n      role: recRole,\n    }\n  })\n  const [loading, setLoading] = useState(false);\n  const [showPassword, setShowPassword] = useState(false);\n  const navigate = useNavigate();\n  const showAlert = useAlert();\n\n  useEffect(() => {\n    const verifySession = async () => {\n      const id = Cookies.get(\"id\");\n      const role = Cookies.get(\"role\");\n      if (id || role) {\n        try {\n          await getUserDetails();\n          checkAndRedirectByRole(navigate);\n        } catch (error) {\n          Cookies.remove(\"id\");\n          Cookies.remove(\"role\");\n          Cookies.remove(\"csrftoken\");\n        }\n      }\n    };\n    verifySession();\n  }, [navigate]);\n\n  const onSubmit = async ({ username, email, password, role }) => {\n    setLoading(true);\n    try {\n      const payload = {\n        requestBody: {\n          email,\n          password,\n          name: username,\n          role: recRole,\n          phone_number: \"\",\n          address: \"\",\n        },\n      };\n      await ApiService.apiSignupCreate(payload);\n      // After successful signup, log the user in\n      const loginPayload = {\n        requestBody: {\n          email,\n          password,\n        },\n      };\n      const loginRes = await ApiService.apiLoginCreate(loginPayload);\n      const userId = loginRes.id;\n      Cookies.set(\"id\", userId, { expires: 7 });\n      Cookies.set(\"role\", recRole, { expires: 7 });\n      // Fetch user details to check for company\n      const userRes = await ApiService.apiUsersRetrieve({ id: userId });\n      const role = userRes.role;\n      const company = userRes.company;\n      if ((role === \"recruiter\" || role === \"smallbiz_owner\") && !company) {\n        navigate(\"/orgprofile\");\n      }\n      else {\n        if (role === \"candidate\") {\n          navigate(\"/home\");\n        } else {\n          navigate(\"/orghome\");\n        }\n      }\n      return;\n    } catch (error) {\n      console.error(\"Signup error:\", error);\n\n      const errorBody = error.body;\n      const status = error.status;\n\n      let message = \"Failed to signup. Please try again.\";\n\n      if (status === 409) {\n        message = \"User already exists.\";\n      } else if (status === 400) {\n        // Check if email field exists in body\n        if (errorBody?.email && errorBody.email.length > 0) {\n          message = \"Email already exists.\"; // e.g., \"user already exists\"\n        } else {\n          message = \"Bad request. Please check your input.\";\n        }\n      }\n\n      showAlert(message, \"error\");\n    } finally {\n      setLoading(false);\n    }\n  };\n\n  const toggleShowPassword = () => setShowPassword((prev) => !prev);\n\n  const handleGoogleSuccess = async (response) => {\n    try {\n      const csrfToken = Cookies.get(\"csrftoken\");\n      const payload = { token: response.credential };\n      const res = await axios.post(\"/api/googlelogin/\", payload, {\n        headers: { \"X-CSRFToken\": csrfToken, \"Content-Type\": \"application/json\" },\n        withCredentials: true,\n      });\n\n      if (res.status === 200 && res.data.user?.id) {\n        const userId = res.data.user.id;\n        Cookies.set(\"id\", userId, { expires: 7 });\n\n        const userRes = await ApiService.apiUsersRetrieve({ id: userId });\n        const role = userRes.role;\n        const company = userRes.company;\n        Cookies.set(\"role\", role, { expires: 7 });\n\n        if ((role === \"recruiter\" || role === \"smallbiz_owner\") && !company) {\n          navigate(\"/orgprofile\");\n        } else {\n          if (role === \"candidate\") {\n            navigate(\"/home\");\n          } else {\n            navigate(\"/orghome\");\n          }\n        }\n      } else {\n        showAlert(\"Failed to sign up with Google\", \"error\");\n      }\n    } catch (error) {\n      console.error(\"Google signup error:\", error.response);\n      const status = error.response?.status;\n      const errorData = error.response?.data;\n\n      if (status === 409) {\n        showAlert(errorData?.detail || \"This email is already registered. Please log in.\", \"error\");\n      } else {\n        showAlert(\"Google signup failed. Please try again.\", \"error\");\n      }\n    }\n  };\n\n  const handleGoogleFailure = () => showAlert(\"Google signup failed\", \"error\");\n\n  return (\n    <GoogleOAuthProvider clientId=\"637231094750-2iviubrnmb70qmt9g89nr1nb1u6cqd43.apps.googleusercontent.com\">\n      <Navbar />\n      <div className=\"bg-white flex justify-center\">\n        <Transition\n          appear={true}\n          show={true}\n          enter=\"transition-all duration-700 ease-out\"\n          enterFrom=\"opacity-0 scale-95\"\n          enterTo=\"opacity-100 scale-100\"\n        >\n          <div className=\"p-4 flex flex-col items-center justify-center w-full max-w-4xl\">\n            <h3 className=\"m-8 text-xl md:text-2xl font-bold text-gray-900 text-center\">Sign up to hire talent fast</h3>\n            <div className=\"flex flex-col px-6 md:px-10 py-4 md:py-6 w-full md:w-3/5 shadow-md rounded-md\">\n              {/* Google Signup */}\n              <div className=\"mt-2 flex justify-center\">\n                <GoogleLogin\n                  onSuccess={handleGoogleSuccess}\n                  onError={handleGoogleFailure}\n                  theme=\"filled_blue\"\n                  size=\"large\"\n                  text=\"signup_with\"\n                  shape=\"pill\"\n                  width=\"250\"\n                />\n              </div>\n              <div className=\"relative flex items-center justify-center my-6\">\n                <div className=\"absolute inset-0 flex items-center\">\n                  <div className=\"w-full border-t border-gray-300\"></div>\n                </div>\n                <span className=\"relative bg-white px-3 text-sm font-medium text-gray-900\">or</span>\n              </div>\n\n              {/* Form */}\n              <form onSubmit={handleSubmit(onSubmit)} className=\"flex flex-col gap-6\">\n\n                <div className=\"relative flex flex-col gap-y-2\">\n                  <label htmlFor=\"username\" className=\"text-sm font-medium text-gray-900\">Full Name</label>\n                  <input\n                    {...register(\"username\")}\n                    className=\"w-full h-10 p-2 rounded-lg border-2 border-gray-300 focus:outline-none focus:border-blue-500 transition-all duration-200 bg-gray-50/50\"\n                    id=\"username\"\n                  />\n                  {errors.username && <p className=\"text-red-500 text-sm mt-1\">{errors.username.message}</p>}\n                </div>\n                <div className=\"relative flex flex-col gap-y-2\">\n                  <label htmlFor=\"email\" className=\"text-sm font-medium text-gray-900\">Email Address</label>\n                  <input\n                    {...register(\"email\")}\n                    className=\"w-full h-10 p-2 rounded-lg border-2 border-gray-300 focus:outline-none focus:border-blue-500 transition-all duration-200 bg-gray-50/50\"\n                    id=\"email\"\n                  />\n                  {errors.email && <p className=\"text-red-500 text-sm mt-1\">{errors.email.message}</p>}\n                </div>\n                <div className=\"relative flex flex-col gap-y-2\">\n                  <label htmlFor=\"password\" className=\"text-sm font-medium text-gray-900\">Password</label>\n                  <input\n                    {...register(\"password\")}\n                    className=\"w-full h-10 p-2 rounded-lg border-2 border-gray-300 focus:outline-none focus:border-blue-500 transition-all duration-200 bg-gray-50/50\"\n                    id=\"password\"\n                    type={showPassword ? \"text\" : \"password\"}\n                  />\n                  <button\n                    type=\"button\"\n                    onClick={toggleShowPassword}\n                    className=\"absolute right-3 top-12 transform -translate-y-1/2 text-gray-500 hover:text-blue-500 transition-colors duration-200\"\n                  >\n                    {showPassword ? <EyeSlashIcon className=\"w-5 h-5\" /> : <EyeIcon className=\"w-5 h-5\" />}\n                  </button>\n                  {errors.password && <p className=\"text-red-500 text-sm mt-1\">{errors.password.message}</p>}\n                </div>\n                {/* hidden role field */}\n                <input type=\"hidden\" {...register(\"role\")} value={recRole} />\n\n                <button\n                  className=\"w-full h-[40px] cursor-pointer bg-blue-700 text-white font-medium rounded-lg shadow-md hover:bg-blue-600 disabled:bg-blue-300 transition-all duration-300 transform focus:outline-none focus:ring focus:ring-blue-400\"\n                  disabled={loading}\n                  type=\"submit\"\n                >\n                  {loading ? \"Signing Up...\" : \"Sign Up\"}\n                </button>\n              </form>\n            </div>\n            <p className=\"mt-4 text-sm text-gray-600 text-center\">\n              Already have an account?{\" \"}\n              <Link to=\"/login\" className=\"text-blue-700 font-semibold hover:text-blue-600 transition-colors duration-200\">\n                Log In\n              </Link>\n            </p>\n          </div>\n        </Transition>\n      </div>\n    </GoogleOAuthProvider>\n  );\n}\n\n\n//","import { Transition } from \"@headlessui/react\";\nimport { EyeIcon, EyeSlashIcon } from \"@heroicons/react/24/solid\";\nimport { GoogleLogin, GoogleOAuthProvider } from \"@react-oauth/google\";\nimport axios from \"axios\";\nimport Cookies from \"js-cookie\";\nimport { useEffect, useState } from \"react\";\nimport { useForm } from \"react-hook-form\";\nimport { zodResolver } from \"@hookform/resolvers/zod\";\nimport { signupSchema } from \"./schemas/signupSchema\";\nimport { Link, useNavigate } from \"react-router-dom\";\nimport { ApiService } from \"../api/services.gen\";\nimport { checkAndRedirectByRole } from \"../utils/authUtils\";\nimport { useAlert } from \"../constants/AlertProvider\";\nimport { getUserDetails } from \"../utils/getUserDetails\";\n\nimport Logo from \"../../assets/images/un_resume_logo.jpeg\";\n\nexport default function SbSignup() {\n    const [loading, setLoading] = useState(false);\n    const [showPassword, setShowPassword] = useState(false);\n    const navigate = useNavigate();\n    const showAlert = useAlert();\n    const {\n        register,\n        handleSubmit,\n        formState: { errors, isSubmitting },\n    } = useForm({\n        resolver: zodResolver(signupSchema),\n        defaultValues: {\n            username: \"\",\n            email: \"\",\n            password: \"\",\n            role: \"\",\n        }\n    })\n\n    useEffect(() => {\n        const verifySession = async () => {\n            const id = Cookies.get(\"id\");\n            const role = Cookies.get(\"role\");\n            if (id || role) {\n                try {\n                    await getUserDetails();\n                    checkAndRedirectByRole(navigate);\n                } catch (error) {\n                    Cookies.remove(\"id\");\n                    Cookies.remove(\"role\");\n                    Cookies.remove(\"csrftoken\");\n                }\n            }\n        };\n        verifySession();\n    }, [navigate]);\n\n    const onSubmit = async ({ username, email, password, role }) => {\n        setLoading(true);\n        try {\n            const payload = {\n                requestBody: {\n                    email,\n                    password,\n                    name: username,\n                    role,\n                    phone_number: \"\",\n                    address: \"\",\n                },\n            };\n            await ApiService.apiSignupCreate(payload);\n            // After successful signup, log the user in\n            const loginPayload = {\n                requestBody: {\n                    email,\n                    password,\n                },\n            };\n            const loginRes = await ApiService.apiLoginCreate(loginPayload);\n            const userId = loginRes.id;\n\n            Cookies.set(\"id\", userId, { expires: 7 });\n            Cookies.set(\"role\", role, { expires: 7 });\n\n            // Fetch user details to check for company\n            const userRes = await ApiService.apiUsersRetrieve({ id: userId });\n            const userRole = userRes.role;\n            const company = userRes.company;\n            if ((userRole === \"smallbiz_owner\" || userRole === \"nonprofit\") && !company) {\n                navigate(\"/addcompany\");\n            }\n            else {\n                if (userRole === \"candidate\") {\n                    navigate(\"/home\");\n                } else {\n                    navigate(\"/orghome\");\n                }\n            }\n            return;\n        } catch (error) {\n            console.error(\"Signup error:\", error);\n            showAlert(\"Failed to signup\", \"error\")\n        } finally {\n            setLoading(false);\n        }\n    };\n\n    const toggleShowPassword = () => setShowPassword((prev) => !prev);\n\n    const handleGoogleSuccess = async (response) => {\n        if (!role) {\n            showAlert(\"Please select a role before signing up with Google.\", \"error\");\n            return;\n        }\n        try {\n            const csrfToken = Cookies.get(\"csrftoken\");\n            const payload = { token: response.credential, role };\n            const res = await axios.post(\"/api/googlelogin/\", payload, {\n                headers: { \"X-CSRFToken\": csrfToken, \"Content-Type\": \"application/json\" },\n                withCredentials: true,\n            });\n\n            if (res.status === 200 && res.data.user?.id) {\n                const userId = res.data.user.id;\n                Cookies.set(\"id\", userId, { expires: 7 });\n\n                const userRes = await ApiService.apiUsersRetrieve({ id: userId });\n                const role = userRes.role;\n                const company = userRes.company;\n                Cookies.set(\"role\", role, { expires: 7 });\n\n                if ((role === \"smallbiz_owner\" || role === \"nonprofit\") && !company) {\n                    navigate(\"/addcompany\");\n                } else {\n                    if (role === \"candidate\") {\n                        navigate(\"/home\");\n                    } else {\n                        navigate(\"/orghome\");\n                    }\n                }\n            } else {\n                showAlert(\"Failed to sign up with Google\", \"error\");\n            }\n        } catch (error) {\n            showAlert(\"Google signup failed\", \"error\");\n        }\n    };\n\n    const handleGoogleFailure = () => showAlert(\"Google signup failed\", \"error\");\n\n    return (\n        <GoogleOAuthProvider clientId=\"637231094750-2iviubrnmb70qmt9g89nr1nb1u6cqd43.apps.googleusercontent.com\">\n            <div className=\"min-h-screen bg-gradient-to-br from-gray-50 to-gray-100 flex items-center justify-center p-4 sm:p-6 lg:p-8\">\n                <Transition\n                    appear={true}\n                    show={true}\n                    enter=\"transition-all duration-700 ease-out\"\n                    enterFrom=\"opacity-0 scale-95\"\n                    enterTo=\"opacity-100 scale-100\"\n                >\n                    <div className=\"flex flex-col md:flex-row w-full max-w-4xl bg-white rounded-3xl shadow-xl overflow-hidden\">\n                        {/* Left Container */}\n                        <div className=\"flex flex-col items-center justify-center bg-gradient-to-br from-blue-400 to-blue-600 w-full md:w-2/5 text-white p-8 md:p-10\">\n                            <img alt=\"UnResume Logo\" className=\"w-28 h-28 rounded-full shadow-md mb-6\" src={Logo} />\n                            <h2 className=\"text-3xl font-bold tracking-tight\">UnResume</h2>\n                        </div>\n\n                        {/* Right Container */}\n                        <div className=\"flex flex-col p-6 md:p-10 w-full md:w-3/5\">\n                            <h3 className=\"text-2xl font-semibold text-gray-800 text-center\">Create Account</h3>\n\n                            {/* Google Signup */}\n                            <div className=\"mt-6 flex justify-center\">\n                                <GoogleLogin\n                                    onSuccess={handleGoogleSuccess}\n                                    onError={handleGoogleFailure}\n                                    theme=\"filled_blue\"\n                                    size=\"large\"\n                                    text=\"signup_with\"\n                                    shape=\"pill\"\n                                    width=\"300\"\n                                />\n                            </div>\n                            <div className=\"relative flex items-center justify-center my-6\">\n                                <div className=\"absolute inset-0 flex items-center\">\n                                    <div className=\"w-full border-t border-gray-300\"></div>\n                                </div>\n                                <span className=\"relative bg-white px-3 text-sm text-gray-500\">or</span>\n                            </div>\n\n                            {/* Form */}\n                            <form onSubmit={handleSubmit(onSubmit)} className=\"flex flex-col gap-6\">\n                                {/* Full Name */}\n                                <div className=\"relative\">\n                                    <input\n                                        {...register(\"username\")}\n                                        className=\"w-full px-4 py-3 rounded-full border border-gray-300 focus:outline-none focus:ring focus:ring-blue-500 transition-all duration-200 bg-gray-50/50 placeholder-gray-400\"\n                                        placeholder=\"Full Name\"\n                                    />\n                                    {errors.username && <p className=\"text-red-500 text-sm mt-1\">{errors.username.message}</p>}\n                                </div>\n                                <div className=\"relative\">\n                                    <input\n                                        {...register(\"email\")}\n                                        className=\"w-full px-4 py-3 rounded-full border border-gray-300 focus:outline-none focus:ring focus:ring-blue-500 transition-all duration-200 bg-gray-50/50 placeholder-gray-400\"\n                                        placeholder=\"Email\"\n                                    />\n                                    {errors.email && <p className=\"text-red-500 text-sm mt-1\">{errors.email.message}</p>}\n                                </div>\n                                <div className=\"relative\">\n                                    <input\n                                        {...register(\"password\")}\n                                        className=\"w-full px-4 py-3 rounded-full border border-gray-300 focus:outline-none focus:ring focus:ring-blue-500 transition-all duration-200 bg-gray-50/50 placeholder-gray-400 pr-10\"\n                                        placeholder=\"Password\"\n                                        type={showPassword ? \"text\" : \"password\"}\n                                    />\n                                    <button\n                                        type=\"button\"\n                                        onClick={toggleShowPassword}\n                                        className=\"absolute right-3 top-6 transform -translate-y-1/2 text-gray-500 hover:text-blue-500 transition-colors duration-200\"\n                                    >\n                                        {showPassword ? <EyeSlashIcon className=\"w-5 h-5\" /> : <EyeIcon className=\"w-5 h-5\" />}\n                                    </button>\n                                    {errors.password && <p className=\"text-red-500 text-sm mt-1\">{errors.password.message}</p>}\n                                </div>\n                                {/* Role Dropdown - moved below other fields */}\n                                <div className=\"relative\">\n                                    <select\n                                        {...register(\"role\")}\n                                        className=\"w-full px-4 py-3 rounded-full border border-gray-300 focus:outline-none focus:ring focus:ring-blue-500 transition-all duration-200 bg-gray-50/50 text-gray-700\"\n                                        name=\"role\"\n                                    >\n                                        <option value=\"\" disabled>Select Role</option>\n                                        <option value=\"smallbiz_owner\">Small Business Owner</option>\n                                        <option value=\"nonprofit\">Nonprofit Organization</option>\n                                        <option value=\"nonprofit\">Community Organizer</option>\n                                    </select>\n                                    {errors.role && <p className=\"text-red-500 text-sm mt-1\">{errors.role.message}</p>}\n                                </div>\n\n                                <button\n                                    className=\"w-full cursor-pointer py-3 bg-blue-500 text-white font-semibold rounded-full shadow-md hover:bg-blue-600 disabled:bg-blue-300 transition-all duration-300 transform hover:scale-105 focus:outline-none focus:ring-2 focus:ring-blue-400\"\n                                    disabled={loading}\n                                    type=\"submit\"\n                                >\n                                    {loading ? \"Signing Up...\" : \"Sign Up\"}\n                                </button>\n                            </form>\n                            <p className=\"mt-4 text-sm text-gray-600 text-center\">\n                                Already a user?{\" \"}\n                                <Link to=\"/login\" className=\"text-blue-500 font-semibold hover:text-blue-600 transition-colors duration-200\">\n                                    Log In\n                                </Link>\n                            </p>\n                        </div>\n                    </div>\n                </Transition>\n            </div>\n        </GoogleOAuthProvider>\n    );\n}\n","import { Transition } from \"@headlessui/react\";\nimport { EyeIcon, EyeSlashIcon } from \"@heroicons/react/24/solid\";\nimport { GoogleLogin, GoogleOAuthProvider } from \"@react-oauth/google\";\nimport axios from \"axios\";\nimport Cookies from \"js-cookie\";\nimport { useEffect, useState } from \"react\";\nimport { Link, useNavigate } from \"react-router-dom\";\nimport { useForm } from \"react-hook-form\";\nimport { zodResolver } from \"@hookform/resolvers/zod\";\nimport { signupSchema } from \"./schemas/signupSchema\";\nimport Navbar from \"./Navbar\";\nimport { ApiService } from \"../api/services.gen\";\nimport { checkAndRedirectByRole } from \"../utils/authUtils\";\nimport { useAlert } from \"../constants/AlertProvider\";\nimport { getUserDetails } from \"../utils/getUserDetails\";\n\nexport default function Signup() {\n  const {\n    register,\n    handleSubmit,\n    formState: { errors, isSubmitting },\n  } = useForm({\n    resolver: zodResolver(signupSchema),\n    defaultValues: {\n      username: \"\",\n      email: \"\",\n      password: \"\",\n      role: \"candidate\",\n      is_volunteer: true,\n    }\n  })\n  const [loading, setLoading] = useState(false);\n  const [showPassword, setShowPassword] = useState(false);\n  const navigate = useNavigate();\n  const showAlert = useAlert();\n\n  useEffect(() => {\n    const verifySession = async () => {\n      const id = Cookies.get(\"id\");\n      const role = Cookies.get(\"role\");\n      if (id || role) {\n        try {\n          await getUserDetails();\n          checkAndRedirectByRole(navigate);\n        } catch (error) {\n          Cookies.remove(\"id\");\n          Cookies.remove(\"role\");\n          Cookies.remove(\"csrftoken\");\n        }\n      }\n    };\n    verifySession();\n  }, [navigate]);\n\n  const onSubmit = async ({ username, email, password, role }) => {\n    setLoading(true);\n\n    try {\n      const payload = {\n        requestBody: {\n          email,\n          password,\n          name: username,\n          role: \"candidate\",\n          phone_number: \"\",\n          address: \"\",\n          is_volunteer: true,\n        },\n      };\n      await ApiService.apiSignupCreate(payload);\n      // After successful signup, log the user in\n      const loginPayload = {\n        requestBody: {\n          email,\n          password,\n        },\n      };\n      const loginRes = await ApiService.apiLoginCreate(loginPayload);\n      Cookies.set(\"id\", loginRes.id, { expires: 7 });\n      Cookies.set(\"role\", \"candidate\", { expires: 7 });\n      navigate(\"/setprofile\", { replace: true, state: { from: \"signup\" } });\n      return;\n    } catch (error) {\n      console.error(\"Signup error:\", error);\n\n      const errorBody = error.body; \n      const status = error.status;  \n\n      let message = \"Failed to signup. Please try again.\";\n\n      if (status === 409) {\n        message = \"User already exists.\";\n      } else if (status === 400) {\n        // Check if email field exists in body\n        if (errorBody?.email && errorBody.email.length > 0) {\n          message = \"Email already exists.\"; // e.g., \"user already exists\"\n        } else {\n          message = \"Bad request. Please check your input.\";\n        }\n      }\n\n      showAlert(message, \"error\");\n    } finally {\n      setLoading(false);\n    }\n  };\n\n  const toggleShowPassword = () => setShowPassword((prev) => !prev);\n\n  const handleGoogleSuccess = async (response) => {\n    try {\n      const csrfToken = Cookies.get(\"csrftoken\");\n      const payload = { token: response.credential };\n      const res = await axios.post(\"/api/googlelogin/\", payload, {\n        headers: { \"X-CSRFToken\": csrfToken, \"Content-Type\": \"application/json\" },\n        withCredentials: true,\n      });\n\n      if (res.status === 200 && res.data.user?.id) {\n        const userId = res.data.user.id;\n        Cookies.set(\"id\", userId, { expires: 7 });\n        const userRes = await axios.get(`/api/users/${userId}/`, { withCredentials: true });\n        if (userRes.data?.role) {\n          const role = userRes.data.role;\n          Cookies.set(\"role\", role, { expires: 7 });\n          // Redirect based on role\n          if (role === \"candidate\") {\n            navigate(\"/setprofile\", { replace: true, state: { from: \"signup\" } });\n          } else {\n            navigate(\"/orghome\", { replace: true });\n          }\n        } else {\n          showAlert(\"Cannot find user with these credentials\", \"error\");\n        }\n      } else {\n        showAlert(\"Failed to sign up with Google\", \"error\");\n      }\n    } catch (error) {\n      console.error(\"Google signup error:\", error.response);\n      const status = error.response?.status;\n      const errorData = error.response?.data;\n\n      if (status === 409) {\n        showAlert(errorData?.detail || \"This email is already registered. Please log in.\", \"error\");\n      } else {\n        showAlert(\"Google signup failed. Please try again.\", \"error\");\n      }\n    }\n  };\n\n  const handleGoogleFailure = () => showAlert(\"Google signup failed\", \"error\");\n\n  return (\n    <GoogleOAuthProvider clientId=\"637231094750-2iviubrnmb70qmt9g89nr1nb1u6cqd43.apps.googleusercontent.com\">\n      <Navbar />\n      <div className=\"bg-white flex justify-center\">\n        <Transition\n          appear={true}\n          show={true}\n          enter=\"transition-all duration-700 ease-out\"\n          enterFrom=\"opacity-0 scale-95\"\n          enterTo=\"opacity-100 scale-100\"\n        >\n          <div className=\"p-4 flex flex-col items-center justify-center w-full max-w-4xl\">\n            <h3 className=\"m-8 text-xl md:text-2xl font-bold text-gray-900 text-center\">Sign up to find your work match!</h3>\n            <div className=\"flex flex-col px-6 md:px-10 py-4 md:py-6 w-full md:w-3/5 shadow-md rounded-md\">\n              {/* Google Signup */}\n              <div className=\"mt-2 flex justify-center\">\n                <GoogleLogin\n                  onSuccess={handleGoogleSuccess}\n                  onError={handleGoogleFailure}\n                  theme=\"filled_blue\"\n                  size=\"large\"\n                  text=\"signup_with\"\n                  shape=\"pill\"\n                  width=\"250\"\n                />\n              </div>\n              <div className=\"relative flex items-center justify-center my-6\">\n                <div className=\"absolute inset-0 flex items-center\">\n                  <div className=\"w-full border-t border-gray-300\"></div>\n                </div>\n                <span className=\"relative bg-white px-3 text-sm font-medium text-gray-900\">or</span>\n              </div>\n\n              {/* Form */}\n              <form onSubmit={handleSubmit(onSubmit)} className=\"flex flex-col gap-6\">\n\n                <div className=\"relative flex flex-col gap-y-2\">\n                  <label htmlFor=\"username\" className=\"text-sm font-medium text-gray-900\">Full Name</label>\n                  <input\n                    {...register(\"username\")}\n                    className=\"w-full h-10 p-2 rounded-lg border-2 border-gray-300 focus:outline-none focus:border-blue-500 transition-all duration-200 bg-gray-50/50\"\n                    id=\"username\"\n                  />\n                  {errors.username && <p className=\"text-red-500 text-sm mt-1\">{errors.username.message}</p>}\n                </div>\n                <div className=\"relative flex flex-col gap-y-2\">\n                  <label htmlFor=\"email\" className=\"text-sm font-medium text-gray-900\">Email Address</label>\n                  <input\n                    {...register(\"email\")}\n                    className=\"w-full h-10 p-2 rounded-lg border-2 border-gray-300 focus:outline-none focus:border-blue-500 transition-all duration-200 bg-gray-50/50\"\n                    id=\"email\"\n                  />\n                  {errors.email && <p className=\"text-red-500 text-sm mt-1\">{errors.email.message}</p>}\n                </div>\n                <div className=\"relative flex flex-col gap-y-2\">\n                  <label htmlFor=\"password\" className=\"text-sm font-medium text-gray-900\">Password</label>\n                  <input\n                    {...register(\"password\")}\n                    className=\"w-full h-10 p-2 rounded-lg border-2 border-gray-300 focus:outline-none focus:border-blue-500 transition-all duration-200 bg-gray-50/50\"\n                    id=\"password\"\n                    type={showPassword ? \"text\" : \"password\"}\n                  />\n                  <button\n                    type=\"button\"\n                    onClick={toggleShowPassword}\n                    className=\"absolute right-3 top-12 transform -translate-y-1/2 text-gray-500 hover:text-blue-500 transition-colors duration-200\"\n                  >\n                    {showPassword ? <EyeSlashIcon className=\"w-5 h-5\" /> : <EyeIcon className=\"w-5 h-5\" />}\n                  </button>\n                  {errors.password && <p className=\"text-red-500 text-sm mt-1\">{errors.password.message}</p>}\n                </div>\n                {/* hidden role field */}\n                <input type=\"hidden\" {...register(\"role\")} value=\"candidate\" />\n\n                <button\n                  className=\"w-full h-[40px] cursor-pointer bg-blue-700 text-white font-medium rounded-lg shadow-md hover:bg-blue-600 disabled:bg-blue-300 transition-all duration-300 transform focus:outline-none focus:ring focus:ring-blue-400\"\n                  disabled={loading}\n                  type=\"submit\"\n                >\n                  {loading ? \"Signing Up...\" : \"Sign Up\"}\n                </button>\n              </form>\n            </div>\n            <p className=\"mt-4 text-sm text-gray-600 text-center\">\n              Already have an account?{\" \"}\n              <Link to=\"/login\" className=\"text-blue-700 font-semibold hover:text-blue-600 transition-colors duration-200\">\n                Log In\n              </Link>\n            </p>\n          </div>\n        </Transition>\n      </div>\n    </GoogleOAuthProvider>\n  );\n}\n\n\n// ","import { useState, useEffect } from \"react\";\nimport { useParams } from \"react-router-dom\";\nimport axios from \"axios\";\nimport Cookies from \"js-cookie\";\nimport { Briefcase, MapPinIcon, CheckCircle, Calendar } from \"lucide-react\";\nimport { useAlert } from \"../../constants/AlertProvider\";\nimport CircularProgress from '@mui/material/CircularProgress';\n\nexport default function WorkExp() {\n    const { candidateId: routeCandidateId } = useParams();\n    const [userData, setUserData] = useState({\n        name: \"\",\n        email: \"\",\n        phone_number: \"\",\n        address: \"\",\n    });\n    const [applicationId, setApplicationId] = useState(null);\n    const [experiences, setExperiences] = useState([]);\n    const [isRecruiterView, setIsRecruiterView] = useState(false);\n    const [isLoading, setIsLoading] = useState(true);\n    const showAlert = useAlert();\n\n    const formatDate = (dateStr) => {\n        if (!dateStr) return \"Present\";\n        const [year, month, day] = dateStr.split(\"-\");\n        const date = new Date(`${year}-${month}-${day}`);\n        return date.toLocaleString(\"en-US\", { month: \"long\", year: \"numeric\" });\n    };\n\n    useEffect(() => {\n        const fetchExperiences = async () => {\n            try {\n                setIsLoading(true);\n                const loggedInUserId = Cookies.get(\"id\");\n                const targetUserId = routeCandidateId || loggedInUserId;\n\n                if (!targetUserId) {\n                    throw new Error(\"Target User ID is missing\");\n                }\n\n                if (routeCandidateId) {\n                    setIsRecruiterView(true);\n                }\n\n                let userRes;\n                if (isRecruiterView) {\n                    userRes = await axios.get(`/api/candidate-profile/${targetUserId}/`, {\n                        withCredentials: true\n                    });\n                } else {\n                    userRes = await axios.get(`/api/users/${targetUserId}/`, {\n                        withCredentials: true\n                    });\n                }\n                const userProfileData = userRes.data;\n                setUserData(userProfileData);\n\n                if (userProfileData.applicationids && userProfileData.applicationids.length > 0) {\n                    const appId = userRes.data.applicationids[0].id;\n                    setApplicationId(appId);\n\n                    const expResponse = await axios.get(`/api/experience/?application_id=${appId}`, {\n                        headers: { \"X-CSRFToken\": Cookies.get(\"csrftoken\") },\n                        withCredentials: true,\n                    });\n\n                    if (expResponse.data && Array.isArray(expResponse.data.results)) {\n                        setExperiences(expResponse.data.results);\n                    } else {\n                        throw new Error(\"Invalid API response format\");\n                    }\n                } else {\n                    setExperiences([]);\n                }\n            } catch (error) {\n                console.error(\"Error fetching experiences:\", error);\n                showAlert(\"Failed to fetch work experience.\", \"error\");\n            } finally {\n                setIsLoading(false);\n            }\n        };\n\n        fetchExperiences();\n    }, [showAlert, routeCandidateId, isRecruiterView]);\n\n    if (isLoading) {\n        return (\n            <div className=\"flex items-center justify-center p-8\">\n                <CircularProgress size={30} color=\"primary\" />\n            </div>\n        );\n    }\n    return (\n        <div className=\"space-y-6\">\n            {experiences.length === 0 ? (\n                <div className=\"text-center py-12 rounded-lg\">\n                    <Briefcase className=\"mx-auto h-12 w-12 text-gray-400\" />\n                    <h3 className=\"mt-2 text-sm font-medium text-gray-900\">No Work Experience Added</h3>\n                    {!isRecruiterView && (\n                        <p className=\"mt-1 text-sm text-gray-500\">\n                            Your work experience will be displayed here. You can add it by editing your profile.\n                        </p>\n                    )}\n                </div>\n            ) : (\n                <div className=\"space-y-4\">\n                    <div className=\"flex items-center justify-between\">\n                        <h2 className=\"text-lg font-semibold text-gray-900\">\n                            Work Experience ({experiences.length})\n                        </h2>\n                    </div>\n\n                    {experiences.map((exp) => {\n                        const locationString = [exp.city, exp.state, exp.country].filter(Boolean).join(', ');\n                        return (\n                            <div key={exp.id} className=\"bg-white rounded-lg shadow-sm p-4\">\n                                <div className=\"flex items-start space-x-4\">\n                                    <Briefcase className=\"h-6 w-6 text-gray-400 flex-shrink-0 mt-1\" />\n                                    <div>\n                                        <h3 className=\"text-base font-semibold text-gray-900\">\n                                            {exp.duration} at {exp.company}\n                                        </h3>\n                                        <div className=\"mt-1 flex items-center gap-x-4 text-sm text-gray-500\">\n                                            <span className=\"flex items-center\">\n                                                <Calendar className=\"h-4 w-4 mr-1.5\" />\n                                                {formatDate(exp.start_date)} - {formatDate(exp.end_date)}\n                                            </span>\n                                            {locationString && (\n                                                <span className=\"flex items-center\">\n                                                    <MapPinIcon className=\"h-4 w-4 mr-1.5\" />\n                                                    {locationString}\n                                                </span>\n                                            )}\n                                        </div>\n                                    </div>\n                                </div>\n                                <div className=\"mt-3 flex flex-col\">\n                                    <label htmlFor=\"responsibilities\" className=\"text-sm font-bold text-gray-600\">Responsibilities:</label>\n                                    <p id=\"responsibilities\" className=\"text-sm text-gray-600 whitespace-pre-wrap\">{exp.responsibilities}</p>\n                                </div>\n                            </div>\n                        )\n                    })}\n                </div>\n            )}\n        </div>\n    );\n}","import { useState, useEffect } from \"react\";\nimport { useParams } from \"react-router-dom\";\nimport axios from \"axios\";\nimport Cookies from \"js-cookie\";\nimport { Star } from \"lucide-react\";\nimport CircularProgress from '@mui/material/CircularProgress';\nimport { useAlert } from \"../../constants/AlertProvider\";\n\nexport default function Skills() {\n    const { candidateId: routeCandidateId } = useParams();\n    const [userData, setUserData] = useState({\n        name: \"\",\n        email: \"\",\n        phone_number: \"\",\n        address: \"\",\n    });\n    const [applicationId, setApplicationId] = useState(null);\n    const [skills, setSkills] = useState([]);\n    const [isRecruiterView, setIsRecruiterView] = useState(false);\n    const [isLoading, setIsLoading] = useState(true);\n    const showAlert = useAlert();\n\n    useEffect(() => {\n        const fetchSkills = async () => {\n            try {\n                setIsLoading(true);\n                const loggedInUserId = Cookies.get(\"id\");\n                const targetUserId = routeCandidateId || loggedInUserId;\n\n                if (!targetUserId) {\n                    throw new Error(\"Target User ID is missing\");\n                }\n\n                if (routeCandidateId) {\n                    setIsRecruiterView(true);\n                }\n\n                let userRes;\n                if (isRecruiterView) {\n                    userRes = await axios.get(`/api/candidate-profile/${targetUserId}/`, {\n                        withCredentials: true\n                    });\n                } else {\n                    userRes = await axios.get(`/api/users/${targetUserId}/`, {\n                        withCredentials: true\n                    });\n                }\n                const userProfileData = userRes.data;\n                setUserData(userProfileData);\n\n                if (userProfileData.applicationids && userProfileData.applicationids.length > 0) {\n                    const appId = userRes.data.applicationids[0].id;\n                    setApplicationId(appId);\n\n                    const skiResponse = await axios.get(`/api/skill/?application_id=${appId}`, {\n                        headers: { \"X-CSRFToken\": Cookies.get(\"csrftoken\") },\n                        withCredentials: true,\n                    });\n\n                    if (skiResponse.data && Array.isArray(skiResponse.data.results)) {\n                        setSkills(skiResponse.data.results);\n                    } else {\n                        throw new Error(\"Invalid API response format\");\n                    }\n                } else {\n                    setSkills([]);\n                }\n            } catch (error) {\n                showAlert(\"Failed to fetch education.\", \"error\");\n                console.error(\"Error fetching skills:\", error);\n            } finally {\n                setIsLoading(false);\n            }\n        };\n\n        fetchSkills();\n    }, [showAlert, routeCandidateId, isRecruiterView]);\n\n    if (isLoading) {\n        return (\n            <div className=\"flex items-center justify-center p-8\">\n                <CircularProgress size={30} color=\"primary\" />\n            </div>\n        );\n    }\n\n    return (\n        <div className=\"space-y-6\">\n            {skills.length === 0 ? (\n                <div className=\"text-center py-12 rounded-lg\">\n                    <Star className=\"mx-auto h-12 w-12 text-gray-400\" />\n                    <h3 className=\"mt-2 text-sm font-medium text-gray-900\">No Skills Added</h3>\n                    {!isRecruiterView && (\n                        <p className=\"mt-1 text-sm text-gray-500\">\n                            Your skills will be displayed here. You can add it by editing your profile.\n                        </p>\n                    )}\n                </div>\n            ) : (\n                <div className=\"space-y-4\">\n                    <div className=\"flex items-center justify-between\">\n                        <h2 className=\"text-lg font-semibold text-gray-900\">\n                            Skills ({skills.length})\n                        </h2>\n                    </div>\n\n                    <div className=\"flex flex-wrap gap-3\">\n                        {skills.map((skill) => (\n                            <div\n                                key={skill.id}\n                                className=\"bg-blue-100 text-blue-800 text-sm font-medium capitalize px-4 py-2 rounded-full transition-colors hover:bg-blue-200\"\n                            >\n                                {skill.name}\n                            </div>\n                        ))}\n                    </div>\n                </div>\n            )}\n        </div>\n    );\n}","import { useState, useEffect } from \"react\";\nimport { useParams } from \"react-router-dom\";\nimport axios from \"axios\";\nimport Cookies from \"js-cookie\";\nimport { GraduationCap, Calendar } from \"lucide-react\";\nimport { useAlert } from \"../../constants/AlertProvider\";\nimport CircularProgress from '@mui/material/CircularProgress';\n\nexport default function Education() {\n    const { candidateId: routeCandidateId } = useParams();\n    const [userData, setUserData] = useState({\n        name: \"\",\n        email: \"\",\n        phone_number: \"\",\n        address: \"\",\n    });\n    const [applicationId, setApplicationId] = useState(null);\n    const [education, setEducation] = useState([]);\n    const [isRecruiterView, setIsRecruiterView] = useState(false);\n    const [isLoading, setIsLoading] = useState(true);\n    const showAlert = useAlert();\n\n    const formatDate = (dateStr) => {\n        if (!dateStr) return \"Present\";\n        const [year, month, day] = dateStr.split(\"-\");\n        const date = new Date(`${year}-${month}-${day}`);\n        return date.toLocaleString(\"en-US\", { month: \"long\", year: \"numeric\" });\n    };\n\n    useEffect(() => {\n        const fetchEducation = async () => {\n            try {\n                setIsLoading(true);\n                const loggedInUserId = Cookies.get(\"id\");\n                const targetUserId = routeCandidateId || loggedInUserId;\n\n                if (!targetUserId) {\n                    throw new Error(\"Target User ID is missing\");\n                }\n                if (routeCandidateId) {\n                    setIsRecruiterView(true);\n                }\n\n                let userRes;\n                if (isRecruiterView) {\n                    userRes = await axios.get(`/api/candidate-profile/${targetUserId}/`, {\n                        withCredentials: true\n                    });\n                } else {\n                    userRes = await axios.get(`/api/users/${targetUserId}/`, {\n                        withCredentials: true\n                    });\n                }\n                const userProfileData = userRes.data;\n                setUserData(userProfileData);\n\n                if (userProfileData.applicationids && userProfileData.applicationids.length > 0) {\n                    const appId = userRes.data.applicationids[0].id;\n                    setApplicationId(appId);\n\n                    const eduResponse = await axios.get(`/api/education/?application_id=${appId}`, {\n                        headers: { \"X-CSRFToken\": Cookies.get(\"csrftoken\") },\n                        withCredentials: true,\n                    });\n\n                    if (eduResponse.data && Array.isArray(eduResponse.data.results)) {\n                        setEducation(eduResponse.data.results);\n                    } else {\n                        throw new Error(\"Invalid API response format\");\n                    }\n                } else {\n                    setEducation([]);\n                }\n            } catch (error) {\n                console.error(\"Error fetching education:\", error);\n                showAlert(\"Failed to fetch education.\", \"error\");\n            } finally {\n                setIsLoading(false);\n            }\n        };\n\n        fetchEducation();\n    }, [showAlert, routeCandidateId, isRecruiterView]);\n\n    if (isLoading) {\n        return (\n            <div className=\"flex items-center justify-center p-8\">\n                <CircularProgress size={30} color=\"primary\" />\n            </div>\n        );\n    }\n\n    return (\n        <div className=\"space-y-6\">\n            {education.length === 0 ? (\n                <div className=\"text-center py-12 rounded-lg\">\n                    <GraduationCap className=\"mx-auto h-12 w-12 text-gray-400\" />\n                    <h3 className=\"mt-2 text-sm font-medium text-gray-900\">No Education Added</h3>\n                    {!isRecruiterView && (\n                        <p className=\"mt-1 text-sm text-gray-500\">\n                            Your education will be displayed here. You can add it by editing your profile.\n                        </p>\n                    )}\n                </div>\n            ) : (\n                <div className=\"space-y-4\">\n                    <div className=\"flex items-center justify-between\">\n                        <h2 className=\"text-lg font-semibold text-gray-900\">\n                            Education ({education.length})\n                        </h2>\n                    </div>\n\n                    {education.map((edu) => (\n                        <div key={edu.id} className=\"bg-white border border-gray-200 rounded-lg shadow-sm p-4\">\n                            <div className=\"flex items-start space-x-4\">\n                                <GraduationCap className=\"h-6 w-6 text-gray-400 flex-shrink-0 mt-1\" />\n                                <div>\n                                    <h3 className=\"text-md font-semibold text-gray-900\">\n                                        {edu.degree} in {edu.field_of_study}\n                                    </h3>\n                                    <p className=\"text-md text-gray-700\">{edu.institution}</p>\n                                    <div className=\"mt-1 flex items-center gap-x-4 text-sm text-gray-500\">\n                                        <span className=\"flex items-center\">\n                                            <Calendar className=\"h-4 w-4 mr-1.5\" />\n                                            {formatDate(edu.start_date)} - {formatDate(edu.end_date)}\n                                        </span>\n                                        {edu.gpa && (\n                                            <span className=\"font-semibold\">\n                                                GPA: {edu.gpa}\n                                            </span>\n                                        )}\n                                    </div>\n                                </div>\n                            </div>\n                        </div>\n                    ))}\n                </div>\n            )}\n        </div>\n    );\n}","import { useState, useEffect } from \"react\";\nimport { useParams } from \"react-router-dom\";\nimport axios from \"axios\";\nimport Cookies from \"js-cookie\";\nimport { Lightbulb, Link as LinkIcon, Calendar } from \"lucide-react\";\nimport { useAlert } from \"../../constants/AlertProvider\";\nimport CircularProgress from '@mui/material/CircularProgress';\n\nexport default function Projects() {\n    const { candidateId: routeCandidateId } = useParams();\n    const [projects, setProjects] = useState([]);\n    const [isRecruiterView, setIsRecruiterView] = useState(false);\n    const [isLoading, setIsLoading] = useState(true);\n    const showAlert = useAlert();\n\n    const formatDate = (dateStr) => {\n        if (!dateStr) return \"Present\";\n        const date = new Date(dateStr);\n        return date.toLocaleString(\"en-US\", { month: \"long\", year: \"numeric\" });\n    };\n\n    useEffect(() => {\n        const fetchProjects = async () => {\n            try {\n                setIsLoading(true);\n                const loggedInUserId = Cookies.get(\"id\");\n                const targetUserId = routeCandidateId || loggedInUserId;\n\n                if (!targetUserId) {\n                    throw new Error(\"Target User ID is missing\");\n                }\n\n                if (routeCandidateId) {\n                    setIsRecruiterView(true);\n                }\n\n                let userRes;\n                if (isRecruiterView) {\n                    userRes = await axios.get(`/api/candidate-profile/${targetUserId}/`, {\n                        withCredentials: true\n                    });\n                } else {\n                    userRes = await axios.get(`/api/users/${targetUserId}/`, {\n                        withCredentials: true\n                    });\n                }\n\n                if (userRes.data.applicationids && userRes.data.applicationids.length > 0) {\n                    const appId = userRes.data.applicationids[0].id;\n\n                    const projectResponse = await axios.get(`/api/project/?application_id=${appId}`, {\n                        headers: { \"X-CSRFToken\": Cookies.get(\"csrftoken\") },\n                        withCredentials: true,\n                    });\n\n                    if (projectResponse.data && Array.isArray(projectResponse.data.results)) {\n                        setProjects(projectResponse.data.results);\n                    } else {\n                        throw new Error(\"Invalid API response format for projects\");\n                    }\n                } else {\n                    setProjects([]);\n                }\n            } catch (error) {\n                console.error(\"Error fetching projects:\", error);\n                showAlert(error?.response?.data?.detail || \"Failed to fetch projects.\", \"error\");\n            } finally {\n                setIsLoading(false);\n            }\n        };\n\n        fetchProjects();\n    }, [showAlert, routeCandidateId, isRecruiterView]);\n\n    if (isLoading) {\n        return (\n            <div className=\"flex items-center justify-center p-8\">\n                <CircularProgress size={30} color=\"primary\" />\n            </div>\n        );\n    }\n\n    return (\n        <div className=\"space-y-6\">\n            {projects.length === 0 ? (\n                <div className=\"text-center py-12 rounded-lg\">\n                    <Lightbulb className=\"mx-auto h-12 w-12 text-gray-400\" />\n                    <h3 className=\"mt-2 text-sm font-medium text-gray-900\">No Projects Added</h3>\n                    {!isRecruiterView && (\n                        <p className=\"mt-1 text-sm text-gray-500\">\n                            Your projects will be displayed here. You can add it by editing your profile.\n                        </p>\n                    )}\n                </div>\n            ) : (\n                <div className=\"space-y-4\">\n                    <h2 className=\"text-lg font-semibold text-gray-900\">\n                        Projects ({projects.length})\n                    </h2>\n\n                    {projects.map((proj) => (\n                        <div key={proj.id} className=\"bg-white border-b border-gray-200 p-4\">\n                            <div className=\"flex items-start space-x-4\">\n                                <Lightbulb className=\"h-6 w-6 text-gray-400 flex-shrink-0 mt-1\" />\n                                <div className=\"w-full\">\n                                    <h3 className=\"text-md font-semibold text-gray-900\">{proj.name}</h3>\n                                    <div className=\"mt-1 w-full flex items-center justify-between text-sm text-gray-500\">\n                                        {(proj.start_date || proj.end_date) && (<span className=\"flex items-center\"><Calendar className=\"h-4 w-4 mr-1.5\" />{formatDate(proj.start_date)} - {formatDate(proj.end_date)}</span>)}\n                                        {proj.link && (<a href={proj.link} target=\"_blank\" rel=\"noopener noreferrer\" className=\"flex items-center text-gray-500 hover:text-blue-500 cursor-pointer transition-all duration-200\"><LinkIcon className=\"h-4 w-4 mr-1.5\" />View</a>)}\n                                    </div>\n                                    <p className=\"mt-3 text-sm text-gray-600 whitespace-pre-wrap\">{proj.description}</p>\n                                </div>\n                            </div>\n                        </div>\n                    ))}\n                </div>\n            )}\n        </div>\n    );\n}","import { useState, useEffect } from \"react\";\nimport { useNavigate, useParams } from \"react-router-dom\";\nimport axios from \"axios\";\nimport Cookies from \"js-cookie\";\nimport { Transition } from \"@headlessui/react\";\nimport {\n    Pencil,\n    Briefcase,\n    Star,\n    GraduationCap,\n    Lightbulb,\n    Linkedin as LinkedinIcon,\n    Github,\n    Globe,\n    MapPin,\n    User,\n    File\n} from \"lucide-react\";\n\nimport ProfilePic from \"../../../assets/images/blank-profile-pic.png\";\nimport WorkExp from \"./WorkExp\";\nimport Skills from \"./Skills\";\nimport Education from \"./Education\";\n// import ContactInfo from \"./ContactInfo\";\nimport Projects from \"./Projects\";\nimport ResumeUploader from \"./ResumeUploader\";\n\nexport default function Contact() {\n    const navigate = useNavigate();\n    const { candidateId } = useParams(); // For recruiter view\n    const [userData, setUserData] = useState({ name: \"\", profile_picture: \"\", address_details: null });\n    const [socialData, setSocialData] = useState({ linkedin: \"\", github: \"\", portfolio: \"\", description: \"\", summary: \"\" });\n    const [activeTab, setActiveTab] = useState(\"workexp\");\n    const [applicationId, setApplicationId] = useState(null);\n    const [completionData, setCompletionData] = useState({ completion: 0, checklist: [] });\n    const [isRecruiterView, setIsRecruiterView] = useState(false);\n\n    const handleTabClick = (tab) => {\n        setActiveTab(tab);\n    };\n\n    const tabs = [\n        { id: \"workexp\", label: \"Work Experience\", icon: <Briefcase className=\"w-5 h-5\" /> },\n        { id: \"skills\", label: \"Skills\", icon: <Star className=\"w-5 h-5\" /> },\n        { id: \"education\", label: \"Education\", icon: <GraduationCap className=\"w-5 h-5\" /> },\n        { id: \"projects\", label: \"Projects\", icon: <Lightbulb className=\"w-5 h-5\" /> },\n        { id: \"resume\", label: \"Resume\", icon: <File className=\"w-5 h-5\" /> },\n    ];\n\n    const tabContent = {\n        workexp: <WorkExp />,\n        skills: <Skills />,\n        education: <Education />,\n        projects: <Projects />,\n        resume: <ResumeUploader />,\n    };\n\n    useEffect(() => {\n        const loggedInUserId = Cookies.get(\"id\");\n        const targetUserId = candidateId || loggedInUserId;\n\n        if (candidateId) {\n            setIsRecruiterView(true);\n        }\n\n        if (!targetUserId) {\n            console.error(\"Target User ID not found\");\n            return;\n        }\n        const fetchProfile = async () => {\n            try {\n                let userProfileData;\n                if (isRecruiterView) {\n                    // For recruiters, use the dedicated candidate-profile endpoint\n                    const profileRes = await axios.get(`/api/candidate-profile/${targetUserId}/`, { withCredentials: true });\n                    userProfileData = profileRes.data;\n                } else {\n                    // For candidates viewing their own profile\n                    const userRes = await axios.get(`/api/users/${targetUserId}/`, { withCredentials: true });\n                    userProfileData = userRes.data;\n                }\n                setUserData(userProfileData);\n\n                if (userProfileData.applicationids && userProfileData.applicationids.length > 0) {\n                    const appId = userProfileData.applicationids[0].id;\n                    setApplicationId(appId);\n\n                    const appRes = await axios.get(`/api/application/${appId}/`, { withCredentials: true });\n                    setSocialData(appRes.data);\n                } else {\n                    setSocialData({ linkedin: \"\", github: \"\", portfolio: \"\", description: \"\", summary: \"\" });\n                }\n            } catch (error) {\n                console.error(\"Error fetching user data:\", error);\n            }\n        }\n\n        const fetchCompletion = async () => {\n            if (!candidateId) { // Only for candidate's own view\n                try {\n                    const res = await axios.get('/api/users/dashboard/profile-completion/', { withCredentials: true });\n                    setCompletionData(res.data);\n                } catch (error) {\n                    console.error(\"Error fetching profile completion data:\", error);\n                }\n            }\n        };\n\n        fetchProfile();\n        fetchCompletion();\n    }, [candidateId, isRecruiterView]);\n\n    const handleEditProfile = () => {\n        navigate(\"/setprofile\", { state: { from: \"edit\" } });\n    };\n\n    const socialLinks = [\n        { Icon: LinkedinIcon, link: socialData.linkedin, name: 'LinkedIn' },\n        { Icon: Github, link: socialData.github, name: 'GitHub' },\n        { Icon: Globe, link: socialData.portfolio, name: 'Portfolio' },\n    ];\n\n    const completion = completionData.completion || 0;\n    const getProgressColor = () => {\n        if (completion <= 20) return 'text-red-500';\n        if (completion <= 60) return 'text-orange-500';\n        return 'text-green-500';\n    };\n\n    const radius = 44; // slightly smaller than half of the container width/height (w-24 -> 96px, so radius is < 48)\n    const circumference = 2 * Math.PI * radius;\n    const strokeDashoffset = circumference - (completion / 100) * circumference;\n\n    return (\n        <div className=\"min-h-screen bg-gray-50 py-8 px-4 sm:px-6 lg:px-8 mt-12\">\n            <div className=\"max-w-7xl mx-auto\">\n                {/* Profile Header */}\n                <div className=\"bg-white rounded-xl shadow-md p-6\">\n                    <div className=\"flex flex-col sm:flex-row sm:items-start sm:justify-between\">\n                        <div className=\"flex items-start gap-5\">\n                            <div className=\"relative w-24 h-24 flex-shrink-0 group\">\n                                <img\n                                    className=\"w-full h-full rounded-full object-cover border-4 border-white shadow-md\"\n                                    alt=\"profile pic\"\n                                    src={userData.profile_picture || ProfilePic}\n                                />\n                                {!isRecruiterView && (\n                                    <>\n                                        <svg className=\"absolute top-0 left-0 w-full h-full\" viewBox=\"0 0 100 100\">\n                                            {/* Background Circle */}\n                                            <circle\n                                                className=\"text-gray-200\"\n                                                strokeWidth=\"6\"\n                                                stroke=\"currentColor\"\n                                                fill=\"transparent\"\n                                                r={radius}\n                                                cx=\"50\"\n                                                cy=\"50\"\n                                            />\n                                            {/* Progress Circle */}\n                                            <circle\n                                                className={`${getProgressColor()} transition-all duration-500 ease-in-out`}\n                                                strokeWidth=\"6\"\n                                                strokeDasharray={circumference}\n                                                strokeDashoffset={strokeDashoffset}\n                                                strokeLinecap=\"round\"\n                                                stroke=\"currentColor\"\n                                                fill=\"transparent\"\n                                                r={radius}\n                                                cx=\"50\"\n                                                cy=\"50\"\n                                                transform=\"rotate(-90 50 50)\"\n                                            />\n                                        </svg>\n                                        <div className={`absolute -bottom-2 left-1/2 -translate-x-1/2 px-2 py-0.5 rounded-full text-xs font-semibold text-white ${getProgressColor().replace('text-', 'bg-')}`}>\n                                            {completion}%\n                                        </div>\n                                    </>\n                                )}\n                            </div>\n\n                            <div>\n                                <h1 className=\"text-lg font-bold text-gray-900\">{userData.name}</h1>\n                                <div className=\"mt-2 flex flex-col md:flex-row gap-y-2 md:gap-x-4 items-center\">\n                                    {socialData.description &&\n                                        (\n                                            <div className=\"flex items-center text-sm text-gray-500\">\n                                                <User className=\"w-4 h-4 mr-2\" />\n                                                <p>{socialData.description}</p>\n                                            </div>\n                                        )}\n                                    {userData.address_details && (\n                                        <div className=\"flex items-center text-sm text-gray-500\">\n                                            <MapPin className=\"w-4 h-4 mr-2\" />\n                                            <span>{userData.address_details.city || userData.address_details.state_province} , {userData.address_details.country}</span>\n                                        </div>\n                                    )}\n                                </div>\n                                <div className=\"flex items-center gap-4 mt-3\">\n                                    {socialLinks.map(({ Icon, link, name }) => (\n                                        link ? (\n                                            <a\n                                                key={name}\n                                                href={link}\n                                                target=\"_blank\"\n                                                rel=\"noopener noreferrer\"\n                                                className=\"text-gray-500 hover:text-blue-600 transition-colors\"\n                                                aria-label={name}\n                                            >\n                                                <Icon className=\"size-4\" />\n                                            </a>\n                                        ) : null\n                                    ))}\n                                </div>\n                            </div>\n                        </div>\n\n                        {!isRecruiterView && (\n                            <button\n                                onClick={handleEditProfile}\n                                className=\"mt-4 sm:mt-0 flex-shrink-0 flex items-center gap-2 text-sm font-semibold cursor-pointer text-blue-700 hover:text-blue-500 transition-all duration-200\"\n                            >\n                                <Pencil className=\"w-4 h-4\" />\n                                Edit Profile\n                            </button>\n                        )}\n                    </div>\n                </div>\n\n                {/* Summary */}\n                {socialData.summary && (\n                    <div className=\"mt-6 p-6\">\n                        <h2 className=\"text-xl font-semibold text-gray-800 mb-3\">Professional Summary</h2>\n                        <p className=\"text-gray-500 text-sm whitespace-pre-wrap\">{socialData.summary}</p>\n                    </div>\n                )}\n\n                {/* Main Content */}\n                <div className=\"mt-6 flex flex-col md:flex-row gap-6\">\n                    {/* Left Nav */}\n                    <div className=\"md:w-1/4\">\n                        <div className=\"p-4\">\n                            <nav className=\"flex flex-col space-y-1\">\n                                {tabs.map((tab) => (\n                                    <button\n                                        key={tab.id}\n                                        onClick={() => handleTabClick(tab.id)}\n                                        className={`flex items-center gap-3 w-full text-left px-4 py-3 rounded-lg font-medium text-sm transition-colors ${activeTab === tab.id\n                                            ? 'bg-blue-50 text-blue-600'\n                                            : 'text-gray-600 hover:bg-gray-100 hover:text-gray-900'\n                                            }`}\n                                    >\n                                        {tab.icon}\n                                        <span>{tab.label}</span>\n                                    </button>\n                                ))}\n                            </nav>\n                        </div>\n                    </div>\n\n                    {/* Right Content */}\n                    <div className=\"flex-1\">\n                        <div className=\"bg-white rounded-xl shadow-md p-6 min-h-[300px]\">\n                            <Transition\n                                key={activeTab}\n                                appear={true}\n                                show={true}\n                                enter=\"transition-opacity duration-300\"\n                                enterFrom=\"opacity-0\"\n                                enterTo=\"opacity-100\"\n                            >\n                                {/* Wrap the tab content in a div to allow Transition to attach a ref */}\n                                <div>{tabContent[activeTab]}</div>\n                            </Transition>\n                        </div>\n                    </div>\n                </div>\n            </div>\n        </div>\n    );\n}","import Contact from \"../components/candidate/Contact\";\nimport RecNavbar from \"../components/recruiter/RecHomeNavbar\";\n\nexport default function CandidateProfile() {\n  return (\n    <>\n      <RecNavbar />\n      <Contact />\n    </>\n  );\n}","import axios from \"axios\";\nimport { useEffect } from \"react\";\nimport { useNavigate } from \"react-router-dom\";\n\nimport HomeNavbar from \"../components/candidate/HomeNavbar\";\nimport YourMatches from \"../components/candidate/your_matches/YourMatches\";\n\nconst Home = () => {\n  const navigate = useNavigate();\n\n  useEffect(() => {\n    const checkLogin = async () => {\n      try {\n        const response = await axios.get(\"/api/session/\");\n        if (!response.data.isAuthenticated) {\n          navigate(\"/login\");\n        }\n      } catch (error) {\n        console.error(\"Error during check login:\", error);\n        navigate(\"/login\");\n      }\n    };\n    checkLogin();\n  }, []);\n\n  return (\n    <>\n      <HomeNavbar />\n      <YourMatches />\n    </>\n  );\n};\n\nexport default Home;\n","import { useParams, useNavigate } from \"react-router-dom\";\nimport { useEffect, useState } from \"react\";\nimport axios from \"axios\";\nimport { MapPinIcon, BriefcaseIcon, UsersIcon, CubeIcon, CurrencyDollarIcon } from \"@heroicons/react/24/outline\";\nimport Navbar from \"../constants/Navbar\";\nimport { formatField } from \"../utils/universalFormatter\";\nimport { SkeletonLoader } from \"../components/common/SkeletonLoader\";\nimport { useAlert } from \"../constants/AlertProvider\";\n\nexport default function JobShare() {\n    const { id } = useParams();\n    const navigate = useNavigate();\n    const [job, setJob] = useState(null);\n    const [isLoading, setIsLoading] = useState(true);\n    const showAlert = useAlert();\n\n    useEffect(() => {\n        const fetchJobs = async () => {\n            setIsLoading(true);\n            try {\n                const jobRes = await axios.get(`/api/jobprofile/${id}/`, { withCredentials: true });\n                const jobData = jobRes.data;\n\n                // Fetch company info for the job\n                const companyRes = await axios.get(`/api/company/${jobData.company}/`, { withCredentials: true });\n                const jobWithCompany = { ...jobData, companyData: companyRes.data };\n                setJob(jobWithCompany);\n            } catch (error) {\n                showAlert(\"Error fetching job\", \"error\");\n                console.error(\"Error fetching job:\", error);\n                setJob(null);\n            } finally {\n                setIsLoading(false);\n            }\n        };\n        fetchJobs();\n    }, [id]);\n\n    const formatKeywords = (keywords) => {\n        if (!keywords) return \"\";\n        const keywordList = keywords.split(',').map(k => k.trim());\n        if (keywordList.length > 3) {\n            return `${keywordList.slice(0, 3).join(', ')}...`;\n        }\n        return keywords;\n    };\n\n    return (\n        <>\n            <Navbar />\n            <div className=\"min-h-screen bg-gray-50 flex flex-col pb-28\">\n                {isLoading ? (\n                    <div className=\"w-full\">\n                        <SkeletonLoader />\n                    </div>\n                ) : !job || !job.is_active ? (\n                    <div className=\"w-full flex-grow flex items-center justify-center\">\n                        <div className=\"w-full max-w-3xl p-10 text-center\">\n                            <h2 className=\"text-lg font-semibold text-gray-800\">Job not found</h2>\n                            <p className=\"text-gray-500 mt-2 mb-6\">\n                                The job you are looking for does not exist or has been removed.\n                            </p>\n                            <button\n                                onClick={() => navigate(\"/landingpage\")}\n                                className=\"px-4 py-2 bg-blue-600 text-white text-sm font-medium rounded-lg shadow hover:bg-blue-700 transition-transform transform hover:scale-105\"\n                            >\n                                Signup to Get Matched\n                            </button>\n                        </div>\n                    </div>\n                ) : (\n                    <div className=\"w-full flex-grow flex flex-col\">\n                        {/* Header Section */}\n                        <div className=\"w-full bg-white border-b border-gray-200 px-6 py-6 flex items-center gap-4\">\n                            <img\n                                src={job.companyData.logo}\n                                alt=\"logo\"\n                                className=\"w-14 h-14 rounded-md border border-gray-200\"\n                            />\n                            <div>\n                                <h1 className=\"text-xl font-bold text-gray-900\">{job.title}</h1>\n                                <p className=\"text-gray-600 text-sm\">{job.companyData.name}</p>\n                            </div>\n                        </div>\n\n                        {/* Meta Info */}\n                        <div className=\"w-full bg-gray-50 border-b border-gray-200 px-6 py-4\">\n                            <div className=\"grid grid-cols-3 gap-4 text-gray-700 text-sm mb-2\">\n                                <div className=\"flex items-center gap-2\">\n                                    <BriefcaseIcon className=\"w-4 h-4 text-gray-400\" />\n                                    <span>{formatField(\"job_type\", job.job_type)}</span>\n                                </div>\n                                <div className=\"flex items-center gap-2\">\n                                    <CubeIcon className=\"w-4 h-4 text-gray-400\" />\n                                    <span>{formatKeywords(job.keywords)}</span>\n                                </div>\n                                <div className=\"flex items-center gap-2\">\n                                    <CurrencyDollarIcon className=\"w-4 h-4 text-gray-400\" />\n                                    <span>\n                                        ${formatField(\"salary\", job.salary_min)}K - $\n                                        {formatField(\"salary\", job.salary_max)}K\n                                    </span>\n                                </div>\n                            </div>\n                            <div className=\"grid grid-cols-3 gap-4 text-gray-700 text-sm\">\n                                <div className=\"flex items-center gap-2\">\n                                    <MapPinIcon className=\"w-4 h-4 text-gray-400\" />\n                                    <span>\n                                        {job.city}, {job.state}\n                                    </span>\n                                </div>\n                                <div className=\"flex items-center gap-2\">\n                                    <BriefcaseIcon className=\"w-4 h-4 text-gray-400\" />\n                                    <span>{job.years_of_experience} yrs exp</span>\n                                </div>\n                                <div className=\"flex items-center gap-2\">\n                                    <UsersIcon className=\"w-4 h-4 text-gray-400\" />\n                                    <span>\n                                        {formatField(\"employee_count\", job.companyData.employee_count)}{\" \"}\n                                        employees\n                                    </span>\n                                </div>\n                            </div>\n                        </div>\n\n                        {/* Description */}\n                        <div className=\"px-6 py-8 bg-white\">\n                            <h2 className=\"text-lg font-semibold text-gray-800 mb-4\">\n                                Job Description\n                            </h2>\n                            <p className=\"text-gray-600 leading-relaxed text-sm\">\n                                {job.description}\n                            </p>\n                        </div>\n\n                    </div>\n                )}\n                {/* Sticky CTA Footer */}\n                {!isLoading && job && job.is_active && (\n                    <div className=\"fixed bottom-6 right-6\">\n                        <button onClick={() => navigate(\"/landingpage\")} className=\"px-6 py-3 bg-blue-600 text-white text-sm font-medium rounded-lg shadow-lg hover:bg-blue-700 transition-transform transform hover:scale-105\">\n                            Signup to Get Matched\n                        </button>\n                    </div>\n                )}\n            </div>\n        </>\n    );\n\n};\n","import { useState } from 'react';\nimport { Check, X } from 'lucide-react';\n\nexport function RolePopup({ isOpen, onClose, onContinue }) {\n    const [selectedHiringRole, setSelectedHiringRole] = useState(null);\n\n    if (!isOpen) return null;\n\n    const handleContinue = () => {\n        if (selectedHiringRole) {\n            onContinue(selectedHiringRole);\n        }\n    };\n\n    const options = [\n        { value: \"organization\", label: \"I’m an Organization\" },\n        { value: \"sme\", label: \"I’m an SME\" }\n    ];\n\n    return (\n        <div className=\"fixed inset-0 bg-gray-100/50 overflow-y-auto h-full w-full flex justify-center items-center z-50\">\n            <div className=\"relative p-8 w-full max-w-md shadow-lg rounded-2xl bg-white mx-4\">\n                <button onClick={onClose} className=\"absolute top-4 right-4 text-gray-400 hover:text-gray-600\">\n                    <X size={24} />\n                </button>\n                <h3 className=\"text-xl font-bold text-gray-900 tracking-tighter mb-6 text-center\">Join as an Organization or SME</h3>\n                <div className=\"flex flex-col gap-y-4\">\n                    {options.map(option => (\n                        <label key={option.value} className=\"relative cursor-pointer\">\n                            <button\n                                onClick={() => setSelectedHiringRole(option.value)}\n                                className=\"w-full h-[80px] flex items-center justify-center rounded-lg border-2 p-4 shadow-sm transition-all duration-200 border-gray-300 bg-white hover:bg-gray-100\"\n                            >\n                                <span className=\"font-bold text-gray-900 text-lg tracking-tighter\">{option.label}</span>\n                                <span className={`absolute top-2 right-2 w-6 h-6 ${selectedHiringRole === option.value ? \"bg-blue-700\" : \"bg-white\"} border border-gray-400 rounded-full flex items-center justify-center transition-all duration-200`}>\n                                    {selectedHiringRole === option.value && <Check className=\"w-4 h-4 text-white\" strokeWidth={3} />}\n                                </span>\n                            </button>\n                        </label>\n                    ))}\n                </div>\n                <div className=\"mt-6 flex justify-center\">\n                    <button onClick={handleContinue} disabled={!selectedHiringRole} className=\"w-full h-[48px] text-blue-700 text-[14px] font-semibold hover:text-blue-500 disabled:text-blue-300 disabled:cursor-not-allowed transition-colors\">\n                        Continue\n                    </button>\n                </div>\n            </div>\n        </div>\n    );\n}","import axios from \"axios\";\nimport Cookies from \"js-cookie\";\nimport { useState, useEffect } from \"react\";\nimport { Link, useNavigate } from \"react-router-dom\";\nimport { checkAndRedirectByRole } from \"../utils/authUtils\";\nimport Navbar from \"../constants/Navbar\";\nimport { Check } from \"lucide-react\";\nimport { useAlert } from \"../constants/AlertProvider\";\nimport { RolePopup } from \"../components/common/RolePopup\";\n\nexport default function LandingPage() {\n    const navigate = useNavigate();\n    const showAlert = useAlert();\n    const [selectedRole, setSelectedRole] = useState(null);\n    const [selectedRecRole, setSelectedRecRole] = useState(null);\n    const [isPopupOpen, setIsPopupOpen] = useState(false);\n\n    useEffect(() => {\n        //check authentication\n        checkAndRedirectByRole(navigate);\n    }, [navigate]);\n\n    const handleRoleSelect = (role) => {\n        setSelectedRole(role);\n        if (role === 'hiring') {\n            setIsPopupOpen(true);\n        }\n    };\n\n    const handlePopupContinue = (hiringRole) => {\n        setIsPopupOpen(false);\n        if (hiringRole === 'organization') {\n            setSelectedRecRole('recruiter');\n            navigate('/recsignup', { state: { recRole: 'recruiter' } });\n        } else if (hiringRole === 'sme') {\n            setSelectedRecRole('smallbiz_owner');\n            navigate('/recsignup', { state: { recRole: 'smallbiz_owner' } });\n        }\n    };\n\n    const handleSubmit = () => {\n        if (!selectedRole) {\n            showAlert(\"Please select an option to continue\", \"error\");\n            return;\n        }\n\n        if (selectedRole === \"candidate\") {\n            navigate(\"/signup\");\n        }\n\n        if (selectedRole === \"hiring\") {\n            setIsPopupOpen(true);\n        }\n    };\n\n    return (\n        <>\n            <Navbar />\n            <RolePopup\n                isOpen={isPopupOpen}\n                onClose={() => setIsPopupOpen(false)}\n                onContinue={handlePopupContinue}\n            />\n            <div className=\"min-h-screen bg-white flex flex-col\">\n                <div className=\"w-full bg-gradient-to-r from-[#FF80B5] via-white to-[#9089FC] mb-8\">\n                    <div className=\"w-full px-4 py-6 sm:p-6 flex justify-center items-center bg-gray-50/90 backdrop-blur-2xl\">\n                        <h1 className=\"text-2xl sm:text-[32px] font-bold text-gray-900 tracking-tighter text-center\">Join as a talent or recruiter</h1>\n                    </div>\n                </div>\n                <div className=\"flex flex-col items-center justify-center gap-y-8 px-4\">\n                    <div className=\"w-full max-w-3xl flex flex-col sm:flex-row gap-6 justify-center items-center\">\n                        {[\n                            { value: \"hiring\", label: \"I’m hiring for a project\" },\n                            { value: \"candidate\", label: \"I’m looking for work\" }\n                        ].map(option => (\n                            <label key={option.value} className=\"relative w-full sm:flex-1 cursor-pointer\">\n                                <button\n                                    onClick={() => handleRoleSelect(option.value)}\n                                    className=\"w-full h-[120px] sm:h-[144px] flex items-center justify-center rounded-lg border-2 p-4 text-center shadow-sm hover:bg-gray-100 border-gray-300 bg-white\"\n                                >\n                                    <span className=\"font-bold text-gray-900 text-xl sm:text-2xl tracking-tighter\">\n                                        {option.label}\n                                    </span>\n                                    <span\n                                        className={`absolute top-2 right-2 w-6 h-6 ${selectedRole === option.value ? \"bg-blue-700\" : \"bg-white\"} border border-gray-400 rounded-full flex items-center justify-center`}\n                                    >\n                                        {selectedRole === option.value && <Check className=\"w-4 h-4 text-white\" strokeWidth={3} />}\n                                    </span>\n                                </button>\n                            </label>\n                        ))}\n                    </div>\n\n                    <button onClick={handleSubmit} type=\"submit\" disabled={!selectedRole} className=\"w-auto px-10 h-[48px] rounded-lg bg-blue-700 text-white font-semibold text-sm hover:bg-blue-600 shadow-sm disabled:bg-blue-300 disabled:cursor-not-allowed\">\n                        Continue\n                    </button>\n\n                    <p className=\"text-sm text-gray-600 text-center\">\n                        Already have an account?{\" \"}\n                        <Link to=\"/login\" className=\"text-blue-500 font-semibold hover:text-blue-600 transition-colors duration-200\">\n                            Login\n                        </Link>\n                    </p>\n                </div>\n            </div>\n        </>\n    );\n\n}\n","import { useNavigate } from \"react-router\";\n\nexport function Header() {\n    const navigate = useNavigate();\n    return (\n        <section className=\"flex flex-col md:flex-row justify-between items-start md:items-center gap-y-4\">\n            <div className=\"flex flex-col gap-y-2\">\n                <h1 className=\"text-gray-900 font-bold text-2xl\">Talent</h1>\n                <p className=\"w-full md:w-4/5 text-gray-600 font-normal text-sm\">Explore our community of local students ready to assist with AI, marketing, design, and more. Find the right person for your project and get the conversation started.</p>\n            </div>\n            <div className=\"flex-shrink-0 w-full md:w-auto\">\n                <button type=\"button\" onClick={() => navigate(\"/jobpost\")} className=\"px-4 h-10 w-full md:w-auto text-white font-semibold text-sm bg-blue-700 hover:bg-blue-500 rounded-lg\">\n                    Post an Opportunity\n                </button>\n            </div>\n        </section>\n    );\n}","import { useState, useEffect } from \"react\";\nimport { Search, AlignVerticalJustifyStart } from \"lucide-react\";\n\nexport function SearchBar({ onSearch }) {\n    const [query, setQuery] = useState(\"\");\n\n    useEffect(() => {\n        // Debounce the search input\n        const handler = setTimeout(() => {\n            // Only trigger search if query is not just empty spaces\n            if (query.trim() !== \"\" || query === \"\") {\n                onSearch(query);\n            }\n        }, 500); // 500ms delay\n\n        return () => clearTimeout(handler);\n    }, [query]);\n\n    const handleSearch = () => {\n        onSearch(query);\n    };\n\n    const handleKeyDown = (e) => {\n        if (e.key === 'Enter') {\n            handleSearch();\n        }\n    };\n\n    return (\n        <div className=\"mt-8 px-4 py-6 flex flex-col lg:flex-row items-center gap-4 rounded-lg shadow-md bg-gray-50\">\n            <div className=\"relative w-full lg:flex-1\">\n                <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 text-gray-400 w-5 h-5\" />\n                <input\n                    type=\"text\"\n                    className=\"w-full border-2 border-gray-300 pl-10 pr-32 py-2 rounded-lg text-sm font-normal text-gray-900 focus:outline-none focus:border-blue-500\"\n                    placeholder=\"Search for skills, role, or keywords...\"\n                    value={query}\n                    onChange={(e) => setQuery(e.target.value)}\n                    onKeyDown={handleKeyDown}\n                />\n                <button\n                    onClick={handleSearch}\n                    className=\"border-l absolute right-2 top-1/2 -translate-y-1/2 text-gray-500 hover:text-gray-700 px-3 py-2 font-semibold hover:cursor-pointer transition\"\n                >\n                    <Search className=\"w-4 h-4\" />\n                </button>\n            </div>\n        </div>\n    );\n}","import { useEffect, useState } from 'react';\nimport axios from \"axios\"\nimport Cookies from \"js-cookie\"\nimport { useAlert } from \"../../../../../constants/AlertProvider\"\nimport { SkeletonLoader } from '../../../../common/SkeletonLoader';\nimport { SearchBar } from './SearchBar';\nimport { MapPin, UserIcon, MessageCircleMore } from 'lucide-react';\nimport { Pagination } from '@mui/material';\n\nexport function TalentList() {\n    const [candidates, setCandidates] = useState([]);\n    const [totalCandidates, setTotalCandidates] = useState(0);\n    const [currentPage, setCurrentPage] = useState(1);\n    const [totalPages, setTotalPages] = useState(1);\n    const candidatesPerPage = 10;\n    const [loading, setLoading] = useState(true);\n    const [searchQuery, setSearchQuery] = useState(\"\");\n    const showAlert = useAlert();\n\n    const getInitials = (name) => {\n        if (!name) return \"\";\n        const nameParts = name.split(' ').filter(Boolean);\n        if (nameParts.length === 0) return \"\";\n        const firstInitial = nameParts[0][0].toUpperCase();\n        const lastInitial = nameParts.length > 1 ? nameParts[nameParts.length - 1][0].toUpperCase() : '';\n        return lastInitial ? `${firstInitial}.${lastInitial}` : firstInitial;\n    };\n\n    const handleSearch = (query) => {\n        // When a new search is performed, reset to the first page\n        if (query !== searchQuery) {\n            setCurrentPage(1);\n        }\n        setSearchQuery(query);\n    };\n\n    // Normalize data from search results to match the component's expected structure\n    const normalizeSearchResults = (results) => {\n        return results.map(result => ({\n            id: result.id,\n            name: result.name,\n            profile_picture: result.profile_picture,\n            address_details: {\n                formatted_address: result.address?.formatted_address || \"Location not set\"\n            },\n            application: {\n                // The search result has skills directly, let's adapt it\n                skills: (result.skills || []).map(skill => ({\n                    id: skill.name, // Use name as key since search result has no skill ID\n                    name: skill.name\n                }))\n            }\n        }));\n    };\n\n    useEffect(() => {\n        const fetchTalent = async () => {\n            setLoading(true);\n            const offset = (currentPage - 1) * candidatesPerPage;\n            try {\n                const csrftoken = Cookies.get(\"csrftoken\");\n\n                if (searchQuery) {\n                    // --- SEARCH LOGIC ---\n                    const searchResponse = await axios.get(\"/api/search/candidates/\", {\n                        params: { q: searchQuery, limit: candidatesPerPage, offset },\n                        headers: { \"X-CSRFToken\": csrftoken }\n                    });\n                    const normalizedResults = normalizeSearchResults(searchResponse.data.results);\n                    console.log(\"Search API Res: \", normalizedResults);\n                    setCandidates(normalizedResults);\n                    setTotalCandidates(searchResponse.data.total_count);\n                    setTotalPages(Math.ceil(searchResponse.data.total_count / candidatesPerPage));\n                } else {\n                    // --- DEFAULT FETCH LOGIC ---\n                    const usersResponse = await axios.get(\"/api/users/\", {\n                        params: { role: \"candidate\", is_looking_for_job: true, limit: candidatesPerPage, offset },\n                        headers: {\n                            \"X-CSRFToken\": csrftoken,\n                            \"Content-Type\": \"application/json\"\n                        }\n                    });\n                    setTotalCandidates(usersResponse.data.count);\n                    setTotalPages(Math.ceil(usersResponse.data.count / candidatesPerPage));\n\n                    const candidatesData = usersResponse.data.results;\n\n                    const candidatesWithDetails = await Promise.all(\n                        candidatesData.map(async (candidate) => {\n                            let fullCandidateData = { ...candidate, application: { skills: [] }, address_details: null };\n                            try {\n                                // Step 1: Fetch candidate profile for address, name, applicationids etc.\n                                const profileResponse = await axios.get(`/api/candidate-profile/${candidate.id}/`, {\n                                    headers: { \"X-CSRFToken\": csrftoken }\n                                });\n                                fullCandidateData = { ...fullCandidateData, ...profileResponse.data };\n\n                                // Step 2: Use application ID to fetch skills\n                                if (profileResponse.data.applicationids && profileResponse.data.applicationids.length > 0) {\n                                    const appId = profileResponse.data.applicationids[0].id;\n                                    const appResponse = await axios.get(`/api/application/${appId}/`, {\n                                        headers: { \"X-CSRFToken\": csrftoken }\n                                    });\n                                    // Merge skills into the candidate data\n                                    fullCandidateData.application = appResponse.data;\n                                }\n\n                                return fullCandidateData;\n                            } catch (error) {\n                                console.error(`Error fetching full profile for candidate ${candidate.id}:`, error);\n                                return fullCandidateData; // Return data with fallbacks\n                            }\n                        })\n                    );\n                    setCandidates(candidatesWithDetails);\n                }\n\n            } catch (error) {\n                showAlert(\"Error fetching candidates\", \"error\");\n                console.error(\"Error fetching candidates:\", error);\n            } finally {\n                setLoading(false);\n            }\n        };\n\n        fetchTalent();\n    }, [showAlert, searchQuery, currentPage]);\n\n    const handlePageChange = (event, value) => {\n        setCurrentPage(value);\n    };\n\n    return (\n        <section className=\"mt-8 flex flex-col gap-x-6\">\n            <SearchBar onSearch={handleSearch} />\n            <div className=\"mt-4 flex flex-col sm:flex-row justify-between items-start sm:items-center gap-y-4\">\n                <p className=\"text-sm font-normal text-gray-900\">{totalCandidates} Profiles found</p>\n                {/* <div className=\"flex flex-row gap-x-2 items-center\">\n                    <label htmlFor=\"sortby\" className=\"text-sm font-normal text-gray-900\">Sort by:</label>\n                    <select id=\"sortby\" defaultValue=\"relevance\" className=\"p-2 border-2 border-gray-300 rounded-md text-sm font-semibold text-gray-900 focus:outline-none focus:border-blue-500 bg-white\">\n                        <option value=\"relevance\">Relevance</option>\n                        <option value=\"experience\">Experience</option>\n                        <option value=\"match\">Match Score</option>\n                    </select>\n                </div> */}\n            </div>\n\n            <div className=\"mt-4 grid grid-cols-1 md:grid-cols-2 gap-6\">\n                {loading ? (\n                    Array.from({ length: 4 }).map((_, index) => (\n                        <div key={index} className=\"rounded-lg shadow-sm bg-white p-6\">\n                            <SkeletonLoader className=\"h-40\" />\n                        </div>\n                    ))\n                ) : (candidates.map((candidate) => (\n                    <div key={candidate.id} className=\"rounded-lg shadow-sm bg-white flex flex-col\">\n                        <div className='p-6 flex flex-col sm:flex-row items-center sm:items-start gap-4'>\n                            <div className=\"flex flex-col items-center sm:items-start flex-grow\">\n                                <h3 className=\"text-gray-900 font-medium text-lg mb-1 text-center sm:text-left\">{getInitials(candidate.name)}</h3>\n                                <div className=\"flex flex-wrap gap-2 mb-4 justify-center sm:justify-start\">\n                                    {candidate.application && candidate.application.skills && candidate.application.skills.length > 0 ? (\n                                        candidate.application.skills.slice(0, 5).map((skill) => (\n                                            <span\n                                                key={skill.id}\n                                                className=\"bg-blue-100 text-blue-700 text-xs font-medium px-2 py-0.5 rounded-lg\"\n                                            >\n                                                {skill.name}\n                                            </span>\n                                        ))\n                                    ) : (\n                                        <span className=\"text-gray-500 text-xs font-medium\">N/A</span>\n                                    )}\n                                </div>\n                                <div className='flex gap-x-2'>\n                                    <div className=\"text-gray-500 text-sm flex items-center mb-4\">\n                                        <MapPin className=\"h-4 w-4 mr-1\" />\n                                        <span>{candidate.address_details?.formatted_address || \"Location not set\"}</span>\n                                    </div>\n                                    <p className=\"text-gray-500 text-sm\">•</p>\n                                    <div className=\"text-gray-500 text-sm flex items-center mb-4\">\n                                        <span>{candidate.application.description || \"NA\"}</span>\n                                    </div>\n                                </div>\n                            </div>\n                            <div className=\"flex-shrink-0\">\n                                {candidate.profile_picture ? (\n                                    <img\n                                        src={candidate.profile_picture}\n                                        alt={candidate.name}\n                                        className=\"size-14 rounded-full\"\n                                    />\n                                ) : (\n                                    <div className=\"size-14 rounded-full bg-blue-100 flex items-center justify-center text-blue-700 font-bold text-lg\">\n                                        <UserIcon />\n                                    </div>\n                                )}\n                            </div>\n                        </div>\n                        <div className=\"w-full border-t border-gray-200 grid grid-cols-2\">\n                            <a\n                                href={`/candidate/${candidate.id}`}\n                                target=\"_blank\"\n                                rel=\"noopener noreferrer\"\n                                className=\"p-4 border-r border-gray-200 bg-white hover:bg-gray-50 text-sm font-semibold text-gray-900 cursor-pointer transition rounded-bl-lg text-center\"\n                            >\n                                View Profile\n                            </a>\n                            <button\n                                className=\"p-4 bg-white hover:bg-gray-50 text-sm font-semibold text-blue-700 flex flex-row gap-x-2 items-center justify-center cursor-pointer transition rounded-br-lg\"\n                            >\n                                <MessageCircleMore className='w-5 h-5' />\n                                <span>Message</span>\n                            </button>\n                        </div>\n                    </div>\n                )))}\n            </div>\n            <div className=\"mt-8 flex justify-center\">\n                <Pagination\n                    count={totalPages}\n                    page={currentPage}\n                    onChange={handlePageChange}\n                    color=\"primary\"\n                    showFirstButton\n                    showLastButton\n                />\n            </div>\n        </section>\n    );\n}","import RecHomeNavbar from \"../../RecHomeNavbar\";\nimport { Header } from \"./components/Header\";\nimport { SearchBar } from \"./components/SearchBar\";\nimport { TalentList } from \"./components/TalentList\";\n\nexport default function RecHome() {\n    return (\n        <>\n            <RecHomeNavbar />\n            <div className=\"min-h-screen bg-gray-50 mt-14 flex flex-col px-8 py-10\">\n            <Header />\n            {/* <SearchBar /> */}\n            <TalentList />\n            </div>\n        </>\n    );\n}","import axios from \"axios\";\nimport Cookies from \"js-cookie\";\nimport RecHome from \"../components/recruiter/org_home/rec_home/RecHome\";\nimport SbHome from \"../components/recruiter/org_home/smallbiz_home/SbHome\";\nimport { useEffect, useState } from \"react\";\n\nexport default function OrgProfile() {\n    const [role, setRole] = useState(null);\n    const [loading, setLoading] = useState(true);\n\n    useEffect(() => {\n        const fetchRole = async () => {\n            try {\n                const userId = Cookies.get(\"id\");\n                const userResponse = await axios.get(`/api/users/${userId}/`, { withCredentials: true });\n\n                if (userResponse.data?.role) {\n                    setRole(userResponse.data.role);\n                }\n\n            } catch (error) {\n                console.error(\"Error fetching role\", error);\n            } finally {\n                setLoading(false);\n            }\n        };\n        fetchRole();\n    }, []);\n\n    if (loading) {\n        return (\n            <div className=\"flex items-center justify-center h-screen w-screen\">\n                <div className=\"flex flex-col items-center space-y-2\">\n                    <div className=\"loader\"></div>\n                </div>\n            </div>\n        );\n    }\n\n    return (\n        <RecHome />\n    );\n}","import axios from \"axios\";\nimport Cookies from \"js-cookie\";\nimport { useEffect, useState } from \"react\";\nimport { useNavigate } from \"react-router\";\nimport ProfilePic from \"../../../assets/images/blank-profile-pic.png\";\nimport { useAlert } from \"../../constants/AlertProvider\";\nimport Navbar from \"../../constants/Navbar\";\nimport ImageModal from \"../common/ImageModal\";\nimport Select from \"../common/Select\";\nimport { getUserDetails } from \"../../utils/getUserDetails\"\n\nexport default function RecProfile() {\n    const companySizeOptions = [\n        { value: \"sole\", label: \"Just myself (Sole Proprietor)\" },\n        { value: \"2_5\", label: \"2-5\" },\n        { value: \"16_30\", label: \"16-30\" },\n        { value: \"31_50\", label: \"31-50\" },\n        { value: \"50_plus\", label: \"More than 50\" },\n    ];\n    const industryOptions = [\n        { value: \"retail\", label: \"Retail\" },\n        { value: \"food_beverage\", label: \"Food & Beverage\" },\n        { value: \"professional_services\", label: \"Professional Services\" },\n        { value: \"healthcare\", label: \"Healthcare / Wellness\" },\n        { value: \"trades\", label: \"Trades / Services\" },\n        { value: \"ecommerce\", label: \"E - commerce / Online Business\" },\n        { value: \"creative\", label: \"Creative / Design\" },\n        { value: \"nonprofit\", label: \"Non - profit\" },\n        { value: \"other\", label: \"Other\" },\n    ];\n    const titleOptions = [\n        { value: \"owner\", label: \"Owner / Founder\" },\n        { value: \"ceo\", label: \"CEO / President\" },\n        { value: \"gm\", label: \"General Manager\" },\n        { value: \"marketing\", label: \"Marketing Manager\" },\n        { value: \"operations\", label: \"Operations Manager\" },\n        { value: \"hr\", label: \"HR Manager\" },\n        { value: \"finance\", label: \"Finance Manager\" },\n        { value: \"sales\", label: \"Sales Manager\" },\n        { value: \"it\", label: \"IT Manager\" },\n        { value: \"customer_service\", label: \"Customer Service Manager\" },\n        { value: \"consultant\", label: \"Consultant\" },\n        { value: \"recruiter\", label: \"Recruiter\" },\n        { value: \"other\", label: \"Other\" },\n    ];\n\n    // const [showUserImageModal, setShowUserImageModal] = useState(false);\n    const [showCompanyLogoModal, setShowCompanyLogoModal] = useState(false);\n    const [userData, setUserData] = useState({\n        name: \"\",\n        email: \"\",\n        business_role: \"\",\n    })\n    const [companyData, setCompanyData] = useState({\n        name: \"\",\n        address: \"\",\n        description: \"\",\n        website: \"\",\n        logo: null,\n        // contact_email: \"\",\n        // phone_number: \"\",\n        // is_small_business: false,\n        // is_nonprofit: false,\n        industry: \"\",\n        employee_count: \"\",\n        culture: \"\",\n        // hiring_goals: \"\",\n        // roles_hiring_for: \"\",\n        // positions_to_hire: null\n    })\n    const [isSubmitting, setIsSubmitting] = useState(false);\n    const [logoToUpload, setLogoToUpload] = useState(null);\n    const navigate = useNavigate();\n    const showAlert = useAlert();\n\n    useEffect(() => {\n        const fetchData = async () => {\n            try {\n                const userDetails = await getUserDetails();\n                const userId = userDetails?.id;\n                const userRes = await axios.get(`/api/users/${userId}/`, { withCredentials: true });\n                setUserData(userRes.data);\n                const companyId = userRes.data.company;\n                if (companyId) {\n                    const companyRes = await axios.get(`/api/company/${companyId}/`, { withCredentials: true });\n                    setCompanyData(companyRes.data);\n                }\n            } catch (error) {\n                showAlert(\"Something went wrong!\", \"error\");\n                console.error(\"error\", error);\n            }\n        };\n        fetchData();\n    }, [])\n\n    const handleSave = async (e) => {\n        e.preventDefault();\n        setIsSubmitting(true);\n        try {\n            const userDetails = await getUserDetails();\n            const userId = userDetails?.id;\n            let companyId = userData.company;\n\n            // Prepare company data for submission\n            const companyFormData = new FormData();\n            Object.keys(companyData).forEach(key => {\n                // Don't append the logo URL from the server or null/undefined values\n                if (key !== 'logo' && companyData[key] !== null && companyData[key] !== undefined && companyData[key] !== '') {\n                    companyFormData.append(key, companyData[key]);\n                }\n            });\n            if (logoToUpload) {\n                companyFormData.append('logo', logoToUpload);\n            }\n\n            const userPatchData = { ...userData };\n\n            // If user has no company, create one\n            if (!companyId) {\n                const companyRes = await axios.post(\"/api/company/\", companyFormData, {\n                    headers: {\n                        'X-CSRFToken': Cookies.get('csrftoken'),\n                    },\n                    withCredentials: true,\n                });\n                companyId = companyRes.data.id;\n                userPatchData.company = companyId;\n            } else {\n                // PATCH company profile\n                await axios.patch(`/api/company/${companyId}/`, companyFormData, {\n                    headers: {\n                        'X-CSRFToken': Cookies.get('csrftoken'),\n                    },\n                    withCredentials: true,\n                });\n            }\n\n            // Patch the user with the consolidated data (including the new company ID if applicable)\n            await axios.patch(`/api/users/${userId}/`, userPatchData, {\n                headers: {\n                    'Content-Type': 'application/json',\n                    'X-CSRFToken': Cookies.get('csrftoken'),\n                },\n                withCredentials: true,\n            });\n\n            showAlert(\"Profile saved!\", \"success\");\n            navigate(\"/recpreferences\");\n        } catch (error) {\n            showAlert(\"Error saving profile\", \"error\");\n            console.error(error);\n        } finally {\n            setIsSubmitting(false);\n        }\n    }\n\n    const handleChange = (e) => {\n        const { name, value } = e.target;\n        setCompanyData((prev) => ({ ...prev, [name]: value }));\n    };\n    const handleProfileChange = (e) => {\n        const { name, value } = e.target;\n        setUserData((prev) => ({ ...prev, [name]: value }));\n    };\n\n    const handleCompanyLogoCropped = (file) => {\n        setLogoToUpload(file);\n        setShowCompanyLogoModal(false);\n    };\n\n    return (\n        <div className=\"min-h-screen bg-white\">\n            {/* Navbar */}\n            <Navbar />\n\n            {/* Main Container */}\n            <form className=\"flex flex-col px-4 sm:px-6 lg:px-8 py-10\" onSubmit={handleSave}>\n                <main className=\"w-full max-w-7xl mx-auto bg-white\">\n                    {/* Heading */}\n                    <h1 className=\"text-2xl md:text-3xl font-bold text-gray-900 mb-10 text-center lg:text-left\">\n                        Let&apos;s begin by setting up your hiring profile!\n                    </h1>\n                    <div className=\"flex flex-col gap-y-12\">\n                        <div className=\"grid grid-cols-1 lg:grid-cols-3 gap-x-8 gap-y-6\">\n                            <div className=\"lg:col-span-1 flex flex-col gap-y-2\">\n                                <h3 className=\"text-base text-gray-900 font-semibold\">Company Profile</h3>\n                                <p className=\"text-sm text-gray-600 font-normal\">Tell us about your organization</p>\n                            </div>\n                            <div className=\"lg:col-span-2 flex flex-col\">\n                                <div className=\"w-full md:w-3/5 flex flex-col gap-y-2 mb-8\">\n                                    <label htmlFor=\"company-name\" className=\"text-sm text-gray-900 font-medium\">Company Name</label><input id=\"company-name\" name=\"name\" value={companyData.name} onChange={handleChange} type=\"text\" className=\"border border-gray-300 p-2 rounded-lg text-sm text-gray-900 font-medium focus:outline-none focus:border-blue-500\" />\n                                </div>\n                                <div className=\"w-full md:w-3/5 flex flex-col gap-y-2 mb-8\">\n                                    <label htmlFor=\"Company-website\" className=\"text-sm text-gray-900 font-medium\">Company Website</label>\n                                    <input id=\"Company-website\" name=\"website\" value={companyData.website} onChange={handleChange} type=\"url\" placeholder=\"http://company.com/\" className=\"border border-gray-300 p-2 rounded-lg text-sm text-gray-900 font-medium focus:outline-none focus:border-blue-500\" />\n                                </div>\n\n                                {/* comapny-size, industry/markets */}\n                                <div className=\"w-full md:w-4/5 grid grid-cols-1 sm:grid-cols-2 gap-x-6 mb-8\">\n                                    <div className=\"flex flex-col gap-y-2\">\n                                        <Select\n                                            label=\"Company Size\"\n                                            name=\"employee_count\"\n                                            value={companyData.employee_count}\n                                            options={companySizeOptions}\n                                            onChange={handleChange}\n                                            placeholder=\"Select company size\"\n                                        />\n                                    </div>\n                                    <div className=\"flex flex-col gap-y-2\">\n                                        <Select\n                                            label=\"Industry\"\n                                            name=\"industry\"\n                                            value={companyData.industry}\n                                            options={industryOptions}\n                                            onChange={handleChange}\n                                            placeholder=\"Select industry\"\n                                        />\n                                    </div>\n                                </div>\n\n                                {/* description */}\n                                <div className=\"w-full md:w-4/5 flex flex-col gap-y-2 mb-8\">\n                                    <label htmlFor=\"description\" className=\"text-sm text-gray-900 font-medium\">Description</label>\n                                    <textarea id=\"description\" name=\"description\" value={companyData.description} onChange={handleChange} rows={2} cols={4} className=\"border border-gray-300 p-2 rounded-lg text-sm text-gray-900 font-medium focus:outline-none focus:border-blue-500 resize-none\" />\n                                    <p className=\"text-gray-600 font-normal text-sm\">Write about your company</p>\n                                </div>\n                                {/* address */}\n                                <div className=\"w-full md:w-4/5 flex flex-col gap-y-2 mb-8\">\n                                    <label htmlFor=\"address\" className=\"text-sm text-gray-900 font-medium\">Address</label>\n                                    <input id=\"address\" name=\"address\" value={companyData.address} onChange={handleChange} className=\"border border-gray-300 p-2 rounded-lg text-sm text-gray-900 font-medium focus:outline-none focus:border-blue-500 resize-none\" />\n                                </div>\n                                {/* culture */}\n                                <div className=\"w-full md:w-4/5 flex flex-col gap-y-2 mb-8\">\n                                    <label htmlFor=\"culture\" className=\"text-sm text-gray-900 font-medium\">Company Culture</label>\n                                    <textarea id=\"culture\" name=\"culture\" value={companyData.culture} onChange={handleChange} rows={2} cols={4} className=\"border border-gray-300 p-2 rounded-lg text-sm text-gray-900 font-medium focus:outline-none focus:border-blue-500 resize-none\" />\n                                </div>\n\n                                {/* profile-photo */}\n                                <div className=\"flex flex-col gap-y-2 mb-8\">\n                                    <p className=\"text-sm font-medium text-gray-900\">Photo</p>\n                                    <div className=\"flex flex-row gap-x-4 items-center mb-8\">\n                                        <div className=\"w-12 h-12 rounded-full flex items-center justify-center shadow-md overflow-hidden\">\n                                            <img src={logoToUpload ? URL.createObjectURL(logoToUpload) : companyData.logo || ProfilePic} alt=\"Company Logo\" className=\"w-full h-full object-cover\" />\n                                        </div>\n                                        <button className=\"w-18 h-8 border-2 border-gray-300 rounded-lg hover:bg-gray-100 text-[14px] font-semibold\"\n                                            type=\"button\"\n                                            onClick={() => setShowCompanyLogoModal(true)}\n                                        >\n                                            Change\n                                        </button>\n                                    </div>\n                                    {showCompanyLogoModal && (\n                                        <ImageModal\n                                            closeModal={() => setShowCompanyLogoModal(false)}\n                                            onImageCropped={handleCompanyLogoCropped}\n                                        />\n                                    )}\n                                </div>\n                            </div>\n                        </div>\n                        <div className=\"grid grid-cols-1 lg:grid-cols-3 gap-x-8 gap-y-6\">\n                            <div className=\"lg:col-span-1 flex flex-col gap-y-2\">\n                                <h3 className=\"text-base text-gray-900 font-semibold\">Your Profile</h3>\n                                <p className=\"text-sm text-gray-600 font-normal\">A little about you</p>\n                            </div>\n                            <div className=\"lg:col-span-2 flex flex-col\">\n                                <div className=\"w-full md:w-3/5 flex flex-col gap-y-2 mb-8\">\n                                    <label htmlFor=\"full-name\" className=\"text-sm text-gray-900 font-medium\">Full Name</label>\n                                    <input id=\"full-name\" name=\"name\" value={userData.name || ''} onChange={handleProfileChange} type=\"text\" className=\"border border-gray-300 p-2 rounded-lg text-sm text-gray-900 font-medium focus:outline-none focus:border-blue-500\" />\n                                </div>\n                                {/* email */}\n                                <div className=\"w-full md:w-3/5 flex flex-col gap-y-2 mb-8\">\n                                    <label htmlFor=\"email\" className=\"text-sm text-gray-900 font-medium\">Email</label>\n                                    <input id=\"email\" name=\"email\" value={userData.email} onChange={handleProfileChange} type=\"email\" className=\"border border-gray-300 p-2 rounded-lg text-sm text-gray-900 font-medium focus:outline-none focus:border-blue-500 bg-gray-100 cursor-not-allowed\" disabled />\n                                </div>\n                                {/* role */}\n                                <div className=\"w-full md:w-3/5 flex flex-col gap-y-2 mb-8\">\n                                    <Select\n                                        label=\"Title / Role\"\n                                        name=\"business_role\"\n                                        value={userData.business_role}\n                                        options={titleOptions}\n                                        onChange={handleProfileChange}\n                                        placeholder=\"Select Title / Role\"\n                                    />\n                                </div>\n                                {/* <div className=\"w-full md:w-3/5 flex flex-col gap-y-2 mb-8\">\n                                    <label htmlFor=\"profile\" className=\"text-sm text-gray-900 font-medium\">Profile</label>\n                                    <input id=\"profile\" name=\"profileUrl\" value={userData.profileUrl} onChange={handleProfileChange} type=\"url\" placeholder=\"https://linkedin.com/in/...\" className=\"border border-gray-300 p-2 rounded-lg text-sm text-gray-900 font-medium focus:outline-none focus:border-blue-500\" />\n                                </div> */}\n                                {/* profile-photo\n                                <div className=\"flex flex-col gap-y-2 mb-8\">\n                                    <p className=\"text-sm font-medium text-gray-900\">Your Photo</p>\n                                    <div className=\"flex flex-row gap-x-4 items-center mb-8\">\n                                        <div className=\"w-12 h-12 rounded-full flex items-center justify-center shadow-md overflow-hidden\">\n                                            <img src={userDataPic || ProfilePic} alt=\"User Profile\" className=\"w-full h-full object-cover\" />\n                                        </div>\n                                        <button className=\"w-18 h-8 border-2 border-gray-300 rounded-lg hover:bg-gray-100 text-[14px] font-semibold\"\n                                            type=\"button\"\n                                            onClick={() => setShowUserImageModal(true)}\n                                        >\n                                            Change\n                                        </button>\n                                    </div>\n                                    {showUserImageModal && (\n                                        <ImageModal\n                                            closeModal={() => setShowUserImageModal(false)}\n                                            onImageCropped={handleUserImageCropped}\n                                        />\n                                    )}\n                                </div> */}\n                            </div>\n                        </div>\n                    </div>\n                </main>\n                <div className=\"w-full flex justify-end p-6\">\n                    <button type=\"submit\" disabled={isSubmitting} className=\"text-white h-10 text-center font-medium text-sm bg-blue-700 px-4 rounded-lg cursor-pointer hover:bg-blue-600 disabled:bg-blue-400\">\n                        {isSubmitting ? \"Saving...\" : \"Next, Add Preferences\"}\n                    </button>\n                </div>\n            </form>\n        </div>\n    );\n}","import axios from \"axios\";\nimport Cookies from \"js-cookie\";\nimport RecProfile from \"../components/recruiter/RecProfile\";\nimport SmallBizProfile from \"../components/recruiter/small_biz/SmallBizProfile\";\nimport { getUserDetails } from \"../utils/getUserDetails\";\nimport { useEffect, useState } from \"react\";\n\nexport default function OrgProfile() {\n    const [role, setRole] = useState(null);\n    const [loading, setLoading] = useState(true);\n\n    useEffect(() => {\n        const fetchRole = async () => {\n            try {\n                const userDetails = await getUserDetails();\n                const userId = userDetails?.id;\n\n                if (userDetails?.role) {\n                    setRole(userDetails?.role);\n                }\n\n            } catch (error) {\n                console.error(\"Error fetching role\", error);\n            } finally {\n                setLoading(false);\n            }\n        };\n        fetchRole();\n    }, []);\n\n    if (loading) {\n        return (\n            <div className=\"flex items-center justify-center h-screen w-screen\">\n                <div className=\"flex flex-col items-center space-y-2\">\n                    <div className=\"loader\"></div>\n                </div>\n            </div>\n        );\n    }\n\n    return (\n        <RecProfile />\n    )\n}","import Contact from \"../components/candidate/Contact\";\nimport HomeNavbar from \"../components/candidate/HomeNavbar\";\n\nexport default function Profile() {\n  return (\n    <>\n      <HomeNavbar />\n      <Contact />\n    </>\n  );\n}\n","import axios from \"axios\";\nimport PropTypes from \"prop-types\";\nimport { useState, useEffect } from \"react\";\nimport Cookies from \"js-cookie\";\nimport { useNavigate } from \"react-router-dom\";\nimport { useAlert } from \"../constants/AlertProvider\";\n\nexport default function ProtectedRoutes({ children, allowedRoles }) {\n  const [isAuthorized, setIsAuthorized] = useState(null);\n  const [userRole, setUserRole] = useState(null);\n  const navigate = useNavigate();\n  const showAlert = useAlert();\n\n  useEffect(() => {\n    const checkAuthorization = async () => {\n      try {\n        const response = await axios.get(\"/api/session/\", { withCredentials: true });\n        if (response.data.isAuthenticated) {\n          const userId = Cookies.get(\"id\");\n          if (userId) {\n            const userResponse = await axios.get(`/api/users/${userId}/`, { withCredentials: true });\n            const role = userResponse.data.role;\n            setUserRole(role);\n\n            if (allowedRoles.includes(role)) {\n              setIsAuthorized(true);\n            } else {\n              // Role conflict detected. Log out the user.\n              setIsAuthorized(false);\n              showAlert(\"Session conflict detected. Please log in with the correct account.\", \"error\");\n              await axios.post(\"/api/logout/\", {}, { withCredentials: true });\n              navigate(\"/login\", { replace: true, state: { from: 'session-conflict' } });\n            }\n          } else {\n            setIsAuthorized(false);\n            showAlert(\"Your session has expired. Please log in again.\", \"error\");\n            navigate(\"/login\", { replace: true });\n          }\n        } else {\n          setIsAuthorized(false);\n          // No active session, just redirect.\n          navigate(\"/login\", { replace: true });\n        }\n      } catch (error) {\n        console.error(\"Authorization check failed:\", error);\n        setIsAuthorized(false);\n        showAlert(\"An error occurred during authentication. Please log in again.\", \"error\");\n        navigate(\"/login\", { replace: true });\n      }\n    };\n\n    checkAuthorization();\n  }, [allowedRoles, navigate]);\n\n  if (isAuthorized === null) {\n    return (\n      <div className=\"flex items-center justify-center h-screen w-screen\">\n        <div className=\"flex flex-col items-center space-y-2\">\n          <div className=\"loader\"></div>\n        </div>\n      </div>\n    );\n  }\n\n  return isAuthorized ? children : <div className=\"flex flex-col items-center justify-center h-screen\">\n    <p className=\"text-4xl text-gray-400\">Oops!</p>\n    <p className=\"text-2xl text-gray-400\">Something went wrong.</p>\n  </div>;\n}\n\nProtectedRoutes.propTypes = {\n  children: PropTypes.node.isRequired,\n  allowedRoles: PropTypes.arrayOf(PropTypes.string).isRequired,\n};","// SetProfileGuard.tsx\nimport { Navigate, useLocation } from \"react-router-dom\";\n\nconst SetProfileGuard = ({ children }) => {\n    const location = useLocation();\n\n    // If the user came from login/signup OR clicked edit profile, allow\n    const allowedFrom = [\"login\", \"signup\", \"edit\"]; // whitelist\n    const from = location.state?.from;\n\n    if (allowedFrom.includes(from)) {\n        return <>{children}</>;\n    }\n\n    // Otherwise block direct access\n    return <Navigate to=\"/profile\" replace />;\n};\n\nexport default SetProfileGuard;\n","import * as Sentry from \"@sentry/react\";\nimport { parse } from \"cookie\";\nimport { Route, BrowserRouter as Router, Routes } from \"react-router-dom\";\n\nimport { OpenAPI } from \"./api\";\nimport Jobs from \"./components/candidate/all_matches/Jobs\";\nimport EditProfile from \"./components/candidate/edit_profile/EditProfile\";\nimport OnboardingLinks from \"./components/candidate/onboarding/OnboardingLinks\";\nimport OnboardingPreferences from \"./components/candidate/onboarding/OnboardingPreferences\";\nimport OnboardingProfile from \"./components/candidate/onboarding/OnboardingProfile\";\nimport OnboardingSkills from \"./components/candidate/onboarding/OnboardingSkills\";\nimport Volunteer from \"./components/candidate/Volunteer\";\nimport YourMatches from \"./components/candidate/your_matches/YourMatches\";\n// import AddCompany from \"./components/recruiter/AddCompany\";\nimport CandidateMatches from \"./components/recruiter/CandidateMatches\";\nimport JobPost from \"./components/recruiter/JobPost\";\nimport MyJobs from \"./components/recruiter/my_jobs/MyJobs\";\nimport RecPreferences from \"./components/recruiter/RecPreferences\";\n// import RecHome from \"./components/recruiter/org_home/rec_home/RecHome\";\nimport Login from \"./constants/Login\";\nimport RecSignup from \"./constants/RecSignup\";\nimport SbSignup from \"./constants/SbSignup\";\nimport Signup from \"./constants/Signup\";\nimport CandidateProfile from \"./pages/CandidateProfile\";\nimport Home from \"./pages/Home\";\nimport JobShare from \"./pages/JobShare\";\nimport LandingPage from \"./pages/LandingPage\";\nimport OrgHome from \"./pages/OrgHome\";\nimport OrgProfile from \"./pages/OrgProfile\";\nimport Profile from \"./pages/Profile\";\nimport ProtectedRoutes from \"./routes/ProtectedRoutes\";\nimport SetProfileGuard from \"./routes/SetProfileGuard\";\n\nOpenAPI.interceptors.request.use((request) => {\n  const { csrftoken } = parse(document.cookie);\n  if (request.headers && csrftoken) {\n    request.headers[\"X-CSRFTOKEN\"] = csrftoken;\n  }\n  return request;\n});\n\nconst App = () => {\n  return (\n    <Sentry.ErrorBoundary\n      fallback={\n        <div className=\"flex flex-col items-center justify-center h-screen\">\n          <p className=\"text-4xl text-gray-400\">Oops!</p>\n          <p className=\"text-2xl text-gray-400\">Something went wrong.</p>\n        </div>\n      }\n    >\n      <Router>\n        <Routes>\n          {/* Public Routes */}\n          <Route element={<LandingPage />} path=\"/landingpage\" />\n          <Route element={<Signup />} path=\"/signup\" />\n          <Route element={<RecSignup />} path=\"/recsignup\" />\n          <Route element={<SbSignup />} path=\"/sbsignup\" />\n          <Route element={<Login />} path=\"/login\" />\n          <Route element={<JobShare />} path=\"/job/:slug/:id\" />\n\n          {/* Candidate Routes */}\n          <Route\n            element={\n              <ProtectedRoutes allowedRoles={[\"candidate\"]}>\n                <OnboardingSkills />\n              </ProtectedRoutes>\n            }\n            path=\"/setskills\"\n          />\n          <Route\n            element={\n              <ProtectedRoutes allowedRoles={[\"candidate\"]}>\n                <OnboardingLinks />\n              </ProtectedRoutes>\n            }\n            path=\"/setworklinks\"\n          />\n          <Route\n            element={\n              <ProtectedRoutes allowedRoles={[\"candidate\"]}>\n                <SetProfileGuard>\n                  <OnboardingProfile />\n                </SetProfileGuard>\n              </ProtectedRoutes>\n            }\n            path=\"/setprofile\"\n          />\n          <Route\n            element={\n              <ProtectedRoutes allowedRoles={[\"candidate\"]}>\n                <OnboardingPreferences />\n              </ProtectedRoutes>\n            }\n            path=\"/setpreferences\"\n          />\n          <Route\n            element={\n              <ProtectedRoutes allowedRoles={[\"candidate\"]}>\n                <Home />\n              </ProtectedRoutes>\n            }\n            path=\"/home\"\n          />\n          <Route\n            element={\n              <ProtectedRoutes allowedRoles={[\"candidate\"]}>\n                <Profile />\n              </ProtectedRoutes>\n            }\n            path=\"/profile\"\n          />\n          <Route\n            element={\n              <ProtectedRoutes allowedRoles={[\"candidate\"]}>\n                <Volunteer />\n              </ProtectedRoutes>\n            }\n            path=\"/volunteer\"\n          />\n          <Route\n            element={\n              <ProtectedRoutes allowedRoles={[\"candidate\"]}>\n                <EditProfile />\n              </ProtectedRoutes>\n            }\n            path=\"/editprofile\"\n          />\n          <Route\n            element={\n              <ProtectedRoutes allowedRoles={[\"candidate\"]}>\n                <Jobs />\n              </ProtectedRoutes>\n            }\n            path=\"/jobs\"\n          />\n          <Route\n            element={\n              <ProtectedRoutes allowedRoles={[\"candidate\"]}>\n                <YourMatches />\n              </ProtectedRoutes>\n            }\n            path=\"/yourmatches\"\n          />\n\n          {/* Recruiter Routes */}\n          <Route\n            element={\n              <ProtectedRoutes\n                allowedRoles={[\"recruiter\", \"smallbiz_owner\", \"nonprofit\"]}\n              >\n                <RecPreferences />\n              </ProtectedRoutes>\n            }\n            path=\"/recpreferences\"\n          />\n          <Route\n            element={\n              <ProtectedRoutes\n                allowedRoles={[\"recruiter\", \"smallbiz_owner\", \"nonprofit\"]}\n              >\n                <OrgHome />\n              </ProtectedRoutes>\n            }\n            path=\"/orghome\"\n          />\n          <Route\n            element={\n              <ProtectedRoutes\n                allowedRoles={[\"recruiter\", \"smallbiz_owner\", \"nonprofit\"]}\n              >\n                <CandidateMatches />\n              </ProtectedRoutes>\n            }\n            path=\"/matches\"\n          />\n          <Route\n            element={\n              <ProtectedRoutes\n                allowedRoles={[\"recruiter\", \"smallbiz_owner\", \"nonprofit\"]}\n              >\n                <JobPost />\n              </ProtectedRoutes>\n            }\n            path=\"/jobpost\"\n          />\n          <Route\n            element={\n              <ProtectedRoutes\n                allowedRoles={[\"recruiter\", \"smallbiz_owner\", \"nonprofit\"]}\n              >\n                <JobPost />\n              </ProtectedRoutes>\n            }\n            path=\"/jobpost/:id\"\n          />\n          <Route\n            element={\n              <ProtectedRoutes\n                allowedRoles={[\"recruiter\", \"smallbiz_owner\", \"nonprofit\"]}\n              >\n                <MyJobs />\n              </ProtectedRoutes>\n            }\n            path=\"/myjobs\"\n          />\n          <Route\n            element={\n              <ProtectedRoutes\n                allowedRoles={[\"recruiter\", \"smallbiz_owner\", \"nonprofit\"]}\n              >\n                <OrgProfile />\n              </ProtectedRoutes>\n            }\n            path=\"/orgprofile\"\n          />\n          <Route\n            element={\n              <ProtectedRoutes\n                allowedRoles={[\"recruiter\", \"smallbiz_owner\", \"nonprofit\"]}\n              >\n                <CandidateProfile />\n              </ProtectedRoutes>\n            }\n            path=\"/candidate/:candidateId\"\n          />\n        </Routes>\n      </Router>\n    </Sentry.ErrorBoundary>\n  );\n};\n\nexport default App;\n","// import pages\nimport * as Sentry from \"@sentry/browser\";\nimport { createRoot } from \"react-dom/client\";\n\nimport App from \"./App\";\nimport { AlertProvider } from \"./constants/AlertProvider\";\n\nimport \"../css/output.css\";\n\nSentry.init({\n  dsn: window.SENTRY_DSN,\n  release: window.COMMIT_SHA,\n});\n\nconst root = createRoot(document.getElementById(\"react-app\") as HTMLElement);\nroot.render(\n  <AlertProvider>\n    {\" \"}\n    <App />{\" \"}\n  </AlertProvider>,\n);\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","var scriptUrl;\nif (globalThis.importScripts) scriptUrl = globalThis.location + \"\";\nvar document = globalThis.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT')\n\t\tscriptUrl = document.currentScript.src;\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) {\n\t\t\tvar i = scripts.length - 1;\n\t\t\twhile (i > -1 && (!scriptUrl || !/^http(s?):/.test(scriptUrl))) scriptUrl = scripts[i--].src;\n\t\t}\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/^blob:/, \"\").replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t792: 0\n};\n\n// no chunk on demand loading\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = globalThis[\"webpackChunkunresume_frontend\"] = globalThis[\"webpackChunkunresume_frontend\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\n__webpack_require__.O(undefined, [96], () => (__webpack_require__(4649)))\nvar __webpack_exports__ = __webpack_require__.O(undefined, [96], () => (__webpack_require__(8468)))\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","leafPrototypes","getProto","ApiError","Error","url","status","statusText","body","request","constructor","response","message","super","this","name","CancelError","isCancelled","CancelablePromise","_isResolved","_isRejected","_isCancelled","cancelHandlers","promise","_resolve","_reject","executor","Promise","resolve","reject","onCancel","cancelHandler","push","Object","defineProperty","get","value","reason","Symbol","toStringTag","then","onFulfilled","onRejected","catch","finally","onFinally","cancel","length","error","console","warn","Interceptors","_fns","eject","fn","index","indexOf","slice","use","OpenAPI","BASE","CREDENTIALS","ENCODE_PATH","undefined","HEADERS","PASSWORD","TOKEN","USERNAME","VERSION","WITH_CREDENTIALS","interceptors","isString","isStringWithValue","isBlob","Blob","async","options","resolver","getHeaders","config","token","username","password","additionalHeaders","all","headers","entries","Accept","filter","reduce","key","String","credentials","str","btoa","err","Buffer","from","toString","base64","mediaType","type","FormData","formData","axiosClient","axios","encoder","encodeURI","path","replace","substring","group","hasOwnProperty","query","params","qs","append","encodeURIComponent","encodePair","Date","toISOString","Array","isArray","forEach","v","k","join","getQueryString","getUrl","process","JSON","stringify","getFormData","getRequestBody","controller","AbortController","requestConfig","data","method","signal","withCredentials","abort","axiosError","sendRequest","responseBody","getResponseBody","responseHeader","content","getResponseHeader","result","ok","errors","errorStatus","errorStatusText","errorBody","e","catchErrorCodes","ApiService","apiApplicationList","__request","limit","offset","apiApplicationCreate","requestBody","apiApplicationRetrieve","id","apiApplicationUpdate","apiApplicationPartialUpdate","apiApplicationDestroy","apiAwardList","apiAwardCreate","apiAwardRetrieve","apiAwardUpdate","apiAwardPartialUpdate","apiAwardDestroy","apiCandidatePreferencesRetrieve","apiCandidatePreferencesUpdate","apiCertificationList","apiCertificationCreate","apiCertificationRetrieve","apiCertificationUpdate","apiCertificationPartialUpdate","apiCertificationDestroy","apiCompanyList","apiCompanyCreate","apiCompanyRetrieve","apiCompanyUpdate","apiCompanyPartialUpdate","apiCompanyDestroy","apiEducationList","apiEducationCreate","apiEducationRetrieve","apiEducationUpdate","apiEducationPartialUpdate","apiEducationDestroy","apiEventsList","apiEventsCreate","apiEventsRetrieve","apiEventsUpdate","apiEventsPartialUpdate","apiEventsDestroy","apiEventsIncrementParticipantsCreate","apiEventsTodayRetrieve","apiEventsUpcomingRetrieve","apiExperienceList","apiExperienceCreate","apiExperienceRetrieve","apiExperienceUpdate","apiExperiencePartialUpdate","apiExperienceDestroy","apiGoogleloginCreate","apiJobSkillMatricesList","apiJobSkillMatricesCreate","apiJobSkillMatricesRetrieve","apiJobSkillMatricesUpdate","apiJobSkillMatricesPartialUpdate","apiJobSkillMatricesDestroy","apiJobSkillMatricesUpdateSkillCreate","apiJobprofileList","apiJobprofileCreate","apiJobprofileRetrieve","apiJobprofileUpdate","apiJobprofilePartialUpdate","apiJobprofileDestroy","apiLoginCreate","apiLogoutCreate","apiMatchResultsList","apiMatchResultsRetrieve","apiMatchingSessionsList","apiMatchingSessionsRetrieve","apiMatchingSkillsList","apiMatchingSkillsRetrieve","apiMatchingSkillsAutocompleteRetrieve","apiMatchingAnalyticsRetrieve","apiMatchingExtractSkillsCreate","apiMatchingMatchRetrieve","apiMatchingMatchCreate","apiMatchingTaskStatusRetrieve","apiNonprofitProfileList","apiNonprofitProfileCreate","apiNonprofitProfileRetrieve","apiNonprofitProfileUpdate","apiNonprofitProfilePartialUpdate","apiNonprofitProfileDestroy","apiProfileList","apiProfileCreate","apiProfileRetrieve","apiProfileUpdate","apiProfilePartialUpdate","apiProfileDestroy","apiProjectList","apiProjectCreate","apiProjectRetrieve","apiProjectUpdate","apiProjectPartialUpdate","apiProjectDestroy","apiPublicationList","apiPublicationCreate","apiPublicationRetrieve","apiPublicationUpdate","apiPublicationPartialUpdate","apiPublicationDestroy","apiResourcesList","apiResourcesCreate","apiResourcesRetrieve","apiResourcesUpdate","apiResourcesPartialUpdate","apiResourcesDestroy","apiResourcesIncrementDownloadsCreate","apiResourcesIncrementViewsCreate","apiResourcesFreeRetrieve","apiResourcesPopularRetrieve","apiRestRestCheckRetrieve","apiSessionRetrieve","apiSignupCreate","apiSkillList","apiSkillCreate","apiSkillCategoriesList","apiSkillCategoriesRetrieve","apiSkillRetrieve","apiSkillUpdate","apiSkillPartialUpdate","apiSkillDestroy","apiSmallbizProfileList","apiSmallbizProfileCreate","apiSmallbizProfileRetrieve","apiSmallbizProfileUpdate","apiSmallbizProfilePartialUpdate","apiSmallbizProfileDestroy","apiTagsList","apiTagsRetrieve","apiTagsPopularRetrieve","apiUserSkillMatricesList","apiUserSkillMatricesCreate","apiUserSkillMatricesRetrieve","apiUserSkillMatricesUpdate","apiUserSkillMatricesPartialUpdate","apiUserSkillMatricesDestroy","apiUserSkillMatricesUpdateSkillCreate","apiUsersList","is_active","isActive","is_looking_for_job","isLookingForJob","role","search","apiUsersCreate","apiUsersRetrieve","apiUsersUpdate","apiUsersPartialUpdate","apiUsersDestroy","apiUsersDashboardJobSearchStatsRetrieve","days","apiUsersDashboardProfileCompletionRetrieve","apiUsersDashboardRecentActivityRetrieve","apiVolunteerOpportunitiesList","apiVolunteerOpportunitiesCreate","apiVolunteerOpportunitiesRetrieve","apiVolunteerOpportunitiesUpdate","apiVolunteerOpportunitiesPartialUpdate","apiVolunteerOpportunitiesDestroy","apiVolunteerOpportunitiesMyOpportunitiesRetrieve","apiWhoamiRetrieve","Notifications","onClose","div","className","BellIcon","h3","button","onClick","XMarkIcon","hr","Transition","show","enter","enterFrom","enterTo","leave","leaveFrom","leaveTo","p","HomeNavbar","navigate","useNavigate","currentPath","useLocation","pathname","showNotifications","setShowNotifications","useState","userData","setUserData","profile_picture","toggleNotifications","handleLogout","csrfToken","Cookies","post","useEffect","userId","nav","img","alt","src","Logo","Link","to","Menu","as","MenuButton","ProfilePic","ChevronDownIcon","MenuItems","MenuItem","active","formatRelativeDate","dateString","formatDistanceToNow","addSuffix","formatSalary","salary","num","Number","isNaN","toFixed","JobExpand","job","company","keywords","split","map","s","trim","Boolean","benefits","benefits_and_perks","h2","title","aria-label","XIcon","size","InfoItem","label","salary_min","salary_max","is_remote","job_type","city","country","state","description","skill","span","degree_requirements","years_of_experience","visa_sponsor","created_at","ul","benefit","li","JobCard","tags","isJobExpanded","setIsJobExpanded","bgColors","toggleJobExpand","prev","companyName","companyLogo","logo","logoBgColor","hash","acc","c","charCodeAt","getBgColor","w","toUpperCase","Building","MapPinIcon","DollarSignIcon","matchScore","StarIcon","tag","isSaved","BookmarkIcon","fill","AlertContext","createContext","useAlert","useContext","AlertProvider","children","alert","setAlert","progress","setProgress","interval","setInterval","clearInterval","Provider","msg","AnimatePresence","motion","initial","opacity","x","animate","exit","transition","stiffness","damping","CheckCircleIcon","ExclamationCircleIcon","width","ease","SkeletonLoader","Skeleton","circle","height","JobList","activeFilter","sortBy","jobs","setJobs","companyCache","setCompanyCache","isLoading","setIsLoading","showAlert","results","uniqueCompanyIds","Set","filteredJobs","sort","a","b","match_score","_","idx","FilterBar","setActiveFilter","setSortBy","select","onChange","target","option","ArrowDownIcon","Jobs","count","setCount","main","h1","ImageCropper","onCropComplete","aspectRatio","minDimension","imgSrc","crop","setCrop","completedCrop","setCompletedCrop","imgRef","previewCanvasRef","onSelectFile","onImageLoad","reset","setImgSrc","setError","useRef","file","files","startsWith","reader","FileReader","addEventListener","readAsDataURL","current","currentTarget","centerCrop","makeAspectCrop","unit","useImageCropper","image","canvas","ctx","getContext","scaleX","naturalWidth","scaleY","naturalHeight","pixelRatio","window","devicePixelRatio","Math","floor","scale","imageSmoothingQuality","cropX","cropY","y","save","beginPath","arc","PI","clip","drawImage","restore","canvasPreview","section","ReactCrop","aspect","circularCrop","keepSelection","minWidth","percentCrop","onComplete","ref","style","maxHeight","onLoad","objectFit","min","disabled","croppedFile","document","createElement","toBlob","blob","File","getCroppedBlob","htmlFor","svg","input","accept","forwardRef","closeModal","onImageCropped","EditProfileHeader","profileImage","setProfileImage","BlankProfileImage","setName","setTitle","previewImage","setPreviewImage","isModalOpen","setIsModalOpen","res","fetchProfile","toggleModal","CameraIcon","ImageModal","URL","createObjectURL","patch","EditPersonalInfo","address","setAddress","countries","Country","getAllCountries","states","setStates","cities","setCities","street","setStreet","zip","setZip","selectedCountry","setSelectedCountry","selectedState","setSelectedState","selectedCity","setSelectedCity","userInfo","setUserInfo","email","phone_number","parts","stateName","find","State","getStatesOfCountry","isoCode","some","stateList","City","getCitiesOfState","fetchPersonalInfo","fullAddress","updateUserInfo","field","UserIcon","AtSignIcon","PhoneIcon","placeholder","handleCountryChange","handleStateChange","EditEducation","applicationId","educationList","setEducationList","application","fetchEducation","updateEducation","edu","education","removeEducation","TrashIcon","GraduationCapIcon","institution","degree","field_of_study","start_date","end_date","newEdu","log","PlusCircleIcon","EditSkills","skills","setSkills","allSkills","setAllSkills","selectedSkill","setSelectedSkill","newSkillScore","setNewSkillScore","setSearch","fetchUserSkills","fetchAllSkills","filteredSkills","toLowerCase","includes","skillId","removeSkill","form","onSubmit","preventDefault","score","max","EditWorkExp","experiences","setExperiences","fetchExperiences","updateExperience","exp","experience","removeExperience","BriefcaseIcon","duration","checked","textarea","rows","responsibilities","newExp","EditProfile","setApplicationId","saveStatus","setSaveStatus","isScrolled","setIsScrolled","handleScroll","scrollY","removeEventListener","appIds","applicationids","fetchApplicationId","setTimeout","ArrowLeftIcon","Navbar","OnboardingLinks","LinkOutlinedIcon","opt","selected","setSelected","loc","AsyncPaginate","isMulti","loadOptions","fetch","json","place","place_id","display_name","raw","newValue","styles","control","base","padding","border","borderRadius","fontSize","outline","boxShadow","borderColor","isFocused","color","menu","marginTop","multiValue","display","alignItems","gap","backgroundColor","fontWeight","multiValueLabel","multiValueRemove","cursor","JOB_TYPES","COMPANY_SIZES","INVESTMENT_STAGES","opportunityTypeOptions","salaryOptions","OnboardingPreferences","location","roleInput","setRoleInput","roles","setRoles","suggestions","setSuggestions","isEditMode","preferences","setPreferences","locations","opportunity_type","preferred_salary","job_types","company_sizes","investment_stages","open_to_remote","requires_visa_sponsorship","prefs","choices","r","fetchPreferences","handleChange","handleCheckboxChange","currentValues","item","handleSwitchChange","handleClearCheckboxes","fieldName","payload","removeRole","X","filteredRoles","JobRoles","onKeyDown","autoComplete","handleSelectRole","LocationPicker","Select","CheckboxGroup","checkedValues","onClear","SwitchControl","val","CircularProgress","h4","Switch","aria-hidden","getUserDetails","user","AddEducation","setInstitution","setDegree","major","setMajor","gpa","setGpa","startYear","setStartYear","endYear","setEndYear","handleFieldChange","DatePicker","date","getFullYear","showYearPicker","dateFormat","minDate","maxDate","updatedEdu","AddWorkExp","setCompany","setCity","setState","setCountry","isRemote","setIsRemote","isCurrentJob","setIsCurrentJob","setResponsibilities","is_current","handleCurrentJobChange","maxLength","updatedExp","SkillLevelModal","onSave","level","setLevel","levels","keys","levelName","AddSkills","setQuery","selectedSkills","setSelectedSkills","skillToAdd","setSkillToAdd","skiResponse","fetchExistingSkills","delayDebounce","clearTimeout","handleSelectSkill","skillObj","MagnifyingGlassIcon","required","skillToRemove","newSkill","matching_skill_id","prevSkills","AddProjects","projects","setProjects","setDescription","link","setLink","startDate","setStartDate","endDate","setEndDate","fetchProjects","proj","removeProject","getMonth","padStart","showMonthYearPicker","updatedProject","updateProject","newProject","ResumeUploader","resumeUrl","setResumeUrl","setFile","showEditProfileButton","userDetails","resume","fetchResume","handleFileChange","selectedFile","endsWith","handleUpload","DocumentArrowUpIcon","href","rel","pop","delete","OnboardingProfile","appData","setAppData","summary","linkedin","portfolio","github","showImageModal","setShowImageModal","profilePic","setProfilePic","showAddEducation","setShowAddEducation","showAddWorkExp","setShowAddWorkExp","showAddSkills","setShowAddSkills","showAddProjects","setShowAddProjects","loading","setLoading","setCountries","latitude","setLatitude","longitude","setLongitude","userRes","allCountries","address_details","userCountryName","userStateName","state_province","userCityName","countryObj","countryStates","stateObj","appId","appRes","isOnboarding","cols","navigator","geolocation","getCurrentPosition","position","coords","countryName","csrftoken","urlString","isValidUrl","addressDetails","address_data","OnboardingSkills","addSkill","Volunteer","br","SearchIcon","ClockIcon","TagIcon","whileHover","whileTap","CompanyLogo","CalendarIcon","formatField","parseFloat","toLocaleString","minimumFractionDigits","maximumFractionDigits","saved","setSaved","copied","setCopied","vote","setVote","keywordTags","Disclosure","open","Button","companyData","BuildingOfficeIcon","CubeIcon","CurrencyDollarIcon","UsersIcon","employee_count","ChevronDown","Panel","Heart","ThumbsDown","ThumbsUp","slug","origin","clipboard","writeText","handleShare","Copy","Matched","jobData","setJobData","jobsWithCompany","companyRes","fetchJobs","Saved","Shortlisted","CheckCircle","Header","isOn","setIsOn","Pencil","Navigator","activeTab","setActiveTab","tabContent","matched","shortlisted","tab","handleTabClick","appear","YourMatches","setLogo","fetchData","CandidateMatches","matches","setMatches","postedJobs","matchPromises","allMatches","flatMap","fetchJobsAndMatches","RecHomeNavbar","Cog","animationDuration","match","user_name","PercentIcon","confidence_score","job_title","job_company","defaultValue","cityName","countryCode","stateCode","cityId","formatted","getLocationObject","JobPost","setFormData","created_by","createdById","setCreatedById","companyId","setCompanyId","setCompanyName","useParams","companyIdFromUser","prevData","header","BuildingIcon","LocationSelector","SendIcon","StatusBadge","badgeClass","MoreVerticalIcon","department","toLocaleDateString","JobsTable","filterStatus","searchQuery","viewMode","setViewMode","userJobs","matchesStatus","matchesSearch","table","thead","tr","th","scope","tbody","td","EyeIcon","jobId","prevJobs","handleDeleteJob","colSpan","JobsFilter","setFilterStatus","setSearchQuery","FilterIcon","JobsStats","total","closed","userjobStats","setUserJobStats","useUserJobStats","dl","dt","dd","AlertCircleIcon","MyJobs","RecPreferences","setCompanyData","hiring_goals","roles_hiring_for","fetchedCompanyId","positions_to_hire","patchData","checkAndRedirectByRole","isAuthenticated","userResponse","Login","touchedFields","setTouchedFields","showPassword","setShowPassword","remove","verifySession","GoogleOAuthProvider","clientId","loginResponse","set","expires","EyeSlashIcon","GoogleLogin","onSuccess","credential","onError","text","signupSchema","z","refine","domain","regex","errorMap","RecSignup","recRole","register","handleSubmit","formState","isSubmitting","useForm","zodResolver","defaultValues","errorData","detail","theme","shape","loginPayload","SbSignup","userRole","Signup","is_volunteer","loginRes","WorkExp","candidateId","routeCandidateId","isRecruiterView","setIsRecruiterView","formatDate","dateStr","year","month","day","loggedInUserId","targetUserId","userProfileData","expResponse","Briefcase","locationString","Calendar","Skills","fetchSkills","Star","Education","setEducation","eduResponse","GraduationCap","Projects","projectResponse","Lightbulb","LinkIcon","Contact","socialData","setSocialData","completionData","setCompletionData","completion","checklist","tabs","icon","workexp","fetchCompletion","socialLinks","Icon","LinkedinIcon","Github","Globe","getProgressColor","circumference","strokeDashoffset","viewBox","strokeWidth","stroke","cx","cy","strokeDasharray","strokeLinecap","transform","User","MapPin","CandidateProfile","RecNavbar","checkLogin","JobShare","setJob","jobWithCompany","keywordList","formatKeywords","RolePopup","isOpen","onContinue","selectedHiringRole","setSelectedHiringRole","Check","LandingPage","selectedRole","setSelectedRole","selectedRecRole","setSelectedRecRole","isPopupOpen","setIsPopupOpen","hiringRole","handleRoleSelect","SearchBar","onSearch","handler","handleSearch","Search","TalentList","candidates","setCandidates","totalCandidates","setTotalCandidates","currentPage","setCurrentPage","totalPages","setTotalPages","getInitials","nameParts","firstInitial","lastInitial","searchResponse","q","normalizedResults","formatted_address","total_count","ceil","usersResponse","candidatesData","candidatesWithDetails","candidate","fullCandidateData","profileResponse","appResponse","fetchTalent","MessageCircleMore","Pagination","page","event","showFirstButton","showLastButton","RecHome","OrgProfile","setRole","fetchRole","RecProfile","showCompanyLogoModal","setShowCompanyLogoModal","business_role","website","industry","culture","setIsSubmitting","logoToUpload","setLogoToUpload","handleProfileChange","companyFormData","userPatchData","Profile","ProtectedRoutes","allowedRoles","isAuthorized","setIsAuthorized","setUserRole","checkAuthorization","propTypes","PropTypes","isRequired","Navigate","parse","cookie","Sentry","fallback","Router","Routes","Route","element","SetProfileGuard","Home","OrgHome","dsn","SENTRY_DSN","release","COMMIT_SHA","createRoot","getElementById","render","App","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","__webpack_modules__","m","O","chunkIds","priority","notFulfilled","Infinity","i","fulfilled","j","every","splice","n","getter","__esModule","d","getPrototypeOf","obj","t","mode","ns","create","def","getOwnPropertyNames","definition","o","enumerable","prop","prototype","call","scriptUrl","globalThis","importScripts","currentScript","tagName","scripts","getElementsByTagName","test","installedChunks","chunkId","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","chunkLoadingGlobal","bind","__webpack_exports__"],"ignoreList":[],"sourceRoot":""}