diff --git a/apps/hackathon/src/app/teams/[teamId]/edit/page.tsx b/apps/hackathon/src/app/teams/[teamId]/edit/page.tsx
index edde57a..92cb574 100644
--- a/apps/hackathon/src/app/teams/[teamId]/edit/page.tsx
+++ b/apps/hackathon/src/app/teams/[teamId]/edit/page.tsx
@@ -5,7 +5,8 @@ import { useNavigate, useParams } from 'react-router';
import { useForm, Controller } from 'react-hook-form';
import { teamUpdateSchema, TTeamUpdateForm, useUpdateTeam, useTeamById, ETeamVisibility, useUploadFile, useAuthStore } from '@imphnen-frontend-service/service';
import { zodResolver } from '@hookform/resolvers/zod';
-import INDONESIAN_CITIES from '../../../../constants/cities';
+
+import { CitySelect } from '../../../../components/city-select';
const EditTeamPage: FC = (): ReactElement => {
const { teamId } = useParams<{ teamId: string }>();
@@ -229,22 +230,12 @@ const EditTeamPage: FC = (): ReactElement => {
control={form.control}
name="city"
render={({ field, fieldState }) => (
-
-
- {fieldState.error && (
-
{fieldState.error.message}
- )}
-
+
)}
/>
diff --git a/apps/hackathon/src/app/teams/[teamId]/page.tsx b/apps/hackathon/src/app/teams/[teamId]/page.tsx
index 7532996..a123a6e 100644
--- a/apps/hackathon/src/app/teams/[teamId]/page.tsx
+++ b/apps/hackathon/src/app/teams/[teamId]/page.tsx
@@ -85,54 +85,6 @@ const TeamDashboardPage: FC = (): ReactElement => {
);
const canInvite = isLeader && members.length < MAX_TEAM_MEMBERS;
- // Calculate total images to load
- const totalImagesToLoad =
- (team?.banner ? 1 : 0) +
- (team?.logo ? 1 : 0) +
- members.filter((m: any) => m.user?.avatar).length;
-
- // Track image loading with timeout fallback
- useEffect(() => {
- if (!isLoadingTeam && !isLoadingMembers && team) {
- if (totalImagesToLoad === 0) {
- setImagesLoaded(true);
- } else if (imageLoadCount >= totalImagesToLoad) {
- setImagesLoaded(true);
- }
- }
- }, [
- isLoadingTeam,
- isLoadingMembers,
- team,
- imageLoadCount,
- totalImagesToLoad,
- ]);
-
- // Fallback timeout - if images take too long, show content anyway
- useEffect(() => {
- if (!isLoadingTeam && !isLoadingMembers && team && !imagesLoaded) {
- const timeout = setTimeout(() => {
- setImagesLoaded(true);
- }, 3000); // 3 second timeout
- return () => clearTimeout(timeout);
- }
- }, [isLoadingTeam, isLoadingMembers, team, imagesLoaded]);
-
- const handleImageLoad = () => {
- setImageLoadCount((prev) => prev + 1);
- };
-
- // Also count error as loaded to prevent stuck
- const handleImageError = () => {
- setImageLoadCount((prev) => prev + 1);
- };
-
- console.log('Leader check:', {
- currentUserId,
- leaderId: team?.leader_id,
- isLeader,
- });
-
const handleInviteMember = async (e: React.FormEvent) => {
e.preventDefault();
if (!inviteEmail.trim() || isInviting) return;
diff --git a/apps/hackathon/src/middleware.ts b/apps/hackathon/src/middleware.ts
index 28ed9e0..d5001ae 100644
--- a/apps/hackathon/src/middleware.ts
+++ b/apps/hackathon/src/middleware.ts
@@ -37,8 +37,6 @@ export const middleware = async ({ request }: LoaderFunctionArgs) => {
const url = new URL(request.url);
const pathname = url.pathname;
- console.log('[Middleware] Checking route:', pathname);
-
// Get session from Supabase (authoritative source)
const { data: { session: supabaseSession }, error: sessionError } = await supabase.auth.getSession();
@@ -86,10 +84,8 @@ export const middleware = async ({ request }: LoaderFunctionArgs) => {
let hasLocation = false;
if (cached && (now - cached.timestamp) < CACHE_DURATION) {
- console.log('[Middleware] Using cached onboarding status');
hasLocation = cached.hasLocation;
} else {
- console.log('[Middleware] Fetching fresh onboarding status');
const { data: userData, error: userError } = await supabase
.from('users')
.select('location')
diff --git a/libs/ui/src/atoms/input/input.tsx b/libs/ui/src/atoms/input/input.tsx
index 85e9b18..cc730e9 100644
--- a/libs/ui/src/atoms/input/input.tsx
+++ b/libs/ui/src/atoms/input/input.tsx
@@ -56,7 +56,7 @@ export const Input: FC
= ({
};
const mergedClassName = cn(
- `px-[12px] py-[8px] text-neutral-800 bg-white placeholder:text-neutral-300 border border-neutral-200 hover:border-blue-300 focus:outline-1 focus:outline-blue-500 rounded-md font-bai-jamjuree w-full ${
+ `px-[12px] py-[8px] text-neutral-800 dark:text-white bg-white dark:bg-neutral-800 placeholder:text-neutral-300 dark:placeholder:text-neutral-500 border border-neutral-200 dark:border-neutral-600 hover:border-blue-300 dark:hover:border-blue-500 focus:outline-1 focus:outline-blue-500 dark:focus:outline-primary-500 rounded-md font-bai-jamjuree w-full ${
widthform === 'standard' ? 'min-w-70' : ''
}`,
sizeClasses[size].textSize,
diff --git a/libs/ui/src/atoms/textarea/textarea.tsx b/libs/ui/src/atoms/textarea/textarea.tsx
index 1c31100..eaab380 100644
--- a/libs/ui/src/atoms/textarea/textarea.tsx
+++ b/libs/ui/src/atoms/textarea/textarea.tsx
@@ -38,7 +38,7 @@ export const Textarea: FC = ({
...rest
}): ReactElement => {
const mergedClassName = cn(
- 'rounded-md border border-neutral-200 hover:border-blue-300 focus:outline-1 focus:outline-blue-500 px-[12px] py-[8px] invalid:border-danger-500 invalid:text-danger-500',
+ 'rounded-md border border-neutral-200 dark:border-neutral-600 hover:border-blue-300 dark:hover:border-blue-500 focus:outline-1 focus:outline-blue-500 dark:focus:outline-primary-500 px-[12px] py-[8px] bg-white dark:bg-neutral-800 text-neutral-800 dark:text-white placeholder:text-neutral-300 dark:placeholder:text-neutral-500 invalid:border-danger-500 invalid:text-danger-500',
sizeClasses[size],
disabled && disabledClass,
error && errorClass,