@@ -62,6 +62,7 @@ import { CategorySelect } from "@/components/CategorySelect";
62
62
import { useModal } from "@/hooks/useModal" ;
63
63
import { ConditionType } from "@/utils/config" ;
64
64
import { useAccount } from "@/providers/EmailAccountProvider" ;
65
+ import { prefixPath } from "@/utils/path" ;
65
66
66
67
type ReportMistakeView = "select-expected-rule" | "ai-fix" | "manual-fix" ;
67
68
@@ -220,6 +221,7 @@ function Content({
220
221
return (
221
222
< RuleMismatch
222
223
result = { result }
224
+ emailAccountId = { emailAccountId }
223
225
onSelectExpectedRuleId = { onSelectExpectedRule }
224
226
rules = { rules }
225
227
/>
@@ -234,6 +236,7 @@ function Content({
234
236
return (
235
237
< ThreadSettingsMismatchMessage
236
238
expectedRuleId = { expectedRule . id }
239
+ emailAccountId = { emailAccountId }
237
240
onBack = { onBack }
238
241
/>
239
242
) ;
@@ -273,6 +276,7 @@ function Content({
273
276
if ( isExpectedStaticRule || isActualStaticRule ) {
274
277
return (
275
278
< StaticMismatch
279
+ emailAccountId = { emailAccountId }
276
280
ruleId = { expectedRule ?. id || actualRule ?. id ! }
277
281
isExpectedStaticRule = { isExpectedStaticRule }
278
282
onBack = { onBack }
@@ -298,6 +302,7 @@ function Content({
298
302
if ( view === "ai-fix" ) {
299
303
return (
300
304
< AIFixView
305
+ emailAccountId = { emailAccountId }
301
306
loadingAiFix = { isExecuting }
302
307
fixedInstructions = { fixedInstructions ?? null }
303
308
fixedInstructionsRule = { fixedInstructionsRule ?? null }
@@ -318,6 +323,7 @@ function Content({
318
323
result = { result }
319
324
isTest = { isTest }
320
325
onBack = { onBack }
326
+ emailAccountId = { emailAccountId }
321
327
/>
322
328
) ;
323
329
}
@@ -327,6 +333,7 @@ function Content({
327
333
}
328
334
329
335
function AIFixView ( {
336
+ emailAccountId,
330
337
loadingAiFix,
331
338
fixedInstructions,
332
339
fixedInstructionsRule,
@@ -335,6 +342,7 @@ function AIFixView({
335
342
onBack,
336
343
onReject,
337
344
} : {
345
+ emailAccountId : string ;
338
346
loadingAiFix : boolean ;
339
347
fixedInstructions : {
340
348
ruleId : string ;
@@ -359,7 +367,10 @@ function AIFixView({
359
367
< div className = "space-y-2" >
360
368
{ fixedInstructionsRule ?. instructions ? (
361
369
< div className = "space-y-2" >
362
- < ProcessResultDisplay result = { { rule : fixedInstructionsRule } } />
370
+ < ProcessResultDisplay
371
+ result = { { rule : fixedInstructionsRule } }
372
+ emailAccountId = { emailAccountId }
373
+ />
363
374
< Instructions
364
375
label = "Original:"
365
376
instructions = { fixedInstructionsRule ?. instructions }
@@ -388,18 +399,23 @@ function AIFixView({
388
399
function RuleMismatch ( {
389
400
result,
390
401
rules,
402
+ emailAccountId,
391
403
onSelectExpectedRuleId,
392
404
} : {
393
405
result : RunRulesResult | null ;
394
406
rules : RulesResponse ;
407
+ emailAccountId : string ;
395
408
onSelectExpectedRuleId : ( ruleId : string | null ) => void ;
396
409
} ) {
397
410
return (
398
411
< div >
399
412
< Label name = "matchedRule" label = "Matched:" />
400
413
< div className = "mt-1" >
401
414
{ result ? (
402
- < ProcessResultDisplay result = { result } />
415
+ < ProcessResultDisplay
416
+ result = { result }
417
+ emailAccountId = { emailAccountId }
418
+ />
403
419
) : (
404
420
< p > No rule matched</ p >
405
421
) }
@@ -420,9 +436,11 @@ function RuleMismatch({
420
436
421
437
function ThreadSettingsMismatchMessage ( {
422
438
expectedRuleId,
439
+ emailAccountId,
423
440
onBack,
424
441
} : {
425
442
expectedRuleId : string ;
443
+ emailAccountId : string ;
426
444
onBack : ( ) => void ;
427
445
} ) {
428
446
return (
@@ -433,7 +451,10 @@ function ThreadSettingsMismatchMessage({
433
451
</ SectionDescription >
434
452
< div className = "mt-2 flex gap-2" >
435
453
< BackButton onBack = { onBack } />
436
- < EditRuleButton ruleId = { expectedRuleId } />
454
+ < EditRuleButton
455
+ ruleId = { expectedRuleId }
456
+ emailAccountId = { emailAccountId }
457
+ />
437
458
</ div >
438
459
</ div >
439
460
) ;
@@ -506,7 +527,7 @@ function GroupMismatchAdd({
506
527
507
528
< div className = "mt-2 flex gap-2" >
508
529
< BackButton onBack = { onBack } />
509
- < EditRuleButton ruleId = { ruleId } />
530
+ < EditRuleButton ruleId = { ruleId } emailAccountId = { emailAccountId } />
510
531
</ div >
511
532
</ div >
512
533
) ;
@@ -575,7 +596,7 @@ function GroupMismatchRemove({
575
596
576
597
< div className = "mt-2 flex gap-2" >
577
598
< BackButton onBack = { onBack } />
578
- < EditRuleButton ruleId = { ruleId } />
599
+ < EditRuleButton ruleId = { ruleId } emailAccountId = { emailAccountId } />
579
600
</ div >
580
601
</ div >
581
602
) ;
@@ -629,18 +650,20 @@ function CategoryMismatch({
629
650
630
651
< div className = "mt-2 flex gap-2" >
631
652
< BackButton onBack = { onBack } />
632
- < EditRuleButton ruleId = { ruleId } />
653
+ < EditRuleButton ruleId = { ruleId } emailAccountId = { emailAccountId } />
633
654
</ div >
634
655
</ div >
635
656
) ;
636
657
}
637
658
638
659
// TODO: Could auto fix the static rule for the user
639
660
function StaticMismatch ( {
661
+ emailAccountId,
640
662
ruleId,
641
663
isExpectedStaticRule,
642
664
onBack,
643
665
} : {
666
+ emailAccountId : string ;
644
667
ruleId : string ;
645
668
isExpectedStaticRule : boolean ;
646
669
onBack : ( ) => void ;
@@ -656,7 +679,7 @@ function StaticMismatch({
656
679
</ SectionDescription >
657
680
< div className = "mt-2 flex gap-2" >
658
681
< BackButton onBack = { onBack } />
659
- < EditRuleButton ruleId = { ruleId } />
682
+ < EditRuleButton ruleId = { ruleId } emailAccountId = { emailAccountId } />
660
683
</ div >
661
684
</ div >
662
685
) ;
@@ -669,24 +692,35 @@ function ManualFixView({
669
692
result,
670
693
onBack,
671
694
isTest,
695
+ emailAccountId,
672
696
} : {
673
697
actualRule ?: Rule | null ;
674
698
expectedRule ?: Rule | null ;
675
699
message : ParsedMessage ;
676
700
result : RunRulesResult | null ;
677
701
onBack : ( ) => void ;
678
702
isTest : boolean ;
703
+ emailAccountId : string ;
679
704
} ) {
680
705
return (
681
706
< >
682
707
< >
683
- { result && < ProcessResultDisplay result = { result } prefix = "Matched: " /> }
708
+ { result && (
709
+ < ProcessResultDisplay
710
+ result = { result }
711
+ prefix = "Matched: "
712
+ emailAccountId = { emailAccountId }
713
+ />
714
+ ) }
684
715
{ actualRule && (
685
716
< >
686
717
{ isAIRule ( actualRule ) ? (
687
718
< RuleForm rule = { actualRule } />
688
719
) : (
689
- < EditRuleButton ruleId = { actualRule . id } />
720
+ < EditRuleButton
721
+ ruleId = { actualRule . id }
722
+ emailAccountId = { emailAccountId }
723
+ />
690
724
) }
691
725
< Separator />
692
726
</ >
@@ -698,7 +732,10 @@ function ManualFixView({
698
732
{ isAIRule ( expectedRule ) ? (
699
733
< RuleForm rule = { expectedRule } />
700
734
) : (
701
- < EditRuleButton ruleId = { expectedRule . id } />
735
+ < EditRuleButton
736
+ ruleId = { expectedRule . id }
737
+ emailAccountId = { emailAccountId }
738
+ />
702
739
) }
703
740
< Separator />
704
741
</ >
@@ -976,17 +1013,20 @@ function RerunButton({
976
1013
const [ result , setResult ] = useState < RunRulesResult > ( ) ;
977
1014
978
1015
const { emailAccountId } = useAccount ( ) ;
979
- const { execute, isExecuting } = useAction ( runRulesAction . bind ( null , emailAccountId ) , {
980
- onSuccess : ( result ) => {
981
- setResult ( result ?. data ) ;
982
- } ,
983
- onError : ( error ) => {
984
- toastError ( {
985
- title : "There was an error testing the email" ,
986
- description : error . error . serverError ?? "An error occurred" ,
987
- } ) ;
1016
+ const { execute, isExecuting } = useAction (
1017
+ runRulesAction . bind ( null , emailAccountId ) ,
1018
+ {
1019
+ onSuccess : ( result ) => {
1020
+ setResult ( result ?. data ) ;
1021
+ } ,
1022
+ onError : ( error ) => {
1023
+ toastError ( {
1024
+ title : "There was an error testing the email" ,
1025
+ description : error . error . serverError ?? "An error occurred" ,
1026
+ } ) ;
1027
+ } ,
988
1028
} ,
989
- } ) ;
1029
+ ) ;
990
1030
991
1031
return (
992
1032
< >
@@ -1007,7 +1047,10 @@ function RerunButton({
1007
1047
{ result && (
1008
1048
< div className = "mt-2 flex items-center gap-2" >
1009
1049
< SectionDescription > Result:</ SectionDescription >
1010
- < ProcessResultDisplay result = { result } />
1050
+ < ProcessResultDisplay
1051
+ result = { result }
1052
+ emailAccountId = { emailAccountId }
1053
+ />
1011
1054
</ div >
1012
1055
) }
1013
1056
</ >
@@ -1023,10 +1066,19 @@ function BackButton({ onBack }: { onBack: () => void }) {
1023
1066
) ;
1024
1067
}
1025
1068
1026
- function EditRuleButton ( { ruleId } : { ruleId : string } ) {
1069
+ function EditRuleButton ( {
1070
+ ruleId,
1071
+ emailAccountId,
1072
+ } : {
1073
+ ruleId : string ;
1074
+ emailAccountId : string ;
1075
+ } ) {
1027
1076
return (
1028
1077
< Button variant = "outline" size = "sm" asChild >
1029
- < Link href = { `/automation/rule/${ ruleId } ` } target = "_blank" >
1078
+ < Link
1079
+ href = { prefixPath ( emailAccountId , `/automation/rule/${ ruleId } ` ) }
1080
+ target = "_blank"
1081
+ >
1030
1082
< ExternalLinkIcon className = "mr-2 size-4" />
1031
1083
Edit Rule
1032
1084
</ Link >
0 commit comments