{"version":3,"sources":["utils/routes.js","utils/auth.js","utils/http.js","utils/notifications.js","contexts/AuthContext.js","utils/store.js","contexts/StoreContext.js","hooks/useStore.js","hooks/useAuth.js","components/Auth/PrivateRoute.js","components/Auth/PublicRoute.js","components/Buttons/LightButton.js","contexts/ModalContext.js","hooks/useModal.js","hooks/useDeepEffect.js","hooks/useHttp.js","utils/datetime.js","utils/numbers.js","components/Shared/TextField.js","components/Buttons/GreenButton.js","components/Shared/TextArea.js","components/Shared/Complete.js","components/Shared/Modal.js","components/Orders/Order.js","components/Reports/Report.js","components/Products/Info.js","components/Products/ChooseUnit.js","components/Notifications/Notification.js","routes/Register/TermsOfAgreement.js","utils/enums.js","components/Layout/AuthenticatedLayout.js","components/Layout/UnauthenticatedLayout.js","components/Layout/Layout.js","routes/Start/Start.js","utils/events.js","routes/Auth/LogInForm.js","components/Alerts/LightAlert.js","routes/Auth/ResetForm.js","routes/Auth/LogIn.js","routes/Auth/CompleteReset.js","routes/Register/Register.js","hooks/usePolling.js","components/Notifications/Preview.js","components/Layout/Notification.js","components/Layout/Notifications.js","components/Layout/AuthenticatedTopMenu.js","components/Products/OpenChooseUnit.js","routes/Home/Message.js","components/Layout/LatestOrder.js","components/Products/Item.js","routes/Home/Category.js","routes/Home/Overview.js","routes/Home/Unit.js","routes/Home/Home.js","components/Layout/HeaderMessage.js","routes/Account/Account.js","routes/Checkout/AreYouSure.js","routes/Checkout/Payment.js","routes/Checkout/Item.js","routes/Checkout/Items.js","routes/Checkout/Message.js","routes/Checkout/Checkout.js","routes/Account/Settings.js","routes/Account/Support.js","routes/Account/History.js","routes/Favorites/Message.js","routes/Favorites/Overview.js","routes/Favorites/Products.js","routes/Favorites/Favorites.js","routes/Order/Complete.js","routes/Order/Pending.js","routes/Order/Error.js","routes/Order/Confirmation.js","routes/Lunch/SaveLunch.js","routes/Lunch/Lunch.js","routes/404/NotFound.js","App.js","index.js"],"names":["allRoutes","getRouteParameter","name","replace","results","RegExp","exec","window","location","search","decodeURIComponent","TOKEN_NAMESPACE","USER_NAMESPACE","getToken","token","localStorage","getItem","JSON","parse","setToken","setItem","stringify","setUser","user","httpMethods","wrapToken","options","headers","Authorization","value","httpQuery","request","success","error","a","url","fetch","data","json","response","errors","authenticatedHttpQuery","NOTIFICATIONS_NAMESPACE","setNotifications","notifications","defaultAuthState","getUser","authenticating","authenticated","Date","validUntil","AuthContext","createContext","AuthProvider","children","useState","state","setState","Provider","SHOP_NAMESPACE","setItems","shoppingBag","defaultItems","getItems","StoreContext","StoreProvider","items","useStore","useContext","addItem","product","setItemsInCache","removeItem","firstOccurrence","findIndex","p","id","filter","_","index","clearItems","useAuth","setUserDetails","prev","setPreferredUnit","defaultUnit","setAuthenticated","logOut","logIn","email","password","method","body","then","result","length","setResult","catch","PrivateRoute","path","exact","component","render","to","PublicRoute","LightButton","onClick","disabled","type","className","defaultModalState","open","title","componentProps","ModalContext","ModalProvider","modal","setModal","useModal","openModal","m","closeModal","deepEqual","x","y","Object","keys","reduce","isEqual","key","useDeepCompareMemoize","ref","useRef","current","useHttpQuerier","callback","loading","isLoading","useEffect","dependencies","map","useDeepEffect","previous","ready","useAuthenticatedHttpGet","useAuthenticatedHttpQuery","initialTriggerState","sending","done","useHttpQueryTriggerer","setError","trigger","useCallback","useHttpQueryTrigger","useAuthenticatedHttpQueryTrigger","toDisplayDateTime","d","parts","Intl","DateTimeFormat","year","month","day","hour","minute","hour12","timeZone","format","split","toDateTimeString","toDisplayDate","toDateString","getIsoWeek","date","setHours","setDate","getDate","getDay","week1","getFullYear","Math","round","getTime","addDaysToDate","days","newDate","addWeeksToDate","weeks","localeCurrency","amount","minimumFractionDigits","maximumFractionDigits","undefined","parseInt","style","currency","currencyDisplay","toLocaleString","TextField","onChange","onKeyDown","label","placeholder","autoComplete","GreenButton","TextArea","rows","Complete","message","components","order","unlockCode","size","totalPrice","createdAt","orderLines","ol","article","price","report","setTitle","description","setDescription","hasError","errorMessage","join","e","target","productInfo","chooseUnit","storeIdentifier","identifier","setIdentifier","toUpperCase","notification","imageUrl","src","alt","termsOfAgreement","UnknownComponent","Modal","Component","appear","show","as","Fragment","onClose","Child","enter","enterFrom","enterTo","leave","leaveFrom","leaveTo","Overlay","Title","notificationStatus","orderStatus","categories","AuthenticatedLayout","availableCategories","hasFood","some","c","paddingBottom","UnauthenticatedLayout","Layout","Wrapper","Start","history","useHistory","push","keyCodes","LogInForm","goToReset","credentials","setCredentials","doLogIn","checkKey","redirect","cred","LightAlert","views","ResetForm","goToLogIn","view","setView","setEmail","doReset","Login","CompleteReset","setPassword","doPasswordReset","Register","givenName","surname","phoneNumber","passwordRepeat","preferredStoreIdentifier","readTerms","editUser","editDetails","u","checked","role","tabIndex","usePolling","poll","ms","interval","setInterval","clearInterval","Preview","status","slice","Notification","Item","Button","Notifications","getNotifications","setLocalNotifications","set","i","find","n","notificationsToSet","Items","AuthenticatedTopMenu","OpenChooseUnit","Message","text","LatestOrder","setOrder","amountInBag","item","currentStock","ItemWrapper","products","Category","setOpen","o","Overview","category","self","indexOf","Unit","Home","hasChosenUnit","HeaderMessage","Account","AreYouSure","goToCheckout","goToAssortment","Payment","orderId","redirectUrl","origin","setTimeout","clearTimeout","b","purchase","productId","Checkout","floor","random","Settings","details","setDetails","SupportItem","Panel","Support","q","answer","History","orders","Products","Favorites","unitLockCode","Pending","setOrderData","Error","Confirmation","match","params","code","SaveLunch","week","monday","bookedLunches","weekdays","w","isBooked","lunches","setLunches","nextWeek","isBookable","l","copy","toggleLunch","ToggleButton","Lunch","difference","getMonday","getIsoYear","NotFound","App","ReactDOM","StrictMode","document","getElementById"],"mappings":"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","file":"static/js/main.ba871d7e.chunk.js","sourcesContent":["export const allRoutes = {\r\n start: '/',\r\n home: '/home',\r\n login: '/login',\r\n lunch: '/lunch',\r\n account: '/account',\r\n history: '/history',\r\n support: '/support',\r\n settings: '/settings',\r\n checkout: '/checkout',\r\n register: '/register',\r\n completeReset: '/complete-reset',\r\n favorites: '/favorites',\r\n confirmation: '/confirmation',\r\n};\r\n\r\nexport function getRouteParameter(name) {\r\n name = name.replace(/[[]/, '\\\\[').replace(/[\\]]/, '\\\\]');\r\n const regex = new RegExp(`[\\\\?&]${name}=([^&#]*)`);\r\n const results = regex.exec(window.location.search);\r\n return results === null ? '' : decodeURIComponent(results[1].replace(/\\+/g, ' '));\r\n}\r\n","const TOKEN_NAMESPACE = 'AUTH_TOKEN_BOXMEAL_SHOP';\r\nconst USER_NAMESPACE = 'AUTH_USER_BOXMEAL_SHOP';\r\n\r\nexport function getToken() {\r\n const token = localStorage.getItem(TOKEN_NAMESPACE) ?? null;\r\n return token === null ? null : JSON.parse(token);\r\n}\r\n\r\nexport function setToken(token) {\r\n localStorage.setItem(TOKEN_NAMESPACE, JSON.stringify(token));\r\n}\r\n\r\nexport function clearToken() {\r\n localStorage.removeItem(TOKEN_NAMESPACE);\r\n}\r\n\r\nexport function getUser() {\r\n const user = localStorage.getItem(USER_NAMESPACE) ?? null;\r\n return user === null ? null : JSON.parse(user);\r\n}\r\n\r\nexport function setUser(user) {\r\n localStorage.setItem(USER_NAMESPACE, JSON.stringify(user));\r\n}\r\n\r\nexport function clearUser() {\r\n localStorage.removeItem(USER_NAMESPACE);\r\n}\r\n","import { getToken } from './auth';\r\n\r\nexport const httpMethods = {\r\n GET: 'GET',\r\n POST: 'POST',\r\n};\r\n\r\nfunction wrapToken(options = {}) {\r\n const token = getToken();\r\n return {\r\n ...options,\r\n headers: {\r\n Authorization: `Bearer ${token.value}`,\r\n ...options.headers ?? {},\r\n },\r\n };\r\n}\r\n\r\nexport async function httpQuery(request, success, error) {\r\n try {\r\n const { url, options = {} } = request;\r\n const data = await fetch(url, options);\r\n const response = await data.json();\r\n return (success ? success(response) : response);\r\n } catch (errors) {\r\n return (error ? error(errors) : { errors });\r\n }\r\n}\r\n\r\nexport async function parallelHttpQuery(\r\n requests,\r\n success,\r\n error,\r\n) {\r\n try {\r\n const responses = await Promise.all(requests.map((r) => {\r\n const [url, options] = r;\r\n return httpQuery({ url, options });\r\n }));\r\n\r\n const data = {};\r\n for (let i = 0; i < requests.length; i += 1) {\r\n const [, , key] = requests[i];\r\n data[key] = responses[i];\r\n }\r\n\r\n return (success ? success(data) : data);\r\n } catch (errors) {\r\n return (error ? error(errors) : { errors });\r\n }\r\n}\r\n\r\nexport function authenticatedHttpQuery(request, success, error) {\r\n const { url, options = {} } = request;\r\n return httpQuery({ url, options: wrapToken(options) }, success, error);\r\n}\r\n\r\nexport async function authenticatedParallelHttpQuery(\r\n requests,\r\n success,\r\n error,\r\n) {\r\n return parallelHttpQuery(requests.map((r) => ([r[0], wrapToken(r[1]), r[2]])), success, error);\r\n}\r\n\r\nfunction getWait(wait) {\r\n return (typeof wait === 'function') ? wait() : wait;\r\n}\r\n\r\nfunction defer() {\r\n const deferred = {};\r\n deferred.promise = new Promise((resolve, reject) => {\r\n deferred.resolve = resolve;\r\n deferred.reject = reject;\r\n });\r\n return deferred;\r\n}\r\n\r\nexport function debounce(fn, wait = 0, options = {}) {\r\n let lastCallAt;\r\n let deferred;\r\n let timer;\r\n let pendingArgs = [];\r\n\r\n function flush() {\r\n const thisDeferred = deferred;\r\n clearTimeout(timer);\r\n\r\n Promise.resolve(\r\n options.accumulate\r\n ? fn.call(this, pendingArgs)\r\n : fn.apply(this, pendingArgs[pendingArgs.length - 1]),\r\n )\r\n .then(thisDeferred.resolve, thisDeferred.reject);\r\n\r\n pendingArgs = [];\r\n deferred = null;\r\n }\r\n\r\n return function debounced(...args) {\r\n const currentWait = getWait(wait);\r\n const currentTime = new Date().getTime();\r\n\r\n const isCold = !lastCallAt || (currentTime - lastCallAt) > currentWait;\r\n\r\n lastCallAt = currentTime;\r\n\r\n if (isCold && options.leading) {\r\n return options.accumulate\r\n ? Promise.resolve(fn.call(this, [args])).then((result) => result[0])\r\n : Promise.resolve(fn.call(this, ...args));\r\n }\r\n\r\n if (deferred) {\r\n clearTimeout(timer);\r\n } else {\r\n deferred = defer();\r\n }\r\n\r\n pendingArgs.push(args);\r\n timer = setTimeout(flush.bind(this), currentWait);\r\n\r\n if (options.accumulate) {\r\n const argsIndex = pendingArgs.length - 1;\r\n return deferred.promise.then((results) => results[argsIndex]);\r\n }\r\n\r\n return deferred.promise;\r\n };\r\n}\r\n","const NOTIFICATIONS_NAMESPACE = 'NOTIFICATIONS_BOXMEAL_SHOP';\r\n\r\nexport function getNotifications() {\r\n const notifications = localStorage.getItem(NOTIFICATIONS_NAMESPACE) ?? null;\r\n return notifications === null ? [] : JSON.parse(notifications);\r\n}\r\n\r\nexport function setNotifications(notifications) {\r\n localStorage.setItem(NOTIFICATIONS_NAMESPACE, JSON.stringify(notifications));\r\n}\r\n\r\nexport function clearNotifications() {\r\n localStorage.removeItem(NOTIFICATIONS_NAMESPACE);\r\n}\r\n","import React, { createContext, useState } from 'react';\r\nimport { getToken, getUser } from '../utils/auth';\r\n\r\nconst token = getToken();\r\nconst defaultAuthState = {\r\n user: getUser(),\r\n authenticating: false,\r\n authenticated: token !== null && new Date(token.validUntil) > new Date(),\r\n errors: [],\r\n};\r\n\r\nexport const AuthContext = createContext(defaultAuthState);\r\n\r\nexport default function AuthProvider({ children }) {\r\n const [state, setState] = useState(defaultAuthState);\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n}\r\n","const SHOP_NAMESPACE = 'STORE_BOXMEAL_SHOP';\r\n\r\nexport function getItems() {\r\n const shoppingBag = localStorage.getItem(SHOP_NAMESPACE) ?? null;\r\n return shoppingBag === null ? [] : JSON.parse(shoppingBag);\r\n}\r\n\r\nexport function setItems(shoppingBag) {\r\n localStorage.setItem(SHOP_NAMESPACE, JSON.stringify(shoppingBag));\r\n}\r\n\r\nexport function clearItems() {\r\n localStorage.removeItem(SHOP_NAMESPACE);\r\n}\r\n","import React, { createContext, useState } from 'react';\r\nimport { getItems } from '../utils/store';\r\n\r\nconst defaultItems = getItems() ?? [];\r\nexport const StoreContext = createContext(defaultItems);\r\n\r\nexport default function StoreProvider({ children }) {\r\n const [items, setItems] = useState(defaultItems);\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n}\r\n","import { useContext } from 'react';\r\nimport { setItems as setItemsInCache } from '../utils/store';\r\nimport { StoreContext } from '../contexts/StoreContext';\r\n\r\nexport default function useStore() {\r\n const { items, setItems } = useContext(StoreContext);\r\n\r\n function addItem(product) {\r\n const shoppingBag = [...items, product];\r\n setItems(shoppingBag);\r\n setItemsInCache(shoppingBag);\r\n }\r\n\r\n function removeItem(product) {\r\n const firstOccurrence = items.findIndex((p) => p.id === product.id);\r\n if (firstOccurrence !== -1) {\r\n const shoppingBag = items.filter((_, index) => index !== firstOccurrence);\r\n setItems(shoppingBag);\r\n setItemsInCache(shoppingBag);\r\n }\r\n }\r\n\r\n function clearItems() {\r\n const shoppingBag = [];\r\n setItems(shoppingBag);\r\n setItemsInCache(shoppingBag);\r\n }\r\n\r\n return {\r\n items,\r\n addItem,\r\n removeItem,\r\n clearItems,\r\n };\r\n}\r\n","import { useContext } from 'react';\r\nimport { httpMethods } from '../utils/http';\r\nimport {\r\n clearToken,\r\n clearUser,\r\n setToken,\r\n setUser,\r\n} from '../utils/auth';\r\nimport { clearNotifications } from '../utils/notifications';\r\nimport { AuthContext } from '../contexts/AuthContext';\r\nimport useStore from './useStore';\r\n\r\nexport default function useAuth() {\r\n const { state, setState } = useContext(AuthContext);\r\n const { clearItems } = useStore();\r\n\r\n function setUserDetails(user) {\r\n setUser(user);\r\n setState((prev) => ({\r\n ...prev,\r\n user,\r\n }));\r\n }\r\n\r\n function setPreferredUnit(defaultUnit) {\r\n setUser({\r\n ...state.user,\r\n defaultUnit,\r\n });\r\n\r\n setState((prev) => ({\r\n ...prev,\r\n user: {\r\n ...prev.user,\r\n defaultUnit,\r\n },\r\n }));\r\n }\r\n\r\n function logOut() {\r\n clearItems();\r\n\r\n clearNotifications();\r\n clearToken();\r\n clearUser();\r\n\r\n setState((prev) => ({\r\n ...prev,\r\n authenticating: false,\r\n authenticated: false,\r\n errors: [],\r\n }));\r\n }\r\n\r\n function setResult(result) {\r\n const {\r\n errors = ['Ett fel uppstod'],\r\n data = {},\r\n } = result || {};\r\n\r\n const success = errors.length === 0;\r\n if (success) {\r\n setToken(data.token);\r\n setUser(data.user);\r\n }\r\n\r\n setState((prev) => ({\r\n ...prev,\r\n user: data?.user ?? null,\r\n authenticating: false,\r\n authenticated: success,\r\n errors,\r\n }));\r\n }\r\n\r\n function setError() {\r\n setState((prev) => ({\r\n ...prev,\r\n authenticating: false,\r\n authenticated: false,\r\n errors: ['Ett fel uppstod'],\r\n }));\r\n }\r\n\r\n function setAuthenticated(data) {\r\n setToken(data.token);\r\n setUser(data.user);\r\n\r\n setState((prev) => ({\r\n ...prev,\r\n user: data.user ?? null,\r\n authenticating: false,\r\n authenticated: true,\r\n errors: [],\r\n }));\r\n }\r\n\r\n function logIn(email, password) {\r\n setState((prev) => ({\r\n ...prev,\r\n authenticating: true,\r\n authenticated: false,\r\n errors: [],\r\n }));\r\n\r\n const options = {\r\n method: httpMethods.POST,\r\n body: JSON.stringify({ email, password }),\r\n headers: { 'Content-Type': 'application/json' },\r\n };\r\n\r\n fetch('/api/users/login', options)\r\n .then((data) => data.json())\r\n .then((response) => setResult(response))\r\n .catch((errors) => setError(errors));\r\n }\r\n\r\n const {\r\n authenticating,\r\n authenticated,\r\n errors,\r\n user,\r\n } = state;\r\n\r\n return {\r\n setUserDetails,\r\n setPreferredUnit,\r\n setAuthenticated,\r\n authenticating,\r\n authenticated,\r\n errors,\r\n logOut,\r\n logIn,\r\n user,\r\n };\r\n}\r\n","import React from 'react';\r\nimport { Route, Redirect } from 'react-router-dom';\r\nimport { allRoutes } from '../../utils/routes';\r\nimport useAuth from '../../hooks/useAuth';\r\n\r\nexport default function PrivateRoute({\r\n path,\r\n exact,\r\n component,\r\n}) {\r\n const { authenticated } = useAuth();\r\n if (authenticated) {\r\n return (\r\n \r\n );\r\n }\r\n\r\n return (\r\n }\r\n />\r\n );\r\n}\r\n","import React from 'react';\r\nimport { Route, Redirect } from 'react-router-dom';\r\nimport { allRoutes } from '../../utils/routes';\r\nimport useAuth from '../../hooks/useAuth';\r\n\r\nexport default function PublicRoute({\r\n path,\r\n exact,\r\n component,\r\n}) {\r\n const { authenticated } = useAuth();\r\n if (authenticated) {\r\n return (\r\n }\r\n />\r\n\r\n );\r\n }\r\n\r\n return (\r\n \r\n );\r\n}\r\n","import React from 'react';\r\n\r\nexport default function LightButton({\r\n children,\r\n onClick,\r\n disabled = false,\r\n}) {\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n}\r\n","import React, { createContext, useState } from 'react';\r\n\r\nconst defaultModalState = {\r\n open: false,\r\n title: '',\r\n component: '',\r\n componentProps: {},\r\n};\r\n\r\nexport const ModalContext = createContext(defaultModalState);\r\n\r\nexport default function ModalProvider({ children }) {\r\n const [modal, setModal] = useState(defaultModalState);\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n}\r\n","import { useContext } from 'react';\r\nimport { ModalContext } from '../contexts/ModalContext';\r\n\r\nexport default function useModal() {\r\n const { modal, setModal } = useContext(ModalContext);\r\n\r\n function openModal({ title = '', component = '', componentProps = {} }) {\r\n setModal((m) => ({\r\n ...m,\r\n open: true,\r\n title,\r\n component,\r\n componentProps,\r\n }));\r\n }\r\n\r\n function closeModal() {\r\n setModal((m) => ({\r\n ...m,\r\n open: false,\r\n }));\r\n }\r\n\r\n const {\r\n open,\r\n title,\r\n component,\r\n componentProps,\r\n } = modal;\r\n\r\n return {\r\n open,\r\n openModal,\r\n closeModal,\r\n title,\r\n component,\r\n componentProps,\r\n };\r\n}\r\n","import { useRef, useEffect } from 'react';\r\n\r\nfunction deepEqual(x, y) {\r\n return (x && y && typeof x === 'object' && typeof y === 'object')\r\n ? (Object.keys(x).length === Object.keys(y).length)\r\n && Object.keys(x).reduce((isEqual, key) => isEqual && deepEqual(x[key], y[key]), true) : (x === y);\r\n}\r\n\r\nfunction useDeepCompareMemoize(value) {\r\n const ref = useRef();\r\n\r\n if (!deepEqual(value, ref.current)) {\r\n ref.current = value;\r\n }\r\n\r\n return ref.current;\r\n}\r\n\r\nexport default function useDeepEffect(callback, dependencies) {\r\n useEffect(callback, dependencies.map(useDeepCompareMemoize));\r\n}\r\n","import {\r\n useRef,\r\n useState,\r\n useEffect,\r\n useCallback,\r\n} from 'react';\r\nimport {\r\n httpQuery,\r\n parallelHttpQuery,\r\n authenticatedHttpQuery,\r\n authenticatedParallelHttpQuery,\r\n httpMethods,\r\n} from '../utils/http';\r\nimport useDeepEffect from './useDeepEffect';\r\n\r\nfunction useHttpQuerier(request, callback) {\r\n const [state, setState] = useState({\r\n data: {},\r\n error: false,\r\n loading: true,\r\n });\r\n\r\n const isLoading = useRef(state.loading);\r\n useEffect(() => { isLoading.current = state.loading; });\r\n\r\n useDeepEffect(() => {\r\n if (!isLoading.current) {\r\n setState((previous) => ({\r\n ...previous,\r\n loading: true,\r\n }));\r\n }\r\n\r\n function setResult(data) {\r\n setState({\r\n data,\r\n error: false,\r\n loading: false,\r\n });\r\n }\r\n\r\n function setError() {\r\n setState({\r\n error: true,\r\n loading: false,\r\n });\r\n }\r\n\r\n callback(request, setResult, setError);\r\n }, [request]);\r\n\r\n const {\r\n data,\r\n error,\r\n loading,\r\n } = state;\r\n\r\n const ready = !loading && !error;\r\n return {\r\n loading,\r\n error,\r\n ready,\r\n data,\r\n };\r\n}\r\n\r\nexport function useAuthenticatedHttpQuery(url, options) {\r\n return useHttpQuerier({ url, options }, authenticatedHttpQuery);\r\n}\r\n\r\nexport function useAuthenticatedParallelHttpQuery(requests) {\r\n return useHttpQuerier(requests, authenticatedParallelHttpQuery);\r\n}\r\n\r\nexport function useAuthenticatedHttpGet(url) {\r\n return useAuthenticatedHttpQuery(url, { method: httpMethods.GET });\r\n}\r\n\r\nexport function useAuthenticatedParallelHttpGet(requests) {\r\n return useAuthenticatedParallelHttpQuery(requests.map((r) => [r[0], { method: httpMethods.GET }, r[1]]));\r\n}\r\n\r\nexport function useHttpQuery(url, options) {\r\n return useHttpQuerier({ url, options }, httpQuery);\r\n}\r\n\r\nexport function useParallelHttpQuery(requests) {\r\n return useHttpQuerier(requests, parallelHttpQuery);\r\n}\r\n\r\nexport function useHttpGet(url) {\r\n return useHttpQuery(url, { method: httpMethods.GET });\r\n}\r\n\r\nexport function useParallelHttpGet(requests) {\r\n return useParallelHttpQuery(requests.map((r) => [r[0], { method: httpMethods.GET }, r[1]]));\r\n}\r\n\r\nconst initialTriggerState = {\r\n sending: false,\r\n result: {},\r\n error: false,\r\n done: false,\r\n};\r\n\r\nfunction useHttpQueryTriggerer(callback) {\r\n const [state, setState] = useState(initialTriggerState);\r\n\r\n function setResult(data) {\r\n setState({\r\n sending: false,\r\n result: data,\r\n error: false,\r\n done: true,\r\n });\r\n }\r\n\r\n function setError() {\r\n setState({\r\n sending: false,\r\n error: false,\r\n done: true,\r\n });\r\n }\r\n\r\n const trigger = useCallback((url, options) => {\r\n setState({ ...initialTriggerState, sending: true });\r\n callback({ url, options }, setResult, setError);\r\n }, []);\r\n\r\n const {\r\n sending,\r\n result,\r\n error,\r\n done,\r\n } = state;\r\n\r\n return {\r\n trigger,\r\n sending,\r\n result,\r\n error,\r\n done,\r\n };\r\n}\r\n\r\nexport function useHttpQueryTrigger() {\r\n return useHttpQueryTriggerer(httpQuery);\r\n}\r\n\r\nexport function useAuthenticatedHttpQueryTrigger() {\r\n return useHttpQueryTriggerer(authenticatedHttpQuery);\r\n}\r\n","export function toDateTimeString(d) {\r\n const options = {\r\n year: 'numeric',\r\n month: '2-digit',\r\n day: '2-digit',\r\n hour: 'numeric',\r\n minute: 'numeric',\r\n hour12: false,\r\n timeZone: 'Europe/Stockholm',\r\n };\r\n\r\n const datetime = new Intl.DateTimeFormat('sv-SE', options).format(d);\r\n const parts = datetime.split(' ');\r\n\r\n return `${parts[0]}T${parts[1]}`;\r\n}\r\n\r\nexport function toDateString(d) {\r\n const options = {\r\n year: 'numeric',\r\n month: '2-digit',\r\n day: '2-digit',\r\n timeZone: 'Europe/Stockholm',\r\n };\r\n\r\n return new Intl.DateTimeFormat('sv-SE', options).format(d);\r\n}\r\n\r\nexport function toDisplayDateTime(d) {\r\n return toDateTimeString(d).replace('T', ' ');\r\n}\r\n\r\nexport function toDisplayDate(d) {\r\n return toDateString(d).replace('T', ' ');\r\n}\r\n\r\nexport function getIsoWeek(date) {\r\n date.setHours(0, 0, 0, 0);\r\n // Thursday in current week decides the year.\r\n date.setDate(date.getDate() + 3 - ((date.getDay() + 6) % 7));\r\n // January 4 is always in week 1.\r\n const week1 = new Date(date.getFullYear(), 0, 4);\r\n // Adjust to Thursday in week 1 and count number of weeks from date to week1.\r\n return 1 + Math.round(((date.getTime() - week1.getTime()) / 86400000 - 3 + ((week1.getDay() + 6) % 7)) / 7);\r\n}\r\n\r\nexport function getIsoYear(date) {\r\n date.setDate(date.getDate() + 3 - ((date.getDay() + 6) % 7));\r\n return date.getFullYear();\r\n}\r\n\r\nexport function getMonday(date) {\r\n const day = date.getDay();\r\n // adjust when day is sunday\r\n const difference = date.getDate() - day + (day === 0 ? -6 : 1);\r\n return new Date(date.setDate(difference));\r\n}\r\n\r\nexport function addDaysToDate(date, days) {\r\n const newDate = new Date(date);\r\n newDate.setDate(newDate.getDate() + days);\r\n return newDate;\r\n}\r\n\r\nexport function addWeeksToDate(date, weeks) {\r\n const newDate = new Date(date);\r\n newDate.setDate(newDate.getDate() + weeks * 7);\r\n return newDate;\r\n}\r\n","export default function localeCurrency(amount = 0, minimumFractionDigits = 2, maximumFractionDigits = 2) {\r\n if (amount === null || amount === undefined) amount = 0;\r\n if (typeof amount === 'string') amount = parseInt(amount, 10);\r\n const options = {\r\n style: 'currency',\r\n currency: 'SEK',\r\n currencyDisplay: 'symbol',\r\n maximumFractionDigits,\r\n minimumFractionDigits,\r\n };\r\n\r\n return amount.toLocaleString('sv-SE', options);\r\n}\r\n","import React from 'react';\r\n\r\nexport default function TextField({\r\n name,\r\n value,\r\n onChange,\r\n onKeyDown,\r\n type = 'text',\r\n label = '',\r\n placeholder = '',\r\n disabled = false,\r\n autoComplete,\r\n}) {\r\n return (\r\n <>\r\n {label !== '' && (\r\n {label}\r\n )}\r\n \r\n \r\n );\r\n}\r\n","import React from 'react';\r\n\r\nexport default function GreenButton({\r\n children,\r\n onClick,\r\n disabled = false,\r\n}) {\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n}\r\n","import React from 'react';\r\n\r\nexport default function TextArea({\r\n name,\r\n value,\r\n onChange,\r\n onKeyDown,\r\n type = 'text',\r\n label = '',\r\n placeholder = '',\r\n rows = 4,\r\n disabled = false,\r\n}) {\r\n return (\r\n <>\r\n {label !== '' && (\r\n {label}\r\n )}\r\n \r\n \r\n );\r\n}\r\n","import React from 'react';\r\nimport BadgeCheckIcon from '@heroicons/react/outline/BadgeCheckIcon';\r\n\r\nexport default function Complete({ message = '' }) {\r\n return (\r\n
\r\n \r\n

{message}

\r\n

Du kan nu stänga ned rutan

\r\n
\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 \r\n
\r\n \r\n
\r\n

{title}

\r\n
\r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n {Component === undefined ? : }\r\n
\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

Hämtar order ...

\r\n )}\r\n {error && (\r\n

Ett fel uppstod

\r\n )}\r\n {ready && !error && data === null && (\r\n

Ordern kunde inte hittas

\r\n )}\r\n {ready && !error && data !== null && (\r\n
\r\n {data.unlockCode !== null && (\r\n \r\n )}\r\n

Totalpris

\r\n

{localeCurrency(data.totalPrice)}

\r\n

Datum och tid för order

\r\n

{toDisplayDateTime(new Date(data.createdAt))}

\r\n

Produkter

\r\n {data.orderLines.map((ol, index) => (\r\n

{`${index + 1}. ${ol.article.name} - ${localeCurrency(ol.price)} - ${ol.amount} st.`}

\r\n ))}\r\n
\r\n )}\r\n \r\n );\r\n}\r\n","import React, { useState } from 'react';\r\nimport TextField from '../Shared/TextField';\r\nimport TextArea from '../Shared/TextArea';\r\nimport GreenButton from '../Buttons/GreenButton';\r\nimport Complete from '../Shared/Complete';\r\nimport { useAuthenticatedHttpQueryTrigger } from '../../hooks/useHttp';\r\nimport { httpMethods } from '../../utils/http';\r\n\r\nexport default function Report() {\r\n const [title, setTitle] = useState('');\r\n const [description, setDescription] = useState('');\r\n\r\n const {\r\n trigger,\r\n sending,\r\n result,\r\n error,\r\n done,\r\n } = useAuthenticatedHttpQueryTrigger();\r\n\r\n function doSave() {\r\n const options = {\r\n method: httpMethods.POST,\r\n body: JSON.stringify({\r\n title,\r\n description,\r\n }),\r\n headers: { 'Content-Type': 'application/json' },\r\n };\r\n\r\n trigger('/api/reports/add', options);\r\n }\r\n\r\n const hasError = done && (error || (result?.hasError ?? true));\r\n const errorMessage = (result?.errors || ['Ett fel uppstod']).join(', ');\r\n\r\n return (\r\n
\r\n {(!done || hasError) && (\r\n <>\r\n setTitle(e.target.value)}\r\n value={title}\r\n />\r\n
\r\n setDescription(e.target.value)}\r\n value={description}\r\n />\r\n
\r\n {sending ? 'Skickar ...' : 'Skicka'}\r\n {hasError && (\r\n {errorMessage}\r\n )}\r\n\r\n
\r\n \r\n )}\r\n {done && !hasError && (\r\n \r\n )}\r\n
\r\n );\r\n}\r\n","import React from 'react';\r\n\r\nexport default function Info({ description }) {\r\n return (\r\n
\r\n

Produktbeskrivning

\r\n

{description}

\r\n
\r\n );\r\n}\r\n","import React, { useEffect, useState } from 'react';\r\nimport useAuth from '../../hooks/useAuth';\r\nimport TextField from '../Shared/TextField';\r\nimport GreenButton from '../Buttons/GreenButton';\r\nimport useModal from '../../hooks/useModal';\r\nimport { useAuthenticatedHttpQueryTrigger } from '../../hooks/useHttp';\r\nimport { httpMethods } from '../../utils/http';\r\n\r\nexport default function ChooseUnit() {\r\n const { user, setPreferredUnit } = useAuth();\r\n const { closeModal } = useModal();\r\n\r\n const {\r\n trigger,\r\n sending,\r\n result,\r\n error,\r\n done,\r\n } = useAuthenticatedHttpQueryTrigger();\r\n\r\n const [identifier, setIdentifier] = useState(user?.defaultUnit?.storeIdentifier ?? '');\r\n\r\n function updateIdentifier(e) {\r\n if (e.target.value.length <= 4) {\r\n setIdentifier(e.target.value.toUpperCase());\r\n }\r\n }\r\n\r\n function savePreferredUnit() {\r\n const options = {\r\n method: httpMethods.POST,\r\n body: JSON.stringify({ storeIdentifier: identifier }),\r\n headers: { 'Content-Type': 'application/json' },\r\n };\r\n\r\n trigger('/api/users/set-preferred-unit', options);\r\n }\r\n\r\n function handleSave() {\r\n if (done && !error) {\r\n const { hasError = true, data = {} } = result ?? {};\r\n if (!hasError) {\r\n setPreferredUnit(data);\r\n closeModal();\r\n }\r\n }\r\n }\r\n\r\n useEffect(handleSave, [done, error, result, closeModal, setPreferredUnit]);\r\n\r\n const hasError = done && (error || (result?.hasError ?? true));\r\n const errorMessage = (result?.errors || ['Ett fel uppstod']).join(', ');\r\n\r\n return (\r\n
\r\n \r\n
\r\n {sending ? 'Sparar ...' : 'Spara'}\r\n {hasError && (\r\n {errorMessage}\r\n )}\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 \"Bild\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 {children}\r\n
\r\n
\r\n
\r\n \r\n \r\n Butik\r\n \r\n \r\n \r\n Favoriter\r\n \r\n \r\n
\r\n {items.length > 0 && (\r\n
\r\n

{items.length}

\r\n
\r\n )}\r\n \r\n Kassa\r\n
\r\n \r\n {hasFood && (\r\n \r\n \r\n Lunch\r\n \r\n )}\r\n \r\n \r\n Konto\r\n \r\n
\r\n
\r\n \r\n );\r\n}\r\n","import React from 'react';\r\n\r\nexport default function UnauthenticatedLayout({ children }) {\r\n return (\r\n <>\r\n
\r\n
\r\n \r\n
\r\n
\r\n {children}\r\n \r\n );\r\n}\r\n","import React from 'react';\r\nimport Modal from '../Shared/Modal';\r\nimport useAuth from '../../hooks/useAuth';\r\nimport AuthenticatedLayout from './AuthenticatedLayout';\r\nimport UnauthenticatedLayout from './UnauthenticatedLayout';\r\n\r\nexport default function Layout({ children }) {\r\n const { authenticated } = useAuth();\r\n const Wrapper = authenticated\r\n ? AuthenticatedLayout\r\n : UnauthenticatedLayout;\r\n\r\n return (\r\n <>\r\n \r\n {children}\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 LightButton from '../../components/Buttons/LightButton';\r\nimport { allRoutes } from '../../utils/routes';\r\n\r\nexport default function Start() {\r\n const history = useHistory();\r\n return (\r\n <>\r\n \"Människa\r\n
\r\n history.push(allRoutes.login)}>Logga in\r\n
\r\n history.push(allRoutes.register)}>Registrera konto\r\n
\r\n \r\n );\r\n}\r\n","const keyCodes = {\r\n enter: 'Enter',\r\n};\r\n\r\nexport default keyCodes;\r\n","import React, { useEffect, useState } from 'react';\r\nimport { useHistory } from 'react-router-dom';\r\nimport { allRoutes, getRouteParameter } from '../../utils/routes';\r\nimport GreenButton from '../../components/Buttons/GreenButton';\r\nimport LightButton from '../../components/Buttons/LightButton';\r\nimport TextField from '../../components/Shared/TextField';\r\nimport useAuth from '../../hooks/useAuth';\r\nimport keyCodes from '../../utils/events';\r\n\r\nexport default function LogInForm({ goToReset }) {\r\n const history = useHistory();\r\n\r\n const {\r\n authenticating,\r\n authenticated,\r\n errors,\r\n logIn,\r\n } = useAuth();\r\n\r\n const [credentials, setCredentials] = useState({\r\n email: '',\r\n password: '',\r\n });\r\n\r\n function doLogIn() {\r\n logIn(credentials.email, credentials.password);\r\n }\r\n\r\n function checkKey(e) {\r\n if (e.key === keyCodes.enter) {\r\n doLogIn();\r\n }\r\n }\r\n\r\n function setEmail(e) {\r\n setCredentials((cred) => ({\r\n ...cred,\r\n email: e.target.value,\r\n }));\r\n }\r\n\r\n function setPassword(e) {\r\n setCredentials((cred) => ({\r\n ...cred,\r\n password: e.target.value,\r\n }));\r\n }\r\n\r\n function handleLogin() {\r\n if (authenticated) {\r\n const redirect = getRouteParameter('redirect') ?? '';\r\n history.push(redirect === '' ? allRoutes.home : redirect);\r\n }\r\n }\r\n\r\n useEffect(handleLogin, [history, authenticated]);\r\n\r\n return (\r\n <>\r\n \r\n
\r\n \r\n
\r\n {authenticating ? 'Skickar ...' : 'Logga in'}\r\n {errors.length !== 0 && (\r\n {errors.join(', ')}\r\n )}\r\n
\r\n history.push(allRoutes.register)} disabled={authenticating}>Registrera\r\n \r\n Återställ lösenord\r\n \r\n
\r\n \r\n );\r\n}\r\n","import React from 'react';\r\n\r\nexport default function LightAlert({ children }) {\r\n return (\r\n
{children}
\r\n );\r\n}\r\n","import React, { useState, useEffect } from 'react';\r\nimport LightAlert from '../../components/Alerts/LightAlert';\r\nimport GreenButton from '../../components/Buttons/GreenButton';\r\nimport LightButton from '../../components/Buttons/LightButton';\r\nimport TextField from '../../components/Shared/TextField';\r\nimport { useHttpQueryTrigger } from '../../hooks/useHttp';\r\nimport keyCodes from '../../utils/events';\r\nimport { httpMethods } from '../../utils/http';\r\n\r\nconst views = { RESET: 'RESET', COMPLETE: 'COMPLETE' };\r\nexport default function ResetForm({ goToLogIn }) {\r\n const [view, setView] = useState(views.RESET);\r\n const [email, setEmail] = useState('');\r\n\r\n const {\r\n trigger,\r\n sending,\r\n result,\r\n error,\r\n done,\r\n } = useHttpQueryTrigger();\r\n\r\n function doReset() {\r\n const options = {\r\n method: httpMethods.POST,\r\n body: JSON.stringify({ email }),\r\n headers: { 'Content-Type': 'application/json' },\r\n };\r\n\r\n trigger('/api/users/reset-password', options);\r\n }\r\n\r\n function checkKey(e) {\r\n if (e.key === keyCodes.enter) {\r\n doReset();\r\n }\r\n }\r\n\r\n const hasError = done && (error || (result?.hasError ?? true));\r\n const errorMessage = (result?.errors || ['Ett fel uppstod']).join(', ');\r\n\r\n function handleCompletion() {\r\n if (done && !error) {\r\n if (!(result?.hasError ?? true)) {\r\n setView(views.COMPLETE);\r\n }\r\n }\r\n }\r\n\r\n useEffect(handleCompletion, [done, error, result, setView]);\r\n\r\n return (\r\n <>\r\n {view === views.RESET && (\r\n <>\r\n setEmail(e.target.value)}\r\n onKeyDown={checkKey}\r\n label=\"E-post\"\r\n placeholder=\"din-mail@gmail.com\"\r\n className=\"mb-3\"\r\n />\r\n
\r\n {sending ? 'Återställer ...' : 'Återställ'}\r\n {hasError && (\r\n {errorMessage}\r\n )}\r\n
\r\n Logga in istället\r\n
\r\n \r\n )}\r\n {view === views.COMPLETE && (\r\n <>\r\n \r\n

Ett mail har skickats!

\r\n

Kolla din mail och gå in på länken

\r\n
\r\n
\r\n Gå till inlogg\r\n \r\n )}\r\n \r\n );\r\n}\r\n","import React, { useState } from 'react';\r\nimport LogInForm from './LogInForm';\r\nimport ResetForm from './ResetForm';\r\n\r\nconst views = { LOGIN: 'LOGIN', RESET: 'RESET' };\r\nexport default function Login() {\r\n const [view, setView] = useState(views.LOGIN);\r\n const goToLogIn = () => setView(views.LOGIN);\r\n const goToReset = () => setView(views.RESET);\r\n\r\n return (\r\n
\r\n {view === views.LOGIN && }\r\n {view === views.RESET && }\r\n
\r\n );\r\n}\r\n","import React, { useState, useEffect } from 'react';\r\nimport { useHistory } from 'react-router-dom';\r\nimport { useHttpQueryTrigger } from '../../hooks/useHttp';\r\nimport { allRoutes, getRouteParameter } from '../../utils/routes';\r\nimport GreenButton from '../../components/Buttons/GreenButton';\r\nimport LightButton from '../../components/Buttons/LightButton';\r\nimport TextField from '../../components/Shared/TextField';\r\nimport useAuth from '../../hooks/useAuth';\r\nimport keyCodes from '../../utils/events';\r\nimport { httpMethods } from '../../utils/http';\r\n\r\nexport default function CompleteReset() {\r\n const history = useHistory();\r\n const { setAuthenticated } = useAuth();\r\n const [password, setPassword] = useState('');\r\n\r\n function goToLogIn() {\r\n history.push(allRoutes.login);\r\n }\r\n\r\n const {\r\n trigger,\r\n sending,\r\n result,\r\n error,\r\n done,\r\n } = useHttpQueryTrigger();\r\n\r\n function doPasswordReset() {\r\n const options = {\r\n method: httpMethods.POST,\r\n body: JSON.stringify({ password }),\r\n headers: { 'Content-Type': 'application/json' },\r\n };\r\n\r\n const token = getRouteParameter('token');\r\n trigger(`/api/users/complete-password-reset/${token}`, options);\r\n }\r\n\r\n function checkKey(e) {\r\n if (e.key === keyCodes.enter) {\r\n doPasswordReset();\r\n }\r\n }\r\n\r\n const hasError = done && (error || (result?.hasError ?? true));\r\n const errorMessage = (result?.errors || ['Ett fel uppstod']).join(', ');\r\n\r\n function handleLogin() {\r\n if (done && !error) {\r\n if (!(result?.hasError ?? true)) {\r\n setAuthenticated(result.data);\r\n history.push(allRoutes.home);\r\n }\r\n }\r\n }\r\n\r\n useEffect(handleLogin, [done, error, result, history, setAuthenticated]);\r\n\r\n return (\r\n
\r\n setPassword(e.target.value)}\r\n onKeyDown={checkKey}\r\n label=\"Nytt lösenord\"\r\n placeholder=\"Nytt lösenord\"\r\n autoComplete=\"new-password\"\r\n />\r\n
\r\n {sending ? 'Återställer ...' : 'Återställ'}\r\n {hasError && (\r\n {errorMessage}\r\n )}\r\n
\r\n Logga in istället\r\n
\r\n
\r\n );\r\n}\r\n","import React, { useEffect, useState } from 'react';\r\nimport { useHistory } from 'react-router-dom';\r\nimport { Switch } from '@headlessui/react';\r\nimport GreenButton from '../../components/Buttons/GreenButton';\r\nimport LightButton from '../../components/Buttons/LightButton';\r\nimport TextField from '../../components/Shared/TextField';\r\nimport { useHttpQueryTrigger } from '../../hooks/useHttp';\r\nimport { allRoutes } from '../../utils/routes';\r\nimport useAuth from '../../hooks/useAuth';\r\nimport useModal from '../../hooks/useModal';\r\nimport { httpMethods } from '../../utils/http';\r\n\r\nexport default function Register() {\r\n const { setAuthenticated } = useAuth();\r\n const { openModal } = useModal();\r\n const history = useHistory();\r\n\r\n const [user, editUser] = useState({\r\n givenName: '',\r\n surname: '',\r\n phoneNumber: '',\r\n email: '',\r\n password: '',\r\n passwordRepeat: '',\r\n preferredStoreIdentifier: '',\r\n readTerms: false,\r\n });\r\n\r\n function editDetails(e) {\r\n const { name, value } = e.target;\r\n editUser((u) => ({\r\n ...u,\r\n [name]: value,\r\n }));\r\n }\r\n\r\n function editPreferredStoreIdentifier(e) {\r\n const { value } = e.target;\r\n if (value.length <= 4) {\r\n editUser((u) => ({\r\n ...u,\r\n preferredStoreIdentifier: value.toUpperCase(),\r\n }));\r\n }\r\n }\r\n\r\n function setReadTerms(readTerms) {\r\n editUser((u) => ({\r\n ...u,\r\n readTerms,\r\n }));\r\n }\r\n\r\n const {\r\n trigger,\r\n sending,\r\n result,\r\n error,\r\n done,\r\n } = useHttpQueryTrigger();\r\n\r\n function doRegister() {\r\n const options = {\r\n method: httpMethods.POST,\r\n body: JSON.stringify({\r\n givenName: user.givenName,\r\n surname: user.surname,\r\n phoneNumber: user.phoneNumber,\r\n email: user.email,\r\n password: user.password,\r\n preferredStoreIdentifier: user.preferredStoreIdentifier,\r\n }),\r\n headers: { 'Content-Type': 'application/json' },\r\n };\r\n\r\n trigger('/api/users/register', options);\r\n }\r\n\r\n const hasError = done && (error || (result?.hasError ?? true));\r\n const errorMessage = (result?.errors || ['Ett fel uppstod']).join(', ');\r\n\r\n function handleCompletion() {\r\n if (done && !error) {\r\n if (!(result?.hasError ?? true)) {\r\n setAuthenticated(result.data);\r\n history.push(allRoutes.home);\r\n }\r\n }\r\n }\r\n\r\n useEffect(handleCompletion, [done, error, result, setAuthenticated, history]);\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
\r\n \r\n
\r\n
\r\n \r\n Godkänn villkor\r\n \r\n \r\n
\r\n
\r\n \r\n Jag godkänner Boxmeals openModal({ title: 'Allmänna villkor', component: 'termsOfAgreement' })} className=\"underline\">allmänna villkor\r\n \r\n
\r\n
\r\n
\r\n {sending ? 'Registrerar ...' : 'Registrera'}\r\n {hasError && (\r\n {errorMessage}\r\n )}\r\n
\r\n history.push(allRoutes.login)} disabled={sending}>Logga in istället\r\n
\r\n
\r\n );\r\n}\r\n","import { useEffect } from 'react';\r\n\r\nfunction usePolling(poll, ms = 2000) {\r\n useEffect(() => {\r\n const interval = setInterval(() => {\r\n poll();\r\n }, ms);\r\n\r\n return () => clearInterval(interval);\r\n }, []);\r\n}\r\n\r\nexport default usePolling;\r\n","import React from 'react';\r\nimport { notificationStatus } from '../../utils/enums';\r\n\r\nexport default function Preview({\r\n message,\r\n status,\r\n}) {\r\n return (\r\n
\r\n {status === notificationStatus.unseen.value && (\r\n
\r\n )}\r\n

{message.length > 30 ? `${message.slice(0, 30)} ...` : message}

\r\n
\r\n );\r\n}\r\n","import React from 'react';\r\nimport { Menu } from '@headlessui/react';\r\nimport Preview from '../Notifications/Preview';\r\nimport { notificationStatus } from '../../utils/enums';\r\nimport { authenticatedHttpQuery, httpMethods } from '../../utils/http';\r\nimport useModal from '../../hooks/useModal';\r\n\r\nexport default function Notification({\r\n id,\r\n status,\r\n message,\r\n imageUrl,\r\n}) {\r\n const { openModal } = useModal();\r\n\r\n function openNotification() {\r\n if (id) {\r\n if (status !== notificationStatus.clicked.value) {\r\n authenticatedHttpQuery({ url: `/api/notifications/clicked/${id}`, options: { method: httpMethods.POST } });\r\n }\r\n\r\n openModal({\r\n title: `Notis #${id}`,\r\n component: 'notification',\r\n componentProps: { imageUrl, message },\r\n });\r\n }\r\n }\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","import React, { useEffect, useState } from 'react';\r\nimport { Menu } from '@headlessui/react';\r\nimport BellIcon from '@heroicons/react/outline/BellIcon';\r\nimport usePolling from '../../hooks/usePolling';\r\nimport { authenticatedHttpQuery, httpMethods } from '../../utils/http';\r\nimport { notificationStatus } from '../../utils/enums';\r\nimport Notification from './Notification';\r\nimport { getNotifications, setNotifications } from '../../utils/notifications';\r\n\r\nexport default function Notifications() {\r\n const [notifications, setLocalNotifications] = useState(getNotifications());\r\n\r\n function openNotifications() {\r\n if (notifications.filter((n) => n.status === notificationStatus.unseen.value).length === 0) return;\r\n authenticatedHttpQuery({ url: '/api/notifications/seen', options: { method: httpMethods.POST } });\r\n\r\n const notificationsToSet = notifications.map((n) => ({\r\n ...n,\r\n status: notificationStatus.seen.value,\r\n }));\r\n\r\n setNotifications(notificationsToSet);\r\n setLocalNotifications(notificationsToSet);\r\n }\r\n\r\n async function setNotificationsOnLoad() {\r\n const data = await authenticatedHttpQuery({ url: '/api/notifications/all', options: { method: httpMethods.GET } });\r\n const { errors = [] } = data;\r\n\r\n if (errors.length === 0) {\r\n setNotifications(data);\r\n setLocalNotifications(data);\r\n }\r\n }\r\n\r\n async function pollNotifications() {\r\n const data = await authenticatedHttpQuery({ url: '/api/notifications/all', options: { method: httpMethods.GET } });\r\n const { errors = [] } = data;\r\n\r\n if (errors.length === 0) {\r\n let set = false;\r\n for (let i = 0; i < data.length; i += 1) {\r\n const notification = notifications.find((n) => n.id === data[i].id);\r\n if (notification) {\r\n if (notification.status !== data[i].status || notification.message !== data[i].message || notification.imageUrl !== data[i].imageUrl) {\r\n set = true;\r\n }\r\n } else {\r\n set = true;\r\n }\r\n }\r\n\r\n if (set) {\r\n setNotifications(data);\r\n setLocalNotifications(data);\r\n }\r\n }\r\n }\r\n\r\n usePolling(pollNotifications, 10 * 1000);\r\n useEffect(setNotificationsOnLoad, []);\r\n\r\n return (\r\n
\r\n {notifications.filter((n) => n.status === notificationStatus.unseen.value).length > 0 && (\r\n
\r\n )}\r\n \r\n
\r\n \r\n
\r\n \r\n
\r\n
\r\n
\r\n \r\n {notifications.length === 0 && (\r\n \r\n )}\r\n {notifications.length !== 0 && notifications.map((n) => (\r\n \r\n ))}\r\n \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 {product.article.name}\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 {products.map((p) => (\r\n \r\n ))}\r\n
\r\n );\r\n}\r\n\r\nexport default function Category({ name, products }) {\r\n const [open, setOpen] = useState(false);\r\n const toggleOpen = () => setOpen((o) => !o);\r\n\r\n return (\r\n <>\r\n {products.length > 2 && (\r\n <>\r\n
\r\n
\r\n
\r\n

{name}

\r\n
\r\n
\r\n {open ? : }\r\n
\r\n
\r\n
\r\n \r\n \r\n )}\r\n {products.length <= 2 && (\r\n <>\r\n
\r\n

{name}

\r\n
\r\n \r\n \r\n )}\r\n \r\n );\r\n}\r\n","import React from 'react';\r\nimport LatestOrder from '../../components/Layout/LatestOrder';\r\nimport Category from './Category';\r\n\r\nexport default function Overview({ products }) {\r\n const categories = products\r\n .map((p) => p.article.category)\r\n .filter((value, index, self) => self.indexOf(value) === index);\r\n\r\n return (\r\n <>\r\n {categories.map((category, index) => (\r\n p.article.category === category)}\r\n />\r\n ))}\r\n \r\n \r\n );\r\n}\r\n","import React from 'react';\r\nimport useAuth from '../../hooks/useAuth';\r\nimport Message from './Message';\r\nimport { useAuthenticatedHttpGet } from '../../hooks/useHttp';\r\nimport Overview from './Overview';\r\n\r\nexport default function Unit() {\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/${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 Message from './Message';\r\nimport Unit from './Unit';\r\nimport useAuth from '../../hooks/useAuth';\r\n\r\nexport default function Home() {\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 {hasChosenUnit && }\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 history.push(allRoutes.history)}>\r\n
\r\n
\r\n Köphistorik\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n history.push(allRoutes.support)}>\r\n
\r\n
\r\n Support\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n history.push(allRoutes.settings)}>\r\n
\r\n
\r\n Dina inställningar\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n Logga ut\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

