import { useCollection, useIdentity } from '@deplixo/sdk'; import ProfileView from './components/ProfileView.jsx'; import StatsView from './components/StatsView.jsx'; import TrainingView from './components/TrainingView.jsx'; import CoachView from './components/CoachView.jsx'; import ChallengesView from './components/ChallengesView.jsx'; import BlogView from './components/BlogView.jsx'; import FriendsView from './components/FriendsView.jsx'; import PremiumView from './components/PremiumView.jsx'; import { IconUser, IconChart, IconDumbbell, IconSpark, IconBall, IconTrophy, IconBook, IconUsers } from './components/icons.jsx'; // Tabs restricted to Premium accounts (free accounts see an upsell) const PREMIUM_TABS = new Set(['coach', 'blog', 'friends']); function PremiumLock({ tab, onGoPremium }) { const labels = { coach: 'Coach IA', blog: 'Blog & conseils', friends: 'Amis & classements', }; return (

🔒 {labels[tab] || 'Fonctionnalité'} — Premium

Cette section est réservée aux membres FootRise Premium (4,99 €/mois).

); } function SignupGate({ signIn }) { return (
FootRise
Crée ton compte gratuit

âš˝ Bienvenue sur FootRise

Crée un compte gratuit pour suivre tes matchs, tes entraînements et progresser.

Compte gratuit
  • Profil de joueur & statistiques de base
  • Journal d’entraĂ®nement
  • DĂ©fis simples
Coach IA, Blog et Amis sont réservés à Premium (4,99 €/mois).
); } function App() { const { user, signIn } = useIdentity(); const [tab, setTab] = useState('profile'); // Per-user collections (filter by author.id) const { items: allProfiles, add: addProfile, update: updateProfile } = useCollection('profiles'); const { items: allMatches, add: addMatchRaw, remove: removeMatch } = useCollection('matches'); const { items: allTrainings, add: addTrainingRaw, remove: removeTraining } = useCollection('trainings'); const { items: allFriends, add: addFriend, remove: removeFriend } = useCollection('friends'); const { items: allSubs } = useCollection('subscriptions'); if (!user) { return {}} />; } const mySub = (allSubs || []).find(s => s.author?.id === user?.id)?.value; const isPremium = !!(mySub && mySub.status === 'active' && mySub.renewsAt && new Date(mySub.renewsAt).getTime() > Date.now()); const myProfileItem = (allProfiles || []).find(p => p.author?.id === user?.id); const profile = myProfileItem?.value; const matches = (allMatches || []) .filter(m => m.author?.id === user?.id) .map(m => ({ id: m.id, ...m.value })) .sort((a, b) => new Date(b.date) - new Date(a.date)); const trainings = (allTrainings || []) .filter(t => t.author?.id === user?.id) .map(t => ({ id: t.id, ...t.value })) .sort((a, b) => new Date(b.date) - new Date(a.date)); const stats = { matches: matches.length, goals: matches.reduce((s, m) => s + (m.goals || 0), 0), assists: matches.reduce((s, m) => s + (m.assists || 0), 0), trainings: trainings.length, wins: matches.filter(m => m.result === 'V').length, avgRating: matches.length ? (matches.reduce((s, m) => s + (m.rating || 0), 0) / matches.length) : 0, }; const saveProfile = (data) => { if (myProfileItem) updateProfile(myProfileItem.id, data); else addProfile(data); }; const addMatch = (data) => addMatchRaw(data); const addTraining = (data) => addTrainingRaw(data); const locked = PREMIUM_TABS.has(tab) && !isPremium; return (
FootRise {isPremium && Premium}
{tab === 'profile' && 'Ton profil de joueur'} {tab === 'stats' && 'Tes statistiques de match'} {tab === 'training' && 'Tes entraînements'} {tab === 'challenges' && 'Tes défis à relever'} {tab === 'coach' && 'Tes conseils personnalisés'} {tab === 'blog' && 'Articles & conseils football'} {tab === 'friends' && 'Compare-toi à tes amis'} {tab === 'premium' && 'Débloque tout le potentiel'}
{locked && setTab('premium')} />} {!locked && tab === 'profile' && ( )} {!locked && tab === 'stats' && ( )} {!locked && tab === 'training' && ( )} {!locked && tab === 'challenges' && ( )} {!locked && tab === 'coach' && ( )} {!locked && tab === 'blog' && ( )} {!locked && tab === 'friends' && ( )} {tab === 'premium' && ( )}
); } ReactDOM.createRoot(document.getElementById('root')).render();