diff --git a/apps/web/app/account/[id]/page.tsx b/apps/web/app/account/[id]/page.tsx new file mode 100644 index 00000000..1bcaca4b --- /dev/null +++ b/apps/web/app/account/[id]/page.tsx @@ -0,0 +1,4 @@ +export default function Page({ params }: { params: { id: string } }) { + console.log(params) + return
From /: {params.id}
+} \ No newline at end of file diff --git a/apps/web/app/account/[id]/privatekey/page.tsx b/apps/web/app/account/[id]/privatekey/page.tsx new file mode 100644 index 00000000..dcad1b3c --- /dev/null +++ b/apps/web/app/account/[id]/privatekey/page.tsx @@ -0,0 +1,5 @@ +export default function Page({ params }: { params: { id: string } }) { + console.log(params); + //TODO: FETCH THE TXN DATA FOR THIS FOR THIS ACCOUNT + return
From Private key: {params.id}
+} \ No newline at end of file diff --git a/apps/web/app/account/[id]/remove/page.tsx b/apps/web/app/account/[id]/remove/page.tsx new file mode 100644 index 00000000..920d1625 --- /dev/null +++ b/apps/web/app/account/[id]/remove/page.tsx @@ -0,0 +1,5 @@ +export default function Page({ params }: { params: { id: string } }) { + console.log(params); + //TODO: FETCH THE TXN DATA FOR THIS FOR THIS ACCOUNT + return
From remove account: {params.id}
+} \ No newline at end of file diff --git a/apps/web/app/account/[id]/secretPhrase/page.tsx b/apps/web/app/account/[id]/secretPhrase/page.tsx new file mode 100644 index 00000000..5ad51847 --- /dev/null +++ b/apps/web/app/account/[id]/secretPhrase/page.tsx @@ -0,0 +1,5 @@ +export default function Page({ params }: { params: { id: string } }) { + console.log(params); + //TODO: FETCH THE TXN DATA FOR THIS FOR THIS ACCOUNT + return
From secret phrase: {params.id}
+} \ No newline at end of file diff --git a/apps/web/app/account/[id]/statements/page.tsx b/apps/web/app/account/[id]/statements/page.tsx new file mode 100644 index 00000000..2512fc71 --- /dev/null +++ b/apps/web/app/account/[id]/statements/page.tsx @@ -0,0 +1,5 @@ +export default function Page({ params }: { params: { id: string } }) { + console.log(params); + //TODO: FETCH THE TXN DATA FOR THIS FOR THIS ACCOUNT + return
From statements: {params.id}
+} \ No newline at end of file diff --git a/apps/web/app/account/[id]/update/page.tsx b/apps/web/app/account/[id]/update/page.tsx new file mode 100644 index 00000000..02d80fe1 --- /dev/null +++ b/apps/web/app/account/[id]/update/page.tsx @@ -0,0 +1,4 @@ +export default function Page({ params }: { params: { id: string } }) { + console.log(params) + return
My Post: {params.id}
+} \ No newline at end of file diff --git a/apps/web/app/account/components/accountLayout.tsx b/apps/web/app/account/components/accountLayout.tsx index b7d40ae9..e2eed74e 100644 --- a/apps/web/app/account/components/accountLayout.tsx +++ b/apps/web/app/account/components/accountLayout.tsx @@ -8,13 +8,14 @@ import { ResizablePanelGroup, } from "@/components/ui/resizable"; import { cn } from "@/lib/utils"; -import { Archive, ArchiveX, Inbox, Send, Trash2, File, Wallet } from "lucide-react"; -import { LinksProps, Sidenav } from "./sidebar"; + +import { LinksProps, Sidenav } from "@/app/account/components/sidebar"; import { TooltipProvider } from "@/components/ui/tooltip"; import { Separator } from "@/components/ui/separator"; import { AccountSwitcher } from "@/app/account/components/account-switcher"; import { AccountType } from "@paybox/common"; -import { useRouter } from "next/navigation"; +import { usePathname, useRouter } from "next/navigation"; +import { commonNavLinks, getNavLinks } from "./navLinks"; interface AccountLayoutProps { defaultLayout: number[] | undefined; @@ -24,50 +25,7 @@ interface AccountLayoutProps { accounts: AccountType[] } -const sidenavLinks = [ - { - title: "Inbox", - label: "128", - icon: Inbox, - variant: "default", - link: "/account/create", - }, - { - title: "Drafts", - label: "9", - icon: File, - variant: "ghost", - link: "/account/create", - }, - { - title: "Sent", - label: "", - icon: Send, - variant: "ghost", - link: "/account/create", - }, - { - title: "Junk", - label: "23", - icon: ArchiveX, - variant: "ghost", - link: "/account/create", - }, - { - title: "Trash", - label: "", - icon: Trash2, - variant: "ghost", - link: "/account/create", - }, - { - title: "Archive", - label: "", - icon: Archive, - variant: "ghost", - link: "/account/create", - }, -] + export function AccountLayout({ defaultLayout = [100, 480], @@ -83,7 +41,9 @@ export function AccountLayout({ accounts[0].id ); + const path = usePathname() const router = useRouter(); + const [selectedTab, setSelectedTab] = React.useState(path.split('/')[path.split('/').length - 1]); useEffect(() => { const checkScreenWidth = () => { @@ -100,8 +60,20 @@ export function AccountLayout({ }, []); useEffect(() => { - router.push(`/account?id=${selectedAccount}`); - }, [selectedAccount]); + setSelectedTab(path.split("/")[3] || "dashboard") + router.push(`/account/${selectedAccount}/${path.split("/")[3] || ""}`) + }, [selectedAccount]) + + useEffect(() => { + if (path.split("/").length === 2) { + setSelectedTab(path.split("/")[2] || ""); + router.push(path) + } + if (path.split("/").length === 3) { + setSelectedTab(path.split("/")[3] || "dashboard"); + router.push(path) + } + }, [path]); return ( @@ -127,8 +99,8 @@ export function AccountLayout({ defaultSize={defaultLayout[0]} collapsedSize={navCollapsedSize} collapsible={true} - minSize={isMobile ? 0 : 14} - maxSize={isMobile ? 14 : 20} + minSize={isMobile ? 0 : 18} + maxSize={isMobile ? 18 : 25} onCollapse={() => { setIsCollapsed(true); document.cookie = `react-resizable-panels:collapsed=${JSON.stringify( @@ -161,12 +133,16 @@ export function AccountLayout({ diff --git a/apps/web/app/account/components/navLinks.tsx b/apps/web/app/account/components/navLinks.tsx new file mode 100644 index 00000000..3fc50a22 --- /dev/null +++ b/apps/web/app/account/components/navLinks.tsx @@ -0,0 +1,107 @@ + +import { + Archive, + ArchiveX, + Inbox, + Send, + Trash2, + File, + Wallet, + LayoutDashboard, + Lock, + VenetianMask, + Bitcoin, + PencilLine, + FilePlus, + FilePlus2Icon, + GanttChart +} from "lucide-react"; + +export const commonNavLinks = [ + { + id: "", + title: "Manage Accounts", + label: "", + icon: GanttChart, + variant: "ghost", + link: "/account", + }, + { + id: "create", + title: "Create Account", + label: "128", + icon: FilePlus2Icon, + variant: "ghost", + link: "/account/create", + }, + { + id: "importSecretPhrase", + title: "Import Secret Recovery", + label: "9", + icon: FilePlus, + variant: "ghost", + link: "/account/importSecretPhrase", + }, + { + id: "importPrivate", + title: "Import From Private-Key", + label: "", + icon: Lock, + variant: "ghost", + link: "importPrivate", + }, + +] + +export const getNavLinks = (id: string) => { + return [ + { + id: "dashboard", + title: "Dashboard", + label: "128", + icon: LayoutDashboard, + variant: "ghost", + link: `/account/${id}/#`, + }, + { + id: "statements", + title: "Statements", + label: "9", + icon: Bitcoin, + variant: "ghost", + link: `/account/${id}/statements`, + }, + { + id: "privatekey", + title: "Private-Key", + label: "", + icon: Lock, + variant: "ghost", + link: `/account/${id}/privatekey`, + }, + { + id: "secretPhrase", + title: "Secret", + label: "23", + icon: VenetianMask, + variant: "ghost", + link: `/account/${id}/secretPhrase`, + }, + { + id: "update", + title: "Update", + label: "", + icon: PencilLine, + variant: "ghost", + link: `/account/${id}/update`, + }, + { + id: "remove", + title: "Remove", + label: "", + icon: Trash2, + variant: "ghost", + link: `/account/${id}/remove`, + }, + ] +} \ No newline at end of file diff --git a/apps/web/app/account/components/sidebar.tsx b/apps/web/app/account/components/sidebar.tsx index e71e4635..b4262532 100644 --- a/apps/web/app/account/components/sidebar.tsx +++ b/apps/web/app/account/components/sidebar.tsx @@ -10,8 +10,12 @@ import { TooltipContent, TooltipTrigger, } from "@/components/ui/tooltip" +import React, { use } from "react" +import { usePathname, useSearchParams, useParams } from 'next/navigation' + export interface LinksProps { + id: string title: string label?: string icon: LucideIcon @@ -22,9 +26,11 @@ export interface LinksProps { interface NavProps { isCollapsed: boolean links: LinksProps[] + selectedTab: string + setSelectedTab: (tab: string) => void } -export function Sidenav({ links, isCollapsed }: NavProps) { +export function Sidenav({ links, isCollapsed, selectedTab, setSelectedTab }: NavProps) { return (
setSelectedTab(link.id)} className={cn( buttonVariants({ variant: link.variant, size: "icon" }), "h-10 w-10", - link.variant === "default" && + link.id === selectedTab && "dark:bg-muted dark:text-muted-foreground dark:hover:bg-muted dark:hover:text-white " )} > @@ -61,9 +68,10 @@ export function Sidenav({ links, isCollapsed }: NavProps) { setSelectedTab(link.id)} className={cn( buttonVariants({ variant: link.variant, size: "sm" }), - link.variant === "default" && + link.id === selectedTab && "dark:bg-muted dark:text-white dark:hover:bg-muted dark:hover:text-white", "justify-start", "h-10 flex gap-x-2" diff --git a/apps/web/app/account/importPrivate/page.tsx b/apps/web/app/account/importPrivate/page.tsx new file mode 100644 index 00000000..9e8f64f1 --- /dev/null +++ b/apps/web/app/account/importPrivate/page.tsx @@ -0,0 +1,4 @@ +export default function Page({ params }: { params: { id: string } }) { + console.log(params) + return
From import Private: {params.id}
+} \ No newline at end of file diff --git a/apps/web/app/account/importSecretPhrase/page.tsx b/apps/web/app/account/importSecretPhrase/page.tsx new file mode 100644 index 00000000..fd457967 --- /dev/null +++ b/apps/web/app/account/importSecretPhrase/page.tsx @@ -0,0 +1,4 @@ +export default function Page({ params }: { params: { id: string } }) { + console.log(params) + return
From Import Secret: {params.id}
+} \ No newline at end of file diff --git a/apps/web/app/account/layout.tsx b/apps/web/app/account/layout.tsx index e844aa20..433bb715 100644 --- a/apps/web/app/account/layout.tsx +++ b/apps/web/app/account/layout.tsx @@ -37,7 +37,9 @@ const getAccounts = async (jwt: string): Promise => { } } -export default async function AccountMainLayout({ children }: AccountLayoutProps) { +export default async function AccountMainLayout({ + children, +}: AccountLayoutProps) { const layout = cookies().get("react-resizable-panels:layout"); const defaultLayout = layout ? JSON.parse(layout.value) : undefined; @@ -48,7 +50,6 @@ export default async function AccountMainLayout({ children }: AccountLayoutProps //@ts-ignore const accounts = await getAccounts(session.user.jwt); - return ( <> diff --git a/apps/web/app/account/page.tsx b/apps/web/app/account/page.tsx index 60daa615..02d80fe1 100644 --- a/apps/web/app/account/page.tsx +++ b/apps/web/app/account/page.tsx @@ -1,49 +1,4 @@ -import { Separator } from "@/components/ui/separator"; -import { getServerSession } from "next-auth"; -import { redirect } from "next/navigation"; -import { authOptions } from "@/app/api/auth/[...nextauth]/util"; -import { AccountType, BACKEND_URL, ClientWithJwt, responseStatus } from "@paybox/common"; - -const getAccounts = async (jwt: string): Promise => { - try { - const { status, accounts }: { status: responseStatus, accounts: AccountType[] } = await fetch(`${BACKEND_URL}/account/all`, { - method: "get", - headers: { - "Content-type": "application/json", - authorization: `Bearer ${jwt}`, - }, - cache: "no-cache" - }).then(res => res.json()); - if (status == responseStatus.Error) { - return null - } - return accounts - } catch (error) { - console.log(error); - return null - } -} - -export default async function AccountPage() { - const session = await getServerSession(authOptions); - if (!session || !session.user || !session.user?.email) { - redirect("/signup"); - } - - //@ts-ignore - const accounts = await getAccounts(session.user.jwt); - return ( -
-
-

Profile

-

- This is how others will see you on the site. Fuck ou -

-
- {/* {accounts && - - } */} - -
- ); -} +export default function Page({ params }: { params: { id: string } }) { + console.log(params) + return
My Post: {params.id}
+} \ No newline at end of file diff --git a/apps/web/app/signup/components/otp.tsx b/apps/web/app/signup/components/otp.tsx index 56ac7b6e..39bab03f 100644 --- a/apps/web/app/signup/components/otp.tsx +++ b/apps/web/app/signup/components/otp.tsx @@ -41,13 +41,13 @@ export function OTPForm() { const onSubmit = async (data: z.infer) => { toast.promise( fetch(`${BACKEND_URL}/client/valid?otp=${data.otp}`, { - method: "PATCH", - headers: { - "Content-Type": "application/json", - //@ts-ignore - "Authorization": `Bearer ${session.data?.user?.jwt}` - }, - }).then((res) => res.json()), { + method: "PATCH", + headers: { + "Content-Type": "application/json", + //@ts-ignore + "Authorization": `Bearer ${session.data?.user?.jwt}` + }, + }).then((res) => res.json()), { loading: "Validating OTP", success: async ({ status, msg, valid, walletId, account }) => { // TODO: Add the walletId to the session @@ -58,7 +58,7 @@ export function OTPForm() { } return msg; }, - error: ({status, msg}) => { + error: ({ status, msg }) => { return msg; } }); @@ -74,6 +74,7 @@ export function OTPForm() { (