BikeControl (SwiftControl)
Use Zwift Click, Zwift Play, Shimano Di2, or any Bluetooth controller with MyWhoosh, Rouvy, Zwift, and more. Free to try on iOS, Android, Windows, and macOS.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Outil de désignation des arbitres pour le CD45. Next.js (App Router) + TypeScript + Supabase (Postgres + Auth), via @supabase/supabase-js.README 전문 보기 ↗
Outil de désignation des arbitres pour le CD45. Next.js (App Router) +
TypeScript + Supabase (Postgres + Auth), via @supabase/supabase-js.
/admin/import, réservé ADMIN) :
colonnes Équipe domicile / Équipe extérieur / Date / Heure / Lieu / Niveau,
avec alias reconnus (Equipe 1/Equipe 2, Salle, Code) pour être compatible
directement avec l'export "Recherche désignation" de FFBB Compet.
Idempotent - un match déjà présent (même date, mêmes équipes, même niveau)
est complété/mis à jour plutôt que dupliqué, donc le même fichier peut être
réimporté sans risque. Les niveaux de compétition inconnus sont créés
automatiquement./matchs/nouveau, /matchs/[id]/modifier) et des
arbitres (/arbitres/nouveau, /arbitres/[id]/modifier) : créer, modifier,
annuler/désactiver, supprimer/admin/utilisateurs, réservé ADMIN)/matchs/incomplets) : sélection de matchs via
cases à cocher, assigne directement la meilleure suggestion à chaque
créneau vacant sans écran de confirmation intermédiairesrc/lib/designation-rules.ts, page /reglement) :
quotas par arbitre (max 3 désignations/semaine, max 3/week-end) vérifiés
avant toute désignation (manuelle ou auto), avec pop-up d'alerte en cas de
blocage. Liste vouée à être complétée au fur et à mesure des règles du CD45Le projet parle directement à Supabase via @supabase/supabase-js (pas
d'ORM). Deux clients :
src/lib/supabase/server.ts : client lié à la session du visiteur
(cookies), utilisé uniquement pour l'authentification (login/signup/
session Supabase Auth)src/lib/supabase/admin.ts : client "service_role", utilisé pour toutes
les données applicatives (matchs, arbitres, désignations...). Contourne
volontairement les policies RLS - l'autorisation (qui peut faire quoi)
est vérifiée par notre propre code (getCurrentUser() + rôle), jamais
par la basesupabase/schema.sql et supabase/seed.sql documentent le schéma et les
données de référence (déjà appliqués sur le projet). Ce ne sont pas des
migrations exécutées automatiquement : toute évolution de schéma se fait
en SQL direct sur le projet Supabase (dashboard > SQL editor, ou les
outils MCP Supabase), puis en mettant à jour supabase/schema.sql.
L'authentification passe entièrement par le service Auth natif de Supabase
(GoTrue), via @supabase/ssr. Deux pages : /login et /signup
(inscription libre, ouverte à qui a l'URL - pas de code d'invitation).
Un nouveau compte créé via /signup obtient le rôle REPARTITEUR par
défaut ; à évaluer si un contrôle d'accès plus strict devient nécessaire
(code d'invitation, validation manuelle...).
Table Profile (schéma public) : id = auth.users.id, email, name,
role (ADMIN ou REPARTITEUR, défaut REPARTITEUR). Un trigger Postgres
(handle_new_user, voir supabase/schema.sql) crée automatiquement la
ligne Profile à chaque nouvelle inscription dans auth.users, que ce
soit via /signup ou créée manuellement depuis le dashboard Supabase.
Créer un compte manuellement (alternative à /signup) : dashboard
Supabase > Authentication > Users > Add user (cocher "Auto Confirm User"
pour se connecter immédiatement sans email de confirmation).
Promouvoir un compte en ADMIN (accès à /admin/niveaux) :
UPDATE "Profile" SET role = 'ADMIN' WHERE email = '[email protected]';
NEXT_PUBLIC_SUPABASE_URL, NEXT_PUBLIC_SUPABASE_ANON_KEY : URL et clé
publique du projet Supabase (Project Settings > API)SUPABASE_SERVICE_ROLE_KEY : clé secrète (même page, section
"service_role") - ne jamais l'exposer côté client, uniquement utilisée
dans du code serveur (src/lib/supabase/admin.ts)GOOGLE_MAPS_API_KEY (optionnelle) : clé API Google Cloud avec la
Geocoding API activée. Sert à convertir l'adresse d'un arbitre et
l'adresse d'un gymnase en coordonnées GPS, pour prioriser les
suggestions par proximité et estimer la rémunération (40€/match +
0,35€/km aller-retour). Sans cette variable, l'app fonctionne
normalement, juste sans ce tri par distance ni cette estimation.Piège fréquent en collant une valeur dans les Environment Variables de
Vercel : ne pas inclure les guillemets (le format .env en a, Vercel
non) - une URL du genre "https://...supabase.co" avec les guillemets
inclus est invalide et fait planter toutes les pages (500 générique). Le
code tente de nettoyer ça automatiquement (src/lib/supabase/env.ts),
mais autant coller la valeur propre dès le départ.
npm install
npm run dev
Créer ensuite un compte via /signup ou le dashboard Supabase (voir
section Authentification ci-dessus) pour pouvoir te connecter.
claude/referee-assignment-system-zy1i9t (ou main une fois mergé),
renseigner les trois variables d'environnement ci-dessus (cocher
Production + Preview pour chacune), puis déployer.