From a35a6c3e6dafa25fa9e12fcb7860653c3f396010 Mon Sep 17 00:00:00 2001 From: Tomek Marciniak Date: Sun, 5 Nov 2023 20:26:47 +0100 Subject: [PATCH] feat(app): add stripe subscriptions --- .env.example | 6 + bun.lockb | Bin 663322 -> 664793 bytes package.json | 2 + src/app/api/webhook/route.ts | 66 ++++++++ src/app/channels/[channelId]/page.tsx | 8 +- .../channels/[channelId]/settings/page.tsx | 9 ++ src/app/channels/page.tsx | 9 +- src/app/layout.tsx | 2 + src/app/subscribe/page.tsx | 13 ++ src/app/users/profile/page.tsx | 20 +-- .../channels/channel-delete-dialog.tsx | 28 ++++ src/components/channels/channel-menu.tsx | 59 +++++++ src/components/channels/note-renderer.tsx | 72 +++++++-- src/components/layout/channels-list.tsx | 57 +------ src/components/layout/dashboard-layout.tsx | 2 + src/components/layout/navbar.tsx | 12 +- src/components/layout/sidebar-user.tsx | 74 +++++---- .../notes-create/quick-editor-form.tsx | 4 +- src/components/notes-create/quick-editor.tsx | 28 +--- .../notes-update/full-editor-form.tsx | 2 +- src/components/notes-update/full-editor.tsx | 2 +- src/components/notes-update/note-comments.tsx | 29 ++-- src/components/notes-update/note-files.tsx | 4 +- src/components/notes-update/note-menu.tsx | 94 +++++++++--- src/components/notes/bubble-ai.tsx | 10 +- src/components/notes/bubble-link.tsx | 21 ++- src/components/notes/bubble-start.tsx | 11 +- src/components/notes/editor-config.ts | 2 +- src/components/notes/note-due-date-dialog.tsx | 14 +- src/components/notes/note-options.tsx | 9 +- src/components/notes/notes-search.tsx | 2 - src/components/profile/profile-form.tsx | 111 ++++++++------ src/components/progress.tsx | 12 +- .../subscribe/subscribe-pricing.tsx | 145 ++++++++++++++++++ src/env.mjs | 32 ++-- src/lib/format.ts | 14 ++ src/lib/stripe.ts | 10 ++ src/lib/types.ts | 32 +++- src/server/api/root.ts | 4 +- src/server/api/routers/channels.ts | 6 +- src/server/api/routers/notes.ts | 13 +- src/server/api/routers/subscriptions.ts | 44 ++++++ src/server/api/routers/users.ts | 26 ++-- src/server/api/trpc.ts | 4 +- src/server/db/schema.ts | 16 +- 45 files changed, 837 insertions(+), 303 deletions(-) create mode 100644 src/app/api/webhook/route.ts create mode 100644 src/app/channels/[channelId]/settings/page.tsx create mode 100644 src/app/subscribe/page.tsx create mode 100644 src/components/channels/channel-delete-dialog.tsx create mode 100644 src/components/channels/channel-menu.tsx create mode 100644 src/components/subscribe/subscribe-pricing.tsx create mode 100644 src/lib/format.ts create mode 100644 src/lib/stripe.ts create mode 100644 src/server/api/routers/subscriptions.ts diff --git a/.env.example b/.env.example index e173a4b..9e85e69 100644 --- a/.env.example +++ b/.env.example @@ -18,3 +18,9 @@ EMAIL_FROM=noreply@example.com OPENAI_API_KEY= OPENAI_BASE_URL= OPENAI_MODEL= + +# Subscriptions +ZENOTE_SELF_HOSTED=true +STRIPE_SECRET_KEY= +NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY= +STRIPE_WEBHOOK_SECRET= diff --git a/bun.lockb b/bun.lockb index 77a04a48adfd65241b0384b37a4b23e995044122..893c8fd0fc7f0d27651969d15ff6cfb5654135ae 100755 GIT binary patch delta 139319 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 diff --git a/package.json b/package.json index 60e96b5..dacc78f 100644 --- a/package.json +++ b/package.json @@ -45,6 +45,7 @@ "@radix-ui/react-toast": "^1.1.5", "@radix-ui/react-toggle": "^1.0.3", "@radix-ui/react-tooltip": "^1.0.7", + "@stripe/stripe-js": "^2.1.11", "@t3-oss/env-nextjs": "^0.7.0", "@tailwindcss/typography": "^0.5.10", "@tanstack/react-query": "^4.32.6", @@ -83,6 +84,7 @@ "react-day-picker": "^8.9.1", "react-dom": "18.2.0", "react-hook-form": "^7.47.0", + "stripe": "^14.3.0", "superjson": "^1.13.1", "swr": "^2.2.4", "tailwind-merge": "^1.14.0", diff --git a/src/app/api/webhook/route.ts b/src/app/api/webhook/route.ts new file mode 100644 index 0000000..ae5004e --- /dev/null +++ b/src/app/api/webhook/route.ts @@ -0,0 +1,66 @@ +import { env } from '@/env.mjs' +import { getStripeServer } from '@/lib/stripe' +import { db } from '@/server/db' +import { users } from '@/server/db/schema' +import { eq } from 'drizzle-orm' +import { NextResponse } from 'next/server' +import Stripe from 'stripe' + +export async function POST(req: Request) { + if (!env.STRIPE_WEBHOOK_SECRET) + return NextResponse.json( + { message: 'Stripe not configured' }, + { status: 500 } + ) + const stripe = getStripeServer() + if (!stripe) + return NextResponse.json( + { message: 'Stripe not configured' }, + { status: 500 } + ) + const body = await req.text() + const sig = req.headers.get('stripe-signature') + try { + const event = stripe.webhooks.constructEvent( + body, + sig!, + env.STRIPE_WEBHOOK_SECRET + ) + if (!event) + return NextResponse.json({ message: 'Invalid event' }, { status: 500 }) + switch (event.type) { + case 'customer.subscription.created': + await db + .update(users) + .set({ + subscriptionTier: 'standard', + stripeId: String(event.data.object.customer) + }) + .where(eq(users.id, event.data.object.metadata.localId ?? '')) + break + case 'customer.subscription.deleted': + await db + .update(users) + .set({ + subscriptionTier: 'none' + }) + .where(eq(users.id, event.data.object.metadata.localId ?? '')) + break + case 'payment_intent.succeeded': + await db + .update(users) + .set({ + subscriptionTier: 'lifetime', + stripeId: String(event.data.object.customer) + }) + .where(eq(users.id, event.data.object.metadata.localId ?? '')) + break + } + return NextResponse.json({ ok: true }) + } catch (error) { + if (error instanceof Stripe.errors.StripeError) { + const { message } = error + return NextResponse.json({ message }, { status: error.statusCode }) + } + } +} diff --git a/src/app/channels/[channelId]/page.tsx b/src/app/channels/[channelId]/page.tsx index 366fd85..58ee356 100644 --- a/src/app/channels/[channelId]/page.tsx +++ b/src/app/channels/[channelId]/page.tsx @@ -3,6 +3,7 @@ import { Button } from '@/components/ui/button' import { api } from '@/trpc/server' import { NotesList } from '@/components/channels/notes-list' import { QuickEditorForm } from '@/components/notes-create/quick-editor-form' +import { ChannelMenu } from '@/components/channels/channel-menu' const ChannelPage = async ({ params }: { params: { channelId: string } }) => { const { channel, notes } = await api.channels.get.query({ @@ -12,7 +13,12 @@ const ChannelPage = async ({ params }: { params: { channelId: string } }) => { return (
+

