@soulbatical/tetra-ui 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of @soulbatical/tetra-ui might be problematic. Click here for more details.

Files changed (69) hide show
  1. package/dist/components/FeatureFilters.d.ts +72 -0
  2. package/dist/components/FeatureFilters.d.ts.map +1 -0
  3. package/dist/components/FeatureFilters.js +229 -0
  4. package/dist/components/FeatureFilters.js.map +1 -0
  5. package/dist/components/FeatureForm.d.ts +100 -0
  6. package/dist/components/FeatureForm.d.ts.map +1 -0
  7. package/dist/components/FeatureForm.js +336 -0
  8. package/dist/components/FeatureForm.js.map +1 -0
  9. package/dist/components/FeatureTable.d.ts +95 -0
  10. package/dist/components/FeatureTable.d.ts.map +1 -0
  11. package/dist/components/FeatureTable.js +278 -0
  12. package/dist/components/FeatureTable.js.map +1 -0
  13. package/dist/components/ui/badge.d.ts +10 -0
  14. package/dist/components/ui/badge.d.ts.map +1 -0
  15. package/dist/components/ui/badge.js +21 -0
  16. package/dist/components/ui/badge.js.map +1 -0
  17. package/dist/components/ui/button.d.ts +12 -0
  18. package/dist/components/ui/button.d.ts.map +1 -0
  19. package/dist/components/ui/button.js +34 -0
  20. package/dist/components/ui/button.js.map +1 -0
  21. package/dist/components/ui/card.d.ts +9 -0
  22. package/dist/components/ui/card.d.ts.map +1 -0
  23. package/dist/components/ui/card.js +17 -0
  24. package/dist/components/ui/card.js.map +1 -0
  25. package/dist/components/ui/dialog.d.ts +20 -0
  26. package/dist/components/ui/dialog.d.ts.map +1 -0
  27. package/dist/components/ui/dialog.js +24 -0
  28. package/dist/components/ui/dialog.js.map +1 -0
  29. package/dist/components/ui/input.d.ts +6 -0
  30. package/dist/components/ui/input.d.ts.map +1 -0
  31. package/dist/components/ui/input.js +9 -0
  32. package/dist/components/ui/input.js.map +1 -0
  33. package/dist/components/ui/label.d.ts +8 -0
  34. package/dist/components/ui/label.d.ts.map +1 -0
  35. package/dist/components/ui/label.js +10 -0
  36. package/dist/components/ui/label.js.map +1 -0
  37. package/dist/components/ui/select.d.ts +14 -0
  38. package/dist/components/ui/select.d.ts.map +1 -0
  39. package/dist/components/ui/select.js +28 -0
  40. package/dist/components/ui/select.js.map +1 -0
  41. package/dist/components/ui/table.d.ts +11 -0
  42. package/dist/components/ui/table.d.ts.map +1 -0
  43. package/dist/components/ui/table.js +21 -0
  44. package/dist/components/ui/table.js.map +1 -0
  45. package/dist/components/ui/tabs.d.ts +8 -0
  46. package/dist/components/ui/tabs.d.ts.map +1 -0
  47. package/dist/components/ui/tabs.js +14 -0
  48. package/dist/components/ui/tabs.js.map +1 -0
  49. package/dist/components/ui/textarea.d.ts +6 -0
  50. package/dist/components/ui/textarea.d.ts.map +1 -0
  51. package/dist/components/ui/textarea.js +9 -0
  52. package/dist/components/ui/textarea.js.map +1 -0
  53. package/dist/hooks/useAffiliateDashboard.d.ts +86 -0
  54. package/dist/hooks/useAffiliateDashboard.d.ts.map +1 -0
  55. package/dist/hooks/useAffiliateDashboard.js +161 -0
  56. package/dist/hooks/useAffiliateDashboard.js.map +1 -0
  57. package/dist/hooks/useFeature.d.ts +100 -0
  58. package/dist/hooks/useFeature.d.ts.map +1 -0
  59. package/dist/hooks/useFeature.js +325 -0
  60. package/dist/hooks/useFeature.js.map +1 -0
  61. package/dist/index.d.ts +19 -0
  62. package/dist/index.d.ts.map +1 -1
  63. package/dist/index.js +18 -0
  64. package/dist/index.js.map +1 -1
  65. package/dist/tailwind-preset.d.ts +17 -0
  66. package/dist/tailwind-preset.d.ts.map +1 -0
  67. package/dist/tailwind-preset.js +86 -0
  68. package/dist/tailwind-preset.js.map +1 -0
  69. package/package.json +37 -7
