Replace entire repo content with updated code from /root/shahikitchen-website/

This commit is contained in:
root
2026-06-30 12:19:55 +00:00
parent 50e3a34895
commit c8b7dc95e4
26 changed files with 1153 additions and 161 deletions
+58
View File
@@ -0,0 +1,58 @@
import type { Language } from '@/domain/language/entities';
import type { MenuItem } from '@/domain/menu/entities';
import type { OrderLine } from '@/domain/shared/order-line';
import { getMenuItemById } from '@/infrastructure/menu/static-menu-data';
import { getCategoryName as resolveCategoryName } from '@/presentation/i18n/menu/category-names';
import { getMenuItemName as resolveItemName } from '@/presentation/i18n/menu/item-names';
import type { TranslationBundle } from '@/presentation/i18n/translations';
type MenuTextBundle = TranslationBundle & {
menuDescriptions?: Record<string, string>;
};
export function getMenuItemName(
lang: Language,
item: Pick<MenuItem, 'id' | 'name'>,
): string {
return resolveItemName(lang, item.id, item.name);
}
export function getMenuItemDescription(
lang: Language,
t: TranslationBundle,
item: Pick<MenuItem, 'id' | 'description'>,
): string {
const bundle = t as MenuTextBundle;
return (
bundle.menuDescriptions?.[item.id] ??
(lang === 'en' ? item.description : undefined) ??
item.description ??
''
);
}
export function getCategoryName(
lang: Language,
categoryId: string,
fallback: string,
): string {
return resolveCategoryName(lang, categoryId, fallback);
}
export function localizeMenuItem(
lang: Language,
t: TranslationBundle,
item: MenuItem,
): MenuItem {
return {
...item,
name: getMenuItemName(lang, item),
description: getMenuItemDescription(lang, t, item),
};
}
export function localizeOrderLineName(lang: Language, line: OrderLine): string {
const menuItem = getMenuItemById(line.id);
if (!menuItem) return line.name;
return getMenuItemName(lang, menuItem);
}
@@ -2,6 +2,7 @@ import type { DeliveryInquiryDetails, PickupInquiryDetails } from '@/domain/cart
import type { BookingDetails } from '@/domain/booking/entities';
import { isBookingComplete } from '@/domain/booking/validation';
import type { Language } from '@/domain/language/entities';
import { localizeOrderLineName } from '@/application/i18n/menu-localization';
import {
calculateOrderTotal,
formatOrderLinesForInquiry,
@@ -46,14 +47,21 @@ export function getSuggestedPickupTime(language: Language, from: Date = new Date
return suggested.toLocaleTimeString(timeLocale, { hour: '2-digit', minute: '2-digit' });
}
function localizeInquiryLines(lang: Language, items: OrderLine[]): string {
return formatOrderLinesForInquiry(
items.map((item) => ({ ...item, name: localizeOrderLineName(lang, item) })),
);
}
export function buildPickupInquiryMessage(
items: OrderLine[],
details: PickupInquiryDetails,
copy: CartInquiryCopy,
language: Language = 'en',
): string | null {
if (items.length === 0) return null;
const lines = formatOrderLinesForInquiry(items);
const lines = localizeInquiryLines(language, items);
const total = calculateOrderTotal(items);
return `${copy.pickupIntro}
@@ -67,10 +75,11 @@ export function buildDeliveryInquiryMessage(
items: OrderLine[],
details: DeliveryInquiryDetails,
copy: CartInquiryCopy,
language: Language = 'en',
): string | null {
if (items.length === 0) return null;
const lines = formatOrderLinesForInquiry(items);
const lines = localizeInquiryLines(language, items);
const total = calculateOrderTotal(items);
return `${copy.deliveryIntro}
@@ -83,6 +92,15 @@ ${copy.messagePreferredTime}: ${details.preferredTime.trim()}
${copy.deliverySwishNote}`;
}
const PACKAGE_NAME_PLACEHOLDER = '{{package}}';
export function buildCateringPackagePricingMessage(
packageName: string,
template: string,
): string {
return template.split(PACKAGE_NAME_PLACEHOLDER).join(packageName);
}
export function buildBookingWhatsAppMessage(
booking: BookingDetails,
preOrder: OrderLine[],