- {/* Sidebar */}
-
- {/* Main Content Area */}
diff --git a/src/constants/themes.ts b/src/constants/themes.ts
new file mode 100644
index 0000000..549ae31
--- /dev/null
+++ b/src/constants/themes.ts
@@ -0,0 +1,111 @@
+import type { Theme } from "../types/theme.types";
+
+export const RoyalPurpleTheme: Theme = {
+ id: "royal-purple",
+ name: "Royal Purple",
+ mode: "light",
+ isDefault: true,
+ palette: {
+ primary: "#7C3AED",
+ primaryHover: "#6D28D9",
+ primaryLight: "#DDD6FE",
+ primaryDark: "#4C1D95",
+ background: "#f9fafb",
+ surface: "#ffffff",
+ foreground: "#111827",
+ border: "#e5e7eb",
+ tableHeaderBg: "#EDE9FE",
+ tableHeaderText: "#4C1D95",
+ tableHeaderBorder: "#C4B5FD",
+ },
+};
+
+export const ForestGreenTheme: Theme = {
+ id: "forest-green",
+ name: "Forest Green",
+ mode: "light",
+ isDefault: false,
+ palette: {
+ primary: "#16A34A",
+ primaryHover: "#15803D",
+ primaryLight: "#BBF7D0",
+ primaryDark: "#166534",
+ background: "#f9fafb",
+ surface: "#ffffff",
+ foreground: "#111827",
+ border: "#e5e7eb",
+ tableHeaderBg: "#DCFCE7",
+ tableHeaderText: "#166534",
+ tableHeaderBorder: "#86EFAC",
+ },
+};
+
+export const OceanBlueTheme: Theme = {
+ id: "ocean-blue",
+ name: "Ocean Blue",
+ mode: "light",
+ isDefault: false,
+ palette: {
+ primary: "#2563EB",
+ primaryHover: "#1D4ED8",
+ primaryLight: "#BFDBFE",
+ primaryDark: "#1E3A8A",
+ background: "#f9fafb",
+ surface: "#ffffff",
+ foreground: "#111827",
+ border: "#e5e7eb",
+ tableHeaderBg: "#DBEAFE",
+ tableHeaderText: "#1E3A8A",
+ tableHeaderBorder: "#93C5FD",
+ },
+};
+
+export const SunsetOrangeTheme: Theme = {
+ id: "sunset-orange",
+ name: "Sunset Orange",
+ mode: "light",
+ isDefault: false,
+ palette: {
+ primary: "#EA580C",
+ primaryHover: "#C2410C",
+ primaryLight: "#FED7AA",
+ primaryDark: "#7C2D12",
+ background: "#f9fafb",
+ surface: "#ffffff",
+ foreground: "#111827",
+ border: "#e5e7eb",
+ tableHeaderBg: "#FFEDD5",
+ tableHeaderText: "#7C2D12",
+ tableHeaderBorder: "#FDBA74",
+ },
+};
+
+export const DarkTheme: Theme = {
+ id: "dark-mode",
+ name: "Dark",
+ mode: "dark",
+ isDefault: false,
+ palette: {
+ primary: "#1F2937",
+ primaryHover: "#374151",
+ primaryLight: "#4B5563",
+ primaryDark: "#111827",
+ background: "#111827",
+ surface: "#1F2937",
+ foreground: "#F9FAFB",
+ border: "#374151",
+ tableHeaderBg: "#111827",
+ tableHeaderText: "#D1D5DB",
+ tableHeaderBorder: "#4B5563",
+ },
+};
+
+export const DEFAULT_THEME = RoyalPurpleTheme;
+
+export const AVAILABLE_THEMES = [
+ RoyalPurpleTheme,
+ ForestGreenTheme,
+ OceanBlueTheme,
+ SunsetOrangeTheme,
+ DarkTheme,
+];
diff --git a/src/features/asset-families/hook/useAssetFamily.ts b/src/features/asset-families/hook/useAssetFamily.ts
index 8b9c702..a0b19ca 100644
--- a/src/features/asset-families/hook/useAssetFamily.ts
+++ b/src/features/asset-families/hook/useAssetFamily.ts
@@ -1,7 +1,7 @@
import { useState, useCallback } from 'react';
import { assetFamiliesService } from '../services/asset-families.service';
import type { AssetFamily, AssetFamilyCreateRequest, AssetFamilyUpdateRequest } from '../types/asset-families.types';
-import { toast } from 'react-toastify';
+import { notify } from '../../../services/toast';
export const useAssetFamily = () => {
const [items, setItems] = useState
([]);
@@ -12,8 +12,8 @@ export const useAssetFamily = () => {
try {
const data = await assetFamiliesService.getAll();
setItems(data);
- } catch (err: any) {
- toast.error(err.response?.data?.message || err.message || 'Failed to fetch items');
+ } catch (err) {
+ notify.error(err.response?.data?.message || err);
} finally {
setLoading(false);
}
@@ -24,10 +24,10 @@ export const useAssetFamily = () => {
try {
const created = await assetFamiliesService.create(req);
setItems((prev) => [...prev, created]);
- toast.success('AssetFamily created successfully!');
+ notify.success('Asset family created successfully!');
return created;
- } catch (err: any) {
- toast.error(err.response?.data?.message || err.message || 'Failed to create item');
+ } catch (err) {
+ notify.error(err.response?.data?.message || err);
throw err;
} finally {
setLoading(false);
@@ -39,10 +39,10 @@ export const useAssetFamily = () => {
try {
const updated = await assetFamiliesService.update(id, req);
setItems((prev) => prev.map((p) => (p.id === id ? updated : p)));
- toast.success('AssetFamily updated successfully!');
+ notify.success('Asset family updated successfully!');
return updated;
- } catch (err: any) {
- toast.error(err.response?.data?.message || err.message || 'Failed to update item');
+ } catch (err) {
+ notify.error(err.response?.data?.message || err);
throw err;
} finally {
setLoading(false);
@@ -54,9 +54,9 @@ export const useAssetFamily = () => {
try {
await assetFamiliesService.delete(id);
setItems((prev) => prev.filter((p) => p.id !== id));
- toast.success('AssetFamily deleted successfully!');
- } catch (err: any) {
- toast.error(err.response?.data?.message || err.message || 'Failed to delete item');
+ notify.success('Asset family deleted successfully!');
+ } catch (err) {
+ notify.error(err.response?.data?.message || err);
throw err;
} finally {
setLoading(false);
diff --git a/src/features/asset-types/hook/useAssetType.ts b/src/features/asset-types/hook/useAssetType.ts
index b92d99b..63417f6 100644
--- a/src/features/asset-types/hook/useAssetType.ts
+++ b/src/features/asset-types/hook/useAssetType.ts
@@ -1,7 +1,7 @@
import { useState, useCallback } from 'react';
import { assetTypesService } from '../services/asset-types.service';
import type { AssetType, AssetTypeCreateRequest, AssetTypeUpdateRequest } from '../types/asset-types.types';
-import { toast } from 'react-toastify';
+import { notify } from '../../../services/toast';
export const useAssetType = () => {
const [items, setItems] = useState([]);
@@ -12,8 +12,8 @@ export const useAssetType = () => {
try {
const data = await assetTypesService.getAll();
setItems(data);
- } catch (err: any) {
- toast.error(err.response?.data?.message || err.message || 'Failed to fetch items');
+ } catch (err) {
+ notify.error(err.response?.data?.message || err);
} finally {
setLoading(false);
}
@@ -24,10 +24,10 @@ export const useAssetType = () => {
try {
const created = await assetTypesService.create(req);
setItems((prev) => [...prev, created]);
- toast.success('AssetType created successfully!');
+ notify.success('Asset type created successfully!');
return created;
- } catch (err: any) {
- toast.error(err.response?.data?.message || err.message || 'Failed to create item');
+ } catch (err) {
+ notify.error(err.response?.data?.message || err);
throw err;
} finally {
setLoading(false);
@@ -39,10 +39,10 @@ export const useAssetType = () => {
try {
const updated = await assetTypesService.update(id, req);
setItems((prev) => prev.map((p) => (p.id === id ? updated : p)));
- toast.success('AssetType updated successfully!');
+ notify.success('Asset type updated successfully!');
return updated;
- } catch (err: any) {
- toast.error(err.response?.data?.message || err.message || 'Failed to update item');
+ } catch (err) {
+ notify.error(err.response?.data?.message || err);
throw err;
} finally {
setLoading(false);
@@ -54,9 +54,9 @@ export const useAssetType = () => {
try {
await assetTypesService.delete(id);
setItems((prev) => prev.filter((p) => p.id !== id));
- toast.success('AssetType deleted successfully!');
- } catch (err: any) {
- toast.error(err.response?.data?.message || err.message || 'Failed to delete item');
+ notify.success('Asset type deleted successfully!');
+ } catch (err) {
+ notify.error(err.response?.data?.message || err);
throw err;
} finally {
setLoading(false);
diff --git a/src/features/assets/hook/useAsset.ts b/src/features/assets/hook/useAsset.ts
index 5ee0df4..bf07435 100644
--- a/src/features/assets/hook/useAsset.ts
+++ b/src/features/assets/hook/useAsset.ts
@@ -1,7 +1,7 @@
import { useState, useCallback } from 'react';
import { assetsService } from '../services/assets.service';
import type { Asset, AssetCreateRequest, AssetUpdateRequest } from '../types/assets.types';
-import { toast } from 'react-toastify';
+import { notify } from '../../../services/toast';
export const useAsset = () => {
const [items, setItems] = useState([]);
@@ -12,8 +12,8 @@ export const useAsset = () => {
try {
const data = await assetsService.getAll();
setItems(data);
- } catch (err: any) {
- toast.error(err.message || 'Failed to fetch items');
+ } catch (err) {
+ notify.error(err);
} finally {
setLoading(false);
}
@@ -24,10 +24,10 @@ export const useAsset = () => {
try {
const created = await assetsService.create(req);
setItems((prev) => [...prev, created]);
- toast.success('Asset created successfully!');
+ notify.success('Asset created successfully!');
return created;
- } catch (err: any) {
- toast.error(err.message || 'Failed to create item');
+ } catch (err) {
+ notify.error(err);
throw err;
} finally {
setLoading(false);
@@ -39,10 +39,10 @@ export const useAsset = () => {
try {
const updated = await assetsService.update(id, req);
setItems((prev) => prev.map((p) => (p.id === id ? updated : p)));
- toast.success('Asset updated successfully!');
+ notify.success('Asset updated successfully!');
return updated;
- } catch (err: any) {
- toast.error(err.message || 'Failed to update item');
+ } catch (err) {
+ notify.error(err);
throw err;
} finally {
setLoading(false);
@@ -54,55 +54,9 @@ export const useAsset = () => {
try {
await assetsService.delete(id);
setItems((prev) => prev.filter((p) => p.id !== id));
- toast.success('Asset deleted successfully!');
- } catch (err: any) {
- const errMsg = err.response?.data?.message || err.message || 'Failed to delete item';
- toast.error(errMsg);
- throw err;
- } finally {
- setLoading(false);
- }
- }, []);
-
- const replaceAsset = useCallback(async (id: string, file: File) => {
- setLoading(true);
- try {
- const updated = await assetsService.replace(id, file);
- setItems((prev) => prev.map((p) => (p.id === id ? updated : p)));
- toast.success('Asset file replaced successfully!');
- return updated;
- } catch (err: any) {
- toast.error(err.response?.data?.message || err.message || 'Failed to replace file');
- throw err;
- } finally {
- setLoading(false);
- }
- }, []);
-
- const archiveAsset = useCallback(async (id: string) => {
- setLoading(true);
- try {
- const updated = await assetsService.archive(id);
- setItems((prev) => prev.map((p) => (p.id === id ? updated : p)));
- toast.success('Asset archived successfully!');
- return updated;
- } catch (err: any) {
- toast.error(err.response?.data?.message || err.message || 'Failed to archive asset');
- throw err;
- } finally {
- setLoading(false);
- }
- }, []);
-
- const restoreAsset = useCallback(async (id: string) => {
- setLoading(true);
- try {
- const updated = await assetsService.restore(id);
- setItems((prev) => prev.map((p) => (p.id === id ? updated : p)));
- toast.success('Asset restored successfully!');
- return updated;
- } catch (err: any) {
- toast.error(err.response?.data?.message || err.message || 'Failed to restore asset');
+ notify.success('Asset deleted successfully!');
+ } catch (err) {
+ notify.error(err);
throw err;
} finally {
setLoading(false);
diff --git a/src/features/attribute-groups/hook/useAttributeGroup.ts b/src/features/attribute-groups/hook/useAttributeGroup.ts
index a386ec8..9cbe5df 100644
--- a/src/features/attribute-groups/hook/useAttributeGroup.ts
+++ b/src/features/attribute-groups/hook/useAttributeGroup.ts
@@ -1,7 +1,7 @@
import { useState, useCallback } from 'react';
import { attributeGroupsService } from '../services/attribute-groups.service';
import type { AttributeGroup, AttributeGroupCreateRequest, AttributeGroupUpdateRequest } from '../types/attribute-groups.types';
-import { toast } from 'react-toastify';
+import { notify } from '../../../services/toast';
export const useAttributeGroup = () => {
const [items, setItems] = useState([]);
@@ -12,8 +12,8 @@ export const useAttributeGroup = () => {
try {
const data = await attributeGroupsService.getAll(query);
setItems(data);
- } catch (err: any) {
- toast.error(err.response?.data?.message || err.message || 'Failed to fetch items');
+ } catch (err) {
+ notify.error(err.response?.data?.message || err);
} finally {
setLoading(false);
}
@@ -24,10 +24,10 @@ export const useAttributeGroup = () => {
try {
const created = await attributeGroupsService.create(req);
setItems((prev) => [...prev, created]);
- toast.success('Attribute Group created successfully!');
+ notify.success('Attribute group created successfully!');
return created;
- } catch (err: any) {
- toast.error(err.response?.data?.message || err.message || 'Failed to create item');
+ } catch (err) {
+ notify.error(err.response?.data?.message || err);
throw err;
} finally {
setLoading(false);
@@ -39,10 +39,10 @@ export const useAttributeGroup = () => {
try {
const updated = await attributeGroupsService.update(id, req);
setItems((prev) => prev.map((p) => (p.id === id ? updated : p)));
- toast.success('Attribute Group updated successfully!');
+ notify.success('Attribute group updated successfully!');
return updated;
- } catch (err: any) {
- toast.error(err.response?.data?.message || err.message || 'Failed to update item');
+ } catch (err) {
+ notify.error(err.response?.data?.message || err);
throw err;
} finally {
setLoading(false);
@@ -54,9 +54,9 @@ export const useAttributeGroup = () => {
try {
await attributeGroupsService.delete(id);
setItems((prev) => prev.filter((p) => p.id !== id));
- toast.success('Attribute Group deleted successfully!');
- } catch (err: any) {
- toast.error(err.response?.data?.message || err.message || 'Failed to delete item');
+ notify.success('Attribute group deleted successfully!');
+ } catch (err) {
+ notify.error(err.response?.data?.message || err);
throw err;
} finally {
setLoading(false);
diff --git a/src/features/attribute-groups/services/attribute-groups.service.ts b/src/features/attribute-groups/services/attribute-groups.service.ts
index 9ed2ba3..831cc0c 100644
--- a/src/features/attribute-groups/services/attribute-groups.service.ts
+++ b/src/features/attribute-groups/services/attribute-groups.service.ts
@@ -8,8 +8,8 @@ interface ApiResponse {
}
export const attributeGroupsService = {
- getAll: async (): Promise => {
- const res = await apiClient.get>('/api/v1/attribute-groups');
+ getAll: async (params?: Record): Promise => {
+ const res = await apiClient.get>('/api/v1/attribute-groups', { params });
return res.data || [];
},
diff --git a/src/features/attributes/hook/useAttribute.ts b/src/features/attributes/hook/useAttribute.ts
index 1c7e0cd..75d9766 100644
--- a/src/features/attributes/hook/useAttribute.ts
+++ b/src/features/attributes/hook/useAttribute.ts
@@ -1,7 +1,7 @@
import { useState, useCallback } from 'react';
import { attributeService } from '../services/attribute.service';
import type { Attribute, AttributeCreateRequest, AttributeUpdateRequest } from '../types/attribute.types';
-import { toast } from 'react-toastify';
+import { notify } from '../../../services/toast';
export const useAttribute = () => {
const [attributes, setAttributes] = useState([]);
@@ -14,10 +14,10 @@ export const useAttribute = () => {
try {
const data = await attributeService.getAll();
setAttributes(data);
- } catch (err: any) {
- const msg = err.response?.data?.message || err.message || 'Failed to fetch attributes';
+ } catch (err) {
+ const msg = err instanceof Error ? err.message : 'Failed to fetch attributes';
setError(msg);
- toast.error(msg);
+ notify.error(err);
} finally {
setLoading(false);
}
@@ -28,14 +28,10 @@ export const useAttribute = () => {
try {
const created = await attributeService.create(req);
setAttributes((prev) => [...prev, created]);
- toast.success('Attribute created successfully!');
+ notify.success('Attribute created successfully!');
return created;
- } catch (err: any) {
- const validationErrors = err.response?.data?.errors;
- const msg = validationErrors
- ? validationErrors.map((e: any) => `${e.field}: ${e.message}`).join(', ')
- : (err.response?.data?.message || err.message || 'Failed to create attribute');
- toast.error(msg);
+ } catch (err) {
+ notify.error(err);
throw err;
} finally {
setLoading(false);
@@ -47,14 +43,10 @@ export const useAttribute = () => {
try {
const updated = await attributeService.update(id, req);
setAttributes((prev) => prev.map((item) => (item.id === id ? updated : item)));
- toast.success('Attribute updated successfully!');
+ notify.success('Attribute updated successfully!');
return updated;
- } catch (err: any) {
- const validationErrors = err.response?.data?.errors;
- const msg = validationErrors
- ? validationErrors.map((e: any) => `${e.field}: ${e.message}`).join(', ')
- : (err.response?.data?.message || err.message || 'Failed to update attribute');
- toast.error(msg);
+ } catch (err) {
+ notify.error(err);
throw err;
} finally {
setLoading(false);
@@ -66,14 +58,10 @@ export const useAttribute = () => {
try {
await attributeService.delete(id);
setAttributes((prev) => prev.filter((item) => item.id !== id));
- toast.success('Attribute deleted successfully!');
+ notify.success('Attribute deleted successfully!');
return true;
- } catch (err: any) {
- const validationErrors = err.response?.data?.errors;
- const msg = validationErrors
- ? validationErrors.map((e: any) => `${e.field}: ${e.message}`).join(', ')
- : (err.response?.data?.message || err.message || 'Failed to delete attribute');
- toast.error(msg);
+ } catch (err) {
+ notify.error(err);
throw err;
} finally {
setLoading(false);
diff --git a/src/features/brands/hook/useBrand.ts b/src/features/brands/hook/useBrand.ts
index 786e49e..65db043 100644
--- a/src/features/brands/hook/useBrand.ts
+++ b/src/features/brands/hook/useBrand.ts
@@ -1,7 +1,7 @@
import { useState, useCallback } from 'react';
import { brandService } from '../services/brand.service';
import type { Brand, BrandCreateRequest, BrandUpdateRequest } from '../types/brand.types';
-import { toast } from 'react-toastify';
+import { notify } from '../../../services/toast';
export const useBrand = () => {
const [brands, setBrands] = useState([]);
@@ -14,9 +14,9 @@ export const useBrand = () => {
try {
const data = await brandService.getAll();
setBrands(data);
- } catch (err: any) {
- setError(err.message || 'Failed to fetch brands');
- toast.error(err.message || 'Failed to fetch brands');
+ } catch (err) {
+ setError(err instanceof Error ? err.message : 'Failed to fetch brands');
+ notify.error(err);
} finally {
setLoading(false);
}
@@ -27,14 +27,10 @@ export const useBrand = () => {
try {
const created = await brandService.create(req);
setBrands((prev) => [...prev, created]);
- toast.success('Brand created successfully!');
+ notify.success('Brand created successfully!');
return created;
- } catch (err: any) {
- const validationErrors = err.response?.data?.errors;
- const msg = validationErrors
- ? validationErrors.map((e: any) => `${e.field}: ${e.message}`).join(', ')
- : (err.response?.data?.message || err.message || 'Failed to create brand');
- toast.error(msg);
+ } catch (err) {
+ notify.error(err);
throw err;
} finally {
setLoading(false);
@@ -46,14 +42,10 @@ export const useBrand = () => {
try {
const updated = await brandService.update(id, req);
setBrands((prev) => prev.map((item) => (item.id === id ? updated : item)));
- toast.success('Brand updated successfully!');
+ notify.success('Brand updated successfully!');
return updated;
- } catch (err: any) {
- const validationErrors = err.response?.data?.errors;
- const msg = validationErrors
- ? validationErrors.map((e: any) => `${e.field}: ${e.message}`).join(', ')
- : (err.response?.data?.message || err.message || 'Failed to update brand');
- toast.error(msg);
+ } catch (err) {
+ notify.error(err);
throw err;
} finally {
setLoading(false);
@@ -65,14 +57,10 @@ export const useBrand = () => {
try {
await brandService.delete(id);
setBrands((prev) => prev.filter((item) => item.id !== id));
- toast.success('Brand deleted successfully!');
+ notify.success('Brand deleted successfully!');
return true;
- } catch (err: any) {
- const validationErrors = err.response?.data?.errors;
- const msg = validationErrors
- ? validationErrors.map((e: any) => `${e.field}: ${e.message}`).join(', ')
- : (err.response?.data?.message || err.message || 'Failed to delete brand');
- toast.error(msg);
+ } catch (err) {
+ notify.error(err);
throw err;
} finally {
setLoading(false);
diff --git a/src/features/categories/hook/useCategory.ts b/src/features/categories/hook/useCategory.ts
index 3df7f62..dc35990 100644
--- a/src/features/categories/hook/useCategory.ts
+++ b/src/features/categories/hook/useCategory.ts
@@ -1,7 +1,8 @@
import { useState, useCallback } from 'react';
import { categoryService } from '../services/category.service';
import type { Category, CategoryCreateRequest, CategoryUpdateRequest } from '../types/category.types';
-import { toast } from 'react-toastify';
+import { notify } from '../../../services/toast';
+import { MOCK_CATEGORIES } from '../components/category.mock';
export const useCategory = () => {
const [categories, setCategories] = useState([]);
@@ -27,14 +28,10 @@ export const useCategory = () => {
try {
const created = await categoryService.create(req);
setCategories((prev) => [...prev, created]);
- toast.success('Category created successfully!');
+ notify.success('Category created successfully!');
return created;
- } catch (err: any) {
- const validationErrors = err.response?.data?.errors;
- const msg = validationErrors
- ? validationErrors.map((e: any) => `${e.field}: ${e.message}`).join(', ')
- : (err.response?.data?.message || err.message || 'Failed to create category');
- toast.error(msg);
+ } catch (err) {
+ notify.error(err);
throw err;
} finally {
setLoading(false);
@@ -46,14 +43,10 @@ export const useCategory = () => {
try {
const updated = await categoryService.update(id, req);
setCategories((prev) => prev.map((item) => (item.id === id ? updated : item)));
- toast.success('Category updated successfully!');
+ notify.success('Category updated successfully!');
return updated;
- } catch (err: any) {
- const validationErrors = err.response?.data?.errors;
- const msg = validationErrors
- ? validationErrors.map((e: any) => `${e.field}: ${e.message}`).join(', ')
- : (err.response?.data?.message || err.message || 'Failed to update category');
- toast.error(msg);
+ } catch (err) {
+ notify.error(err);
throw err;
} finally {
setLoading(false);
@@ -65,14 +58,10 @@ export const useCategory = () => {
try {
await categoryService.delete(id);
setCategories((prev) => prev.filter((item) => item.id !== id));
- toast.success('Category deleted successfully!');
+ notify.success('Category deleted successfully!');
return true;
- } catch (err: any) {
- const validationErrors = err.response?.data?.errors;
- const msg = validationErrors
- ? validationErrors.map((e: any) => `${e.field}: ${e.message}`).join(', ')
- : (err.response?.data?.message || err.message || 'Failed to delete category');
- toast.error(msg);
+ } catch (err) {
+ notify.error(err);
throw err;
} finally {
setLoading(false);
diff --git a/src/features/channel-types/hook/useChannelType.ts b/src/features/channel-types/hook/useChannelType.ts
index f60f8c4..6cf961b 100644
--- a/src/features/channel-types/hook/useChannelType.ts
+++ b/src/features/channel-types/hook/useChannelType.ts
@@ -1,7 +1,7 @@
import { useState, useCallback } from 'react';
import { channelTypesService } from '../services/channel-types.service';
import type { ChannelType, ChannelTypeCreateRequest, ChannelTypeUpdateRequest } from '../types/channel-types.types';
-import { toast } from 'react-toastify';
+import { notify } from '../../../services/toast';
export const useChannelType = () => {
const [items, setItems] = useState([]);
@@ -12,8 +12,8 @@ export const useChannelType = () => {
try {
const data = await channelTypesService.getAll();
setItems(data);
- } catch (err: any) {
- toast.error(err.message || 'Failed to fetch channel types');
+ } catch (err) {
+ notify.error(err);
} finally {
setLoading(false);
}
@@ -24,10 +24,10 @@ export const useChannelType = () => {
try {
const created = await channelTypesService.create(req);
setItems((prev) => [...prev, created]);
- toast.success('Channel type created successfully!');
+ notify.success('Channel type created successfully!');
return created;
- } catch (err: any) {
- toast.error(err.message || 'Failed to create channel type');
+ } catch (err) {
+ notify.error(err);
throw err;
} finally {
setLoading(false);
@@ -39,10 +39,10 @@ export const useChannelType = () => {
try {
const updated = await channelTypesService.update(id, req);
setItems((prev) => prev.map((p) => (p.id === id ? updated : p)));
- toast.success('Channel type updated successfully!');
+ notify.success('Channel type updated successfully!');
return updated;
- } catch (err: any) {
- toast.error(err.message || 'Failed to update channel type');
+ } catch (err) {
+ notify.error(err);
throw err;
} finally {
setLoading(false);
@@ -54,9 +54,9 @@ export const useChannelType = () => {
try {
await channelTypesService.delete(id);
setItems((prev) => prev.filter((p) => p.id !== id));
- toast.success('Channel type deleted successfully!');
- } catch (err: any) {
- toast.error(err.message || 'Failed to delete channel type');
+ notify.success('Channel type deleted successfully!');
+ } catch (err) {
+ notify.error(err);
throw err;
} finally {
setLoading(false);
diff --git a/src/features/channels/hook/useChannel.ts b/src/features/channels/hook/useChannel.ts
index b467775..607fcf8 100644
--- a/src/features/channels/hook/useChannel.ts
+++ b/src/features/channels/hook/useChannel.ts
@@ -1,7 +1,7 @@
import { useState, useCallback } from 'react';
import { channelsService } from '../services/channels.service';
import type { Channel, ChannelCreateRequest, ChannelUpdateRequest } from '../types/channels.types';
-import { toast } from 'react-toastify';
+import { notify } from '../../../services/toast';
export const useChannel = () => {
const [items, setItems] = useState([]);
@@ -12,8 +12,8 @@ export const useChannel = () => {
try {
const data = await channelsService.getAll();
setItems(data);
- } catch (err: any) {
- toast.error(err.message || 'Failed to fetch items');
+ } catch (err) {
+ notify.error(err);
} finally {
setLoading(false);
}
@@ -24,10 +24,10 @@ export const useChannel = () => {
try {
const created = await channelsService.create(req);
setItems((prev) => [...prev, created]);
- toast.success('Channel created successfully!');
+ notify.success('Channel created successfully!');
return created;
- } catch (err: any) {
- toast.error(err.message || 'Failed to create item');
+ } catch (err) {
+ notify.error(err);
throw err;
} finally {
setLoading(false);
@@ -39,10 +39,10 @@ export const useChannel = () => {
try {
const updated = await channelsService.update(id, req);
setItems((prev) => prev.map((p) => (p.id === id ? updated : p)));
- toast.success('Channel updated successfully!');
+ notify.success('Channel updated successfully!');
return updated;
- } catch (err: any) {
- toast.error(err.message || 'Failed to update item');
+ } catch (err) {
+ notify.error(err);
throw err;
} finally {
setLoading(false);
@@ -54,9 +54,9 @@ export const useChannel = () => {
try {
await channelsService.delete(id);
setItems((prev) => prev.filter((p) => p.id !== id));
- toast.success('Channel deleted successfully!');
- } catch (err: any) {
- toast.error(err.message || 'Failed to delete item');
+ notify.success('Channel deleted successfully!');
+ } catch (err) {
+ notify.error(err);
throw err;
} finally {
setLoading(false);
diff --git a/src/features/channels/pages/ChannelList.tsx b/src/features/channels/pages/ChannelList.tsx
index ef42f6b..7882467 100644
--- a/src/features/channels/pages/ChannelList.tsx
+++ b/src/features/channels/pages/ChannelList.tsx
@@ -46,8 +46,8 @@ export default function ChannelList() {