{"version":3,"sources":["actions/actionTypes.ts","store.ts","types.ts","reducers/Reducers.ts","Constants.ts","history.ts","helpers.ts","Api.ts","actions/Actions.ts","Notifier.tsx","Scroll.tsx","Contact.tsx","About.tsx","Portfolio.tsx","Menu.tsx","DeleteButton.tsx","AdminCategories.tsx","AdminProducts.tsx","Account.tsx","Admin.tsx","Login.tsx","AuthorizedRoute.tsx","index.tsx"],"names":["ActionType","DeleteType","STORE","app","notifications","categories","user","reducer","state","action","type","REMOVE_NOTIFICATION","filter","key","payload","ENQUEUE_NOTIFICATION","concat","SET_CATEGORIES","SET_USER","AWS_BASE_URL","BASE_URL","MAIN_BASE_URL","CATEGORIES_URL","PRODUCTS_URL","ACCOUNT_URL","COOKIE_TOKEN_KEY","history","createBrowserHistory","getTokenFromCookies","cookie","document","split","find","c","startsWith","undefined","required","value","deleteCookieAndRedirect","push","checkIfAuthorized","res","status","Error","postWithToken","url","data","fetch","method","body","JSON","stringify","headers","Authorization","then","login","username","password","application","json","token","getCategories","deleteEntity","entityID","getUserAccount","text","ERROR_NOTIFICATION","message","Date","getTime","options","variant","autoHideDuration","enqueueNotification","notification","setCategories","setUser","fetchAll","withToken","dispatch","getState","promises","Promise","resolve","Api","all","u","catch","displayed","Notifier","useDispatch","useSelector","store","useSnackbar","enqueueSnackbar","closeSnackbar","React","forEach","id","includes","onExited","_e","myKey","removeNotification","Scroll","header","children","headerClassName","title","headerRef","spinnerRef","menuRef","window","innerHeight","marginTop","setMarginTop","menuOpen","setMenuOpen","documentElement","scrollTop","setTimeout","current","style","opacity","display","handleScroll","offset","pageYOffset","innerWidth","scale","Math","max","transform","_","clamp","handleResize","handleMenuClick","addEventListener","removeEventListener","className","ref","classNames","open","to","target","href","name","rel","onClick","position","connect","onEnqueueNotification","renderForm","handleSubmit","hasValidationErrors","validating","submitting","onSubmit","validate","input","meta","placeholder","touched","error","rows","disabled","values","form","ok","statusText","finally","reset","resetFieldState","render","About","useEffect","tns","container","items","autoplay","controls","nav","navPosition","autoplayTimeout","speed","autoplayButtonOutput","rewind","mouseDrag","autoplayResetOnVisibility","responsive","src","ALL_ID","getAllProducts","allProducts","reduce","acc","products","internalName","subCategories","map","p","category","categoryPath","getImageUrl","idx","productGalleryImages","onFetchData","portfolioItemsRef","useRef","useState","showLightbox","setShowLightbox","selectedImageId","setSelectedImageId","photoIndex","setPhotoIndex","portfolioItems","setPortfolioItems","selectedCategory","setSelectedCategory","selectedProducts","setSelectedProducts","handleSetSelectedProducts","useCallback","updatedProducts","length","imageName","description","shuffle","handleCategorySelect","categoryId","catProducts","e","stopPropagation","scroll","top","offsetParent","offsetTop","behavior","handleImageClick","imageId","handleLightboxClose","handlePhotoIndexChange","selectedProduct","numImages","prevIndex","nextIndex","wrapperClassName","animationDuration","imageTitle","imageCaption","mainSrc","nextSrc","prevSrc","onMovePrevRequest","onMoveNextRequest","onCloseRequest","renderLightbox","cat","isSubCategory","parentIds","allItems","selected","columnsCountBreakPoints","columnsCount","gutter","product","width","minWidth","isNil","price","HeaderMenu","anchorEl","setAnchorEl","Boolean","handleClick","event","currentTarget","handleClose","handleMenuItemClick","Menu","onClose","MenuListProps","MenuItem","DeleteButton","icon","iconTitle","onAccept","setOpen","handleClickOpen","handleAccept","Dialog","DialogTitle","DialogContent","DialogContentText","dangerouslySetInnerHTML","__html","wordBreak","DialogActions","removeCategory","catId","addCategory","parentCategoryID","updateCategory","onCategoriesUpdate","loading","setLoading","handleCategoryClick","resetFormAndFields","handleCategoryDelete","CATEGORY","handleCategoryUpdate","omit","hasSubmitErrors","validateForm","errors","test","parentCategoryName","initialValues","SPECIAL_FIELD","getAllCategories","allCategories","removeProduct","productId","addProduct","productCategoryID","updateProduct","getBase64Image","file","cb","fileReader","FileReader","readAsDataURL","onload","result","getProductTitle","getProductsAndCategories","onClickListener","onProductSelect","ExpandableCategory","expanded","setExpanded","toggleExpanded","Box","Fade","in","timeout","setSelectedProduct","fileInput","handleProductClick","handleProductDelete","PRODUCT","handleImageDelete","arrayIdx","IMAGE","_x","i","mutators","remove","renderFileInput","onChange","files","size","accept","component","min","step","fields","Table","TableBody","images","TableRow","TableCell","x","imageSourceBase64","update","getSelectedImage","ARRAY_ERROR","handleProductUpdate","selectedImage","Number","isNew","arrayMutators","repeatPassword","autoComplete","pick","TITLES","match","params","replace","renderComponent","fullName","userName","moment","format","onLogin","a","withRouter","handleLogin","BodyComp","Component","rest","props","AuthorizedRoute","middlewares","thunk","routerMiddleware","createRootReducer","h","combineReducers","router","connectRouter","Reducers","ReactDOM","initialState","createStore","applyMiddleware","configureStore","maxSnack","anchorOrigin","vertical","horizontal","hideIconVariant","exact","path","Portfolio","Contact","Login","Admin","getElementById"],"mappings":"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","file":"static/js/main.f491d417.chunk.js","sourcesContent":["import { ThunkAction as ThunkActionCreator } from 'redux-thunk';\r\nimport { AnyAction } from 'redux';\r\nimport { SnackbarKey } from 'notistack';\r\nimport { AppStore, INotification, Store } from '../types';\r\n\r\nexport enum ActionType {\r\n REMOVE_NOTIFICATION = 'REMOVE_NOTIFICATION',\r\n ENQUEUE_NOTIFICATION = 'ENQUEUE_NOTIFICATION',\r\n SET_CATEGORIES = 'SET_CATEGORIES',\r\n SET_USER = 'SET_USER'\r\n}\r\n\r\ninterface CloseNotification {\r\n type: ActionType.REMOVE_NOTIFICATION;\r\n payload: SnackbarKey;\r\n}\r\n\r\ninterface EnqueueNotification {\r\n type: ActionType.ENQUEUE_NOTIFICATION;\r\n payload: INotification;\r\n}\r\n\r\ninterface SetCategories {\r\n type: ActionType.SET_CATEGORIES;\r\n payload: AppStore['categories'];\r\n}\r\n\r\ninterface SetUser {\r\n type: ActionType.SET_USER;\r\n payload: AppStore['user'];\r\n}\r\n\r\nexport type Action = CloseNotification | EnqueueNotification | SetCategories | SetUser;\r\n\r\nexport type ThunkAction = ThunkActionCreator;\r\n","import { Store } from './types';\r\n\r\nconst STORE: Store = {\r\n app: {\r\n notifications: [],\r\n categories: null,\r\n user: null\r\n }\r\n};\r\n\r\nexport default STORE;\r\n","import { RouterState } from 'connected-react-router';\r\nimport { OptionsObject, SnackbarKey, SnackbarMessage } from 'notistack';\r\n\r\nexport interface User {\r\n accessFailedCount: number;\r\n concurrencyStamp: any;\r\n email: string;\r\n emailConfirmed: string;\r\n fullName: string;\r\n id: string;\r\n lockoutEnabled: boolean;\r\n lockoutEnd: boolean;\r\n normalizedEmail: boolean;\r\n normalizedUserName: boolean;\r\n password: string;\r\n phoneNumber: string;\r\n phoneNumberConfirmed: boolean;\r\n securityStamp: string;\r\n store: string;\r\n storeID: number;\r\n twoFactorEnabled: boolean;\r\n userName: string;\r\n timestamp?: string;\r\n}\r\n\r\nexport interface AppStore {\r\n notifications: INotification[];\r\n categories: Category[];\r\n user: User;\r\n}\r\n\r\nexport interface Store {\r\n router?: RouterState;\r\n app: AppStore;\r\n}\r\n\r\nexport interface INotification {\r\n message: SnackbarMessage;\r\n options: OptionsObject;\r\n key: SnackbarKey;\r\n}\r\n\r\nexport interface Product {\r\n id: number;\r\n title: string;\r\n description: string;\r\n price: number;\r\n imageName: string;\r\n productGalleryImages: {\r\n id: number;\r\n name: string;\r\n description: string;\r\n imageSourceBase64?: string;\r\n }[];\r\n productCategoryID: number;\r\n imageSourceBase64?: string;\r\n}\r\n\r\nexport interface Category {\r\n id: number;\r\n index?: number;\r\n title: string;\r\n internalName: string;\r\n subCategories: Category[];\r\n products: Product[];\r\n parentCategoryID?: number;\r\n}\r\n\r\nexport enum DeleteType {\r\n CATEGORY = 1,\r\n PRODUCT = 2,\r\n IMAGE = 3\r\n}\r\n","import { Action, ActionType } from '../actions/actionTypes';\r\nimport STORE from '../store';\r\nimport { AppStore } from '../types';\r\n\r\n// eslint-disable-next-line default-param-last\r\nconst reducer = (state = STORE.app, action: Action): AppStore => {\r\n switch (action.type) {\r\n case ActionType.REMOVE_NOTIFICATION:\r\n return {\r\n ...state,\r\n notifications: state.notifications.filter(\r\n ({ key }) => key !== action.payload\r\n )\r\n };\r\n case ActionType.ENQUEUE_NOTIFICATION:\r\n return {\r\n ...state,\r\n notifications: state.notifications.concat(action.payload)\r\n };\r\n case ActionType.SET_CATEGORIES:\r\n return { ...state, categories: action.payload };\r\n case ActionType.SET_USER:\r\n return { ...state, user: action.payload };\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default reducer;\r\n","export const DEFAULT_TITLE = 'Εκδόσεις Βιβλιοδετείο Μποσνάκης';\r\n\r\nexport const AWS_BASE_URL = 'https://d8lc6s7bpjqw2.cloudfront.net/bosnakis/images';\r\n\r\nexport const BASE_URL = 'https://personalizedgenericapi.azurewebsites.net/api/Bosnakis';\r\nexport const MAIN_BASE_URL =\r\n 'https://personalizedgenericapi.azurewebsites.net/api/Main';\r\n\r\nexport const CATEGORIES_URL = '/admin/categories';\r\nexport const PRODUCTS_URL = '/admin/products';\r\nexport const ACCOUNT_URL = '/admin/account';\r\n\r\nexport const COOKIE_TOKEN_KEY = 'bosnakis_api_token';\r\n","import { createBrowserHistory } from 'history';\r\n\r\nconst history = createBrowserHistory();\r\nexport default history;\r\n","import { COOKIE_TOKEN_KEY } from './Constants';\r\nimport history from './history';\r\n\r\nexport const getTokenFromCookies = (): string => {\r\n const cookie = document.cookie\r\n .split('; ')\r\n .find(c => c.startsWith(`${COOKIE_TOKEN_KEY}=`));\r\n return cookie ? cookie.split('=')[1] : undefined;\r\n};\r\n\r\nexport const required = (value: string) => (value ? undefined : 'Υποχρεωτικό πεδίο');\r\n\r\nexport const deleteCookieAndRedirect = () => {\r\n document.cookie = `${COOKIE_TOKEN_KEY}=`;\r\n history.push('/login');\r\n};\r\n","import { BASE_URL, COOKIE_TOKEN_KEY, MAIN_BASE_URL } from './Constants';\r\nimport { deleteCookieAndRedirect, getTokenFromCookies } from './helpers';\r\nimport { AppStore, DeleteType, User } from './types';\r\n\r\nconst checkIfAuthorized = (res: Response) => {\r\n // unauthorized\r\n if (res.status === 401) {\r\n deleteCookieAndRedirect();\r\n throw Error('Η σύνδεσή σας έληξε. Παρακαλώ συνδεθείτε ξανά');\r\n }\r\n};\r\n\r\nconst postWithToken = (url: string, data: Record) =>\r\n fetch(url, {\r\n method: 'POST',\r\n body: JSON.stringify(data),\r\n headers: {\r\n Authorization: `Bearer ${getTokenFromCookies()}`,\r\n 'Content-Type': 'application/json'\r\n }\r\n }).then(res => {\r\n checkIfAuthorized(res);\r\n\r\n if (res.status === 403) {\r\n throw new Error('Δεν επιτρέπεται να εκτελέσετε αυτήν την ενέργεια');\r\n }\r\n\r\n return res;\r\n });\r\n\r\nconst getWithToken = (url: string) =>\r\n fetch(url, {\r\n headers: {\r\n Authorization: `Bearer ${getTokenFromCookies()}`\r\n }\r\n }).then(res => {\r\n checkIfAuthorized(res);\r\n\r\n if (res.status === 200) {\r\n return res.json();\r\n }\r\n\r\n return res.text();\r\n });\r\n\r\nexport const login = (username: string, password: string) =>\r\n fetch(`${MAIN_BASE_URL}/Login`, {\r\n method: 'POST',\r\n body: JSON.stringify({\r\n username,\r\n password,\r\n application: 2\r\n }),\r\n headers: { 'Content-Type': 'application/json' }\r\n })\r\n .then(res => {\r\n checkIfAuthorized(res);\r\n\r\n if (res.status === 200) {\r\n return res.json();\r\n }\r\n\r\n throw Error('Παρακαλώ ελέγξτε τα στοιχεία σας και προσπαθήστε ξανά');\r\n })\r\n .then(({ token }: { token: string }) => {\r\n document.cookie = `${COOKIE_TOKEN_KEY}=${token}`;\r\n });\r\n\r\nexport const getCategories = (): Promise =>\r\n fetch(`${BASE_URL}/GetCategories`).then(res => res.json());\r\n\r\nexport const contact = (values: Record) =>\r\n fetch(`${BASE_URL}/ContactUs`, {\r\n method: 'POST',\r\n body: JSON.stringify(values),\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n }\r\n });\r\n\r\nexport const addUpdateCategory = (values: Record) =>\r\n postWithToken(`${BASE_URL}/AddUpdateProductCategory`, values).then(res =>\r\n res.json()\r\n );\r\n\r\nexport const addUpdateProduct = (values: Record) =>\r\n postWithToken(`${BASE_URL}/AddUpdateProduct`, values).then(res => res.json());\r\n\r\nexport const deleteEntity = (entityID: number, type: DeleteType) =>\r\n postWithToken(`${BASE_URL}/DeleteEntity`, { entityID, type });\r\n\r\nexport const getUserAccount = (): Promise =>\r\n getWithToken(`${MAIN_BASE_URL}/GetUserDetails`);\r\n\r\nexport const resetPassword = data =>\r\n postWithToken(`${MAIN_BASE_URL}/ResetOwnPassword`, data);\r\n","import { SnackbarKey } from 'notistack';\r\nimport { AppStore, INotification } from '../types';\r\nimport { Action, ActionType, ThunkAction } from './actionTypes';\r\nimport * as Api from '../Api';\r\n\r\nconst ERROR_NOTIFICATION: INotification = {\r\n message: 'Κάτι πήγε στραβά με το αίτημά σας',\r\n key: new Date().getTime(),\r\n options: {\r\n variant: 'error',\r\n autoHideDuration: 3000\r\n }\r\n};\r\n\r\nexport const removeNotification = (key: SnackbarKey): Action => ({\r\n type: ActionType.REMOVE_NOTIFICATION,\r\n payload: key\r\n});\r\n\r\nexport const enqueueNotification = (notification: INotification): Action => ({\r\n type: ActionType.ENQUEUE_NOTIFICATION,\r\n payload: notification\r\n});\r\n\r\nexport const setCategories = (categories: AppStore['categories']): Action => ({\r\n type: ActionType.SET_CATEGORIES,\r\n payload: categories\r\n});\r\n\r\nconst setUser = (user: AppStore['user']): Action => ({\r\n type: ActionType.SET_USER,\r\n payload: user\r\n});\r\n\r\nexport const fetchAll =\r\n (withToken: boolean = true): ThunkAction> =>\r\n (dispatch, getState) => {\r\n const { categories, user } = getState().app;\r\n\r\n const promises: any[] = [\r\n categories ? Promise.resolve(categories) : Api.getCategories()\r\n ];\r\n\r\n if (withToken) {\r\n promises.push(user ? Promise.resolve(user) : Api.getUserAccount());\r\n }\r\n\r\n return Promise.all(promises)\r\n .then(([c, u]) => {\r\n dispatch(setCategories(c));\r\n\r\n if (withToken) {\r\n dispatch(setUser(u));\r\n }\r\n })\r\n .catch(() => {\r\n dispatch(enqueueNotification(ERROR_NOTIFICATION));\r\n });\r\n };\r\n\r\nexport const login =\r\n (username: string, password: string): ThunkAction> =>\r\n async dispatch => {\r\n try {\r\n await Api.login(username, password);\r\n } catch (_e) {\r\n dispatch(enqueueNotification(ERROR_NOTIFICATION));\r\n return null;\r\n }\r\n\r\n return dispatch(fetchAll());\r\n };\r\n","import * as React from 'react';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { useSnackbar, SnackbarKey } from 'notistack';\r\nimport { Store } from './types';\r\nimport { removeNotification } from './actions/Actions';\r\n\r\nlet displayed: SnackbarKey[] = [];\r\n\r\nconst Notifier: React.FC = () => {\r\n const dispatch = useDispatch();\r\n const notifications = useSelector((store: Store) => store.app.notifications);\r\n const { enqueueSnackbar, closeSnackbar } = useSnackbar();\r\n\r\n const storeDisplayed = (id: SnackbarKey) => {\r\n displayed = displayed.concat(id);\r\n };\r\n\r\n const removeDisplayed = (id: SnackbarKey) => {\r\n displayed = displayed.filter(key => id !== key);\r\n };\r\n\r\n React.useEffect(() => {\r\n notifications.forEach(({ key, message, options = {} }) => {\r\n // do nothing if snackbar is already displayed\r\n if (displayed.includes(key)) {\r\n return;\r\n }\r\n\r\n // display snackbar using notistack\r\n enqueueSnackbar(message, {\r\n key,\r\n ...options,\r\n onExited: (_e, myKey) => {\r\n // remove this snackbar from redux store\r\n dispatch(removeNotification(myKey));\r\n removeDisplayed(myKey);\r\n }\r\n });\r\n\r\n // keep track of snackbars that we've displayed\r\n storeDisplayed(key);\r\n });\r\n }, [notifications, closeSnackbar, enqueueSnackbar, dispatch]);\r\n\r\n return null;\r\n};\r\n\r\nexport default Notifier;\r\n","import _ from 'lodash';\r\nimport classNames from 'classnames';\r\nimport * as React from 'react';\r\nimport FontAwesome from 'react-fontawesome';\r\nimport { Link } from 'react-router-dom';\r\nimport { DEFAULT_TITLE } from './Constants';\r\n\r\nconst Scroll: React.FC<{\r\n header: JSX.Element;\r\n headerClassName?: string;\r\n title: string;\r\n}> = ({ header, children, headerClassName, title }) => {\r\n const headerRef = React.useRef();\r\n const spinnerRef = React.useRef();\r\n const menuRef = React.useRef();\r\n\r\n const [marginTop, setMarginTop] = React.useState(window.innerHeight);\r\n const [menuOpen, setMenuOpen] = React.useState(false);\r\n\r\n React.useEffect(() => {\r\n document.title = `${DEFAULT_TITLE} - ${title}`;\r\n document.documentElement.scrollTop = 0;\r\n\r\n setTimeout(() => {\r\n if (!spinnerRef.current) {\r\n return;\r\n }\r\n\r\n spinnerRef.current.style.opacity = '0';\r\n spinnerRef.current.style.display = 'none';\r\n }, 500);\r\n }, [title]);\r\n\r\n const handleScroll = React.useCallback(() => {\r\n if (!headerRef.current) {\r\n return;\r\n }\r\n\r\n const offset = window.pageYOffset || document.documentElement.scrollTop;\r\n\r\n if (window.innerWidth > 481) {\r\n const scale = (100 - offset / 100) / 98;\r\n\r\n headerRef.current.style.opacity = `${Math.max(1 - offset / 20 / 30, 0)}`;\r\n headerRef.current.style.transform = `scale(${_.clamp(scale, -1, 1)})`;\r\n } else {\r\n const scale = (100 - offset / 100) / 99;\r\n\r\n headerRef.current.style.opacity = `${Math.max(1 - offset / 20 / 15, 0)}`;\r\n headerRef.current.style.transform = `scale(${_.clamp(scale, -1, 1)})`;\r\n }\r\n }, []);\r\n\r\n const handleResize = React.useCallback(() => {\r\n setMarginTop(window.innerHeight);\r\n }, []);\r\n\r\n const handleMenuClick = React.useCallback(() => {\r\n setMenuOpen(!menuOpen);\r\n }, [menuOpen]);\r\n\r\n React.useEffect(() => {\r\n window.addEventListener('scroll', handleScroll);\r\n window.addEventListener('resize', handleResize);\r\n\r\n return () => {\r\n window.removeEventListener('scroll', handleScroll);\r\n window.removeEventListener('resize', handleResize);\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 Portfolio\r\n \r\n \r\n Εταιρική Ταυτότητα\r\n \r\n \r\n Επικοινωνία\r\n \r\n \r\n -Admin-\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 {header}\r\n
\r\n
\r\n
{children}
\r\n
\r\n
\r\n
6932130592 / 6973043294
\r\n
2310935369
\r\n \r\n info@bosnakis.gr\r\n \r\n \r\n bosnakis@otenet.gr\r\n \r\n \r\n Facebook\r\n \r\n
\r\n
\r\n © Bosnakis 2021. All right reserved. Developed by\r\n \r\n Personalized\r\n \r\n
\r\n
\r\n
\r\n \r\n );\r\n};\r\n\r\nexport default Scroll;\r\n","import { FormApi } from 'final-form';\r\nimport * as React from 'react';\r\nimport { Field, Form, FormRenderProps } from 'react-final-form';\r\nimport FontAwesome from 'react-fontawesome';\r\nimport { connect } from 'react-redux';\r\nimport { RouteComponentProps } from 'react-router-dom';\r\nimport { enqueueNotification } from './actions/Actions';\r\nimport Scroll from './Scroll';\r\nimport { INotification } from './types';\r\nimport * as Api from './Api';\r\nimport { required } from './helpers';\r\n\r\ninterface FormValues {\r\n name: string;\r\n email: string;\r\n subject: string;\r\n body: string;\r\n}\r\n\r\ntype DispatchProps = {\r\n onEnqueueNotification: (notification: INotification) => void;\r\n};\r\n\r\nconst Contact: React.FC = ({\r\n onEnqueueNotification\r\n}) => {\r\n const renderForm = React.useCallback(\r\n ({\r\n handleSubmit,\r\n hasValidationErrors,\r\n validating,\r\n submitting\r\n }: FormRenderProps) => (\r\n
\r\n
\r\n \r\n {({ input, meta }) => (\r\n
\r\n \r\n {meta.touched && meta.error && (\r\n \r\n )}\r\n
\r\n )}\r\n
\r\n \r\n {({ input, meta }) => (\r\n
\r\n \r\n {meta.touched && meta.error && (\r\n \r\n )}\r\n
\r\n )}\r\n
\r\n
\r\n \r\n {({ input, meta }) => (\r\n
\r\n \r\n {meta.touched && meta.error && (\r\n \r\n )}\r\n
\r\n )}\r\n
\r\n \r\n {({ input, meta }) => (\r\n
\r\n \r\n {meta.touched && meta.error && (\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 const handleSubmit = React.useCallback(\r\n (values: FormValues, form: FormApi) =>\r\n Api.contact(values)\r\n .then(res => {\r\n if (!res.ok) {\r\n onEnqueueNotification({\r\n key: new Date().getTime(),\r\n message: `Συνέβη ένα σφάλμα... Κωδικός: ${res.status} Μήνυμα: ${res.statusText}`,\r\n options: {\r\n variant: 'error'\r\n }\r\n });\r\n return;\r\n }\r\n onEnqueueNotification({\r\n key: new Date().getTime(),\r\n message: '✓ Το μήνυμά σας στάλθηκε επιτυχώς...',\r\n options: {\r\n variant: 'success',\r\n autoHideDuration: 5000\r\n }\r\n });\r\n })\r\n .finally(() => {\r\n form.reset({});\r\n ['name', 'email', 'subject', 'body'].forEach(key => {\r\n form.resetFieldState(key);\r\n });\r\n }),\r\n [onEnqueueNotification]\r\n );\r\n\r\n const header = (\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 return (\r\n \r\n
\r\n
\r\n
Ελάτε σε Επαφή
\r\n
Επικοινωνήστε μαζί μας
\r\n
\r\n Καταστήματα Θεσσαλονίκης\r\n
\r\n Κεντρικό:{' '}\r\n \r\n Ομήρου 36, 54638\r\n \r\n
\r\n
\r\n Εργαστήρι:{' '}\r\n \r\n Ύδρας 31, 54638\r\n \r\n
\r\n
\r\n
\r\n
Κινητό: 6932130592
\r\n
Κινητό: 6973043294
\r\n
Σταθερό: 2310935369
\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
\r\n
\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default connect<{}, DispatchProps>(\r\n null,\r\n (dispatch): DispatchProps => ({\r\n onEnqueueNotification: notification =>\r\n dispatch(enqueueNotification(notification))\r\n })\r\n)(Contact);\r\n","import React from 'react';\r\nimport { tns } from 'tiny-slider';\r\nimport { AWS_BASE_URL } from './Constants';\r\nimport Scroll from './Scroll';\r\n\r\nconst About: React.FC<{}> = () => {\r\n React.useEffect(() => {\r\n tns({\r\n container: '.carousel',\r\n items: 2,\r\n autoplay: true,\r\n controls: false,\r\n nav: true,\r\n navPosition: 'bottom',\r\n autoplayTimeout: 4500,\r\n speed: 1000,\r\n autoplayButtonOutput: false,\r\n rewind: true,\r\n mouseDrag: true,\r\n autoplayResetOnVisibility: false,\r\n responsive: {\r\n 0: {\r\n items: 1\r\n },\r\n 500: {\r\n items: 1\r\n },\r\n 710: {\r\n items: 2\r\n },\r\n 992: {\r\n items: 3\r\n },\r\n 1199: {\r\n items: 3\r\n }\r\n }\r\n });\r\n }, []);\r\n\r\n const header = (\r\n
\r\n
Εταιρική Ταυτότητα
\r\n
\r\n \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
\r\n

\r\n Ο Παναγιώτης Μποσνάκης ξεκίνησε τα πρώτα του βήματα στη\r\n βιβλιοδεσία, δίπλα στον πατέρα του, το 1982. Στη\r\n συνέχεια, εργάστηκε σε διάφορα γνωστά βιβλιοδετεία της\r\n Θεσσαλονίκης όπου και απέκτησε πολύτιμη εμπειρία κοντά\r\n σε παλιούς μάστορες.\r\n
\r\n
\r\n To 1994, ξεκινά το δικό του βιβλιοδετείο στην Κάτω\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
\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
Ειδικές Εκδόσεις
\r\n

\r\n Γκοφρέ, αναγλυφοτυπία, χρυσοτυπία, ασημοτυπία και εφαρμογή\r\n ειδικών foil, κοπτικά, καρφίτσα.\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\nexport default About;\r\n","import classNames from 'classnames';\r\nimport React from 'react';\r\nimport _ from 'lodash';\r\nimport Masonry, { ResponsiveMasonry } from 'react-responsive-masonry';\r\nimport { connect } from 'react-redux';\r\nimport { RouteComponentProps } from 'react-router-dom';\r\nimport Lightbox from 'react-image-lightbox';\r\nimport { AWS_BASE_URL } from './Constants';\r\nimport Scroll from './Scroll';\r\nimport { AppStore, Product, Store } from './types';\r\nimport { fetchAll } from './actions/Actions';\r\n\r\ninterface StateProps {\r\n categories: AppStore['categories'];\r\n}\r\n\r\ninterface DispatchProps {\r\n onFetchData: () => Promise;\r\n}\r\n\r\nconst ALL_ID = -1;\r\n\r\ntype ExtendedProduct = Product & {\r\n categoryPath?: string;\r\n category?: string;\r\n};\r\n\r\nexport const getAllProducts = (\r\n categories: StateProps['categories'],\r\n allProducts: Product[] = []\r\n): ExtendedProduct[] =>\r\n categories.reduce(\r\n (acc, { products, internalName, subCategories, title }) =>\r\n acc.concat(\r\n getAllProducts(\r\n subCategories,\r\n products.map(p => ({\r\n ...p,\r\n category: title,\r\n categoryPath: internalName\r\n }))\r\n )\r\n ),\r\n allProducts as ExtendedProduct[]\r\n );\r\n\r\nconst getImageUrl = (\r\n { categoryPath, productGalleryImages }: ExtendedProduct,\r\n idx: number\r\n): string =>\r\n `${AWS_BASE_URL}/galleries/v2/${categoryPath}/${productGalleryImages[idx].name}`;\r\n\r\nconst Portfolio: React.FC = ({\r\n categories,\r\n onFetchData\r\n}) => {\r\n const portfolioItemsRef = React.useRef();\r\n const [showLightbox, setShowLightbox] = React.useState(false);\r\n const [selectedImageId, setSelectedImageId] = React.useState(null);\r\n const [photoIndex, setPhotoIndex] = React.useState(null);\r\n const [portfolioItems, setPortfolioItems] = React.useState(categories);\r\n const [selectedCategory, setSelectedCategory] = React.useState(ALL_ID);\r\n const [selectedProducts, setSelectedProducts] = React.useState(\r\n []\r\n );\r\n\r\n const header = (\r\n
\r\n
\r\n \r\n
\r\n
\r\n );\r\n\r\n const handleSetSelectedProducts = React.useCallback((products: Product[]) => {\r\n const updatedProducts = products.map(p =>\r\n p.productGalleryImages?.length\r\n ? p\r\n : {\r\n ...p,\r\n productGalleryImages: [\r\n {\r\n id: p.id,\r\n name: p.imageName,\r\n description: p.description\r\n }\r\n ]\r\n }\r\n );\r\n\r\n setSelectedProducts(_.shuffle(updatedProducts));\r\n }, []);\r\n\r\n const handleCategorySelect = React.useCallback(\r\n (categoryId: number, catProducts: Product[]) =>\r\n (e: React.MouseEvent) => {\r\n e.stopPropagation();\r\n\r\n setSelectedCategory(categoryId);\r\n handleSetSelectedProducts(_.shuffle(catProducts));\r\n\r\n document.documentElement.scroll({\r\n top: (portfolioItemsRef.current.offsetParent as any).offsetTop - 30,\r\n behavior: 'smooth'\r\n });\r\n },\r\n [setSelectedCategory, handleSetSelectedProducts]\r\n );\r\n\r\n const handleImageClick = React.useCallback(\r\n (imageId: number) => () => {\r\n setSelectedImageId(imageId);\r\n setShowLightbox(true);\r\n setPhotoIndex(0);\r\n },\r\n []\r\n );\r\n\r\n const handleLightboxClose = React.useCallback(() => {\r\n setShowLightbox(false);\r\n setSelectedImageId(null);\r\n setPhotoIndex(null);\r\n }, []);\r\n\r\n const handlePhotoIndexChange = React.useCallback(\r\n (idx: number) => () => {\r\n setPhotoIndex(idx);\r\n },\r\n []\r\n );\r\n\r\n React.useEffect(() => {\r\n onFetchData();\r\n }, [onFetchData]);\r\n\r\n React.useEffect(() => {\r\n const allProducts = getAllProducts(categories);\r\n\r\n setPortfolioItems(\r\n categories.length\r\n ? [\r\n {\r\n id: ALL_ID,\r\n title: 'Όλες οι Εργασίες',\r\n subCategories: [],\r\n products: allProducts,\r\n internalName: ''\r\n }\r\n ].concat(categories)\r\n : categories\r\n );\r\n handleSetSelectedProducts(_.shuffle(allProducts));\r\n }, [categories, handleSetSelectedProducts]);\r\n\r\n const getCategories = (\r\n cat: StateProps['categories'],\r\n isSubCategory = false,\r\n parentIds: number[] = []\r\n ): JSX.Element[] =>\r\n cat.map(category => {\r\n const { id, title, subCategories, products } = category;\r\n const allItems = id === ALL_ID;\r\n\r\n return (\r\n \r\n {title}\r\n {!!subCategories.length &&\r\n getCategories(\r\n subCategories,\r\n !!subCategories.length,\r\n parentIds.concat(id)\r\n )}\r\n
\r\n );\r\n });\r\n\r\n const renderLightbox = () => {\r\n const selectedProduct = selectedProducts.find(\r\n ({ id }) => id === selectedImageId\r\n );\r\n const numImages = selectedProduct.productGalleryImages.length;\r\n const prevIndex = (photoIndex + numImages - 1) % numImages;\r\n const nextIndex = (photoIndex + 1) % numImages;\r\n\r\n return (\r\n 1 ? getImageUrl(selectedProduct, nextIndex) : undefined\r\n }\r\n prevSrc={\r\n numImages > 1 ? getImageUrl(selectedProduct, prevIndex) : undefined\r\n }\r\n onMovePrevRequest={handlePhotoIndexChange(prevIndex)}\r\n onMoveNextRequest={handlePhotoIndexChange(nextIndex)}\r\n onCloseRequest={handleLightboxClose}\r\n />\r\n );\r\n };\r\n\r\n return (\r\n \r\n {showLightbox && renderLightbox()}\r\n
\r\n
\r\n
PORTFOLIO
\r\n
Οι εργασίες μας
\r\n
{getCategories(portfolioItems)}
\r\n
\r\n
\r\n \r\n \r\n {selectedProducts.map(product => (\r\n \r\n \r\n
\r\n

\r\n {product.title}\r\n

\r\n
\r\n
Κατηγορία: {product.category}
\r\n \r\n {product.description}\r\n
\r\n {!_.isNil(product.price) && (\r\n <>\r\n
\r\n Τιμή: {product.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};\r\n\r\nexport default connect(\r\n (state: Store) => ({\r\n categories: state.app.categories || []\r\n }),\r\n dispatch => ({\r\n onFetchData: () => dispatch(fetchAll(false))\r\n })\r\n)(Portfolio);\r\n","import * as React from 'react';\r\nimport Menu from '@mui/material/Menu';\r\nimport MenuItem from '@mui/material/MenuItem';\r\nimport FontAwesomeIcon from 'react-fontawesome';\r\nimport { Link } from 'react-router-dom';\r\nimport { ACCOUNT_URL, CATEGORIES_URL, PRODUCTS_URL } from './Constants';\r\n\r\nconst HeaderMenu: React.FC<{}> = () => {\r\n const [anchorEl, setAnchorEl] = React.useState(null);\r\n const open = Boolean(anchorEl);\r\n\r\n const handleClick = React.useCallback(\r\n (event: React.MouseEvent) => {\r\n setAnchorEl(event.currentTarget);\r\n },\r\n [setAnchorEl]\r\n );\r\n\r\n const handleClose = React.useCallback(() => {\r\n setAnchorEl(null);\r\n }, [setAnchorEl]);\r\n\r\n const handleMenuItemClick = React.useCallback(() => {\r\n setAnchorEl(null);\r\n }, [setAnchorEl]);\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 \r\n \r\n
\r\n );\r\n};\r\n\r\nexport default HeaderMenu;\r\n","import {\r\n Dialog,\r\n DialogActions,\r\n DialogContent,\r\n DialogContentText,\r\n DialogTitle\r\n} from '@mui/material';\r\nimport classNames from 'classnames';\r\nimport React from 'react';\r\nimport FontAwesome from 'react-fontawesome';\r\n\r\ninterface Props {\r\n title: string;\r\n message: string;\r\n icon?: string;\r\n iconTitle?: string;\r\n disabled?: boolean;\r\n onAccept: () => void;\r\n}\r\n\r\nconst DeleteButton: React.FC = ({\r\n title,\r\n message,\r\n disabled,\r\n icon,\r\n iconTitle,\r\n onAccept\r\n}) => {\r\n const [open, setOpen] = React.useState(false);\r\n\r\n const handleClickOpen = React.useCallback(() => {\r\n if (disabled) {\r\n return;\r\n }\r\n\r\n setOpen(true);\r\n }, [disabled]);\r\n\r\n const handleClose = React.useCallback(() => {\r\n setOpen(false);\r\n }, []);\r\n\r\n const handleAccept = React.useCallback(() => {\r\n handleClose();\r\n onAccept();\r\n }, [handleClose, onAccept]);\r\n\r\n return (\r\n <>\r\n {icon ? (\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 \r\n \r\n );\r\n};\r\n\r\nexport default DeleteButton;\r\n","import React from 'react';\r\nimport _ from 'lodash';\r\nimport classNames from 'classnames';\r\nimport { FormApi, ValidationErrors } from 'final-form';\r\nimport { Field, Form, FormRenderProps } from 'react-final-form';\r\nimport FontAwesome from 'react-fontawesome';\r\nimport { connect } from 'react-redux';\r\nimport { AppStore, DeleteType, INotification } from './types';\r\nimport * as Api from './Api';\r\nimport { enqueueNotification } from './actions/Actions';\r\nimport DeleteButton from './DeleteButton';\r\n\r\ninterface DispatchProps {\r\n onEnqueueNotification: (notification: INotification) => void;\r\n}\r\n\r\ntype Category = AppStore['categories'][number] & {\r\n parentCategoryName?: string;\r\n};\r\n\r\nconst removeCategory = (\r\n categories: AppStore['categories'],\r\n catId: number\r\n): AppStore['categories'] =>\r\n categories\r\n .filter(({ id }) => id !== catId)\r\n .map(cat => ({\r\n ...cat,\r\n subCategories: removeCategory(cat.subCategories, catId)\r\n }));\r\n\r\nconst addCategory = (\r\n categories: AppStore['categories'],\r\n category: Category\r\n): AppStore['categories'] =>\r\n _.isNil(category.parentCategoryID)\r\n ? categories.concat(category)\r\n : categories.map(cat => ({\r\n ...cat,\r\n subCategories:\r\n cat.id === category.parentCategoryID\r\n ? cat.subCategories.concat(category)\r\n : addCategory(cat.subCategories, category)\r\n }));\r\n\r\nconst updateCategory = (\r\n categories: AppStore['categories'],\r\n category: Category\r\n): AppStore['categories'] =>\r\n categories.map(cat =>\r\n cat.id === category.id\r\n ? { ...cat, ...category }\r\n : {\r\n ...cat,\r\n subCategories: updateCategory(cat.subCategories, category)\r\n }\r\n );\r\n\r\nconst Categories: React.FC<\r\n {\r\n categories: AppStore['categories'];\r\n onCategoriesUpdate: (categories: AppStore['categories']) => void;\r\n } & DispatchProps\r\n> = ({ categories, onCategoriesUpdate, onEnqueueNotification }) => {\r\n const [selectedCategory, setSelectedCategory] = React.useState(null);\r\n const [loading, setLoading] = React.useState(false);\r\n\r\n const handleCategoryClick = React.useCallback(\r\n (category: Category) => (e: React.MouseEvent) => {\r\n e.stopPropagation();\r\n setSelectedCategory(category);\r\n },\r\n []\r\n );\r\n\r\n const getCategories = (\r\n cat: AppStore['categories'],\r\n isSubCategory = false,\r\n parentCategoryName: string = ''\r\n ): JSX.Element[] =>\r\n cat.map(category => (\r\n \r\n
\r\n
{category.title}
\r\n
\r\n \r\n
\r\n
\r\n {!!category.subCategories.length &&\r\n getCategories(category.subCategories, true, category.title)}\r\n \r\n ));\r\n\r\n const resetFormAndFields = React.useCallback((form: FormApi) => {\r\n setSelectedCategory(null);\r\n form.reset({});\r\n\r\n ['title', 'internalName'].forEach((key: keyof Category) => {\r\n form.resetFieldState(key);\r\n });\r\n }, []);\r\n\r\n const handleCategoryDelete = React.useCallback(\r\n (id: number, form: FormApi) => () => {\r\n setLoading(true);\r\n\r\n Api.deleteEntity(id, DeleteType.CATEGORY)\r\n .then(() => {\r\n setLoading(false);\r\n\r\n onCategoriesUpdate(removeCategory(categories, id));\r\n resetFormAndFields(form);\r\n })\r\n .catch((e: Error) => {\r\n onEnqueueNotification({\r\n key: new Date().getTime(),\r\n message: e.message,\r\n options: {\r\n variant: 'error',\r\n autoHideDuration: 5000\r\n }\r\n });\r\n });\r\n },\r\n [onCategoriesUpdate, categories, resetFormAndFields, onEnqueueNotification]\r\n );\r\n\r\n const handleCategoryUpdate = React.useCallback(\r\n (values: Category, form: FormApi) => {\r\n setLoading(true);\r\n\r\n Api.addUpdateCategory(\r\n _.omit(values, 'parentCategoryName', 'products', 'subCategories')\r\n )\r\n .then((category: Category) => {\r\n setLoading(false);\r\n\r\n onCategoriesUpdate(\r\n _.isNil(values.id)\r\n ? addCategory(categories, category)\r\n : updateCategory(categories, category)\r\n );\r\n\r\n resetFormAndFields(form);\r\n })\r\n .catch((e: Error) => {\r\n onEnqueueNotification({\r\n key: new Date().getTime(),\r\n message: e.message,\r\n options: {\r\n variant: 'error',\r\n autoHideDuration: 5000\r\n }\r\n });\r\n });\r\n },\r\n [onCategoriesUpdate, categories, resetFormAndFields, onEnqueueNotification]\r\n );\r\n\r\n const renderForm = React.useCallback(\r\n ({\r\n validating,\r\n hasValidationErrors,\r\n hasSubmitErrors,\r\n handleSubmit,\r\n values,\r\n form\r\n }: FormRenderProps) => (\r\n \r\n \r\n \r\n \r\n
\r\n \r\n ΑΠΟΘΗΚΕΥΣΗ\r\n \r\n Όλες οι υποκατηγορίες και τα προϊόντα αυτής θα διαγραφούν επίσης! ' +\r\n 'Η ενέργεια αυτή είναι μη αντιστρέψιμη!'\r\n }\r\n disabled={\r\n loading ||\r\n _.isNil(values.id) ||\r\n validating ||\r\n hasValidationErrors ||\r\n hasSubmitErrors\r\n }\r\n onAccept={handleCategoryDelete(values.id, form)}\r\n />\r\n {loading && }\r\n
\r\n \r\n ),\r\n [handleCategoryDelete, loading]\r\n );\r\n\r\n const validateForm = React.useCallback((values: Category) => {\r\n const errors: ValidationErrors = {};\r\n\r\n if (!values.title) {\r\n errors.title = 'Υποχρεωτικό πεδίο';\r\n }\r\n if (!values.internalName) {\r\n errors.internalName = 'Υποχρεωτικό πεδίο';\r\n }\r\n\r\n if (!/^\\S*$/.test(values.internalName)) {\r\n errors.internalName = 'Το πεδίο δεν μπορεί να περιέχει κενά';\r\n }\r\n if (!/^[a-zA-Z0-9_]*$/.test(values.internalName)) {\r\n errors.internalName =\r\n 'Το πεδίο μπορεί να περιέχει μόνο λατινικούς χαρακτήρες, νούμερα και _';\r\n }\r\n\r\n return errors;\r\n }, []);\r\n\r\n return (\r\n <>\r\n
\r\n \r\n {getCategories(categories)}\r\n
\r\n
\r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default connect<{}, DispatchProps>(\r\n null,\r\n (dispatch): DispatchProps => ({\r\n onEnqueueNotification: notification =>\r\n dispatch(enqueueNotification(notification))\r\n })\r\n)(Categories);\r\n","import * as React from 'react';\r\nimport _ from 'lodash';\r\nimport classNames from 'classnames';\r\nimport FontAwesome from 'react-fontawesome';\r\nimport { Field, Form, FormRenderProps } from 'react-final-form';\r\nimport { ARRAY_ERROR, FormApi, ValidationErrors } from 'final-form';\r\nimport arrayMutators from 'final-form-arrays';\r\nimport { FieldArray } from 'react-final-form-arrays';\r\nimport { Box, Fade, Table, TableBody, TableCell, TableRow } from '@mui/material';\r\nimport { connect } from 'react-redux';\r\nimport { AppStore, DeleteType, INotification, Product, Category } from './types';\r\nimport * as Api from './Api';\r\nimport { enqueueNotification } from './actions/Actions';\r\nimport DeleteButton from './DeleteButton';\r\nimport { required } from './helpers';\r\n\r\nconst SPECIAL_FIELD = 'special_file_input_field';\r\nconst FILE_SIZE_LIMIT = 3e6; // 3MB\r\n\r\ntype IProduct = Omit & {\r\n parentCategoryName?: string;\r\n productGalleryImages: (Product['productGalleryImages'][number] & { file?: File })[];\r\n [SPECIAL_FIELD]?: unknown;\r\n};\r\n\r\ninterface DispatchProps {\r\n onEnqueueNotification: (notification: INotification) => void;\r\n}\r\n\r\ntype AllCategories = { id: number; name: string }[];\r\nconst getAllCategories = (\r\n categories: AppStore['categories'],\r\n allCategories: AllCategories = []\r\n): AllCategories =>\r\n categories.reduce(\r\n (acc, { id, title, subCategories }) =>\r\n acc.concat(getAllCategories(subCategories, [{ id, name: title }])),\r\n allCategories\r\n );\r\n\r\nconst removeProduct = (\r\n categories: AppStore['categories'],\r\n productId: number\r\n): AppStore['categories'] =>\r\n categories.map(cat => ({\r\n ...cat,\r\n products: cat.products.filter(({ id }) => id !== productId),\r\n subCategories: removeProduct(cat.subCategories, productId)\r\n }));\r\n\r\nconst addProduct = (\r\n categories: AppStore['categories'],\r\n product: Product\r\n): AppStore['categories'] =>\r\n categories.map(cat => ({\r\n ...cat,\r\n products:\r\n cat.id === product.productCategoryID\r\n ? cat.products.concat(product)\r\n : cat.products,\r\n subCategories: addProduct(cat.subCategories, product)\r\n }));\r\n\r\nconst updateProduct = (\r\n categories: AppStore['categories'],\r\n product: Product\r\n): AppStore['categories'] =>\r\n categories.map(cat => ({\r\n ...cat,\r\n products:\r\n cat.id === product.productCategoryID\r\n ? cat.products.map(p =>\r\n p.id === product.id ? { ...p, ...product } : p\r\n )\r\n : cat.products,\r\n subCategories: updateProduct(cat.subCategories, product)\r\n }));\r\n\r\nconst getBase64Image = (file: File, cb: (base64?: string) => void): void => {\r\n if (!file) {\r\n cb();\r\n return;\r\n }\r\n\r\n const fileReader = new FileReader();\r\n fileReader.readAsDataURL(file);\r\n\r\n fileReader.onload = () => {\r\n cb(fileReader.result as string);\r\n };\r\n};\r\n\r\nconst getProductTitle = ({ title, id }: Product): string =>\r\n title || `${id} - Χωρίς τίτλο`;\r\n\r\ntype ProductClick = (\r\n p: IProduct\r\n) => (e: React.MouseEvent) => void;\r\n\r\nconst getProductsAndCategories = (\r\n cat: AppStore['categories'],\r\n selectedProduct: IProduct,\r\n onClickListener: ProductClick,\r\n isSubCategory = false\r\n): JSX.Element[] =>\r\n cat.map(category => (\r\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\r\n \r\n ));\r\n\r\nconst ExpandableCategory: React.FC<{\r\n category: Category;\r\n isSubCategory: boolean;\r\n selectedProduct: IProduct;\r\n onProductSelect: ProductClick;\r\n}> = ({ category, onProductSelect, selectedProduct, isSubCategory }) => {\r\n const [expanded, setExpanded] = React.useState(false);\r\n const { id, title, products, subCategories } = category;\r\n\r\n const toggleExpanded = React.useCallback(\r\n (e: React.MouseEvent) => {\r\n e.stopPropagation();\r\n setExpanded(!expanded);\r\n },\r\n [expanded]\r\n );\r\n\r\n return (\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
\r\n {expanded &&\r\n products.map(product => (\r\n \r\n {getProductTitle(product)}\r\n
\r\n ))}\r\n {expanded &&\r\n getProductsAndCategories(\r\n subCategories,\r\n selectedProduct,\r\n onProductSelect,\r\n true\r\n )}\r\n \r\n
\r\n
\r\n \r\n );\r\n};\r\n\r\nconst canDeleteImage = (images: IProduct['productGalleryImages']): boolean =>\r\n images.filter(x => !_.isNil(x?.id)).length > 1;\r\n\r\nconst Products: React.FC<\r\n DispatchProps & {\r\n categories: AppStore['categories'];\r\n onCategoriesUpdate: (categories: AppStore['categories']) => void;\r\n }\r\n> = ({ categories, onCategoriesUpdate, onEnqueueNotification }) => {\r\n const [selectedProduct, setSelectedProduct] = React.useState(null);\r\n const [loading, setLoading] = React.useState(false);\r\n const fileInput = React.useRef();\r\n\r\n const handleProductClick = React.useCallback(\r\n (product: IProduct) => (e: React.MouseEvent) => {\r\n e.stopPropagation();\r\n setSelectedProduct(product);\r\n\r\n if (fileInput.current) {\r\n fileInput.current.value = '';\r\n }\r\n },\r\n []\r\n );\r\n\r\n const resetFormAndFields = React.useCallback((form: FormApi) => {\r\n form.reset({});\r\n\r\n fileInput.current.value = '';\r\n setSelectedProduct(null);\r\n\r\n [\r\n 'title',\r\n 'description',\r\n 'price',\r\n 'productCategoryID',\r\n 'productGalleryImages'\r\n ].forEach((key: keyof IProduct) => {\r\n form.resetFieldState(key);\r\n });\r\n }, []);\r\n\r\n const handleProductDelete = React.useCallback(\r\n (product: IProduct, form: FormApi) => () => {\r\n setLoading(true);\r\n\r\n Api.deleteEntity(product.id, DeleteType.PRODUCT)\r\n .then(() => {\r\n setLoading(false);\r\n\r\n onCategoriesUpdate(removeProduct(categories, product.id));\r\n resetFormAndFields(form);\r\n\r\n onEnqueueNotification({\r\n key: new Date().getTime(),\r\n message: `Το προϊόν \"${getProductTitle(\r\n product\r\n )}\" διαγράφηκε επιτυχώς`,\r\n options: {\r\n variant: 'success'\r\n }\r\n });\r\n })\r\n .catch((e: Error) => {\r\n onEnqueueNotification({\r\n key: new Date().getTime(),\r\n message: e.message,\r\n options: {\r\n variant: 'error',\r\n autoHideDuration: 5000\r\n }\r\n });\r\n });\r\n },\r\n [categories, onCategoriesUpdate, resetFormAndFields, onEnqueueNotification]\r\n );\r\n\r\n const handleImageDelete = React.useCallback(\r\n (\r\n { id, name }: IProduct['productGalleryImages'][number],\r\n form: FormApi,\r\n product: IProduct,\r\n arrayIdx: number\r\n ) =>\r\n () => {\r\n setLoading(true);\r\n\r\n Api.deleteEntity(id, DeleteType.IMAGE)\r\n .then(() => {\r\n setLoading(false);\r\n\r\n onCategoriesUpdate(\r\n updateProduct(categories, {\r\n ...product,\r\n productGalleryImages: (\r\n product.productGalleryImages || []\r\n ).filter((_x, i) => i !== arrayIdx)\r\n })\r\n );\r\n\r\n form.mutators.remove('productGalleryImages', arrayIdx);\r\n\r\n onEnqueueNotification({\r\n key: new Date().getTime(),\r\n message: `Η εικόνα \"${id} - ${name}\" διαγράφηκε επιτυχώς`,\r\n options: {\r\n variant: 'success'\r\n }\r\n });\r\n })\r\n .catch((e: Error) => {\r\n onEnqueueNotification({\r\n key: new Date().getTime(),\r\n message: e.message,\r\n options: {\r\n variant: 'error',\r\n autoHideDuration: 5000\r\n }\r\n });\r\n });\r\n },\r\n [onEnqueueNotification, onCategoriesUpdate, categories]\r\n );\r\n\r\n const renderFileInput = React.useCallback(\r\n (ref?: React.MutableRefObject, cb?: (file: File) => void) => (\r\n \r\n {({ input }) => (\r\n {\r\n // eslint-disable-next-line prefer-destructuring\r\n const file = e.target.files[0];\r\n\r\n if (!file) {\r\n return;\r\n }\r\n\r\n if (file.size <= FILE_SIZE_LIMIT) {\r\n cb?.(file);\r\n input.onChange(e.target.files);\r\n return;\r\n }\r\n\r\n onEnqueueNotification({\r\n key: new Date().getTime(),\r\n message: `Το αρχείο ${file.name} ξεπερνάει το όριου μεγέθους (3MB)`,\r\n options: {\r\n variant: 'error',\r\n autoHideDuration: 5000\r\n }\r\n });\r\n e.target.value = '';\r\n }}\r\n accept='.jpg, .png, .jpeg'\r\n />\r\n )}\r\n \r\n ),\r\n [onEnqueueNotification]\r\n );\r\n\r\n const renderForm = React.useCallback(\r\n ({\r\n handleSubmit,\r\n form,\r\n validating,\r\n hasValidationErrors,\r\n hasSubmitErrors,\r\n values\r\n }: FormRenderProps) => (\r\n
\r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n \r\n form.mutators.push('productGalleryImages', undefined)\r\n }\r\n />\r\n \r\n {({ fields }) => (\r\n \r\n \r\n {fields.map((name, idx) => (\r\n \r\n \r\n {_.isNil(fields.value[idx]?.id) ? (\r\n {\r\n fields.remove(idx);\r\n }}\r\n />\r\n ) : (\r\n \r\n )}\r\n \r\n \r\n
\r\n {_.isNil(fields?.value[idx]?.id) ? (\r\n renderFileInput(\r\n undefined,\r\n file => {\r\n getBase64Image(\r\n file,\r\n imageSourceBase64 => {\r\n fields.update(\r\n idx,\r\n {\r\n ...fields\r\n .value[\r\n idx\r\n ],\r\n imageSourceBase64,\r\n name: file.name\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
\r\n
\r\n \r\n ΑΠΟΘΗΚΕΥΣΗ\r\n \r\n \r\n {loading && }\r\n
\r\n
\r\n ),\r\n [handleProductDelete, renderFileInput, loading, categories, handleImageDelete]\r\n );\r\n\r\n const getSelectedImage = React.useCallback(() => fileInput.current?.files[0], []);\r\n\r\n const validateForm = React.useCallback(\r\n (values: IProduct) => {\r\n const errors: ValidationErrors = {};\r\n\r\n if ((values.productGalleryImages || []).filter(i => !i?.name).length) {\r\n errors[ARRAY_ERROR] = 'Πρέπει να επιλέξετε αρχείο εικόνας';\r\n }\r\n\r\n if (_.isNil(values.id) && !getSelectedImage()) {\r\n errors.imageName = 'Πρέπει να επιλέξετε αρχείο εικόνας';\r\n }\r\n\r\n return errors;\r\n },\r\n [getSelectedImage]\r\n );\r\n\r\n const handleProductUpdate = React.useCallback(\r\n (values: IProduct, form: FormApi) => {\r\n const selectedImage = getSelectedImage();\r\n\r\n setLoading(true);\r\n getBase64Image(selectedImage, imageSourceBase64 => {\r\n const updatedProduct: IProduct = {\r\n ..._.omit(values, 'parentCategoryName', SPECIAL_FIELD),\r\n ...(values.price && { price: Number(values.price) }),\r\n imageName: selectedImage?.name || values.imageName,\r\n imageSourceBase64\r\n };\r\n\r\n return Api.addUpdateProduct(updatedProduct)\r\n .then((product: Product) => {\r\n setLoading(false);\r\n const isNew = _.isNil(values.id);\r\n\r\n onCategoriesUpdate(\r\n isNew\r\n ? addProduct(categories, product)\r\n : updateProduct(categories, product)\r\n );\r\n\r\n onEnqueueNotification({\r\n key: new Date().getTime(),\r\n message: `Το προϊόν \"${getProductTitle(product)}\" ${\r\n isNew ? 'προστέθηκε' : 'ανανεώθηκε'\r\n } επιτυχώς`,\r\n options: {\r\n variant: 'success'\r\n }\r\n });\r\n\r\n resetFormAndFields(form);\r\n })\r\n .catch((e: Error) => {\r\n onEnqueueNotification({\r\n key: new Date().getTime(),\r\n message: e.message,\r\n options: {\r\n variant: 'error',\r\n autoHideDuration: 5000\r\n }\r\n });\r\n });\r\n });\r\n },\r\n [\r\n resetFormAndFields,\r\n categories,\r\n onCategoriesUpdate,\r\n onEnqueueNotification,\r\n getSelectedImage\r\n ]\r\n );\r\n\r\n return (\r\n <>\r\n
\r\n {getProductsAndCategories(\r\n categories,\r\n selectedProduct,\r\n handleProductClick\r\n )}\r\n
\r\n
\r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default connect<{}, DispatchProps>(\r\n null,\r\n (dispatch): DispatchProps => ({\r\n onEnqueueNotification: notification =>\r\n dispatch(enqueueNotification(notification))\r\n })\r\n)(Products);\r\n","import React from 'react';\r\nimport _ from 'lodash';\r\nimport { connect } from 'react-redux';\r\nimport { Form, Field, FormRenderProps } from 'react-final-form';\r\nimport { ValidationErrors } from 'final-form';\r\nimport FontAwesomeIcon from 'react-fontawesome';\r\nimport { AppStore, INotification, Store } from './types';\r\nimport { enqueueNotification } from './actions/Actions';\r\nimport { deleteCookieAndRedirect, required } from './helpers';\r\nimport * as Api from './Api';\r\n\r\ninterface StateProps {\r\n user: AppStore['user'];\r\n}\r\n\r\ninterface DispatchProps {\r\n onEnqueueNotification: (notification: INotification) => void;\r\n}\r\n\r\ntype FormValues = Pick & {\r\n password: string;\r\n repeatPassword: string;\r\n};\r\n\r\nconst Account: React.FC = ({\r\n user,\r\n onEnqueueNotification\r\n}) => {\r\n const [loading, setLoading] = React.useState(false);\r\n\r\n const validateForm = React.useCallback((values: FormValues) => {\r\n const errors: ValidationErrors = {};\r\n\r\n if (values.password !== values.repeatPassword) {\r\n errors.repeatPassword = 'Οι κωδικοί δεν ταιριάζουν';\r\n }\r\n\r\n return errors;\r\n }, []);\r\n\r\n const renderForm = React.useCallback(\r\n ({\r\n handleSubmit,\r\n submitting,\r\n validating,\r\n hasValidationErrors\r\n }: FormRenderProps) => (\r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n \r\n ΑΠΟΘΗΚΕΥΣΗ\r\n \r\n {loading && (\r\n \r\n )}\r\n
\r\n
\r\n
\r\n ),\r\n [loading]\r\n );\r\n\r\n const handleSubmit = React.useCallback(\r\n (values: FormValues) => {\r\n setLoading(true);\r\n\r\n return Api.resetPassword(values)\r\n .then(res => {\r\n if (res.status === 200) {\r\n return res.text();\r\n }\r\n\r\n throw new Error('Κάτι πήγε στραβά με το αίτημά σας');\r\n })\r\n .then(() => {\r\n onEnqueueNotification({\r\n key: new Date().getTime(),\r\n message: 'Ο κωδικός σας άλλαξε επιτυχώς',\r\n options: { variant: 'success' }\r\n });\r\n\r\n deleteCookieAndRedirect();\r\n })\r\n .catch((e: Error) => {\r\n setLoading(false);\r\n onEnqueueNotification({\r\n key: new Date().getTime(),\r\n message: e.message,\r\n options: { variant: 'error' }\r\n });\r\n });\r\n },\r\n [onEnqueueNotification]\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\nconst mapStateToProps = (state: Store): StateProps => ({\r\n user: state.app.user\r\n});\r\n\r\nconst mapDispatchToProps = (dispatch): DispatchProps => ({\r\n onEnqueueNotification: notification => dispatch(enqueueNotification(notification))\r\n});\r\n\r\nexport default connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n)(Account);\r\n","import * as React from 'react';\r\nimport { RouteComponentProps } from 'react-router-dom';\r\nimport { connect } from 'react-redux';\r\nimport moment from 'moment-timezone';\r\nimport { AppStore, Store } from './types';\r\nimport HeaderMenu from './Menu';\r\nimport { ACCOUNT_URL, CATEGORIES_URL, PRODUCTS_URL } from './Constants';\r\nimport Categories from './AdminCategories';\r\nimport Products from './AdminProducts';\r\nimport { setCategories } from './actions/Actions';\r\nimport Account from './Account';\r\n\r\nconst TITLES = {\r\n [CATEGORIES_URL]: 'ΚΑΤΗΓΟΡΙΕΣ',\r\n [PRODUCTS_URL]: 'ΠΡΟΪΟΝΤΑ',\r\n [ACCOUNT_URL]: 'ΡΥΘΜΙΣΕΙΣ ΛΟΓΑΡΙΑΣΜΟΥ'\r\n};\r\n\r\ninterface StateProps {\r\n categories: AppStore['categories'];\r\n user: AppStore['user'];\r\n}\r\n\r\ninterface DispatchProps {\r\n onCategoriesUpdate: (categories: AppStore['categories']) => void;\r\n}\r\n\r\nconst Admin: React.FC<\r\n RouteComponentProps<{ id: string }> & StateProps & DispatchProps\r\n> = ({ match, history, categories, user, onCategoriesUpdate }) => {\r\n React.useEffect(() => {\r\n if (!match.params?.id || !TITLES[match.url]) {\r\n history.replace(CATEGORIES_URL);\r\n }\r\n }, [match, history]);\r\n\r\n const renderComponent = React.useCallback(() => {\r\n switch (match.url) {\r\n case CATEGORIES_URL:\r\n return (\r\n \r\n );\r\n case PRODUCTS_URL:\r\n return (\r\n \r\n );\r\n case ACCOUNT_URL:\r\n return ;\r\n default:\r\n return null;\r\n }\r\n }, [categories, match.url, onCategoriesUpdate]);\r\n\r\n return (\r\n
\r\n
{TITLES[match.url]}
\r\n
\r\n \r\n {renderComponent()}\r\n
\r\n
\r\n
\r\n
\r\n ΣΥΝΔΕΔΕΜΕΝΟΣ ΧΡΗΣΤΗΣ {user.fullName} ({user.userName})\r\n
\r\n
\r\n {moment().format('DD-MM-YYYY')}\r\n
\r\n
\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default connect(\r\n (state: Store) => ({\r\n categories: state.app.categories,\r\n user: state.app.user\r\n }),\r\n dispatch => ({\r\n onCategoriesUpdate: categories => dispatch(setCategories(categories))\r\n })\r\n)(Admin);\r\n","import React from 'react';\r\nimport { Field, Form, FormRenderProps } from 'react-final-form';\r\nimport FontAwesome from 'react-fontawesome';\r\nimport { connect } from 'react-redux';\r\nimport { RouteComponentProps, withRouter } from 'react-router-dom';\r\nimport { getTokenFromCookies, required } from './helpers';\r\nimport { login } from './actions/Actions';\r\n\r\ninterface DispatchProps {\r\n onLogin: (username: string, password: string) => Promise;\r\n}\r\n\r\ntype FormValues = {\r\n username: string;\r\n password: string;\r\n};\r\n\r\nconst Login: React.FC = ({ onLogin, history }) => {\r\n const [loading, setLoading] = React.useState(false);\r\n\r\n React.useEffect(() => {\r\n if (getTokenFromCookies()) {\r\n history.push('/admin');\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n const handleLogin = React.useCallback(\r\n (values: FormValues) => {\r\n setLoading(true);\r\n\r\n onLogin(values.username, values.password)\r\n .then(() => {\r\n history.push('/admin');\r\n })\r\n .catch(() => {\r\n setLoading(false);\r\n });\r\n },\r\n [onLogin, history]\r\n );\r\n\r\n const renderForm = React.useCallback(\r\n ({\r\n handleSubmit,\r\n submitting,\r\n validating,\r\n hasValidationErrors\r\n }: FormRenderProps) => (\r\n
\r\n
ΜΠΟΣΝΑΚΗΣ ADMINISTRATION
\r\n \r\n {({ input, meta }) => (\r\n
\r\n \r\n \r\n {meta.error && meta.touched && (\r\n \r\n )}\r\n
\r\n )}\r\n
\r\n \r\n {({ input, meta }) => (\r\n
\r\n \r\n \r\n {meta.error && meta.touched && (\r\n \r\n )}\r\n
\r\n )}\r\n
\r\n
\r\n \r\n Σύνδεση\r\n \r\n {loading && }\r\n
\r\n
\r\n ),\r\n [loading]\r\n );\r\n\r\n return (\r\n
\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default connect<{}, DispatchProps>(null, dispatch => ({\r\n onLogin: (username, password) => dispatch(login(username, password))\r\n}))(withRouter(Login));\r\n","import * as React from 'react';\r\nimport { connect } from 'react-redux';\r\nimport { Route, RouteProps, RouteComponentProps, Redirect } from 'react-router-dom';\r\nimport { AppStore, Store } from './types';\r\nimport { fetchAll } from './actions/Actions';\r\nimport { getTokenFromCookies } from './helpers';\r\n\r\ninterface DispatchProps {\r\n onFetchData: () => Promise;\r\n}\r\n\r\ninterface StateProps {\r\n categories: AppStore['categories'];\r\n user: AppStore['user'];\r\n}\r\n\r\ninterface OwnProps extends RouteProps {\r\n component: React.ComponentType;\r\n}\r\n\r\nconst Body: React.FC = ({\r\n // eslint-disable-next-line destructuring/no-rename\r\n component: Component,\r\n categories,\r\n user,\r\n onFetchData,\r\n ...rest\r\n}) => {\r\n React.useEffect(() => {\r\n onFetchData();\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n if (!categories || !user) {\r\n return null;\r\n }\r\n\r\n return (\r\n }\r\n />\r\n );\r\n};\r\n\r\nconst BodyComp = connect(\r\n (state: Store): StateProps => ({\r\n categories: state.app.categories,\r\n user: state.app.user\r\n }),\r\n (dispatch): DispatchProps => ({\r\n onFetchData: () => dispatch(fetchAll())\r\n })\r\n)(Body);\r\n\r\nconst AuthorizedRoute: React.FC = ({\r\n // eslint-disable-next-line destructuring/no-rename\r\n component: Component,\r\n ...rest\r\n}) => (\r\n \r\n getTokenFromCookies() ? (\r\n \r\n ) : (\r\n \r\n )\r\n }\r\n />\r\n);\r\n\r\nexport default AuthorizedRoute;\r\n","import ReactDOM from 'react-dom';\r\nimport { History } from 'history';\r\nimport { createStore, applyMiddleware, combineReducers } from 'redux';\r\nimport { Provider } from 'react-redux';\r\nimport thunk from 'redux-thunk';\r\nimport { createLogger } from 'redux-logger';\r\nimport {\r\n ConnectedRouter,\r\n connectRouter,\r\n routerMiddleware\r\n} from 'connected-react-router';\r\nimport { Redirect, Route, Switch } from 'react-router-dom';\r\nimport { SnackbarProvider } from 'notistack';\r\nimport Reducers from './reducers/Reducers';\r\nimport STORE from './store';\r\nimport Notifier from './Notifier';\r\nimport Contact from './Contact';\r\nimport About from './About';\r\nimport Portfolio from './Portfolio';\r\nimport Admin from './Admin';\r\nimport Login from './Login';\r\nimport AuthorizedRoute from './AuthorizedRoute';\r\nimport history from './history';\r\n\r\nimport './styles/main.less';\r\n\r\nconst middlewares: any[] = [thunk, routerMiddleware(history)];\r\n\r\nif (process.env.NODE_ENV === 'development') {\r\n const logger = createLogger({\r\n collapsed: true,\r\n titleFormatter: action => `${action.type}`\r\n });\r\n middlewares.push(logger);\r\n}\r\n\r\nconst createRootReducer = (h: History) =>\r\n combineReducers({\r\n router: connectRouter(h),\r\n app: Reducers\r\n });\r\n\r\nconst configureStore = (initialState = STORE) =>\r\n createStore(\r\n createRootReducer(history),\r\n initialState,\r\n applyMiddleware(...middlewares)\r\n );\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 \r\n \r\n \r\n \r\n \r\n ,\r\n document.getElementById('root')\r\n);\r\n"],"sourceRoot":""}