Strength Training Tracker
An open-source strength training tracker: log sets and reps on your phone, see how each lift moves, and start every session from your own numbers.
풋살 용병 모집부터 참가 신청, 1:1 실시간 채팅까지 한 곳에서
Translation pending
Sports & fitnessTypeScript · CSSGitHub @oldwater0224OnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗futsal with chat — 풋살 용병 모집부터 참가 신청, 실시간 채팅까지 한 곳에서
용병을 구하는 경기 주최자와 참여하려는 사용자가 바로 대화할 수 있는 풋살 용병 매칭 서비스입니다. 기존 용병 모집 방식에서는 주최자와 소통할 창구가 부족하다는 문제에서 출발했습니다. 모집글, 참가 신청, 1:1 실시간 채팅을 하나의 흐름으로 연결했습니다.
배포 https://chatfutsal.vercel.app · 버전 0.1.0
jsonwebtoken)을 발급해 기존 유저 시스템과 통합N자리 남음 / 마감임박 / 마감 배지closed 처리closed로 갱신
applicantIds)onSnapshot 기반 1:1 실시간 채팅| 구분 | 사용 기술 |
|---|---|
| Framework | Next.js 16 (App Router), React 19 |
| Language | TypeScript |
| Styling | Tailwind CSS 4, shadcn/ui (Radix UI), lucide-react |
| Backend (BaaS) | Firebase Authentication, Cloud Firestore |
| Server | Next.js API Route, jsonwebtoken (Firebase Custom Token 서명) |
| 외부 API | Kakao Login (OAuth), Kakao Maps JavaScript API / Places |
| Test | Vitest |
| Deploy | Vercel |
| 경로 | 설명 |
|---|---|
/ | 모집글 목록 (검색 · 날짜 · 지역 · 레벨 필터) |
/recruit/[postId] | 모집글 상세 · 지도 · 참가 신청 |
/recruit/[postId]/edit | 모집글 수정 |
/create | 모집글 작성 |
/chat | 채팅방 목록 |
/chat/[roomId] | 채팅방 |
/notifications | 알림 목록 |
/mypage | 마이페이지 |
/mypage/recruits | 내가 작성한 모집글 |
/mypage/applications | 내가 신청한 모집 |
/users/[userId] | 사용자 프로필 |
/login, /signup | 로그인 · 회원가입 |
/auth/kakao/callback | 카카오 로그인 콜백 |
src/
├── app/ # 페이지 (App Router)
│ └── api/auth/kakao/ # 카카오 로그인 → Firebase Custom Token 발급
├── components/ # UI 컴포넌트 (Header, SubHeader, RecruitCard, ChatRoom, KakaoMapSearch 등)
│ └── ui/styles.ts # 공통 버튼 · 입력 필드 스타일
├── hooks/ # 실시간 구독 훅 (useRecruitPosts, useMessage, useNotifications 등)
├── lib/
│ ├── firebase/ # Firebase 클라이언트 초기화 · 에러 메시지 처리
│ ├── firebase-admin.ts # Firebase Custom Token 생성 (서버 전용)
│ ├── services/ # Firestore 쓰기 로직 (recruit, application, chat, notification)
│ └── utils/ # 날짜 포맷 · 만료 판별 유틸 (단위 테스트 포함)
└── types/ # 공통 타입 정의
읽기는 hooks에서 onSnapshot으로 실시간 구독하고, 쓰기는 services에 모아 역할을 분리했습니다.
firestore/
├── users/{userId} # 사용자 정보 (provider: email | kakao)
├── recruitPosts/{postId} # 모집글 (status, needCount, acceptedCount, applicantIds, locationCoord)
├── applications/{applicationId} # 참가 신청 (status: pending | accepted | rejected)
├── notifications/{notificationId} # 알림 (recipientId, type, isRead, link)
└── chatRooms/{roomId} # 채팅방 (participants, lastMessage)
└── messages/{messageId} # 메시지 (readBy로 읽음 처리)
KOE320(인가 코드 없음)으로 실패useRef로 막으려 했지만 재마운트 시 ref가 초기화되어 효과가 없었다.Set에 기록해 같은 코드는 한 번만 교환하도록 했다.FUNCTION_INVOCATION_FAILEDfirebase-admin이 의존하는 jose v5가 ESM 전용 패키지라, 서버리스 함수 런타임에서 require()로 불러오다 ERR_REQUIRE_ESM이 발생했다. serverExternalPackages 설정으로도 해결되지 않았다.firebase-admin을 제거하고 jsonwebtoken으로 직접 서명했다. 의존성 크기도 함께 줄었다.onSnapshot 리스너는 종료되고 재시도하지 않는다.permission-denied)는 "데이터 없음"과 구분해 로그인 안내 화면을 보여준다.git clone https://github.com/oldwater0224/chatfutsal.git
cd chatfutsal
npm install
npm run dev
프로젝트 루트에 .env.local을 만들고 아래 값을 채워야 합니다.
# Firebase (Client)
NEXT_PUBLIC_FIREBASE_API_KEY=
NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN=
NEXT_PUBLIC_FIREBASE_PROJECT_ID=
NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET=
NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID=
NEXT_PUBLIC_FIREBASE_APP_ID=
# Firebase 서비스 계정 (Server, 카카오 로그인 Custom Token 서명용)
FIREBASE_ADMIN_CLIENT_EMAIL=
FIREBASE_ADMIN_PRIVATE_KEY=
# Kakao
NEXT_PUBLIC_KAKAO_MAP_JS_KEY=
NEXT_PUBLIC_KAKAO_REST_API_KEY=
NEXT_PUBLIC_KAKAO_REDIRECT_URI=
KAKAO_CLIENT_SECRET=
테스트 실행
npm test
카카오맵과 카카오 로그인을 사용하려면 Kakao Developers에 사이트 도메인(
http://localhost:3000등)과 Redirect URI를 등록해야 합니다.