Skip to content

Commit a65c239

Browse files
authored
migrate(sdk): user preferences to ConnectRPC (#1214)
1 parent 6f451bb commit a65c239

File tree

1 file changed

+70
-56
lines changed

1 file changed

+70
-56
lines changed
Lines changed: 70 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,29 @@
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

715
export 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

Comments
 (0)