\r\n );\r\n}\r\n","import React, { Fragment } from 'react';\r\nimport XIcon from '@heroicons/react/outline/XIcon';\r\nimport { Dialog, Transition } from '@headlessui/react';\r\nimport LightButton from '../Buttons/LightButton';\r\nimport useModal from '../../hooks/useModal';\r\nimport Order from '../Orders/Order';\r\nimport ChooseUnit from '../Products/ChooseUnit';\r\nimport Notification from '../Notifications/Notification';\r\nimport Info from '../Products/Info';\r\nimport Report from '../Reports/Report';\r\nimport TermsOfAgreement from '../../routes/Register/TermsOfAgreement';\r\n\r\nconst components = {\r\n order: Order,\r\n report: Report,\r\n productInfo: Info,\r\n chooseUnit: ChooseUnit,\r\n notification: Notification,\r\n termsOfAgreement: TermsOfAgreement,\r\n};\r\n\r\nfunction UnknownComponent() {\r\n const { closeModal } = useModal();\r\n return (\r\n
\r\n
Komponenten du försökte hitta finns inte. Kontakta vår support så kan vi hjälpa dig.
\r\n Stäng\r\n
\r\n );\r\n}\r\n\r\nexport default function Modal() {\r\n const {\r\n open,\r\n closeModal,\r\n title,\r\n component,\r\n componentProps,\r\n } = useModal();\r\n\r\n const Component = components[component];\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n >\r\n );\r\n}\r\n","import React from 'react';\r\nimport Qr from 'qrcode.react';\r\nimport { useAuthenticatedHttpGet } from '../../hooks/useHttp';\r\nimport { toDisplayDateTime } from '../../utils/datetime';\r\nimport localeCurrency from '../../utils/numbers';\r\n\r\nexport default function Order({ id }) {\r\n const {\r\n loading,\r\n error,\r\n ready,\r\n data,\r\n } = useAuthenticatedHttpGet(`/api/orders/${id}`);\r\n\r\n return (\r\n <>\r\n {loading && (\r\n
\r\n );\r\n}\r\n","import React from 'react';\r\nimport useModal from '../../hooks/useModal';\r\nimport LightButton from '../Buttons/LightButton';\r\n\r\nexport default function Notification({ imageUrl, message }) {\r\n const { closeModal } = useModal();\r\n return (\r\n
\r\n {(imageUrl !== null) && (\r\n \r\n )}\r\n
{message}
\r\n Stäng\r\n
\r\n );\r\n}\r\n","import React from 'react';\r\nimport LightButton from '../../components/Buttons/LightButton';\r\nimport useModal from '../../hooks/useModal';\r\n\r\nexport default function TermsOfAgreement() {\r\n const { closeModal } = useModal();\r\n return (\r\n
\r\n
Våra generella villkor
\r\n
\r\n
1. Allmänt om tjänsten
\r\n Boxmeal är en tjänst för köp av livsmedel på din arbetsplats. Boxmeal-butiken är öppen för dig dygnet runt (om inte annat avtalas parterna emellan) varje dag i veckan. Du har tillgång till ett brett och varierat sortiment av mellanmål, kalla drycker samt frukostmackor och kylda måltider vid beställning.\r\n Tjänsten omfattas i allmänhet av köp- och medlemsvillkoren nedan. Dessa köp-och medlemsvillkor börjar gälla från och med kontots skapande.\r\n
1.1 Parterna
\r\n Köp- och tjänstevillkoren reglerar avtalet mellan dig som kund (nedan: du, kunden) och Boxmeal Gävle AB (nedan: vi, Boxmeal). Tjänsten tillhandahålls i samarbete med arbetsplatsens arbetsgivare.\r\n
1.2 Avtalets giltighet
\r\n Köp- och medlemsvillkoren utgör parternas huvudsakliga reglering av de frågor som omfattas av dessa villkor.\r\n Boxmeal förbehåller sig rätten att uppdatera och revidera dessa köp- och medlemsvillkor. Därför ber vi dig alltid kontrollera gällande villkor www.boxmeal.se. Vid större förändringar av köp- och medlemsvillkoren meddelar vi kunden per e-post senast 14 dagar innan ändringarna träder i kraft.\r\n
1.3 Kontaktuppgifter
\r\n Tjänsten ägs och drivs av Boxmeal AB, org.nr. 559175-3685, (nedan ”Boxmeal”). Södra Kungsgatan 57, 802 55 Gävle. Har du frågor om köp- och medlemsvillkoren eller om vår integritetspolicy hur vi hanterar dina personliga uppgifter eller har ett annat\r\n kundtjänstärende, kontakta oss gärna på telefon: 072-510 52 42 eller 070-649 45 00 eller per e-post: info@boxmeal.se. Aktuella kontaktuppgifter till oss finns även på www.boxmeal.se\r\n
2. Att handla hos Boxmeal
\r\n För information om vilka personuppgifter vi behandlar och syftet med behandlingen hänvisar vi till vår integritetspolicy. Du kan också med ditt samtycke överlåta registreringen till en säljare eller annan representant för Boxmeal.\r\n
2.1 Uppgifternas riktighet
\r\n Uppgifterna vid betalning ska vara korrekta och du är skyldig att uppdatera dessa uppgifter om de vid någon tidpunkt skulle förändras.\r\n
2.2 Behandling av personuppgifter
\r\n När du köper våra produkter och använder våra tjänster kan du direkt eller indirekt komma att ge oss information om dig själv på ett antal olika sätt, såsom när du genomför ett köp via våra boxar, kontaktar oss, använder någon av våra webtjänster eller deltar i events eller tävlingar där du lämnar ifrån dig personuppgifter av något slag. Vi är naturligtvis måna om att du alltid skall känna dig trygg att vi behandlar dina personuppgifter ansvarsfullt med hänsyn till din integritet och att vi är transparenta med vilken information vi samlar in om dig, hur dessa uppgifter kan komma att användas och hur länge dina personliga uppgifter lagras hos oss.\r\n Dataskyddsförordningen som trädde i kraft 25 maj 2018 har stärkt dina rättigheter att styra hur du vill att vi hanterar personuppgifter kopplade till dig som är kund hos oss. Du har bland annat rätt till ett s.k. registerutdrag, få dina uppgifter rättade, ge och återkalla ditt samtycke för behandling av dina personuppgifter, avsäga dig direktreklam från oss. Du kan även motsätta dig till behandling av personuppgifter som grundar sig på berättigat intresse samt få dina uppgifter raderade när det inte längre finns legitimt skäl för fortsatt behandling av dina uppgifter. Du har även möjlighet att begränsa dina uppgifter om du anser att uppgifter som vi lagrat om dig inte är korrekta samt under vissa omständigheter kunna flytta din data eller vissa uppgifter om dig (s.k. dataportabilitet).\r\n För mer detaljerad information om behandling av personuppgifter, hänvisar vi dig att läsa mer om detta i vår integritetspolicy.\r\n
3. Betalning
\r\n Boxmeal förbehåller sig rätten att kontrollera dina personuppgifter och genomföra kreditupplysning. Om resultatet av kreditupplysningen indikerar en förhöjd kreditrisk förbehåller sig Boxmeal rätten att avslå registreringen. Boxmeal eller arbetsplatsens arbetsgivare förbehåller sig rätten avsluta/spärra konton vid missbruk eller obetalda köp.\r\n
3.1 Betalning av köp
\r\n Betalning av köp i våra boxar sker i direkt anslutning till att du fysiskt plockar varan ur utplacerad kyl/frys, alternativt plockar ut sedan tidigare beställda varor. Betalning via Swish, kort eller faktura. Vid betalning med ovan nämnda betalningsmetoder sker debitering automatiskt för köpta varor från ditt konto. Varor som inte betalats för förläggs med faktura till arbetsgivare. Vid utebliven betalning skickas en påminnelseavgift och därefter inkassoföreläggande. Vid hävt köp följer Boxmeal konsumentverkets rekommendationer för ångerrätt och återbetalning.\r\n Boxmeal åtar sig att kontrollera vid varje påfyllningstillfälle att saldot i boxen stämmer överrens med systemets saldo. Boxmeal åtar sig också att föra dialog med arbetsgivaren gällande eventuellt svinn och åtgärder för detta.\r\n
3.2 Betalningsansvar
\r\n Som kund finns ett personligt betalningsansvar för de köp som görs i våra boxar. Du står därmed personligt bunden till att inbetald summa står i paritet med utplockade varor ur kyl/frys.\r\n
4. Livsmedelsfrågor
\r\n
4.1 Matallergier
\r\n Vårt sortiment kan innehålla nötter och andra allergener. Kunden ansvarar själv för att läsa på innehållsförteckningarna. Kunder med en överkänslighet eller allergi uppmanas vara extra uppmärksamma.\r\n
4.2 Livsmedelsupplysning
\r\n Som kund har du fri tillgång till vår kundtjänst som svarar på dina frågor eller önskemål, mail: info@boxmeal.se.\r\n
4.3 Reklamationer
\r\n Boxmeal följer konsumentköpslagen och hanterar reklamationer i första hand enligt vår smakgaranti. Smakgarantin innebär att du oavsett anledning kan reklamera köpt produkt som gjorts de senaste dagarna. Smakgarantin krediterar dig för varans värde på nästkommande månadssammanställning.\r\n
4.4 Ångerrätt
\r\n Den lagstadgade ångerrätter gäller inte vid köp av livsmedel från Boxmeal enligt 14§ distanshandelslagen. Detta eftersom tjänsten och fullgörandet har påbörjats i samband med inköp av varorna och eftersom det ibland rör sig om färska varor som snabbt kan försämras när de blir gamla. Om du häver köpet kommer vi att återbetala dig inom 30 dagar förutsatt att vi har mottagit rätt uppgifter att betala ut beloppet. Vid en eventuell tvist har vi som policy att följa Allmänna Reklamationsnämndens rekommendationer.\r\n
4.5 Mat
\r\n Vid beställning av mat / mackor skall beställning ske innan kl 11.00 dag leverans.\r\n Vid sjukfall på bokad matlåda/matlådor maila till info@boxmeal.se\r\n - Endast mat från menyn är beställningsbar.\r\n - Tillbehör så som bestick, dryck, sallad o bröd ingår ej.\r\n - Vi förser endast med gluten och laktosfria alternativ till matallergier.\r\n
5. Övrigt
\r\n
5.1 Förändringar i tjänstens innehåll
\r\n Boxmeal äger rätt att genomföra förändringar beträffande pris och/eller tjänstens innehåll. Samtliga kunder meddelas om detta via mail eller telefon utifrån de uppgifter som lämnats vid registreringen. Boxmeal äger rätt att när som helst avsluta tjänsten och därmed möjligheten att handla i boxen. Kunden blir vid sådan händelse informerad via mail eller telefon.\r\n
5.2 Överlåtelse av rättigheter och skyldigheter
\r\n Boxmeal förbehåller sig rätten att överlåta sina rättigheter och skyldigheter enligt detta avtal till en annan part till exempel i samband med en förändring i företagets organisation.\r\n\r\n \r\n Stäng\r\n
\r\n );\r\n}\r\n","export const notificationStatus = {\r\n unseen: { value: 0, description: 'Osedd' },\r\n seen: { value: 1, description: 'Sedd' },\r\n clicked: { value: 2, description: 'Klickad' },\r\n};\r\n\r\nexport const orderStatus = {\r\n open: { value: 0, description: 'Öppen' },\r\n pending: { value: 10, description: 'Väntar' },\r\n paid: { value: 20, description: 'Betalad' },\r\n cancelled: { value: 99, description: 'Avbruten' },\r\n};\r\n\r\nexport const categories = {\r\n food: { value: 'Mat', description: 'Mat' },\r\n};\r\n","import React from 'react';\r\nimport { Link } from 'react-router-dom';\r\nimport ShoppingBagIcon from '@heroicons/react/outline/ShoppingBagIcon';\r\nimport UserIcon from '@heroicons/react/outline/UserIcon';\r\nimport ViewGridAddIcon from '@heroicons/react/outline/ViewGridAddIcon';\r\nimport HeartIcon from '@heroicons/react/outline/HeartIcon';\r\nimport CalendarIcon from '@heroicons/react/outline/CalendarIcon';\r\nimport useStore from '../../hooks/useStore';\r\nimport { allRoutes } from '../../utils/routes';\r\nimport { categories } from '../../utils/enums';\r\nimport useAuth from '../../hooks/useAuth';\r\n\r\nconst bottomMenuSize = '86px';\r\nexport default function AuthenticatedLayout({ children }) {\r\n const { items } = useStore();\r\n const { user } = useAuth();\r\n\r\n const availableCategories = (user?.defaultUnit?.availableCategories ?? []);\r\n const hasFood = availableCategories.length !== 0 && availableCategories.some((c) => c === categories.food.value);\r\n\r\n return (\r\n <>\r\n
\r\n );\r\n}\r\n","import React from 'react';\r\nimport Notifications from './Notifications';\r\n\r\nexport default function AuthenticatedTopMenu({ children }) {\r\n return (\r\n
\r\n
\r\n
\r\n \r\n
\r\n
{children}
\r\n
\r\n \r\n
\r\n
\r\n
\r\n );\r\n}\r\n","import React from 'react';\r\nimport ChevronDownIcon from '@heroicons/react/outline/ChevronDownIcon';\r\nimport ChevronUpIcon from '@heroicons/react/outline/ChevronUpIcon';\r\nimport useAuth from '../../hooks/useAuth';\r\nimport useModal from '../../hooks/useModal';\r\n\r\nexport default function OpenChooseUnit() {\r\n const { user } = useAuth();\r\n const { open, openModal } = useModal();\r\n\r\n function openUnitChooser() {\r\n openModal({ title: 'Välj butik', component: 'chooseUnit' });\r\n }\r\n\r\n return (\r\n
\r\n
{user?.defaultUnit?.name ?? 'Välj butik'}
\r\n {open ? : }\r\n
\r\n );\r\n}\r\n","import React from 'react';\r\n\r\nexport default function Message({ text }) {\r\n return (\r\n
{text}
\r\n );\r\n}\r\n","import React, { useState } from 'react';\r\nimport GreenButton from '../Buttons/GreenButton';\r\nimport useModal from '../../hooks/useModal';\r\nimport usePolling from '../../hooks/usePolling';\r\nimport { authenticatedHttpQuery, httpMethods } from '../../utils/http';\r\n\r\nexport default function LatestOrder() {\r\n const [order, setOrder] = useState(null);\r\n const { openModal } = useModal();\r\n\r\n function openOrder() {\r\n openModal({\r\n title: `Order #${order.id}`,\r\n component: 'order',\r\n componentProps: { id: order.id },\r\n });\r\n }\r\n\r\n async function pollLatestOrder() {\r\n const data = await authenticatedHttpQuery({ url: '/api/orders/latest', options: { method: httpMethods.GET } });\r\n const { errors = [] } = data;\r\n\r\n if (errors.length === 0) {\r\n setOrder(data);\r\n }\r\n }\r\n\r\n usePolling(pollLatestOrder, 10 * 1000);\r\n if (order == null) return null;\r\n\r\n return (\r\n
\r\n
\r\n Se senaste order\r\n
\r\n
\r\n );\r\n}\r\n","import React from 'react';\r\nimport useStore from '../../hooks/useStore';\r\nimport useModal from '../../hooks/useModal';\r\n\r\nexport default function Item({ product }) {\r\n const {\r\n items,\r\n addItem,\r\n } = useStore();\r\n\r\n const { openModal } = useModal();\r\n const amountInBag = items.filter((item) => item.id === product.id).length;\r\n\r\n function addItemToBag() {\r\n if (amountInBag < product.currentStock) {\r\n addItem(product);\r\n }\r\n }\r\n\r\n function openProductInfo() {\r\n openModal({\r\n title: `Info om ${product.article.name}`,\r\n component: 'productInfo',\r\n componentProps: { description: product.article.description },\r\n });\r\n }\r\n\r\n return (\r\n
\r\n
\r\n
\r\n {amountInBag > 0 && (\r\n
\r\n {amountInBag}\r\n
\r\n )}\r\n
\r\n \r\n
\r\n
{product.article.name}
\r\n
{`${product.article.price} :-`}
\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n );\r\n}\r\n","import React, { useState } from 'react';\r\nimport ChevronDownIcon from '@heroicons/react/outline/ChevronDownIcon';\r\nimport ChevronUpIcon from '@heroicons/react/outline/ChevronUpIcon';\r\nimport Item from '../../components/Products/Item';\r\n\r\nfunction ItemWrapper({ products }) {\r\n return (\r\n
\r\n >\r\n );\r\n}\r\n","import React from 'react';\r\n\r\nexport default function HeaderMessage({ text }) {\r\n return (\r\n
{text}
\r\n );\r\n}\r\n","import React from 'react';\r\nimport { useHistory } from 'react-router-dom';\r\nimport CogIcon from '@heroicons/react/outline/CogIcon';\r\nimport DocumentTextIcon from '@heroicons/react/outline/DocumentTextIcon';\r\nimport SupportIcon from '@heroicons/react/outline/SupportIcon';\r\nimport GreenButton from '../../components/Buttons/GreenButton';\r\nimport LightButton from '../../components/Buttons/LightButton';\r\nimport AuthenticatedTopMenu from '../../components/Layout/AuthenticatedTopMenu';\r\nimport HeaderMessage from '../../components/Layout/HeaderMessage';\r\nimport useAuth from '../../hooks/useAuth';\r\nimport { allRoutes } from '../../utils/routes';\r\n\r\nexport default function Account() {\r\n const { logOut } = useAuth();\r\n const history = useHistory();\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n
\r\n >\r\n );\r\n}\r\n","import React from 'react';\r\nimport GreenButton from '../../components/Buttons/GreenButton';\r\nimport LightButton from '../../components/Buttons/LightButton';\r\n\r\nexport default function AreYouSure({\r\n goToCheckout,\r\n goToAssortment,\r\n}) {\r\n return (\r\n
\r\n >\r\n );\r\n}\r\n","import React from 'react';\r\nimport { useHistory } from 'react-router-dom';\r\nimport { Disclosure } from '@headlessui/react';\r\nimport ChevronDownIcon from '@heroicons/react/outline/ChevronDownIcon';\r\nimport ChevronUpIcon from '@heroicons/react/outline/ChevronUpIcon';\r\nimport GreenButton from '../../components/Buttons/GreenButton';\r\nimport LightButton from '../../components/Buttons/LightButton';\r\nimport AuthenticatedTopMenu from '../../components/Layout/AuthenticatedTopMenu';\r\nimport HeaderMessage from '../../components/Layout/HeaderMessage';\r\nimport { allRoutes } from '../../utils/routes';\r\nimport { useAuthenticatedHttpGet } from '../../hooks/useHttp';\r\nimport useModal from '../../hooks/useModal';\r\n\r\nfunction SupportItem({ title, children }) {\r\n return (\r\n \r\n {({ open }) => (\r\n <>\r\n \r\n
\r\n >\r\n );\r\n}\r\n","import React from 'react';\r\n\r\nexport default function Message({ text }) {\r\n return (\r\n
{text}
\r\n );\r\n}\r\n","import React from 'react';\r\nimport Item from '../../components/Products/Item';\r\n\r\nexport default function Overview({ products = [] }) {\r\n return (\r\n
\r\n {products.map((p) => (\r\n \r\n ))}\r\n
\r\n );\r\n}\r\n","import React from 'react';\r\nimport Message from './Message';\r\nimport Overview from './Overview';\r\nimport useAuth from '../../hooks/useAuth';\r\nimport { useAuthenticatedHttpGet } from '../../hooks/useHttp';\r\n\r\nexport default function Products() {\r\n const { user } = useAuth();\r\n const {\r\n loading,\r\n error,\r\n ready,\r\n data,\r\n } = useAuthenticatedHttpGet(`/api/products/favorites/${user.defaultUnit.id}`);\r\n const products = data ?? [];\r\n\r\n return (\r\n <>\r\n {loading && }\r\n {error && }\r\n {ready && products.length === 0 && }\r\n {ready && products.length > 0 && }\r\n >\r\n );\r\n}\r\n","import React from 'react';\r\nimport AuthenticatedTopMenu from '../../components/Layout/AuthenticatedTopMenu';\r\nimport OpenChooseUnit from '../../components/Products/OpenChooseUnit';\r\nimport Products from './Products';\r\nimport useAuth from '../../hooks/useAuth';\r\n\r\nexport default function Favorites() {\r\n const { user } = useAuth();\r\n const hasChosenUnit = user?.defaultUnit?.id ?? null;\r\n return (\r\n <>\r\n \r\n \r\n \r\n
\r\n {!hasChosenUnit && (\r\n
Välj butik för att se dina tillgängliga favoriter
\r\n )}\r\n {hasChosenUnit && (\r\n \r\n )}\r\n
\r\n >\r\n );\r\n}\r\n","import React from 'react';\r\nimport Qr from 'qrcode.react';\r\nimport { useHistory } from 'react-router-dom';\r\nimport GreenButton from '../../components/Buttons/GreenButton';\r\nimport { allRoutes } from '../../utils/routes';\r\n\r\nexport default function Complete({\r\n orderId,\r\n unitLockCode,\r\n}) {\r\n const history = useHistory();\r\n return (\r\n <>\r\n \r\n
\r\n
{`Tack för din order med ordernummer: ${orderId}!`}
\r\n
Skanna koden ovan för att öppna kylen och ta dina varor
\r\n
\r\n \r\n history.push(allRoutes.home)}>Tillbaka till butik\r\n >\r\n );\r\n}\r\n","import React, { useEffect } from 'react';\r\nimport { useHttpQueryTrigger } from '../../hooks/useHttp';\r\nimport usePolling from '../../hooks/usePolling';\r\nimport { orderStatus } from '../../utils/enums';\r\nimport { httpMethods } from '../../utils/http';\r\nimport { getRouteParameter } from '../../utils/routes';\r\n\r\nexport default function Pending({\r\n orderId,\r\n setOrderData,\r\n}) {\r\n const {\r\n trigger,\r\n result,\r\n error,\r\n done,\r\n } = useHttpQueryTrigger();\r\n\r\n function poll() {\r\n trigger(`/api/orders/verify/${orderId}`, {\r\n method: httpMethods.GET,\r\n headers: { Authorization: `Bearer ${getRouteParameter('token')}` },\r\n });\r\n }\r\n\r\n usePolling(poll);\r\n\r\n function handleSave() {\r\n if (done && !error) {\r\n const { status = orderStatus.cancelled.value, unitLockCode = '' } = result ?? {};\r\n setOrderData(status, unitLockCode);\r\n }\r\n }\r\n\r\n useEffect(handleSave, [result]);\r\n\r\n return (\r\n
\r\n
{`Väntar på bekräftelse för din order med ordernummer: ${orderId}`}
\r\n
Vi väntar bara på bekräftelse från Swish, när de är klara kommer du att kunna öppna kylen
\r\n
\r\n );\r\n}\r\n","import React from 'react';\r\nimport { useHistory } from 'react-router-dom';\r\nimport GreenButton from '../../components/Buttons/GreenButton';\r\nimport { allRoutes } from '../../utils/routes';\r\n\r\nexport default function Error({ orderId }) {\r\n const history = useHistory();\r\n return (\r\n <>\r\n
\r\n
{`Kunde inte ta betalt för din order med ordernummer: ${orderId}`}
\r\n
Vi har sparat det här ärendet, om du vill prova igen så är din order sparad
\r\n
\r\n \r\n history.push(allRoutes.home)}>Tillbaka till butik\r\n >\r\n );\r\n}\r\n","import React, { useState } from 'react';\r\nimport AuthenticatedTopMenu from '../../components/Layout/AuthenticatedTopMenu';\r\nimport HeaderMessage from '../../components/Layout/HeaderMessage';\r\nimport Complete from './Complete';\r\nimport Pending from './Pending';\r\nimport Error from './Error';\r\nimport useStore from '../../hooks/useStore';\r\nimport { orderStatus } from '../../utils/enums';\r\nimport useAuth from '../../hooks/useAuth';\r\n\r\nconst views = {\r\n ERROR: 'ERROR',\r\n PENDING: 'PENDING',\r\n COMPLETE: 'COMPLETE',\r\n};\r\n\r\nexport default function Confirmation({ match }) {\r\n const { orderId = '' } = match.params;\r\n const { clearItems } = useStore();\r\n const { authenticated } = useAuth();\r\n\r\n const [state, setState] = useState({\r\n view: views.PENDING,\r\n unitLockCode: '',\r\n });\r\n\r\n function setOrderData(status, code) {\r\n if (status === orderStatus.open.value || status === orderStatus.pending.value) {\r\n return;\r\n }\r\n\r\n if (status === orderStatus.paid.value) {\r\n clearItems();\r\n }\r\n\r\n setState((prev) => ({\r\n ...prev,\r\n view: status === orderStatus.cancelled.value ? views.ERROR : views.COMPLETE,\r\n unitLockCode: code,\r\n }));\r\n }\r\n\r\n return (\r\n <>\r\n {authenticated && (\r\n \r\n \r\n \r\n )}\r\n
\r\n >\r\n )}\r\n >\r\n );\r\n}\r\n","import React, { useState } from 'react';\r\nimport ChevronLeftIcon from '@heroicons/react/outline/ChevronLeftIcon';\r\nimport ChevronRightIcon from '@heroicons/react/outline/ChevronRightIcon';\r\nimport AuthenticatedTopMenu from '../../components/Layout/AuthenticatedTopMenu';\r\nimport OpenChooseUnit from '../../components/Products/OpenChooseUnit';\r\nimport SaveLunch from './SaveLunch';\r\nimport { useAuthenticatedHttpGet } from '../../hooks/useHttp';\r\nimport {\r\n getIsoYear,\r\n getIsoWeek,\r\n getMonday,\r\n addWeeksToDate,\r\n} from '../../utils/datetime';\r\n\r\nfunction ToggleButton({\r\n children,\r\n onClick,\r\n disabled,\r\n}) {\r\n return (\r\n \r\n );\r\n}\r\n\r\nexport default function Lunch() {\r\n const [date, setDate] = useState(addWeeksToDate(new Date(), 1));\r\n\r\n function addWeek() {\r\n setDate(addWeeksToDate(date, 1));\r\n }\r\n\r\n function subtractWeek() {\r\n setDate(addWeeksToDate(date, -1));\r\n }\r\n\r\n const monday = getMonday(date);\r\n const week = getIsoWeek(date);\r\n const year = getIsoYear(date);\r\n\r\n const {\r\n loading,\r\n error,\r\n ready,\r\n data,\r\n } = useAuthenticatedHttpGet(`/api/lunch/${year}/${week}`);\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n
{`Vecka ${week} - ${year}`}
\r\n
\r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n {loading && (\r\n
Hämtar dina bokade luncher ...
\r\n )}\r\n {ready && error && (\r\n
Kunde inte hämta dina bokade luncher
\r\n )}\r\n {ready && !error && (\r\n \r\n )}\r\n
\r\n >\r\n );\r\n}\r\n","import React from 'react';\r\nimport { useHistory } from 'react-router-dom';\r\nimport GreenButton from '../../components/Buttons/GreenButton';\r\nimport { allRoutes } from '../../utils/routes';\r\n\r\nexport default function NotFound() {\r\n const history = useHistory();\r\n return (\r\n
\r\n
404 - Sidan hittades inte!
\r\n history.push(allRoutes.home)}>Gå till första sidan\r\n
\r\n );\r\n}\r\n","import React from 'react';\r\nimport { BrowserRouter as Router, Route, Switch } from 'react-router-dom';\r\nimport { allRoutes } from './utils/routes';\r\nimport PrivateRoute from './components/Auth/PrivateRoute';\r\nimport PublicRoute from './components/Auth/PublicRoute';\r\nimport Layout from './components/Layout/Layout';\r\nimport Start from './routes/Start/Start';\r\nimport Login from './routes/Auth/LogIn';\r\nimport CompleteReset from './routes/Auth/CompleteReset';\r\nimport Register from './routes/Register/Register';\r\nimport Home from './routes/Home/Home';\r\nimport Account from './routes/Account/Account';\r\nimport Checkout from './routes/Checkout/Checkout';\r\nimport Settings from './routes/Account/Settings';\r\nimport Support from './routes/Account/Support';\r\nimport History from './routes/Account/History';\r\nimport Favorites from './routes/Favorites/Favorites';\r\nimport Confirmation from './routes/Order/Confirmation';\r\nimport Lunch from './routes/Lunch/Lunch';\r\nimport NotFound from './routes/404/NotFound';\r\n\r\nexport default function App() {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n}\r\n","import React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport './index.css';\r\nimport App from './App';\r\nimport AuthProvider from './contexts/AuthContext';\r\nimport StoreProvider from './contexts/StoreContext';\r\nimport ModalProvider from './contexts/ModalContext';\r\n\r\nReactDOM.render(\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n ,\r\n document.getElementById('root'),\r\n);\r\n"],"sourceRoot":""}