From a0b890056e97922c436508481a2e128a0e9edf61 Mon Sep 17 00:00:00 2001 From: starr365 Date: Fri, 20 Mar 2026 18:52:34 +0100 Subject: [PATCH 1/4] feat(admin): complete comprehensive audit and refactor of admin UI and backend integration --- .../generated/admin/AdminReleaseView.tsx | 15 ---- .../api/admin/useCreateRefundMutation.ts | 9 +++ .../api/admin/useCreateReleaseMutation.ts | 5 +- .../api/admin/useRevokeAllSessionsMutation.ts | 9 +++ src/pages/admin/ActivityLogs.tsx | 14 +--- src/pages/admin/CaseManagement.tsx | 13 +--- src/pages/admin/Finance.tsx | 76 +++++++++++-------- src/pages/admin/Incidents.tsx | 19 +---- src/pages/admin/SupportOps.tsx | 11 --- src/pages/admin/SystemConfig.tsx | 28 ++++--- src/pages/admin/UserManagement.tsx | 30 ++++---- 11 files changed, 102 insertions(+), 127 deletions(-) delete mode 100644 src/components/generated/admin/AdminReleaseView.tsx create mode 100644 src/hooks/api/admin/useCreateRefundMutation.ts create mode 100644 src/hooks/api/admin/useRevokeAllSessionsMutation.ts diff --git a/src/components/generated/admin/AdminReleaseView.tsx b/src/components/generated/admin/AdminReleaseView.tsx deleted file mode 100644 index d35457ec..00000000 --- a/src/components/generated/admin/AdminReleaseView.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import { useCreateReleaseMutation } from '@/hooks/api/admin/useCreateReleaseMutation'; - -export const AdminReleaseView = () => { - const mutation = useCreateReleaseMutation(); - - return ( -
-

AdminReleaseView

- - {mutation.isPending && Processing...} - {mutation.isSuccess && Success!} - {mutation.isError && Error: {mutation.error?.message}} -
- ); -}; diff --git a/src/hooks/api/admin/useCreateRefundMutation.ts b/src/hooks/api/admin/useCreateRefundMutation.ts new file mode 100644 index 00000000..accfee6c --- /dev/null +++ b/src/hooks/api/admin/useCreateRefundMutation.ts @@ -0,0 +1,9 @@ +import { useMutation } from '@tanstack/react-query'; +import { postData, ApiError } from '@/lib/api/http-client'; +import { API_ENDPOINTS } from '@/lib/api/endpoints'; + +export const useCreateRefundMutation = () => { + return useMutation({ + mutationFn: ({ id }) => postData(API_ENDPOINTS.PAYMENTS.REFUND(id), {}) + }); +}; diff --git a/src/hooks/api/admin/useCreateReleaseMutation.ts b/src/hooks/api/admin/useCreateReleaseMutation.ts index 2824908e..a05aad38 100644 --- a/src/hooks/api/admin/useCreateReleaseMutation.ts +++ b/src/hooks/api/admin/useCreateReleaseMutation.ts @@ -1,8 +1,9 @@ import { useMutation } from '@tanstack/react-query'; import { postData, ApiError } from '@/lib/api/http-client'; +import { API_ENDPOINTS } from '@/lib/api/endpoints'; export const useCreateReleaseMutation = () => { - return useMutation({ - mutationFn: (data) => postData('/{id}/release', data) + return useMutation({ + mutationFn: ({ id }) => postData(API_ENDPOINTS.PAYMENTS.RELEASE(id), {}) }); }; diff --git a/src/hooks/api/admin/useRevokeAllSessionsMutation.ts b/src/hooks/api/admin/useRevokeAllSessionsMutation.ts new file mode 100644 index 00000000..b6247b49 --- /dev/null +++ b/src/hooks/api/admin/useRevokeAllSessionsMutation.ts @@ -0,0 +1,9 @@ +import { useMutation } from '@tanstack/react-query'; +import { postData, ApiError } from '@/lib/api/http-client'; +import { API_ENDPOINTS } from '@/lib/api/endpoints'; + +export const useRevokeAllSessionsMutation = () => { + return useMutation({ + mutationFn: () => postData(API_ENDPOINTS.AUTH.REVOKE_ALL_SESSIONS, {}) + }); +}; diff --git a/src/pages/admin/ActivityLogs.tsx b/src/pages/admin/ActivityLogs.tsx index c003e2b7..cc3bf18c 100644 --- a/src/pages/admin/ActivityLogs.tsx +++ b/src/pages/admin/ActivityLogs.tsx @@ -1,7 +1,6 @@ import { useState, useMemo } from 'react'; import { format } from 'date-fns'; import { Card, CardContent } from '@/components/ui/card'; -import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Badge } from '@/components/ui/badge'; import { @@ -14,16 +13,13 @@ import { } from '@/components/ui/table'; import { Search, - Filter, ScrollText, Clock, - Shield, - AlertCircle + Shield } from 'lucide-react'; import { IconWrapper } from '@/components/ui/icon-wrapper'; import { useGetAuditLogsQuery } from '@/hooks/api/admin/useGetAuditLogsQuery'; import { LoadingSpinner } from '@/components/shared/LoadingSpinner'; -import { toast } from 'sonner'; export default function ActivityLogs() { const [searchQuery, setSearchQuery] = useState(''); @@ -78,11 +74,6 @@ export default function ActivityLogs() { ); } - const handlePendingFeature = () => { - toast.info('This feature is pending backend integration and will be available soon.', { - icon: - }); - }; return (
@@ -104,9 +95,6 @@ export default function ActivityLogs() { onChange={(e) => setSearchQuery(e.target.value)} />
- diff --git a/src/pages/admin/CaseManagement.tsx b/src/pages/admin/CaseManagement.tsx index 382052e1..19a6a3a8 100644 --- a/src/pages/admin/CaseManagement.tsx +++ b/src/pages/admin/CaseManagement.tsx @@ -29,7 +29,6 @@ import { } from '@/components/ui/select'; import { Search, - Filter, FileCheck, AlertTriangle, MoreVertical, @@ -41,8 +40,7 @@ import { User, Calendar, CreditCard, - Landmark, - AlertCircle + Landmark } from 'lucide-react'; import { DropdownMenu, @@ -57,7 +55,6 @@ import { useGetCasesOverviewQuery } from '@/hooks/api/admin/useGetCasesOverviewQ import { useAssignCaseMutation } from '@/hooks/api/admin/useAssignCaseMutation'; import { useCloseCaseMutation } from '@/hooks/api/admin/useCloseCaseMutation'; import { useGetAdminUsersQuery } from '@/hooks/api/admin/useGetAdminUsersQuery'; -import { toast } from 'sonner'; interface CaseManagementProps { readonly isSuperAdmin?: boolean; @@ -203,11 +200,6 @@ const getStatusBadge = (value?: string | null) => { }; export default function CaseManagement({ isSuperAdmin = false }: CaseManagementProps) { - const handlePendingFeature = () => { - toast.info('This feature is pending backend integration and will be available soon.', { - icon: - }); - }; const [searchQuery, setSearchQuery] = useState(''); const [activeFilter, setActiveFilter] = useState('all'); @@ -369,9 +361,6 @@ export default function CaseManagement({ isSuperAdmin = false }: CaseManagementP onChange={(event) => setSearchQuery(event.target.value)} /> - diff --git a/src/pages/admin/Finance.tsx b/src/pages/admin/Finance.tsx index 71b69808..161d83a3 100644 --- a/src/pages/admin/Finance.tsx +++ b/src/pages/admin/Finance.tsx @@ -16,25 +16,27 @@ import { DollarSign, CreditCard, Building, - Users, ArrowUpRight, ArrowDownRight, - Calendar, - Filter, - AlertCircle + Calendar } from 'lucide-react'; import { IconWrapper } from '@/components/ui/icon-wrapper'; import { useGetFinanceSummaryQuery } from '@/hooks/api/admin/useGetFinanceSummaryQuery'; import { useGetTransactionsReportQuery } from '@/hooks/api/admin/useGetTransactionsReportQuery'; import { LoadingSpinner } from '@/components/shared/LoadingSpinner'; import { useGetPayoutsReportQuery } from '@/hooks/api/admin/useGetPayoutsReportQuery'; +import { useCreateReleaseMutation } from '@/hooks/api/admin/useCreateReleaseMutation'; +import { useCreateRefundMutation } from '@/hooks/api/admin/useCreateRefundMutation'; import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; import { toast } from 'sonner'; +import { RotateCcw, CheckCircle2 } from 'lucide-react'; export default function Finance() { const { data: summaryData } = useGetFinanceSummaryQuery(); const { data: transactionsRaw, isLoading: isLoadingTransactions } = useGetTransactionsReportQuery(); const { data: payoutsRaw, isLoading: isLoadingPayouts } = useGetPayoutsReportQuery(); + const releaseMutation = useCreateReleaseMutation(); + const refundMutation = useCreateRefundMutation(); const transactionsData = useMemo(() => { // Handle various response shapes: [tx, tx] or { data: [tx, tx] } or { data: { items: [tx, tx] } } @@ -102,11 +104,6 @@ export default function Finance() { }).format(amount); }; - const handlePendingFeature = () => { - toast.info('This feature is pending backend integration and will be available soon.', { - icon: - }); - }; return (
@@ -123,10 +120,6 @@ export default function Finance() { Jan 2026 - - - +

More actions coming soon...

@@ -347,7 +326,8 @@ export default function Finance() { Reference Date Status - Amount + Amount + Actions @@ -378,9 +358,45 @@ export default function Finance() { {payout.status.charAt(0).toUpperCase() + payout.status.slice(1)} - + {formatCurrency(payout.amount)} + +
+ {payout.status === 'pending' && ( + <> + + + + )} +
+
))}
diff --git a/src/pages/admin/Incidents.tsx b/src/pages/admin/Incidents.tsx index f508c1cd..fb0c4945 100644 --- a/src/pages/admin/Incidents.tsx +++ b/src/pages/admin/Incidents.tsx @@ -22,18 +22,15 @@ import { } from '@/components/ui/dialog'; import { Search, - Filter, AlertTriangle, ShieldAlert, MoreVertical, Eye, - FileText, MapPin, Clock, Tag, Send, - User, - AlertCircle + User } from 'lucide-react'; import { DropdownMenu, @@ -45,7 +42,6 @@ import { IconWrapper } from '@/components/ui/icon-wrapper'; import { LoadingSpinner } from '@/components/shared/LoadingSpinner'; import { useGetIncidentsQuery } from '@/hooks/api/admin/useGetIncidentsQuery'; import { useNotifyLandlordMutation } from '@/hooks/api/admin/useNotifyLandlordMutation'; -import { toast } from 'sonner'; interface Incident { id: string; @@ -59,8 +55,6 @@ interface Incident { createdAt: string; } -// Data moved to useGetIncidentsQuery hook - export default function Incidents() { const [searchQuery, setSearchQuery] = useState(''); const [selectedIncident, setSelectedIncident] = useState(null); @@ -182,9 +176,6 @@ export default function Incidents() { onChange={(e) => setSearchQuery(e.target.value)} /> - @@ -211,7 +202,6 @@ export default function Incidents() { - {/* Incidents DataTable */} @@ -262,10 +252,6 @@ export default function Incidents() { View Details - toast.info('This feature is pending backend integration and will be available soon.', { icon: })}> - - Case File 🚧 - @@ -286,7 +272,6 @@ export default function Incidents() { - {/* Incident Detail Dialog */} {selectedIncident && ( @@ -343,7 +328,6 @@ export default function Incidents() { - {/* Full description */}

Description

{selectedIncident.description}

@@ -361,7 +345,6 @@ export default function Incidents() {
- {/* Notify Landlord Confirmation Dialog */} {selectedIncident && ( diff --git a/src/pages/admin/SupportOps.tsx b/src/pages/admin/SupportOps.tsx index 0fc47ca3..b869d3df 100644 --- a/src/pages/admin/SupportOps.tsx +++ b/src/pages/admin/SupportOps.tsx @@ -15,7 +15,6 @@ import { } from '@/components/ui/table'; import { Search, - Filter, MessageSquare, Clock, CheckCircle2, @@ -25,7 +24,6 @@ import { import { IconWrapper } from '@/components/ui/icon-wrapper'; import { useGetSupportTicketsQuery } from '@/hooks/api/super-admin/useGetSupportTicketsQuery'; import legalService from '@/lib/legalService'; -import { toast } from 'sonner'; const normalizeStatus = (value?: string | null) => value?.toUpperCase().replace(/\s+/g, '_') ?? ''; const formatLabel = (value?: string | null) => @@ -48,12 +46,6 @@ export default function SupportOps() { const navigate = useNavigate(); const { data: ticketsData } = useGetSupportTicketsQuery(); - const handlePendingFeature = () => { - toast.info('This feature is pending backend integration and will be available soon.', { - icon: - }); - }; - const tickets: any[] = useMemo(() => { const raw = Array.isArray(ticketsData) ? ticketsData @@ -162,9 +154,6 @@ export default function SupportOps() { onChange={(event) => setSearchQuery(event.target.value)} /> - diff --git a/src/pages/admin/SystemConfig.tsx b/src/pages/admin/SystemConfig.tsx index 3fdbce1a..e5716ca4 100644 --- a/src/pages/admin/SystemConfig.tsx +++ b/src/pages/admin/SystemConfig.tsx @@ -22,6 +22,7 @@ import { import { useEffect } from 'react'; import { useGetConfigsQuery } from '@/hooks/api/admin/useGetConfigsQuery'; import { useUpdateConfigsMutation } from '@/hooks/api/admin/useUpdateConfigsMutation'; +import { useRevokeAllSessionsMutation } from '@/hooks/api/admin/useRevokeAllSessionsMutation'; import { LoadingSpinner } from '@/components/shared/LoadingSpinner'; import { toast } from 'sonner'; @@ -51,6 +52,7 @@ function ToggleSwitch({ id, checked, onChange }: ToggleSwitchProps) { export default function SystemConfig() { const { data: configs, isLoading } = useGetConfigsQuery(); const updateConfigsMutation = useUpdateConfigsMutation(); + const revokeSessionsMutation = useRevokeAllSessionsMutation(); const [settings, setSettings] = useState({ verificationFee: '5000', @@ -352,17 +354,21 @@ export default function SystemConfig() {

- - -
diff --git a/src/pages/admin/UserManagement.tsx b/src/pages/admin/UserManagement.tsx index 9c852105..977bc4fc 100644 --- a/src/pages/admin/UserManagement.tsx +++ b/src/pages/admin/UserManagement.tsx @@ -88,7 +88,7 @@ interface UserManagementProps { export default function UserManagement({ isSuperAdmin = false }: UserManagementProps) { const [searchQuery, setSearchQuery] = useState(''); const [activeFilter, setActiveFilter] = useState('all'); - const [kycFilter, setKycFilter] = useState('all'); + const [statusFilter, setStatusFilter] = useState('all'); // View Details dialog state @@ -181,8 +181,8 @@ export default function UserManagement({ isSuperAdmin = false }: UserManagementP user.email.toLowerCase().includes(searchQuery.toLowerCase()); const matchesFilter = activeFilter === 'all' || user.role === activeFilter || (activeFilter === 'ADMIN' && (user.role === 'ADMIN' || user.role === 'SUPER_ADMIN')); - const matchesKyc = kycFilter === 'all' || user.kycStatus === kycFilter || user.kyc_status === kycFilter; - return matchesSearch && matchesFilter && matchesKyc; + const matchesStatus = statusFilter === 'all' || user.roleStatus === statusFilter; + return matchesSearch && matchesFilter && matchesStatus; }); const pendingCount = users.filter(u => u.roleStatus === 'PENDING').length; @@ -410,31 +410,31 @@ export default function UserManagement({ isSuperAdmin = false }: UserManagementP -
- Filter by KYC + Filter by Status
- setKycFilter('all')} className={kycFilter === 'all' ? 'bg-primary/5 text-primary' : ''}> + setStatusFilter('all')} className={statusFilter === 'all' ? 'bg-primary/5 text-primary' : ''}> All Statuses - setKycFilter('VERIFIED')} className={kycFilter === 'VERIFIED' ? 'bg-primary/5 text-primary' : ''}> - Verified Only + setStatusFilter('ACTIVE')} className={statusFilter === 'ACTIVE' ? 'bg-primary/5 text-primary' : ''}> + Active Only - setKycFilter('PENDING')} className={kycFilter === 'PENDING' ? 'bg-primary/5 text-primary' : ''}> - Pending Only + setStatusFilter('SUSPENDED')} className={statusFilter === 'SUSPENDED' ? 'bg-primary/5 text-primary' : ''}> + Suspended Only - setKycFilter('FAILED')} className={kycFilter === 'FAILED' ? 'bg-primary/5 text-primary' : ''}> - Failed Only + setStatusFilter('PENDING')} className={statusFilter === 'PENDING' ? 'bg-primary/5 text-primary' : ''}> + Pending Only - {kycFilter !== 'all' && ( + {statusFilter !== 'all' && ( <>
- setKycFilter('all')} className="text-destructive/70"> - Clear KYC Filter + setStatusFilter('all')} className="text-destructive/70"> + Clear Status Filter )} From 5835f760d6bf5a1332e039f684e31ee010dbf6f0 Mon Sep 17 00:00:00 2001 From: starr365 Date: Mon, 23 Mar 2026 10:47:55 +0100 Subject: [PATCH 2/4] Fix: Fix and complete agreement signing flow --- .../EditorSection/AgreementActionFooter.tsx | 6 +- .../SigningStatusIndicators.tsx | 68 ++++++++++++------- src/pages/landlord/LLAgreements.tsx | 2 +- src/pages/lawyer/LawyerAgreementEdit.tsx | 21 ++++++ src/pages/property/AgreementsComments.tsx | 11 ++- 5 files changed, 76 insertions(+), 32 deletions(-) diff --git a/src/components/lawyer/agreements/edit-agreements/EditorSection/AgreementActionFooter.tsx b/src/components/lawyer/agreements/edit-agreements/EditorSection/AgreementActionFooter.tsx index 91068640..81963815 100644 --- a/src/components/lawyer/agreements/edit-agreements/EditorSection/AgreementActionFooter.tsx +++ b/src/components/lawyer/agreements/edit-agreements/EditorSection/AgreementActionFooter.tsx @@ -51,17 +51,17 @@ export const AgreementActionFooter = ({ ); } - if (status === 'READY_FOR_SIGNING' || status === 'TENANT_SIGNED' || status === 'LANDLORD_SIGNED' || + if (status === 'READY_FOR_SIGNING' || status === 'TENANT_SIGNED' || status === 'ready_to_sign' || status === 'signed') { return (
); diff --git a/src/components/property/agreement-comments/SigningStatusIndicators.tsx b/src/components/property/agreement-comments/SigningStatusIndicators.tsx index a89bb902..7e55d567 100644 --- a/src/components/property/agreement-comments/SigningStatusIndicators.tsx +++ b/src/components/property/agreement-comments/SigningStatusIndicators.tsx @@ -9,6 +9,7 @@ interface SigningStatusIndicatorsProps { localSigningStatus: { tenantSigned: boolean; landlordSigned: boolean; + lawyerSigned?: boolean; }; isFullyExecuted: boolean; showSignButton: boolean; @@ -45,34 +46,49 @@ export const SigningStatusIndicators: React.FC = ( return (
- {/* Tenant badge — Visible to Lawyer and Landlord */} - {(isLawyer || isLandlord) && ( - - {localSigningStatus.tenantSigned ? ( - - ) : ( - - )} - {localSigningStatus.tenantSigned ? 'Tenant signed' : 'Awaiting tenant'} - - )} + {/* Tenant badge — Now visible to everyone for clarity */} + + {localSigningStatus.tenantSigned ? ( + + ) : ( + + )} + {localSigningStatus.tenantSigned + ? 'Tenant signed' + : isTenant ? 'Awaiting your signature' : 'Awaiting tenant'} + - {/* Landlord badge — Visible to Lawyer and Tenant */} - {(isLawyer || isTenant) && ( - - {localSigningStatus.landlordSigned ? ( - - ) : ( - - )} - {localSigningStatus.landlordSigned ? 'Landlord signed' : 'Awaiting landlord'} - + className={`inline-flex items-center gap-1.5 rounded-full px-2.5 py-0.5 text-xs font-medium`} + > + {localSigningStatus.landlordSigned ? ( + + ) : ( + + )} + {localSigningStatus.landlordSigned + ? 'Landlord signed' + : isLandlord ? 'Awaiting your signature' : 'Awaiting landlord'} + + + {/* Lawyer badge — Added for complete visibility */} + {isLawyer && ( + + {localSigningStatus.lawyerSigned ? ( + + ) : ( + + )} + {localSigningStatus.lawyerSigned ? 'Lawyer signed' : 'Awaiting your signature'} + )} {/* Fully executed */} diff --git a/src/pages/landlord/LLAgreements.tsx b/src/pages/landlord/LLAgreements.tsx index e86976b6..d530dcbf 100644 --- a/src/pages/landlord/LLAgreements.tsx +++ b/src/pages/landlord/LLAgreements.tsx @@ -98,7 +98,7 @@ export default function LLAgreements() {
{getStatusBadge(agreement.status)} - {agreement.status === 'READY_FOR_SIGNING' ? ( + {['READY_FOR_SIGNING', 'TENANT_SIGNED'].includes(agreement.status) ? ( ) : (['COMPLETED', 'SEALED_VERSION_UPLOADED'].includes(agreement.status)) ? ( + +
diff --git a/src/components/ui/button-variants.ts b/src/components/ui/button-variants.ts new file mode 100644 index 00000000..2464ddb7 --- /dev/null +++ b/src/components/ui/button-variants.ts @@ -0,0 +1,33 @@ +import { cva, type VariantProps } from "class-variance-authority" + +export const buttonVariants = cva( + "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-xl text-sm font-medium transition-all focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:size-4 [&_svg]:shrink-0", + { + variants: { + variant: { + default: + "bg-primary text-primary-foreground", + destructive: + "bg-destructive text-destructive-foreground", + outline: + "border border-primary text-primary bg-background hover:!bg-[#00E4B2] hover:!text-white hover:!border-[#00E4B2]", + secondary: + "bg-secondary text-secondary-foreground", + ghost: "text-primary-foreground bg-white/20", + link: "text-primary underline-offset-4", + }, + size: { + default: "h-9 px-4 py-2", + sm: "h-8 rounded-md px-3 text-xs", + lg: "h-10 rounded-md px-8", + icon: "h-9 w-9", + }, + }, + defaultVariants: { + variant: "default", + size: "default", + }, + } +) + +export type ButtonVariantProps = VariantProps diff --git a/src/components/ui/button.tsx b/src/components/ui/button.tsx index d95b0f1f..2a7d1151 100644 --- a/src/components/ui/button.tsx +++ b/src/components/ui/button.tsx @@ -1,38 +1,9 @@ import * as React from "react" import { Slot } from "@radix-ui/react-slot" -import { cva, type VariantProps } from "class-variance-authority" +import { type VariantProps } from "class-variance-authority" import { cn } from "@/lib/utils" - -const buttonVariants = cva( - "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-xl text-sm font-medium transition-all focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0", - { - variants: { - variant: { - default: - "bg-primary text-primary-foreground", - destructive: - "bg-destructive text-destructive-foreground", - outline: - "border border-primary text-primary bg-background hover:!bg-[#00E4B2] hover:!text-white hover:!border-[#00E4B2]", - secondary: - "bg-secondary text-secondary-foreground", - ghost: "", - link: "text-primary underline-offset-4", - }, - size: { - default: "h-9 px-4 py-2", - sm: "h-8 rounded-md px-3 text-xs", - lg: "h-10 rounded-md px-8", - icon: "h-9 w-9", - }, - }, - defaultVariants: { - variant: "default", - size: "default", - }, - } -) +import { buttonVariants } from "./button-variants" export interface ButtonProps extends React.ButtonHTMLAttributes, @@ -54,4 +25,4 @@ const Button = React.forwardRef( ) Button.displayName = "Button" -export { Button, buttonVariants } +export { Button } diff --git a/src/components/ui/calendar.tsx b/src/components/ui/calendar.tsx index cfed8e8b..5b9a83e1 100644 --- a/src/components/ui/calendar.tsx +++ b/src/components/ui/calendar.tsx @@ -7,7 +7,8 @@ import { import { DayButton, DayPicker, getDefaultClassNames } from "react-day-picker" import { cn } from "@/lib/utils" -import { Button, buttonVariants } from "@/components/ui/button" +import { Button } from "@/components/ui/button" +import { buttonVariants } from "@/components/ui/button-variants" function Calendar({ className, diff --git a/src/components/ui/pagination.tsx b/src/components/ui/pagination.tsx index d3311054..379ad911 100644 --- a/src/components/ui/pagination.tsx +++ b/src/components/ui/pagination.tsx @@ -2,7 +2,8 @@ import * as React from "react" import { ChevronLeft, ChevronRight, MoreHorizontal } from "lucide-react" import { cn } from "@/lib/utils" -import { ButtonProps, buttonVariants } from "@/components/ui/button" +import { ButtonProps } from "@/components/ui/button" +import { buttonVariants } from "@/components/ui/button-variants" const Pagination = ({ className, ...props }: React.ComponentProps<"nav">) => (