-
-
-
-
- مدیریت کدهای تخفیف
-
-
ایجاد و مدیریت کدهای تخفیف
-
-
-
-
-
+ const createButton = (
+
+
+
+ );
-
-
+ return (
+
+
+
+
+
کد
{
className="w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md focus:outline-none focus:ring-1 focus:ring-primary-500 dark:bg-gray-700 dark:text-gray-100"
/>
-
+
+
+ {isLoading ? (
+
+ ) : !discountCodes || discountCodes.length === 0 ? (
+
+
+
+ ایجاد کد تخفیف
+ >
+ }
+ onAction={handleCreate}
+ />
+
+ ) : (
+
+ )}
+
+ setDeleteId(null)}
+ onConfirm={handleDeleteConfirm}
+ title="حذف کد تخفیف"
+ message="آیا از حذف این کد تخفیف اطمینان دارید؟ این عمل قابل بازگشت نیست."
+ isLoading={isDeleting}
+ />
-
- {isLoading ? (
-
- ) : !discountCodes || discountCodes.length === 0 ? (
-
-
-
-
هیچ کد تخفیفی یافت نشد
-
برای شروع یک کد تخفیف ایجاد کنید
-
-
- ایجاد کد تخفیف
-
-
-
- ) : (
-
- )}
-
-
setDeleteId(null)} title="حذف کد تخفیف">
-
-
آیا از حذف این کد تخفیف اطمینان دارید؟ این عمل قابل بازگشت نیست.
-
- setDeleteId(null)} disabled={isDeleting}>انصراف
- حذف
-
-
-
-
+
);
};
diff --git a/src/pages/orders/orders-list/OrdersListPage.tsx b/src/pages/orders/orders-list/OrdersListPage.tsx
index 7606489..c6d3010 100644
--- a/src/pages/orders/orders-list/OrdersListPage.tsx
+++ b/src/pages/orders/orders-list/OrdersListPage.tsx
@@ -6,7 +6,7 @@ import { OrderFilters, OrderStatus } from '../core/_models';
import { Button } from "@/components/ui/Button";
import { Modal } from "@/components/ui/Modal";
import { Pagination } from "@/components/ui/Pagination";
-import { PageContainer, PageTitle } from "@/components/ui/Typography";
+import { PageContainer } from "@/components/ui/Typography";
import { Table } from "@/components/ui/Table";
import { TableColumn } from "@/types";
import { StatsCard } from '@/components/dashboard/StatsCard';
@@ -20,46 +20,16 @@ import {
Clock,
Search,
Filter,
- Eye,
Edit3,
TrendingUp
} from 'lucide-react';
+import { PageHeader } from '@/components/layout/PageHeader';
+import { FiltersSection } from '@/components/common/FiltersSection';
+import { EmptyState } from '@/components/common/EmptyState';
+import { ActionButtons } from '@/components/common/ActionButtons';
+import { StatusBadge } from '@/components/ui/StatusBadge';
+import { formatCurrency, formatDate } from '@/utils/formatters';
-const getStatusColor = (status: OrderStatus) => {
- const colors = {
- pending: 'bg-yellow-100 text-yellow-800 dark:bg-yellow-900 dark:text-yellow-200',
- processing: 'bg-blue-100 text-blue-800 dark:bg-blue-900 dark:text-blue-200',
- shipped: 'bg-purple-100 text-purple-800 dark:bg-purple-900 dark:text-purple-200',
- delivered: 'bg-green-100 text-green-800 dark:bg-green-900 dark:text-green-200',
- cancelled: 'bg-red-100 text-red-800 dark:bg-red-900 dark:text-red-200',
- refunded: 'bg-gray-100 text-gray-800 dark:bg-gray-900 dark:text-gray-200',
- };
- return colors[status] || colors.pending;
-};
-
-const getStatusText = (status: OrderStatus) => {
- const text = {
- pending: 'در انتظار',
- processing: 'در حال پردازش',
- shipped: 'ارسال شده',
- delivered: 'تحویل شده',
- cancelled: 'لغو شده',
- refunded: 'مرجوع شده',
- };
- return text[status] || status;
-};
-
-const formatCurrency = (amount: number) => {
- return new Intl.NumberFormat('fa-IR').format(amount) + ' تومان';
-};
-
-const formatDate = (dateString: string) => {
- return new Date(dateString).toLocaleDateString('fa-IR');
-};
-
-const ListSkeleton = () => (
-
-);
const getDefaultFilters = (): OrderFilters => ({
page: 1,
@@ -219,7 +189,7 @@ const OrdersListPage = () => {
)
},
{ key: 'final_total', label: 'مبلغ نهایی', sortable: true, align: 'right', render: (v: number, row: any) => formatCurrency(row.final_total || row.total_amount || 0) },
- { key: 'status', label: 'وضعیت', align: 'right', render: (v: OrderStatus) => (
{getStatusText(v)} ) },
+ { key: 'status', label: 'وضعیت', align: 'right', render: (v: OrderStatus) =>
},
{ key: 'created_at', label: 'تاریخ', sortable: true, align: 'right', render: (v: string) => formatDate(v) },
{
key: 'actions',
@@ -227,13 +197,9 @@ const OrdersListPage = () => {
align: 'right',
render: (_val, row: any) => (
-
handleViewOrder(row.id)}
- className="text-indigo-600 hover:text-indigo-900 dark:text-indigo-400 dark:hover:text-indigo-300"
- title="مشاهده جزئیات"
- >
-
-
+
handleViewOrder(row.id)}
+ />
handleUpdateStatus(row.id, row.status)}
className="text-green-600 hover:text-green-900 dark:text-green-400 dark:hover:text-green-300"
@@ -280,17 +246,11 @@ const OrdersListPage = () => {
return (
-
-
-
-
- مدیریت سفارشات
-
-
- {ordersData?.total || 0} سفارش یافت شد
-
-
-
+
{statsLoading ? (
@@ -468,14 +428,14 @@ const OrdersListPage = () => {
{/* جدول سفارشات */}
{isLoading ? (
-
+
) : !ordersData?.orders || ordersData.orders.length === 0 ? (
-
-
-
هیچ سفارشی یافت نشد
-
با تغییر فیلترها جستجو کنید
-
+
) : (
<>
diff --git a/src/pages/products/product-form/ProductFormPage.tsx b/src/pages/products/product-form/ProductFormPage.tsx
index ea33299..182a363 100644
--- a/src/pages/products/product-form/ProductFormPage.tsx
+++ b/src/pages/products/product-form/ProductFormPage.tsx
@@ -14,7 +14,9 @@ import { Input } from "@/components/ui/Input";
import { FileUploader } from "@/components/ui/FileUploader";
import { VariantManager } from "@/components/ui/VariantManager";
import { ArrowRight, X } from "lucide-react";
-import { FormHeader, PageContainer, SectionTitle, Label } from '../../../components/ui/Typography';
+import { FormHeader, PageContainer, Label } from '../../../components/ui/Typography';
+import { FormSection } from '@/components/forms/FormSection';
+import { FormActions } from '@/components/forms/FormActions';
import { createNumberTransform, createOptionalNumberTransform, convertPersianNumbersInObject } from '../../../utils/numberUtils';
import { API_GATE_WAY, API_ROUTES } from '@/constant/routes';
import { toast } from "react-hot-toast";
@@ -471,11 +473,7 @@ const ProductFormPage = () => {
{/* Form */}
+
- {/* Images */}
-
-
- تصاویر محصول
-
+
{
)}
-
+
-
-
- فایلهای Explorer
-
+
{
)}
-
+
- {/* Variants Management */}
-
+
diff --git a/src/pages/roles/roles-list/RolesListPage.tsx b/src/pages/roles/roles-list/RolesListPage.tsx
index 821af7f..3d420bc 100644
--- a/src/pages/roles/roles-list/RolesListPage.tsx
+++ b/src/pages/roles/roles-list/RolesListPage.tsx
@@ -3,79 +3,15 @@ import { useNavigate } from 'react-router-dom';
import { useRoles, useDeleteRole } from '../core/_hooks';
import { Role } from '@/types/auth';
import { Button } from "@/components/ui/Button";
-
-import { Trash2, Edit3, Plus, UserCog, Shield, Eye, Settings } from "lucide-react";
-import { Modal } from "@/components/ui/Modal";
-import { PageContainer, PageTitle, SectionSubtitle } from '../../../components/ui/Typography';
-
-// Skeleton Loading Component
-const RolesTableSkeleton = () => (
-
- {/* Desktop Table Skeleton */}
-
-
-
-
-
-
- نام نقش
-
-
- توضیحات
-
-
- تاریخ ایجاد
-
-
- عملیات
-
-
-
-
- {[...Array(5)].map((_, index) => (
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- ))}
-
-
-
-
-
- {/* Mobile Cards Skeleton */}
-
- {[...Array(3)].map((_, index) => (
-
- ))}
-
-
-);
+import { Plus, Shield, Eye, Settings } from "lucide-react";
+import { PageContainer } from '../../../components/ui/Typography';
+import { PageHeader } from '@/components/layout/PageHeader';
+import { FiltersSection } from '@/components/common/FiltersSection';
+import { TableSkeleton } from '@/components/common/TableSkeleton';
+import { EmptyState } from '@/components/common/EmptyState';
+import { DeleteConfirmModal } from '@/components/common/DeleteConfirmModal';
+import { ActionButtons } from '@/components/common/ActionButtons';
+import { formatDate } from '@/utils/formatters';
const RolesListPage = () => {
const navigate = useNavigate();
@@ -135,66 +71,58 @@ const RolesListPage = () => {
);
}
+ const createButton = (
+
+
+
+ );
+
return (
- {/* Header */}
-
+
+
+
-
-
مدیریت نقشها و دسترسیهای سیستم
+
+ جستجو
+
+
+
-
-
-
-
-
- {/* Filters */}
-
-
- {/* Roles Table */}
{isLoading ? (
-
+
) : (roles || []).length === 0 ? (
-
-
-
- هیچ نقش یافت نشد
-
-
- {filters.search
- ? "نتیجهای برای جستجوی شما یافت نشد"
- : "شما هنوز هیچ نقش ایجاد نکردهاید"
- }
-
-
-
- اولین نقش را ایجاد کنید
-
-
+
+
+ اولین نقش را ایجاد کنید
+ >
+ }
+ onAction={handleCreate}
+ />
) : (
@@ -228,24 +156,15 @@ const RolesListPage = () => {
{role.description}
- {new Date(role.created_at).toLocaleDateString('fa-IR')}
+ {formatDate(role.created_at)}
-
handleView(role.id)}
- className="text-blue-600 hover:text-blue-900 dark:text-blue-400 dark:hover:text-blue-300"
- title="مشاهده"
- >
-
-
-
handleEdit(role.id)}
- className="text-indigo-600 hover:text-indigo-900 dark:text-indigo-400 dark:hover:text-indigo-300"
- title="ویرایش"
- >
-
-
+
handleView(role.id)}
+ onEdit={() => handleEdit(role.id)}
+ onDelete={() => setDeleteRoleId(role.id.toString())}
+ />
handlePermissions(role.id)}
className="text-green-600 hover:text-green-900 dark:text-green-400 dark:hover:text-green-300"
@@ -253,13 +172,6 @@ const RolesListPage = () => {
>
- setDeleteRoleId(role.id.toString())}
- className="text-red-600 hover:text-red-900 dark:text-red-400 dark:hover:text-red-300"
- title="حذف"
- >
-
-
@@ -284,23 +196,16 @@ const RolesListPage = () => {
- تاریخ ایجاد: {new Date(role.created_at).toLocaleDateString('fa-IR')}
+ تاریخ ایجاد: {formatDate(role.created_at)}
-
handleView(role.id)}
- className="flex items-center gap-1 px-2 py-1 text-xs text-blue-600 hover:text-blue-900 dark:text-blue-400 dark:hover:text-blue-300"
- >
-
- مشاهده
-
-
handleEdit(role.id)}
- className="flex items-center gap-1 px-2 py-1 text-xs text-indigo-600 hover:text-indigo-900 dark:text-indigo-400 dark:hover:text-indigo-300"
- >
-
- ویرایش
-
+
handleView(role.id)}
+ onEdit={() => handleEdit(role.id)}
+ onDelete={() => setDeleteRoleId(role.id.toString())}
+ showLabels={true}
+ size="sm"
+ />
handlePermissions(role.id)}
className="flex items-center gap-1 px-2 py-1 text-xs text-green-600 hover:text-green-900 dark:text-green-400 dark:hover:text-green-300"
@@ -308,13 +213,6 @@ const RolesListPage = () => {
دسترسیها
- setDeleteRoleId(role.id.toString())}
- className="flex items-center gap-1 px-2 py-1 text-xs text-red-600 hover:text-red-900 dark:text-red-400 dark:hover:text-red-300"
- >
-
- حذف
-
))}
@@ -322,31 +220,14 @@ const RolesListPage = () => {
)}
- {/* Delete Confirmation Modal */}
-
-
-
- آیا از حذف این نقش اطمینان دارید؟ این عمل قابل بازگشت نیست.
-
-
-
- انصراف
-
-
- حذف
-
-
-
-
+ message="آیا از حذف این نقش اطمینان دارید؟ این عمل قابل بازگشت نیست."
+ isLoading={isDeleting}
+ />
);
};
diff --git a/src/pages/shipping-methods/shipping-method-form/ShippingMethodFormPage.tsx b/src/pages/shipping-methods/shipping-method-form/ShippingMethodFormPage.tsx
index 0bccc97..e42bf8e 100644
--- a/src/pages/shipping-methods/shipping-method-form/ShippingMethodFormPage.tsx
+++ b/src/pages/shipping-methods/shipping-method-form/ShippingMethodFormPage.tsx
@@ -5,6 +5,7 @@ import { ShippingOpenHour } from '../core/_models';
import { Button } from '@/components/ui/Button';
import { Input } from '@/components/ui/Input';
import { TagInput } from '@/components/ui/TagInput';
+import { PageContainer } from '@/components/ui/Typography';
import { Truck } from 'lucide-react';
import { formatWithThousands, parseFormattedNumber } from '@/utils/numberUtils';
diff --git a/src/pages/users-admin/users-admin-list/UsersAdminListPage.tsx b/src/pages/users-admin/users-admin-list/UsersAdminListPage.tsx
index 70c8d1a..13c2c4a 100644
--- a/src/pages/users-admin/users-admin-list/UsersAdminListPage.tsx
+++ b/src/pages/users-admin/users-admin-list/UsersAdminListPage.tsx
@@ -1,6 +1,6 @@
import React, { useMemo, useState } from 'react';
import { useNavigate } from 'react-router-dom';
-import { Users, Plus, Search, Filter, UserCheck, UserX, Edit, Trash2, Eye, User as UserIcon } from 'lucide-react';
+import { Users, Plus, Search, Filter, UserCheck, UserX, Eye, Edit, Trash2, User as UserIcon } from 'lucide-react';
import { useSearchUsers, useUserStats, useVerifyUser, useUnverifyUser, useDeleteUser } from '../core/_hooks';
import { User, UserFilters } from '../core/_models';
import { PageContainer } from '../../../components/ui/Typography';
@@ -12,6 +12,10 @@ import { StatsCard } from '../../../components/dashboard/StatsCard';
import { Table } from '../../../components/ui/Table';
import { TableColumn } from '../../../types';
import { englishToPersian, persianToEnglish } from '../../../utils/numberUtils';
+import { PageHeader } from '@/components/layout/PageHeader';
+import { FiltersSection } from '@/components/common/FiltersSection';
+import { DeleteConfirmModal } from '@/components/common/DeleteConfirmModal';
+import { StatusBadge } from '@/components/ui/StatusBadge';
const UsersAdminListPage: React.FC = () => {
const navigate = useNavigate();
@@ -163,14 +167,7 @@ const UsersAdminListPage: React.FC = () => {
key: 'verified',
label: 'وضعیت',
align: 'center',
- render: (v: boolean) => (
-
- {v ? 'تأیید شده' : 'تأیید نشده'}
-
- )
+ render: (v: boolean) =>
},
{
key: 'actions',
@@ -231,17 +228,11 @@ const UsersAdminListPage: React.FC = () => {
return (
- {/* Header */}
-
-
-
-
- مدیریت کاربران
-
-
مشاهده و مدیریت کاربران سیستم
-
-
-
+
{/* Stats Cards */}
{stats && (
@@ -273,47 +264,44 @@ const UsersAdminListPage: React.FC = () => {
)}
- {/* Filters */}
-
-
+
{/* Users Table */}
@@ -346,36 +334,15 @@ const UsersAdminListPage: React.FC = () => {
/>
)}
- {/* Delete Confirmation Modal */}
-
setDeleteModal({ isOpen: false, user: null })}
+ onConfirm={handleDeleteConfirm}
title="حذف کاربر"
- >
-
-
- آیا از حذف کاربر "{deleteModal.user?.first_name} {deleteModal.user?.last_name}" اطمینان دارید؟
-
-
- این عمل غیرقابل بازگشت است.
-
-
- setDeleteModal({ isOpen: false, user: null })}
- >
- انصراف
-
-
- حذف
-
-
-
-
+ message={`آیا از حذف کاربر "${deleteModal.user?.first_name} ${deleteModal.user?.last_name}" اطمینان دارید؟`}
+ warningMessage="این عمل غیرقابل بازگشت است."
+ isLoading={deleteUserMutation.isPending}
+ />
{/* Verify/Unverify Confirmation Modal */}
{
+ if (price === null || price === undefined || isNaN(price)) {
+ return '0 تومان';
+ }
+ return new Intl.NumberFormat('fa-IR').format(price) + ' تومان';
+};
+
+/**
+ * Format currency amount with Persian number formatting and تومان suffix
+ */
+export const formatCurrency = (amount: number): string => {
+ if (amount === null || amount === undefined || isNaN(amount)) {
+ return '0 تومان';
+ }
+ return new Intl.NumberFormat('fa-IR').format(amount) + ' تومان';
+};
+
+/**
+ * Format date string to Persian locale
+ */
+export const formatDate = (dateString: string | Date): string => {
+ if (!dateString) return '-';
+
+ try {
+ const date = typeof dateString === 'string' ? new Date(dateString) : dateString;
+ if (isNaN(date.getTime())) return '-';
+
+ return date.toLocaleDateString('fa-IR');
+ } catch {
+ return '-';
+ }
+};
+
+/**
+ * Format date and time string to Persian locale
+ */
+export const formatDateTime = (dateString: string | Date): string => {
+ if (!dateString) return '-';
+
+ try {
+ const date = typeof dateString === 'string' ? new Date(dateString) : dateString;
+ if (isNaN(date.getTime())) return '-';
+
+ return date.toLocaleDateString('fa-IR', {
+ year: 'numeric',
+ month: 'long',
+ day: 'numeric',
+ hour: '2-digit',
+ minute: '2-digit',
+ });
+ } catch {
+ return '-';
+ }
+};
+
+/**
+ * Format number with thousands separator (Persian)
+ */
+export const formatNumber = (num: number): string => {
+ if (num === null || num === undefined || isNaN(num)) {
+ return '0';
+ }
+ return new Intl.NumberFormat('fa-IR').format(num);
+};
+
diff --git a/src/utils/statusUtils.ts b/src/utils/statusUtils.ts
new file mode 100644
index 0000000..897c123
--- /dev/null
+++ b/src/utils/statusUtils.ts
@@ -0,0 +1,185 @@
+import React from 'react';
+import { StatusBadge as StatusBadgeComponent, StatusType, StatusValue } from '../components/ui/StatusBadge';
+
+/**
+ * Get status badge color classes
+ */
+export const getStatusColor = (status: string, type?: StatusType): string => {
+ const statusStr = String(status).toLowerCase();
+
+ switch (type) {
+ case 'order':
+ switch (statusStr) {
+ case 'pending':
+ return 'bg-yellow-100 text-yellow-800 dark:bg-yellow-900 dark:text-yellow-200';
+ case 'processing':
+ return 'bg-blue-100 text-blue-800 dark:bg-blue-900 dark:text-blue-200';
+ case 'shipped':
+ return 'bg-purple-100 text-purple-800 dark:bg-purple-900 dark:text-purple-200';
+ case 'delivered':
+ return 'bg-green-100 text-green-800 dark:bg-green-900 dark:text-green-200';
+ case 'cancelled':
+ return 'bg-red-100 text-red-800 dark:bg-red-900 dark:text-red-200';
+ case 'refunded':
+ return 'bg-gray-100 text-gray-800 dark:bg-gray-900 dark:text-gray-200';
+ default:
+ return 'bg-gray-100 text-gray-800 dark:bg-gray-900 dark:text-gray-200';
+ }
+
+ case 'product':
+ switch (statusStr) {
+ case 'active':
+ return 'bg-green-100 text-green-800 dark:bg-green-900 dark:text-green-200';
+ case 'inactive':
+ return 'bg-red-100 text-red-800 dark:bg-red-900 dark:text-red-200';
+ case 'draft':
+ return 'bg-gray-100 text-gray-800 dark:bg-gray-900 dark:text-gray-200';
+ default:
+ return 'bg-gray-100 text-gray-800 dark:bg-gray-900 dark:text-gray-200';
+ }
+
+ case 'user':
+ switch (statusStr) {
+ case 'verified':
+ case 'true':
+ return 'bg-green-100 text-green-800 dark:bg-green-900 dark:text-green-200';
+ case 'unverified':
+ case 'false':
+ return 'bg-yellow-100 text-yellow-800 dark:bg-yellow-900 dark:text-yellow-200';
+ default:
+ return 'bg-gray-100 text-gray-800 dark:bg-gray-900 dark:text-gray-200';
+ }
+
+ case 'discount':
+ switch (statusStr) {
+ case 'active':
+ return 'bg-green-100 text-green-800 dark:bg-green-900 dark:text-green-200';
+ case 'inactive':
+ return 'bg-red-100 text-red-800 dark:bg-red-900 dark:text-red-200';
+ default:
+ return 'bg-gray-100 text-gray-800 dark:bg-gray-900 dark:text-gray-200';
+ }
+
+ case 'comment':
+ switch (statusStr) {
+ case 'approved':
+ return 'bg-green-100 text-green-800 dark:bg-green-900 dark:text-green-200';
+ case 'rejected':
+ return 'bg-red-100 text-red-800 dark:bg-red-900 dark:text-red-200';
+ case 'pending':
+ return 'bg-yellow-100 text-yellow-800 dark:bg-yellow-900 dark:text-yellow-200';
+ default:
+ return 'bg-gray-100 text-gray-800 dark:bg-gray-900 dark:text-gray-200';
+ }
+
+ default:
+ switch (statusStr) {
+ case 'active':
+ case 'true':
+ return 'bg-green-100 text-green-800 dark:bg-green-900 dark:text-green-200';
+ case 'inactive':
+ case 'false':
+ return 'bg-red-100 text-red-800 dark:bg-red-900 dark:text-red-200';
+ default:
+ return 'bg-gray-100 text-gray-800 dark:bg-gray-900 dark:text-gray-200';
+ }
+ }
+};
+
+/**
+ * Get status text in Persian
+ */
+export const getStatusText = (status: string, type?: StatusType): string => {
+ const statusStr = String(status).toLowerCase();
+
+ switch (type) {
+ case 'order':
+ switch (statusStr) {
+ case 'pending':
+ return 'در انتظار';
+ case 'processing':
+ return 'در حال پردازش';
+ case 'shipped':
+ return 'ارسال شده';
+ case 'delivered':
+ return 'تحویل شده';
+ case 'cancelled':
+ return 'لغو شده';
+ case 'refunded':
+ return 'مرجوع شده';
+ default:
+ return statusStr;
+ }
+
+ case 'product':
+ switch (statusStr) {
+ case 'active':
+ return 'فعال';
+ case 'inactive':
+ return 'غیرفعال';
+ case 'draft':
+ return 'پیشنویس';
+ default:
+ return statusStr;
+ }
+
+ case 'user':
+ switch (statusStr) {
+ case 'verified':
+ case 'true':
+ return 'تأیید شده';
+ case 'unverified':
+ case 'false':
+ return 'تأیید نشده';
+ default:
+ return statusStr;
+ }
+
+ case 'discount':
+ switch (statusStr) {
+ case 'active':
+ return 'فعال';
+ case 'inactive':
+ return 'غیرفعال';
+ default:
+ return statusStr;
+ }
+
+ case 'comment':
+ switch (statusStr) {
+ case 'approved':
+ return 'تأیید شده';
+ case 'rejected':
+ return 'رد شده';
+ case 'pending':
+ return 'در انتظار';
+ default:
+ return statusStr;
+ }
+
+ default:
+ switch (statusStr) {
+ case 'active':
+ case 'true':
+ return 'فعال';
+ case 'inactive':
+ case 'false':
+ return 'غیرفعال';
+ default:
+ return statusStr;
+ }
+ }
+};
+
+/**
+ * Get status badge React component
+ */
+export const getStatusBadge = (
+ status: StatusValue,
+ type?: StatusType,
+ className?: string,
+ size?: 'sm' | 'md' | 'lg'
+): React.ReactElement => {
+ return React.createElement(StatusBadgeComponent, { status, type, className, size });
+};
+