SkateSpots/src/AppRouter.tsx
shakespeare.diy 03d0fe93b0 Improve Amber login flow - zero friction, auto-complete on return
- Add dedicated /amber-callback route so Amber always has a stable return URL
  - Handles get_public_key (login), sign_event, nip44/nip04 encrypt/decrypt
  - Shows animated processing screen while completing, then redirects back
- Add subscribeToAmberReturn() helper in amber.ts using visibilitychange
  - Auto-detects when user returns to the tab after cancelling in Amber
  - Resets login UI to initial state gracefully
- Update buildCallbackUrl() to use /amber-callback instead of current page URL
- Rewrite Amber tab in LoginDialog:
  - Remove 2-step clipboard paste flow entirely
  - Single tap opens Amber, login completes automatically on return
  - Waiting state shows animated dots + cancel button
  - No manual pubkey entry needed
- Save return path in sessionStorage so AmberCallbackPage redirects user back

Co-authored-by: shakespeare.diy <assistant@shakespeare.diy>
2026-06-17 22:29:06 +07:00

107 lines
5.6 KiB
TypeScript

import { BrowserRouter, Route, Routes } from "react-router-dom";
import { ScrollToTop } from "./components/ScrollToTop";
import Index from "./pages/Index";
import MapPage from "./pages/MapPage";
import EventsPage from "./pages/EventsPage";
import FoodPage from "./pages/FoodPage";
import WalletPage from "./pages/WalletPage";
import SettingsPage from "./pages/SettingsPage";
import CreateSpotPage from "./pages/CreateSpotPage";
import CreateShopPage from "./pages/CreateShopPage";
import CreateEventPage from "./pages/CreateEventPage";
import CreateListingPage from "./pages/CreateListingPage";
import CreateTourPage from "./pages/CreateTourPage";
import EditSpotPage from "./pages/EditSpotPage";
import EditShopPage from "./pages/EditShopPage";
import EditEventPage from "./pages/EditEventPage";
import GearSwapPage from "./pages/GearSwapPage";
import SpotDetailPage from "./pages/SpotDetailPage";
import ShopDetailPage from "./pages/ShopDetailPage";
import EventDetailPage from "./pages/EventDetailPage";
import OnboardingPage from "./pages/OnboardingPage";
import PyramidPage from "./pages/PyramidPage";
import LabPage from "./pages/LabPage";
import BecomeCoachPage from "./pages/BecomeCoachPage";
import BecomeFilmerPage from "./pages/BecomeFilmerPage";
import BecomeEditorPage from "./pages/BecomeEditorPage";
import CoachDetailPage from "./pages/CoachDetailPage";
import TourDetailPage from "./pages/TourDetailPage";
import AboutPage from "./pages/AboutPage";
import FAQPage from "./pages/FAQPage";
import CommunityStatsPage from "./pages/CommunityStatsPage";
import SpotCollectionsPage from "./pages/SpotCollectionsPage";
import CollectionDetailPage from "./pages/CollectionDetailPage";
import DirectMessagesPage from "./pages/DirectMessagesPage";
import ConversationPage from "./pages/ConversationPage";
import BountyLeaderboardPage from "./pages/BountyLeaderboardPage";
import SignersPage from "./pages/SignersPage";
import StashPage from "./pages/StashPage";
import { NIP19Page } from "./pages/NIP19Page";
import LicensePage from "./pages/LicensePage";
import SupportersPage from "./pages/SupportersPage";
import RiderCardPage from "./pages/RiderCardPage";
import AmberCallbackPage from "./pages/AmberCallbackPage";
import NotFound from "./pages/NotFound";
export function AppRouter() {
return (
<BrowserRouter>
<ScrollToTop />
<Routes>
<Route path="/" element={<Index />} />
<Route path="/map" element={<MapPage />} />
<Route path="/events" element={<EventsPage />} />
<Route path="/lab" element={<LabPage />} />
{/* Legacy route redirect */}
<Route path="/coaches" element={<LabPage />} />
<Route path="/become-coach" element={<BecomeCoachPage />} />
<Route path="/become-filmer" element={<BecomeFilmerPage />} />
<Route path="/become-editor" element={<BecomeEditorPage />} />
<Route path="/coach/:pubkey/:identifier" element={<CoachDetailPage />} />
<Route path="/onboarding" element={<OnboardingPage />} />
<Route path="/pyramid" element={<PyramidPage />} />
<Route path="/marketplace" element={<GearSwapPage />} />
<Route path="/stats" element={<CommunityStatsPage />} />
<Route path="/about" element={<AboutPage />} />
<Route path="/faq" element={<FAQPage />} />
<Route path="/food" element={<FoodPage />} />
<Route path="/wallet" element={<WalletPage />} />
<Route path="/settings" element={<SettingsPage />} />
<Route path="/create-spot" element={<CreateSpotPage />} />
<Route path="/create-shop" element={<CreateShopPage />} />
<Route path="/create-event" element={<CreateEventPage />} />
<Route path="/create-listing" element={<CreateListingPage />} />
<Route path="/create-tour" element={<CreateTourPage />} />
<Route path="/edit-spot/:pubkey/:identifier" element={<EditSpotPage />} />
<Route path="/edit-shop/:pubkey/:identifier" element={<EditShopPage />} />
<Route path="/edit-event/:pubkey/:identifier" element={<EditEventPage />} />
<Route path="/spot/:pubkey/:identifier" element={<SpotDetailPage />} />
<Route path="/shop/:pubkey/:identifier" element={<ShopDetailPage />} />
<Route path="/event/:pubkey/:identifier" element={<EventDetailPage />} />
<Route path="/tour/:pubkey/:identifier" element={<TourDetailPage />} />
<Route path="/collections" element={<SpotCollectionsPage />} />
<Route path="/collections/:pubkey/:identifier" element={<CollectionDetailPage />} />
<Route path="/messages" element={<DirectMessagesPage />} />
<Route path="/messages/:npub" element={<ConversationPage />} />
{/* Bounty System */}
<Route path="/bounties" element={<BountyLeaderboardPage />} />
{/* Security & Signers */}
<Route path="/signers" element={<SignersPage />} />
{/* Stash - Private Inventory */}
<Route path="/stash" element={<StashPage />} />
{/* Info pages */}
<Route path="/card" element={<RiderCardPage />} />
<Route path="/license" element={<LicensePage />} />
<Route path="/supporters" element={<SupportersPage />} />
{/* Amber NIP-55 callback — Amber redirects here after signing/login */}
<Route path="/amber-callback" element={<AmberCallbackPage />} />
{/* NIP-19 route for npub1, note1, naddr1, nevent1, nprofile1 */}
<Route path="/:nip19" element={<NIP19Page />} />
{/* ADD ALL CUSTOM ROUTES ABOVE THE CATCH-ALL "*" ROUTE */}
<Route path="*" element={<NotFound />} />
</Routes>
</BrowserRouter>
);
}
export default AppRouter;