Skip to content

Conversation

@sterdsterd
Copy link
Collaborator

@sterdsterd sterdsterd commented Jan 29, 2026

Note

High Risk
High risk due to major native app configuration changes (Firebase/Kakao/Google/Apple, package ID, EAS/Metro) plus new authentication flows and token handling; these can impact login stability, builds, and push/deeplink behavior.

Overview
Adds new native authentication flows: provider-based OAuth on-device (Apple/Google/Kakao) plus email login/signup/password reset via a new bottom sheet UI and hooks, replacing the prior web-based social login/callback approach.

Updates the native app’s infrastructure and configuration for production builds: introduces EAS config, Metro monorepo resolution tweaks, Firebase/notifications setup (including a custom Expo config plugin to patch iOS Podfile modular headers), Kakao SDK init, splash screen overlay, deep-link handling, and additional dependencies; also refactors multiple API controllers (new/typed endpoints, new QnA list SSE subscription + read-status dedupe, upload size limit enforcement, and broader query invalidation helpers) and adds a reusable AnimatedPressable with optional analytics tracking.

Written by Cursor Bugbot for commit 1c526ea. This will update automatically on new commits. Configure here.

b0nsu and others added 30 commits January 7, 2026 19:30
…olor, improve text handling, and optimize layout management for better performance
…mproving button opacity based on scroll position
…pdown component for improved image organization
…d color and border radius for better styling
…tip, FolderScrapScreen, and ScrapScreen to improve state management
…, and ScrapDetailScreen for improved UI consistency and visual appeal
…riptions, and update file references in schema
…edback, notification settings, phone verification, terms, and withdrawal screens
b0nsu and others added 26 commits January 27, 2026 18:31
…ameters and adjust ScrapItemTooltip component accordingly
- Add types.ts with event types, screen names, and button IDs
- Add client.ts for API communication with error handling
- Add queue.ts with batching, persistence, and retry logic
- Add tracker.ts for event validation and session management
- Add index.ts as public singleton API
- Add AnalyticsProvider for lifecycle management (session start/end, app state)
- Add TrackedAnimatedPressable wrapper for button click tracking
- Export components from analytics module
- Add useScreenTracking hook for automatic screen tracking
- Map navigation routes to analytics screen names
- Track SCREEN_ENTER and SCREEN_EXIT with dwellTimeMs
- Wrap App with AnalyticsProvider
- Add onStateChange and onReady to NavigationContainer
- Add buttonId, buttonLabel, screenName props to BottomActionBar.Button
- Add buttonId, buttonLabel, screenName props to TextButton
- Track BUTTON_CLICK when buttonId is provided
…able

- ProblemSet: add start_study tracking to main button and TextButton
- PointingScreen: add tracking for scrap, confirm/reject pointing, next_problem
- AnalysisScreen: add tracking for problem, reading tip, one step more scrap
- AllPointingsScreen: add tracking for problem and pointing scrap
- MessageInput: add tracking for send_message and upload_image buttons
- Log event enqueue with event type and metadata
- Log queue size and threshold status
- Log flush lifecycle (before/after queue state)
- Log batch sending details (events in batch)
- Log API request/response status
- Log screen changes
- Add clearQueue function to queue, tracker, and public API
- Add version-based migration to clear old events on app start
- Bump CURRENT_ANALYTICS_VERSION to 2 to trigger migration
…dent only

- Move src/analytics/ to src/features/student/analytics/
- Remove AnalyticsProvider from App.tsx (global scope)
- Add AnalyticsProvider to StudentNavigator (student scope only)
- Refactor useScreenTracking to use useNavigationState hook
- Update all import paths to new location
- Analytics now only initializes and tracks within student screens
…roved visual consistency during selection state
@vercel
Copy link

vercel bot commented Jan 29, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Review Updated (UTC)
pointer-admin Ready Ready Preview, Comment Jan 29, 2026 0:40am

@sterdsterd sterdsterd merged commit b4e6ea2 into develop Jan 29, 2026
4 checks passed
@sterdsterd sterdsterd deleted the native branch January 29, 2026 12:40
Copy link

@cursor cursor bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 8 potential issues.

Bugbot Autofix is OFF. To automatically fix reported issues with Cloud Agents, enable Autofix in the Cursor dashboard.

This is the final PR Bugbot will review for you during this billing cycle

Your free Bugbot reviews will reset on February 23

Details

