- Spliit is offered for free, but costs money and energy. If you like
- the app, you can choose to support it by buying me (Sebastien) a
- coffee with a one-time small donation.
-
-
By supporting Spliit:
-
-
- You contribute to the hosting costs for the app
- (currently ~$150/year).
-
-
- You help us keeping the application{' '}
- free and without ads.
-
-
- You give me energy to build new features and
- improve the application.
-
-
-
- You will be redirected to Stripe, our payment
- provider, where you can choose an amount to donate and complete the
- payment.
-
-
-
-
-
- >
- )
-}
diff --git a/src/components/feedback-button/feedback-button-actions.tsx b/src/components/feedback-button/feedback-button-actions.tsx
new file mode 100644
index 0000000..00c8748
--- /dev/null
+++ b/src/components/feedback-button/feedback-button-actions.tsx
@@ -0,0 +1,23 @@
+'use server'
+import { formSchema } from '@/components/feedback-button/feedback-button-common'
+import { FeedbackButtonEmail } from '@/components/feedback-button/feedback-button-email'
+import { getResend } from '@/lib/resend'
+import { env } from 'process'
+
+export async function sendFeedback(values: unknown) {
+ 'use server'
+ const { email, message } = formSchema.parse(values)
+ const resend = getResend()
+ if (!resend || !env.FEEDBACK_EMAIL_FROM || !env.FEEDBACK_EMAIL_TO) {
+ console.warn(
+ 'Resend is not properly configured. Feedback email won’t be sent.',
+ )
+ return
+ }
+ await resend.emails.send({
+ from: env.FEEDBACK_EMAIL_FROM,
+ to: env.FEEDBACK_EMAIL_TO,
+ subject: `Spliit: new feedback from ${email || 'anonymous user'}`,
+ react: ,
+ })
+}
diff --git a/src/components/feedback-button/feedback-button-client.tsx b/src/components/feedback-button/feedback-button-client.tsx
deleted file mode 100644
index 96a1758..0000000
--- a/src/components/feedback-button/feedback-button-client.tsx
+++ /dev/null
@@ -1,206 +0,0 @@
-'use client'
-import { formSchema } from '@/components/feedback-button/feedback-button-common'
-import { Button } from '@/components/ui/button'
-import {
- Dialog,
- DialogContent,
- DialogDescription,
- DialogHeader,
- DialogTitle,
- DialogTrigger,
-} from '@/components/ui/dialog'
-import {
- Drawer,
- DrawerContent,
- DrawerDescription,
- DrawerHeader,
- DrawerTitle,
- DrawerTrigger,
-} from '@/components/ui/drawer'
-import {
- Form,
- FormControl,
- FormDescription,
- FormField,
- FormItem,
- FormLabel,
- FormMessage,
-} from '@/components/ui/form'
-import { Input } from '@/components/ui/input'
-import { Textarea } from '@/components/ui/textarea'
-import { useToast } from '@/components/ui/use-toast'
-import { useMediaQuery } from '@/lib/hooks'
-import { zodResolver } from '@hookform/resolvers/zod'
-import { Loader2, MessageCircle } from 'lucide-react'
-import { useState } from 'react'
-import { useForm } from 'react-hook-form'
-import * as z from 'zod'
-
-type FormValues = z.infer
-
-type Props = {
- sendFeedback: (values: FormValues) => Promise
-}
-
-export function FeedbackButtonClient({ sendFeedback }: Props) {
- const { toast } = useToast()
- const isDesktop = useMediaQuery('(min-width: 768px)')
-
- async function onSubmit(values: FormValues) {
- await sendFeedback(values)
- toast({
- title: 'Thank you for your feedback!',
- description:
- 'We will have a look at it as soon as possible, and will get back to you if needed.',
- })
- }
-
- return (
-
+ Spliit is offered for free, but costs money and energy. If you like
+ the app, you can choose to support it by buying me (Sebastien) a
+ coffee with a one-time small donation.
+
+
By supporting Spliit:
+
+
+ You contribute to the hosting costs for the app
+ (currently ~$150/year).
+
+
+ You help us keeping the application{' '}
+ free and without ads.
+
+
+ You give me energy to build new features and
+ improve the application.
+
+
+
+ You will be redirected to Stripe, our payment
+ provider, where you can choose an amount to donate and complete the
+ payment.
+