diff --git a/src/components/HelpDialog.tsx b/src/components/HelpDialog.tsx index 9bc07af..70f8df9 100644 --- a/src/components/HelpDialog.tsx +++ b/src/components/HelpDialog.tsx @@ -26,6 +26,7 @@ import { showError } from "@/lib/toast"; import { HelpBotDialog } from "./HelpBotDialog"; import { useSettings } from "@/hooks/useSettings"; import { BugScreenshotDialog } from "./BugScreenshotDialog"; +import { useUserBudgetInfo } from "@/hooks/useUserBudgetInfo"; interface HelpDialogProps { isOpen: boolean; @@ -43,7 +44,7 @@ export function HelpDialog({ isOpen, onClose }: HelpDialogProps) { const [isBugScreenshotOpen, setIsBugScreenshotOpen] = useState(false); const selectedChatId = useAtomValue(selectedChatIdAtom); const { settings } = useSettings(); - + const { userBudget } = useUserBudgetInfo(); const isDyadProUser = settings?.providerSettings?.["auto"]?.apiKey?.value; // Function to reset all dialog state @@ -103,6 +104,7 @@ Issues that do not meet these requirements will be closed and may need to be res - Node Version: ${debugInfo.nodeVersion || "n/a"} - PNPM Version: ${debugInfo.pnpmVersion || "n/a"} - Node Path: ${debugInfo.nodePath || "n/a"} +- Pro User ID: ${userBudget?.redactedUserId || "n/a"} - Telemetry ID: ${debugInfo.telemetryId || "n/a"} - Model: ${debugInfo.selectedLanguageModel || "n/a"} @@ -226,6 +228,7 @@ Issues that do not meet these requirements will be closed and may need to be res --> Session ID: ${sessionId} +Pro User ID: ${userBudget?.redactedUserId || "n/a"} ## Issue Description (required) diff --git a/src/ipc/handlers/pro_handlers.ts b/src/ipc/handlers/pro_handlers.ts index d67f696..6219f48 100644 --- a/src/ipc/handlers/pro_handlers.ts +++ b/src/ipc/handlers/pro_handlers.ts @@ -22,6 +22,7 @@ export function registerProHandlers() { usedCredits: 100, totalCredits: 1000, budgetResetDate: resetDate, + redactedUserId: "", }; } logger.info("Attempting to fetch user budget information."); @@ -58,11 +59,18 @@ export function registerProHandlers() { const data = await response.json(); const userInfoData = data["user_info"]; + const userId = userInfoData["user_id"]; + // Turn user_abc1234 => "****1234" + // Preserve the last 4 characters so we can correlate bug reports + // with the user. + const redactedUserId = + userId.length > 8 ? "****" + userId.slice(-4) : ""; logger.info("Successfully fetched user budget information."); return UserBudgetInfoSchema.parse({ usedCredits: userInfoData["spend"] * CONVERSION_RATIO, totalCredits: userInfoData["max_budget"] * CONVERSION_RATIO, budgetResetDate: new Date(userInfoData["budget_reset_at"]), + redactedUserId: redactedUserId, }); } catch (error: any) { logger.error(`Error fetching user budget: ${error.message}`, error); diff --git a/src/ipc/ipc_types.ts b/src/ipc/ipc_types.ts index add5210..08a4ae0 100644 --- a/src/ipc/ipc_types.ts +++ b/src/ipc/ipc_types.ts @@ -278,6 +278,7 @@ export const UserBudgetInfoSchema = z.object({ usedCredits: z.number(), totalCredits: z.number(), budgetResetDate: z.date(), + redactedUserId: z.string(), }); export type UserBudgetInfo = z.infer;