diff --git a/src/pages/FAQPage.tsx b/src/pages/FAQPage.tsx index 13b74d6..f3db8a5 100644 --- a/src/pages/FAQPage.tsx +++ b/src/pages/FAQPage.tsx @@ -32,6 +32,37 @@ const QUICK_FACTS = [ { icon: Package, color: '#a855f7', label: 'Private gear inventory', value: 'Encrypted Stash' }, ]; +/** + * Static answers. The page leans on The Sasquatch, but if the guide fails to + * mount (or events are missed) the FAQ must still answer the basics itself. + */ +const STATIC_FAQ = [ + { + q: 'What is SkateSpots?', + a: 'A decentralized map and community for skateboarding, built on Nostr. Discover spots, find coaches and filmers, join crews, list events, and buy/sell gear — with no company in the middle.', + }, + { + q: 'How do I add a spot?', + a: 'Tap the map, or use the + / "Add Spot" button, then drop a pin and fill in the details. You need a free Nostr account (tap Log In → Create Account — no email required).', + }, + { + q: 'What are zaps?', + a: 'Zaps are Bitcoin Lightning tips. You can zap spots, events, crews and people you appreciate. They go straight to the recipient over Lightning — SkateSpots never holds your funds.', + }, + { + q: 'Is it free?', + a: 'Yes. Creating an account, adding spots and browsing are free. Optional paid extras (like featured listings) and tips (zaps) are paid directly between people.', + }, + { + q: 'What data is public?', + a: 'Anything you publish — spots, events, your profile — is public on Nostr relays. Your private messages and your Stash are end-to-end encrypted. See the Privacy page for details.', + }, + { + q: 'What is The Lab?', + a: 'The Lab is where you find people to hire or learn from: coaches, trainers, filmers, video editors, photographers, builders, artists and more.', + }, +]; + export default function FAQPage() { useSeoMeta({ title: 'FAQ - SkateSpots', @@ -133,6 +164,24 @@ export default function FAQPage() { ))} + {/* Static answers — work even if the guide doesn't open */} +
+

+ + Quick answers +

+
+ {STATIC_FAQ.map(({ q, a }) => ( +
+ + {q} + +

{a}

+
+ ))} +
+
+ {/* Hint */}

The Sasquatch uses live Nostr data from the SkateSpots relay + AI to answer your questions. 🛹 diff --git a/src/pages/ShopDetailPage.tsx b/src/pages/ShopDetailPage.tsx index 1e7a24e..4c403f4 100644 --- a/src/pages/ShopDetailPage.tsx +++ b/src/pages/ShopDetailPage.tsx @@ -6,6 +6,7 @@ import ngeohash from 'ngeohash'; import { Layout } from '@/components/Layout'; import { PageError } from '@/components/ErrorState'; import { ImageWithFallback } from '@/components/ImageWithFallback'; +import { ImageLightbox } from '@/components/ImageLightbox'; import { SpotMap } from '@/components/SpotMap'; import { RouteDialog } from '@/components/RouteDialog'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; @@ -89,6 +90,7 @@ export default function ShopDetailPage() { const queryClient = useQueryClient(); const [showDeleteDialog, setShowDeleteDialog] = useState(false); const [showRouteDialog, setShowRouteDialog] = useState(false); + const [lightboxIndex, setLightboxIndex] = useState(null); const isOwner = user && shop && user.pubkey === shop.pubkey; const isAdmin = isAdminPubkey(user?.pubkey); @@ -218,15 +220,20 @@ export default function ShopDetailPage() {

{/* Main Content */}
- {/* Image Gallery */} + {/* Image Gallery — click any photo to view full size */} {shop.images.length > 0 ? ( -
+
+ ) : (
@@ -236,11 +243,26 @@ export default function ShopDetailPage() { {/* Additional images */} {shop.images.length > 1 && (
- {shop.images.slice(1, 5).map((img, idx) => ( -
- -
- ))} + {shop.images.slice(1, 5).map((img, idx) => { + const realIndex = idx + 1; + const remaining = shop.images.length - 5; + return ( + + ); + })}
)} @@ -521,6 +543,14 @@ export default function ShopDetailPage() { destination={coordinates} destinationLabel={shop?.name ?? 'Shop'} /> + + {/* Full-screen photo viewer */} + ({ url, isOwner: true }))} + index={lightboxIndex} + onIndexChange={setLightboxIndex} + onClose={() => setLightboxIndex(null)} + /> ); }