Your team is on the Bugbot Free tier. On this plan, Bugbot will review limited PRs each billing cycle for each member of your team.

To receive Bugbot reviews on all of your PRs, visit the Cursor dashboard to activate Pro and start your 14-day free trial.


type PasswordResetDTOResetPasswordRequest =
components['schemas']['PasswordResetDTO.ResetPasswordRequest'];
const postPasswordResetVerifyCode = async (data: PasswordResetDTOResetPasswordRequest) => {
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Wrong type used for password reset verify-code endpoint

High Severity

The postPasswordResetVerifyCode function uses PasswordResetDTO.ResetPasswordRequest type, which requires email, code, and newPassword fields. However, the verify-code endpoint only needs email and code. The schema defines a separate PasswordResetDTO.VerifyCodeRequest type that matches the expected fields. This type mismatch will cause TypeScript to require a newPassword field that shouldn't be sent to this endpoint, or lead to runtime API errors if the wrong data structure is sent.

Fix in Cursor Fix in Web

case 'text':
default:
return <p className='text-sm whitespace-pre-wrap text-gray-900'>{content}</p>;
return <p className='text-sm break-all text-gray-900'>{content}</p>;
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

CSS change removes whitespace preservation in chat messages

Medium Severity

Replacing whitespace-pre-wrap with break-all removes whitespace and newline preservation for text messages. In a QnA/chat context, user-entered line breaks and intentional spacing will no longer be displayed correctly. whitespace-pre-wrap preserves formatting while break-all only controls word breaking behavior without preserving whitespace sequences.

Fix in Cursor Fix in Web

runOnJS(onAnimationFinish)();
}
});
});
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Missing error handler leaves app stuck on splash screen

Medium Severity

SplashScreen.hideAsync() is called with .then() but no .catch() handler. If hideAsync() rejects, the fade-out animation never starts, onAnimationFinish is never called, and the splash screen (positioned absolute z-50 covering the full screen) remains visible indefinitely. Since isAnimationStarted is set to true before the async call, retries are also blocked. The app appears frozen with no way for the user to recover except force-quitting.

Fix in Cursor Fix in Web

@@ -0,0 +1,18 @@
import { client, TanstackQueryClient } from '@/apis/client';
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Unused import in feedback API file

Low Severity

TanstackQueryClient is imported from @/apis/client but never used in the file. The mutation only uses the client import and useMutation from tanstack. This dead import should be removed.

Fix in Cursor Fix in Web

const iosGoogleServicesFile = process.env.IOS_GOOGLE_SERVICES_PLIST || './GoogleService-Info.plist';

const isDev =
process.env.APP_VARIANT === 'development' || process.env.EAS_BUILD_PROFILE === 'development';
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Unused variable isDev in app config

Low Severity

The isDev variable is defined based on APP_VARIANT and EAS_BUILD_PROFILE environment variables but is never used anywhere in the configuration file. This is dead code that should either be removed or used for its intended purpose.

Fix in Cursor Fix in Web

});
};

export default postSignUpLocal;
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Duplicate and unused postSignUpLocal function

Medium Severity

postSignUpLocal duplicates postEmailSignup - both call the same endpoint /api/student/auth/signup/local with the same request type StudentSignupReq. Additionally, postSignUpLocal is exported but never imported or used anywhere in the codebase. This creates maintenance burden and confusion about which function to use.

Fix in Cursor Fix in Web

};

export default useSubscribeQnaList;
export type { ConnectionStatus, ReconnectConfig, QnAListEvent };
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Massive code duplication in SSE subscription hooks

Medium Severity

useGetSubscribeQnaList.ts (373 lines) duplicates nearly all logic from useGetSubscribeQna.ts (409 lines). Both share identical: ConnectionStatus type, ReconnectConfig type, DEFAULT_RECONNECT_CONFIG, exponential backoff logic, timer management, heartbeat timeout handling, app state change handling, network state handling, and connection lifecycle. Only the URL endpoint and event types differ. This should be refactored into a shared base SSE hook.

Additional Locations (1)

Fix in Cursor Fix in Web

} from 'lucide-react-native';
import { AnimatedPressable, Container } from '@components/common';
import useEmailAuth, {
type EmailAuthStep,
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Unused type import in EmailAuthSheet

Low Severity

The type EmailAuthStep is imported from useEmailAuth but is never used in the component. The step logic uses the step value from the hook directly in switch statements without type annotations requiring this import.

Fix in Cursor Fix in Web

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants