sendou.ink/app/features/chat/chat-utils.ts
Kalle fef1ffc955
Design refresh + a bunch of stuff (#2864)
Co-authored-by: hfcRed <hfcred@gmx.net>
2026-03-19 17:51:42 +02:00

57 lines
1.5 KiB
TypeScript

import { differenceInDays } from "date-fns";
import type { ChatMessage } from "./chat-types";
const STAFF_EXTRA_DAYS = 7;
export function chatAccessible(args: {
isStaff: boolean;
expiresAfterDays: number;
comparedTo: Date;
}): boolean {
const extraDays = args.isStaff ? STAFF_EXTRA_DAYS : 0;
return (
differenceInDays(new Date(), args.comparedTo) <=
args.expiresAfterDays + extraDays
);
}
const DATE_PLACEHOLDER_PATTERN = /\{\{date:(\d+)\}\}/g;
export function datePlaceholder(date: Date): string {
return `{{date:${date.getTime()}}}`;
}
export function resolveDatePlaceholders(
text: string,
formatDateTime: (date: Date) => string,
): string {
return text.replace(DATE_PLACEHOLDER_PATTERN, (_match, ts) =>
formatDateTime(new Date(Number(ts))),
);
}
export function messageTypeToSound(type: ChatMessage["type"]) {
if (type === "LIKE_RECEIVED") return "sq_like";
if (type === "MATCH_STARTED") return "sq_match";
if (type === "NEW_GROUP") return "sq_new-group";
return null;
}
export function soundCodeToLocalStorageKey(soundCode: string) {
return `settings__sound-enabled__${soundCode}`;
}
export function soundEnabled(soundCode: string) {
const localStorageKey = soundCodeToLocalStorageKey(soundCode);
const soundEnabled = localStorage.getItem(localStorageKey);
return !soundEnabled || soundEnabled === "true";
}
export function soundVolume() {
const volume = localStorage.getItem("settings__sound-volume");
return volume ? Number.parseFloat(volume) : 100;
}