@@ -4,95 +4,98 @@ import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/com
44import { useTranslation } from '@/hooks/use-translation' ;
55import { toast } from 'sonner' ;
66import { TabsContent } from '@/components/ui/tabs' ;
7- import { useGetAllFeatureFlagsQuery , useUpdateFeatureFlagMutation } from '@/redux/services/feature-flags/featureFlagsApi' ;
7+ import {
8+ useGetAllFeatureFlagsQuery ,
9+ useUpdateFeatureFlagMutation
10+ } from '@/redux/services/feature-flags/featureFlagsApi' ;
811import { Separator } from '@/components/ui/separator' ;
912import { FeatureFlag , FeatureName , featureGroups } from '@/types/feature-flags' ;
1013
11-
1214export default function FeatureFlagsSettings ( ) {
13- const { t } = useTranslation ( ) ;
14- const activeOrganization = useAppSelector ( ( state ) => state . user . activeOrganization ) ;
15- const { data : featureFlags , isLoading } = useGetAllFeatureFlagsQuery ( undefined , {
16- skip : ! activeOrganization ?. id
17- } ) ;
18- const [ updateFeatureFlag ] = useUpdateFeatureFlagMutation ( ) ;
19-
20- const handleToggleFeature = async ( featureName : string , isEnabled : boolean ) => {
21- try {
22- await updateFeatureFlag ( {
23- feature_name : featureName ,
24- is_enabled : isEnabled
25- } ) . unwrap ( ) ;
26- toast . success ( t ( 'settings.featureFlags.messages.updated' ) ) ;
27- } catch ( error ) {
28- toast . error ( t ( 'settings.featureFlags.messages.updateFailed' ) ) ;
29- }
30- } ;
15+ const { t } = useTranslation ( ) ;
16+ const activeOrganization = useAppSelector ( ( state ) => state . user . activeOrganization ) ;
17+ const { data : featureFlags , isLoading } = useGetAllFeatureFlagsQuery ( undefined , {
18+ skip : ! activeOrganization ?. id
19+ } ) ;
20+ const [ updateFeatureFlag ] = useUpdateFeatureFlagMutation ( ) ;
3121
32- if ( isLoading ) {
33- return < div > { t ( 'common.loading' ) } </ div > ;
22+ const handleToggleFeature = async ( featureName : string , isEnabled : boolean ) => {
23+ try {
24+ await updateFeatureFlag ( {
25+ feature_name : featureName ,
26+ is_enabled : isEnabled
27+ } ) . unwrap ( ) ;
28+ toast . success ( t ( 'settings.featureFlags.messages.updated' ) ) ;
29+ } catch ( error ) {
30+ toast . error ( t ( 'settings.featureFlags.messages.updateFailed' ) ) ;
3431 }
32+ } ;
3533
36- const getGroupedFeatures = ( ) => {
37- const grouped = new Map < string , FeatureFlag [ ] > ( ) ;
38- featureFlags ?. forEach ( feature => {
39- for ( const [ group , features ] of Object . entries ( featureGroups ) ) {
40- if ( features . includes ( feature . feature_name as FeatureName ) ) {
41- if ( ! grouped . has ( group ) ) {
42- grouped . set ( group , [ ] ) ;
43- }
44- grouped . get ( group ) ?. push ( feature as FeatureFlag ) ;
45- return ;
46- }
47- }
48- } ) ;
49- return grouped ;
50- } ;
34+ if ( isLoading ) {
35+ return < div > { t ( 'common.loading' ) } </ div > ;
36+ }
37+
38+ const getGroupedFeatures = ( ) => {
39+ const grouped = new Map < string , FeatureFlag [ ] > ( ) ;
40+ featureFlags ?. forEach ( ( feature ) => {
41+ for ( const [ group , features ] of Object . entries ( featureGroups ) ) {
42+ if ( features . includes ( feature . feature_name as FeatureName ) ) {
43+ if ( ! grouped . has ( group ) ) {
44+ grouped . set ( group , [ ] ) ;
45+ }
46+ grouped . get ( group ) ?. push ( feature as FeatureFlag ) ;
47+ return ;
48+ }
49+ }
50+ } ) ;
51+ return grouped ;
52+ } ;
5153
52- const groupedFeatures = getGroupedFeatures ( ) ;
54+ const groupedFeatures = getGroupedFeatures ( ) ;
5355
54- return (
55- < TabsContent value = "feature-flags" className = "space-y-6 mt-4" >
56- < Card >
57- < CardHeader >
58- < CardTitle > { t ( 'settings.featureFlags.title' ) } </ CardTitle >
59- < CardDescription > { t ( 'settings.featureFlags.description' ) } </ CardDescription >
60- </ CardHeader >
61- < CardContent className = "space-y-6" >
62- { Array . from ( groupedFeatures . entries ( ) ) . map ( ( [ group , features ] , index ) => (
63- < div key = { group } className = "space-y-4" >
64- < div className = "space-y-2" >
65- < h3 className = "text-lg font-semibold" >
66- { t ( `settings.featureFlags.groups.${ group } .title` ) }
67- </ h3 >
68- </ div >
69- < div className = "space-y-4" >
70- { features ?. map ( ( feature ) => (
71- < div key = { feature . feature_name } className = "flex items-center justify-between p-2 rounded-lg" >
72- < div className = "space-y-1" >
73- < h4 className = "text-sm font-medium" >
74- { t ( `settings.featureFlags.features.${ feature . feature_name } .title` ) }
75- </ h4 >
76- < p className = "text-sm text-muted-foreground" >
77- { t ( `settings.featureFlags.features.${ feature . feature_name } .description` ) }
78- </ p >
79- </ div >
80- < Switch
81- checked = { feature . is_enabled }
82- onCheckedChange = { ( checked ) => handleToggleFeature ( feature . feature_name , checked ) }
83- />
84- </ div >
85- ) ) }
86- </ div >
87- {
88- index !== groupedFeatures . size - 1 && (
89- < Separator />
90- )
91- }
92- </ div >
93- ) ) }
94- </ CardContent >
95- </ Card >
96- </ TabsContent >
97- ) ;
98- }
56+ return (
57+ < TabsContent value = "feature-flags" className = "space-y-6 mt-4" >
58+ < Card >
59+ < CardHeader >
60+ < CardTitle > { t ( 'settings.featureFlags.title' ) } </ CardTitle >
61+ < CardDescription > { t ( 'settings.featureFlags.description' ) } </ CardDescription >
62+ </ CardHeader >
63+ < CardContent className = "space-y-6" >
64+ { Array . from ( groupedFeatures . entries ( ) ) . map ( ( [ group , features ] , index ) => (
65+ < div key = { group } className = "space-y-4" >
66+ < div className = "space-y-2" >
67+ < h3 className = "text-lg font-semibold" >
68+ { t ( `settings.featureFlags.groups.${ group } .title` ) }
69+ </ h3 >
70+ </ div >
71+ < div className = "space-y-4" >
72+ { features ?. map ( ( feature ) => (
73+ < div
74+ key = { feature . feature_name }
75+ className = "flex items-center justify-between p-2 rounded-lg"
76+ >
77+ < div className = "space-y-1" >
78+ < h4 className = "text-sm font-medium" >
79+ { t ( `settings.featureFlags.features.${ feature . feature_name } .title` ) }
80+ </ h4 >
81+ < p className = "text-sm text-muted-foreground" >
82+ { t ( `settings.featureFlags.features.${ feature . feature_name } .description` ) }
83+ </ p >
84+ </ div >
85+ < Switch
86+ checked = { feature . is_enabled }
87+ onCheckedChange = { ( checked ) =>
88+ handleToggleFeature ( feature . feature_name , checked )
89+ }
90+ />
91+ </ div >
92+ ) ) }
93+ </ div >
94+ { index !== groupedFeatures . size - 1 && < Separator /> }
95+ </ div >
96+ ) ) }
97+ </ CardContent >
98+ </ Card >
99+ </ TabsContent >
100+ ) ;
101+ }
0 commit comments