import { Text } from "@/components/common/Text"; import {LogLevel, useLog} from "@/utils/log"; import { useTranslation } from "react-i18next"; import {ScrollView, TouchableOpacity, View} from "react-native"; import Collapsible from "react-native-collapsible"; import React, {useMemo, useState} from "react"; import {FilterButton} from "@/components/filters/FilterButton"; export default function page() { const { logs } = useLog(); const { t } = useTranslation(); const defaultLevels: LogLevel[] = ["INFO", "ERROR", "DEBUG", "WARN"] const codeBlockStyle = { backgroundColor: '#000', padding: 10, fontFamily: 'monospace', maxHeight: 300 } const [state, setState] = useState>({}) const [order, setOrder] = useState<"asc" | "desc">("desc"); const [levels, setLevels] = useState(defaultLevels); const filteredLogs = useMemo( () => logs ?.filter(log => levels.includes(log.level)) // Already in asc order as they are recorded. just reverse for desc ?.[order === "desc" ? "reverse" : "concat"]?.(), [logs, order, levels] ) return ( <> ["asc", "desc"]} set={(values) => setOrder(values[0])} values={[order]} title={t("library.filters.sort_order")} renderItemLabel={(order) => t(`library.filters.${order}`)} showSearch={false} /> defaultLevels} set={setLevels} values={levels} title={t("home.settings.logs.level")} renderItemLabel={(level) => level} showSearch={false} multiple={true} /> {filteredLogs?.map((log, index) => ( setState((v) => ({...v, [log.timestamp]: !v[log.timestamp]}))} > {log.level} {new Date(log.timestamp).toLocaleString()} {log.message} {log.data && ( <> {t("home.settings.logs.click_for_more_info")} {JSON.stringify(log.data, null, 2)} )} ))} {filteredLogs?.length === 0 && ( {t("home.settings.logs.no_logs_available")} )} ); }