// SHOT — Remaining screens (check-in, stories, events, notif, search, profile, settings) (function(){ const { useState, useEffect } = React; const { StatusBar: SB3, TopNav: TN3, Icon: I3, AmbianceDot: A3, vibeLabel: VL3 } = window.SHOT_SCREENS_1; const { BARS: B3, STORIES: S3, FRIENDS: F3, SUGGESTED: SU3, EVENTS: E3, NOTIFS_TODAY: NT, NOTIFS_YESTERDAY: NY, NOTIFS_WEEK: NW, REVIEWS: R3, avatarColor: AC3 } = window.SHOT_DATA; /* ════════════════════════════════════════════════════ CHECK-IN FLOW ════════════════════════════════════════════════════ */ const CheckinScreen = ({ barId, onBack, onSubmit }) => { const b = B3.find(x => x.id === barId) || B3[0]; const [vibe, setVibe] = useState('hot'); const [friends, setFriends] = useState(new Set(['f1', 'f2'])); const [pub, setPub] = useState(true); const toggleFriend = (id) => setFriends(s => { const n = new Set(s); n.has(id) ? n.delete(id) : n.add(id); return n; }); return ( <>
{b.name}
{b.addr} · {b.dist}
📍 Tu y es
L'ambiance ce soir ?
{[ { id: 'calm', name: 'Calme', desc: 'Tranquille, pour discuter' }, { id: 'anime', name: 'Animé', desc: 'Plein mais ça respire' }, { id: 'hot', name: 'Chaud', desc: 'Ça monte, faut se faufiler' }, { id: 'fire', name: 'Blindé', desc: 'Compte sur tes coudes' }, ].map(opt => (
setVibe(opt.id)}>
{opt.name}
{opt.desc}
))}
Tag tes potes
{F3.slice(0,4).map(f => (
toggleFriend(f.id)}>
{f.initials}
{f.name}
{f.handle}
))}
{pub?'Public':'Amis uniquement'}
{pub?'Visible sur la carte pour tout le monde':'Seuls tes amis te voient'}
setPub(!pub)}>
); }; const CheckinSuccessScreen = ({ onDone }) => { useEffect(() => { const t = setTimeout(onDone, 2200); return () => clearTimeout(t); }, []); return ( <>
Check-in confirmé.
Tu es au Comptoir des Halles avec Léa et Théo. Tes potes sont notifiés.
Tu débloques le badge "Soirée du jeudi" 🏆
); }; /* ════════════════════════════════════════════════════ STORIES (viewer + create) ════════════════════════════════════════════════════ */ const StoryViewerScreen = ({ storyId, onClose }) => { const s = S3.find(x => x.id === storyId) || S3[1]; return (
{s.initials}
{s.name}
il y a 23 min · 📍 Le Sansone
×
📍 Le Sansone
Ça commence fort.
DJ jusqu'à 4h, la terrasse est blindée
Répondre à {s.name}…
); }; const StoryCreateScreen = ({ onBack, onShare }) => (
×
Le Comptoir des Halles
Ce soir
ça démarre.
Ta story · Public
Publier
); /* ════════════════════════════════════════════════════ EVENTS LIST + DETAIL ════════════════════════════════════════════════════ */ const EventsScreen = ({ goEvent }) => ( <>
Soirées
Tout · 12
BDE
🍺 Bar partenaires
📅 Cette semaine
🎉 Ce week-end
{E3.map(e => (
goEvent(e.id)}>
{e.day}
{e.month}
{e.title}
{e.dow}{e.time}{e.bar}
{e.attendees.slice(0,3).map((a,i) => (
))}
{e.rsvp} intéressés
{e.tag==='bde'?'BDE':'Promo'}
))}
); const EventDetailScreen = ({ eventId, onBack, onShare }) => { const e = E3.find(x => x.id === eventId) || E3[0]; const [rsvp, setRsvp] = useState(false); return ( <>
🎉 {e.org}
{e.dow} {e.day} {e.month} {e.time}
{e.title}
{e.bar} · {e.address}

{e.desc}

Quand
{e.dow} {e.day} {e.month} · {e.time}
{e.bar}
{e.address}
RSVP
{e.rsvp} · {e.capacity} places
{e.attendees.slice(0,7).map((a,i) => (
{a}
))}
+{e.rsvp - 7}
); }; /* ════════════════════════════════════════════════════ NOTIFICATIONS ════════════════════════════════════════════════════ */ const NotificationsScreen = ({ onBack }) => ( <> Tout lu }/>
Aujourd'hui
{NT.map(n => (
{n.emoji}
{n.time}
{n.unread &&
}
))}
Hier
{NY.map(n => (
{n.emoji}
{n.time}
))}
Cette semaine
{NW.map(n => (
{n.emoji}
{n.time}
))}
); /* ════════════════════════════════════════════════════ SEARCH ════════════════════════════════════════════════════ */ const SearchScreen = ({ onBack, goBar }) => { const [q, setQ] = useState(''); return ( <>
setQ(e.target.value)} autoFocus/> {q &&
setQ('')}>Effacer
}
{!q && ( <>
Recherches récentes Effacer
{['Le Sansone', 'Bar à vin', 'Mama Brasserie', 'Soirée jeudi'].map(s => (
{s}
))}
Recherches populaires
🔥 Blindé ce soir
🎧 DJ sets
☀️ Terrasses
🎉 BDE
🍸 Cocktails
🍺 Happy hour
Bars tendance
{B3.slice(0,3).map(b => (
goBar(b.id)}>
{b.name}
{b.addr} · {b.live} live
))} )} {q && ( <>
Bars
{B3.filter(b => b.name.toLowerCase().includes(q.toLowerCase())).map(b => (
goBar(b.id)}>
{b.name}
{b.addr}
))} )} ); }; /* ════════════════════════════════════════════════════ PROFILE + FRIENDS + EDIT + SETTINGS ════════════════════════════════════════════════════ */ const ProfileScreen = ({ goFriends, goSettings, goEdit, goBar }) => { const [tab, setTab] = useState('checkins'); return ( <>
@marie.l
ML
Marie Lefèvre
@marie.l · Sciences Po Paris
Bar à vin et terrasse au soleil. Toujours partante pour un dernier verre.
87
Check-ins
142
Amis
23
Bars sauvés
setTab('checkins')}>Check-ins
setTab('saved')}>Sauvés
setTab('badges')}>Badges
{tab === 'checkins' && (
{[...B3, ...B3].slice(0,9).map((b,i) => (
goBar(b.id)}>
{b.name.split(' ').slice(0,2).join(' ')}
))}
)} {tab === 'saved' && (
{B3.slice(0,6).map((b,i) => (
goBar(b.id)}>
{b.name}
))}
)} {tab === 'badges' && (
{[ {icon:'🍺',name:'Habitué',sub:'10 check-ins au Sansone'}, {icon:'🌙',name:'Noctambule',sub:'5 fermetures de bar'}, {icon:'🎉',name:'Fêtard BDE',sub:'3 soirées BDE'}, {icon:'⭐',name:'Critique',sub:'25 avis publiés'}, ].map((b,i)=>(
{b.icon}
{b.name}
{b.sub}
))}
)} ); }; const FriendsScreen = ({ onBack }) => ( <> }/>
En live ● {F3.filter(f=>f.live).length}
{F3.filter(f => f.live).map(f => (
{f.initials}
{f.name}
● En live · {f.status}
Voir
))}
Tous tes amis
{F3.filter(f => !f.live).map(f => (
{f.initials}
{f.name}
{f.status}
Message
))}
Suggestions
{SU3.map(f => (
{f.initials}
{f.name}
{f.sub}
+ Ajouter
))} ); const EditProfileScreen = ({ onBack }) => ( <> Enregistrer }/>
ML
Changer la photo