diff --git a/apps/mail/components/create/schedule-send-picker.tsx b/apps/mail/components/create/schedule-send-picker.tsx
index 3288e8678..9de4ec04c 100644
--- a/apps/mail/components/create/schedule-send-picker.tsx
+++ b/apps/mail/components/create/schedule-send-picker.tsx
@@ -1,7 +1,8 @@
import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover';
-import { Clock } from 'lucide-react';
-import { format, isValid } from 'date-fns';
import { useState, useEffect } from 'react';
+import { format, isValid } from 'date-fns';
+import { Button } from '../ui/button';
+import { Clock } from 'lucide-react';
import { cn } from '@/lib/utils';
import { toast } from 'sonner';
@@ -79,14 +80,15 @@ export const ScheduleSendPicker: React.FC
= ({
return (
-
+
@@ -109,10 +111,10 @@ export const ScheduleSendPicker: React.FC = ({
type="datetime-local"
value={displayValue}
onChange={handleChange}
- className="w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 [&::-webkit-calendar-picker-indicator]:hidden [&::-webkit-calendar-picker-indicator]:opacity-0"
+ className="border-input bg-background ring-offset-background placeholder:text-muted-foreground focus-visible:ring-ring w-full rounded-md border px-3 py-2 text-sm file:border-0 file:bg-transparent file:text-sm file:font-medium focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 [&::-webkit-calendar-picker-indicator]:hidden [&::-webkit-calendar-picker-indicator]:opacity-0"
/>
);
-};
\ No newline at end of file
+};
diff --git a/apps/mail/components/create/template-button.tsx b/apps/mail/components/create/template-button.tsx
index 55bb5f861..e0fdee4ab 100644
--- a/apps/mail/components/create/template-button.tsx
+++ b/apps/mail/components/create/template-button.tsx
@@ -1,7 +1,3 @@
-import { useTemplates } from '@/hooks/use-templates';
-import { useTRPC } from '@/providers/query-provider';
-import { Editor } from '@tiptap/react';
-import { Button } from '@/components/ui/button';
import {
DropdownMenu,
DropdownMenuContent,
@@ -11,10 +7,6 @@ import {
DropdownMenuSubTrigger,
DropdownMenuTrigger,
} from '@/components/ui/dropdown-menu';
-import { toast } from 'sonner';
-import { useMutation, useQueryClient } from '@tanstack/react-query';
-import { FileText, Save, Trash2 } from 'lucide-react';
-import React, { useState, useMemo, useDeferredValue, useCallback, startTransition } from 'react';
import {
Dialog,
DialogContent,
@@ -22,8 +14,16 @@ import {
DialogHeader,
DialogTitle,
} from '@/components/ui/dialog';
-import { Input } from '@/components/ui/input';
+import React, { useState, useMemo, useDeferredValue, useCallback, startTransition } from 'react';
+import { useMutation, useQueryClient } from '@tanstack/react-query';
+import { FileText, Save, Trash2 } from 'lucide-react';
+import { useTRPC } from '@/providers/query-provider';
+import { useTemplates } from '@/hooks/use-templates';
+import { Button } from '@/components/ui/button';
import { TRPCClientError } from '@trpc/client';
+import { Input } from '@/components/ui/input';
+import { Editor } from '@tiptap/react';
+import { toast } from 'sonner';
type RecipientField = 'to' | 'cc' | 'bcc';
@@ -37,9 +37,11 @@ type Template = {
bcc?: string[] | null;
};
-type TemplatesQueryData = {
- templates: Template[];
-} | undefined;
+type TemplatesQueryData =
+ | {
+ templates: Template[];
+ }
+ | undefined;
interface TemplateButtonProps {
editor: Editor | null;
@@ -63,7 +65,7 @@ const TemplateButtonComponent: React.FC = ({
const trpc = useTRPC();
const queryClient = useQueryClient();
const { data } = useTemplates();
-
+
const templates: Template[] = data?.templates ?? [];
const [menuOpen, setMenuOpen] = useState(false);
@@ -76,9 +78,7 @@ const TemplateButtonComponent: React.FC = ({
const filteredTemplates = useMemo(() => {
if (!deferredSearch.trim()) return templates;
- return templates.filter((t) =>
- t.name.toLowerCase().includes(deferredSearch.toLowerCase()),
- );
+ return templates.filter((t) => t.name.toLowerCase().includes(deferredSearch.toLowerCase()));
}, [deferredSearch, templates]);
const { mutateAsync: createTemplate } = useMutation(trpc.templates.create.mutationOptions());
@@ -123,16 +123,19 @@ const TemplateButtonComponent: React.FC = ({
}
};
- const handleApplyTemplate = useCallback((template: Template) => {
- if (!editor) return;
- startTransition(() => {
- if (template.subject) setSubject(template.subject);
- if (template.body) editor.commands.setContent(template.body, false);
- if (template.to) setRecipients('to', template.to);
- if (template.cc) setRecipients('cc', template.cc);
- if (template.bcc) setRecipients('bcc', template.bcc);
- });
- }, [editor, setSubject, setRecipients]);
+ const handleApplyTemplate = useCallback(
+ (template: Template) => {
+ if (!editor) return;
+ startTransition(() => {
+ if (template.subject) setSubject(template.subject);
+ if (template.body) editor.commands.setContent(template.body, false);
+ if (template.to) setRecipients('to', template.to);
+ if (template.cc) setRecipients('cc', template.cc);
+ if (template.bcc) setRecipients('bcc', template.bcc);
+ });
+ },
+ [editor, setSubject, setRecipients],
+ );
const handleDeleteTemplate = useCallback(
async (templateId: string) => {
@@ -157,7 +160,13 @@ const TemplateButtonComponent: React.FC = ({
<>
-
@@ -177,7 +186,7 @@ const TemplateButtonComponent: React.FC = ({
Use template
-
+
= ({
>
{t.name}
{
e.stopPropagation();
- setMenuOpen(false);
+ setMenuOpen(false);
toast(`Delete template "${t.name}"?`, {
duration: 10000,
action: {
@@ -217,7 +226,7 @@ const TemplateButtonComponent: React.FC = ({
))}
{filteredTemplates.length === 0 && (
- No templates
+ No templates
)}
@@ -231,7 +240,7 @@ const TemplateButtonComponent: React.FC
= ({
Save as Template
-