mirror of
https://github.com/blakeblackshear/frigate.git
synced 2026-05-05 04:57:42 +03:00
fix timeline
This commit is contained in:
parent
5606f09e44
commit
e1935ae087
@ -1,6 +1,7 @@
|
|||||||
|
import { useFormattedTimestamp } from "@/hooks/use-date-utils";
|
||||||
import { FrigateConfig } from "@/types/frigateConfig";
|
import { FrigateConfig } from "@/types/frigateConfig";
|
||||||
import { formatUnixTimestampToDateTime } from "@/utils/dateUtil";
|
|
||||||
import { useMemo } from "react";
|
import { useMemo } from "react";
|
||||||
|
import { useTranslation } from "react-i18next";
|
||||||
import useSWR from "swr";
|
import useSWR from "swr";
|
||||||
|
|
||||||
type MinimapSegmentProps = {
|
type MinimapSegmentProps = {
|
||||||
@ -34,6 +35,24 @@ export function MinimapBounds({
|
|||||||
dense,
|
dense,
|
||||||
}: MinimapSegmentProps) {
|
}: MinimapSegmentProps) {
|
||||||
const { data: config } = useSWR<FrigateConfig>("config");
|
const { data: config } = useSWR<FrigateConfig>("config");
|
||||||
|
const { t } = useTranslation(["common"]);
|
||||||
|
const timeFormat = config?.ui.time_format === "24hour" ? "24hour" : "12hour";
|
||||||
|
|
||||||
|
const formatKey = dense
|
||||||
|
? `time.formattedTimestampHourMinute.${timeFormat}`
|
||||||
|
: `time.formattedTimestampMonthDayHourMinute.${timeFormat}`;
|
||||||
|
|
||||||
|
const formattedStartTime = useFormattedTimestamp(
|
||||||
|
alignedMinimapStartTime,
|
||||||
|
t(formatKey),
|
||||||
|
config?.ui.timezone,
|
||||||
|
);
|
||||||
|
|
||||||
|
const formattedEndTime = useFormattedTimestamp(
|
||||||
|
alignedMinimapEndTime,
|
||||||
|
t(formatKey),
|
||||||
|
config?.ui.timezone,
|
||||||
|
);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
@ -42,23 +61,13 @@ export function MinimapBounds({
|
|||||||
className="pointer-events-none absolute inset-0 -bottom-7 z-20 flex w-full select-none scroll-mt-8 items-center justify-center text-center text-[10px] font-medium text-primary"
|
className="pointer-events-none absolute inset-0 -bottom-7 z-20 flex w-full select-none scroll-mt-8 items-center justify-center text-center text-[10px] font-medium text-primary"
|
||||||
ref={firstMinimapSegmentRef}
|
ref={firstMinimapSegmentRef}
|
||||||
>
|
>
|
||||||
{formatUnixTimestampToDateTime(alignedMinimapStartTime, {
|
{formattedStartTime}
|
||||||
timezone: config?.ui.timezone,
|
|
||||||
strftime_fmt: !dense
|
|
||||||
? `%b %d, ${config?.ui.time_format == "24hour" ? "%H:%M" : "%I:%M %p"}`
|
|
||||||
: `${config?.ui.time_format == "24hour" ? "%H:%M" : "%I:%M %p"}`,
|
|
||||||
})}
|
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
{isLastSegmentInMinimap && (
|
{isLastSegmentInMinimap && (
|
||||||
<div className="pointer-events-none absolute inset-0 -top-3 z-20 flex w-full select-none items-center justify-center text-center text-[10px] font-medium text-primary">
|
<div className="pointer-events-none absolute inset-0 -top-3 z-20 flex w-full select-none items-center justify-center text-center text-[10px] font-medium text-primary">
|
||||||
{formatUnixTimestampToDateTime(alignedMinimapEndTime, {
|
{formattedEndTime}
|
||||||
timezone: config?.ui.timezone,
|
|
||||||
strftime_fmt: !dense
|
|
||||||
? `%b %d, ${config?.ui.time_format == "24hour" ? "%H:%M" : "%I:%M %p"}`
|
|
||||||
: `${config?.ui.time_format == "24hour" ? "%H:%M" : "%I:%M %p"}`,
|
|
||||||
})}
|
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
</>
|
</>
|
||||||
@ -92,27 +101,28 @@ export function Timestamp({
|
|||||||
timestampSpread,
|
timestampSpread,
|
||||||
segmentKey,
|
segmentKey,
|
||||||
}: TimestampSegmentProps) {
|
}: TimestampSegmentProps) {
|
||||||
|
const { t } = useTranslation(["common"]);
|
||||||
const { data: config } = useSWR<FrigateConfig>("config");
|
const { data: config } = useSWR<FrigateConfig>("config");
|
||||||
|
|
||||||
const formattedTimestamp = useMemo(() => {
|
const timeFormat = config?.ui.time_format === "24hour" ? "24hour" : "12hour";
|
||||||
if (
|
const format = t(`time.formattedTimestampHourMinute.${timeFormat}`);
|
||||||
!(
|
|
||||||
|
const formattedTimestamp = useFormattedTimestamp(
|
||||||
|
timestamp.getTime() / 1000,
|
||||||
|
format,
|
||||||
|
config?.ui.timezone,
|
||||||
|
);
|
||||||
|
|
||||||
|
const shouldDisplay = useMemo(() => {
|
||||||
|
return (
|
||||||
timestamp.getMinutes() % timestampSpread === 0 &&
|
timestamp.getMinutes() % timestampSpread === 0 &&
|
||||||
timestamp.getSeconds() === 0
|
timestamp.getSeconds() === 0
|
||||||
)
|
);
|
||||||
) {
|
}, [timestamp, timestampSpread]);
|
||||||
return undefined;
|
|
||||||
}
|
|
||||||
|
|
||||||
return formatUnixTimestampToDateTime(timestamp.getTime() / 1000, {
|
|
||||||
timezone: config?.ui.timezone,
|
|
||||||
strftime_fmt: config?.ui.time_format == "24hour" ? "%H:%M" : "%I:%M %p",
|
|
||||||
});
|
|
||||||
}, [config, timestamp, timestampSpread]);
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="absolute left-[15px] z-10 h-[8px]">
|
<div className="absolute left-[15px] z-10 h-[8px]">
|
||||||
{!isFirstSegmentInMinimap && !isLastSegmentInMinimap && (
|
{!isFirstSegmentInMinimap && !isLastSegmentInMinimap && shouldDisplay && (
|
||||||
<div
|
<div
|
||||||
key={`${segmentKey}_timestamp`}
|
key={`${segmentKey}_timestamp`}
|
||||||
className="pointer-events-none select-none text-[8px] text-neutral_variant dark:text-neutral"
|
className="pointer-events-none select-none text-[8px] text-neutral_variant dark:text-neutral"
|
||||||
|
|||||||
@ -3,6 +3,8 @@ import { useTimelineUtils } from "./use-timeline-utils";
|
|||||||
import { FrigateConfig } from "@/types/frigateConfig";
|
import { FrigateConfig } from "@/types/frigateConfig";
|
||||||
import useSWR from "swr";
|
import useSWR from "swr";
|
||||||
import { formatUnixTimestampToDateTime } from "@/utils/dateUtil";
|
import { formatUnixTimestampToDateTime } from "@/utils/dateUtil";
|
||||||
|
import { useDateLocale } from "./use-date-locale";
|
||||||
|
import { useTranslation } from "react-i18next";
|
||||||
|
|
||||||
type DraggableElementProps = {
|
type DraggableElementProps = {
|
||||||
contentRef: React.RefObject<HTMLElement>;
|
contentRef: React.RefObject<HTMLElement>;
|
||||||
@ -162,17 +164,28 @@ function useDraggableElement({
|
|||||||
[segmentDuration, timelineStartAligned, segmentHeight],
|
[segmentDuration, timelineStartAligned, segmentHeight],
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const { t } = useTranslation(["common"]);
|
||||||
|
const locale = useDateLocale();
|
||||||
|
|
||||||
|
const timeFormat = config?.ui.time_format === "24hour" ? "24hour" : "12hour";
|
||||||
|
const format = useMemo(() => {
|
||||||
|
const formatKey = `time.${
|
||||||
|
segmentDuration < 60 && !dense
|
||||||
|
? "formattedTimestampHourMinuteSecond"
|
||||||
|
: "formattedTimestampHourMinute"
|
||||||
|
}.${timeFormat}`;
|
||||||
|
return t(formatKey);
|
||||||
|
}, [t, timeFormat, segmentDuration, dense]);
|
||||||
|
|
||||||
const getFormattedTimestamp = useCallback(
|
const getFormattedTimestamp = useCallback(
|
||||||
(segmentStartTime: number) => {
|
(segmentStartTime: number) => {
|
||||||
return formatUnixTimestampToDateTime(segmentStartTime, {
|
return formatUnixTimestampToDateTime(segmentStartTime, {
|
||||||
timezone: config?.ui.timezone,
|
timezone: config?.ui.timezone,
|
||||||
strftime_fmt:
|
date_format: format,
|
||||||
config?.ui.time_format == "24hour"
|
locale,
|
||||||
? `%H:%M${segmentDuration < 60 && !dense ? ":%S" : ""}`
|
|
||||||
: `%I:%M${segmentDuration < 60 && !dense ? ":%S" : ""} %p`,
|
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
[config, dense, segmentDuration],
|
[config?.ui.timezone, format, locale],
|
||||||
);
|
);
|
||||||
|
|
||||||
const updateDraggableElementPosition = useCallback(
|
const updateDraggableElementPosition = useCallback(
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user