From 8598259fb1b8ba00ffaa5d300f999d3ea2323d24 Mon Sep 17 00:00:00 2001 From: Mannu Date: Sat, 23 May 2026 19:34:52 +0530 Subject: [PATCH] feat(settings/profile): collapsible profile card + share sheet MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Collapsible profile card: - Starts collapsed if profile already exists (shows name + URL slug) - Expands/collapses via chevron toggle row - Auto-collapses after Save Profile succeeds Share sheet on Product Recommendations: - β†— Share button appears once a valid slug is set - Options: Copy link (clipboard, shows βœ… feedback), WhatsApp deep link, and native Web Share API ("More options") when browser supports it - Backdrop click closes the sheet Co-Authored-By: Claude Sonnet 4.6 --- src/app/settings/profile/page.tsx | 223 +++++++++++++++++++++--------- 1 file changed, 161 insertions(+), 62 deletions(-) diff --git a/src/app/settings/profile/page.tsx b/src/app/settings/profile/page.tsx index 82b0918..893322e 100644 --- a/src/app/settings/profile/page.tsx +++ b/src/app/settings/profile/page.tsx @@ -33,6 +33,9 @@ export default function ProfileSettingsPage() { const [loading, setLoading] = useState(true); const [saving, setSaving] = useState(false); const [saveMsg, setSaveMsg] = useState(""); + const [profileExpanded, setProfileExpanded] = useState(true); + const [showShareSheet, setShowShareSheet] = useState(false); + const [copied, setCopied] = useState(false); const [slug, setSlug] = useState(""); const [displayName, setDisplayName] = useState(""); @@ -58,12 +61,15 @@ export default function ProfileSettingsPage() { setDisplayName(pd.profile.display_name); setBio(pd.profile.bio ?? ""); setIsPublic(pd.profile.is_public); + setProfileExpanded(false); // already set up β€” start collapsed } setProducts(prods.items || []); setLoading(false); }).catch(() => setLoading(false)); }, []); + const profileUrl = typeof window !== "undefined" && slug ? `${window.location.origin}/m/${slug}` : ""; + async function saveProfile() { setSaving(true); setSaveMsg(""); @@ -75,13 +81,32 @@ export default function ProfileSettingsPage() { const d = await r.json(); if (r.ok) { setProfile(d.profile); - setSaveMsg(`Saved! View at /m/${d.profile.slug}`); + setSaveMsg("Saved!"); + setProfileExpanded(false); // collapse after save } else { setSaveMsg(d.error || "Save failed"); } setSaving(false); } + async function copyLink() { + if (!profileUrl) return; + await navigator.clipboard.writeText(profileUrl); + setCopied(true); + setTimeout(() => setCopied(false), 2000); + } + + function shareViaWhatsApp() { + const text = encodeURIComponent(`Check out my baby product recommendations! ${profileUrl}`); + window.open(`https://wa.me/?text=${text}`, "_blank"); + } + + async function shareNative() { + if (navigator.share) { + await navigator.share({ title: `${displayName}'s baby picks`, url: profileUrl }); + } + } + function resetProductForm() { setPTitle(""); setPUrl(""); setPDesc(""); setPImageUrl(""); setPCategory("general"); setShowAddProduct(false); setEditingProduct(null); @@ -162,65 +187,93 @@ export default function ProfileSettingsPage() {
- {/* Profile section */} -
-

Profile

- - - setDisplayName(e.target.value)} - className={`${inputClass} mb-3`} - placeholder="Priya Sharma" - /> - - -
- {baseUrl}/m/ - setSlug(e.target.value.toLowerCase().replace(/[^a-z0-9-]/g, ""))} - className="flex-1 bg-transparent outline-none dark:text-white text-sm" - placeholder="priya-sharma" - /> -
- {slug && !slugValid && ( -

3–40 chars, lowercase letters, numbers, hyphens only

- )} - - -