1- import { useState , useCallback , useEffect } from 'react' ;
2- import { V1Beta1Preference } from '../../api-client' ;
3- import { useFrontier } from '../contexts/FrontierContext' ;
1+ import { useQuery , useMutation , createConnectQueryKey , useTransport } from '@connectrpc/connect-query' ;
2+ import { useQueryClient } from '@tanstack/react-query' ;
3+ import { create } from '@bufbuild/protobuf' ;
4+ import { FrontierServiceQueries , CreateCurrentUserPreferencesRequestSchema } from '@raystack/proton/frontier' ;
5+ import { useCallback } from 'react' ;
46
5- type Preferences = Record < string , V1Beta1Preference > ;
7+ type Preference = {
8+ name ?: string ;
9+ value ?: string ;
10+ [ key : string ] : any ;
11+ } ;
12+
13+ type Preferences = Record < string , Preference > ;
614
715export interface UsePreferences {
816 preferences : Preferences ;
917 isLoading : boolean ;
1018 isFetching : boolean ;
1119 status : 'idle' | 'fetching' | 'loading' ;
12- fetchPreferences : ( ) => Promise < V1Beta1Preference [ ] | undefined > ;
20+ fetchPreferences : ( ) => void ;
1321 updatePreferences : (
14- preferences : V1Beta1Preference [ ]
15- ) => Promise < V1Beta1Preference [ ] | undefined > ;
22+ preferences : Preference [ ]
23+ ) => Promise < void > ;
1624}
1725
18- function getFormattedData ( preferences : V1Beta1Preference [ ] = [ ] ) : Preferences {
26+ function getFormattedData ( preferences : Preference [ ] = [ ] ) : Preferences {
1927 return preferences . reduce ( ( acc : Preferences , preference ) => {
2028 if ( preference ?. name ) acc [ preference . name ] = preference ;
2129 return acc ;
@@ -27,65 +35,71 @@ export function usePreferences({
2735} : {
2836 autoFetch ?: boolean ;
2937} = { } ) : UsePreferences {
30- const { client } = useFrontier ( ) ;
31- const [ preferences , setPreferences ] = useState < Preferences > ( { } ) ;
32- const [ status , setStatus ] = useState < UsePreferences [ 'status' ] > ( 'idle' ) ;
38+ const queryClient = useQueryClient ( ) ;
39+ const transport = useTransport ( ) ;
40+
41+ const {
42+ data : preferences ,
43+ isLoading : isFetchingPreferences ,
44+ refetch
45+ } = useQuery (
46+ FrontierServiceQueries . listCurrentUserPreferences ,
47+ { } ,
48+ {
49+ enabled : autoFetch ,
50+ select : ( data ) => getFormattedData ( data ?. preferences ?? [ ] )
51+ }
52+ ) ;
53+
54+ const {
55+ mutateAsync : updatePreferencesMutation ,
56+ isPending : isUpdatingPreferences
57+ } = useMutation ( FrontierServiceQueries . createCurrentUserPreferences , {
58+ onSuccess : ( ) => {
59+ queryClient . invalidateQueries ( {
60+ queryKey : createConnectQueryKey ( {
61+ schema : FrontierServiceQueries . listCurrentUserPreferences ,
62+ transport,
63+ input : { } ,
64+ cardinality : 'finite'
65+ } )
66+ } ) ;
67+ } ,
68+ onError : ( err ) => {
69+ console . error (
70+ 'frontier:sdk:: There is problem with updating user preferences'
71+ ) ;
72+ console . error ( err ) ;
73+ }
74+ } ) ;
3375
34- const fetchPreferences = useCallback ( async ( ) => {
76+ const updatePreferences = useCallback ( async ( preferences : Preference [ ] ) => {
3577 try {
36- setStatus ( 'fetching' ) ;
37- const response =
38- await client ?. frontierServiceListCurrentUserPreferences ( ) ;
39- const data = response ?. data . preferences || [ ] ;
40- setPreferences ( getFormattedData ( data ) ) ;
41- return data ;
78+ const req = create ( CreateCurrentUserPreferencesRequestSchema , {
79+ bodies : preferences
80+ } ) ;
81+ await updatePreferencesMutation ( req ) ;
4282 } catch ( err ) {
4383 console . error (
44- 'frontier:sdk:: There is problem with fetching user preferences'
84+ 'frontier:sdk:: There is problem with updating user preferences'
4585 ) ;
4686 console . error ( err ) ;
47- } finally {
48- setStatus ( 'idle' ) ;
87+ throw err ;
4988 }
50- return [ ] ;
51- } , [ client ] ) ;
89+ } , [ updatePreferencesMutation ] ) ;
5290
53- const updatePreferences = useCallback (
54- async ( preferences : V1Beta1Preference [ ] ) => {
55- try {
56- setStatus ( 'loading' ) ;
57- const response =
58- await client ?. frontierServiceCreateCurrentUserPreferences ( {
59- bodies : preferences
60- } ) ;
61- const data = response ?. data ?. preferences ?? [ ] ;
62- setPreferences ( getFormattedData ( data ) ) ;
63- return data ;
64- } catch ( err ) {
65- console . error (
66- 'frontier:sdk:: There is problem with updating user preferences'
67- ) ;
68- console . error ( err ) ;
69- } finally {
70- setStatus ( 'idle' ) ;
71- }
72- return [ ] ;
73- } ,
74- [ client ]
75- ) ;
76-
77- useEffect ( ( ) => {
78- if ( autoFetch ) {
79- fetchPreferences ( ) ;
80- }
81- } , [ fetchPreferences , autoFetch ] ) ;
91+ const status : UsePreferences [ 'status' ] = isUpdatingPreferences
92+ ? 'loading'
93+ : isFetchingPreferences
94+ ? 'fetching'
95+ : 'idle' ;
8296
8397 return {
84- preferences,
98+ preferences : preferences ?? { } ,
8599 status,
86- isLoading : status === 'loading' ,
87- isFetching : status === 'fetching' ,
88- fetchPreferences,
100+ isLoading : isUpdatingPreferences ,
101+ isFetching : isFetchingPreferences ,
102+ fetchPreferences : refetch ,
89103 updatePreferences
90104 } ;
91105}
0 commit comments