-
- ×
-
- diff --git a/.gitignore b/.gitignore index 5780363ba..25a650dc0 100644 --- a/.gitignore +++ b/.gitignore @@ -28,3 +28,7 @@ CLAUDE.md AGENTS.md .claude/ .claudeignore + +# Postman files +.postman/ +postman/ diff --git a/README.md b/README.md index a22efee5a..d5aa256cb 100644 --- a/README.md +++ b/README.md @@ -16,4 +16,3 @@ npm run dev ```bash npm run test ``` - diff --git a/app/hire/%5F%5F/page.tsx b/app/hire/%5F%5F/page.tsx index 68c368842..f7a374863 100644 --- a/app/hire/%5F%5F/page.tsx +++ b/app/hire/%5F%5F/page.tsx @@ -15,7 +15,6 @@ const InternalSetupPage = () => { await queryClient.invalidateQueries({ queryKey: ["my-profile"] }); await queryClient.invalidateQueries({ queryKey: ["my-applications"] }); await queryClient.invalidateQueries({ queryKey: ["my-saved-jobs"] }); - await queryClient.invalidateQueries({ queryKey: ["my-conversations"] }); await queryClient.invalidateQueries({ queryKey: ["my-forms"] }); await queryClient.invalidateQueries({ queryKey: ["my-form-templates"] }); await queryClient.invalidateQueries({ queryKey: ["my-form-template"] }); diff --git a/app/hire/__/page.tsx b/app/hire/__/page.tsx index 68c368842..f7a374863 100644 --- a/app/hire/__/page.tsx +++ b/app/hire/__/page.tsx @@ -15,7 +15,6 @@ const InternalSetupPage = () => { await queryClient.invalidateQueries({ queryKey: ["my-profile"] }); await queryClient.invalidateQueries({ queryKey: ["my-applications"] }); await queryClient.invalidateQueries({ queryKey: ["my-saved-jobs"] }); - await queryClient.invalidateQueries({ queryKey: ["my-conversations"] }); await queryClient.invalidateQueries({ queryKey: ["my-forms"] }); await queryClient.invalidateQueries({ queryKey: ["my-form-templates"] }); await queryClient.invalidateQueries({ queryKey: ["my-form-template"] }); diff --git a/app/hire/allowLanding.tsx b/app/hire/allowLanding.tsx index 79c15e32f..4e2110433 100644 --- a/app/hire/allowLanding.tsx +++ b/app/hire/allowLanding.tsx @@ -16,10 +16,14 @@ export default function AllowLanding({ const hideHeader = isStudentLanding || isAuthRoute; return ( -
- Updated nightly: {new Date(loginMetrics.cached_at).toLocaleString()} + {refreshLoginMetrics.isPending ? "Refreshing…" : "Refresh stats"} + +
+ Updated: {new Date(loginMetrics.cached_at).toLocaleString()} +
+ > + ) : ( ++ {isLoginMetricsLoading + ? "Loading employer login stats..." + : "Employer login stats are unavailable."}
-+ Could not refresh employer login stats. +
+ )} +Loading...
diff --git a/app/hire/l/[slug]/route.ts b/app/hire/l/[slug]/route.ts new file mode 100644 index 000000000..06bc3d85c --- /dev/null +++ b/app/hire/l/[slug]/route.ts @@ -0,0 +1,22 @@ +/** + * Resolves employer-portal short links using the shared links API. + * Unknown slugs and API failures return the visitor to the employer home page. + */ +export async function GET( + request: Request, + { params }: { params: Promise<{ slug: string }> }, +) { + const { slug } = await params; + const origin = new URL(request.url).origin; + + try { + const res = await fetch( + `${process.env.NEXT_PUBLIC_API_URL}/links/${slug}`, + { cache: "no-store" }, + ); + const data = (await res.json()) as { url?: string | null }; + return Response.redirect(data?.url ?? origin, 307); + } catch { + return Response.redirect(origin, 307); + } +} diff --git a/app/hire/layout.tsx b/app/hire/layout.tsx index cfed74315..168f1b335 100644 --- a/app/hire/layout.tsx +++ b/app/hire/layout.tsx @@ -94,13 +94,11 @@ const HTMLContent = ({+ Job actions +
++ Quick actions for this listing. +
+Job does not exist.
-- If you are coming from a valid link, it is possible that the job - was deleted by the employer. -
-- Job actions -
-- Quick actions for this listing. -
-- Submission sent -
-- Thank you for applying. We sent a confirmation to{" "} - - {submittedEmail || "your email"} - - . You will receive a response within 24 hours. -
-- Again,{" "} - - no resume needed. Response within 24 hours. - -
-- Submission Requirements -
-- 1. Deployed Website or Prototype -
-- 2. 1-3 Minute Video -
-- Submission Form -
- {submissionsDisabled ? ( -- Sofi AI builds practical AI tools for real businesses: assistants, - customer automation, and workflow systems used at scale. Your - challenge is to show you can turn that kind of AI capability into - a clean, credible product experience. -
-- No resume needed. Response in 24 hours. -
-- You're up for the challenge? -
-- Enter your email to unlock the brief now. We'll send the full - link too. -
-- GIA: Generative Influencer Analyst -
-- GIA is a web-based analytics platform powered by SOFI AI. She - helps TikTok creators understand their content in a simple, human - way without needing to be technical. -
-User Profile:
-- TikTok creators in the Philippines who don’t speak fluent - analytics: people who see their metrics but don’t fully - understand them. -
-Use case:
-- You feed her your Tiktok profile link. She gives you back a - readable report with hook scores, audience signals, sentiment - analysis, and suggestions on what to post next. -
-Here is a sample of the report that GIA generates.
-- Also, heres a sample landing page we made:{" "} - - https://sofi-ai-gia.netlify.app/ - -
-1. Landing Page
{" "} -- We have an existing version of the landing page. Your task is to - improve or redesign it. -
-Think about:
-- Additionally, this landing page has to{" "} - lead to the product flow. -
-2. Product Flow
{" "} -- Design the end-to-end user experience for the actual product, - from inputting a TikTok profile link to receiving and viewing - the generated report. -
-As you design, consider:
-- You have full flexibility in how you structure this experience. -
-- 1. Thinking:{" "} - How you approach the problem and make decisions. -
-- 2. Design:{" "} - Clarity, usability, and overall execution. -
-- - 3. Communication: - {" "} - How well you explain your work and ideas. -
-- We're doing this differently. Instead of resumes, we want to - see how you actually think and build. -
-- You'll design a new product that we're planning to - release. We have a rough product vision, backend, and strategy. - Your role is to: -
-- This does not need to be fully functional. What matters is your - ability to create a clear, thoughtful vision, and to make us - understand how it should look. -
-- We'll give you the direction and you are given the freedom to - shape the user journey, make product and design decisions, and - define how the experience should feel. -
-- Use any tools you want, including AI, references, or your own - workflow. -
-- This is not a typical UI/UX internship. You will be leading the - design of products that we are actively preparing to launch. -
-- We already have a solid backend engineering team. And right now, we - are looking for someone who can bring the product to life through - design, user flow, and experience. -
-- If you do well, there are many more projects lined up... and - potentially a full-time role. -
-- None. -
-- We don't care about grades or credentials. We want to see if - you can do real work. Complete the challenge and show us what you - can do. -
-
-
- ×
-
- + Pending applicants on the listings you close will be notified that the + listing has closed. +
++ This applicant is looking for internships for credit +
++ This applicant is looking for internships voluntarily +
+- This applicant is looking for internships for - credit -
-- This applicant is looking for internships - voluntarily -
-|
- )} - {application?.user?.edu_verification_email !== null && ( + {application?.user?.email && ( -{application?.user?.bio}
-Applicant has not added a bio.
++ {application?.user?.bio} +
- Applying for: {application?.job?.title} -
- )}Education
-+
Education
+{to_university_name(user?.university)}
-{user?.degree}
- Expected Graduation Date +
Degree
++ {user?.degree}
-- {formatMonth(user?.expected_graduation_date)} +
Date Applied
++ {formatDateWithoutTime(application.applied_at)}
+ Expected Graduation Date +
++ {formatMonth(user.expected_graduation_date)} +
++
Expected Start Date
- {formatOptionalTimestampDate( + {formatTimestampDateWithoutTime( internshipPreferences?.expected_start_date, )}
+ Expected Duration (Hours) +
++ {internshipPreferences.expected_duration_hours} +
+- Expected Duration (Hours) -
-- {internshipPreferences?.expected_duration_hours} -
+Internship Type
+ {internshipTypeBadge}- {a.job?.title} -
-- {" "} - No applied roles -
- ) : ( -- {" "} - No other applied roles -
- )} - > ++ No other applied roles +
)}+ Re-activate the listing first +
+ > + ) : ( + +