mirror of
https://github.com/hanzoai/store.git
synced 2026-10-30 14:54:46 +00:00
The convergence branch forked before 8e54e16 removed the last shinkai
references, and it rewrote guidelines, privacy and terms wholesale. Rebasing it
onto main therefore reintroduced eight of them: five support/legal/dmca/privacy
addresses, one signup host, and the note in app-icon.tsx explaining where the
dead artwork urls came from.
The addresses are the user-visible half and go back to hanzo.ai. The comment is
a true statement about where the catalog was inherited from, so it keeps the
fact and drops the name.
Co-authored-by: Hanzo Dev <[email protected]>
37 lines
1.3 KiB
TypeScript
37 lines
1.3 KiB
TypeScript
'use client'
|
|
|
|
/**
|
|
* An app's artwork — and the fallback that is currently doing all of the work.
|
|
*
|
|
* The card grid and the app page both show it, at two sizes, and both have to
|
|
* survive artwork that does not load. Today that is every app: each `icon` in
|
|
* the data is a PRESIGNED R2 URL inherited from the upstream store this catalog
|
|
* was forked from, signed 2025-11-05 with `X-Amz-Expires=86400`, so all 202
|
|
* have been dead links since the following day. The grid had no fallback at all and rendered the
|
|
* browser's broken-image glyph with the alt text spilling out of the 4rem box;
|
|
* the app page had one, but only for a MISSING url, never a failing one. Both
|
|
* are the same fact — "show the artwork, or the initial" — so it is stated
|
|
* here, once, and both surfaces are covered by the same rule.
|
|
*/
|
|
import { useState } from 'react'
|
|
|
|
export function AppIcon({
|
|
app,
|
|
lg = false,
|
|
}: {
|
|
app: { name: string; icon?: string }
|
|
/** The page hero renders the same mark at 6rem; the card at 4rem. */
|
|
lg?: boolean
|
|
}) {
|
|
const [failed, setFailed] = useState(false)
|
|
const className = lg ? 'app-icon lg' : 'app-icon'
|
|
|
|
if (!app.icon || failed) {
|
|
return <div className={`${className} fallback`}>{app.name[0]}</div>
|
|
}
|
|
|
|
return (
|
|
<img className={className} src={app.icon} alt={app.name} onError={() => setFailed(true)} />
|
|
)
|
|
}
|