Skip to content

Commit 09bd655

Browse files
committed
feat: enhance consent management and server configuration updates
- Updated consent handling in the ConsentDialog and SettingsSectionContent components to use new state management methods. - Refactored the consent store to include agreeToTerms, declineTerms, and toggleTelemetry functions for better clarity and functionality. - Modified incrementDownloads and updateServerStats functions to include client and server names based on user consent. - Improved user experience by managing dialog visibility based on consent status.
1 parent 14cd41c commit 09bd655

File tree

5 files changed

+63
-30
lines changed

5 files changed

+63
-30
lines changed

src/components/server/hooks/useSaveServerConfig.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ export function useSaveServerConfig() {
3535
} catch (e) {
3636
// already have
3737
}
38-
incrementDownloads(currentServer.id);
38+
incrementDownloads(currentServer.id, selectedClient, selectedServer);
3939
console.log("add server", new Date(), server);
4040
} catch (error) {
4141
console.error(error);

src/components/settings/SettingsSectionContent.tsx

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,12 @@ const SettingsSectionContent: React.FC<SettingsSectionContentProps> = ({
2222
}) => {
2323
// Use zustand store for privacy state
2424
const telemetryEnabled = useConsentStore((state) => state.telemetryEnabled);
25-
const setTelemetryEnabled = useConsentStore(
26-
(state) => state.setTelemetryEnabled,
25+
const toggleTelemetry = useConsentStore(
26+
(state) => state.toggleTelemetry,
2727
);
28+
const hasAgreedToTerms = useConsentStore((state) => state.hasAgreedToTerms);
29+
const agreeToTerms = useConsentStore((state) => state.agreeToTerms);
30+
const declineTerms = useConsentStore((state) => state.declineTerms);
2831

2932
if (selectedSection === "encryption") {
3033
return (
@@ -50,7 +53,14 @@ const SettingsSectionContent: React.FC<SettingsSectionContentProps> = ({
5053
<span>Allow anonymous usage data</span>
5154
<Switch
5255
checked={telemetryEnabled}
53-
onCheckedChange={setTelemetryEnabled}
56+
onCheckedChange={toggleTelemetry}
57+
/>
58+
</div>
59+
<div className="flex items-center space-x-4">
60+
<span>I agree to terms</span>
61+
<Switch
62+
checked={hasAgreedToTerms}
63+
onCheckedChange={(val) => (val ? agreeToTerms() : declineTerms())}
5464
/>
5565
</div>
5666
</div>

src/components/settings/consent.tsx

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,25 +6,33 @@ import {
66
DialogTitle,
77
} from "@/components/ui/dialog";
88
import { useConsentStore } from "@/stores/consentStore";
9+
import { useEffect, useState } from "react";
910

1011
export function ConsentDialog() {
1112
const hasAgreed = useConsentStore((state) => state.hasAgreedToTerms);
12-
const setHasAgreed = useConsentStore((state) => state.setHasAgreedToTerms);
13-
const setTelemetryEnabled = useConsentStore(
14-
(state) => state.setTelemetryEnabled,
15-
);
13+
const agreeToTerms = useConsentStore((state) => state.agreeToTerms);
14+
const declineTerms = useConsentStore((state) => state.declineTerms);
15+
16+
const [open, setOpen] = useState(false);
17+
18+
useEffect(() => {
19+
if (!hasAgreed) {
20+
setOpen(true);
21+
}
22+
}, [hasAgreed]);
1623

1724
const handleAgree = () => {
18-
setHasAgreed(true); // This will also enable telemetry
25+
agreeToTerms();
26+
setOpen(false);
1927
};
2028

2129
const handleDecline = () => {
22-
setHasAgreed(true); // Mark as seen so dialog won't show again
23-
setTelemetryEnabled(false); // Disable telemetry explicitly
30+
declineTerms();
31+
setOpen(false);
2432
};
2533

2634
return (
27-
<Dialog open={!hasAgreed}>
35+
<Dialog open={open} onOpenChange={setOpen}>
2836
<DialogContent>
2937
<DialogTitle>Terms and Conditions</DialogTitle>
3038
<div>
@@ -45,4 +53,4 @@ export function ConsentDialog() {
4553
</DialogContent>
4654
</Dialog>
4755
);
48-
}
56+
}

src/lib/api/servers.ts

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { api } from "@/lib/api";
2+
import { useConsentStore } from "@/stores/consentStore";
23
import { toast } from "sonner";
34

45
function buildQueryParams(
@@ -64,15 +65,23 @@ export async function fetchServers(
6465
}
6566
}
6667

67-
export async function updateServerStats(path: string, serverId: string) {
68+
export async function updateServerStats(path: string, serverId: string, clientName: string, serverName: string) {
69+
const { hasAgreedToTerms } = useConsentStore.getState();
70+
const payload = {
71+
client_name: hasAgreedToTerms ? clientName : "",
72+
server_name: hasAgreedToTerms ? serverName : "",
73+
};
74+
75+
console.log("hasAgreedToTerms", hasAgreedToTerms, payload);
76+
6877
try {
69-
const response = await api.post(`/servers/${serverId}${path}`);
78+
const response = await api.post(`/servers/${serverId}${path}`, payload);
7079
console.log("Stats updated:", response.data);
7180
} catch (error) {
7281
console.error("Error updating server stats:", error);
7382
}
7483
}
7584

76-
export async function incrementDownloads(serverId: string) {
77-
await updateServerStats("/download-count", serverId);
85+
export async function incrementDownloads(serverId: string, clientName: string, serverName: string) {
86+
await updateServerStats("/download-count", serverId, clientName, serverName);
7887
}

src/stores/consentStore.ts

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,25 +4,31 @@ import { persist } from "zustand/middleware";
44
interface ConsentStore {
55
hasAgreedToTerms: boolean;
66
telemetryEnabled: boolean;
7-
setHasAgreedToTerms: (val: boolean) => void;
8-
setTelemetryEnabled: (val: boolean) => void;
9-
setConsentDeclined: () => void;
7+
agreeToTerms: () => void;
8+
declineTerms: () => void;
9+
toggleTelemetry: (val: boolean) => void;
1010
}
1111

1212
export const useConsentStore = create<ConsentStore>()(
1313
persist(
14-
(set) => ({
14+
(set, get) => ({
1515
hasAgreedToTerms: false,
1616
telemetryEnabled: false,
17-
setHasAgreedToTerms: (val) => set({
18-
hasAgreedToTerms: val,
19-
telemetryEnabled: val ? true : false, // Enable telemetry only if agreed
20-
}),
21-
setTelemetryEnabled: (val) => set({ telemetryEnabled: val }),
22-
setConsentDeclined: () => set({
23-
hasAgreedToTerms: true,
24-
telemetryEnabled: false,
25-
}),
17+
agreeToTerms: () =>
18+
set({
19+
hasAgreedToTerms: true,
20+
telemetryEnabled: true,
21+
}),
22+
declineTerms: () =>
23+
set({
24+
hasAgreedToTerms: false,
25+
telemetryEnabled: false,
26+
}),
27+
toggleTelemetry: (val: boolean) => {
28+
if (get().hasAgreedToTerms) {
29+
set({ telemetryEnabled: val });
30+
}
31+
},
2632
}),
2733
{
2834
name: "consent-storage", // unique name for localStorage

0 commit comments

Comments
 (0)