import { useState, useMemo, useEffect } from "react"; import { ActionIcon, Button, Group, NumberInput, Popover, Select, Space, Text, Tooltip, } from "@mantine/core"; import { Helmet } from "react-helmet-async"; import { useTranslation } from "react-i18next"; import { IconSettings } from "@tabler/icons-react"; import SettingsTitle from "@/components/settings/settings-title"; import { getAppName } from "@/lib/config"; import Paginate from "@/components/common/paginate"; import { useCursorPaginate } from "@/hooks/use-cursor-paginate"; import { useAuditLogsQuery, useAuditRetentionQuery, useUpdateAuditRetentionMutation, } from "@/ee/audit/queries/audit-query"; import { IAuditLogParams } from "@/ee/audit/types/audit.types"; import { eventFilterOptions } from "@/ee/audit/lib/audit-event-labels"; import AuditLogsTable from "@/ee/audit/components/audit-logs-table"; import useUserRole from "@/hooks/use-user-role"; type RetentionUnit = "days" | "months" | "years"; function daysToRetention(days: number): { amount: number; unit: RetentionUnit } { if (days >= 365 && days % 365 === 0) { return { amount: days / 365, unit: "years" }; } if (days >= 30 && days % 30 === 0) { return { amount: days / 30, unit: "months" }; } return { amount: days, unit: "days" }; } function retentionToDays(amount: number, unit: RetentionUnit): number { if (unit === "years") return amount * 365; if (unit === "months") return amount * 30; return amount; } export default function AuditLogs() { const { t } = useTranslation(); const { isOwner } = useUserRole(); const { cursor, goNext, goPrev, resetCursor } = useCursorPaginate(); const [eventFilter, setEventFilter] = useState(null); const [settingsOpen, setSettingsOpen] = useState(false); const { data: retentionData } = useAuditRetentionQuery(); const updateRetention = useUpdateAuditRetentionMutation(); const currentDays = retentionData?.retentionDays ?? 365; const parsed = daysToRetention(currentDays); const [retentionAmount, setRetentionAmount] = useState(parsed.amount); const [retentionUnit, setRetentionUnit] = useState(parsed.unit); useEffect(() => { if (retentionData) { const { amount, unit } = daysToRetention(retentionData.retentionDays); setRetentionAmount(amount); setRetentionUnit(unit); } }, [retentionData?.retentionDays]); const resetRetentionForm = () => { const { amount, unit } = daysToRetention(currentDays); setRetentionAmount(amount); setRetentionUnit(unit); }; const params: IAuditLogParams = useMemo( () => ({ cursor, limit: 50, event: eventFilter ?? undefined, }), [cursor, eventFilter], ); const { data, isLoading } = useAuditLogsQuery(params); if (!isOwner) { return null; } const handleEventChange = (value: string | null) => { setEventFilter(value); resetCursor(); }; return ( <> {t("Audit log")} - {getAppName()} { if (value === "days" || value === "months" || value === "years") { setRetentionUnit(value); } }} size="sm" style={{ flex: 1 }} comboboxProps={{ withinPortal: false }} /> {data?.items && data.items.length > 0 && ( goNext(data?.meta?.nextCursor)} onPrev={goPrev} /> )} ); }