Har du valt alla produkter du vill köpa?

\r\n Ja\r\n
\r\n Nej\r\n
\r\n );\r\n}\r\n","import React, { useEffect } from 'react';\r\nimport GreenButton from '../../components/Buttons/GreenButton';\r\nimport { getToken } from '../../utils/auth';\r\nimport { allRoutes } from '../../utils/routes';\r\n\r\nexport default function Payment({\r\n orderId,\r\n token,\r\n}) {\r\n const redirectUrl = `swish://paymentrequest?token=${token}&callbackurl=${window.location.origin}${allRoutes.confirmation}/${orderId}?token=${getToken().value}`;\r\n const openSwish = () => { window.location = redirectUrl; };\r\n\r\n useEffect(() => {\r\n const redirect = setTimeout(() => {\r\n window.location = redirectUrl;\r\n }, 1000);\r\n\r\n return () => clearTimeout(redirect);\r\n }, [redirectUrl]);\r\n\r\n return (\r\n <>\r\n

Swish borde öppnas automatiskt, men om inte så kan du öppna Swish genom att trycka på knappen nedan!

\r\n Öppna Swish\r\n \r\n );\r\n}\r\n","import React from 'react';\r\nimport MinusIcon from '@heroicons/react/outline/MinusIcon';\r\nimport PlusIcon from '@heroicons/react/outline/PlusIcon';\r\nimport useStore from '../../hooks/useStore';\r\n\r\nexport default function Item({ product }) {\r\n const {\r\n items,\r\n addItem,\r\n removeItem,\r\n } = useStore();\r\n\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 removeItemFromBag() {\r\n removeItem(product);\r\n }\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 {product.article.name}\r\n
\r\n

{`${amountInBag} x ${product.article.name}`}

\r\n

{`${amountInBag} x ${product.article.price} :-`}

\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, { useEffect } from 'react';\r\nimport useStore from '../../hooks/useStore';\r\nimport GreenButton from '../../components/Buttons/GreenButton';\r\nimport Item from './Item';\r\nimport { useAuthenticatedHttpQueryTrigger } from '../../hooks/useHttp';\r\nimport { httpMethods } from '../../utils/http';\r\n\r\nexport default function Items({ setOrder }) {\r\n const { items, clearItems } = useStore();\r\n\r\n const products = [];\r\n for (let i = 0; i < items.length; i += 1) {\r\n if (!products.some((p) => p.id === items[i].id)) {\r\n products.push(items[i]);\r\n }\r\n }\r\n\r\n const {\r\n trigger,\r\n sending,\r\n result,\r\n error,\r\n done,\r\n } = useAuthenticatedHttpQueryTrigger();\r\n\r\n function makeOrder() {\r\n const purchase = [];\r\n for (let i = 0; i < items.length; i += 1) {\r\n const index = purchase.findIndex(((p) => p.productId === items[i].id));\r\n\r\n if (index === -1) {\r\n purchase.push({\r\n productId: items[i].id,\r\n amount: 1,\r\n });\r\n } else {\r\n purchase[index].amount += 1;\r\n }\r\n }\r\n\r\n const options = {\r\n method: httpMethods.POST,\r\n body: JSON.stringify({ products: purchase }),\r\n headers: { 'Content-Type': 'application/json' },\r\n };\r\n\r\n trigger('/api/orders/add', options);\r\n }\r\n\r\n const hasError = done && (error || (result?.hasError ?? true));\r\n const errorMessage = (result?.errors || ['Ett fel uppstod']).join(', ');\r\n\r\n function handleOrder() {\r\n if (done && !error) {\r\n if (!(result?.hasError ?? true)) {\r\n setOrder(result.data.id, result.data.token);\r\n }\r\n }\r\n }\r\n\r\n useEffect(handleOrder, [done, error, result, setOrder]);\r\n\r\n return (\r\n <>\r\n {products.map((p) => (\r\n \r\n ))}\r\n
\r\n \r\n Rensa varukorg\r\n \r\n
\r\n

{`Totalt: ${items.map((p) => p.article.price).reduce((a, b) => a + b, 0)} :-`}

\r\n {sending ? 'Skickar till Swish ...' : 'Betala med Swish'}\r\n {hasError && (\r\n {errorMessage}\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, { useState } from 'react';\r\nimport { useHistory } from 'react-router-dom';\r\nimport AuthenticatedTopMenu from '../../components/Layout/AuthenticatedTopMenu';\r\nimport HeaderMessage from '../../components/Layout/HeaderMessage';\r\nimport useStore from '../../hooks/useStore';\r\nimport AreYouSure from './AreYouSure';\r\nimport Payment from './Payment';\r\nimport Items from './Items';\r\nimport Message from './Message';\r\nimport { allRoutes } from '../../utils/routes';\r\n\r\nconst views = {\r\n ARE_YOU_SURE: 'ARE_YOU_SURE',\r\n CHECKOUT: 'CHECKOUT',\r\n PAYMENT: 'PAYMENT',\r\n};\r\n\r\nexport default function Checkout() {\r\n const history = useHistory();\r\n\r\n const [state, setState] = useState({\r\n view: Math.floor(Math.random() * 4) !== 0 ? views.CHECKOUT : views.ARE_YOU_SURE,\r\n orderId: null,\r\n token: '',\r\n });\r\n\r\n function goToCheckout() {\r\n setState((prev) => ({\r\n ...prev,\r\n view: views.CHECKOUT,\r\n }));\r\n }\r\n\r\n function setOrder(orderId, token) {\r\n setState((prev) => ({\r\n ...prev,\r\n view: views.PAYMENT,\r\n orderId,\r\n token,\r\n }));\r\n }\r\n\r\n function goToAssortment() {\r\n history.push(allRoutes.home);\r\n }\r\n\r\n const { items } = useStore();\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n
\r\n {state.view === views.ARE_YOU_SURE && (\r\n \r\n )}\r\n {state.view === views.CHECKOUT && (\r\n <>\r\n {items.length === 0 && }\r\n {items.length > 0 && }\r\n \r\n )}\r\n {state.view === views.PAYMENT && (\r\n \r\n )}\r\n
\r\n \r\n );\r\n}\r\n","import React, { useState, useEffect } from 'react';\r\nimport { useHistory } from 'react-router-dom';\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 TextField from '../../components/Shared/TextField';\r\nimport useAuth from '../../hooks/useAuth';\r\nimport { useAuthenticatedHttpQueryTrigger } from '../../hooks/useHttp';\r\nimport { httpMethods } from '../../utils/http';\r\nimport { allRoutes } from '../../utils/routes';\r\n\r\nexport default function Settings() {\r\n const { user, setUserDetails } = useAuth();\r\n const history = useHistory();\r\n\r\n const [details, setDetails] = useState({\r\n email: user?.email ?? '',\r\n givenName: user?.givenName ?? '',\r\n surname: user?.surname ?? '',\r\n phoneNumber: user?.phoneNumber ?? '',\r\n preferredStoreIdentifier: user?.defaultUnit?.storeIdentifier ?? '',\r\n });\r\n\r\n function editDetails(e) {\r\n const { name, value } = e.target;\r\n setDetails((u) => ({\r\n ...u,\r\n [name]: value,\r\n }));\r\n }\r\n\r\n function editPreferredStoreIdentifier(e) {\r\n if (e.target.value.length <= 4) {\r\n setDetails((u) => ({\r\n ...u,\r\n preferredStoreIdentifier: e.target.value.toUpperCase(),\r\n }));\r\n }\r\n }\r\n\r\n const {\r\n trigger,\r\n sending,\r\n result,\r\n error,\r\n done,\r\n } = useAuthenticatedHttpQueryTrigger();\r\n\r\n function doUpdate() {\r\n const options = {\r\n method: httpMethods.POST,\r\n body: JSON.stringify(details),\r\n headers: { 'Content-Type': 'application/json' },\r\n };\r\n\r\n trigger('/api/users/edit-profile', options);\r\n }\r\n\r\n function handleSave() {\r\n if (done && !error) {\r\n const { hasError = true, data = {} } = result ?? {};\r\n if (!hasError) {\r\n setUserDetails(data);\r\n }\r\n }\r\n }\r\n\r\n useEffect(handleSave, [done]);\r\n\r\n const hasError = done && (error || (result?.hasError ?? true));\r\n const errorMessage = (result?.errors || ['Ett fel uppstod']).join(', ');\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
\r\n \r\n
\r\n {sending ? 'Sparar ...' : 'Spara'}\r\n {hasError && (\r\n {errorMessage}\r\n )}\r\n {done && !hasError && (\r\n Sparat!\r\n )}\r\n
\r\n history.push(allRoutes.account)}>Gå tillbaka\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 { 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

{title}

\r\n
\r\n
\r\n
\r\n {open ? : }\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\nexport default function Support() {\r\n const history = useHistory();\r\n const { openModal } = useModal();\r\n\r\n const {\r\n loading,\r\n error,\r\n ready,\r\n data,\r\n } = useAuthenticatedHttpGet('/api/faq/all');\r\n\r\n function openReport() {\r\n openModal({\r\n title: 'Rapportera ett fel',\r\n component: 'report',\r\n });\r\n }\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n
\r\n {loading && (\r\n

Hämtar dina ordrar ...

\r\n )}\r\n {ready && error && (\r\n

Du har inga sparade ordrar

\r\n )}\r\n {ready && !error && data === null && (\r\n

Frågorna kunde inte hittas

\r\n )}\r\n {ready && !error && data !== null && (data ?? []).length === 0 && (\r\n

Det finns inga vanliga frågor än så länge

\r\n )}\r\n {ready && !error && data !== null && (data ?? []).length !== 0 && (data ?? []).map((q) => (\r\n
\r\n \r\n

{q.answer}

\r\n
\r\n
\r\n ))}\r\n
\r\n Rapportera ett fel\r\n
\r\n history.push(allRoutes.account)}>Gå tillbaka\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 LightButton from '../../components/Buttons/LightButton';\r\nimport AuthenticatedTopMenu from '../../components/Layout/AuthenticatedTopMenu';\r\nimport HeaderMessage from '../../components/Layout/HeaderMessage';\r\nimport { useAuthenticatedHttpGet } from '../../hooks/useHttp';\r\nimport { allRoutes } from '../../utils/routes';\r\nimport { toDisplayDate } from '../../utils/datetime';\r\nimport localeCurrency from '../../utils/numbers';\r\nimport useModal from '../../hooks/useModal';\r\n\r\nexport default function History() {\r\n const history = useHistory();\r\n const { openModal } = useModal();\r\n\r\n function openOrder(id) {\r\n openModal({\r\n title: `Order #${id}`,\r\n component: 'order',\r\n componentProps: { id },\r\n });\r\n }\r\n\r\n const {\r\n loading,\r\n error,\r\n ready,\r\n data,\r\n } = useAuthenticatedHttpGet('/api/orders');\r\n const orders = data ?? [];\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n
\r\n {loading && (\r\n

Hämtar dina ordrar ...

\r\n )}\r\n {ready && error && (\r\n

Du har inga sparade ordrar

\r\n )}\r\n {ready && !error && (\r\n <>\r\n {orders.length === 0 && (\r\n

Du har inga sparade ordrar

\r\n )}\r\n {orders.length > 0 && orders.map((order) => (\r\n
\r\n openOrder(order.id)}>\r\n
\r\n
\r\n {toDisplayDate(new Date(order.createdAt))}\r\n
\r\n
\r\n
\r\n {localeCurrency(order.totalPrice)}\r\n
\r\n
\r\n \r\n
\r\n ))}\r\n \r\n )}\r\n
\r\n history.push(allRoutes.account)}>Gå tillbaka\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 {state.view === views.PENDING && (\r\n \r\n )}\r\n {state.view === views.ERROR && (\r\n \r\n )}\r\n {state.view === views.COMPLETE && (\r\n \r\n )}\r\n
\r\n \r\n );\r\n}\r\n","import React, { useState } from 'react';\r\nimport BadgeCheckIcon from '@heroicons/react/outline/BadgeCheckIcon';\r\nimport CheckCircleIcon from '@heroicons/react/outline/CheckCircleIcon';\r\nimport XCircleIcon from '@heroicons/react/outline/XCircleIcon';\r\nimport GreenButton from '../../components/Buttons/GreenButton';\r\nimport { useAuthenticatedHttpQueryTrigger } from '../../hooks/useHttp';\r\nimport { httpMethods } from '../../utils/http';\r\nimport {\r\n getIsoWeek,\r\n toDisplayDate,\r\n addDaysToDate,\r\n addWeeksToDate,\r\n} from '../../utils/datetime';\r\n\r\nconst weekdays = (monday) => [\r\n { day: 1, description: `Måndag, ${toDisplayDate(monday)}` },\r\n { day: 2, description: `Tisdag, ${toDisplayDate(addDaysToDate(monday, 1))}` },\r\n { day: 3, description: `Onsdag, ${toDisplayDate(addDaysToDate(monday, 2))}` },\r\n { day: 4, description: `Torsdag, ${toDisplayDate(addDaysToDate(monday, 3))}` },\r\n { day: 5, description: `Fredag, ${toDisplayDate(addDaysToDate(monday, 4))}` },\r\n];\r\n\r\nexport default function SaveLunch({\r\n year,\r\n week,\r\n monday,\r\n bookedLunches,\r\n}) {\r\n const [lunches, setLunches] = useState(weekdays(monday).map((w) => ({\r\n ...w,\r\n isBooked: bookedLunches.find((b) => b.day === w.day)?.isBooked ?? false,\r\n })));\r\n\r\n function toggleLunch(day) {\r\n const copy = [...lunches];\r\n const index = copy.findIndex((l) => l.day === day);\r\n\r\n if (index !== -1) {\r\n copy[index].isBooked = !copy[index].isBooked;\r\n setLunches(copy);\r\n }\r\n }\r\n\r\n const {\r\n trigger,\r\n sending,\r\n result,\r\n error,\r\n done,\r\n } = useAuthenticatedHttpQueryTrigger();\r\n\r\n function doSave() {\r\n const options = {\r\n method: httpMethods.POST,\r\n body: JSON.stringify(lunches.map((l) => ({\r\n day: l.day,\r\n isBooked: l.isBooked,\r\n }))),\r\n headers: { 'Content-Type': 'application/json' },\r\n };\r\n\r\n trigger(`/api/lunch/${year}/${week}`, options);\r\n }\r\n\r\n const hasError = done && (error || (result?.hasError ?? true));\r\n const errorMessage = (result?.errors || ['Ett fel uppstod']).join(', ');\r\n\r\n const nextWeek = getIsoWeek(addWeeksToDate(new Date(), 1));\r\n const isBookable = week === nextWeek;\r\n\r\n return (\r\n <>\r\n {(!done || hasError) && (\r\n <>\r\n

För att vi enklare ska veta hur många matlådor ni behöver boka vilka dagar du vill ha mat. Tack!

\r\n {lunches.map((l) => (\r\n (isBookable ? toggleLunch(l.day) : () => { })}\r\n >\r\n
\r\n
\r\n

{l.description}

\r\n
\r\n
\r\n {l.isBooked ? : }\r\n
\r\n
\r\n
\r\n ))}\r\n {isBookable && (\r\n
\r\n {sending ? 'Sparar ...' : 'Spara'}\r\n {hasError && (\r\n {errorMessage}\r\n )}\r\n
\r\n )}\r\n \r\n )}\r\n {done && !hasError && (\r\n <>\r\n \r\n

{`Dina luncher för vecka ${week} är nu sparade`}

\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 {children}\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":""}