diff --git a/src/pages/ProfilePage.tsx b/src/pages/ProfilePage.tsx
index 9832bb0..6b1faaf 100644
--- a/src/pages/ProfilePage.tsx
+++ b/src/pages/ProfilePage.tsx
@@ -6,13 +6,18 @@ import { Card, CardContent, CardHeader } from '@/components/ui/card';
import { Skeleton } from '@/components/ui/skeleton';
import { Badge } from '@/components/ui/badge';
import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar';
-import { Calendar, Link2, Mail } from 'lucide-react';
+import { Button } from '@/components/ui/button';
+import { Calendar, Link2, Mail, Copy, Check } from 'lucide-react';
import { genUserName } from '@/lib/genUserName';
import { RelaySelector } from '@/components/RelaySelector';
+import { useToast } from '@/hooks/useToast';
import NotFound from '@/pages/NotFound';
+import { useState } from 'react';
export default function ProfilePage() {
const { nip19: npub } = useParams<{ nip19: string }>();
+ const { toast } = useToast();
+ const [copied, setCopied] = useState(false);
// Decode npub/nprofile to get pubkey
let pubkey = '';
@@ -48,6 +53,27 @@ export default function ProfilePage() {
const website = metadata?.website;
const nip05 = metadata?.nip05;
+ // Generate npub for copy button
+ const userNpub = pubkey ? nip19.npubEncode(pubkey) : '';
+
+ const handleCopyNpub = async () => {
+ try {
+ await navigator.clipboard.writeText(userNpub);
+ setCopied(true);
+ toast({
+ title: "Copied!",
+ description: "npub copied to clipboard",
+ });
+ setTimeout(() => setCopied(false), 2000);
+ } catch {
+ toast({
+ title: "Failed to copy",
+ description: "Could not copy npub to clipboard",
+ variant: "destructive",
+ });
+ }
+ };
+
// If not a valid profile identifier, show 404
if (!isValidProfile || !pubkey) {
return
@{userName}
)}