@@ -0,0 +1,28 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import * as SelectPrimitive from "@radix-ui/react-select";
5
+ import { Check, ChevronDown, ChevronUp } from "lucide-react";
6
+ import { cn } from "../../lib/utils.js";
7
+ const Select = SelectPrimitive.Root;
8
+ const SelectGroup = SelectPrimitive.Group;
9
+ const SelectValue = SelectPrimitive.Value;
10
+ const SelectTrigger = React.forwardRef(({ className, children, ...props }, ref) => (_jsxs(SelectPrimitive.Trigger, { ref: ref, className: cn("flex h-10 w-full items-center justify-between rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1", className), ...props, children: [children, _jsx(SelectPrimitive.Icon, { asChild: true, children: _jsx(ChevronDown, { className: "h-4 w-4 opacity-50" }) })] })));
11
+ SelectTrigger.displayName = SelectPrimitive.Trigger.displayName;
12
+ const SelectScrollUpButton = React.forwardRef(({ className, ...props }, ref) => (_jsx(SelectPrimitive.ScrollUpButton, { ref: ref, className: cn("flex cursor-default items-center justify-center py-1", className), ...props, children: _jsx(ChevronUp, { className: "h-4 w-4" }) })));
13
+ SelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName;
14
+ const SelectScrollDownButton = React.forwardRef(({ className, ...props }, ref) => (_jsx(SelectPrimitive.ScrollDownButton, { ref: ref, className: cn("flex cursor-default items-center justify-center py-1", className), ...props, children: _jsx(ChevronDown, { className: "h-4 w-4" }) })));
15
+ SelectScrollDownButton.displayName =
16
+ SelectPrimitive.ScrollDownButton.displayName;
17
+ const SelectContent = React.forwardRef(({ className, children, position = "popper", ...props }, ref) => (_jsx(SelectPrimitive.Portal, { children: _jsxs(SelectPrimitive.Content, { ref: ref, className: cn("relative z-50 max-h-96 min-w-[8rem] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2", position === "popper" &&
18
+ "data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1", className), position: position, ...props, children: [_jsx(SelectScrollUpButton, {}), _jsx(SelectPrimitive.Viewport, { className: cn("p-1", position === "popper" &&
19
+ "h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]"), children: children }), _jsx(SelectScrollDownButton, {})] }) })));
20
+ SelectContent.displayName = SelectPrimitive.Content.displayName;
21
+ const SelectLabel = React.forwardRef(({ className, ...props }, ref) => (_jsx(SelectPrimitive.Label, { ref: ref, className: cn("py-1.5 pl-8 pr-2 text-sm font-semibold", className), ...props })));
22
+ SelectLabel.displayName = SelectPrimitive.Label.displayName;
23
+ const SelectItem = React.forwardRef(({ className, children, ...props }, ref) => (_jsxs(SelectPrimitive.Item, { ref: ref, className: cn("relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50", className), ...props, children: [_jsx("span", { className: "absolute left-2 flex h-3.5 w-3.5 items-center justify-center", children: _jsx(SelectPrimitive.ItemIndicator, { children: _jsx(Check, { className: "h-4 w-4" }) }) }), _jsx(SelectPrimitive.ItemText, { children: children })] })));
24
+ SelectItem.displayName = SelectPrimitive.Item.displayName;
25
+ const SelectSeparator = React.forwardRef(({ className, ...props }, ref) => (_jsx(SelectPrimitive.Separator, { ref: ref, className: cn("-mx-1 my-1 h-px bg-muted", className), ...props })));
26
+ SelectSeparator.displayName = SelectPrimitive.Separator.displayName;
27
+ export { Select, SelectGroup, SelectValue, SelectTrigger, SelectContent, SelectLabel, SelectItem, SelectSeparator, SelectScrollUpButton, SelectScrollDownButton, };
28
+ //# sourceMappingURL=select.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"select.js","sourceRoot":"","sources":["../../../src/components/ui/select.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import * as React from "react";
2
+ declare const Table: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLTableElement> & React.RefAttributes<HTMLTableElement>>;
3
+ declare const TableHeader: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLTableSectionElement> & React.RefAttributes<HTMLTableSectionElement>>;
4
+ declare const TableBody: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLTableSectionElement> & React.RefAttributes<HTMLTableSectionElement>>;
5
+ declare const TableFooter: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLTableSectionElement> & React.RefAttributes<HTMLTableSectionElement>>;
6
+ declare const TableRow: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLTableRowElement> & React.RefAttributes<HTMLTableRowElement>>;
7
+ declare const TableHead: React.ForwardRefExoticComponent<React.ThHTMLAttributes<HTMLTableCellElement> & React.RefAttributes<HTMLTableCellElement>>;
8
+ declare const TableCell: React.ForwardRefExoticComponent<React.TdHTMLAttributes<HTMLTableCellElement> & React.RefAttributes<HTMLTableCellElement>>;
9
+ declare const TableCaption: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLTableCaptionElement> & React.RefAttributes<HTMLTableCaptionElement>>;
10
+ export { Table, TableHeader, TableBody, TableFooter, TableHead, TableRow, TableCell, TableCaption, };
11
+ //# sourceMappingURL=table.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table.d.ts","sourceRoot":"","sources":["../../../src/components/ui/table.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,QAAA,MAAM,KAAK,iHAWT,CAAC;AAGH,QAAA,MAAM,WAAW,+HAKf,CAAC;AAGH,QAAA,MAAM,SAAS,+HASb,CAAC;AAGH,QAAA,MAAM,WAAW,+HAYf,CAAC;AAGH,QAAA,MAAM,QAAQ,uHAYZ,CAAC;AAGH,QAAA,MAAM,SAAS,2HAYb,CAAC;AAGH,QAAA,MAAM,SAAS,2HAYb,CAAC;AAGH,QAAA,MAAM,YAAY,+HAShB,CAAC;AAGH,OAAO,EACL,KAAK,EACL,WAAW,EACX,SAAS,EACT,WAAW,EACX,SAAS,EACT,QAAQ,EACR,SAAS,EACT,YAAY,GACb,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import * as React from "react";
3
+ import { cn } from "../../lib/utils.js";
4
+ const Table = React.forwardRef(({ className, ...props }, ref) => (_jsx("div", { className: "relative w-full overflow-auto", children: _jsx("table", { ref: ref, className: cn("w-full caption-bottom text-sm", className), ...props }) })));
5
+ Table.displayName = "Table";
6
+ const TableHeader = React.forwardRef(({ className, ...props }, ref) => (_jsx("thead", { ref: ref, className: cn("[&_tr]:border-b", className), ...props })));
7
+ TableHeader.displayName = "TableHeader";
8
+ const TableBody = React.forwardRef(({ className, ...props }, ref) => (_jsx("tbody", { ref: ref, className: cn("[&_tr:last-child]:border-0", className), ...props })));
9
+ TableBody.displayName = "TableBody";
10
+ const TableFooter = React.forwardRef(({ className, ...props }, ref) => (_jsx("tfoot", { ref: ref, className: cn("border-t bg-muted/50 font-medium [&>tr]:last:border-b-0", className), ...props })));
11
+ TableFooter.displayName = "TableFooter";
12
+ const TableRow = React.forwardRef(({ className, ...props }, ref) => (_jsx("tr", { ref: ref, className: cn("border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted", className), ...props })));
13
+ TableRow.displayName = "TableRow";
14
+ const TableHead = React.forwardRef(({ className, ...props }, ref) => (_jsx("th", { ref: ref, className: cn("h-12 px-4 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0", className), ...props })));
15
+ TableHead.displayName = "TableHead";
16
+ const TableCell = React.forwardRef(({ className, ...props }, ref) => (_jsx("td", { ref: ref, className: cn("p-4 align-middle [&:has([role=checkbox])]:pr-0", className), ...props })));
17
+ TableCell.displayName = "TableCell";
18
+ const TableCaption = React.forwardRef(({ className, ...props }, ref) => (_jsx("caption", { ref: ref, className: cn("mt-4 text-sm text-muted-foreground", className), ...props })));
19
+ TableCaption.displayName = "TableCaption";
20
+ export { Table, TableHeader, TableBody, TableFooter, TableHead, TableRow, TableCell, TableCaption, };
21
+ //# sourceMappingURL=table.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table.js","sourceRoot":"","sources":["../../../src/components/ui/table.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import * as React from "react";
2
+ import * as TabsPrimitive from "@radix-ui/react-tabs";
3
+ declare const Tabs: React.ForwardRefExoticComponent<TabsPrimitive.TabsProps & React.RefAttributes<HTMLDivElement>>;
4
+ declare const TabsList: React.ForwardRefExoticComponent<Omit<TabsPrimitive.TabsListProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
5
+ declare const TabsTrigger: React.ForwardRefExoticComponent<Omit<TabsPrimitive.TabsTriggerProps & React.RefAttributes<HTMLButtonElement>, "ref"> & React.RefAttributes<HTMLButtonElement>>;
6
+ declare const TabsContent: React.ForwardRefExoticComponent<Omit<TabsPrimitive.TabsContentProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
7
+ export { Tabs, TabsList, TabsTrigger, TabsContent };
8
+ //# sourceMappingURL=tabs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tabs.d.ts","sourceRoot":"","sources":["../../../src/components/ui/tabs.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,aAAa,MAAM,sBAAsB,CAAC;AAGtD,QAAA,MAAM,IAAI,gGAAqB,CAAC;AAEhC,QAAA,MAAM,QAAQ,uJAYZ,CAAC;AAGH,QAAA,MAAM,WAAW,gKAYf,CAAC;AAGH,QAAA,MAAM,WAAW,0JAYf,CAAC;AAGH,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC"}
@@ -0,0 +1,14 @@
1
+ "use client";
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import * as TabsPrimitive from "@radix-ui/react-tabs";
5
+ import { cn } from "../../lib/utils.js";
6
+ const Tabs = TabsPrimitive.Root;
7
+ const TabsList = React.forwardRef(({ className, ...props }, ref) => (_jsx(TabsPrimitive.List, { ref: ref, className: cn("inline-flex h-10 items-center justify-center rounded-md bg-muted p-1 text-muted-foreground", className), ...props })));
8
+ TabsList.displayName = TabsPrimitive.List.displayName;
9
+ const TabsTrigger = React.forwardRef(({ className, ...props }, ref) => (_jsx(TabsPrimitive.Trigger, { ref: ref, className: cn("inline-flex items-center justify-center whitespace-nowrap rounded-sm px-3 py-1.5 text-sm font-medium ring-offset-background transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow-sm", className), ...props })));
10
+ TabsTrigger.displayName = TabsPrimitive.Trigger.displayName;
11
+ const TabsContent = React.forwardRef(({ className, ...props }, ref) => (_jsx(TabsPrimitive.Content, { ref: ref, className: cn("mt-2 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2", className), ...props })));
12
+ TabsContent.displayName = TabsPrimitive.Content.displayName;
13
+ export { Tabs, TabsList, TabsTrigger, TabsContent };
14
+ //# sourceMappingURL=tabs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tabs.js","sourceRoot":"","sources":["../../../src/components/ui/tabs.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,aAAa,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,EAAE,EAAE,MAAM,oBAAoB,CAAC;AAExC,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC;AAEhC,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,CAG/B,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,CAClC,KAAC,aAAa,CAAC,IAAI,IACjB,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CACX,4FAA4F,EAC5F,SAAS,CACV,KACG,KAAK,GACT,CACH,CAAC,CAAC;AACH,QAAQ,CAAC,WAAW,GAAG,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC;AAEtD,MAAM,WAAW,GAAG,KAAK,CAAC,UAAU,CAGlC,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,CAClC,KAAC,aAAa,CAAC,OAAO,IACpB,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CACX,qYAAqY,EACrY,SAAS,CACV,KACG,KAAK,GACT,CACH,CAAC,CAAC;AACH,WAAW,CAAC,WAAW,GAAG,aAAa,CAAC,OAAO,CAAC,WAAW,CAAC;AAE5D,MAAM,WAAW,GAAG,KAAK,CAAC,UAAU,CAGlC,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,CAClC,KAAC,aAAa,CAAC,OAAO,IACpB,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CACX,iIAAiI,EACjI,SAAS,CACV,KACG,KAAK,GACT,CACH,CAAC,CAAC;AACH,WAAW,CAAC,WAAW,GAAG,aAAa,CAAC,OAAO,CAAC,WAAW,CAAC;AAE5D,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC"}
@@ -0,0 +1,6 @@
1
+ import * as React from "react";
2
+ export interface TextareaProps extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {
3
+ }
4
+ declare const Textarea: React.ForwardRefExoticComponent<TextareaProps & React.RefAttributes<HTMLTextAreaElement>>;
5
+ export { Textarea };
6
+ //# sourceMappingURL=textarea.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"textarea.d.ts","sourceRoot":"","sources":["../../../src/components/ui/textarea.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,MAAM,WAAW,aACf,SAAQ,KAAK,CAAC,sBAAsB,CAAC,mBAAmB,CAAC;CAAG;AAE9D,QAAA,MAAM,QAAQ,2FAab,CAAC;AAGF,OAAO,EAAE,QAAQ,EAAE,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import * as React from "react";
3
+ import { cn } from "../../lib/utils.js";
4
+ const Textarea = React.forwardRef(({ className, ...props }, ref) => {
5
+ return (_jsx("textarea", { className: cn("flex min-h-[80px] w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background 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", className), ref: ref, ...props }));
6
+ });
7
+ Textarea.displayName = "Textarea";
8
+ export { Textarea };
9
+ //# sourceMappingURL=textarea.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"textarea.js","sourceRoot":"","sources":["../../../src/components/ui/textarea.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,EAAE,EAAE,MAAM,oBAAoB,CAAC;AAKxC,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,CAC/B,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE;IAC/B,OAAO,CACL,mBACE,SAAS,EAAE,EAAE,CACX,sSAAsS,EACtS,SAAS,CACV,EACD,GAAG,EAAE,GAAG,KACJ,KAAK,GACT,CACH,CAAC;AACJ,CAAC,CACF,CAAC;AACF,QAAQ,CAAC,WAAW,GAAG,UAAU,CAAC;AAElC,OAAO,EAAE,QAAQ,EAAE,CAAC"}
@@ -0,0 +1,86 @@
1
+ /**
2
+ * useAffiliateDashboard — Hooks for the affiliate user portal
3
+ *
4
+ * Provides dashboard stats, profile data, and commission history
5
+ * for authenticated affiliates.
6
+ *
7
+ * @module @soulbatical/tetra-ui
8
+ */
9
+ interface AffiliateDashboardData {
10
+ affiliate: {
11
+ id: string;
12
+ referral_code: string;
13
+ tier: string;
14
+ commission_percentage: number;
15
+ status: string;
16
+ active_since?: string | null;
17
+ contact_name: string;
18
+ email: string;
19
+ };
20
+ stats: {
21
+ total_clicks: number;
22
+ total_sales: number;
23
+ total_revenue: number;
24
+ conversion_rate: number;
25
+ average_order_value: number;
26
+ };
27
+ commission: {
28
+ total_earned: number;
29
+ total_paid: number;
30
+ pending: number;
31
+ };
32
+ tier_progress: {
33
+ current_tier: string;
34
+ current_commission: number;
35
+ current_sales: number;
36
+ next_tier?: string;
37
+ next_commission?: number;
38
+ sales_needed_for_next?: number;
39
+ sales_until_next?: number;
40
+ progress_percentage?: number;
41
+ is_max_tier: boolean;
42
+ };
43
+ recent_commissions: any[];
44
+ }
45
+ interface UseAffiliateDashboardResult {
46
+ data: AffiliateDashboardData | null;
47
+ loading: boolean;
48
+ error: string | null;
49
+ refetch: () => Promise<void>;
50
+ }
51
+ interface AffiliateProfileResult {
52
+ data: any | null;
53
+ loading: boolean;
54
+ error: string | null;
55
+ refetch: () => Promise<void>;
56
+ }
57
+ interface AffiliateCommissionsResult {
58
+ data: any[];
59
+ loading: boolean;
60
+ error: string | null;
61
+ refetch: () => Promise<void>;
62
+ }
63
+ /**
64
+ * Fetch affiliate dashboard data from the user API.
65
+ *
66
+ * @param apiBaseUrl - Base API URL (e.g., '/api/user/affiliates')
67
+ * @param getAccessToken - Function to get the current auth token
68
+ * @param options.enabled - Whether to fetch on mount (default: true)
69
+ */
70
+ export declare function useAffiliateDashboard(apiBaseUrl: string, getAccessToken: () => string | null, options?: {
71
+ enabled?: boolean;
72
+ }): UseAffiliateDashboardResult;
73
+ /**
74
+ * Fetch affiliate profile for the authenticated user.
75
+ */
76
+ export declare function useAffiliateProfile(apiBaseUrl: string, getAccessToken: () => string | null, options?: {
77
+ enabled?: boolean;
78
+ }): AffiliateProfileResult;
79
+ /**
80
+ * Fetch commission history for the authenticated affiliate.
81
+ */
82
+ export declare function useAffiliateCommissions(apiBaseUrl: string, getAccessToken: () => string | null, options?: {
83
+ enabled?: boolean;
84
+ }): AffiliateCommissionsResult;
85
+ export {};
86
+ //# sourceMappingURL=useAffiliateDashboard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAffiliateDashboard.d.ts","sourceRoot":"","sources":["../../src/hooks/useAffiliateDashboard.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH,UAAU,sBAAsB;IAC9B,SAAS,EAAE;QACT,EAAE,EAAE,MAAM,CAAC;QACX,aAAa,EAAE,MAAM,CAAC;QACtB,IAAI,EAAE,MAAM,CAAC;QACb,qBAAqB,EAAE,MAAM,CAAC;QAC9B,MAAM,EAAE,MAAM,CAAC;QACf,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAC7B,YAAY,EAAE,MAAM,CAAC;QACrB,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IACF,KAAK,EAAE;QACL,YAAY,EAAE,MAAM,CAAC;QACrB,WAAW,EAAE,MAAM,CAAC;QACpB,aAAa,EAAE,MAAM,CAAC;QACtB,eAAe,EAAE,MAAM,CAAC;QACxB,mBAAmB,EAAE,MAAM,CAAC;KAC7B,CAAC;IACF,UAAU,EAAE;QACV,YAAY,EAAE,MAAM,CAAC;QACrB,UAAU,EAAE,MAAM,CAAC;QACnB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,aAAa,EAAE;QACb,YAAY,EAAE,MAAM,CAAC;QACrB,kBAAkB,EAAE,MAAM,CAAC;QAC3B,aAAa,EAAE,MAAM,CAAC;QACtB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,qBAAqB,CAAC,EAAE,MAAM,CAAC;QAC/B,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,mBAAmB,CAAC,EAAE,MAAM,CAAC;QAC7B,WAAW,EAAE,OAAO,CAAC;KACtB,CAAC;IACF,kBAAkB,EAAE,GAAG,EAAE,CAAC;CAC3B;AAED,UAAU,2BAA2B;IACnC,IAAI,EAAE,sBAAsB,GAAG,IAAI,CAAC;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED,UAAU,sBAAsB;IAC9B,IAAI,EAAE,GAAG,GAAG,IAAI,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED,UAAU,0BAA0B;IAClC,IAAI,EAAE,GAAG,EAAE,CAAC;IACZ,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAID;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,MAAM,EAClB,cAAc,EAAE,MAAM,MAAM,GAAG,IAAI,EACnC,OAAO,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,GAClC,2BAA2B,CA+C7B;AAID;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,MAAM,EAClB,cAAc,EAAE,MAAM,MAAM,GAAG,IAAI,EACnC,OAAO,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,GAClC,sBAAsB,CA+CxB;AAID;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,UAAU,EAAE,MAAM,EAClB,cAAc,EAAE,MAAM,MAAM,GAAG,IAAI,EACnC,OAAO,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,GAClC,0BAA0B,CA+C5B"}
@@ -0,0 +1,161 @@
1
+ /**
2
+ * useAffiliateDashboard — Hooks for the affiliate user portal
3
+ *
4
+ * Provides dashboard stats, profile data, and commission history
5
+ * for authenticated affiliates.
6
+ *
7
+ * @module @soulbatical/tetra-ui
8
+ */
9
+ import { useState, useEffect, useCallback, useRef } from 'react';
10
+ // ─── useAffiliateDashboard ──────────────────────────────────
11
+ /**
12
+ * Fetch affiliate dashboard data from the user API.
13
+ *
14
+ * @param apiBaseUrl - Base API URL (e.g., '/api/user/affiliates')
15
+ * @param getAccessToken - Function to get the current auth token
16
+ * @param options.enabled - Whether to fetch on mount (default: true)
17
+ */
18
+ export function useAffiliateDashboard(apiBaseUrl, getAccessToken, options = {}) {
19
+ const { enabled = true } = options;
20
+ const [data, setData] = useState(null);
21
+ const [loading, setLoading] = useState(false);
22
+ const [error, setError] = useState(null);
23
+ const mountedRef = useRef(true);
24
+ useEffect(() => {
25
+ mountedRef.current = true;
26
+ return () => { mountedRef.current = false; };
27
+ }, []);
28
+ const fetchDashboard = useCallback(async () => {
29
+ if (!enabled)
30
+ return;
31
+ setLoading(true);
32
+ setError(null);
33
+ try {
34
+ const token = getAccessToken();
35
+ const res = await fetch(`${apiBaseUrl}/dashboard`, {
36
+ headers: token ? { Authorization: `Bearer ${token}` } : {},
37
+ });
38
+ if (!mountedRef.current)
39
+ return;
40
+ if (!res.ok) {
41
+ const body = await res.json().catch(() => ({}));
42
+ setError(body.error || body.message || `Error ${res.status}`);
43
+ setData(null);
44
+ return;
45
+ }
46
+ const body = await res.json();
47
+ setData(body.data || null);
48
+ }
49
+ catch (err) {
50
+ if (mountedRef.current) {
51
+ setError(err instanceof Error ? err.message : 'Failed to fetch dashboard');
52
+ setData(null);
53
+ }
54
+ }
55
+ finally {
56
+ if (mountedRef.current)
57
+ setLoading(false);
58
+ }
59
+ }, [apiBaseUrl, getAccessToken, enabled]);
60
+ useEffect(() => { fetchDashboard(); }, [fetchDashboard]);
61
+ return { data, loading, error, refetch: fetchDashboard };
62
+ }
63
+ // ─── useAffiliateProfile ────────────────────────────────────
64
+ /**
65
+ * Fetch affiliate profile for the authenticated user.
66
+ */
67
+ export function useAffiliateProfile(apiBaseUrl, getAccessToken, options = {}) {
68
+ const { enabled = true } = options;
69
+ const [data, setData] = useState(null);
70
+ const [loading, setLoading] = useState(false);
71
+ const [error, setError] = useState(null);
72
+ const mountedRef = useRef(true);
73
+ useEffect(() => {
74
+ mountedRef.current = true;
75
+ return () => { mountedRef.current = false; };
76
+ }, []);
77
+ const fetchProfile = useCallback(async () => {
78
+ if (!enabled)
79
+ return;
80
+ setLoading(true);
81
+ setError(null);
82
+ try {
83
+ const token = getAccessToken();
84
+ const res = await fetch(`${apiBaseUrl}/profile`, {
85
+ headers: token ? { Authorization: `Bearer ${token}` } : {},
86
+ });
87
+ if (!mountedRef.current)
88
+ return;
89
+ if (!res.ok) {
90
+ const body = await res.json().catch(() => ({}));
91
+ setError(body.error || `Error ${res.status}`);
92
+ setData(null);
93
+ return;
94
+ }
95
+ const body = await res.json();
96
+ setData(body.data || null);
97
+ }
98
+ catch (err) {
99
+ if (mountedRef.current) {
100
+ setError(err instanceof Error ? err.message : 'Failed to fetch profile');
101
+ setData(null);
102
+ }
103
+ }
104
+ finally {
105
+ if (mountedRef.current)
106
+ setLoading(false);
107
+ }
108
+ }, [apiBaseUrl, getAccessToken, enabled]);
109
+ useEffect(() => { fetchProfile(); }, [fetchProfile]);
110
+ return { data, loading, error, refetch: fetchProfile };
111
+ }
112
+ // ─── useAffiliateCommissions ────────────────────────────────
113
+ /**
114
+ * Fetch commission history for the authenticated affiliate.
115
+ */
116
+ export function useAffiliateCommissions(apiBaseUrl, getAccessToken, options = {}) {
117
+ const { enabled = true } = options;
118
+ const [data, setData] = useState([]);
119
+ const [loading, setLoading] = useState(false);
120
+ const [error, setError] = useState(null);
121
+ const mountedRef = useRef(true);
122
+ useEffect(() => {
123
+ mountedRef.current = true;
124
+ return () => { mountedRef.current = false; };
125
+ }, []);
126
+ const fetchCommissions = useCallback(async () => {
127
+ if (!enabled)
128
+ return;
129
+ setLoading(true);
130
+ setError(null);
131
+ try {
132
+ const token = getAccessToken();
133
+ const res = await fetch(`${apiBaseUrl}/commissions`, {
134
+ headers: token ? { Authorization: `Bearer ${token}` } : {},
135
+ });
136
+ if (!mountedRef.current)
137
+ return;
138
+ if (!res.ok) {
139
+ const body = await res.json().catch(() => ({}));
140
+ setError(body.error || `Error ${res.status}`);
141
+ setData([]);
142
+ return;
143
+ }
144
+ const body = await res.json();
145
+ setData(body.data || []);
146
+ }
147
+ catch (err) {
148
+ if (mountedRef.current) {
149
+ setError(err instanceof Error ? err.message : 'Failed to fetch commissions');
150
+ setData([]);
151
+ }
152
+ }
153
+ finally {
154
+ if (mountedRef.current)
155
+ setLoading(false);
156
+ }
157
+ }, [apiBaseUrl, getAccessToken, enabled]);
158
+ useEffect(() => { fetchCommissions(); }, [fetchCommissions]);
159
+ return { data, loading, error, refetch: fetchCommissions };
160
+ }
161
+ //# sourceMappingURL=useAffiliateDashboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAffiliateDashboard.js","sourceRoot":"","sources":["../../src/hooks/useAffiliateDashboard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,100 @@
1
+ /**
2
+ * useFeature() — Config-driven React hook for feature data management
3
+ *
4
+ * Replaces ALL per-feature hooks (useOrdersList, useOrdersCounts, useVouchersList, etc.)
5
+ * with a single generic hook driven by FeatureConfig.
6
+ *
7
+ * @module @tetra/ui
8
+ */
9
+ import type { SupabaseClient } from '@supabase/supabase-js';
10
+ import type { FeatureConfig } from '@soulbatical/tetra-core';
11
+ export interface UseFeatureOptions {
12
+ /** Enable/disable the hook (default: true) */
13
+ enabled?: boolean;
14
+ /** Items per page (default: config.pagination.defaultLimit or 20) */
15
+ pageSize?: number;
16
+ /** Initial filter values (overrides config defaults) */
17
+ initialFilters?: Record<string, string | string[] | undefined>;
18
+ /** Initial sort field (default: config.defaultSortField or 'created_at') */
19
+ initialSortField?: string;
20
+ /** Initial sort direction (default: 'desc') */
21
+ initialSortDirection?: 'asc' | 'desc';
22
+ /** Debounce time for search filter in ms (default: 300) */
23
+ searchDebounceMs?: number;
24
+ /** Minimum search length before triggering (default: 2) */
25
+ minSearchLength?: number;
26
+ /** Organization ID (required for multi-tenant queries) */
27
+ organizationId?: string;
28
+ }
29
+ export interface UseFeatureResult<TItem = Record<string, unknown>> {
30
+ /** Current page of data items */
31
+ data: TItem[];
32
+ /** Total count of items matching current filters */
33
+ totalCount: number;
34
+ /** Breakdown counts per filter (e.g., { byStatus: { paid: 50, open: 10 } }) */
35
+ counts: Record<string, number | Record<string, number>>;
36
+ /** Loading state for data */
37
+ loading: boolean;
38
+ /** Loading state for counts */
39
+ countsLoading: boolean;
40
+ /** Error message if any */
41
+ error: string | null;
42
+ /** Current filter values */
43
+ filters: Record<string, string | string[] | undefined>;
44
+ /** Set a single filter value */
45
+ setFilter: (name: string, value: string | string[] | undefined) => void;
46
+ /** Set multiple filters at once */
47
+ setFilters: (filters: Record<string, string | string[] | undefined>) => void;
48
+ /** Reset all filters to defaults */
49
+ resetFilters: () => void;
50
+ /** Current page (0-indexed) */
51
+ page: number;
52
+ /** Set current page */
53
+ setPage: (page: number) => void;
54
+ /** Current sort field */
55
+ sortField: string;
56
+ /** Current sort direction */
57
+ sortDirection: 'asc' | 'desc';
58
+ /** Set sort (field + direction) */
59
+ setSort: (field: string, direction?: 'asc' | 'desc') => void;
60
+ /** Refetch data and counts */
61
+ refetch: () => Promise<void>;
62
+ /** Total number of pages */
63
+ pageCount: number;
64
+ /** Has previous page */
65
+ hasPreviousPage: boolean;
66
+ /** Has next page */
67
+ hasNextPage: boolean;
68
+ /** Items per page */
69
+ pageSize: number;
70
+ }
71
+ /**
72
+ * useFeature — Universal hook for config-driven feature data
73
+ *
74
+ * @param config - FeatureConfig with resultsRpcName and/or countsRpcName
75
+ * @param supabase - Supabase client instance
76
+ * @param options - Optional configuration
77
+ *
78
+ * @example
79
+ * ```tsx
80
+ * import { ordersConfig } from '@/config/features/orders.config';
81
+ * import { useFeature } from '@soulbatical/tetra-ui';
82
+ *
83
+ * function OrdersPage() {
84
+ * const {
85
+ * data, counts, loading, error,
86
+ * filters, setFilter, resetFilters,
87
+ * page, setPage, pageCount,
88
+ * sortField, sortDirection, setSort,
89
+ * refetch
90
+ * } = useFeature(ordersConfig, supabase, {
91
+ * organizationId: user.organizationId,
92
+ * pageSize: 25,
93
+ * });
94
+ *
95
+ * return <FeatureTable config={ordersConfig} feature={feature} />;
96
+ * }
97
+ * ```
98
+ */
99
+ export declare function useFeature<TItem = Record<string, unknown>>(config: FeatureConfig<TItem>, supabase: SupabaseClient, options?: UseFeatureOptions): UseFeatureResult<TItem>;
100
+ //# sourceMappingURL=useFeature.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useFeature.d.ts","sourceRoot":"","sources":["../../src/hooks/useFeature.ts"],"names":[],"mappings":"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"}