diff --git a/src/app/globals.css b/src/app/globals.css index 62ef96b..934a50a 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -318,4 +318,17 @@ :focus-visible { outline: 2px solid rgba(249, 43, 155, 0.6); outline-offset: 2px; +} + +@keyframes interest-ticker { + 0% { + transform: translateX(0); + } + 100% { + transform: translateX(-50%); + } +} + +.animate-interest-ticker { + animation: interest-ticker 28s linear infinite; } \ No newline at end of file diff --git a/src/app/profile/page.tsx b/src/app/profile/page.tsx index 79ed0df..6b45e51 100644 --- a/src/app/profile/page.tsx +++ b/src/app/profile/page.tsx @@ -8,16 +8,17 @@ import { Badge } from "@/components/ui/badge"; import { Switch } from "@/components/ui/switch"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { ShieldCheck, MapPin } from "lucide-react"; -import { KINK_OPTIONS } from "@/types"; +import { INTEREST_OPTIONS } from "@/lib/interests"; +import { InterestTicker } from "@/components/InterestTicker"; import type { Position } from "@/types"; import { useAuth } from "@/lib/auth/context"; import { AuthModal } from "@/components/AuthModal"; -import { PhotoGalleryManager } from "@/components/PhotoGalleryManager"; +import { MediaGalleryManager } from "@/components/MediaGalleryManager"; import { CannedMessagesPanel } from "@/components/CannedMessagesPanel"; import { IdVerificationModal } from "@/components/IdVerificationModal"; import { LocalGuidePanel } from "@/components/LocalGuidePanel"; import { GuestUpgradeBanner } from "@/components/GuestUpgradeBanner"; -import { useAccess } from "@/components/Providers"; +import { useAccess, useFeedPreferences } from "@/components/Providers"; import { US_STATES, getUserState, @@ -30,6 +31,7 @@ import { export default function ProfilePage() { const { user, profile, loading, updateProfile, signOut } = useAuth(); const { capabilities } = useAccess(); + const { setFeedInterests } = useFeedPreferences(); const [authOpen, setAuthOpen] = useState(false); const [idModalOpen, setIdModalOpen] = useState(false); const [isAnonymous, setIsAnonymous] = useState(true); @@ -51,7 +53,9 @@ export default function ProfilePage() { setAge(profile.age?.toString() || ""); setPosition(profile.position); setBio(profile.bio || ""); - setKinks(profile.kinks || []); + const profileKinks = profile.kinks || []; + setKinks(profileKinks); + if (profileKinks.length) setFeedInterests(profileKinks); setOnPrep(profile.on_prep); setStiStatus(profile.sti_status || ""); setState(profile.state || getUserState() || ""); @@ -77,9 +81,11 @@ export default function ProfilePage() { }, [profile]); const toggleKink = (k: string) => { - setKinks((prev) => - prev.includes(k) ? prev.filter((x) => x !== k) : [...prev, k] - ); + setKinks((prev) => { + const next = prev.includes(k) ? prev.filter((x) => x !== k) : [...prev, k]; + setFeedInterests(next); + return next; + }); }; const handleSave = async () => { @@ -279,19 +285,27 @@ export default function ProfilePage() {
+ Customizes your map feed, tickers, and who you see nearby. +
++ Your scene · {profiles.length} nearby +
+Loading gallery...
; + } + + return ( + <> ++ Tap ★ to pin. Reorder with arrows. Others see these first. +
+Add media below — first 5 auto-pin.
+ )} ++ {message} +
+ )} + ++ {MAX_PHOTOS_PER_USER} photos · {MAX_VIDEOS_PER_USER} videos (≤{MAX_VIDEO_DURATION_SEC}s) ·{" "} + {MAX_ALBUMS_PER_USER} albums. Photos auto-optimized on upload. Crop before saving. +
+Loading gallery...
; - } - - return ( -- {message} -
- )} - -- Up to {MAX_PHOTOS_PER_USER} photos across {MAX_ALBUMS_PER_USER} albums. JPG, PNG, WebP · max {MAX_PHOTO_SIZE_MB}MB each. -
-