From 037bb3db444afbb0970ac195bbf620cfd2cad627 Mon Sep 17 00:00:00 2001 From: highperfocused Date: Sun, 20 Apr 2025 21:33:13 +0200 Subject: [PATCH] Feature: Implement CreateProfileForm component and update onboarding page --- app/onboarding/createProfile/page.tsx | 4 +- components/CreateProfileForm.tsx | 111 ++++++++++++++++++++++++++ 2 files changed, 113 insertions(+), 2 deletions(-) create mode 100644 components/CreateProfileForm.tsx diff --git a/app/onboarding/createProfile/page.tsx b/app/onboarding/createProfile/page.tsx index d80cfa0..09b885f 100644 --- a/app/onboarding/createProfile/page.tsx +++ b/app/onboarding/createProfile/page.tsx @@ -1,6 +1,6 @@ "use client"; -import { UpdateProfileForm } from "@/components/UpdateProfileForm"; +import { CreateProfileForm } from "@/components/CreateProfileForm"; import { useEffect } from "react"; export default function OnboardingCreateProfile() { @@ -12,7 +12,7 @@ export default function OnboardingCreateProfile() { <>

Step 2: Create Profile

- +
); diff --git a/components/CreateProfileForm.tsx b/components/CreateProfileForm.tsx new file mode 100644 index 0000000..c6d6269 --- /dev/null +++ b/components/CreateProfileForm.tsx @@ -0,0 +1,111 @@ +'use client'; + +import React, { useState } from 'react'; +import { Button } from "@/components/ui/button" +import { Input } from "@/components/ui/input" +import { nip19 } from "nostr-tools" +import { Label } from "./ui/label" +import { Textarea } from "@/components/ui/textarea" +import { verifyEvent } from 'nostr-tools/pure' +import { hexToBytes } from '@noble/hashes/utils' +import { useNostr, useProfile } from 'nostr-react'; +import { signEvent } from '@/utils/utils'; + +export function CreateProfileForm() { + + const { publish } = useNostr(); + + let npub = ''; + let pubkey = ''; + let loginType = ''; + let nsec: Uint8Array; + + if (typeof window !== 'undefined') { + pubkey = window.localStorage.getItem("pubkey") ?? ''; + const nsecHex = window.localStorage.getItem("nsec"); + loginType = window.localStorage.getItem("loginType") ?? ''; + + if (pubkey && pubkey.length > 0) { + npub = nip19.npubEncode(pubkey); + } + + if (nsecHex && nsecHex.length > 0) { + nsec = hexToBytes(nsecHex); + } + } + + let { data: userData } = useProfile({ + pubkey, + }); + + const [username, setUsername] = useState(userData?.name); + const [displayName, setDisplayName] = useState(userData?.display_name); + const [bio, setBio] = useState(userData?.about); + + const handleUsernameChange = (event: React.ChangeEvent) => { + setUsername(event.target.value); + }; + const handleDisplayNameChange = (event: React.ChangeEvent) => { + setDisplayName(event.target.value); + }; + const handleBioChange = (event: React.ChangeEvent) => { + setBio(event.target.value); + }; + + async function handleProfileUpdate() { + const username = (document.getElementById('username') as HTMLInputElement).value; + const bio = (document.getElementById('bio') as HTMLInputElement).value; + const displayname = (document.getElementById('displayname') as HTMLInputElement).value; + + if (loginType) { + let event = { + kind: 0, + created_at: Math.floor(Date.now() / 1000), + tags: [], + content: `{"name": "${username}", "about": "${bio}"}`, + pubkey: pubkey, + id: "", + sig: "", + }; + + let signedEvent = await signEvent(loginType, event); + + if (signedEvent === null) { + alert('Failed to sign the event. Please check your connection and try again.'); + return; + } + + let isGood = verifyEvent(signedEvent); + + if (isGood) { + publish(signedEvent); + window.location.href = `/profile/${npub}`; + } + } + } + + return ( +
+
+
+ + +
+
+ + +
+
+ + +
+
+ + {/* */} +