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 (
âš˝ 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();