Conversation
- FindPage, SignupPage에 뒤로가기 버튼 추가 - useSignup에 step별 goBack 로직 추가 - 로그인 폼 아이디/비번 찾기 링크 경로 수정 (/find-id → /find/id) - FindPasswordForm step2에 resetPasswordApi 연결 및 성공 시 로그인 이동 - 설정 전용 비밀번호 변경 페이지(/change-password) 신규 생성 - EditSetting 비밀번호 화살표를 /change-password로 연결 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- 전화번호·인증번호 버튼에 shrink-0, w-[4.5rem] 적용 - 입력창에 min-w-0, overflow-hidden 추가로 좁은 화면에서도 짤림 방지 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- App.tsx: hash path 쿼리스트링 제거 (.split('?')[0])
- index.html: maximum-scale=1.0 제거 (iOS zoom은 CSS로 처리)
- customerApi: 시술기록 등록 파라미터 query string → FormData body 이전
- useEditProfile/EditSetting: 하드코딩 SKT 제거, 통신사 선택 UI 추가
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
refactor: #204 앱 실행이 일어나는 문제점 해결
- POST /auth/logout API 연결 - 프로필 페이지 로그아웃 버튼 추가 (2차 확인 다이얼로그) - 홈 화면 프로필 이미지 클릭 시 /profile 이동 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
feat: 로그아웃 기능 및 홈 프로필 이동 추가
fix: iOS input focus zoom 방지 - @layer 외부로 font-size 규칙 이동
feat: mobile reservation api/#145
…eature/#184-데스크탑-서버-연결
feature: #184 데스크탑 서버 연결
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
There was a problem hiding this comment.
💡 Codex Review
Selecting the “변경 요청” option now calls onSelectStatus before opening the time-change modal, and this commit wires that handler to updateReservationStatusApi. If the user cancels the modal or closes it without saving a new time, the server has already been updated to CHANGE_REQUEST with no changed_time, leaving the reservation in an incomplete state.
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| const requestBody: ReservationRequest = { | ||
| shop_id: myShopId, | ||
| designer_id: selectedDesignerId, | ||
| reserved_at: new Date(selectedDate).toISOString(), |
There was a problem hiding this comment.
Collect a reservation time before posting
Every mobile reservation created from this flow is sent with only the selected calendar date converted via new Date(selectedDate).toISOString(). Because the page never captures a time, selectedDate is a YYYY-MM-DD value from the calendar and this serializes all bookings to midnight/UTC rather than the time the customer intended, so saved reservations will appear at the wrong slot.
Useful? React with 👍 / 👎.
|
|
||
| const redirectToLogin = () => { | ||
| if (typeof window !== "undefined" && window.location.pathname !== "/login") { | ||
| window.location.replace("/login"); |
There was a problem hiding this comment.
Use a hash route for mobile login redirects
The mobile app now renders inside HashRouter, so route navigation should target #/login or use router navigation. When an expired-token or missing-token API request hits this interceptor, window.location.replace('/login') drops the hash route and navigates the document path instead; in Capacitor/static builds without a /login server fallback this leaves the SPA instead of showing the login screen.
Useful? React with 👍 / 👎.
| date: formattedToday, | ||
| end_date: formattedNextMonth, |
There was a problem hiding this comment.
Fetch reservations for the selected schedule date
The shop schedule filters reservations by targetDateStr, but the API request is always fixed to the today→next-month window. When the user navigates the calendar to a date outside that window, the work schedule query updates for the selected date but filteredReservations can only see the stale range, so the UI incorrectly says there are no reservations even when that selected day has bookings.
Useful? React with 👍 / 👎.
| startTime={shopScheduleData?.data?.start_time || "00:00"} | ||
| endTime={shopScheduleData?.data?.end_time || "00:00"} |
There was a problem hiding this comment.
Use reservation times in schedule entries
Each reservation row is rendered with the designer work-schedule start/end time instead of the reservation's own reserved_at time. On any day where a booking is not exactly the full work shift (or there are multiple bookings), all entries display the same shift hours, so users cannot see the actual appointment times.
Useful? React with 👍 / 👎.
| const statusMap: Record<string, ReservationStatus> = { | ||
| APPROVED: "approve", | ||
| REJECTED: "reject", | ||
| TIME_CHANGED: "time-change", |
There was a problem hiding this comment.
Handle CHANGE_REQUEST statuses before rendering
The API status used elsewhere in this commit is CHANGE_REQUEST, but this map only handles TIME_CHANGED; when a change-request reservation is returned, the fallback produces change_request, which is not a key in STATUS_CONFIG, and ReservationStatusDropdown crashes while destructuring the missing config.
Useful? React with 👍 / 👎.
| ): ProcedureNote => ({ | ||
| id: String(record.record_id), | ||
| customerName, | ||
| title: record.service_tags.join(", "), |
There was a problem hiding this comment.
Use the record title in cut notes
The add-record flow submits an optional title, and the response type includes title, but the mapper always replaces it with service_tags.join(', '). Records saved with a meaningful title (or with no tags) will display the wrong/blank title in the cuts list and detail page.
Useful? React with 👍 / 👎.
| customerName, | ||
| title: record.service_tags.join(", "), | ||
| description: record.memo, | ||
| date: new Date(record.created_at), |
There was a problem hiding this comment.
Display treatment_date instead of creation time
Treatment records include a treatment_date, and the add-record page explicitly collects that date, but the list/detail mapper displays created_at instead. Any backdated or past treatment entered today will appear under today's registration date rather than the actual service date.
Useful? React with 👍 / 👎.
| const myShopId = myInfo?.data?.shopMembers[0]?.shopId; | ||
| const shopData = useShopInfoQuery({ shopId: myShopId }); |
There was a problem hiding this comment.
Select a target shop instead of the user's shop
The mobile reservation page is exposed to customer users, but it derives the reservation target from myInfo.data.shopMembers[0]. Customer profiles do not have a shop membership to book against, and the page has no separate shop selection, so those users hit the “매장 정보가 존재하지 않습니다” path and can never create a reservation.
Useful? React with 👍 / 👎.
| const reservationManagementData = useGetShopReservationManageQuery( | ||
| { | ||
| shop_id: shopId ?? 0, | ||
| designer_id: userId ?? 0, |
There was a problem hiding this comment.
Use an actual designer id for shop reservation filters
For owner accounts, /shop/reservation is visible because only customers are filtered out of the shop tab, but this request sends the current user's userId as designer_id. Owners are not necessarily designers in shopInfo.designers, so the API is filtered to a non-existent designer and the reservation list appears empty for the users who need to manage the shop.
Useful? React with 👍 / 👎.
| if (!values.id) { | ||
| showErrorToastFromError( | ||
| new Error( | ||
| "예약 생성 API에는 고객/서비스 정보가 필요하지만 현재 스케줄 모달에는 해당 입력이 없어 저장하지 않았습니다." | ||
| ), | ||
| "스케줄을 저장하지 못했습니다." | ||
| ); | ||
| return; |
There was a problem hiding this comment.
Hide or implement the add-schedule save path
The schedule board still exposes the “스케줄 추가” button, but any new modal submission has no values.id, so this branch always shows an error and returns without saving. As a result, users can fill out the add-schedule modal but every attempt to create a new schedule fails by design.
Useful? React with 👍 / 👎.
테스트 방법
체크리스트
기타 사항