Skip to content

merge: Develop - #215

Open
hyxx-su wants to merge 367 commits into
mainfrom
develop
Open

merge: Develop#215
hyxx-su wants to merge 367 commits into
mainfrom
develop

Conversation

@hyxx-su

@hyxx-su hyxx-su commented Jul 13, 2026

Copy link
Copy Markdown
Contributor

테스트 방법

  • 단위 테스트 추가/수정
  • 통합 테스트 완료
  • 수동 테스트 완료

체크리스트

  • 코드가 프로젝트의 코딩 스타일을 따릅니다
  • 자체 코드 리뷰를 완료했습니다
  • 변경 사항에 대한 테스트를 추가했습니다
  • Breaking Changes가 없습니다

기타 사항

seunga418 and others added 30 commits June 22, 2026 23:45
feature: #182 로그인 서버 연결
feature: #188 예약 페이지 서버 연결
Divanzo and others added 24 commits July 6, 2026 23:48
- 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>
feat: 로그아웃 기능 및 홈 프로필 이동 추가
Tailwind @layer utilities가 @layer base를 덮어써서 text-[0.75rem] 등
16px 미만 클래스가 input에 적용되어 iOS에서 포커스 시 자동 확대 발생.
@layer 밖에 배치해 모든 레이어보다 우선 적용되도록 수정.
dev/build 빌드 모두 동일하게 적용됨.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
fix: iOS input focus zoom 방지 - @layer 외부로 font-size 규칙 이동
feat: mobile reservation api/#145
feature: #184 데스크탑 서버 연결
@hyxx-su hyxx-su self-assigned this Jul 13, 2026
@hyxx-su hyxx-su added the enhancement New feature or request label Jul 13, 2026
@vercel

vercel Bot commented Jul 13, 2026

Copy link
Copy Markdown

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

Project Deployment Actions Updated (UTC)
heddy-mobile Ready Ready Preview, Comment Jul 13, 2026 5:02am

@O2-DGSW O2-DGSW deleted a comment from gemini-code-assist Bot Jul 13, 2026
@O2-DGSW O2-DGSW deleted a comment from gemini-code-assist Bot Jul 13, 2026

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

if (option === "changeRequest") {
onSelectStatus(row.id, option);
onOpenTimeChangeModal(row.id);

P2 Badge Persist change requests only after a time is chosen

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(),

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge 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");

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge 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 👍 / 👎.

Comment on lines +60 to +61
date: formattedToday,
end_date: formattedNextMonth,

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge 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 👍 / 👎.

Comment on lines +46 to +47
startTime={shopScheduleData?.data?.start_time || "00:00"}
endTime={shopScheduleData?.data?.end_time || "00:00"}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge 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 👍 / 👎.

Comment on lines +9 to +12
const statusMap: Record<string, ReservationStatus> = {
APPROVED: "approve",
REJECTED: "reject",
TIME_CHANGED: "time-change",

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge 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(", "),

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge 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),

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge 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 👍 / 👎.

Comment on lines +59 to +60
const myShopId = myInfo?.data?.shopMembers[0]?.shopId;
const shopData = useShopInfoQuery({ shopId: myShopId });

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge 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,

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge 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 👍 / 👎.

Comment on lines +526 to +533
if (!values.id) {
showErrorToastFromError(
new Error(
"예약 생성 API에는 고객/서비스 정보가 필요하지만 현재 스케줄 모달에는 해당 입력이 없어 저장하지 않았습니다."
),
"스케줄을 저장하지 못했습니다."
);
return;

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge 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 👍 / 👎.

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

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants