import { useState, useEffect } from "react"; const STORAGE_KEY = "onepost-messages"; export default function App() { const [messages, setMessages] = useState([]); const [input, setInput] = useState(""); const [hasPosted, setHasPosted] = useState(false); const [loading, setLoading] = useState(true); const [submitting, setSubmitting] = useState(false); const [mySessionId] = useState(() => { // Use sessionStorage as a proxy for "IP" in this environment let id = sessionStorage.getItem("onepost-session"); if (!id) { id = Math.random().toString(36).slice(2); sessionStorage.setItem("onepost-session", id); } return id; }); const load = async () => { try { const res = await window.storage.get(STORAGE_KEY, true); if (res) { const data = JSON.parse(res.value); setMessages(data.messages || []); setHasPosted(data.sessions?.includes(mySessionId) || false); } } catch (e) { setMessages([]); } setLoading(false); }; useEffect(() => { load(); const interval = setInterval(load, 3000); return () => clearInterval(interval); }, []); const submit = async () => { if (!input.trim() || hasPosted || submitting) return; setSubmitting(true); try { // Re-fetch to get latest state let data = { messages: [], sessions: [] }; try { const res = await window.storage.get(STORAGE_KEY, true); if (res) data = JSON.parse(res.value); } catch (e) {} if (data.sessions?.includes(mySessionId)) { setHasPosted(true); setSubmitting(false); return; } const newMsg = { id: Date.now(), text: input.trim(), likes: 0, likedBy: [], time: new Date().toISOString(), }; data.messages = [newMsg, ...(data.messages || [])].slice(0, 50); data.sessions = [...(data.sessions || []), mySessionId]; await window.storage.set(STORAGE_KEY, JSON.stringify(data), true); setMessages(data.messages); setHasPosted(true); } catch (e) {} setSubmitting(false); }; const like = async (id) => { try { let data = { messages: [], sessions: [] }; try { const res = await window.storage.get(STORAGE_KEY, true); if (res) data = JSON.parse(res.value); } catch (e) {} data.messages = data.messages.map((m) => { if (m.id !== id) return m; if (m.likedBy?.includes(mySessionId)) return m; return { ...m, likes: (m.likes || 0) + 1, likedBy: [...(m.likedBy || []), mySessionId] }; }); await window.storage.set(STORAGE_KEY, JSON.stringify(data), true); setMessages(data.messages); } catch (e) {} }; const formatTime = (iso) => { const d = new Date(iso); return d.toLocaleTimeString([], { hour: "2-digit", minute: "2-digit" }); }; return (

one post per person

{!hasPosted && (