import { useState, useEffect } from 'react'; import { api } from '../utils/api.js'; const CLAUDE_URL = 'https://claude.ai'; // Render "Built With" value — separator trails its token so it never starts a new line function BuiltWithValue({ value }) { if (!value) return null; const parts = value.split('·').map(s => s.trim()); return ( {parts.map((part, i) => ( {part === 'Claude.ai' ? {part} : part} {i < parts.length - 1 && ·} ))} ); } export default function AboutModal({ onClose }) { const [about, setAbout] = useState(null); useEffect(() => { fetch('/api/about') .then(r => r.json()) .then(({ about }) => setAbout(about)) .catch(() => {}); }, []); // Always use the original app identity — not the user-customised settings name/logo const appName = about?.default_app_name || 'jama'; const logoSrc = about?.default_logo || '/icons/jama.png'; const version = about?.version || ''; const a = about || {}; const rows = [ { label: 'Version', value: version }, { label: 'Built With', value: a.built_with, builtWith: true }, { label: 'Developer', value: a.developer }, { label: 'License', value: a.license, link: a.license_url }, ].filter(r => r.value); return (
just another messaging app
{a.description}
} > ) : (