diff --git a/src/components/auth/AuthModal.tsx b/src/components/auth/AuthModal.tsx index f47af9f1..3f416c66 100644 --- a/src/components/auth/AuthModal.tsx +++ b/src/components/auth/AuthModal.tsx @@ -18,6 +18,7 @@ import { setAuthMethod } from '@/lib/sessionFlags'; import { validateEmailNotDisposable } from '@/lib/emailValidation'; import { getErrorMessage } from '@/lib/errorHandler'; import { logger } from '@/lib/logger'; +import type { SignInOptions } from '@/types/supabase-auth'; interface AuthModalProps { open: boolean; @@ -70,7 +71,7 @@ export function AuthModal({ open, onOpenChange, defaultTab = 'signin' }: AuthMod setSignInCaptchaToken(null); try { - const signInOptions: any = { + const signInOptions: SignInOptions = { email: formData.email, password: formData.password, }; diff --git a/src/components/moderation/SubmissionReviewManager.tsx b/src/components/moderation/SubmissionReviewManager.tsx index 9bb48a07..f2439e45 100644 --- a/src/components/moderation/SubmissionReviewManager.tsx +++ b/src/components/moderation/SubmissionReviewManager.tsx @@ -297,8 +297,9 @@ export function SubmissionReviewManager({ description: `Successfully approved ${selectedItemIds.size} item(s)${requestId ? ` (Request: ${requestId.substring(0, 8)})` : ''}`, }); - const successCount = data.results.filter((r: any) => r.success).length; - const failCount = data.results.filter((r: any) => !r.success).length; + interface ApprovalResult { success: boolean; item_id: string; error?: string } + const successCount = data.results.filter((r: ApprovalResult) => r.success).length; + const failCount = data.results.filter((r: ApprovalResult) => !r.success).length; const allFailed = failCount > 0 && successCount === 0; const someFailed = failCount > 0 && successCount > 0; diff --git a/src/hooks/moderation/useProfileCache.ts b/src/hooks/moderation/useProfileCache.ts index 66da9d07..1ed9af12 100644 --- a/src/hooks/moderation/useProfileCache.ts +++ b/src/hooks/moderation/useProfileCache.ts @@ -3,6 +3,7 @@ import { supabase } from '@/integrations/supabase/client'; import { logger } from '@/lib/logger'; import { getErrorMessage } from '@/lib/errorHandler'; import { MODERATION_CONSTANTS } from '@/lib/moderation/constants'; +import type { ModerationItem } from '@/types/moderation'; /** * Profile data structure returned from the database @@ -143,7 +144,7 @@ export function useProfileCache() { * @param submissions - Array of submissions with user_id and reviewer_id * @returns Map of userId -> profile for all users involved */ - const fetchForSubmissions = useCallback(async (submissions: any[]): Promise> => { + const fetchForSubmissions = useCallback(async (submissions: ModerationItem[]): Promise> => { const userIds = submissions.map(s => s.user_id).filter(Boolean); const reviewerIds = submissions.map(s => s.reviewer_id).filter((id): id is string => !!id); const allUserIds = [...new Set([...userIds, ...reviewerIds])]; diff --git a/src/hooks/moderation/useRealtimeSubscriptions.ts b/src/hooks/moderation/useRealtimeSubscriptions.ts index e112cd6a..533491dd 100644 --- a/src/hooks/moderation/useRealtimeSubscriptions.ts +++ b/src/hooks/moderation/useRealtimeSubscriptions.ts @@ -12,6 +12,7 @@ import { logger } from '@/lib/logger'; import { getErrorMessage } from '@/lib/errorHandler'; import { MODERATION_CONSTANTS } from '@/lib/moderation/constants'; import type { RealtimeChannel, RealtimePostgresChangesPayload } from '@supabase/supabase-js'; +import type { Json } from '@/integrations/supabase/types'; import type { ModerationItem, EntityFilter, StatusFilter } from '@/types/moderation'; import type { useEntityCache } from './useEntityCache'; import type { useProfileCache } from './useProfileCache'; @@ -176,7 +177,7 @@ export function useRealtimeSubscriptions( /** * Resolve entity names for a submission */ - const resolveEntityNames = useCallback(async (submission: any) => { + const resolveEntityNames = useCallback(async (submission: { submission_type: string; content: Json }) => { const content = submission.content as SubmissionContent; let entityName = content?.name || 'Unknown'; let parkName: string | undefined; diff --git a/src/hooks/useAdminGuard.ts b/src/hooks/useAdminGuard.ts index ed304dc0..e23c7f38 100644 --- a/src/hooks/useAdminGuard.ts +++ b/src/hooks/useAdminGuard.ts @@ -1,5 +1,6 @@ import { useEffect } from 'react'; import { useNavigate } from 'react-router-dom'; +import type { User } from '@supabase/supabase-js'; import { useAuth } from './useAuth'; import { useUserRole } from './useUserRole'; import { useRequireMFA } from './useRequireMFA'; @@ -15,7 +16,7 @@ export interface AdminGuardState { needsMFA: boolean; /** Current authenticated user */ - user: any; + user: User | null; } /** diff --git a/src/types/moderation.ts b/src/types/moderation.ts index 15f175ae..eca3b0d9 100644 --- a/src/types/moderation.ts +++ b/src/types/moderation.ts @@ -164,6 +164,9 @@ export interface ModerationItem { reviewed_at?: string; /** ID of the moderator who reviewed this item */ + reviewer_id?: string; + + /** Username of the moderator who reviewed this item */ reviewed_by?: string; /** Notes left by the reviewing moderator */ diff --git a/src/types/supabase-auth.ts b/src/types/supabase-auth.ts new file mode 100644 index 00000000..65ac64a0 --- /dev/null +++ b/src/types/supabase-auth.ts @@ -0,0 +1,24 @@ +/** + * Extended Supabase Auth Types + * Supabase auth methods accept options objects not fully typed in official SDK + */ + +export interface SignInOptions { + email: string; + password: string; + options?: { + captchaToken?: string; + }; +} + +export interface SignUpOptions { + email: string; + password: string; + options?: { + data?: { + username?: string; + display_name?: string; + }; + captchaToken?: string; + }; +}