Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
164 commits
Select commit Hold shift + click to select a range
5cf9022
patch: remove old instances of supabase use
neue-dev Apr 18, 2026
664d2bf
chore: fix out copywrite of PCC
anaj00 Apr 26, 2026
9575c8f
Merge branch 'develop' of https://github.com/BetterInternship/Client …
anaj00 Apr 26, 2026
b44f315
feat: sofi ai company profile + super listing
anaj00 Apr 26, 2026
f38c0ff
feat: enhance hero section with new animations and content
anaj00 Apr 26, 2026
c5e600f
chore: fix the header
anaj00 Apr 26, 2026
063079d
feat: `auto.current-month:default` now displays month name instead of…
anaj00 Apr 27, 2026
dd7343b
feat: add forms code gate
neue-dev Apr 27, 2026
8cc0653
fix: init form access gate with form_group_id
neue-dev Apr 27, 2026
aefa5be
fix: skip forms gate if needed
neue-dev Apr 27, 2026
1415867
feat: link form code access
neue-dev Apr 28, 2026
f763ee8
Feat/forms code (#450)
neue-dev Apr 28, 2026
2bd4a95
chore: Add hero background image for Sofi AI company
anaj00 Apr 28, 2026
36f453a
Merge branch 'develop' of https://github.com/BetterInternship/Client …
anaj00 Apr 28, 2026
c979eb2
chore: company page restyle
anaj00 Apr 28, 2026
b8aa2d4
feat: update media section with articles and video for Sofi AI
anaj00 Apr 28, 2026
79f0c99
feat: enhance media spotlight section with improved layout and styling
anaj00 Apr 28, 2026
43d177c
feat: update styling and layout for Sofi AI company page components
anaj00 Apr 28, 2026
5036fec
feat: enhance FeaturedInternship component with improved layout and a…
anaj00 Apr 28, 2026
c7c0e8a
feat: improve layout and styling for MediaSpotlight component
anaj00 Apr 28, 2026
7e4d785
chore: better footer
anaj00 Apr 28, 2026
d738f65
feat: revamp super listing page
anaj00 Apr 28, 2026
b2672a5
chore: remove modal on press of listing, and tweaked job rail info
anaj00 Apr 28, 2026
8e3794b
chore: super listing copy write edit
anaj00 Apr 28, 2026
7f7249a
feat: update submission form and requirements, streamline ApplyPanel …
anaj00 Apr 28, 2026
ae9adeb
chore: more compact super listing + bring back submit panel
anaj00 Apr 28, 2026
f71557f
chore: added the PDF + linkedin profiles
anaj00 Apr 28, 2026
ae00e1a
fix: adjust padding and spacing in WallOfLove, MediaSpotlight, Featur…
anaj00 Apr 28, 2026
bae59ec
chore: mobile doodles
anaj00 Apr 28, 2026
0c5ec2f
feat: register page initial design
jayylmao Apr 28, 2026
9aeb01f
feat: separate steps for info, edu email entry, and otp entry
jayylmao Apr 29, 2026
75aee51
fix: app crash on entering otp
jayylmao Apr 29, 2026
4acddc2
refactor: separate steps into their own components
jayylmao Apr 29, 2026
5391765
feat: remove verification requirement for applying
jayylmao Apr 29, 2026
d444bbc
Merge branch 'develop' into feat/redesigned-student-onboarding
jayylmao Apr 29, 2026
d0e5b56
fix: adjust positioning and opacity of Doodle components; update back…
anaj00 Apr 29, 2026
d9d0cbd
chore: edit copywriting for application page
anaj00 Apr 29, 2026
3d0b1e8
chore: hierarchy of the text
anaj00 Apr 29, 2026
600a179
chore: fixed copywriting one last time
anaj00 Apr 29, 2026
5f7ee09
feat: opengraph metadatas!
anaj00 Apr 29, 2026
b0b8a34
chore: import lib for carousel fade transition
jayylmao Apr 29, 2026
835c10c
feat: remove verification requirement for applying
jayylmao Apr 29, 2026
fcde800
feat: add feature carousel on register page
jayylmao Apr 29, 2026
5b3a7cc
fix: silence unknown type error in carousel
jayylmao Apr 29, 2026
b998bcb
chore: final opengraph previews
anaj00 Apr 29, 2026
7e8efcb
refactor: simplify slug retrieval in getAvailableSuperListingSlugs fu…
anaj00 Apr 29, 2026
923e26d
fix: homepage opengraph
anaj00 Apr 29, 2026
5c8d586
feat: render all fields for wet signature excluding signature
anaj00 Apr 29, 2026
773bcf1
feat: implement wet signature handling in form preview and layout
anaj00 Apr 29, 2026
39d6a5c
Merge branch 'develop' into feat/redesigned-student-onboarding
jayylmao Apr 29, 2026
4d03e0f
feat: update manual field key handling in FormSigningLayout for impro…
anaj00 Apr 29, 2026
20cf778
feat (wip): redesigned student onboarding (#451)
jayylmao Apr 29, 2026
12575d6
chore: add deadline
anaj00 Apr 29, 2026
d5c7c0a
Merge branch 'develop' into refactor/db-migration
neue-dev Apr 29, 2026
c390690
patch: remove old instances of supabase use (#443)
neue-dev Apr 29, 2026
737bd48
fix: redeploy with missing env
neue-dev Apr 29, 2026
574e5d6
fix: borken merge
neue-dev Apr 29, 2026
d782220
feat: lock challenge
anaj00 Apr 30, 2026
a1dd20e
chore: remove the word GIA
anaj00 Apr 30, 2026
127556b
feat: simplify unlock registration by removing full name requirement
anaj00 Apr 30, 2026
adb0436
feat: enhance unlock registration feedback with success toast notific…
anaj00 Apr 30, 2026
849ff2b
fix: links for the PDF
anaj00 Apr 30, 2026
5372456
fix: remove description from unlock success toast notification
anaj00 Apr 30, 2026
fb29fcd
feat: use autocomplete component for selecting degree program
jayylmao Apr 30, 2026
de29886
fix: incorrect redirect on register page
jayylmao Apr 30, 2026
45c7e65
fix: remove degree utils from refs backend
neue-dev Apr 30, 2026
db88cf6
fix: redesigned student onboarding not working with migrated db (#452)
jayylmao Apr 30, 2026
a68c045
patch: refactor otp
neue-dev May 1, 2026
4223e2d
fix: refresh cache after auth finishes
neue-dev May 1, 2026
79da830
cleanup: remove all instances of convo code
neue-dev May 1, 2026
70f0942
chore: rm duped types, factor out db refs types
neue-dev May 1, 2026
9766077
chore: unify edu email check
neue-dev May 1, 2026
b64e4e4
chore: remove middle name from flows, except profile page
neue-dev May 1, 2026
9fb1baf
chore: add some wording for landing page + product flow
anaj00 May 1, 2026
984614f
chore: remove non fields from displaying
anaj00 May 1, 2026
98baf63
patch: improve register page
neue-dev May 1, 2026
14bea5e
patch: add back button to verify page
neue-dev May 1, 2026
4321db6
chore: fixed toast theme
anaj00 May 1, 2026
33fbe9e
chore: wet signatures forms now can fill up all fields! (#454)
anaj00 May 1, 2026
b8586fb
fix: dont show form codes gate when redirecting to verify page
neue-dev May 1, 2026
464c020
fix: remove stutter when going to landing page while logged in
neue-dev May 1, 2026
eb51238
feat (wip): add new apply modal for uploading resume
jayylmao May 1, 2026
ca18a0e
chore: remove duped complete profile page
neue-dev May 1, 2026
314eb8a
fix: dont block forms by missing dept
neue-dev May 1, 2026
16aeb2b
patch: finish new modal, cleanup code again
neue-dev May 1, 2026
2aae786
patch: remove duped modal
neue-dev May 1, 2026
bbd6590
patch: use new apply flow for subsequent applies
neue-dev May 1, 2026
e06aef9
patch: minor ui fix for filename field
neue-dev May 1, 2026
cda6758
patch: custom 404 page (make site less ghetto)
neue-dev May 1, 2026
0633cda
feat: allow custom degree programs on register
jayylmao May 1, 2026
0f9c15b
Merge branch 'feat/redesigned-student-onboarding' of https://github.c…
jayylmao May 1, 2026
ddfa280
fix: unable to delete text in autocomplete with custom values
jayylmao May 1, 2026
4a39758
feat: add error page
jayylmao May 1, 2026
e310ff5
patch: remove mass apply compose, send resumeId when creating applica…
neue-dev May 1, 2026
ac0ff32
patch: link resume frontend with backend routes; modify profile page …
neue-dev May 1, 2026
de56a21
fix: add resume modal padding
neue-dev May 1, 2026
2c34503
patch: update apply modal to show correct resume data
neue-dev May 1, 2026
1a268f8
patch: invalidate resume cache when needed
neue-dev May 1, 2026
d503b78
patch: associate query param with each tab
neue-dev May 1, 2026
4568d88
patch: add a cta for missing github and profile links
neue-dev May 1, 2026
6fa9f80
chore: rename apply modal
neue-dev May 1, 2026
eca0e8e
fix: allow letter for single apply only
neue-dev May 1, 2026
ac3fcf5
fix: prevent going back to step 1 and uploading resume twice
neue-dev May 1, 2026
9ca7957
patch: make profile details optional, remove college and department
neue-dev May 1, 2026
da334dc
cleanup: remove dummy data, fix applicant loading issue
neue-dev May 1, 2026
50a0c01
fix: employer site; cleanup dead code, cleanup impl and fix bugs on a…
neue-dev May 1, 2026
0417371
fix: deal w/ no resume
neue-dev May 1, 2026
dd37a8e
fix: only show moas when logged in
neue-dev May 1, 2026
901c5fd
fix: upload resume iffy progress bar
neue-dev May 1, 2026
54378dd
Feat/redesigned onboarding (2); Chore/massive cleanup (#453)
neue-dev May 1, 2026
90d377d
fix: typing text partially and selecting an option in an autocomplete…
jayylmao May 2, 2026
ca2f2fc
fix: autocomplete partial text behavior (#455)
jayylmao May 2, 2026
9969e5c
patch: add proper redirect after verification
neue-dev May 2, 2026
b129abd
feat: stored in local storage if you have unlocked the page
anaj00 May 3, 2026
e5c1d58
fix: back to home -> search page; browser back button doesn't put you…
neue-dev May 4, 2026
1efca66
fix: need help is sherwin's facebook
neue-dev May 4, 2026
ffedb7a
fix: view in profile 404
neue-dev May 4, 2026
8478c19
fix: applicant has not uploaded resume yet
neue-dev May 4, 2026
5d7fc33
fix: remove department check for forms
neue-dev May 4, 2026
734325f
Fix/new student onboarding (#456)
neue-dev May 4, 2026
a74d609
feat: brain company page
anaj00 May 4, 2026
fa166d8
fix: rm use of next/image
neue-dev May 4, 2026
70cbae2
fix: credit filter button not working
jayylmao May 4, 2026
7430806
chore: rm apply for me
neue-dev May 4, 2026
066b7a4
fix: admu not showing up in profile editor
jayylmao May 4, 2026
ce5aeb9
Merge branch 'fix/new-student-onboarding' of https://github.com/Bette…
jayylmao May 4, 2026
bc12cad
feat: sofi ai marketing page
anaj00 May 4, 2026
2799786
chore: sofi ai marketing preview
anaj00 May 4, 2026
9004253
chore: changed copywriting for marketing challenge
anaj00 May 4, 2026
f93b9f3
chore: fixed opengraph preview for marketing intern
anaj00 May 4, 2026
b298e5e
chore: sofi ai marketing copywrite
anaj00 May 4, 2026
ca6e7fe
chore: sofi ai marketing copywrite
anaj00 May 4, 2026
35e7fea
fix: prevent uploading resume when the limit is reached
jayylmao May 4, 2026
4b27425
fix: skip otp if using edu email since auto-verify
neue-dev May 4, 2026
03f1b28
patch: disable forms if no uni
neue-dev May 4, 2026
d0081a2
patch: fix onboarding issues with edu emails
neue-dev May 4, 2026
9212894
fix: type missing
neue-dev May 4, 2026
d3cb66e
Revert "fix: type missing"
neue-dev May 4, 2026
c85576a
feat: add resume deletion
jayylmao May 4, 2026
ae99f7d
Merge branch 'fix/new-student-onboarding' of https://github.com/Bette…
jayylmao May 4, 2026
7302de0
patch: allow viewing resume used per application
neue-dev May 4, 2026
3640b89
feat: add update resume
jayylmao May 4, 2026
ef4461c
Merge branch 'fix/new-student-onboarding' of https://github.com/Bette…
jayylmao May 4, 2026
fec30f7
patch: always sort resumes by age
neue-dev May 4, 2026
7f4fa91
patch: simplify resume upload code
neue-dev May 4, 2026
0ddf060
fix: expected start date issues
neue-dev May 4, 2026
8eba595
cleanup: split up apply modal
neue-dev May 4, 2026
751126d
chore: remove old school stuff
neue-dev May 4, 2026
dd3ee7c
feat: various resume features (#457)
neue-dev May 4, 2026
5378ca7
feat: various resume features (#457)
neue-dev May 4, 2026
267cef6
fix: maintain ordering of uni options in profile
neue-dev May 5, 2026
39df6d6
fix: De MOA lol
neue-dev May 5, 2026
bb74946
fix: profile editor tab and error handling
neue-dev May 5, 2026
f7572ef
fix: mass apply on mobile
neue-dev May 5, 2026
fa9f56f
fix: ask internship prefs only at the first apply
neue-dev May 5, 2026
2edd38c
fix: no resume provided
neue-dev May 5, 2026
970146d
fix: degrees confusion
neue-dev May 5, 2026
adb400c
fix: another tab nuisance in profile page
neue-dev May 5, 2026
9aa5055
Fix/last merge (#458)
neue-dev May 5, 2026
b011502
Merge branch 'main' into develop
neue-dev May 5, 2026
6441b60
fix: degree dropdown iffy
neue-dev May 5, 2026
519295b
fix autocomp dropdown usability on mobile
neue-dev May 5, 2026
27f8303
fix: suppres keyboard if allow custom value is disabled
neue-dev May 5, 2026
109a2e1
fix: mobile modal layout issue
neue-dev May 5, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,3 +16,4 @@ npm run dev
```bash
npm run test
```

56 changes: 56 additions & 0 deletions app/error.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
"use client";

import { Card } from "@/components/ui/card";
import { Button } from "@/components/ui/button";
import { HeaderIcon, HeaderText } from "@/components/ui/text";
import { TriangleAlert } from "lucide-react";
import { useEffect } from "react";

export default function Error({
error,
reset,
}: {
error: Error;
reset: () => void;
}) {
useEffect(() => {
// Log the error to an error reporting service like Sentry
console.error(error);
}, [error]);

return (
<div className="flex min-h-screen flex-col items-center justify-center gap-4">
<Card className="flex flex-col gap-4 p-12">
<img src="/error.png" alt="Error" className="mx-auto w-96" />
<div className="flex items-center gap-3">
<HeaderIcon icon={TriangleAlert} />
<HeaderText>Something went wrong.</HeaderText>
</div>
<span>
Sorry for the inconvenience. Please{" "}
<a href="https://www.facebook.com/betterinternship.sherwin">
contact us for support
</a>
.
</span>
{error && (
<div className="flex flex-col gap-4">
<span className="text-muted-foreground">
Error: {error.message}
</span>
</div>
)}
<div className="flex justify-between">
<Button
onClick={
// Attempt to recover by trying to re-render the segment
() => reset()
}
>
Try again
</Button>
</div>
</Card>
</div>
);
}
26 changes: 13 additions & 13 deletions app/hire/authctx.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import { EmployerAuthService } from "@/lib/api/hire.api";
import { getFullName } from "@/lib/profile";
import { FetchResponse } from "@/lib/api/use-fetch";
import { useQueryClient } from "@tanstack/react-query";
import { usePocketbase } from "@/lib/pocketbase";
import { EmployerService } from "@/lib/api/services";
import { useRef } from "react";

Expand All @@ -30,7 +29,7 @@ interface IAuthContext {
) => Promise<{ existing_user: boolean; verified_user: boolean }>;
logout: () => Promise<void>;
isAuthenticated: () => boolean;
refreshAuthentication: () => void;
refreshAuthentication: () => Promise<Partial<PublicEmployerUser> | null>;
redirectIfNotLoggedIn: () => void;
redirectIfLoggedIn: () => void;
}
Expand All @@ -54,12 +53,11 @@ export const AuthContextProvider = ({
const [loading, setLoading] = useState(true);
const [isAuthenticated, setIsAuthenticated] = useState(false);
const queryClient = useQueryClient();
const pocketbase = usePocketbase();
const [god, setGod] = useState(false);
const [user, setUser] = useState<Partial<PublicEmployerUser> | null>(() => {
if (typeof window === "undefined") return null;
const user = sessionStorage.getItem("user");
return user ? JSON.parse(user) : null;
return user ? (JSON.parse(user) as PublicEmployerUser) : null;
});

// Whenever user is updated, cache in localStorage
Expand Down Expand Up @@ -87,7 +85,8 @@ export const AuthContextProvider = ({

setUser(response.user as PublicEmployerUser);

// @ts-ignore
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-expect-error
if (response.god) setGod(true);

setIsAuthenticated(true);
Expand All @@ -112,6 +111,7 @@ export const AuthContextProvider = ({
setUser(response.user as PublicEmployerUser);
setIsAuthenticated(true);

// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-expect-error
if (response.god) setGod(true);

Expand All @@ -125,7 +125,6 @@ export const AuthContextProvider = ({
return null;
}

await pocketbase.refresh();
await queryClient.invalidateQueries({ queryKey: ["my-employer-profile"] });
setProxy(getFullName(response.user));
setUser(response.user);
Expand All @@ -138,7 +137,6 @@ export const AuthContextProvider = ({
};

const logout = async () => {
await pocketbase.logout();
await EmployerAuthService.logout();

await queryClient.invalidateQueries({ queryKey: ["my-employer-profile"] });
Expand All @@ -162,17 +160,17 @@ export const AuthContextProvider = ({

useEffect(() => {
if (effectRan.current && !loading && isAuthenticated) {
router.push("/dashboard")
};
router.push("/dashboard");
}

if (!loading) {
effectRan.current = true;
}
}, [isAuthenticated, loading]);
}
};

useEffect(() => {
refreshAuthentication();
void refreshAuthentication();
}, []);

return (
Expand All @@ -181,9 +179,11 @@ export const AuthContextProvider = ({
user,
god,
proxy,
// @ts-ignore
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-expect-error
register,
// @ts-ignore
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-expect-error
login,
loginAs,
loading,
Expand Down
34 changes: 0 additions & 34 deletions app/hire/conversations/page.tsx

This file was deleted.

79 changes: 12 additions & 67 deletions app/hire/dashboard/applicant/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,84 +6,30 @@ import { ApplicantPage } from "@/components/features/hire/dashboard/ApplicantPag
import { type ActionItem } from "@/components/ui/action-item";
import { useEmployerApplications } from "@/hooks/use-employer-api";
import { UserService } from "@/lib/api/services";
import { EmployerApplication } from "@/lib/db/db.types";
import { useDbRefs } from "@/lib/db/use-refs";
import { useSearchParams } from "next/navigation";
import { Suspense, useEffect, useState } from "react";
import useApplicationActions from "@/hooks/use-application-actions";

function ApplicantPageContent() {
const searchParams = useSearchParams();
const userId = searchParams.get("userId");
const isDummyProfile = searchParams.get("dummy") === "1";
const applicationId = searchParams.get("applicationId");
const [loading, setLoading] = useState(true);
const applications = useEmployerApplications();
const { app_statuses } = useDbRefs();

const { triggerAction } = useApplicationActions(applications.review);

const dummyApplication: EmployerApplication = {
id: "dummy-super-application",
job_id: jobId ?? "dummy-super-job",
status: 0,
applied_at: "2026-03-09T00:00:00.000Z",
cover_letter:
"I am excited to apply and contribute with thoughtful solutions.",
challenge_submission:
"This is a sample challenge submission used for previewing super listing flows.",
job: {
title: "Super Listing - Sample Role",
internship_preferences: {
require_cover_letter: true,
},
},
user: {
id: "dummy-super-user",
first_name: "Sample",
last_name: "Applicant",
phone_number: "+63 900 000 0000",
edu_verification_email: "sample.applicant@school.edu",
degree: "BS Computer Science",
bio: "I build practical products and enjoy solving product and UX problems.",
github_link: "https://github.com/sample-applicant",
portfolio_link: "https://sample-applicant.dev",
linkedin_link: "https://linkedin.com/in/sample-applicant",
internship_preferences: {
internship_type: "credited",
expected_start_date: 1751328000000,
expected_duration_hours: 400,
},
expected_graduation_date: 1767225600000,
},
};

let userApplication = applications?.employer_applications.find(
(a) => userId === a.user_id,
const userApplication = applications?.employer_applications.find(
(a) => applicationId === a.id,
);
let otherApplications = applications?.employer_applications.filter(
(a) => userId === a.user_id,
const otherApplications = applications?.employer_applications.filter(
(a) => a.user_id === userApplication?.user_id,
);

if (jobId) {
userApplication = applications?.employer_applications.find(
(a) => userId === a.user_id && a.job_id === jobId,
);
otherApplications = applications?.employer_applications.filter(
(a) => userId === a.user_id && a.id !== userApplication?.id,
);
}

if (isDummyProfile) {
userApplication = dummyApplication;
otherApplications = [];
}
const userId = userApplication?.user_id;

useEffect(() => {
const fetchUserData = async () => {
if (isDummyProfile) {
setLoading(false);
return;
}
if (!userId) {
setLoading(false);
return;
Expand All @@ -97,12 +43,14 @@ function ApplicantPageContent() {
setLoading(false);
}
};
fetchUserData();
}, [isDummyProfile, userId]);
void fetchUserData();
}, [userId]);

if (!app_statuses) return null;

const unique_app_statuses = app_statuses.reduce(
const unique_app_statuses = (
app_statuses as { id: number; name: string }[]
).reduce(
(acc: { id: number; name: string }[], cur: { id: number; name: string }) =>
acc.find((a) => a.name === cur.name) ? acc : [...acc, cur],
[],
Expand Down Expand Up @@ -135,10 +83,7 @@ function ApplicantPageContent() {
<div className="w-full h-full">
<ApplicantPage
application={userApplication}
jobID={jobId || ""}
statuses={
isDummyProfile ? [] : getStatuses(userApplication?.id || "")
}
statuses={getStatuses(userApplication?.id || "")}
userApplications={otherApplications}
onArchive={() => {
if (!userApplication) return;
Expand Down
Loading