import { Input } from '@/components/ui/input' import { ResizableHandle, ResizablePanel, ResizablePanelGroup } from '@/components/ui/resizable' import { Separator } from '@/components/ui/separator' import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs' import { TooltipProvider } from '@/components/ui/tooltip' import { cn } from '@/lib/utils' import { type MaterialSetting, type Recipe01, type Recipes } from '@/models/recipe/schema' import { memo, useEffect, useMemo, useState } from 'react' import { Search, CupSoda, Wheat, Dessert, Cherry, WineOff, Server, Loader2 } from 'lucide-react' import Nav from './nav' import RecipeList from './recipe-list' import { format, isBefore, isToday } from 'date-fns' import RecipeDisplay from './recipe-display' import MaterialList from './material-list' import { Button } from '@/components/ui/button' import { useMutation } from '@tanstack/react-query' import taoAxios from '@/lib/taoAxios' interface RecipeMenuProps { recipes: Recipes recipe01: Recipe01[] defaultSize?: number isDevBranch: boolean } const RecipeMenu: React.FC = memo(({ recipes, recipe01, defaultSize, isDevBranch }) => { const [recipeList, setRecipeList] = useState(recipe01) const sortedRecipe01 = useMemo(() => { return recipeList.sort((a, b) => (a.LastChange && b.LastChange && isBefore(a.LastChange, b.LastChange) ? 1 : -1)) }, [recipeList]) const { isPending, isSuccess, isError, mutate } = useMutation({ mutationFn: async () => { return taoAxios.post('/v2/recipes/', recipes, { params: { country_id: 'tha' } }) } }) const [search, setSearch] = useState('') useEffect(() => { if (search) { const recipesFiltered = recipe01.filter( item => item.productCode.toLowerCase().includes(search.toLowerCase()) || (item.name && item.name.toLowerCase().includes(search.toLowerCase())) ) setRecipeList(recipesFiltered) } else { setRecipeList(recipe01) } }, [search]) return ( <>

Recipe Version: {recipes.MachineSetting.configNumber} {isDevBranch ? '(Dev)' : ''}

All Menu Today
setSearch(e.target.value)} />
item.LastChange && isToday(item.LastChange))} />
) }) interface MaterialsProps { recipes: Recipes defaultSize?: number isDevBranch: boolean } const Materials: React.FC = memo(({ recipes, defaultSize, isDevBranch }) => { const [materialSettingList, setMaterialSettingList] = useState(recipes.MaterialSetting) const sortedMaterialSettingList = useMemo(() => { return materialSettingList.sort((a, b) => (a.id < b.id ? 1 : -1)) }, [materialSettingList]) const [search, setSearch] = useState('') useEffect(() => { if (search) { const materialSettingsFiltered = recipes.MaterialSetting.filter( item => item.materialName.toLowerCase().includes(search.toLowerCase()) || item.id.toString().includes(search.toLowerCase()) ) setMaterialSettingList(materialSettingsFiltered) } else { setMaterialSettingList(recipes.MaterialSetting) } }, [search]) return ( <>

Recipe Version: {recipes.MachineSetting.configNumber} {isDevBranch ? '(Dev)' : ''}

setSearch(e.target.value)} />
) }) interface RecipeEditorProps { isDevBranch: boolean recipes: Recipes defaultLayout: number[] | undefined defaultCollapsed?: boolean navCollapsedSize: number } export const RecipeEditor: React.FC = ({ recipes, isDevBranch, defaultLayout = [265, 440, 655], defaultCollapsed = false, navCollapsedSize }) => { const [isCollapsed, setIsCollapsed] = useState(defaultCollapsed) const [showListIndex, setShowListIndex] = useState(0) const { recipesEnable, recipeDisable } = useMemo(() => { return { recipesEnable: recipes.Recipe01.filter(r => r.isUse), recipeDisable: recipes.Recipe01.filter(r => !r.isUse) } }, [recipes]) return ( { document.cookie = `react-resizable-panels:layout=${JSON.stringify(sizes)}` }} className="h-full max-h-screen items-stretch" > { setIsCollapsed(true) document.cookie = `react-resizable-panels:collapsed=${JSON.stringify(true)}` }} onExpand={() => { setIsCollapsed(false) document.cookie = `react-resizable-panels:collapsed=${JSON.stringify(false)}` }} className={cn(isCollapsed && 'min-w-[50px] transition-all duration-300 ease-in-out')} >
TimeStamp: {format(recipes.Timestamp, 'dd-MM-yyyy HH:mm:ss')}