{channel.name}

+ +
+ } addon={ } /> + + + + } + />

FlowBox

diff --git a/src/app/layout.tsx b/src/app/layout.tsx index b098d4c..e1d6c90 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -6,6 +6,7 @@ import { headers } from 'next/headers' import { TRPCReactProvider } from '@/trpc/react' import { Providers } from '@/components/providers' +import { Toaster } from '@/components/ui/toaster' const inter = Inter({ subsets: ['latin'], @@ -27,6 +28,7 @@ const RootLayout = ({ children }: { children: React.ReactNode }) => { {children} + ) diff --git a/src/app/subscribe/page.tsx b/src/app/subscribe/page.tsx new file mode 100644 index 0000000..1bae97c --- /dev/null +++ b/src/app/subscribe/page.tsx @@ -0,0 +1,13 @@ +import { SubscribePricing } from '@/components/subscribe/subscribe-pricing' +import { api } from '@/trpc/server' + +const SubscribePage = async () => { + const { data: priceList } = await api.subscriptions.prices.query() + return ( +
+ +
+ ) +} + +export default SubscribePage diff --git a/src/app/users/profile/page.tsx b/src/app/users/profile/page.tsx index b39198c..c5dad35 100644 --- a/src/app/users/profile/page.tsx +++ b/src/app/users/profile/page.tsx @@ -1,14 +1,14 @@ -import { ProfileForm } from "@/components/profile/profile-form" -import { api } from "@/trpc/server" +import { ProfileForm } from '@/components/profile/profile-form' +import { api } from '@/trpc/server' const ProfilePage = async () => { - const user = await api.users.me.query() - if (!user) return null - return ( -
- -
- ) + const user = await api.users.me.query() + if (!user) return null + return ( +
+ +
+ ) } -export default ProfilePage \ No newline at end of file +export default ProfilePage diff --git a/src/components/channels/channel-delete-dialog.tsx b/src/components/channels/channel-delete-dialog.tsx new file mode 100644 index 0000000..475310d --- /dev/null +++ b/src/components/channels/channel-delete-dialog.tsx @@ -0,0 +1,28 @@ +'use client' + +import { useAppStore } from '@/store/app' +import { ConfirmationDialog } from '../confirmation-dialog' +import { api } from '@/trpc/react' +import { useRouter } from 'next/navigation' + +export const ChannelDeleteDialog = () => { + const router = useRouter() + const { mutateAsync: deleteChannel } = api.channels.delete.useMutation() + const deletingChannelId = useAppStore((state) => state.deletingChannelId) + const setDeletingChannelId = useAppStore( + (state) => state.setDeletingChannelId + ) + return ( + { + await deleteChannel({ id: deletingChannelId ?? '' }) + router.push('/channels') + router.refresh() + }} + open={!!deletingChannelId} + setOpen={(nextValue) => nextValue === false && setDeletingChannelId(null)} + /> + ) +} diff --git a/src/components/channels/channel-menu.tsx b/src/components/channels/channel-menu.tsx new file mode 100644 index 0000000..e0e96cf --- /dev/null +++ b/src/components/channels/channel-menu.tsx @@ -0,0 +1,59 @@ +'use client' + +import { MoreVerticalIcon, Edit2Icon, TrashIcon } from 'lucide-react' +import { Button } from '../ui/button' +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuTrigger +} from '../ui/dropdown-menu' +import { useAppStore } from '@/store/app' +import { ChannelProps } from '@/lib/types' +import { cn } from '@/lib/utils' +import { useRouter } from 'next/navigation' + +export const ChannelMenu = ({ + channel, + hidding = true +}: { + channel: ChannelProps + hidding?: boolean +}) => { + const router = useRouter() + const setDeletingChannelId = useAppStore( + (state) => state.setDeletingChannelId + ) + return ( + + + + + + router.push(`/channels/${channel.id}/settings`)} + > + + Edit + + setDeletingChannelId(channel.id)} + > + + Delete + + + + ) +} diff --git a/src/components/channels/note-renderer.tsx b/src/components/channels/note-renderer.tsx index c648649..674a431 100644 --- a/src/components/channels/note-renderer.tsx +++ b/src/components/channels/note-renderer.tsx @@ -3,7 +3,13 @@ import NextLink from 'next/link' import { Card } from '@/components/ui/card' import { Button } from '@/components/ui/button' -import { CheckIcon, PencilIcon, StarIcon, StarOffIcon } from 'lucide-react' +import { + CheckIcon, + ClockIcon, + PencilIcon, + StarIcon, + StarOffIcon +} from 'lucide-react' import { format } from 'date-fns' import { Tooltip, @@ -18,15 +24,24 @@ import { NoteOptions } from '../notes/note-options' import { useSession } from 'next-auth/react' import { api } from '@/trpc/react' import { useRouter } from 'next/navigation' -import { NoteProps } from '@/lib/types' +import { type NoteProps } from '@/lib/types' import { cn } from '@/lib/utils' +import { useAppStore } from '@/store/app' -export const NoteRenderer = ({ note, short = false }: { note: NoteProps, short?: boolean }) => { +export const NoteRenderer = ({ + note, + short = false +}: { + note: NoteProps + short?: boolean +}) => { const router = useRouter() const json = useMemo(() => JSON.parse(note.content ?? '{}'), [note.content]) const output = useMemo(() => generateHTML(json, config.extensions), [json]) + const setDueDateNoteId = useAppStore((state) => state.setDueDateNoteId) const { data } = useSession() const { mutateAsync: toggleBookmark } = api.bookmarks.toggle.useMutation() + const { mutateAsync: updateNote } = api.notes.update.useMutation() const toggleNoteBookmark = async () => { await toggleBookmark({ noteId: note.id ?? '', @@ -34,12 +49,20 @@ export const NoteRenderer = ({ note, short = false }: { note: NoteProps, short?: }) router.refresh() } + const markCompleted = async () => { + await updateNote({ + ...note, + dueDate: null + }) + router.refresh() + } const isBookmarked = note.noteBookmarks?.length ?? 0 > 0 return (
@@ -49,15 +72,38 @@ export const NoteRenderer = ({ note, short = false }: { note: NoteProps, short?:
{!short &&

{note.user?.name}

} - - {format(note.createdAt ?? 0, 'dd.mm.yyyy hh:mm')} + + {format(note.createdAt ?? 0, 'PP p')}
- + {note.dueDate ? ( + + ) : ( + + + + + Set Due Date + + )} - {isBookmarked ? 'Remove Bookmark' : 'Bookmark'} + + {isBookmarked ? 'Remove Bookmark' : 'Bookmark'} + {!short && }
diff --git a/src/components/layout/channels-list.tsx b/src/components/layout/channels-list.tsx index 29a0363..f426fcb 100644 --- a/src/components/layout/channels-list.tsx +++ b/src/components/layout/channels-list.tsx @@ -1,14 +1,7 @@ 'use client' import { Button } from '@/components/ui/button' -import { - PlusIcon, - CircleIcon, - CircleDotIcon, - Edit2Icon, - TrashIcon, - MoreVerticalIcon -} from 'lucide-react' +import { PlusIcon, CircleIcon, CircleDotIcon } from 'lucide-react' import { useState } from 'react' import { Input } from '@/components/ui/input' import { api } from '@/trpc/react' @@ -18,16 +11,11 @@ import { insertChannelSchema } from '@/server/db/schema' import NextLink from 'next/link' import { type z } from 'zod' import { useSession } from 'next-auth/react' -import { - DropdownMenu, - DropdownMenuContent, - DropdownMenuItem, - DropdownMenuTrigger -} from '@/components/ui/dropdown-menu' import { ConfirmationDialog } from '@/components/confirmation-dialog' import { useParams } from 'next/navigation' import { cn } from '@/lib/utils' import { useAppStore } from '@/store/app' +import { ChannelMenu } from '../channels/channel-menu' type CreateChannelFormProps = { onBlur: () => void @@ -70,24 +58,12 @@ export const ChannelsList = () => { const setDeletingChannelId = useAppStore( (state) => state.setDeletingChannelId ) - const onCreated = () => { + const onCreated = async () => { setCreatingChannel(false) - refetch() + await refetch() } return ( <> - { - await deleteChannel({ id: deletingChannelId || '' }) - refetch() - }} - open={!!deletingChannelId} - setOpen={(nextValue) => - nextValue === false && setDeletingChannelId(null) - } - />

Channels

@@ -132,30 +108,7 @@ export const ChannelsList = () => { {channel.name} - - - - - - - - Edit - - setDeletingChannelId(channel.id)} - > - - Delete - - - +
) })} diff --git a/src/components/layout/dashboard-layout.tsx b/src/components/layout/dashboard-layout.tsx index 6eee859..78f92dc 100644 --- a/src/components/layout/dashboard-layout.tsx +++ b/src/components/layout/dashboard-layout.tsx @@ -4,6 +4,7 @@ import { getServerAuthSession } from '@/server/auth' import { redirect } from 'next/navigation' import { NoteDeleteDialog } from '@/components/notes/note-delete-dialog' import { NoteDueDateDialog } from '@/components/notes/note-due-date-dialog' +import { ChannelDeleteDialog } from '../channels/channel-delete-dialog' export const DashboardLayout = async ({ children @@ -18,6 +19,7 @@ export const DashboardLayout = async ({ +
{children}
) diff --git a/src/components/layout/navbar.tsx b/src/components/layout/navbar.tsx index 36eaa76..bc0544e 100644 --- a/src/components/layout/navbar.tsx +++ b/src/components/layout/navbar.tsx @@ -1,7 +1,7 @@ 'use client' export type NavbarProps = { - title: string + title: React.ReactNode addon?: React.ReactNode } @@ -9,11 +9,13 @@ export const Navbar = ({ title, addon }: NavbarProps) => { return (
-

{title}

-
-
- {addon} + {typeof title === 'string' ? ( +

{title}

+ ) : ( + title + )}
+
{addon}
) } diff --git a/src/components/layout/sidebar-user.tsx b/src/components/layout/sidebar-user.tsx index 286500e..f65e204 100644 --- a/src/components/layout/sidebar-user.tsx +++ b/src/components/layout/sidebar-user.tsx @@ -1,41 +1,47 @@ 'use client' -import { DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenu } from "@/components/ui/dropdown-menu" -import { UserIcon, LogOutIcon } from "lucide-react" -import NextLink from "next/link" -import { signOut } from "next-auth/react" -import { UserAvatar } from "../users/user-avatar" -import { Button } from "../ui/button" -import { api } from "@/trpc/react" +import { + DropdownMenuTrigger, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuSeparator, + DropdownMenu +} from '@/components/ui/dropdown-menu' +import { UserIcon, LogOutIcon } from 'lucide-react' +import NextLink from 'next/link' +import { signOut } from 'next-auth/react' +import { UserAvatar } from '../users/user-avatar' +import { Button } from '../ui/button' +import { api } from '@/trpc/react' export const SidebarUser = () => { - const { data: me } = api.users.me.useQuery() - return ( -
+ const { data: me } = api.users.me.useQuery() + return ( +
- - - - - - + + + + + + Profile - - - - signOut()} - > - - Sign Out - - - -
- ) -} \ No newline at end of file + + + + signOut()} + > + + Sign Out + + + +
+ ) +} diff --git a/src/components/notes-create/quick-editor-form.tsx b/src/components/notes-create/quick-editor-form.tsx index a5e1bc9..db7df8a 100644 --- a/src/components/notes-create/quick-editor-form.tsx +++ b/src/components/notes-create/quick-editor-form.tsx @@ -21,7 +21,7 @@ export const QuickEditorForm = ({ saveCallback }: EditorFormProps) => { await createNote({ content, type: 'text' as never, - channelId: String(channelId), + channelId: String(channelId) }) saveCallback && saveCallback() } @@ -29,7 +29,7 @@ export const QuickEditorForm = ({ saveCallback }: EditorFormProps) => { const note = await createNote({ content: '', type: 'text' as never, - channelId: String(channelId), + channelId: String(channelId) }) router.refresh() router.push(`/notes/${note[0]?.id}`) diff --git a/src/components/notes-create/quick-editor.tsx b/src/components/notes-create/quick-editor.tsx index d5f3331..8378ea5 100644 --- a/src/components/notes-create/quick-editor.tsx +++ b/src/components/notes-create/quick-editor.tsx @@ -5,14 +5,12 @@ import { type Editor, Extension } from '@tiptap/core' import { EditorContent, useEditor } from '@tiptap/react' import { Button } from '@/components/ui/button' import { Badge } from '@/components/ui/badge' -import { StarsIcon } from 'lucide-react' import { useAppStore } from '@/store/app' import { cn } from '@/lib/utils' import { config } from '@/components/notes/editor-config' import Placeholder from '@tiptap/extension-placeholder' -import { useChat } from 'ai/react' -import { type FormEvent, useEffect } from 'react' -import { useParams, useRouter } from 'next/navigation' +import { useEffect } from 'react' +import { useRouter } from 'next/navigation' import { EditorBubbleMenu } from '@/components/notes/editor-bubble-menu' export type OnSaveHandler = ({ content }: { content: string }) => Promise @@ -23,16 +21,7 @@ export type QuickEditorProps = { export const QuickEditor = ({ onSave }: QuickEditorProps) => { const router = useRouter() - const { channelId } = useParams() const noteValue = useAppStore((state) => state.noteValue) - console.log('>>>INNERV', noteValue) - const { handleSubmit, setInput } = useChat({ - api: '/api/chat', - initialInput: noteValue, - body: { - channelId - } - }) const handleSave = async ({ editor }: { editor: Editor }) => { if (editor.getText().length === 0) return const content = JSON.stringify(editor.getJSON()) @@ -71,11 +60,6 @@ export const QuickEditor = ({ onSave }: QuickEditorProps) => { }, [noteValue, editor]) if (!editor) return null const editorHasValue = editor.getText().length > 0 - const sendOpenAiPrompt = (e: FormEvent) => { - setInput(`${noteValue} - send response in HTML

wrapped paragraphs.`) - console.log('NV', noteValue) - handleSubmit(e) - } return ( <> {editor && } @@ -86,14 +70,6 @@ export const QuickEditor = ({ onSave }: QuickEditorProps) => { )} >

- {editorHasValue && ( -
- -
- )} {editorHasValue && ( diff --git a/src/components/notes-update/note-files.tsx b/src/components/notes-update/note-files.tsx index 981ba4f..4961aba 100644 --- a/src/components/notes-update/note-files.tsx +++ b/src/components/notes-update/note-files.tsx @@ -1,9 +1,9 @@ -import { Badge } from "../ui/badge" +import { Badge } from '../ui/badge' export const NoteFiles = () => { return (
-
+

Files

diff --git a/src/components/notes-update/note-menu.tsx b/src/components/notes-update/note-menu.tsx index 9dd26ed..2523ddc 100644 --- a/src/components/notes-update/note-menu.tsx +++ b/src/components/notes-update/note-menu.tsx @@ -5,6 +5,7 @@ import { Button } from '@/components/ui/button' import { useRouter } from 'next/navigation' import { BrushIcon, + CheckIcon, ChevronLeftIcon, ClockIcon, FileIcon, @@ -13,18 +14,19 @@ import { StarIcon, StarOffIcon } from 'lucide-react' -import { NoteProps } from '@/lib/types' +import { type NoteProps } from '@/lib/types' import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '../ui/dropdown-menu' -import { Editor } from '@tiptap/react' +import { type Editor } from '@tiptap/react' import { NoteOptions } from '../notes/note-options' import { useAppStore } from '@/store/app' import { api } from '@/trpc/react' import { useSession } from 'next-auth/react' +import { Tooltip, TooltipContent, TooltipTrigger } from '../ui/tooltip' export const NoteMenu = ({ editor, @@ -39,6 +41,7 @@ export const NoteMenu = ({ const router = useRouter() const { data } = useSession() const { mutateAsync: toggleBookmark } = api.bookmarks.toggle.useMutation() + const { mutateAsync: updateNote } = api.notes.update.useMutation() const toggleNoteBookmark = async () => { await toggleBookmark({ noteId: note.id ?? '', @@ -46,6 +49,13 @@ export const NoteMenu = ({ }) router.refresh() } + const markCompleted = async () => { + await updateNote({ + ...note, + dueDate: null + }) + router.refresh() + } const isBookmarked = note.noteBookmarks?.length ?? 0 > 0 return ( @@ -58,26 +68,70 @@ export const NoteMenu = ({ > - - + + + + + Comments + + + + + + Files +
- - + {isBookmarked ? ( + + + + + Remove Bookmark + + ) : ( + + + + + Bookmark + + )} + {note.dueDate ? ( + + + + + Mark Completed + + ) : ( + + + + + Set Due Date + + )} diff --git a/src/components/notes/bubble-start.tsx b/src/components/notes/bubble-start.tsx index 59e75e9..97a60ab 100644 --- a/src/components/notes/bubble-start.tsx +++ b/src/components/notes/bubble-start.tsx @@ -1,6 +1,6 @@ -import { LinkIcon } from "lucide-react" -import { Button } from "../ui/button" -import { MenuStep, PanelProps } from "./editor-bubble-menu" +import { LinkIcon } from 'lucide-react' +import { Button } from '../ui/button' +import { MenuStep, type PanelProps } from './editor-bubble-menu' export const BubbleStart = ({ editor, setMenuStep }: PanelProps) => { return ( @@ -62,10 +62,7 @@ export const BubbleStart = ({ editor, setMenuStep }: PanelProps) => { > 1. -
diff --git a/src/components/notes/editor-config.ts b/src/components/notes/editor-config.ts index 6460983..97ba98a 100644 --- a/src/components/notes/editor-config.ts +++ b/src/components/notes/editor-config.ts @@ -15,6 +15,6 @@ export const config = { inline: true, allowBase64: true }), - EditorTldraw, + EditorTldraw ] } diff --git a/src/components/notes/note-due-date-dialog.tsx b/src/components/notes/note-due-date-dialog.tsx index a80dfb6..7e6e174 100644 --- a/src/components/notes/note-due-date-dialog.tsx +++ b/src/components/notes/note-due-date-dialog.tsx @@ -21,8 +21,9 @@ import { Calendar } from '@/components/ui/calendar' import { useAppStore } from '@/store/app' import React from 'react' import { Input } from '@/components/ui/input' -import { SubmitHandler, useForm } from 'react-hook-form' +import { type SubmitHandler, useForm } from 'react-hook-form' import { api } from '@/trpc/react' +import { useRouter } from 'next/navigation' export type NoteDueDateDialogProps = { open: boolean @@ -35,25 +36,30 @@ type DueDateForm = { } export const NoteDueDateDialog = () => { + const router = useRouter() const dueDateNoteId = useAppStore((state) => state.dueDateNoteId) const { data: note } = api.notes.get.useQuery({ id: dueDateNoteId ?? '' }) const { mutateAsync: updateNote } = api.notes.update.useMutation() const setDueDateNoteId = useAppStore((state) => state.setDueDateNoteId) const { register, watch, handleSubmit, setValue } = useForm({ defaultValues: { - date: undefined, + date: new Date(), time: '' } }) const onSubmit: SubmitHandler = async (data) => { if (!note) return const [hours, minutes] = data.time.split(':') - const dueDate = set(data.date, {hours: parseInt(hours ?? '0'), minutes: parseInt(minutes ?? '0')}) + const dueDate = set(data.date, { + hours: parseInt(hours ?? '0'), + minutes: parseInt(minutes ?? '0') + }) await updateNote({ ...note, dueDate }) setDueDateNoteId(null) + router.refresh() } const date = watch('date') return ( @@ -79,7 +85,7 @@ export const NoteDueDateDialog = () => { )} > - {date ? format(date, 'PPP') : Pick a date} + {date ? format(date, 'PP') : Pick a date} diff --git a/src/components/notes/note-options.tsx b/src/components/notes/note-options.tsx index 87669b5..e536ed7 100644 --- a/src/components/notes/note-options.tsx +++ b/src/components/notes/note-options.tsx @@ -1,6 +1,6 @@ 'use client' -import { NoteProps } from '@/lib/types' +import { type NoteProps } from '@/lib/types' import { DropdownMenu, DropdownMenuContent, @@ -9,12 +9,7 @@ import { DropdownMenuTrigger } from '../ui/dropdown-menu' import { Button } from '../ui/button' -import { - LockIcon, - MoreVerticalIcon, - ShareIcon, - TrashIcon -} from 'lucide-react' +import { LockIcon, MoreVerticalIcon, ShareIcon, TrashIcon } from 'lucide-react' import { useAppStore } from '@/store/app' export type NoteOptionsProps = { diff --git a/src/components/notes/notes-search.tsx b/src/components/notes/notes-search.tsx index d69d2b1..e4ce899 100644 --- a/src/components/notes/notes-search.tsx +++ b/src/components/notes/notes-search.tsx @@ -23,8 +23,6 @@ export const NotesSearch = () => { const notesSearchOpen = useAppStore((state) => state.notesSearchOpen) const setNotesSearchOpen = useAppStore((state) => state.setNotesSearchOpen) - console.log('>>>Q', query, data) - React.useEffect(() => { const down = (e: KeyboardEvent) => { if (e.key === 'k' && (e.metaKey || e.ctrlKey)) { diff --git a/src/components/profile/profile-form.tsx b/src/components/profile/profile-form.tsx index 908eb50..2fa2649 100644 --- a/src/components/profile/profile-form.tsx +++ b/src/components/profile/profile-form.tsx @@ -1,52 +1,75 @@ 'use client' -import { SubmitHandler, useForm } from "react-hook-form" -import { Label } from "../ui/label" -import { Input } from "../ui/input" -import { Button } from "../ui/button" -import { UserProps } from "@/lib/types" -import { api } from "@/trpc/react" -import { useRouter } from "next/navigation" +import { type SubmitHandler, useForm } from 'react-hook-form' +import { Label } from '../ui/label' +import { Input } from '../ui/input' +import { Button } from '../ui/button' +import { type UserProps } from '@/lib/types' +import { api } from '@/trpc/react' +import { useRouter } from 'next/navigation' +import { useToast } from '../ui/use-toast' type ProfileData = { - name: string - username: string + name: string + username: string } export const ProfileForm = ({ user }: { user: UserProps }) => { - const router = useRouter() - const { mutateAsync: updateProfile } = api.users.update.useMutation() - const { register, handleSubmit } = useForm({ - defaultValues: { - name: user.name ?? '', - username: user.username - } - }) - const onSubmit: SubmitHandler = async (data) => { - await updateProfile({ - email: user.email, - ...data - }) - router.refresh() + const router = useRouter() + const { toast } = useToast() + const { mutateAsync: updateProfile } = api.users.update.useMutation() + const { register, handleSubmit } = useForm({ + defaultValues: { + name: user.name ?? '', + username: user.username } - return ( - -

Profile

-
- - -
-
- - -
-
- - -
-
- -
- - ) -} \ No newline at end of file + }) + const onSubmit: SubmitHandler = async (data) => { + await updateProfile({ + email: user.email, + ...data + }) + toast({ + title: 'Profile updated' + }) + router.refresh() + } + return ( +
+

Profile

+
+ + +
+
+ + +
+
+ + +
+
+ +
+
+ ) +} diff --git a/src/components/progress.tsx b/src/components/progress.tsx index 00d9fb8..de2c35e 100644 --- a/src/components/progress.tsx +++ b/src/components/progress.tsx @@ -1,7 +1,7 @@ export const Progress = () => { - return ( -
-
-
- ) -} \ No newline at end of file + return ( +
+
+
+ ) +} diff --git a/src/components/subscribe/subscribe-pricing.tsx b/src/components/subscribe/subscribe-pricing.tsx new file mode 100644 index 0000000..9220aad --- /dev/null +++ b/src/components/subscribe/subscribe-pricing.tsx @@ -0,0 +1,145 @@ +'use client' + +import { useState } from 'react' +import { Button } from '../ui/button' +import { + Card, + CardHeader, + CardTitle, + CardContent, + CardFooter, + CardDescription +} from '../ui/card' +import { Label } from '../ui/label' +import { Switch } from '../ui/switch' +import type Stripe from 'stripe' +import { formatCurrency } from '@/lib/format' +import { api } from '@/trpc/react' +import { useRouter } from 'next/navigation' + +export type SubscribePricing = { + priceList: Stripe.Price[] +} + +export const SubscribePricing = ({ priceList }: SubscribePricing) => { + const router = useRouter() + const [isYearly, setIsYearly] = useState(true) + const { mutateAsync: initCheckout } = api.subscriptions.checkout.useMutation() + const payOnceLicense = priceList.find( + (price) => price.lookup_key === 'pay_once_license' + ) + const annualPrice = priceList.find( + (price) => price.lookup_key === 'subscription_annual' + ) + const monthlyPrice = priceList.find( + (price) => price.lookup_key === 'subscription_monthly' + ) + const payOnceFormatedPrice = + payOnceLicense && + formatCurrency({ + value: (payOnceLicense.unit_amount ?? 0) / 100, + currency: payOnceLicense.currency + }) + const annualFormatedPrice = + annualPrice && + formatCurrency({ + value: (annualPrice.unit_amount ?? 0) / 100 / 12, + currency: annualPrice.currency + }) + const monthlyFormatedPrice = + monthlyPrice && + formatCurrency({ + value: (monthlyPrice.unit_amount ?? 0) / 100, + currency: monthlyPrice.currency + }) + const initializeCheckoutSession = async ({ + priceId, + mode + }: { + priceId: string + mode: 'subscription' | 'payment' + }) => { + const checkout = await initCheckout({ + priceId, + mode + }) + if (!checkout) return + if (checkout.url) router.push(checkout.url) + } + return ( + + + Subscribe to Zenote + + Last thing before you dive into Zenote. + + + + + +
+ Standard +
+ + +
+
+
+ +
    +
  • Unlimited Channels
  • +
  • Unlimited Notes
  • +
  • Completion AI
  • +
+
+ +

+ {isYearly ? annualFormatedPrice : monthlyFormatedPrice}/mt +

+ +
+
+

or

+ + + Eternal Access + + +

+ The same features as Standard plan and every new feature we add + later. +

+
+ +

{payOnceFormatedPrice} once

+ +
+
+
+
+ ) +} diff --git a/src/env.mjs b/src/env.mjs index 6019d7c..9fffb86 100644 --- a/src/env.mjs +++ b/src/env.mjs @@ -1,5 +1,5 @@ -import { createEnv } from "@t3-oss/env-nextjs"; -import { z } from "zod"; +import { createEnv } from '@t3-oss/env-nextjs' +import { z } from 'zod' export const env = createEnv({ server: { @@ -7,14 +7,14 @@ export const env = createEnv({ .string() .url() .refine( - (str) => !str.includes("YOUR_POSTGRES_URL_HERE"), - "You forgot to change the default URL" + (str) => !str.includes('YOUR_POSTGRES_URL_HERE'), + 'You forgot to change the default URL' ), NODE_ENV: z - .enum(["development", "test", "production"]) - .default("development"), + .enum(['development', 'test', 'production']) + .default('development'), NEXTAUTH_SECRET: - process.env.NODE_ENV === "production" + process.env.NODE_ENV === 'production' ? z.string() : z.string().optional(), NEXTAUTH_URL: z.preprocess( @@ -31,11 +31,14 @@ export const env = createEnv({ EMAIL_FROM: z.string(), OPENAI_API_KEY: z.string(), OPENAI_BASE_URL: z.string(), - OPENAI_MODEL: z.string() + OPENAI_MODEL: z.string(), + STRIPE_SECRET_KEY: z.string().optional(), + STRIPE_WEBHOOK_SECRET: z.string().optional(), + ZENOTE_SELF_HOSTED: z.coerce.boolean().default(false) }, client: { - // NEXT_PUBLIC_CLIENTVAR: z.string(), + NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY: z.string().optional() }, runtimeEnv: { @@ -50,8 +53,13 @@ export const env = createEnv({ EMAIL_FROM: process.env.EMAIL_FROM, OPENAI_API_KEY: process.env.OPENAI_API_KEY, OPENAI_BASE_URL: process.env.OPENAI_BASE_URL, - OPENAI_MODEL: process.env.OPENAI_MODEL + OPENAI_MODEL: process.env.OPENAI_MODEL, + STRIPE_SECRET_KEY: process.env.STRIPE_SECRET_KEY, + NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY: + process.env.NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY, + STRIPE_WEBHOOK_SECRET: process.env.STRIPE_WEBHOOK_SECRET, + ZENOTE_SELF_HOSTED: process.env.ZENOTE_SELF_HOSTED }, skipValidation: !!process.env.SKIP_ENV_VALIDATION, - emptyStringAsUndefined: true, -}); + emptyStringAsUndefined: true +}) diff --git a/src/lib/format.ts b/src/lib/format.ts new file mode 100644 index 0000000..6569283 --- /dev/null +++ b/src/lib/format.ts @@ -0,0 +1,14 @@ +export const formatCurrency = ({ + value, + currency = 'usd' +}: { + value: number + currency: string +}) => { + const formatter = new Intl.NumberFormat('en-US', { + style: 'currency', + currency + }) + + return formatter.format(value) +} diff --git a/src/lib/stripe.ts b/src/lib/stripe.ts new file mode 100644 index 0000000..747a645 --- /dev/null +++ b/src/lib/stripe.ts @@ -0,0 +1,10 @@ +import { env } from '@/env.mjs' +import { loadStripe } from '@stripe/stripe-js' +import Stripe from 'stripe' + +export const getStripeClient = () => + env.NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY && + loadStripe(env.NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY) + +export const getStripeServer = () => + env.STRIPE_SECRET_KEY && new Stripe(env.STRIPE_SECRET_KEY) diff --git a/src/lib/types.ts b/src/lib/types.ts index 309a0a8..4ff77fa 100644 --- a/src/lib/types.ts +++ b/src/lib/types.ts @@ -1,14 +1,36 @@ -import { insertBookmarkSchema, insertCommentSchema, insertUserSchema, type insertNoteSchema, selectUserSchema, selectCommentSchema, selectNoteSchema, selectBookmarkSchema } from '@/server/db/schema' +import { + type insertBookmarkSchema, + type insertCommentSchema, + type insertUserSchema, + type insertNoteSchema, + type selectUserSchema, + type selectCommentSchema, + type selectNoteSchema, + type selectBookmarkSchema, + type insertChannelSchema, + type selectChannelSchema +} from '@/server/db/schema' import { type z } from 'zod' -export type UserProps = z.infer -export type NoteBookmarkProps = z.infer +export type UserProps = z.infer< + typeof insertUserSchema & typeof selectUserSchema +> +export type ChannelProps = z.infer< + typeof insertChannelSchema & typeof selectChannelSchema +> +export type NoteBookmarkProps = z.infer< + typeof insertBookmarkSchema & typeof selectBookmarkSchema +> -export type CommentProps = z.infer & { +export type CommentProps = z.infer< + typeof insertCommentSchema & typeof selectCommentSchema +> & { user?: UserProps } -export type NoteProps = z.infer & { +export type NoteProps = z.infer< + typeof insertNoteSchema & typeof selectNoteSchema +> & { comments?: CommentProps[] user?: UserProps noteBookmarks?: NoteBookmarkProps[] diff --git a/src/server/api/root.ts b/src/server/api/root.ts index c8c8ebf..3d96476 100644 --- a/src/server/api/root.ts +++ b/src/server/api/root.ts @@ -4,6 +4,7 @@ import { notesRouter } from './routers/notes' import { commentsRouter } from '@/server/api/routers/comments' import { bookmarksRouter } from '@/server/api/routers/bookmarks' import { usersRouter } from './routers/users' +import { subscriptionsRouter } from './routers/subscriptions' /** * This is the primary router for your server. @@ -15,7 +16,8 @@ export const appRouter = createTRPCRouter({ notes: notesRouter, comments: commentsRouter, bookmarks: bookmarksRouter, - users: usersRouter + users: usersRouter, + subscriptions: subscriptionsRouter }) // export type definition of API diff --git a/src/server/api/routers/channels.ts b/src/server/api/routers/channels.ts index 4288d20..fdb058f 100644 --- a/src/server/api/routers/channels.ts +++ b/src/server/api/routers/channels.ts @@ -4,9 +4,10 @@ import { channelMemberships, channels, insertChannelSchema, + notes, selectChannelSchema } from '@/server/db/schema' -import { and, eq } from 'drizzle-orm' +import { and, asc, eq } from 'drizzle-orm' import { TRPCError } from '@trpc/server' export const channelsRouter = createTRPCRouter({ @@ -35,7 +36,8 @@ export const channelsRouter = createTRPCRouter({ with: { user: true, noteBookmarks: true - } + }, + orderBy: [asc(notes.createdAt)] } } } diff --git a/src/server/api/routers/notes.ts b/src/server/api/routers/notes.ts index cbb3be9..b5ef6da 100644 --- a/src/server/api/routers/notes.ts +++ b/src/server/api/routers/notes.ts @@ -11,11 +11,14 @@ import { TRPCError } from '@trpc/server' import { z } from 'zod' export const notesRouter = createTRPCRouter({ - index: protectedProcedure - .query(({ ctx }) => - ctx.db.query.notes - .findMany({ where: and(isNotNull(notes.dueDate), eq(notes.userId, ctx.session.user.id)) }) - ), + index: protectedProcedure.query(({ ctx }) => + ctx.db.query.notes.findMany({ + where: and( + isNotNull(notes.dueDate), + eq(notes.userId, ctx.session.user.id) + ) + }) + ), search: protectedProcedure .input(z.object({ query: z.string().min(1) })) .query(async ({ ctx, input }) => { diff --git a/src/server/api/routers/subscriptions.ts b/src/server/api/routers/subscriptions.ts new file mode 100644 index 0000000..5edb4d2 --- /dev/null +++ b/src/server/api/routers/subscriptions.ts @@ -0,0 +1,44 @@ +import { z } from 'zod' +import { createTRPCRouter, protectedProcedure, publicProcedure } from '../trpc' +import { TRPCError } from '@trpc/server' +import Stripe from 'stripe' + +export const subscriptionsRouter = createTRPCRouter({ + prices: publicProcedure.query(async ({ ctx }) => { + if (!ctx.stripe) throw new TRPCError({ code: 'INTERNAL_SERVER_ERROR' }) + return ctx.stripe.prices.list() + }), + checkout: protectedProcedure + .input( + z.object({ + priceId: z.string(), + mode: z.enum(['subscription', 'payment']) + }) + ) + .mutation(async ({ ctx, input }) => { + if (!ctx.stripe) throw new TRPCError({ code: 'INTERNAL_SERVER_ERROR' }) + const origin = ctx.headers.get('origin') ?? 'http://localhost:3000' + try { + const session = await ctx.stripe.checkout.sessions.create({ + mode: input.mode, + line_items: [ + { + price: input.priceId, + quantity: 1 + } + ], + success_url: `${origin}/`, + cancel_url: `${origin}/subscribe`, + metadata: { + localId: ctx.session.user.id + } + }) + return session + } catch (error) { + if (error instanceof Stripe.errors.StripeError) { + const { message } = error + throw new TRPCError({ code: 'INTERNAL_SERVER_ERROR', message }) + } + } + }) +}) diff --git a/src/server/api/routers/users.ts b/src/server/api/routers/users.ts index f7399f9..509b2cb 100644 --- a/src/server/api/routers/users.ts +++ b/src/server/api/routers/users.ts @@ -1,16 +1,14 @@ -import { eq } from "drizzle-orm"; -import { createTRPCRouter, protectedProcedure } from "../trpc"; -import { insertUserSchema, users } from "@/server/db/schema"; +import { eq } from 'drizzle-orm' +import { createTRPCRouter, protectedProcedure } from '../trpc' +import { insertUserSchema, users } from '@/server/db/schema' export const usersRouter = createTRPCRouter({ - me: protectedProcedure.query(({ ctx }) => ctx.db.query.users.findFirst({ where: eq(users.id, ctx.session.user.id) })), - update: protectedProcedure - .input(insertUserSchema.omit({ id: true })) - .mutation(({ ctx, input }) => - ctx.db - .update(users) - .set(input) - .where(eq(users.id, ctx.session.user.id) - ) - ) -}) \ No newline at end of file + me: protectedProcedure.query(({ ctx }) => + ctx.db.query.users.findFirst({ where: eq(users.id, ctx.session.user.id) }) + ), + update: protectedProcedure + .input(insertUserSchema.omit({ id: true })) + .mutation(({ ctx, input }) => + ctx.db.update(users).set(input).where(eq(users.id, ctx.session.user.id)) + ) +}) diff --git a/src/server/api/trpc.ts b/src/server/api/trpc.ts index d94a905..9849e46 100644 --- a/src/server/api/trpc.ts +++ b/src/server/api/trpc.ts @@ -14,6 +14,7 @@ import { ZodError } from 'zod' import { getServerAuthSession } from '@/server/auth' import { db } from '@/server/db' +import { getStripeServer } from '@/lib/stripe' /** * 1. CONTEXT @@ -43,7 +44,8 @@ export const createInnerTRPCContext = async (opts: CreateContextOptions) => { return { session, headers: opts.headers, - db + db, + stripe: getStripeServer() } } diff --git a/src/server/db/schema.ts b/src/server/db/schema.ts index 2a0abcb..939545b 100644 --- a/src/server/db/schema.ts +++ b/src/server/db/schema.ts @@ -8,11 +8,16 @@ import { text, timestamp, varchar, - boolean, + boolean } from 'drizzle-orm/pg-core' import { type AdapterAccount } from 'next-auth/adapters' import { createInsertSchema, createSelectSchema } from 'drizzle-zod' -import { adjectives, animals, colors, uniqueNamesGenerator } from 'unique-names-generator' +import { + adjectives, + animals, + colors, + uniqueNamesGenerator +} from 'unique-names-generator' export const pgTable = pgTableCreator((name) => `zenote_${name}`) @@ -104,7 +109,12 @@ export const channelMemberships = pgTable('channel_membership', { export const users = pgTable('user', { id: text('id').primaryKey().unique().notNull(), name: varchar('name', { length: 255 }), - username: varchar('username', { length: 255 }).default(uniqueNamesGenerator({ dictionaries: [adjectives, colors, animals] })).notNull().unique(), + username: varchar('username', { length: 255 }) + .default( + uniqueNamesGenerator({ dictionaries: [adjectives, colors, animals] }) + ) + .notNull() + .unique(), stripeId: varchar('stripeId', { length: 255 }), subscriptionTier: varchar('subscriptionTier', { length: 255,