Skip to content

Commit 5b1479e

Browse files
committed
cleanup styles
1 parent bc57692 commit 5b1479e

File tree

5 files changed

+17
-121
lines changed

5 files changed

+17
-121
lines changed

apps/dashboard/app/(main)/websites/[id]/_components/tabs/audience-tab.tsx

Lines changed: 4 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import type { CellContext, ColumnDef } from "@tanstack/react-table";
1010
import dayjs from "dayjs";
1111
import timezone from "dayjs/plugin/timezone";
1212
import utc from "dayjs/plugin/utc";
13-
import { useCallback, useEffect, useMemo } from "react";
13+
import { useCallback, useMemo } from "react";
1414
import { ErrorBoundary } from "@/components/error-boundary";
1515
import { BrowserIcon } from "@/components/icon";
1616
import { DataTable } from "@/components/table/data-table";
@@ -240,10 +240,9 @@ export function WebsiteAudienceTab({
240240
websiteId,
241241
dateRange,
242242
isRefreshing,
243-
setIsRefreshing,
244243
filters,
245244
addFilter,
246-
}: FullTabProps) {
245+
}: Omit<FullTabProps, "setIsRefreshing">) {
247246
const batchQueries = useMemo(
248247
() => [
249248
{
@@ -267,27 +266,8 @@ export function WebsiteAudienceTab({
267266
[filters]
268267
);
269268

270-
const {
271-
results: batchResults,
272-
isLoading: isBatchLoading,
273-
refetch: refetchBatch,
274-
} = useBatchDynamicQuery(websiteId, dateRange, batchQueries);
275-
276-
const handleRefresh = useCallback(async () => {
277-
try {
278-
await refetchBatch();
279-
} catch (error) {
280-
console.error("Failed to refresh audience data:", error);
281-
} finally {
282-
setIsRefreshing(false);
283-
}
284-
}, [refetchBatch, setIsRefreshing]);
285-
286-
useEffect(() => {
287-
if (isRefreshing) {
288-
handleRefresh();
289-
}
290-
}, [isRefreshing, handleRefresh]);
269+
const { results: batchResults, isLoading: isBatchLoading } =
270+
useBatchDynamicQuery(websiteId, dateRange, batchQueries);
291271

292272
const geographicData = useMemo(
293273
() =>

apps/dashboard/app/(main)/websites/[id]/audience/page.tsx

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
"use client";
22

33
import type { DynamicQueryFilter } from "@databuddy/shared/types/api";
4-
import { useAtom } from "jotai";
4+
import { useAtom, useAtomValue } from "jotai";
55
import { useParams } from "next/navigation";
66
import { useCallback } from "react";
77
import { ErrorBoundary } from "@/components/error-boundary";
88
import { useDateFilters } from "@/hooks/use-date-filters";
9-
import { useWebsite } from "@/hooks/use-websites";
109
import {
1110
addDynamicFilterAtom,
1211
dynamicQueryFiltersAtom,
@@ -17,12 +16,11 @@ import { WebsiteAudienceTab } from "../_components/tabs/audience-tab";
1716
export default function AudiencePage() {
1817
const { id } = useParams();
1918
const websiteId = id as string;
20-
const [isRefreshing, setIsRefreshing] = useAtom(isAnalyticsRefreshingAtom);
19+
const isRefreshing = useAtomValue(isAnalyticsRefreshingAtom);
2120
const [selectedFilters] = useAtom(dynamicQueryFiltersAtom);
2221
const [, addFilterAction] = useAtom(addDynamicFilterAtom);
2322

2423
const { dateRange } = useDateFilters();
25-
const { data: websiteData } = useWebsite(websiteId);
2624

2725
const addFilter = useCallback(
2826
(filter: DynamicQueryFilter) => {
@@ -39,8 +37,6 @@ export default function AudiencePage() {
3937
dateRange={dateRange}
4038
filters={selectedFilters}
4139
isRefreshing={isRefreshing}
42-
setIsRefreshing={setIsRefreshing}
43-
websiteData={websiteData}
4440
websiteId={websiteId}
4541
/>
4642
</ErrorBoundary>

apps/dashboard/app/(main)/websites/[id]/errors/_components/errors-page-content.tsx

Lines changed: 3 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22

33
import { GATED_FEATURES } from "@databuddy/shared/types/features";
44
import { BugIcon } from "@phosphor-icons/react";
5-
import { useAtom } from "jotai";
6-
import { use, useCallback, useEffect } from "react";
5+
import { useAtomValue } from "jotai";
6+
import { use } from "react";
77
import { FeatureGate } from "@/components/feature-gate";
88
import { Skeleton } from "@/components/ui/skeleton";
99
import { useDateFilters } from "@/hooks/use-date-filters";
@@ -32,34 +32,17 @@ export const ErrorsPageContent = ({ params }: ErrorsPageContentProps) => {
3232
const resolvedParams = use(params);
3333
const websiteId = resolvedParams.id;
3434

35-
const [isRefreshing, setIsRefreshing] = useAtom(isAnalyticsRefreshingAtom);
35+
const isRefreshing = useAtomValue(isAnalyticsRefreshingAtom);
3636
const { dateRange } = useDateFilters();
3737

3838
const {
3939
results: errorResults,
4040
isLoading,
41-
refetch,
4241
error,
4342
} = useEnhancedErrorData(websiteId, dateRange, {
4443
queryKey: ["enhancedErrorData", websiteId, dateRange],
4544
});
4645

47-
const handleRefresh = useCallback(async () => {
48-
if (isRefreshing) {
49-
try {
50-
await refetch();
51-
} finally {
52-
setIsRefreshing(false);
53-
}
54-
}
55-
}, [isRefreshing, refetch, setIsRefreshing]);
56-
57-
useEffect(() => {
58-
if (isRefreshing) {
59-
handleRefresh();
60-
}
61-
}, [isRefreshing, handleRefresh]);
62-
6346
const getData = <T,>(id: string): T[] =>
6447
(errorResults?.find((r) => r.queryId === id)?.data?.[id] as T[]) || [];
6548

apps/dashboard/app/(main)/websites/[id]/funnels/page.tsx

Lines changed: 3 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22

33
import { GATED_FEATURES } from "@databuddy/shared/types/features";
44
import { FunnelIcon, TrendDownIcon } from "@phosphor-icons/react";
5-
import { useAtom } from "jotai";
5+
import { useAtomValue } from "jotai";
66
import dynamic from "next/dynamic";
77
import { useParams } from "next/navigation";
8-
import { useCallback, useMemo, useState } from "react";
8+
import { useMemo, useState } from "react";
99
import { FeatureGate } from "@/components/feature-gate";
1010
import { Card, CardContent } from "@/components/ui/card";
1111
import { DeleteDialog } from "@/components/ui/delete-dialog";
@@ -18,7 +18,6 @@ import {
1818
useFunnelPerformance,
1919
useFunnels,
2020
} from "@/hooks/use-funnels";
21-
import { useTrackingSetup } from "@/hooks/use-tracking-setup";
2221
import { isAnalyticsRefreshingAtom } from "@/stores/jotai/filterAtoms";
2322
import type { FunnelAnalyticsData } from "@/types/funnels";
2423
import { WebsitePageHeader } from "../_components/website-page-header";
@@ -30,7 +29,6 @@ import {
3029
FunnelsList,
3130
} from "./_components";
3231

33-
// Only dialogs are lazy loaded since they're conditionally rendered
3432
const EditFunnelDialog = dynamic(
3533
() =>
3634
import("./_components/edit-funnel-dialog").then((m) => ({
@@ -52,7 +50,7 @@ function FunnelsListSkeleton() {
5250
export default function FunnelsPage() {
5351
const { id } = useParams();
5452
const websiteId = id as string;
55-
const [isRefreshing, setIsRefreshing] = useAtom(isAnalyticsRefreshingAtom);
53+
const isRefreshing = useAtomValue(isAnalyticsRefreshingAtom);
5654
const [expandedFunnelId, setExpandedFunnelId] = useState<string | null>(null);
5755
const [selectedReferrer, setSelectedReferrer] = useState("all");
5856
const [isDialogOpen, setIsDialogOpen] = useState(false);
@@ -61,26 +59,22 @@ export default function FunnelsPage() {
6159
);
6260
const [deletingFunnelId, setDeletingFunnelId] = useState<string | null>(null);
6361

64-
const { refetchTrackingSetup } = useTrackingSetup(websiteId);
6562
const { formattedDateRangeState, dateRange } = useDateFilters();
6663

6764
const {
6865
data: funnels,
6966
isLoading: funnelsLoading,
7067
error: funnelsError,
71-
refetch: refetchFunnels,
7268
createFunnel,
7369
updateFunnel,
7470
deleteFunnel,
7571
isCreating,
7672
isUpdating,
7773
} = useFunnels(websiteId);
7874

79-
// Preload analytics for all funnels
8075
const { data: performanceData, isLoading: performanceLoading } =
8176
useFunnelPerformance(websiteId, dateRange, !!funnels && funnels.length > 0);
8277

83-
// Detailed analytics for expanded funnel
8478
const {
8579
data: analyticsData,
8680
isLoading: analyticsLoading,
@@ -94,7 +88,6 @@ export default function FunnelsPage() {
9488
data: referrerAnalyticsData,
9589
isLoading: referrerAnalyticsLoading,
9690
error: referrerAnalyticsError,
97-
refetch: refetchReferrerAnalytics,
9891
} = useFunnelAnalyticsByReferrer(
9992
websiteId,
10093
expandedFunnelId ?? "",
@@ -107,7 +100,6 @@ export default function FunnelsPage() {
107100

108101
const autocompleteQuery = useAutocompleteData(websiteId);
109102

110-
// Analytics map from preloaded data
111103
const analyticsMap = useMemo(() => {
112104
const map = new Map<string, FunnelAnalyticsData | null>();
113105

@@ -119,15 +111,13 @@ export default function FunnelsPage() {
119111
}
120112
}
121113

122-
// Override with detailed data for expanded funnel
123114
if (expandedFunnelId && analyticsData) {
124115
map.set(expandedFunnelId, analyticsData);
125116
}
126117

127118
return map;
128119
}, [performanceData, expandedFunnelId, analyticsData]);
129120

130-
// Loading states
131121
const loadingAnalyticsIds = useMemo(() => {
132122
const set = new Set<string>();
133123
if (performanceLoading && funnels) {
@@ -141,33 +131,6 @@ export default function FunnelsPage() {
141131
return set;
142132
}, [performanceLoading, funnels, expandedFunnelId, analyticsLoading]);
143133

144-
const handleRefresh = useCallback(async () => {
145-
setIsRefreshing(true);
146-
try {
147-
const promises: Promise<unknown>[] = [
148-
refetchFunnels(),
149-
autocompleteQuery.refetch(),
150-
refetchTrackingSetup(),
151-
];
152-
if (expandedFunnelId) {
153-
promises.push(refetchAnalytics(), refetchReferrerAnalytics());
154-
}
155-
await Promise.all(promises);
156-
} catch (error) {
157-
console.error("Failed to refresh funnel data:", error);
158-
} finally {
159-
setIsRefreshing(false);
160-
}
161-
}, [
162-
refetchFunnels,
163-
refetchAnalytics,
164-
refetchReferrerAnalytics,
165-
autocompleteQuery.refetch,
166-
refetchTrackingSetup,
167-
expandedFunnelId,
168-
setIsRefreshing,
169-
]);
170-
171134
const handleCreateFunnel = async (data: CreateFunnelData) => {
172135
try {
173136
await createFunnel(data);
@@ -262,7 +225,6 @@ export default function FunnelsPage() {
262225
setEditingFunnel(null);
263226
setIsDialogOpen(true);
264227
}}
265-
onRefreshAction={handleRefresh}
266228
subtitle={
267229
funnelsLoading
268230
? undefined

apps/dashboard/app/(main)/websites/[id]/goals/page.tsx

Lines changed: 5 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22

33
import { GATED_FEATURES } from "@databuddy/shared/types/features";
44
import { TargetIcon, TrendDownIcon } from "@phosphor-icons/react";
5-
import { useAtom } from "jotai";
5+
import { useAtomValue } from "jotai";
66
import { useParams } from "next/navigation";
7-
import { useCallback, useMemo, useState } from "react";
7+
import { useMemo, useState } from "react";
88
import { FeatureGate } from "@/components/feature-gate";
99
import { Card, CardContent } from "@/components/ui/card";
1010
import { DeleteDialog } from "@/components/ui/delete-dialog";
@@ -35,7 +35,7 @@ function GoalsListSkeleton() {
3535
export default function GoalsPage() {
3636
const { id } = useParams();
3737
const websiteId = id as string;
38-
const [isRefreshing, setIsRefreshing] = useAtom(isAnalyticsRefreshingAtom);
38+
const isRefreshing = useAtomValue(isAnalyticsRefreshingAtom);
3939
const [isDialogOpen, setIsDialogOpen] = useState(false);
4040
const [editingGoal, setEditingGoal] = useState<Goal | null>(null);
4141
const [deletingGoalId, setDeletingGoalId] = useState<string | null>(null);
@@ -46,7 +46,6 @@ export default function GoalsPage() {
4646
data: goals,
4747
isLoading: goalsLoading,
4848
error: goalsError,
49-
refetch: refetchGoals,
5049
createGoal,
5150
updateGoal,
5251
deleteGoal,
@@ -56,34 +55,11 @@ export default function GoalsPage() {
5655

5756
const goalIds = useMemo(() => goals.map((goal) => goal.id), [goals]);
5857

59-
const {
60-
data: goalAnalytics,
61-
isLoading: analyticsLoading,
62-
refetch: refetchAnalytics,
63-
} = useBulkGoalAnalytics(websiteId, goalIds, dateRange);
58+
const { data: goalAnalytics, isLoading: analyticsLoading } =
59+
useBulkGoalAnalytics(websiteId, goalIds, dateRange);
6460

6561
const autocompleteQuery = useAutocompleteData(websiteId);
6662

67-
const handleRefresh = useCallback(async () => {
68-
setIsRefreshing(true);
69-
try {
70-
await Promise.all([refetchGoals(), autocompleteQuery.refetch()]);
71-
if (goalIds.length > 0) {
72-
refetchAnalytics();
73-
}
74-
} catch (error) {
75-
console.error("Failed to refresh goal data:", error);
76-
} finally {
77-
setIsRefreshing(false);
78-
}
79-
}, [
80-
refetchGoals,
81-
refetchAnalytics,
82-
goalIds.length,
83-
autocompleteQuery.refetch,
84-
setIsRefreshing,
85-
]);
86-
8763
const handleSaveGoal = async (
8864
data: Goal | Omit<CreateGoalData, "websiteId">
8965
) => {
@@ -175,7 +151,6 @@ export default function GoalsPage() {
175151
setEditingGoal(null);
176152
setIsDialogOpen(true);
177153
}}
178-
onRefreshAction={handleRefresh}
179154
subtitle={
180155
goalsLoading
181156
? undefined

0 commit comments

Comments
 (0)