import { X, Plus } from 'lucide-react' import type { PackingState } from './usePackingListPanel' import { bagFillPct, bagLoadSummary, packedWeight, perPersonLoads } from './packingListPanel.helpers' import { BagCard } from './PackingListPanelBagCard' import { PackingWeightSummary } from './PackingWeightSummary' export function BagModal(S: PackingState) { const { setShowBagModal, t, bags, items, tripId, tripMembers, canEdit, currentUserId, handleDeleteBag, handleUpdateBag, handleSetBagMembers, showAddBag, setShowAddBag, newBagName, setNewBagName, handleCreateBag, unassignedWeightGrams, serverWeightsFresh, } = S // The ITEM LISTS still describe what you are carrying — an item someone shared // with you stays in your list, but they are the one bringing it (#1767). The // WEIGHTS no longer do. A bag's load is the bag's, whoever packed it and // whether or not you may see the items, so it comes from the server (#2191). const { myItems, bagItemsOf, bagWeightOf, heaviestBagWeight, unassigned, unassignedWeight, totalWeight } = bagLoadSummary(bags, items, currentUserId, unassignedWeightGrams, serverWeightsFresh) return (
setShowBagModal(false)} onKeyDown={e => { if (e.target !== e.currentTarget) return if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); setShowBagModal(false) } }}>
e.stopPropagation()}>

{t('packing.bags')}

{bags.map(bag => { const bagItems = bagItemsOf(bag) const bagWeight = bagWeightOf(bag) const pct = bagFillPct(bagWeight, bag.weight_limit_grams, heaviestBagWeight) return ( handleDeleteBag(bag.id)} onUpdate={handleUpdateBag} onSetMembers={handleSetBagMembers} t={t} /> ) })} {/* Unassigned */} {(() => { // Shown whenever there is weight to account for, even with no visible // items: the grand total counts it, and a total nothing adds up to is // the confusion this issue was about (#2191). if (unassigned.length === 0 && unassignedWeight === 0) return null return (
{t('packing.noBag')} {unassignedWeight >= 1000 ? `${(unassignedWeight / 1000).toFixed(1)} kg` : `${unassignedWeight} g`}
{unassigned.length} {t('admin.packingTemplates.items', { count: unassigned.length })}
) })()} {/* Total, packed share and who carries what (#1131) */}
{/* Add bag */} {canEdit && (showAddBag ? (
setNewBagName(e.target.value)} onKeyDown={e => { if (e.key === 'Enter') void handleCreateBag(); if (e.key === 'Escape') { setShowAddBag(false); setNewBagName('') } }} placeholder={t('packing.bagName')} style={{ flex: 1, padding: '8px 12px', borderRadius: 10, border: '1px solid var(--border-primary)', fontSize: 'calc(13px * var(--fs-scale-body, 1))', fontFamily: 'inherit', outline: 'none' }} />
) : ( ))}
) }