@@ -7,43 +7,19 @@ import {
77 CardHeader ,
88 CardTitle ,
99} from "@/components/ui/card"
10- import { Input } from "@/components/ui/input"
11- import { Label } from "@/components/ui/label"
12- import {
13- Select ,
14- SelectContent ,
15- SelectItem ,
16- SelectTrigger ,
17- SelectValue ,
18- } from "@/components/ui/select"
1910import { useRules } from "@/hooks/use-rules"
2011import { FileText , Plus , Trash2 } from "lucide-react"
2112import { motion } from "motion/react"
2213import { useState } from "react"
2314import type { components } from "schema"
24- import {
25- categoryToDisplayName ,
26- categoryToIcon ,
27- expenseCategories ,
28- } from "./expense-modals"
15+ import { AddRuleModal } from "./add-rule-modal"
16+ import { categoryToDisplayName , categoryToIcon } from "./expense-modals"
2917
30- type ExpenseCategory = components [ "schemas" ] [ "ExpenseCategory" ]
3118type ExpenseCategoryRule = components [ "schemas" ] [ "ExpenseCategoryRule" ]
3219
3320export const RulesView = ( ) => {
34- const [ newRule , setNewRule ] = useState ( "" )
35- const [ newCategory , setNewCategory ] = useState < ExpenseCategory > ( )
36- const [ isCreating , setIsCreating ] = useState ( false )
37- const {
38- isLoading,
39- isCreatingRule,
40- isDeletingRule,
41- rules,
42- createRule,
43- deleteRule,
44- } = useRules ( {
45- setIsCreating,
46- } )
21+ const [ isModalOpen , setIsModalOpen ] = useState ( false )
22+ const { isLoading, isDeletingRule, rules, deleteRule } = useRules ( )
4723
4824 if ( isLoading ) {
4925 return null
@@ -66,7 +42,7 @@ export const RulesView = () => {
6642 < Button
6743 variant = "outline"
6844 size = "sm"
69- onClick = { ( ) => setIsCreating ( ! isCreating ) }
45+ onClick = { ( ) => setIsModalOpen ( true ) }
7046 className = "flex items-center gap-2"
7147 >
7248 < Plus className = "h-4 w-4" />
@@ -76,76 +52,6 @@ export const RulesView = () => {
7652 </ CardHeader >
7753
7854 < CardContent className = "flex-1 overflow-auto space-y-4" >
79- { isCreating && (
80- < motion . div
81- initial = { { opacity : 0 , y : - 20 } }
82- animate = { { opacity : 1 , y : 0 } }
83- transition = { { duration : 0.2 } }
84- className = "bg-muted/30 border rounded-lg p-4 space-y-4"
85- >
86- < div className = "space-y-2" >
87- < Label className = "text-sm font-medium" >
88- Rule (Supports regex)
89- </ Label >
90- < Input
91- placeholder = "e.g., Uber, Lyft, taxi, bus"
92- value = { newRule }
93- onChange = { e => setNewRule ( e . target . value ) }
94- className = "w-full"
95- />
96- < p className = "text-xs text-muted-foreground" >
97- Enter the expression that should trigger this category
98- </ p >
99- </ div >
100-
101- < div className = "space-y-2" >
102- < Label className = "text-sm font-medium" > Category</ Label >
103- < Select
104- value = { newCategory }
105- onValueChange = { ( value : ExpenseCategory ) =>
106- setNewCategory ( value )
107- }
108- >
109- < SelectTrigger >
110- < SelectValue placeholder = "Select a category" />
111- </ SelectTrigger >
112- < SelectContent >
113- { expenseCategories . map ( ( category : ExpenseCategory ) => (
114- < SelectItem key = { category } value = { category } >
115- { categoryToDisplayName ( { category } ) }
116- </ SelectItem >
117- ) ) }
118- </ SelectContent >
119- </ Select >
120- </ div >
121-
122- < div className = "flex gap-2 justify-end" >
123- < Button
124- variant = "outline"
125- size = "sm"
126- onClick = { ( ) => {
127- setIsCreating ( false )
128- setNewRule ( "" )
129- setNewCategory ( undefined )
130- } }
131- >
132- Cancel
133- </ Button >
134- < Button
135- size = "sm"
136- onClick = { async ( ) => {
137- if ( newCategory && newRule . trim ( ) ) {
138- createRule ( newRule . trim ( ) , newCategory )
139- }
140- } }
141- disabled = { ! newRule . trim ( ) || ! newCategory || isCreatingRule }
142- >
143- Create Rule
144- </ Button >
145- </ div >
146- </ motion . div >
147- ) }
148-
14955 { rules . length === 0 ? (
15056 < div className = "flex flex-col items-center justify-center py-12 text-center" >
15157 < div className = "bg-muted mb-4 rounded-full p-4" >
@@ -158,7 +64,7 @@ export const RulesView = () => {
15864 Rules help automatically categorize your expenses based on
15965 keywords
16066 </ p >
161- < Button variant = "outline" onClick = { ( ) => setIsCreating ( true ) } >
67+ < Button variant = "outline" onClick = { ( ) => setIsModalOpen ( true ) } >
16268 Create your first rule
16369 </ Button >
16470 </ div >
@@ -210,6 +116,8 @@ export const RulesView = () => {
210116 </ div >
211117 </ CardFooter >
212118 </ Card >
119+
120+ < AddRuleModal isOpen = { isModalOpen } setIsOpen = { setIsModalOpen } />
213121 </ >
214122 )
215123}
0 commit comments