2024-02-22 15:36:14 +01:00
|
|
|
import { locale } from '$lib/stores/preferences.store';
|
2024-03-05 16:43:24 +01:00
|
|
|
import type { AssetResponseDto } from '@immich/sdk';
|
|
|
|
import { groupBy, sortBy } from 'lodash-es';
|
2024-07-29 16:42:55 +02:00
|
|
|
import { DateTime } from 'luxon';
|
2024-02-22 15:36:14 +01:00
|
|
|
import { get } from 'svelte/store';
|
2023-07-12 05:12:19 +03:00
|
|
|
|
2024-02-22 15:36:14 +01:00
|
|
|
export const fromLocalDateTime = (localDateTime: string) =>
|
|
|
|
DateTime.fromISO(localDateTime, { zone: 'UTC', locale: get(locale) });
|
2023-10-06 08:12:09 -04:00
|
|
|
|
2023-07-12 05:12:19 +03:00
|
|
|
export const groupDateFormat: Intl.DateTimeFormatOptions = {
|
|
|
|
weekday: 'short',
|
|
|
|
month: 'short',
|
|
|
|
day: 'numeric',
|
|
|
|
year: 'numeric',
|
|
|
|
};
|
|
|
|
|
2024-07-29 16:42:55 +02:00
|
|
|
export function formatGroupTitle(_date: DateTime): string {
|
|
|
|
if (!_date.isValid) {
|
|
|
|
return _date.toString();
|
|
|
|
}
|
|
|
|
const date = _date as DateTime<true>;
|
2023-07-12 05:12:19 +03:00
|
|
|
const today = DateTime.now().startOf('day');
|
|
|
|
|
|
|
|
// Today
|
|
|
|
if (today.hasSame(date, 'day')) {
|
2024-07-29 16:42:55 +02:00
|
|
|
return date.toRelativeCalendar();
|
2023-07-12 05:12:19 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
// Yesterday
|
2024-07-29 16:42:55 +02:00
|
|
|
if (today.minus({ days: 1 }).hasSame(date, 'day')) {
|
|
|
|
return date.toRelativeCalendar();
|
2023-07-12 05:12:19 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
// Last week
|
2024-08-01 13:39:26 +02:00
|
|
|
if (date >= today.minus({ days: 6 }) && date < today) {
|
2023-07-12 05:12:19 +03:00
|
|
|
return date.toLocaleString({ weekday: 'long' });
|
|
|
|
}
|
|
|
|
|
|
|
|
// This year
|
|
|
|
if (today.hasSame(date, 'year')) {
|
|
|
|
return date.toLocaleString({
|
|
|
|
weekday: 'short',
|
|
|
|
month: 'short',
|
|
|
|
day: 'numeric',
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
return date.toLocaleString(groupDateFormat);
|
|
|
|
}
|
|
|
|
|
2024-03-05 16:43:24 +01:00
|
|
|
export function splitBucketIntoDateGroups(
|
|
|
|
assets: AssetResponseDto[],
|
|
|
|
locale: string | undefined,
|
|
|
|
): AssetResponseDto[][] {
|
|
|
|
const grouped = groupBy(assets, (asset) =>
|
|
|
|
fromLocalDateTime(asset.localDateTime).toLocaleString(groupDateFormat, { locale }),
|
|
|
|
);
|
|
|
|
return sortBy(grouped, (group) => assets.indexOf(group[0]));
|
|
|
|
}
|
|
|
|
|
2024-02-17 11:00:55 -06:00
|
|
|
export type LayoutBox = {
|
|
|
|
top: number;
|
|
|
|
left: number;
|
|
|
|
width: number;
|
|
|
|
};
|
|
|
|
|
|
|
|
export function calculateWidth(boxes: LayoutBox[]): number {
|
|
|
|
let width = 0;
|
|
|
|
for (const box of boxes) {
|
|
|
|
if (box.top < 100) {
|
|
|
|
width = box.left + box.width;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return width;
|
|
|
|
}
|