chatmu · .scratch/commit-button · 티켓 01
한글을 치는 중에 버튼을 누르면 아무 일도 안 일어난다. 그것을 막는 규율이 일곱 자리에 손으로 적혀 있었고, 여섯이 반쪽이었다. 낱말은 CONTEXT.md 의 것을 쓴다.
한글을 치는 사람이 버튼을 누른다. IME 가 조합 중이다. 아무 일도 안 일어난다.
이 순서로 사라진다:
고치는 법은 이미 알고 있었다 — pointerup·mouseup 에도 건다.
그러면 그중 하나만 세어 남겨야 한다. 빠져 있던 것이 이 뒷반쪽이다.
앞반쪽(세 이벤트에 건다)은 여러 자리가 손으로 적고 있었다. 뒷반쪽(세어서 하나만)은 한 자리에만 있었다.
스펙은 여섯 자리라고 적었다. 세어 보니 일곱이었다.
| 한 번 누르면 일어나는 일 | 두 번 일어나면 | 무엇이 막고 있었나 | |
|---|---|---|---|
| 1 | 굵게·기울임·목록을 건다composer/Toolbar.tsx | 걸었다 풀었다 다시 건다 | 버튼 |
| 2 | Room 에 Message 를 만든다composer/PlateComposer.tsx | 같은 Message 가 두 줄 간다 | 핸들러 |
| 3 | 이모지 패널을 연다composer/EmojiButton.tsx | 아무 일도 아니다 — 두 번 열어도 열린 것이다 | 동작 자체 |
| 4 | User 를 만든다app/signup/page.tsx | 가입 요청이 세 건 나간다 | 핸들러 |
| 5 | User 의 비밀번호를 바꾼다app/account/page.tsx | 같은 변경이 두 번 나간다 | 핸들러 |
| 6 | Room 을 만든다app/rooms/RoomSidebar.tsx | 같은 이름의 Room 이 둘 생긴다 | 핸들러 |
| 7 | Message 를 고친다app/rooms/[roomId]/MessageEditSession.tsx | 같은 변경이 두 번 나간다 | 핸들러 |
스펙 표에 없던 자리다. 그리고 여섯 중 어느 것보다도 반쪽이었다.
mouseup 하나만 걸려 있었다 — pointerup 이 아예 없었다.
그런데도 아무 증상이 없었다. 핸들러의 깃발이 뒤에서 두 번째 호출을 막고 있었기 때문이다.
이 티켓이 없애려는 모양이 정확히 그것이다.
브라우저 검사가 개수를 센다. 이미 세고 있던 자리는 셋이다 — 발신 · 가입 · 방 만들기.
| 자리 | 검사 | 재는 대상 |
|---|---|---|
| Message 발신 세고 있다 | Room 에 확정된 Message 수 = 1 | 핸들러 |
| User 만들기 세고 있다 | 가입 요청 수 = 1 | 핸들러 |
| Room 만들기 세고 있다 | 그 이름의 Room 수 = 1 | 핸들러 |
| 서식(굵게) | 누른 뒤 굵게가 걸려 있다 | 버튼 · 다만 한 길만 |
| 이모지 | 패널이 열린다 | 개수를 안 잰다 |
| 비밀번호 | — | 검사가 없다 |
| Message 고치기 | — | 개수를 안 잰다 |
그리고 그것이 이 변경의 근거이기도 하다 — 규율을 사람이 읽을 수 있는 자리, 즉 버튼에 둔다.
평범한 마우스로 「굵게」를 한 번 누르면 굵게가 정확히 한 번 뒤집혀야 한다.
서식은 토글이라 횟수가 결과에 남는 유일한 자리다.
기존 검사는 mouseup 하나만 오는 길만 봤다 — 세 이벤트가 다 오는 길은 아무도 안 지나갔다.
버튼 하나를 냈다 — frontend/lib/pressOnce.tsx
부르는 쪽은 핸들러 하나만 준다. 네 갈래(pointerup·mouseup·click·폼 제출)는 버튼이 소유한다.
왜 lib/ 인가: 일곱 중 넷이 화면이다. 입력창 모듈 안에 두면 가입 화면이 입력창 모듈을 import 한다 — 방향이 거꾸로다. 화면 쪽에 두면 이번엔 모듈이 화면을 import 한다. 같은 벽을 반대로 넘는다.
「한 번만」을 기본으로 하고, 예외 스위치를 안 뒀다
일곱 중 여섯이 「한 번만」이 필요하고 하나는 상관없다. 지금까지는 안전한 쪽이 예외였다.
스위치를 두면 그 판단이 다시 핸들러로 간다 — 지금 없애려는 모양이 그것이다.
핸들러는 한 줄도 안 바꿨다
깃발도, 「값을 읽자마자 입력창을 비운다」도 그대로다. 막는 것이 다르기 때문이다 — 느린 네트워크에 정말로 두 번 누르는 사람이다. 조작이 둘이면 버튼은 원리상 못 막는다.
바꾼 것은 주석뿐이다.
폼 버튼 넷의 type="submit" 은 유지했다
제출 버튼이 없으면 입력칸이 둘 이상인 폼은 Enter 로 제출되지 않는다. 가입 폼은 칸이 넷이다.
대신 버튼이 click 의 기본 동작을 막는다. 그래서 폼과 겹쳐도 일이 두 번 일어나지 않는다.
관문을 하나도 안 돌렸다. 사용자가 돌려야 한다.