feat: create user image retrieval API endpoint feat: enhance coin page with dynamic data fetching and improved UI feat: implement coin creation form with validation and submission logic feat: add user settings page with profile update functionality
45 lines
No EOL
1.5 KiB
TypeScript
45 lines
No EOL
1.5 KiB
TypeScript
import { PUBLIC_B2_BUCKET, PUBLIC_B2_ENDPOINT } from "$env/static/public";
|
|
import { clsx, type ClassValue } from "clsx";
|
|
import { twMerge } from "tailwind-merge";
|
|
|
|
export function cn(...inputs: ClassValue[]) {
|
|
return twMerge(clsx(inputs));
|
|
}
|
|
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
export type WithoutChild<T> = T extends { child?: any } ? Omit<T, "child"> : T;
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
export type WithoutChildren<T> = T extends { children?: any } ? Omit<T, "children"> : T;
|
|
export type WithoutChildrenOrChild<T> = WithoutChildren<WithoutChild<T>>;
|
|
export type WithElementRef<T, U extends HTMLElement = HTMLElement> = T & { ref?: U | null };
|
|
|
|
export function getTimeBasedGreeting(name: string): string {
|
|
const hour = new Date().getHours();
|
|
|
|
if (hour < 12) {
|
|
return `Good morning, ${name}`;
|
|
} else if (hour < 17) {
|
|
return `Good afternoon, ${name}`;
|
|
} else if (hour < 22) {
|
|
return `Good evening, ${name}`;
|
|
} else {
|
|
return `Good night, ${name}`;
|
|
}
|
|
}
|
|
|
|
export function getPublicUrl(key: string | null): string | null {
|
|
if (!key) return null;
|
|
return `${PUBLIC_B2_ENDPOINT}/${PUBLIC_B2_BUCKET}/${key}`;
|
|
}
|
|
|
|
export function debounce(func: (...args: any[]) => void, wait: number) {
|
|
let timeout: number | undefined;
|
|
return function executedFunction(...args: any[]) {
|
|
const later = () => {
|
|
clearTimeout(timeout);
|
|
func(...args);
|
|
};
|
|
clearTimeout(timeout);
|
|
timeout = setTimeout(later, wait);
|
|
};
|
|
} |