diff --git a/src/components/communitySettings/platform/TcDisconnectPlatform.tsx b/src/components/communitySettings/platform/TcDisconnectPlatform.tsx index 220f5551..bf6e7c13 100644 --- a/src/components/communitySettings/platform/TcDisconnectPlatform.tsx +++ b/src/components/communitySettings/platform/TcDisconnectPlatform.tsx @@ -66,11 +66,18 @@ function TcDisconnectPlatform({ platform }: TcDisconnectPlatformProps) {
- + + Importing activities and members will be stopped. Historical + activities will be deleted. + } variant="body2" /> @@ -81,11 +88,18 @@ function TcDisconnectPlatform({ platform }: TcDisconnectPlatformProps) { />
- + + Importing activities and members will be stopped. Historical + activities will not be affected. + } variant="body2" /> diff --git a/src/components/communitySettings/platform/TcPeriodRange.tsx b/src/components/communitySettings/platform/TcPeriodRange.tsx index 0f940a37..bc02dd82 100644 --- a/src/components/communitySettings/platform/TcPeriodRange.tsx +++ b/src/components/communitySettings/platform/TcPeriodRange.tsx @@ -42,7 +42,6 @@ function TcPeriodRange({ handleSelectedDate, activePeriod }: ITcPeriodRange) { return '1Y'; } }; - console.log(findDefaultPeriod()); const [selected, setSelected] = useState('Last 35 days'); diff --git a/src/components/communitySettings/platform/TcPlatform.tsx b/src/components/communitySettings/platform/TcPlatform.tsx index bf541857..1c53a3b1 100644 --- a/src/components/communitySettings/platform/TcPlatform.tsx +++ b/src/components/communitySettings/platform/TcPlatform.tsx @@ -67,7 +67,7 @@ function TcPlatform({ platformName = 'Discord' }: TcPlatformProps) { const handlePatchCommunity = async () => { try { - await patchPlatformById({ + const data = await patchPlatformById({ id, metadata: { selectedChannels: currentTrueIDs, @@ -75,7 +75,9 @@ function TcPlatform({ platformName = 'Discord' }: TcPlatformProps) { analyzerStartedAt: new Date().toISOString(), }, }); - setOpenConfirmDialog(true); + if (data) { + setOpenConfirmDialog(true); + } await fetchPlatform(); } catch (error) {} }; diff --git a/src/components/pages/pageIndex/ActiveMemberComposition.tsx b/src/components/pages/pageIndex/ActiveMemberComposition.tsx index 37e6545e..78ac4e7d 100644 --- a/src/components/pages/pageIndex/ActiveMemberComposition.tsx +++ b/src/components/pages/pageIndex/ActiveMemberComposition.tsx @@ -17,6 +17,7 @@ const ActiveMemberComposition = () => { useEffect(() => { let endDate: moment.Moment = moment().subtract(1, 'day'); let startDate: moment.Moment = moment(endDate).subtract(7, 'days'); + const platformId = community?.platforms[0]; if (platformId) { diff --git a/src/components/pages/statistics/memberBreakdowns/activeMembers/ActiveMemberBreakdown.tsx b/src/components/pages/statistics/memberBreakdowns/activeMembers/ActiveMemberBreakdown.tsx index 06025e6b..c2da8896 100644 --- a/src/components/pages/statistics/memberBreakdowns/activeMembers/ActiveMemberBreakdown.tsx +++ b/src/components/pages/statistics/memberBreakdowns/activeMembers/ActiveMemberBreakdown.tsx @@ -6,6 +6,7 @@ import CustomTable from '../CustomTable'; import { Column, IActivityCompositionOptions, + ICommunity, } from '../../../../../utils/interfaces'; import CustomPagination from '../CustomPagination'; import CustomButton from '../../../../global/CustomButton'; @@ -17,6 +18,7 @@ import { downloadCSVFile, } from '../../../../../helpers/csvHelper'; import router from 'next/router'; +import { useToken } from '../../../../../context/TokenContext'; const columns: Column[] = [ { id: 'username', label: 'Name' }, @@ -36,6 +38,7 @@ const options: IActivityCompositionOptions[] = [ export default function ActiveMemberBreakdown() { const { getActiveMemberCompositionTable } = useAppStore(); + const { community } = useToken(); const tableTopRef = useRef(null); @@ -59,8 +62,7 @@ export default function ActiveMemberBreakdown() { totalResults: 0, totalPages: 0, }); - const user = StorageService.readLocalStorage('user'); - const guild = user?.guild; + const platformId = community?.platforms[0]; const handlePageChange = (selectedPage: number) => { setPage(selectedPage); @@ -70,13 +72,13 @@ export default function ActiveMemberBreakdown() { }; useEffect(() => { - if (!guild) { + if (!platformId) { return; } setLoading(true); const fetchData = async () => { const res = await getActiveMemberCompositionTable( - guild.guildId, + platformId, activityComposition, roles, username, @@ -149,7 +151,7 @@ export default function ActiveMemberBreakdown() { }; const handleDownloadCSV = async () => { - if (!guild) { + if (!platformId) { return; } @@ -157,7 +159,7 @@ export default function ActiveMemberBreakdown() { const limit = fetchedData.totalResults; const { results } = await getActiveMemberCompositionTable( - guild.guildId, + platformId, activityComposition, roles, username, diff --git a/src/components/pages/statistics/memberBreakdowns/disengagedMembersComposition/DisengagedMembersCompositionBreakdown.tsx b/src/components/pages/statistics/memberBreakdowns/disengagedMembersComposition/DisengagedMembersCompositionBreakdown.tsx index e026f4f6..35f70679 100644 --- a/src/components/pages/statistics/memberBreakdowns/disengagedMembersComposition/DisengagedMembersCompositionBreakdown.tsx +++ b/src/components/pages/statistics/memberBreakdowns/disengagedMembersComposition/DisengagedMembersCompositionBreakdown.tsx @@ -17,6 +17,7 @@ import { downloadCSVFile, } from '../../../../../helpers/csvHelper'; import router from 'next/router'; +import { useToken } from '../../../../../context/TokenContext'; const columns: Column[] = [ { id: 'username', label: 'Name' }, @@ -47,6 +48,7 @@ const options: IActivityCompositionOptions[] = [ export default function DisengagedMembersCompositionBreakdown() { const { getDisengagedMembersCompositionTable } = useAppStore(); + const { community } = useToken(); const tableTopRef = useRef(null); @@ -70,8 +72,8 @@ export default function DisengagedMembersCompositionBreakdown() { totalResults: 0, totalPages: 0, }); - const user = StorageService.readLocalStorage('user'); - const guild = user?.guild; + + const platformId = community?.platforms[0]; const handlePageChange = (selectedPage: number) => { setPage(selectedPage); @@ -81,13 +83,13 @@ export default function DisengagedMembersCompositionBreakdown() { }; useEffect(() => { - if (!guild) { + if (!platformId) { return; } setLoading(true); const fetchData = async () => { const res = await getDisengagedMembersCompositionTable( - guild.guildId, + platformId, disengagedComposition, roles, username, @@ -160,7 +162,7 @@ export default function DisengagedMembersCompositionBreakdown() { }; const handleDownloadCSV = async () => { - if (!guild) { + if (!platformId) { return; } @@ -168,7 +170,7 @@ export default function DisengagedMembersCompositionBreakdown() { const limit = fetchedData.totalResults; const { results } = await getDisengagedMembersCompositionTable( - guild.guildId, + platformId, disengagedComposition, roles, username, diff --git a/src/components/pages/statistics/memberBreakdowns/onboardingMembers/OnboardingMembersBreakdown.tsx b/src/components/pages/statistics/memberBreakdowns/onboardingMembers/OnboardingMembersBreakdown.tsx index bc14b8ae..525af241 100644 --- a/src/components/pages/statistics/memberBreakdowns/onboardingMembers/OnboardingMembersBreakdown.tsx +++ b/src/components/pages/statistics/memberBreakdowns/onboardingMembers/OnboardingMembersBreakdown.tsx @@ -17,6 +17,7 @@ import { downloadCSVFile, } from '../../../../../helpers/csvHelper'; import router from 'next/router'; +import { useToken } from '../../../../../context/TokenContext'; const columns: Column[] = [ { id: 'username', label: 'Name' }, @@ -35,6 +36,7 @@ const options: IActivityCompositionOptions[] = [ export default function OnboardingMembersBreakdown() { const { getOnboardingMemberCompositionTable } = useAppStore(); + const { community } = useToken(); const tableTopRef = useRef(null); @@ -58,8 +60,8 @@ export default function OnboardingMembersBreakdown() { totalResults: 0, totalPages: 0, }); - const user = StorageService.readLocalStorage('user'); - const guild = user?.guild; + + const platformId = community?.platforms[0]; const handlePageChange = (selectedPage: number) => { setPage(selectedPage); @@ -69,13 +71,13 @@ export default function OnboardingMembersBreakdown() { }; useEffect(() => { - if (!guild) { + if (!platformId) { return; } setLoading(true); const fetchData = async () => { const res = await getOnboardingMemberCompositionTable( - guild.guildId, + platformId, onboardingComposition, roles, username, @@ -147,7 +149,7 @@ export default function OnboardingMembersBreakdown() { }; const handleDownloadCSV = async () => { - if (!guild) { + if (!platformId) { return; } @@ -155,7 +157,7 @@ export default function OnboardingMembersBreakdown() { const limit = fetchedData.totalResults; const { results } = await getOnboardingMemberCompositionTable( - guild.guildId, + platformId, onboardingComposition, roles, username, diff --git a/src/context/TokenContext.tsx b/src/context/TokenContext.tsx index f594f659..953cf5a9 100644 --- a/src/context/TokenContext.tsx +++ b/src/context/TokenContext.tsx @@ -1,9 +1,9 @@ -'use client'; import React, { useState, useContext, createContext, useEffect, + useRef, ReactNode, } from 'react'; import { StorageService } from '../services/StorageService'; @@ -31,15 +31,18 @@ export const TokenProvider: React.FC = ({ children }) => { const [token, setToken] = useState(null); const [community, setCommunity] = useState(null); - let intervalId: string | number | NodeJS.Timer | undefined; + // Use useRef to persist the interval ID across renders + const intervalIdRef = useRef(null); useEffect(() => { const storedToken = StorageService.readLocalStorage('user'); const storedCommunity = StorageService.readLocalStorage('community'); + if (storedToken) { setToken(storedToken); } + if (storedCommunity) { setCommunity(storedCommunity); } @@ -61,14 +64,18 @@ export const TokenProvider: React.FC = ({ children }) => { } catch (error) { console.error('Error fetching community:', error); StorageService.removeLocalStorage('community'); - clearInterval(intervalId); + if (intervalIdRef.current) { + clearInterval(intervalIdRef.current); + } } }; - intervalId = setInterval(fetchAndUpdateCommunity, 5000); + intervalIdRef.current = setInterval(fetchAndUpdateCommunity, 5000); return () => { - clearInterval(intervalId); + if (intervalIdRef.current) { + clearInterval(intervalIdRef.current); + } }; }, []); @@ -77,9 +84,35 @@ export const TokenProvider: React.FC = ({ children }) => { setToken(newToken); }; - const updateCommunity = (newCommunity: ICommunity) => { - StorageService.writeLocalStorage('community', newCommunity); + const updateCommunity = async (newCommunity: ICommunity) => { + // Clear the existing interval + if (intervalIdRef.current) { + clearInterval(intervalIdRef.current); + } + + // Update the community and reset the interval setCommunity(newCommunity); + StorageService.writeLocalStorage('community', newCommunity); + + // Restart the interval + intervalIdRef.current = setInterval(async () => { + try { + const updatedCommunity = await retrieveCommunityById(newCommunity.id); + if (updatedCommunity) { + setCommunity(updatedCommunity); + StorageService.writeLocalStorage( + 'community', + updatedCommunity + ); + } + } catch (error) { + console.error('Error fetching community:', error); + StorageService.removeLocalStorage('community'); + if (intervalIdRef.current) { + clearInterval(intervalIdRef.current); + } + } + }, 5000); }; const clearToken = () => { diff --git a/src/store/slices/breakdownsSlice.ts b/src/store/slices/breakdownsSlice.ts index c9b416de..007a8e62 100644 --- a/src/store/slices/breakdownsSlice.ts +++ b/src/store/slices/breakdownsSlice.ts @@ -9,7 +9,7 @@ const createBreakdownsSlice: StateCreator = (set, get) => ({ isRolesLoading: false, roles: [], getActiveMemberCompositionTable: async ( - guild_id: string, + platformId: string, activityComposition: string[], roles: string[], username?: string, @@ -47,15 +47,15 @@ const createBreakdownsSlice: StateCreator = (set, get) => ({ params.append('ngu', username); } - const url = `/member-activity/${guild_id}/active-members-composition-table?${params.toString()}`; + const url = `/member-activity/${platformId}/active-members-composition-table?${params.toString()}`; - const { data } = await axiosInstance.get(url); + const { data } = await axiosInstance.post(url); return data; } catch (error) {} }, getOnboardingMemberCompositionTable: async ( - guild_id: string, + platformId: string, activityComposition: string[], roles: string[], username?: string, @@ -93,15 +93,15 @@ const createBreakdownsSlice: StateCreator = (set, get) => ({ params.append('ngu', username); } - const url = `/member-activity/${guild_id}/active-members-onboarding-table?${params.toString()}`; + const url = `/member-activity/${platformId}/active-members-onboarding-table?${params.toString()}`; - const { data } = await axiosInstance.get(url); + const { data } = await axiosInstance.post(url); return data; } catch (error) {} }, getDisengagedMembersCompositionTable: async ( - guild_id: string, + platformId: string, activityComposition: string[], roles: string[], username?: string, @@ -139,25 +139,13 @@ const createBreakdownsSlice: StateCreator = (set, get) => ({ params.append('ngu', username); } - const url = `/member-activity/${guild_id}/disengaged-members-composition-table?${params.toString()}`; + const url = `/member-activity/${platformId}/disengaged-members-composition-table?${params.toString()}`; - const { data } = await axiosInstance.get(url); + const { data } = await axiosInstance.post(url); return data; } catch (error) {} }, - getRoles: async (guild_id: string) => { - try { - set(() => ({ isRolesLoading: true })); - - const { data } = await axiosInstance.get(`/guilds/${guild_id}/roles`); - - set(() => ({ roles: data, isRolesLoading: false })); - return data; - } catch (error) { - set(() => ({ isRolesLoading: false })); - } - }, }); export default createBreakdownsSlice; diff --git a/src/store/types/IBreakdown.ts b/src/store/types/IBreakdown.ts index e008bfd5..bf7d77ca 100644 --- a/src/store/types/IBreakdown.ts +++ b/src/store/types/IBreakdown.ts @@ -5,7 +5,7 @@ export default interface IBreakdown { isRolesLoading: boolean; roles: any[]; getActiveMemberCompositionTable: ( - guild_id: string, + platformId: string, activityComposition: string[], roles: string[], username?: string, @@ -14,7 +14,7 @@ export default interface IBreakdown { limit?: number ) => any; getOnboardingMemberCompositionTable: ( - guild_id: string, + platformId: string, activityComposition: string[], roles: string[], username?: string, @@ -23,7 +23,7 @@ export default interface IBreakdown { limit?: number ) => any; getDisengagedMembersCompositionTable: ( - guild_id: string, + platformId: string, activityComposition: string[], roles: string[], username?: string, @@ -31,5 +31,4 @@ export default interface IBreakdown { page?: number, limit?: number ) => any; - getRoles: (guild_id: string) => any; }