SkateSpots/src/pages
SkateSpots 3c7c8bd87e feat(nip05): free name@skate-spots.org handles, claimed at signup
SkateSpots now runs its own NIP-05 registry, so a new skater gets a human
handle from minute one instead of an npub.

- netlify/functions/nip05.mjs: /.well-known/nostr.json plus
  /api/nip05/{check,claim,release}, backed by Netlify Blobs (first-party,
  no new vendor). Claims are NIP-98 signed and written onlyIfNew, so only
  the owner can claim a name for themselves. Platform names are seeded in
  code and cannot be taken or released.
- src/lib/skateNip05.ts + src/hooks/useSkateNip05.ts +
  src/components/SkateNip05Input.tsx: shared validation, debounced
  availability, and the claim control.
- SignupDialog: a 'SkateSpots name' field, prefilled from the display
  name. Claimed best-effort before the profile publish; a failure never
  blocks signup, and the profile only advertises nip05 once confirmed.
- EditProfileForm: claim a free handle from the NIP-05 field.

Verified on a draft deploy: claim -> resolves -> a second key gets 409 ->
release -> gone. tsc/eslint/101 tests green.
2026-09-28 12:13:34 +07:00
..
AboutPage.tsx contents(about): rework the Credits list 2026-09-28 10:31:43 +07:00
AdminReviewPage.tsx contents(admin): tidy the review queue + add gallery screenshots 2026-09-28 11:08:31 +07:00
AmberCallbackPage.tsx ux: migrate more empty states + fill in missing page titles (U1/U2) 2026-09-24 18:50:25 +07:00
AppShopPage.tsx contents(app-shop): move the free printables into the 'Sticker packs' entry 2026-09-28 11:21:03 +07:00
BecomeBuilderPage.tsx refactor(layout): hoist Layout into the router so the chrome mounts once 2026-09-27 13:41:42 +07:00
BecomeCoachPage.tsx refactor(layout): hoist Layout into the router so the chrome mounts once 2026-09-27 13:41:42 +07:00
BecomeEditorPage.tsx refactor(layout): hoist Layout into the router so the chrome mounts once 2026-09-27 13:41:42 +07:00
BecomeFilmerPage.tsx refactor(layout): hoist Layout into the router so the chrome mounts once 2026-09-27 13:41:42 +07:00
BecomePhotographerPage.tsx refactor(layout): hoist Layout into the router so the chrome mounts once 2026-09-27 13:41:42 +07:00
BecomeRolePage.tsx refactor: consolidate become-* routes + migrate empty states to shared component 2026-09-24 18:44:53 +07:00
BecomeSkaterPage.tsx refactor(layout): hoist Layout into the router so the chrome mounts once 2026-09-27 13:41:42 +07:00
BountyLeaderboardPage.tsx refactor(layout): hoist Layout into the router so the chrome mounts once 2026-09-27 13:41:42 +07:00
CoachDetailPage.tsx refactor(layout): hoist Layout into the router so the chrome mounts once 2026-09-27 13:41:42 +07:00
CollectionDetailPage.tsx refactor(layout): hoist Layout into the router so the chrome mounts once 2026-09-27 13:41:42 +07:00
CommunityStatsPage.tsx refactor(layout): hoist Layout into the router so the chrome mounts once 2026-09-27 13:41:42 +07:00
ContactsPage.tsx refactor(layout): hoist Layout into the router so the chrome mounts once 2026-09-27 13:41:42 +07:00
ConversationPage.tsx refactor(layout): hoist Layout into the router so the chrome mounts once 2026-09-27 13:41:42 +07:00
CreateCrewPage.tsx refactor(layout): hoist Layout into the router so the chrome mounts once 2026-09-27 13:41:42 +07:00
CreateEventPage.tsx refactor(layout): hoist Layout into the router so the chrome mounts once 2026-09-27 13:41:42 +07:00
CreateListingPage.tsx refactor(layout): hoist Layout into the router so the chrome mounts once 2026-09-27 13:41:42 +07:00
CreateShopPage.tsx refactor(layout): hoist Layout into the router so the chrome mounts once 2026-09-27 13:41:42 +07:00
CreateSpotPage.tsx feat(quality): review queue for every kind, soft photo gate, empty-map nudge 2026-09-28 09:59:09 +07:00
CreateTourPage.tsx fix(pro): single-source the platform Lightning address + show it to payers 2026-09-27 14:13:37 +07:00
CrewDetailPage.tsx refactor(layout): hoist Layout into the router so the chrome mounts once 2026-09-27 13:41:42 +07:00
CrewsPage.tsx refactor(layout): hoist Layout into the router so the chrome mounts once 2026-09-27 13:41:42 +07:00
DirectMessagesPage.tsx refactor(layout): hoist Layout into the router so the chrome mounts once 2026-09-27 13:41:42 +07:00
EditCrewPage.tsx refactor(layout): hoist Layout into the router so the chrome mounts once 2026-09-27 13:41:42 +07:00
EditEventPage.tsx refactor(layout): hoist Layout into the router so the chrome mounts once 2026-09-27 13:41:42 +07:00
EditShopPage.tsx refactor(layout): hoist Layout into the router so the chrome mounts once 2026-09-27 13:41:42 +07:00
EditSpotPage.tsx refactor(layout): hoist Layout into the router so the chrome mounts once 2026-09-27 13:41:42 +07:00
EditTourPage.tsx refactor(layout): hoist Layout into the router so the chrome mounts once 2026-09-27 13:41:42 +07:00
EventDetailPage.tsx refactor(layout): hoist Layout into the router so the chrome mounts once 2026-09-27 13:41:42 +07:00
EventsPage.tsx refactor(layout): hoist Layout into the router so the chrome mounts once 2026-09-27 13:41:42 +07:00
FAQPage.tsx refactor(layout): hoist Layout into the router so the chrome mounts once 2026-09-27 13:41:42 +07:00
FoodPage.tsx refactor(layout): hoist Layout into the router so the chrome mounts once 2026-09-27 13:41:42 +07:00
GearSwapPage.tsx refactor(layout): hoist Layout into the router so the chrome mounts once 2026-09-27 13:41:42 +07:00
GlossaryPage.tsx refactor(layout): hoist Layout into the router so the chrome mounts once 2026-09-27 13:41:42 +07:00
GroupConversationPage.tsx refactor(layout): hoist Layout into the router so the chrome mounts once 2026-09-27 13:41:42 +07:00
Index.tsx refactor(layout): hoist Layout into the router so the chrome mounts once 2026-09-27 13:41:42 +07:00
LabPage.tsx refactor(layout): hoist Layout into the router so the chrome mounts once 2026-09-27 13:41:42 +07:00
LicensePage.tsx refactor(layout): hoist Layout into the router so the chrome mounts once 2026-09-27 13:41:42 +07:00
ListingDetailPage.tsx refactor(layout): hoist Layout into the router so the chrome mounts once 2026-09-27 13:41:42 +07:00
MapPage.tsx feat(quality): review queue for every kind, soft photo gate, empty-map nudge 2026-09-28 09:59:09 +07:00
MarketplaceHubPage.tsx feat(marketplace): 1-10 deck ratings + seller dashboard 2026-09-27 16:26:24 +07:00
MarketplacePage.tsx refactor(layout): hoist Layout into the router so the chrome mounts once 2026-09-27 13:41:42 +07:00
MintsPage.tsx refactor(layout): hoist Layout into the router so the chrome mounts once 2026-09-27 13:41:42 +07:00
NewsletterPage.tsx feat(newsletter): add Drop #006 to the archive (+cover support), incl. Sasquatch and Mints 2026-09-27 20:26:14 +07:00
NIP19Page.tsx refactor(layout): hoist Layout into the router so the chrome mounts once 2026-09-27 13:41:42 +07:00
NotFound.tsx New project created with Shakespeare 2026-06-15 19:49:07 +07:00
OnboardingPage.tsx refactor(layout): hoist Layout into the router so the chrome mounts once 2026-09-27 13:41:42 +07:00
PrivacyPage.tsx refactor(layout): hoist Layout into the router so the chrome mounts once 2026-09-27 13:41:42 +07:00
PyramidPage.tsx refactor(layout): hoist Layout into the router so the chrome mounts once 2026-09-27 13:41:42 +07:00
RiderCardPage.tsx refactor(layout): hoist Layout into the router so the chrome mounts once 2026-09-27 13:41:42 +07:00
SettingsPage.tsx feat(nip05): free name@skate-spots.org handles, claimed at signup 2026-09-28 12:13:34 +07:00
ShopDetailPage.tsx refactor(layout): hoist Layout into the router so the chrome mounts once 2026-09-27 13:41:42 +07:00
SignersPage.tsx refactor(layout): hoist Layout into the router so the chrome mounts once 2026-09-27 13:41:42 +07:00
SkatersPage.tsx refactor(layout): hoist Layout into the router so the chrome mounts once 2026-09-27 13:41:42 +07:00
SpotCollectionsPage.tsx refactor(layout): hoist Layout into the router so the chrome mounts once 2026-09-27 13:41:42 +07:00
SpotDetailPage.tsx contents(spot): move Comments above Gear Swap and Spot Chat 2026-09-28 10:44:37 +07:00
StashPage.tsx refactor(layout): hoist Layout into the router so the chrome mounts once 2026-09-27 13:41:42 +07:00
SupportersPage.tsx refactor(layout): hoist Layout into the router so the chrome mounts once 2026-09-27 13:41:42 +07:00
TourDetailPage.tsx refactor(layout): hoist Layout into the router so the chrome mounts once 2026-09-27 13:41:42 +07:00
TradesPage.tsx feat(marketplace): 1-10 deck ratings + seller dashboard 2026-09-27 16:26:24 +07:00
WalletPage.tsx refactor(layout): hoist Layout into the router so the chrome mounts once 2026-09-27 13:41:42 +07:00
ZapLeaderboardPage.tsx refactor(layout): hoist Layout into the router so the chrome mounts once 2026-09-27 13:41:42 +07:00