lib(renderer): add safeJson helper; migrate 6 JSON.parse try/catch call sites

This commit is contained in:
ZacharyZhang-NY committed 2026-04-16 22:54:20 -04:00
1 parent a07b42e493
commit be0ff5a041
8 files changed
+46 -48

No files matched your search

@@ -1,6 +1,7 @@
import { Clock, Link as LinkIcon } from "@phosphor-icons/react"
import { platformConfig } from "../social/social-config"
import type { SocialPlatform } from "@shared/types"
import { safeJson } from "../../lib/safe-json"
const PLATFORM_CHAR_LIMITS: Record<string, number> = {
twitter: 280,
@@ -26,19 +27,16 @@ interface DraftPayload {
}
function parseDraft(payloadJson: string): DraftPayload | null {
try {
const parsed = JSON.parse(payloadJson)
if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
return {
content: typeof parsed.content === "string" ? parsed.content : "",
mediaUrls: Array.isArray(parsed.mediaUrls) ? parsed.mediaUrls : [],
scheduledAt: typeof parsed.scheduledAt === "string" ? parsed.scheduledAt : null,
socialAccountId: typeof parsed.socialAccountId === "string" ? parsed.socialAccountId : "",
platform: typeof parsed.platform === "string" ? parsed.platform : "other",
}
}
} catch { /* invalid JSON */ }
return null
const parsed = safeJson<unknown>(payloadJson, null)
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) return null
const obj = parsed as Record<string, unknown>
return {
content: typeof obj.content === "string" ? obj.content : "",
mediaUrls: Array.isArray(obj.mediaUrls) ? (obj.mediaUrls as string[]) : [],
scheduledAt: typeof obj.scheduledAt === "string" ? obj.scheduledAt : null,
socialAccountId: typeof obj.socialAccountId === "string" ? obj.socialAccountId : "",
platform: typeof obj.platform === "string" ? obj.platform : "other",
}
}
function formatScheduledDate(isoDate: string): string {
@@ -1,18 +1,15 @@
import { useMemo } from "react"
import type { ApprovalRecord } from "@shared/types"
import { safeJson } from "../../../lib/safe-json"
export function useApprovalPayload(approval: ApprovalRecord): Record<string, unknown> | null {
return useMemo(() => {
if (!approval.payloadJson) return null
try {
const parsed = JSON.parse(approval.payloadJson)
if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
return parsed as Record<string, unknown>
}
return null
} catch {
return null
const parsed = safeJson<unknown>(approval.payloadJson, null)
if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
return parsed as Record<string, unknown>
}
return null
}, [approval.payloadJson])
}
@@ -2,6 +2,7 @@ import type { ApprovalRecord } from "@shared/types"
import {
Robot, CheckSquare, Play, ShieldCheck, Gear, FolderOpen, Key, Target, Briefcase, Buildings,
} from "@phosphor-icons/react"
import { safeJson } from "../../lib/safe-json"
export function describeActionError(error: unknown) {
return error instanceof Error ? error.message : "The action could not be completed."
@@ -9,10 +10,8 @@ export function describeActionError(error: unknown) {
export function parseApprovalPayloadJson(approval: ApprovalRecord): Record<string, unknown> | null {
if (!approval.payloadJson) return null
try {
const parsed = JSON.parse(approval.payloadJson)
if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) return parsed as Record<string, unknown>
} catch { return null }
const parsed = safeJson<unknown>(approval.payloadJson, null)
if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) return parsed as Record<string, unknown>
return null
}