@@ -102,131 +102,164 @@ import LfContributorAdd from '@/modules/contributor/components/edit/contributor-
102102import allMembers from ' @/modules/member/config/saved-views/views/all-members' ;
103103import LfIcon from ' @/ui-kit/icon/Icon.vue' ;
104104import LfButton from ' @/ui-kit/button/Button.vue' ;
105+ import { useQuery , useQueryClient } from ' @tanstack/vue-query' ;
106+ import { TanstackKey } from ' @/shared/types/tanstack' ;
105107import { memberFilters , memberSearchFilter } from ' ../config/filters/main' ;
106108import { memberSavedViews , memberStaticViews } from ' ../config/saved-views/main' ;
107109
108110const memberStore = useMemberStore ();
109- const { getMemberCustomAttributes, fetchMembers } = memberStore ;
110- const { filters, customAttributesFilter, savedFilterBody } = storeToRefs (memberStore );
111+ const { filters, customAttributesFilter } = storeToRefs (memberStore );
111112
112113const lsSegmentsStore = useLfSegmentsStore ();
113114const { selectedProjectGroup } = storeToRefs (lsSegmentsStore );
114115
115- const membersCount = ref (0 );
116- const membersToMergeCount = ref (0 );
117116const memberCreate = ref (false );
118117
119118const { listByPlatform } = mapGetters (' integration' );
120119
121120const { hasPermission } = usePermissions ();
122121
123- const memberFilter = ref <LfFilter | null >(null );
122+ const memberFilter = ref <InstanceType < typeof LfFilter > | null >(null );
124123
125124const hasIntegrations = computed (() => !! Object .keys (listByPlatform .value || {}).length );
126125
126+ const queryClient = useQueryClient ();
127+
127128const pagination = ref ({
128129 page: 1 ,
129130 perPage: 20 ,
130131});
131132
133+ // Reactive state for query parameters
134+ const queryParams = ref ({
135+ search: ' ' ,
136+ filter: {},
137+ offset: 0 ,
138+ limit: 20 ,
139+ orderBy: ' activityCount_DESC' ,
140+ });
141+
132142filters .value = { ... allMembers .config };
133143
134- const fetchMembersToMergeCount = () => {
135- MemberService .fetchMergeSuggestions (0 , 0 , {
136- countOnly: true ,
137- })
138- .then (({ count }: any ) => {
139- membersToMergeCount .value = count ;
140- });
141- };
144+ // Create a computed query key for members
145+ const membersQueryKey = computed (() => [
146+ TanstackKey .MEMBERS_LIST ,
147+ selectedProjectGroup .value ?.id ,
148+ queryParams .value ,
149+ ]);
142150
143- const loading = ref (true );
144- const tableLoading = ref (true );
151+ // Query for members list with caching
152+ const {
153+ data : membersData,
154+ isLoading : membersLoading,
155+ isFetching : membersFetching,
156+ } = useQuery ({
157+ queryKey: membersQueryKey ,
158+ queryFn : () => MemberService .listMembers ({
159+ search: queryParams .value .search ,
160+ filter: queryParams .value .filter ,
161+ offset: queryParams .value .offset ,
162+ limit: queryParams .value .limit ,
163+ orderBy: queryParams .value .orderBy ,
164+ }),
165+ enabled: !! selectedProjectGroup .value ?.id ,
166+ });
145167
146- const showLoading = (filter : any , body : any ): boolean => {
147- const saved: any = { ... savedFilterBody .value };
148- delete saved .offset ;
149- delete saved .limit ;
150- delete saved .orderBy ;
151- const compare = {
152- ... body ,
153- filter ,
154- };
155- return JSON .stringify (saved ) !== JSON .stringify (compare );
156- };
168+ // Create a computed query key for merge suggestions
169+ const mergeSuggestionsQueryKey = computed (() => [
170+ TanstackKey .MEMBER_MERGE_SUGGESTIONS_COUNT ,
171+ selectedProjectGroup .value ?.id ,
172+ ]);
173+
174+ // Query for merge suggestions count with caching
175+ const {
176+ data : mergeSuggestionsData,
177+ } = useQuery ({
178+ queryKey: mergeSuggestionsQueryKey ,
179+ queryFn : () => MemberService .fetchMergeSuggestions (0 , 0 , { countOnly: true }),
180+ enabled: !! selectedProjectGroup .value ?.id ,
181+ });
182+
183+ // Watch for members data changes and update the store
184+ watch (membersData , (newData ) => {
185+ if (newData ) {
186+ // Update the Pinia store with the new data
187+ memberStore .members = newData .rows || [];
188+ memberStore .totalMembers = newData .count || 0 ;
189+ memberStore .savedFilterBody = {
190+ search: queryParams .value .search ,
191+ filter: queryParams .value .filter ,
192+ offset: queryParams .value .offset ,
193+ limit: queryParams .value .limit ,
194+ orderBy: queryParams .value .orderBy ,
195+ };
196+ }
197+ }, { immediate: true });
198+
199+ // Computed properties derived from queries
200+ const membersCount = computed (() => membersData .value ?.count || 0 );
201+ const membersToMergeCount = computed (() => mergeSuggestionsData .value ?.count || 0 );
202+ const loading = computed (() => membersLoading .value );
203+ const tableLoading = computed (() => membersFetching .value );
157204
158205const fetch = ({
159206 search , filter , orderBy , body ,
160207}: FilterQuery ) => {
161- if (! loading .value ) {
162- loading .value = showLoading (filter , body );
163- }
208+ // Update query parameters
209+ queryParams .value = {
210+ search: search || ' ' ,
211+ filter: filter || {},
212+ offset: 0 ,
213+ limit: pagination .value .perPage ,
214+ orderBy: orderBy || ' activityCount_DESC' ,
215+ ... body ,
216+ };
164217
165218 pagination .value .page = 1 ;
166- fetchMembers ({
167- body: {
168- ... body ,
169- search ,
170- filter ,
171- offset: 0 ,
172- limit: pagination .value .perPage ,
173- orderBy ,
174- },
175- }).then ((result ) => {
176- if (result && result .count !== undefined ) {
177- membersCount .value = result .count ;
178- }
179- }).finally (() => {
180- tableLoading .value = false ;
181- loading .value = false ;
182- });
183219};
220+
184221const onPaginationChange = ({
185222 page , perPage ,
186- }: FilterQuery ) => {
187- tableLoading .value = true ;
188- fetchMembers ({
189- reload: true ,
190- body: {
191- offset: (page - 1 ) * perPage || 0 ,
192- limit: perPage || 20 ,
193- },
194- }).finally (() => {
195- tableLoading .value = false ;
196- });
223+ }: { page: number ; perPage: number }) => {
224+ // Update only pagination parameters
225+ queryParams .value = {
226+ ... queryParams .value ,
227+ offset: (page - 1 ) * perPage || 0 ,
228+ limit: perPage || 20 ,
229+ };
230+
231+ pagination .value .page = page ;
232+ pagination .value .perPage = perPage ;
197233};
198234
199235watch (
200236 selectedProjectGroup ,
201237 (newProjectGroup , oldProjectGroup ) => {
202238 if (newProjectGroup ?.id !== oldProjectGroup ?.id ) {
203239 pagination .value .page = 1 ;
204- loading .value = true ;
205- tableLoading .value = true ;
206-
207- fetchMembers ({
208- reload: true ,
209- body: {
210- offset: 0 ,
211- limit: pagination .value .perPage ,
212- },
213- }).then ((result ) => {
214- if (result && result .count !== undefined ) {
215- membersCount .value = result .count ;
216- }
217- }).finally (() => {
218- tableLoading .value = false ;
219- loading .value = false ;
220- });
221240
222- fetchMembersToMergeCount ();
241+ // Reset query params for new project group
242+ queryParams .value = {
243+ search: ' ' ,
244+ filter: {},
245+ offset: 0 ,
246+ limit: pagination .value .perPage ,
247+ orderBy: ' activityCount_DESC' ,
248+ };
249+
250+ // Invalidate all related caches
251+ queryClient .invalidateQueries ({
252+ queryKey: [TanstackKey .MEMBERS_LIST ],
253+ });
254+ queryClient .invalidateQueries ({
255+ queryKey: [TanstackKey .MEMBER_MERGE_SUGGESTIONS_COUNT ],
256+ });
223257 }
224258 },
225259);
226260
227261onMounted (() => {
228- fetchMembersToMergeCount ();
229- getMemberCustomAttributes ();
262+ memberStore .getMemberCustomAttributes ();
230263 (window as any ).analytics .page (' Members' );
231264});
232265 </script >
0 commit comments