尚未收集仓库信息。
尚未检测到更新。GitHub 发布版本后会显示在这里。
GE Vernova Tennis League
翻译准备中
取自仓库 README
正在加载完整 README。
查看完整 README ↗GE Vernova Tennis League — Version 1.2.0
Native mobile migration (in progress): the goal is a Kotlin Android client and a Swift iOS client replacing the Expo app. Kotlin domain and repository sources live under
apps/mobile/android/app/src/main/java, and Swift sources underapps/mobile/ios. Both compile alongside the shipping client, which is still Expo/React Native:MainActivityis aReactActivityand the Android app hosts Metro and a JavaScript runtime as before. A native UI takes over as the launcher only after it reaches the acceptance gates indocs/native-mobile-parity-inventory.md, and the Expo sources are removed only after that.
Native entry points are pnpm android:test (Kotlin unit tests), pnpm android:build, pnpm android:release, pnpm ios:test, and pnpm ios:typecheck. The Android Gradle build resolves its React Native and Expo plugins through Node, so run pnpm install before any android:* task. ios:test runs the tests of apps/mobile/ios/TennisKit, the Swift package that holds the iOS client's scoring and ranking engines and view models, and works on macOS or Linux with Swift 6. There is no Xcode project yet, so ios:typecheck (macOS only) typechecks the SwiftUI app and watch sources against the simulator SDKs instead of building them; apps/mobile/ios/README.md covers what the iOS client does and how to create the project. Platform Firebase files come from the existing environment credential workflow rather than from migration commits.
TennisScoring is a functional, deployable pnpm/Turborepo monorepo for league tennis scoring across a Next.js web app, an Expo React Native mobile app, Firebase Cloud Functions, Firestore/Storage security rules, and companion wearable code for Wear OS and Apple Watch. Version 1.0.1 marked the first documented repository baseline that is ready to build, test, deploy, and extend with the next round of web and mobile features; 1.0.2 added mobile account deletion and message reporting/blocking; 1.0.3 added the round-robin match scheduler; 1.0.4 adds a privacy policy (in-app screen and a public web page); 1.0.5 fixes the mobile privacy policy screen so it's reachable before signing in, and links it from the login/signup screen; 1.1.0 adds doubles match tracking and fixed-partnership team standings; 1.2.0 adds required email verification, a dark theme that follows the device setting on web and mobile, portrait tablet layouts, leader resolution of match results, password reset, and 10-point match tiebreaks for hand-recorded results. CHANGELOG.md lists every change.
Status: the web application is live and functional. The mobile application is usable today via a sideloaded Android APK build, but is still being refined — the Google Play Store listing is being finalized ahead of a public release.
1.2.0 in the workspace manifests and Expo app metadata.tennis-auth session cookie through next-firebase-auth-edge middleware.TennisKit tests. Point-in-time security and UI/UX reviews are kept in this repository.submitFeedback Cloud Function; GitHub issue creation happens only server-side through a Functions secret.apps/web.apps/mobile.firebase.apps/mobile.pnpm.overrides pin it, although apps/web/package.json declares React 19), Firebase Web SDK, next-firebase-auth-edge.firebase-admin, pdf-lib.@tennis/shared for domain logic and @tennis/firebase-client for Firebase SDK wrappers/hooks.@tennis/shared, node:test suites against the Firebase emulators for rules and Cloud Functions, Kotlin unit tests for the Android module, and XCTest for the Swift TennisKit package.apps/
mobile/ Expo React Native app, Android project, Wear OS app/module, native iOS and watchOS sources
web/ Next.js web app, API routes, auth middleware, shared web UI components
firebase/ Cloud Functions source, Firebase config, Firestore indexes/rules, Storage rules
packages/
firebase-client/ Shared Firebase config, typed collections, callable wrappers, and React hooks
shared/ Shared TypeScript types, scoring/ranking engines, profile utilities, and tips
fixtures/mobile-contract/ Engine parity fixture shared by the TypeScript, Kotlin, and Swift tests
scripts/ Repository maintenance, backfill, rules-guard, codegen, and fixture scripts
design/ Standalone design previews
docs/ Plans, references, and point-in-time audits
.github/workflows/ CI, native iOS checks, EAS Android builds, debug APK build, and Firebase Functions and rules deploy workflows
The @tennis/shared package is the canonical location for reusable domain code. Current exports include:
MATCH_STATUS_METADATA and getMatchStatusMetadata for consistent status labels, colors, tones, icons, and accessibility labels.createInitialScore, applyPoint, formatScoreDisplay, and formatGameScore.computeRankings, computeDoublesRankings, updateRankingWithMatchResult, and extractMatchTotals.getMatchMoment for the live match's current moment (deuce, break point, tiebreak, and so on), and validateRecordedSets/buildRecordedMatchScore for hand-recorded results.sidePlayerIds, sideOfPlayer, isDoublesMatch, canRespondToReport, and doublesTeamId.generateRoundRobinSchedule for round-robin fixtures, and roster-import helpers such as parseRosterPaste.PRIVACY_POLICY_SECTIONS) shown by both apps.addAvailabilitySlot, updateAvailabilitySlot, removeAvailabilitySlot, cycleAvailabilitySlotDay, validateAvailabilitySlots, buildAvailability, and buildUserProfileUpdates.When adding logic used by more than one app/package, add it to packages/shared and import it from @tennis/shared instead of duplicating it in web, mobile, or Firebase code.
The @tennis/firebase-client package centralizes client-side Firebase access for web and mobile:
NEXT_PUBLIC_FIREBASE_* or EXPO_PUBLIC_FIREBASE_* environment variables.app, db, auth, storage, functions, and getMessagingIfSupported.App code should prefer these exports over ad-hoc Firebase SDK wiring.
pnpm install
pnpm --filter @tennis/shared test -- --runInBand
pnpm typecheck
pnpm lint
pnpm --filter @tennis/web dev
pnpm --filter @tennis/mobile start
cd firebase && pnpm serve
pnpm --filter @tennis/shared test -- --runInBand
pnpm typecheck
pnpm lint
pnpm test
pnpm build
CI runs lint_typecheck (install, typecheck, lint, build) unconditionally, plus path-filtered jobs: shared_tests when packages/shared/** or root workspace files change; firebase_rules_tests when firebase/** or packages/shared/** changes (rules guard, emulator rules tests, emulator Cloud Functions tests, then pnpm audit --audit-level=high with an OSV-scanner fallback deciding the final verdict); and mobile_bundle and mobile_native when apps/mobile/**, packages/**, or root manifests change (Metro and Hermes release bundle, Kotlin unit tests, and a native Android build of the phone and watch apps). .github/workflows/native-mobile.yml runs the Swift tests and iOS typecheck on macOS. See CLAUDE.md for the full pipeline breakdown.
APP_BASE_URL, and targeted deploy notes.Open design/live-scoring-layout-preview.html in a browser to review and edit a standalone mock of the mobile live scoring layout. Use the Copy feedback JSON button to capture layout notes that can be applied back to apps/mobile/app/match/[id].tsx.
The v1 baseline should be treated as the known-good starting point for future feature work. Before adding features:
packages/shared.@tennis/firebase-client where practical.GE Vernova Tennis League — All skill levels welcome!