Replace entire repo content with updated code from /root/shahikitchen-website/
This commit is contained in:
@@ -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[],
|
||||
|
||||
Reference in New Issue
Block a user