[
  {
    "path": ".gitignore",
    "content": "# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.\n\n# dependencies\n/node_modules\n/.pnp\n.pnp.js\n\n# testing\n/coverage\n\n# production\n/build\n\n# misc\n.DS_Store\n.env.local\n.env.development.local\n.env.test.local\n.env.production.local\n\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\n"
  },
  {
    "path": ".idea/ecommerce.iml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<module type=\"WEB_MODULE\" version=\"4\">\n  <component name=\"NewModuleRootManager\">\n    <content url=\"file://$MODULE_DIR$\">\n      <excludeFolder url=\"file://$MODULE_DIR$/.tmp\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/temp\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/tmp\" />\n    </content>\n    <orderEntry type=\"inheritedJdk\" />\n    <orderEntry type=\"sourceFolder\" forTests=\"false\" />\n  </component>\n</module>"
  },
  {
    "path": ".idea/inspectionProfiles/Project_Default.xml",
    "content": "<component name=\"InspectionProjectProfileManager\">\n  <profile version=\"1.0\">\n    <option name=\"myName\" value=\"Project Default\" />\n    <inspection_tool class=\"Eslint\" enabled=\"true\" level=\"ERROR\" enabled_by_default=\"true\" />\n  </profile>\n</component>"
  },
  {
    "path": ".idea/misc.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"JavaScriptSettings\">\n    <option name=\"languageLevel\" value=\"JSX\" />\n  </component>\n</project>"
  },
  {
    "path": ".idea/modules.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"ProjectModuleManager\">\n    <modules>\n      <module fileurl=\"file://$PROJECT_DIR$/.idea/ecommerce.iml\" filepath=\"$PROJECT_DIR$/.idea/ecommerce.iml\" />\n    </modules>\n  </component>\n</project>"
  },
  {
    "path": ".idea/vcs.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"VcsDirectoryMappings\">\n    <mapping directory=\"$PROJECT_DIR$\" vcs=\"Git\" />\n  </component>\n</project>"
  },
  {
    "path": ".idea/workspace.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"BookmarkManager\">\n    <bookmark url=\"file://$PROJECT_DIR$/src/components/Pagination/Pagination.js\" line=\"128\" />\n  </component>\n  <component name=\"ChangeListManager\">\n    <list default=\"true\" id=\"020428e6-7073-44e2-8b90-76d90e895943\" name=\"Default Changelist\" comment=\"\">\n      <change beforePath=\"$PROJECT_DIR$/.idea/workspace.xml\" beforeDir=\"false\" afterPath=\"$PROJECT_DIR$/.idea/workspace.xml\" afterDir=\"false\" />\n      <change beforePath=\"$PROJECT_DIR$/src/components/CartItem/CartItem.js\" beforeDir=\"false\" afterPath=\"$PROJECT_DIR$/src/components/CartItem/CartItem.js\" afterDir=\"false\" />\n      <change beforePath=\"$PROJECT_DIR$/src/components/Product/Product.js\" beforeDir=\"false\" afterPath=\"$PROJECT_DIR$/src/components/Product/Product.js\" afterDir=\"false\" />\n    </list>\n    <ignored path=\"$PROJECT_DIR$/.tmp/\" />\n    <ignored path=\"$PROJECT_DIR$/temp/\" />\n    <ignored path=\"$PROJECT_DIR$/tmp/\" />\n    <option name=\"EXCLUDED_CONVERTED_TO_IGNORED\" value=\"true\" />\n    <option name=\"SHOW_DIALOG\" value=\"false\" />\n    <option name=\"HIGHLIGHT_CONFLICTS\" value=\"true\" />\n    <option name=\"HIGHLIGHT_NON_ACTIVE_CHANGELIST\" value=\"false\" />\n    <option name=\"LAST_RESOLUTION\" value=\"IGNORE\" />\n  </component>\n  <component name=\"FUSProjectUsageTrigger\">\n    <session id=\"-1590563976\">\n      <usages-collector id=\"statistics.lifecycle.project\">\n        <counts>\n          <entry key=\"project.closed\" value=\"6\" />\n          <entry key=\"project.open.time.0\" value=\"3\" />\n          <entry key=\"project.open.time.1\" value=\"2\" />\n          <entry key=\"project.open.time.2\" value=\"2\" />\n          <entry key=\"project.open.time.3\" value=\"1\" />\n          <entry key=\"project.open.time.5\" value=\"2\" />\n          <entry key=\"project.open.time.6\" value=\"1\" />\n          <entry key=\"project.open.time.7\" value=\"1\" />\n          <entry key=\"project.opened\" value=\"12\" />\n        </counts>\n      </usages-collector>\n      <usages-collector id=\"statistics.file.extensions.open\">\n        <counts>\n          <entry key=\"html\" value=\"1\" />\n          <entry key=\"js\" value=\"85\" />\n          <entry key=\"json\" value=\"2\" />\n          <entry key=\"phones\" value=\"1\" />\n          <entry key=\"rnc\" value=\"1\" />\n          <entry key=\"scss\" value=\"28\" />\n        </counts>\n      </usages-collector>\n      <usages-collector id=\"statistics.file.types.open\">\n        <counts>\n          <entry key=\"HTML\" value=\"1\" />\n          <entry key=\"JSON\" value=\"3\" />\n          <entry key=\"JavaScript\" value=\"85\" />\n          <entry key=\"RNG Compact\" value=\"1\" />\n          <entry key=\"SCSS\" value=\"28\" />\n        </counts>\n      </usages-collector>\n      <usages-collector id=\"statistics.js.language.service.starts\">\n        <counts>\n          <entry key=\"ESLintLanguageService\" value=\"12\" />\n        </counts>\n      </usages-collector>\n      <usages-collector id=\"statistics.file.extensions.edit\">\n        <counts>\n          <entry key=\"js\" value=\"10067\" />\n          <entry key=\"scss\" value=\"1168\" />\n          <entry key=\"txt\" value=\"43\" />\n        </counts>\n      </usages-collector>\n      <usages-collector id=\"statistics.file.types.edit\">\n        <counts>\n          <entry key=\"JavaScript\" value=\"10067\" />\n          <entry key=\"PLAIN_TEXT\" value=\"43\" />\n          <entry key=\"SCSS\" value=\"1168\" />\n        </counts>\n      </usages-collector>\n    </session>\n  </component>\n  <component name=\"FileEditorManager\">\n    <leaf SIDE_TABS_SIZE_LIMIT_KEY=\"300\">\n      <file pinned=\"false\" current-in-tab=\"false\">\n        <entry file=\"file://$PROJECT_DIR$/src/components/BrandFilter/BrandFilter.js\">\n          <provider selected=\"true\" editor-type-id=\"text-editor\">\n            <state relative-caret-position=\"575\">\n              <caret line=\"29\" column=\"62\" selection-start-line=\"29\" selection-start-column=\"62\" selection-end-line=\"29\" selection-end-column=\"62\" />\n            </state>\n          </provider>\n        </entry>\n      </file>\n      <file pinned=\"false\" current-in-tab=\"false\">\n        <entry file=\"file://$PROJECT_DIR$/src/components/BrandFilter/BrandFilter.scss\">\n          <provider selected=\"true\" editor-type-id=\"text-editor\">\n            <state relative-caret-position=\"1311\">\n              <caret line=\"57\" column=\"1\" selection-start-line=\"57\" selection-start-column=\"1\" selection-end-line=\"57\" selection-end-column=\"1\" />\n            </state>\n          </provider>\n        </entry>\n      </file>\n      <file pinned=\"false\" current-in-tab=\"false\">\n        <entry file=\"file://$PROJECT_DIR$/src/components/OrderFilter/OrderFilter.js\">\n          <provider selected=\"true\" editor-type-id=\"text-editor\">\n            <state relative-caret-position=\"1173\">\n              <caret line=\"54\" column=\"60\" selection-start-line=\"54\" selection-start-column=\"60\" selection-end-line=\"54\" selection-end-column=\"60\" />\n            </state>\n          </provider>\n        </entry>\n      </file>\n      <file pinned=\"false\" current-in-tab=\"false\">\n        <entry file=\"file://$PROJECT_DIR$/src/components/CartItem/CartItem.js\">\n          <provider selected=\"true\" editor-type-id=\"text-editor\">\n            <state relative-caret-position=\"204\">\n              <caret line=\"66\" column=\"46\" selection-start-line=\"66\" selection-start-column=\"46\" selection-end-line=\"66\" selection-end-column=\"46\" />\n            </state>\n          </provider>\n        </entry>\n      </file>\n      <file pinned=\"false\" current-in-tab=\"false\">\n        <entry file=\"file://$PROJECT_DIR$/src/data/phones.js\">\n          <provider selected=\"true\" editor-type-id=\"text-editor\">\n            <state relative-caret-position=\"69\">\n              <caret line=\"3\" column=\"15\" selection-start-line=\"3\" selection-start-column=\"15\" selection-end-line=\"3\" selection-end-column=\"15\" />\n            </state>\n          </provider>\n        </entry>\n      </file>\n      <file pinned=\"false\" current-in-tab=\"false\">\n        <entry file=\"file://$PROJECT_DIR$/src/components/Product/Product.js\">\n          <provider selected=\"true\" editor-type-id=\"text-editor\">\n            <state relative-caret-position=\"-776\">\n              <caret line=\"31\" column=\"43\" selection-start-line=\"31\" selection-start-column=\"43\" selection-end-line=\"31\" selection-end-column=\"43\" />\n            </state>\n          </provider>\n        </entry>\n      </file>\n      <file pinned=\"false\" current-in-tab=\"false\">\n        <entry file=\"file://$PROJECT_DIR$/src/components/Product/Product.scss\">\n          <provider selected=\"true\" editor-type-id=\"text-editor\">\n            <state relative-caret-position=\"1610\">\n              <caret line=\"70\" column=\"1\" selection-start-line=\"70\" selection-start-column=\"1\" selection-end-line=\"70\" selection-end-column=\"1\" />\n            </state>\n          </provider>\n        </entry>\n      </file>\n      <file pinned=\"false\" current-in-tab=\"false\">\n        <entry file=\"file://$PROJECT_DIR$/src/containers/ProductList/ProductList.js\">\n          <provider selected=\"true\" editor-type-id=\"text-editor\">\n            <state relative-caret-position=\"1449\">\n              <caret line=\"71\" column=\"88\" selection-start-line=\"71\" selection-start-column=\"88\" selection-end-line=\"71\" selection-end-column=\"88\" />\n              <folding>\n                <element signature=\"e#0#39#0\" expanded=\"true\" />\n              </folding>\n            </state>\n          </provider>\n        </entry>\n      </file>\n      <file pinned=\"false\" current-in-tab=\"false\">\n        <entry file=\"file://$PROJECT_DIR$/src/components/LayoutMode/LayoutMode.js\">\n          <provider selected=\"true\" editor-type-id=\"text-editor\">\n            <state relative-caret-position=\"322\">\n              <caret line=\"15\" column=\"7\" selection-start-line=\"15\" selection-start-column=\"7\" selection-end-line=\"15\" selection-end-column=\"7\" />\n              <folding>\n                <element signature=\"e#0#26#0\" expanded=\"true\" />\n              </folding>\n            </state>\n          </provider>\n        </entry>\n      </file>\n      <file pinned=\"false\" current-in-tab=\"true\">\n        <entry file=\"file://$PROJECT_DIR$/package.json\">\n          <provider selected=\"true\" editor-type-id=\"text-editor\" />\n        </entry>\n      </file>\n    </leaf>\n  </component>\n  <component name=\"FileTemplateManagerImpl\">\n    <option name=\"RECENT_TEMPLATES\">\n      <list>\n        <option value=\"Scss File\" />\n        <option value=\"JavaScript File\" />\n      </list>\n    </option>\n  </component>\n  <component name=\"Git.Settings\">\n    <option name=\"RECENT_GIT_ROOT_PATH\" value=\"$PROJECT_DIR$\" />\n  </component>\n  <component name=\"IdeDocumentHistory\">\n    <option name=\"CHANGED_PATHS\">\n      <list>\n        <option value=\"$PROJECT_DIR$/phones.json\" />\n        <option value=\"$PROJECT_DIR$/brands.js\" />\n        <option value=\"$PROJECT_DIR$/phones.js\" />\n        <option value=\"$PROJECT_DIR$/src/index.js\" />\n        <option value=\"$PROJECT_DIR$/src/containers/ProductList/ProductList.scss\" />\n        <option value=\"$PROJECT_DIR$/src/pipes/priceFormatter.js\" />\n        <option value=\"$PROJECT_DIR$/src/utilities/cumulativeOffset.js\" />\n        <option value=\"$PROJECT_DIR$/src/components/Footer/Footer.js\" />\n        <option value=\"$PROJECT_DIR$/src/components/SlideDots/SlideDots.scss\" />\n        <option value=\"$PROJECT_DIR$/src/components/SlideDots/SlideDots.js\" />\n        <option value=\"$PROJECT_DIR$/public/index.html\" />\n        <option value=\"$PROJECT_DIR$/src/pipes/shortenTitle.js\" />\n        <option value=\"$PROJECT_DIR$/src/components/ProductSlider.js\" />\n        <option value=\"$PROJECT_DIR$/src/components/ProductSlider/ProductSlider.js\" />\n        <option value=\"$PROJECT_DIR$/src/components/ProductSlider/ProductSlider.scss\" />\n        <option value=\"$PROJECT_DIR$/src/reducers/brand.filter.reducer.js\" />\n        <option value=\"$PROJECT_DIR$/src/pipes/brandFilter.js\" />\n        <option value=\"$PROJECT_DIR$/src/containers/FilterBar/FilterBar.js\" />\n        <option value=\"$PROJECT_DIR$/src/App.scss\" />\n        <option value=\"$PROJECT_DIR$/src/reducers/orderByPrice.filter.reducer.js\" />\n        <option value=\"$PROJECT_DIR$/src/reducers/index.js\" />\n        <option value=\"$PROJECT_DIR$/src/pipes/orderByFilter.js\" />\n        <option value=\"$PROJECT_DIR$/src/components/OrderFilter/OrderFilter.scss\" />\n        <option value=\"$PROJECT_DIR$/src/pages/ProductDetail/ProductDetail.js\" />\n        <option value=\"$PROJECT_DIR$/src/components/ProductDetail/ProductDetail.js\" />\n        <option value=\"$PROJECT_DIR$/src/index.scss\" />\n        <option value=\"$PROJECT_DIR$/src/pages/ShopingCart/ShoppingCart.js\" />\n        <option value=\"$PROJECT_DIR$/src/data/getData.js\" />\n        <option value=\"$PROJECT_DIR$/src/App.js\" />\n        <option value=\"$PROJECT_DIR$/src/actions/index.js\" />\n        <option value=\"$PROJECT_DIR$/src/reducers/pagination.reducer.js\" />\n        <option value=\"$PROJECT_DIR$/src/pipes/paginationFilter.js\" />\n        <option value=\"$PROJECT_DIR$/src/pages/Home/Home.js\" />\n        <option value=\"$PROJECT_DIR$/src/components/Pagination/Pagination.js\" />\n        <option value=\"$PROJECT_DIR$/src/reducers/shop.reducer.js\" />\n        <option value=\"$PROJECT_DIR$/src/components/CartItem/CartItem.scss\" />\n        <option value=\"$PROJECT_DIR$/src/components/Header/Header.js\" />\n        <option value=\"$PROJECT_DIR$/src/data/phones.js\" />\n        <option value=\"$PROJECT_DIR$/src/components/Product/Product.scss\" />\n        <option value=\"$PROJECT_DIR$/src/components/BrandFilter/BrandFilter.js\" />\n        <option value=\"$PROJECT_DIR$/src/components/BrandFilter/BrandFilter.scss\" />\n        <option value=\"$PROJECT_DIR$/src/components/OrderFilter/OrderFilter.js\" />\n        <option value=\"$PROJECT_DIR$/src/containers/ProductList/ProductList.js\" />\n        <option value=\"$PROJECT_DIR$/src/components/LayoutMode/LayoutMode.js\" />\n        <option value=\"$PROJECT_DIR$/src/components/CartItem/CartItem.js\" />\n        <option value=\"$PROJECT_DIR$/src/components/Product/Product.js\" />\n      </list>\n    </option>\n  </component>\n  <component name=\"JsBuildToolGruntFileManager\" detection-done=\"true\" sorting=\"DEFINITION_ORDER\" />\n  <component name=\"JsBuildToolPackageJson\" detection-done=\"true\" sorting=\"DEFINITION_ORDER\">\n    <package-json value=\"$PROJECT_DIR$/package.json\" />\n  </component>\n  <component name=\"JsGulpfileManager\">\n    <detection-done>true</detection-done>\n    <sorting>DEFINITION_ORDER</sorting>\n  </component>\n  <component name=\"NodeModulesDirectoryManager\">\n    <handled-path value=\"$PROJECT_DIR$/node_modules\" />\n  </component>\n  <component name=\"NodePackageJsonFileManager\">\n    <packageJsonPaths>\n      <path value=\"$PROJECT_DIR$/package.json\" />\n    </packageJsonPaths>\n  </component>\n  <component name=\"ProjectFrameBounds\" extendedState=\"6\">\n    <option name=\"x\" value=\"1750\" />\n    <option name=\"y\" value=\"16\" />\n    <option name=\"width\" value=\"2092\" />\n    <option name=\"height\" value=\"2094\" />\n  </component>\n  <component name=\"ProjectLevelVcsManager\" settingsEditedManually=\"true\" />\n  <component name=\"ProjectView\">\n    <navigator proportions=\"\" version=\"1\">\n      <foldersAlwaysOnTop value=\"true\" />\n    </navigator>\n    <panes>\n      <pane id=\"Scope\" />\n      <pane id=\"ProjectPane\">\n        <subPane>\n          <expand>\n            <path>\n              <item name=\"ecommerce\" type=\"b2602c69:ProjectViewProjectNode\" />\n              <item name=\"ecommerce\" type=\"462c0819:PsiDirectoryNode\" />\n            </path>\n            <path>\n              <item name=\"ecommerce\" type=\"b2602c69:ProjectViewProjectNode\" />\n              <item name=\"ecommerce\" type=\"462c0819:PsiDirectoryNode\" />\n              <item name=\"build\" type=\"462c0819:PsiDirectoryNode\" />\n            </path>\n            <path>\n              <item name=\"ecommerce\" type=\"b2602c69:ProjectViewProjectNode\" />\n              <item name=\"ecommerce\" type=\"462c0819:PsiDirectoryNode\" />\n              <item name=\"src\" type=\"462c0819:PsiDirectoryNode\" />\n            </path>\n          </expand>\n          <select />\n        </subPane>\n      </pane>\n    </panes>\n  </component>\n  <component name=\"PropertiesComponent\">\n    <property name=\"WebServerToolWindowFactoryState\" value=\"false\" />\n    <property name=\"last_opened_file_path\" value=\"C:/AngularWorkBench/studyCase\" />\n    <property name=\"node.js.detected.package.eslint\" value=\"true\" />\n    <property name=\"node.js.path.for.package.eslint\" value=\"project\" />\n    <property name=\"node.js.selected.package.eslint\" value=\"C:\\ReactWorkBench\\ecommerce\\node_modules\\eslint\" />\n    <property name=\"nodejs_interpreter_path\" value=\"node\" />\n    <property name=\"nodejs_interpreter_path.stuck_in_default_project\" value=\"undefined stuck path\" />\n    <property name=\"nodejs_npm_path_reset_for_default_project\" value=\"true\" />\n    <property name=\"nodejs_package_manager_path\" value=\"yarn\" />\n    <property name=\"settings.editor.selected.configurable\" value=\"configurable.group.appearance\" />\n  </component>\n  <component name=\"RecentsManager\">\n    <key name=\"MoveFile.RECENT_KEYS\">\n      <recent name=\"C:\\ReactWorkBench\\ecommerce\\src\\components\\ProductSlider\" />\n      <recent name=\"C:\\ReactWorkBench\\ecommerce\\src\\data\" />\n    </key>\n  </component>\n  <component name=\"RunDashboard\">\n    <option name=\"ruleStates\">\n      <list>\n        <RuleState>\n          <option name=\"name\" value=\"ConfigurationTypeDashboardGroupingRule\" />\n        </RuleState>\n        <RuleState>\n          <option name=\"name\" value=\"StatusDashboardGroupingRule\" />\n        </RuleState>\n      </list>\n    </option>\n  </component>\n  <component name=\"RunManager\">\n    <configuration name=\"build\" type=\"js.build_tools.npm\" factoryName=\"npm\" temporary=\"true\" nameIsGenerated=\"true\">\n      <package-json value=\"$PROJECT_DIR$/package.json\" />\n      <command value=\"run\" />\n      <scripts>\n        <script value=\"build\" />\n      </scripts>\n      <node-interpreter value=\"project\" />\n      <envs />\n      <method v=\"2\" />\n    </configuration>\n    <recent_temporary>\n      <list>\n        <item itemvalue=\"npm.build\" />\n      </list>\n    </recent_temporary>\n  </component>\n  <component name=\"SvnConfiguration\">\n    <configuration />\n  </component>\n  <component name=\"TaskManager\">\n    <task active=\"true\" id=\"Default\" summary=\"Default task\">\n      <changelist id=\"020428e6-7073-44e2-8b90-76d90e895943\" name=\"Default Changelist\" comment=\"\" />\n      <created>1551523495441</created>\n      <option name=\"number\" value=\"Default\" />\n      <option name=\"presentableId\" value=\"Default\" />\n      <updated>1551523495441</updated>\n      <workItem from=\"1551523496846\" duration=\"7020000\" />\n      <workItem from=\"1551544849221\" duration=\"39240000\" />\n      <workItem from=\"1551677285453\" duration=\"127000\" />\n      <workItem from=\"1551677452146\" duration=\"116000\" />\n      <workItem from=\"1551725494804\" duration=\"7346000\" />\n      <workItem from=\"1552070634490\" duration=\"785000\" />\n      <workItem from=\"1552071464919\" duration=\"1882000\" />\n      <workItem from=\"1552110528332\" duration=\"4934000\" />\n      <workItem from=\"1552159819586\" duration=\"1845000\" />\n      <workItem from=\"1552209387669\" duration=\"602000\" />\n      <workItem from=\"1552228612625\" duration=\"2472000\" />\n      <workItem from=\"1552236746721\" duration=\"574000\" />\n    </task>\n    <task id=\"LOCAL-00001\" summary=\"I've fixed some issues related to css.\">\n      <created>1552232148707</created>\n      <option name=\"number\" value=\"00001\" />\n      <option name=\"presentableId\" value=\"LOCAL-00001\" />\n      <option name=\"project\" value=\"LOCAL\" />\n      <updated>1552232148707</updated>\n    </task>\n    <option name=\"localTasksCounter\" value=\"2\" />\n    <servers />\n  </component>\n  <component name=\"TimeTrackingManager\">\n    <option name=\"totallyTimeSpent\" value=\"66943000\" />\n  </component>\n  <component name=\"ToolWindowManager\">\n    <frame x=\"-6\" y=\"-6\" width=\"1933\" height=\"1053\" extended-state=\"6\" />\n    <editor active=\"true\" />\n    <layout>\n      <window_info content_ui=\"combo\" id=\"Project\" order=\"0\" visible=\"true\" weight=\"0.14391144\" />\n      <window_info id=\"Structure\" order=\"1\" side_tool=\"true\" weight=\"0.25\" />\n      <window_info id=\"npm\" order=\"2\" side_tool=\"true\" />\n      <window_info id=\"Favorites\" order=\"3\" side_tool=\"true\" />\n      <window_info anchor=\"bottom\" id=\"Message\" order=\"0\" />\n      <window_info anchor=\"bottom\" id=\"Find\" order=\"1\" />\n      <window_info anchor=\"bottom\" id=\"Run\" order=\"2\" weight=\"0.469163\" />\n      <window_info anchor=\"bottom\" id=\"Debug\" order=\"3\" weight=\"0.4\" />\n      <window_info anchor=\"bottom\" id=\"Cvs\" order=\"4\" weight=\"0.25\" />\n      <window_info anchor=\"bottom\" id=\"Inspection\" order=\"5\" weight=\"0.4\" />\n      <window_info anchor=\"bottom\" id=\"TODO\" order=\"6\" />\n      <window_info anchor=\"bottom\" id=\"Docker\" order=\"7\" show_stripe_button=\"false\" />\n      <window_info anchor=\"bottom\" id=\"Version Control\" order=\"8\" show_stripe_button=\"false\" />\n      <window_info anchor=\"bottom\" id=\"Event Log\" order=\"9\" side_tool=\"true\" />\n      <window_info active=\"true\" anchor=\"bottom\" id=\"Terminal\" order=\"10\" visible=\"true\" weight=\"0.20814978\" />\n      <window_info anchor=\"right\" id=\"Commander\" internal_type=\"SLIDING\" order=\"0\" type=\"SLIDING\" weight=\"0.4\" />\n      <window_info anchor=\"right\" id=\"Ant Build\" order=\"1\" weight=\"0.25\" />\n      <window_info anchor=\"right\" content_ui=\"combo\" id=\"Hierarchy\" order=\"2\" weight=\"0.25\" />\n    </layout>\n    <layout-to-restore>\n      <window_info content_ui=\"combo\" id=\"Project\" order=\"0\" visible=\"true\" weight=\"0.06865671\" />\n      <window_info id=\"Structure\" order=\"1\" side_tool=\"true\" weight=\"0.25\" />\n      <window_info id=\"npm\" order=\"2\" side_tool=\"true\" />\n      <window_info id=\"Favorites\" order=\"3\" side_tool=\"true\" />\n      <window_info anchor=\"bottom\" id=\"Message\" order=\"0\" />\n      <window_info anchor=\"bottom\" id=\"Find\" order=\"1\" />\n      <window_info anchor=\"bottom\" id=\"Run\" order=\"2\" weight=\"0.32929516\" />\n      <window_info anchor=\"bottom\" id=\"Debug\" order=\"3\" weight=\"0.4\" />\n      <window_info anchor=\"bottom\" id=\"Cvs\" order=\"4\" weight=\"0.25\" />\n      <window_info anchor=\"bottom\" id=\"Inspection\" order=\"5\" weight=\"0.4\" />\n      <window_info anchor=\"bottom\" id=\"TODO\" order=\"6\" />\n      <window_info anchor=\"bottom\" id=\"Docker\" order=\"7\" show_stripe_button=\"false\" />\n      <window_info anchor=\"bottom\" id=\"Version Control\" order=\"8\" show_stripe_button=\"false\" />\n      <window_info anchor=\"bottom\" id=\"Event Log\" order=\"9\" side_tool=\"true\" />\n      <window_info active=\"true\" anchor=\"bottom\" id=\"Terminal\" order=\"10\" visible=\"true\" weight=\"0.0\" />\n      <window_info anchor=\"right\" id=\"Commander\" internal_type=\"SLIDING\" order=\"0\" type=\"SLIDING\" weight=\"0.4\" />\n      <window_info anchor=\"right\" id=\"Ant Build\" order=\"1\" weight=\"0.25\" />\n      <window_info anchor=\"right\" content_ui=\"combo\" id=\"Hierarchy\" order=\"2\" weight=\"0.25\" />\n    </layout-to-restore>\n  </component>\n  <component name=\"TypeScriptGeneratedFilesManager\">\n    <option name=\"version\" value=\"1\" />\n  </component>\n  <component name=\"VcsContentAnnotationSettings\">\n    <option name=\"myLimit\" value=\"2678400000\" />\n  </component>\n  <component name=\"VcsManagerConfiguration\">\n    <MESSAGE value=\"I've fixed some issues related to css.\" />\n    <option name=\"LAST_COMMIT_MESSAGE\" value=\"I've fixed some issues related to css.\" />\n  </component>\n  <component name=\"XDebuggerManager\">\n    <breakpoint-manager>\n      <breakpoints>\n        <line-breakpoint enabled=\"true\" type=\"javascript\">\n          <url>file://$PROJECT_DIR$/src/pages/ShopingCart/ShoppingCart.js</url>\n          <line>30</line>\n          <option name=\"timeStamp\" value=\"1\" />\n        </line-breakpoint>\n        <line-breakpoint enabled=\"true\" type=\"javascript\">\n          <url>file://$PROJECT_DIR$/src/containers/ProductList/ProductList.js</url>\n          <option name=\"timeStamp\" value=\"2\" />\n        </line-breakpoint>\n      </breakpoints>\n    </breakpoint-manager>\n  </component>\n  <component name=\"editorHistoryManager\">\n    <entry file=\"file://$PROJECT_DIR$/src/data/brands.js\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state>\n          <caret column=\"82\" selection-start-column=\"82\" selection-end-column=\"82\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/src/pipes/priceFormatter.js\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state relative-caret-position=\"46\">\n          <caret line=\"2\" column=\"2\" selection-start-line=\"2\" selection-start-column=\"2\" selection-end-line=\"2\" selection-end-column=\"2\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/src/utilities/cumulativeOffset.js\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state relative-caret-position=\"276\">\n          <caret line=\"12\" column=\"2\" selection-start-line=\"12\" selection-start-column=\"2\" selection-end-line=\"12\" selection-end-column=\"2\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/src/containers/ProductList/ProductList.scss\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\" />\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/src/components/SlideDots/SlideDots.scss\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state relative-caret-position=\"69\">\n          <caret line=\"3\" column=\"15\" selection-start-line=\"3\" selection-start-column=\"15\" selection-end-line=\"3\" selection-end-column=\"15\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/src/pipes/shortenTitle.js\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state relative-caret-position=\"46\">\n          <caret line=\"2\" column=\"2\" selection-start-line=\"2\" selection-start-column=\"2\" selection-end-line=\"2\" selection-end-column=\"2\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/src/pipes/brandFilter.js\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state relative-caret-position=\"46\">\n          <caret line=\"2\" lean-forward=\"true\" selection-start-line=\"2\" selection-end-line=\"2\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/src/containers/FilterBar/FilterBar.js\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state relative-caret-position=\"294\">\n          <caret line=\"13\" column=\"38\" selection-start-line=\"13\" selection-start-column=\"38\" selection-end-line=\"13\" selection-end-column=\"38\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/src/reducers/index.js\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state relative-caret-position=\"161\">\n          <caret line=\"7\" column=\"36\" lean-forward=\"true\" selection-start-line=\"7\" selection-start-column=\"36\" selection-end-line=\"7\" selection-end-column=\"36\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"jar://$APPLICATION_HOME_DIR$/lib/webstorm.jar!/resources/html5-schema/html5/phrase.rnc\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state relative-caret-position=\"213\">\n          <caret line=\"345\" column=\"16\" selection-start-line=\"345\" selection-start-column=\"16\" selection-end-line=\"345\" selection-end-column=\"16\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/src/components/SlideDots/SlideDots.js\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state relative-caret-position=\"299\">\n          <caret line=\"14\" selection-start-line=\"14\" selection-end-line=\"14\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/public/index.html\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state relative-caret-position=\"299\">\n          <caret line=\"13\" column=\"8\" selection-start-line=\"13\" selection-start-column=\"8\" selection-end-line=\"13\" selection-end-column=\"8\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/src/data/getData.js\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state relative-caret-position=\"1334\">\n          <caret line=\"58\" column=\"7\" selection-start-line=\"58\" selection-start-column=\"7\" selection-end-line=\"58\" selection-end-column=\"7\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/src/index.js\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state relative-caret-position=\"69\">\n          <caret line=\"7\" selection-start-line=\"7\" selection-end-line=\"7\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/src/reducers/orderByPrice.filter.reducer.js\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state relative-caret-position=\"207\">\n          <caret line=\"9\" column=\"22\" selection-start-line=\"9\" selection-start-column=\"22\" selection-end-line=\"9\" selection-end-column=\"22\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/src/App.js\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state relative-caret-position=\"253\">\n          <caret line=\"11\" column=\"64\" lean-forward=\"true\" selection-start-line=\"11\" selection-start-column=\"64\" selection-end-line=\"11\" selection-end-column=\"64\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/src/pipes/orderByFilter.js\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state relative-caret-position=\"115\">\n          <caret line=\"5\" column=\"21\" selection-start-line=\"5\" selection-start-column=\"21\" selection-end-line=\"5\" selection-end-column=\"21\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/src/components/Footer/Footer.js\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state relative-caret-position=\"138\">\n          <caret line=\"6\" column=\"81\" selection-start-line=\"6\" selection-start-column=\"81\" selection-end-line=\"6\" selection-end-column=\"81\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/src/reducers/brand.filter.reducer.js\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state relative-caret-position=\"46\">\n          <caret line=\"2\" column=\"60\" selection-start-line=\"2\" selection-start-column=\"60\" selection-end-line=\"2\" selection-end-column=\"60\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/src/components/ProductDetail/ProductDetail.js\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state relative-caret-position=\"506\">\n          <caret line=\"26\" column=\"6\" selection-start-line=\"26\" selection-start-column=\"6\" selection-end-line=\"26\" selection-end-column=\"6\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/src/actions/index.js\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state relative-caret-position=\"23\">\n          <caret line=\"1\" column=\"67\" selection-start-line=\"1\" selection-start-column=\"67\" selection-end-line=\"1\" selection-end-column=\"67\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/src/components/Pagination/Pagination.js\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state relative-caret-position=\"451\">\n          <caret line=\"34\" selection-start-line=\"34\" selection-end-line=\"34\" />\n          <folding>\n            <element signature=\"e#0#39#0\" expanded=\"true\" />\n          </folding>\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/src/pages/Home/Home.js\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state relative-caret-position=\"207\">\n          <caret line=\"12\" column=\"22\" selection-start-line=\"12\" selection-start-column=\"22\" selection-end-line=\"12\" selection-end-column=\"22\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/src/components/Pagination/Pagination.scss\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\" />\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/src/reducers/pagination.reducer.js\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state relative-caret-position=\"575\">\n          <caret line=\"25\" column=\"19\" selection-start-line=\"25\" selection-start-column=\"19\" selection-end-line=\"28\" selection-end-column=\"14\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/src/pipes/paginationFilter.js\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state relative-caret-position=\"138\">\n          <caret line=\"6\" column=\"5\" selection-start-line=\"6\" selection-start-column=\"5\" selection-end-line=\"6\" selection-end-column=\"5\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/src/App.scss\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\" />\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/src/index.scss\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state relative-caret-position=\"161\">\n          <caret line=\"7\" selection-start-line=\"7\" selection-end-line=\"18\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/src/pages/ProductDetail/ProductDetail.js\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state relative-caret-position=\"253\">\n          <caret line=\"14\" column=\"62\" selection-start-line=\"14\" selection-start-column=\"62\" selection-end-line=\"14\" selection-end-column=\"62\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/src/components/ProductSlider/ProductSlider.js\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state relative-caret-position=\"1058\">\n          <caret line=\"48\" column=\"46\" selection-start-line=\"48\" selection-start-column=\"46\" selection-end-line=\"48\" selection-end-column=\"46\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/src/components/ProductSlider/ProductSlider.scss\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state>\n          <caret selection-end-line=\"26\" selection-end-column=\"1\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/src/reducers/shop.reducer.js\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state relative-caret-position=\"1334\">\n          <caret line=\"64\" column=\"60\" selection-start-line=\"64\" selection-start-column=\"60\" selection-end-line=\"64\" selection-end-column=\"60\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/src/pages/ShopingCart/ShoppingCart.js\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state relative-caret-position=\"414\">\n          <caret line=\"21\" column=\"81\" selection-start-line=\"21\" selection-start-column=\"81\" selection-end-line=\"21\" selection-end-column=\"81\" />\n          <folding>\n            <element signature=\"e#0#26#0\" expanded=\"true\" />\n          </folding>\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/src/components/OrderFilter/OrderFilter.scss\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state relative-caret-position=\"-498\">\n          <caret selection-end-line=\"53\" selection-end-column=\"1\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/src/components/Header/Header.js\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state relative-caret-position=\"69\">\n          <caret line=\"5\" selection-start-line=\"5\" selection-end-line=\"5\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/src/components/CartItem/CartItem.scss\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state relative-caret-position=\"742\">\n          <caret line=\"82\" selection-start-line=\"82\" selection-end-line=\"82\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/src/components/BrandFilter/BrandFilter.js\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state relative-caret-position=\"575\">\n          <caret line=\"29\" column=\"62\" selection-start-line=\"29\" selection-start-column=\"62\" selection-end-line=\"29\" selection-end-column=\"62\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/src/components/BrandFilter/BrandFilter.scss\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state relative-caret-position=\"1311\">\n          <caret line=\"57\" column=\"1\" selection-start-line=\"57\" selection-start-column=\"1\" selection-end-line=\"57\" selection-end-column=\"1\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/src/components/OrderFilter/OrderFilter.js\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state relative-caret-position=\"1173\">\n          <caret line=\"54\" column=\"60\" selection-start-line=\"54\" selection-start-column=\"60\" selection-end-line=\"54\" selection-end-column=\"60\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/src/data/phones.js\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state relative-caret-position=\"69\">\n          <caret line=\"3\" column=\"15\" selection-start-line=\"3\" selection-start-column=\"15\" selection-end-line=\"3\" selection-end-column=\"15\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/src/components/Product/Product.scss\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state relative-caret-position=\"1610\">\n          <caret line=\"70\" column=\"1\" selection-start-line=\"70\" selection-start-column=\"1\" selection-end-line=\"70\" selection-end-column=\"1\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/src/containers/ProductList/ProductList.js\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state relative-caret-position=\"1449\">\n          <caret line=\"71\" column=\"88\" selection-start-line=\"71\" selection-start-column=\"88\" selection-end-line=\"71\" selection-end-column=\"88\" />\n          <folding>\n            <element signature=\"e#0#39#0\" expanded=\"true\" />\n          </folding>\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/src/components/LayoutMode/LayoutMode.js\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state relative-caret-position=\"322\">\n          <caret line=\"15\" column=\"7\" selection-start-line=\"15\" selection-start-column=\"7\" selection-end-line=\"15\" selection-end-column=\"7\" />\n          <folding>\n            <element signature=\"e#0#26#0\" expanded=\"true\" />\n          </folding>\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/src/components/CartItem/CartItem.js\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state relative-caret-position=\"204\">\n          <caret line=\"66\" column=\"46\" selection-start-line=\"66\" selection-start-column=\"46\" selection-end-line=\"66\" selection-end-column=\"46\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/src/components/Product/Product.js\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state relative-caret-position=\"-776\">\n          <caret line=\"31\" column=\"43\" selection-start-line=\"31\" selection-start-column=\"43\" selection-end-line=\"31\" selection-end-column=\"43\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/package.json\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\" />\n    </entry>\n  </component>\n</project>"
  },
  {
    "path": "README.md",
    "content": "# Here is the live demo <a href=\"http://numberless-leg.surge.sh\" style=\"font-size: 40px\">CLICK TO SEE DEMO</a>\n\n![alt-text](https://github.com/TheCodersDream/React-Ecommerce-App-with-Redux/blob/master/ecm1-1.png)\n![alt-text](https://github.com/TheCodersDream/React-Ecommerce-App-with-Redux/blob/master/ecm2-2.png)\n![alt-text](https://github.com/TheCodersDream/React-Ecommerce-App-with-Redux/blob/master/ecm3.png)\n![alt-text](https://github.com/TheCodersDream/React-Ecommerce-App-with-Redux/blob/master/ecm4.png)\n![alt-text](https://github.com/TheCodersDream/React-Ecommerce-App-with-Redux/blob/master/ecm5.png)\n\n\nThis project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app).\n\n## Available Scripts\n\nIn the project directory, you can run:\n\n### `npm start`\n\nRuns the app in the development mode.<br>\nOpen [http://localhost:3000](http://localhost:3000) to view it in the browser.\n\nThe page will reload if you make edits.<br>\nYou will also see any lint errors in the console.\n\n### `npm test`\n\nLaunches the test runner in the interactive watch mode.<br>\nSee the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information.\n\n### `npm run build`\n\nBuilds the app for production to the `build` folder.<br>\nIt correctly bundles React in production mode and optimizes the build for the best performance.\n\nThe build is minified and the filenames include the hashes.<br>\nYour app is ready to be deployed!\n\nSee the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information.\n\n### `npm run eject`\n\n**Note: this is a one-way operation. Once you `eject`, you can’t go back!**\n\nIf you aren’t satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project.\n\nInstead, it will copy all the configuration files and the transitive dependencies (Webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you’re on your own.\n\nYou don’t have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn’t feel obligated to use this feature. However we understand that this tool wouldn’t be useful if you couldn’t customize it when you are ready for it.\n\n## Learn More\n\nYou can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started).\n\nTo learn React, check out the [React documentation](https://reactjs.org/).\n\n### Code Splitting\n\nThis section has moved here: https://facebook.github.io/create-react-app/docs/code-splitting\n\n### Analyzing the Bundle Size\n\nThis section has moved here: https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size\n\n### Making a Progressive Web App\n\nThis section has moved here: https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app\n\n### Advanced Configuration\n\nThis section has moved here: https://facebook.github.io/create-react-app/docs/advanced-configuration\n\n### Deployment\n\nThis section has moved here: https://facebook.github.io/create-react-app/docs/deployment\n\n### `npm run build` fails to minify\n\nThis section has moved here: https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"ecommerce\",\n  \"version\": \"0.1.0\",\n  \"private\": true,\n  \"dependencies\": {\n    \"bootstrap\": \"^4.3.1\",\n    \"node-sass\": \"^4.11.0\",\n    \"react\": \"^16.8.3\",\n    \"react-dom\": \"^16.8.3\",\n    \"react-medium-image-zoom\": \"^3.0.15\",\n    \"react-redux\": \"^6.0.1\",\n    \"react-router-dom\": \"^4.3.1\",\n    \"react-scripts\": \"2.1.5\",\n    \"redux\": \"^4.0.1\"\n  },\n  \"scripts\": {\n    \"start\": \"react-scripts start\",\n    \"build\": \"react-scripts build\",\n    \"test\": \"react-scripts test\",\n    \"eject\": \"react-scripts eject\"\n  },\n  \"eslintConfig\": {\n    \"extends\": \"react-app\"\n  },\n  \"browserslist\": [\n    \">0.2%\",\n    \"not dead\",\n    \"not ie <= 11\",\n    \"not op_mini all\"\n  ]\n}\n"
  },
  {
    "path": "public/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <link rel=\"shortcut icon\" href=\"%PUBLIC_URL%/favicon.ico\" />\n    <meta\n      name=\"viewport\"\n      content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"\n    />\n    <meta name=\"theme-color\" content=\"#000000\" />\n    <link rel=\"manifest\" href=\"%PUBLIC_URL%/manifest.json\" />\n    <title>React App</title>\n  </head>\n  <body>\n    <noscript>You need to enable JavaScript to run this app.</noscript>\n    <div id=\"root\"></div>\n    <script src=\"https://use.fontawesome.com/c560c025cf.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/manifest.json",
    "content": "{\n  \"short_name\": \"React App\",\n  \"name\": \"Create React App Sample\",\n  \"icons\": [\n    {\n      \"src\": \"favicon.ico\",\n      \"sizes\": \"64x64 32x32 24x24 16x16\",\n      \"type\": \"image/x-icon\"\n    }\n  ],\n  \"start_url\": \".\",\n  \"display\": \"standalone\",\n  \"theme_color\": \"#000000\",\n  \"background_color\": \"#ffffff\"\n}\n"
  },
  {
    "path": "src/App.js",
    "content": "import React, { Component } from 'react';\nimport {Provider} from 'react-redux';\nimport {createStore } from 'redux';\nimport rootReducer from './reducers';\n\nimport {BrowserRouter, Switch, Route, Redirect} from 'react-router-dom';\n\nimport './App.scss';\nimport Home from \"./pages/Home/Home\";\nimport Header from \"./components/Header/Header\";\nimport Footer from \"./components/Footer/Footer\";\nimport ProductDetail from \"./pages/ProductDetail/ProductDetail\";\nimport ShoppingCart from \"./pages/ShopingCart/ShoppingCart\";\n\n\n\nexport const  store = createStore(rootReducer, window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__());\n\nclass App extends Component {\n  render() {\n    return (\n        <Provider store={store}>\n            <BrowserRouter>\n            <React.Fragment>\n                <Header/>\n                <Switch>\n                    <Route exact path={'/'} render={() => {\n                        return <Redirect to={'/products'}/>\n                    }}/>\n                    <Route exact path={'/products'} component={Home}/>\n                    <Route exact path={'/products/:id'} component={ProductDetail}/>\n                    <Route exact patr={'/cart'} component={ShoppingCart}/>\n                </Switch>\n                <Footer/>\n            </React.Fragment>\n            </BrowserRouter>\n        </Provider>\n    );\n  }\n}\n\nexport default App;\n"
  },
  {
    "path": "src/App.scss",
    "content": ""
  },
  {
    "path": "src/App.test.js",
    "content": "import React from 'react';\nimport ReactDOM from 'react-dom';\nimport App from './App';\n\nit('renders without crashing', () => {\n  const div = document.createElement('div');\n  ReactDOM.render(<App />, div);\n  ReactDOM.unmountComponentAtNode(div);\n});\n"
  },
  {
    "path": "src/actions/index.js",
    "content": "export const ADD_PRODUCT_TO_CART = 'ADD_PRODUCT_TO_CART';\nexport const REMOVE_PRODUCT_FROM_CART = 'REMOVE_PRODUCT_FROM_CART';\nexport const INCREMENT_CART_ITEM_QUANTITY = 'INCREMENT_CART_ITEM_QUANTITY';\nexport const DECREMENT_CART_ITEM_QUANTITY = 'DECREMENT_CART_ITEM_QUANTITY';\n\nexport const addProductToCart = product => {\n    return {\n        type: ADD_PRODUCT_TO_CART,\n        payload: product\n    }\n};\n\nexport const removeProductToCart = productId => {\n    return {\n        type: REMOVE_PRODUCT_FROM_CART,\n        payload: productId\n    }\n};\n\nexport const incrementCartQuantity = productId => {\n    return{\n        type: INCREMENT_CART_ITEM_QUANTITY,\n        payload: productId\n    }\n};\n\nexport const decrementCartQuantity = productId => {\n  return {\n      type: DECREMENT_CART_ITEM_QUANTITY,\n      payload: productId\n  }\n};\n\n\nexport const ADD_BRAND_TO_FILTER = 'ADD_BRAND_TO_FILTER';\nexport const REMOVE_BRAND_FROM_FILTER = 'REMOVE_BRAND_FROM_FILTER';\n\nexport const addBrandToFilter = brand => {\n    return {\n        type: ADD_BRAND_TO_FILTER,\n        brand\n    }\n};\n\n\nexport const removeBrandFromFilter = brand => {\n    return  {\n        type: REMOVE_BRAND_FROM_FILTER,\n        brand\n    }\n};\n\nexport const ORDER_BY_ASC = 'ORDER_BY_ASC';\nexport const ORDER_BY_DESC = 'ORDER_BY_DESC';\nexport const CLEAR_ORDER_BY_PRICE = 'CLEAR_ORDER_BY_PRICE';\n\nexport const orderByAsc = () => {\n    return {\n        type: ORDER_BY_ASC\n    }\n};\n\nexport const orderByDesc =  () => {\n    return {\n        type: ORDER_BY_DESC\n    }\n};\n\nexport const clearOrderBy = () => {\n    return {\n        type: CLEAR_ORDER_BY_PRICE\n    }\n};\n\n\nexport const PREV_PAGE = 'PREV_PAGE';\nexport const NEXT_PAGE = 'NEXT_PAGE';\nexport const GO_PAGE = 'GO_PAGE';\nexport const COUNT_ITEM = 'COUNT_ITEM';\n\n\nexport const nextPage = () => {\n    return {\n        type: NEXT_PAGE\n    }\n};\n\nexport const prevPage = () => {\n    return {\n        type: PREV_PAGE\n    }\n};\n\nexport const goPage = (n) => {\n    return {\n        type: GO_PAGE,\n        currentPage: n\n    }\n};\n\nexport const countItem = (n) => {\n    return {\n        type: COUNT_ITEM,\n        totalItemsCount: n\n    }\n}\n"
  },
  {
    "path": "src/components/BrandFilter/BrandFilter.js",
    "content": "import React, {Component} from 'react';\nimport {connect} from 'react-redux';\nimport './BrandFilter.scss';\nimport {brands} from \"../../data/brands\";\nimport {addBrandToFilter, removeBrandFromFilter} from \"../../actions\";\n\n\nconst BrandFilter = (props) => {\n\n    const {dispatch, brandItemsCount} = props;\n    const handleSelectBox = (e) => {\n        const name = e.target.name;\n        const value = e.target.checked;\n\n        if(e.target.checked) {\n            dispatch(addBrandToFilter(name));\n        } else {\n            dispatch(removeBrandFromFilter(name));\n        }\n    };\n\n\n        return (\n            <div className=\"card mb-3\">\n                <div className=\"card-header\">\n                    <h3>Brands</h3>\n                </div>\n                <ul className=\"list-group flex-row flex-wrap\">\n                    {brands.map(brand => (\n                        <li className=\"list-group-item flex-50\">\n                            <label className=\"custom-checkbox text-capitalize\"> {brand} ({brandItemsCount[brand]})\n                                <input type=\"checkbox\"\n                                       name={brand}\n                                       className=\"custom-checkbox__input\" onInput={handleSelectBox}/>\n                                <span className=\"custom-checkbox__span\"></span>\n                            </label>\n                        </li>\n                    ))}\n                </ul>\n            </div>\n        );\n\n};\n\nconst mapStateToProps = (state) => {\n\n    const brandItemsCount = {};\n\n    state.shop.products.forEach(p => {\n        brandItemsCount[p.brand] = brandItemsCount[p.brand] + 1 || 1;\n    });\n\n\n    return {\n        brandItemsCount\n    }\n\n};\n\nexport default connect(mapStateToProps)(BrandFilter);"
  },
  {
    "path": "src/components/BrandFilter/BrandFilter.scss",
    "content": ".custom-checkbox {\n  display: block;\n  position: relative;\n  padding-left: 2rem;\n  cursor: pointer;\n  user-select: none;\n\n  &__input {\n    position: absolute;\n    opacity: 0;\n    height: 0;\n    width: 0;\n\n\n  }\n\n  &__span {\n    position: absolute;\n    top: 50%;\n    left: 0;\n    transform: translateY(-50%);\n    height: 1.2rem;\n    width: 1.2rem;\n    background-color: white;\n    border: 2px solid gray;\n\n    &::after {\n      content: \"\";\n      opacity: 0;\n      position: absolute;\n      top: 50%;\n      left: 50%;\n      width: .6rem;\n      height: .6rem;\n      background-color: dodgerblue;\n      transform: translate(-50%, -50%);\n    }\n  }\n\n  &:hover &__span {\n    background-color: #eeeeee;\n  }\n\n  &__input:checked + &__span::after {\n    opacity: 1;\n  }\n}\n\n.flex-50 {\n  flex: 0 0 100%;\n}\n\n@media only screen and (max-width: 768px) {\n\n  .flex-50 {\n    flex: 0 0 50%;\n  }\n}"
  },
  {
    "path": "src/components/CartItem/CartItem.js",
    "content": "import React, {useState} from 'react';\nimport {connect} from 'react-redux';\nimport {shortenTitle} from \"../../pipes/shortenTitle\";\nimport {formatMoney} from \"../../pipes/priceFormatter\";\nimport './CartItem.scss';\nimport {addProductToCart, decrementCartQuantity, incrementCartQuantity, removeProductToCart} from \"../../actions\";\n\nconst CartItem = (\n    {\n        title,\n        price,\n        description,\n        quantity,\n        id,\n        img,\n        dispatch\n    }\n) => {\n\n    console.log(id);\n    const [itemQuantity, setItemQuantity] = useState(quantity);\n    const removeItem = () => {\n        dispatch(removeProductToCart(id));\n    };\n\n    const handleQuantityChange = (e) => {\n      /*  const value = e.target.value;\n        console.log(value)\n\n        if(value > 0 && value <= 10) {\n            setItemQuantity(value);\n            dispatch(addProductToCart(id));\n        } */\n    };\n\n    const incrementOrDecrement = (e, type) => {\n        const value = itemQuantity;\n        console.log(type, value);\n\n        if(type === 'inc' && value < 10) {\n            setItemQuantity(itemQuantity + 1);\n            dispatch(incrementCartQuantity(id));\n        }\n\n\n        if(type === 'desc' && value > 1) {\n            setItemQuantity(itemQuantity - 1);\n            dispatch(decrementCartQuantity(id));\n        }\n\n    };\n\n\n    return (\n        <div className=\"row align-items-center mb-3\">\n            <div className=\"col-12 col-sm-12 col-md-2 text-center\">\n                <img className=\"img-responsive\" src={img} style={{height: '60%', width: '60%'}} alt={description}\n                      />\n            </div>\n            <div className=\"col-12 text-sm-center col-sm-12 text-md-left col-md-6\">\n                <h4 className=\"product-name\"><strong>{shortenTitle(title)}</strong></h4>\n                <h4>\n                    <small className=\"product-description\">{description}</small>\n                </h4>\n            </div>\n            <div className=\"col-12 col-sm-12 text-sm-center col-md-4 text-md-right row product-quantity-container align-items-center\">\n                <div className=\"col-6 col-sm-6 col-md-6 text-md-right\" style={{paddingTop: '5px'}}>\n                    <h6><strong>{formatMoney(price)}$ <span className=\"text-muted\">x</span></strong></h6>\n                </div>\n                <div className=\"col-4 col-sm-4 col-md-4\">\n                    <div className=\"quantity\">\n                        <input\n                            onClick={(e) => {incrementOrDecrement(e, 'inc')}}\n                            type=\"button\" value=\"+\" className=\"plus\" />\n                            <input\n                                onChange={handleQuantityChange}\n                                type=\"number\" step=\"1\" max=\"10\" min=\"1\" value={itemQuantity} title=\"Qty\"\n                                   className=\"qty\"\n                                   size=\"4\" />\n                                <input\n                                    onClick={(e) => {incrementOrDecrement(e, 'desc')}}\n                                    type=\"button\" value=\"-\" className=\"minus\" />\n                    </div>\n                </div>\n                <div className=\"col-2 col-sm-2 col-md-2 text-right\">\n                    <button\n                        onClick={removeItem}\n                        type=\"button\" className=\"btn btn-outline-danger btn-xs\">\n                        <i className=\"fa fa-trash\"  />\n                    </button>\n                </div>\n            </div>\n        </div>\n    );\n};\n\nexport default connect()(CartItem);\n"
  },
  {
    "path": "src/components/CartItem/CartItem.scss",
    "content": "\n\n.quantity {\n  float: left;\n  margin-right: 15px;\n  background-color: #eee;\n  position: relative;\n  width: 80px;\n  overflow: hidden\n}\n\n.quantity input {\n  margin: 0;\n  text-align: center;\n  width: 15px;\n  height: 15px;\n  padding: 0;\n  float: right;\n  color: #000;\n  font-size: 20px;\n  border: 0;\n  outline: 0;\n  background-color: #F6F6F6\n}\n\n.quantity input.qty {\n  position: relative;\n  border: 0;\n  width: 100%;\n  height: 40px;\n  padding: 10px 25px 10px 10px;\n  text-align: center;\n  font-weight: 400;\n  font-size: 15px;\n  border-radius: 0;\n  background-clip: padding-box\n}\n\n.quantity .minus, .quantity .plus {\n  line-height: 0;\n  background-clip: padding-box;\n  -webkit-border-radius: 0;\n  -moz-border-radius: 0;\n  border-radius: 0;\n  -webkit-background-size: 6px 30px;\n  -moz-background-size: 6px 30px;\n  color: #bbb;\n  font-size: 20px;\n  position: absolute;\n  height: 50%;\n  border: 0;\n  right: 0;\n  padding: 0;\n  width: 25px;\n  z-index: 3\n}\n\n.quantity .minus:hover, .quantity .plus:hover {\n  background-color: #dad8da\n}\n\n.quantity .minus {\n  bottom: 0\n}\n.shopping-cart {\n  margin-top: 20px;\n}\n\n@media only screen and (max-width: 768px) {\n  .product-name {\n    font-size: 1rem;\n    margin-top: .5rem;\n  }\n\n  .product-description {\n    font-size: 1rem;\n  }\n\n  .product-quantity-container {\n    margin-top: .5rem;\n  }\n}\n"
  },
  {
    "path": "src/components/Footer/Footer.js",
    "content": "import React from 'react';\n\nconst Footer = () => {\n    return (\n        <footer className=\"py-5 bg-dark\">\n            <div className=\"container\">\n                <p className=\"m-0 text-center text-white\">Copyright © Emre Baskan 2019</p>\n            </div>\n        </footer>\n    );\n};\n\nexport default Footer;"
  },
  {
    "path": "src/components/Header/Header.js",
    "content": "import React from 'react';\nimport {connect} from 'react-redux';\nimport {NavLink} from 'react-router-dom';\n\nconst Header = ({cartLength}) => {\n\n    return (\n        <nav className=\"navbar navbar-expand-lg navbar-dark bg-dark fixed-top\">\n            <div className=\"container\">\n                <NavLink className=\"navbar-brand\" to=\"/\">Ecommerce</NavLink>\n                <div>\n                    <ul className=\"navbar-nav ml-auto\">\n                        <li className=\"nav-item\">\n                            <NavLink className=\"nav-link\" to={\"/cart\"}><i className=\"fa fa-shopping-cart mr-2\"\n                                                                          aria-hidden=\"true\" />Cart {cartLength ? `(${cartLength})`: ''}</NavLink>\n                        </li>\n                    </ul>\n                </div>\n            </div>\n        </nav>\n    );\n};\n\n\nconst mapStateToProps = (state) => {\n  return {\n      cartLength: state.shop.cart.length\n  }\n};\n\nexport default connect(mapStateToProps, null)(Header);\n\n\n/*\n*                         <li className=\"nav-item active\">\n                            <a className=\"nav-link\" href=\"#\">Home\n                                <span className=\"sr-only\">(current)</span>\n                            </a>\n                        </li>\n                        <li className=\"nav-item\">\n                            <a className=\"nav-link\" href=\"#\">About</a>\n                        </li>\n                        <li className=\"nav-item\">\n                            <a className=\"nav-link\" href=\"#\">Services</a>\n                        </li>\n                        <li className=\"nav-item\">\n                            <a className=\"nav-link\" href=\"#\">Contact</a>\n                        </li>\n* */"
  },
  {
    "path": "src/components/LayoutMode/LayoutMode.js",
    "content": "import React from 'react';\nimport './LayoutMode.scss';\n\nconst LayoutMode = (\n    {\n        len,\n        click,\n        isActive\n    }\n) => {\n\n    let items = [];\n\n    let classess = 'layout-mode__item';\n\n    if(isActive) {\n        classess += ' layout-mode__item--active'\n    }\n\n    for(let i = 0; i < len; i ++) {\n        items.push(<div  className={classess} />);\n    };\n\n\n    return (\n        <div className=\"layout-mode\" onClick={() => {click(len)}}>\n            {items}\n        </div>\n    );\n};\n\nexport default LayoutMode;\n"
  },
  {
    "path": "src/components/LayoutMode/LayoutMode.scss",
    "content": ".layout-mode {\n\n  display: flex;\n  flex-direction: row;\n  padding: .3rem;\n  border: 2px solid gray;\n  cursor: pointer;\n\n  &__item {\n    width: .7rem;\n    height: .7rem;\n    background-color: gray;\n\n    &--active {\n      background-color: dodgerblue;\n    }\n\n  }\n\n  &__item:not(:last-child) {\n    margin-right: .3rem;\n  }\n\n  &:not(:last-child) {\n    margin-right: .8rem;\n  }\n\n\n\n\n  &:hover {\n    border: 2px solid #646464;\n  }\n\n  &--active {\n    border: 2px solid dodgerblue;\n  }\n}\n"
  },
  {
    "path": "src/components/OrderFilter/OrderFilter.js",
    "content": "import React, {useState} from 'react';\nimport {connect} from 'react-redux';\nimport './OrderFilter.scss';\nimport {clearOrderBy, ORDER_BY_ASC, ORDER_BY_DESC, orderByAsc, orderByDesc} from \"../../actions\";\n\nconst OrderFilter = ({dispatch}) => {\n\n    let removeSelected;\n    const [selected, setSelected] = useState('');\n\n    const handleRadioChange = (e) => {\n        const value = e.target.value;\n        setSelected(value);\n        if(value === ORDER_BY_ASC) {\n            dispatch(orderByAsc());\n        } else {\n            dispatch(orderByDesc());\n        }\n    };\n\n    const removeFilter = (e) => {\n\n        const buttons = document.getElementsByName('orderByPrice');\n\n        buttons.forEach(el => {\n            el.checked = false;\n        });\n\n        dispatch(clearOrderBy());\n        setSelected('');\n    };\n\n    if(selected) {\n        removeSelected  =  <span onClick={removeFilter} className=\"text-remove-selected text-right\">Remove filter</span>\n    }\n\n\n\n    return (\n            <div className=\"card\">\n                <div className=\"card-header\">\n                    <h3>Price {removeSelected} </h3>\n                </div>\n                <ul className=\"list-group flex-row  flex-wrap\" >\n                    <li className=\"list-group-item flex-fill\">\n                        <label className=\"custom-radio-btn\"> Low to high\n                            <input\n                                    value={ORDER_BY_ASC}\n                                    type=\"radio\"\n                                    onChange={handleRadioChange}\n                                   name=\"orderByPrice\" className=\"custom-radio-btn__input\"/>\n                            <span className=\"custom-radio-btn__span\"></span>\n                        </label>\n                    </li>\n                    <li className=\"list-group-item flex-fill\">\n                        <label className=\"custom-radio-btn\"> High to low\n                            <input\n                                value={ORDER_BY_DESC}\n                                onChange={handleRadioChange}\n                                type=\"radio\" name=\"orderByPrice\" className=\"custom-radio-btn__input\"/>\n                            <span className=\"custom-radio-btn__span\"></span>\n                        </label>\n                    </li>\n                </ul>\n            </div>\n    );\n};\n\nexport default connect()(OrderFilter);"
  },
  {
    "path": "src/components/OrderFilter/OrderFilter.scss",
    "content": ".custom-radio-btn {\n  display: block;\n  position: relative;\n  cursor: pointer;\n  padding-left: 2rem;\n  user-select: none;\n\n  &__input {\n    position: absolute;\n    opacity: 0;\n    cursor: pointer;\n  }\n\n  &__span {\n    position: absolute;\n    top: 50%;\n    left: 0;\n    height: 1.3rem;\n    width: 1.3rem;\n    background-color: #eeeeee;\n    border-radius: 12px;\n    transform: translateY(-50%);\n\n    &::after {\n      position: absolute;\n      top: 50%;\n      left: 50%;\n      transform: translate(-50%, -50%);\n      width: .7rem;\n      height: .7rem;\n      border-radius: 50%;\n      background-color: dodgerblue;\n      content: \"\";\n      display: none;\n    }\n  }\n\n  &__input:checked ~ &__span::after {\n    display: block;\n  }\n\n  &:hover &__span {\n    background-color: #dfdfdf;\n  }\n\n\n}\n\n.text-remove-selected {\n  font-size: 1rem;\n  font-weight: normal;\n  cursor: pointer;\n  padding-left: 2rem;\n}"
  },
  {
    "path": "src/components/Pagination/Pagination.js",
    "content": "import React, {Component} from 'react';\nimport {connect} from \"react-redux\";\nimport {goPage, nextPage, prevPage} from \"../../actions\";\n\nclass Pagination extends Component {\n\n\n    onPage(n){\n        this.props.onGoPage(n);\n    }\n\n    isOnLastPage(){\n        // console.log(this.props.perPage * this.props.currentPage, this.props.totalItemsCount);\n        return this.props.perPage * this.props.currentPage >= this.props.totalItemsCount;\n    }\n\n    totalPages() {\n        return Math.ceil(this.props.totalItemsCount / this.props.perPage) || 0;\n    }\n\n    getMin(){\n        return ((this.props.perPage * this.props.currentPage) - this.props.perPage) + 1;\n    }\n\n    getMax() {\n        let max = this.props.perPage * this.props.currentPage;\n        if (max > this.props.totalItemsCount) {\n            max = this.props.totalItemsCount;\n        }\n        return max;\n    }\n    onPrev = () => {\n        this.props.onPrevPage();\n    }\n\n    onNext = () =>  {\n        this.props.onNextPage();\n    }\n\n\n    getPages = () => {\n        const c = Math.ceil(this.props.totalItemsCount / this.props.perPage);\n        const p = this.props.currentPage || 1;\n        const pagesToShow = this.props.pagesToShow || 9;\n        const pages = [];\n        pages.push(p);\n        const times = pagesToShow - 1;\n        for (let i = 0; i < times; i++) {\n            if (pages.length < pagesToShow) {\n                if (Math.min.apply(null, pages) > 1) {\n                    pages.push(Math.min.apply(null, pages) - 1);\n                }\n            }\n            if (pages.length < pagesToShow) {\n                if (Math.max.apply(null, pages) < c) {\n                    pages.push(Math.max.apply(null, pages) + 1);\n                }\n            }\n        }\n        pages.sort((a, b) => a - b);\n        return pages;\n    }\n\n\n\n\n    render() {\n\n        console.log(this.props);\n\n        const pages =this.getPages().map(pageNum => {\n\n            let buttonClass = 'page-item';\n\n            if(pageNum === this.props.currentPage) {\n                buttonClass += ' active';\n            }\n\n            return (<li className={buttonClass} onClick={() => {this.onPage(pageNum)}}><button className=\"page-link\" >{pageNum}</button></li>);\n        });\n\n        let prevButtonClass = 'page-item';\n\n        if (this.props.currentPage === 1) {\n            prevButtonClass += ' disabled';\n        }\n\n        const prevButton = (<li className={prevButtonClass}>\n            <button\n                className=\"page-link\" onClick={this.onPrev} tabIndex=\"-1\">Previous</button>\n        </li>);\n\n        let nextButtonClass = 'page-item';\n\n        if(this.isOnLastPage()) {\n            nextButtonClass += ' disabled';\n        }\n\n        const nextButton = (\n            <li className={nextButtonClass}>\n                <button\n                    disabled={this.isOnLastPage()}\n                    className=\"page-link\" onClick={this.onNext}>Next</button>\n            </li>\n        );\n\n\n\n        return (\n            <nav aria-label=\"...\">\n                <ul className=\"pagination\">\n                    {prevButton}\n                    {pages}\n                    {nextButton}\n                </ul>\n            </nav>\n        );\n    }\n}\n\n\nconst mapStateToProps = (state) => {\n    return {\n        ...state.pagination,\n        totalItemsCount: state.shop.products.length,\n    }\n};\n\nexport default Pagination;\n"
  },
  {
    "path": "src/components/Pagination/Pagination.scss",
    "content": ""
  },
  {
    "path": "src/components/Product/Product.js",
    "content": "import React, {useState} from 'react';\nimport {connect} from 'react-redux';\nimport {Link} from 'react-router-dom';\nimport {formatMoney} from \"../../pipes/priceFormatter\";\nimport {cumulativeOffSet} from \"../../utilities/cumulativeOffset\";\n\nimport './Product.scss';\nimport SlideDots from \"../SlideDots/SlideDots\";\nimport {addProductToCart} from \"../../actions\";\n\n\nconst Product = (props) => {\n\n    const {\n        title,\n        price,\n        images,\n        description,\n        id,\n    } = props.product;\n\n    const imageRef = React.createRef();\n    const [img, setImg] = useState(images[0]);\n    const [aItem, setAItem] = useState(0);\n\n\n    const handleImageChange = (e) => {\n\n        let  clientX;\n\n        if(e.type === 'touchmove') {\n            clientX = e.touches[0].clientX;\n        } else {\n            clientX = e.clientX;\n        }\n\n        const currentX = clientX - cumulativeOffSet(imageRef.current).left;\n\n        // console.dir(imageRef.current);\n\n        const part = imageRef.current.clientWidth / images.length;\n       // console.log(Math.ceil(currentX / part) - 1);\n\n        let imgIndex = Math.ceil(currentX / part) - 1;\n        if (imgIndex < 0) {\n            imgIndex = 0;\n        }\n\n        if (imgIndex >= images.length) {\n            imgIndex = images.length - 1;\n        }\n        setAItem(imgIndex);\n        setImg(images[imgIndex]);\n    };\n\n    const handleMouseOut = (e) => {\n        setImg(images[0]);\n        setAItem(0);\n    };\n\n    const changeImage = (i) => {\n        setImg(images[i]);\n        setAItem(i);\n    }\n\n    return (\n        <div className=\"card h-100 product\">\n            <Link to={`/products/${id}`} className=\"product__link\"><img\n                onMouseMove={handleImageChange}\n                onMouseOut={handleMouseOut}\n                onTouchMove={handleImageChange}\n                onTouchEnd={handleMouseOut}\n                className=\"card-img-top product__img\" src={img} alt={title} ref={imageRef}/>\n                <SlideDots len={images.length} activeItem={aItem} changeItem={changeImage}/>\n            </Link>\n            <div className=\"card-body product__text\">\n                <h4 className=\"card-title product__title\">\n                    <Link to={`/products/${id}`}>{title}</Link>\n                </h4>\n                <h5 className=\"product__price\">${formatMoney(price)}</h5>\n                <p className=\"card-text product__description\">{description}</p>\n                <button\n                    onClick={() => {\n                        props.dispatch(addProductToCart({...props.product}))\n                    }}\n                    className=\"btn btn-info product__add-to-cart\">Add to cart\n                </button>\n            </div>\n        </div>\n    );\n};\n\nexport default connect()(Product);\n\n"
  },
  {
    "path": "src/components/Product/Product.scss",
    "content": ".product {\n  padding-bottom: 2rem;\n  &__img {\n    width: 100%;\n    height: 100%;\n  }\n\n  &__text {\n    flex: 0 0 40%;\n  }\n\n  &__link {\n    flex: 0 0 60%;\n    height: 60%;\n    padding: 1rem;\n    position: relative;\n  }\n\n  &__title {\n    font-size: .8rem;\n  }\n\n  &__price {\n\n  }\n\n  &__description {\n    font-size: 0.7rem;\n  }\n\n  &:hover {\n    box-shadow: 0 1rem 2rem rgba(0,0,0, .2);\n  }\n\n  &__add-to-cart {\n    position: absolute;\n    bottom: .8rem;\n    width: 60%;\n    left: 50%;\n    opacity: 0;\n    visibility: hidden;\n    transform: translateX(-50%);\n    transition: all .2s;\n    padding: 3px 12px;\n\n  }\n\n  &:hover &__add-to-cart {\n    visibility: visible;\n    opacity: 1;\n  }\n\n  &:hover .owl-dots {\n    display: inline-block;\n  }\n\n}\n\n@media only screen and (max-width: 768px) {\n  .product {\n    height: auto !important;\n    &__add-to-cart {\n      visibility: visible;\n      opacity: 1;\n    }\n\n    & .owl-dots {\n      display: inline-block;\n    }\n  }\n}"
  },
  {
    "path": "src/components/ProductDetail/ProductDetail.js",
    "content": "import React from 'react';\nimport {connect} from 'react-redux';\nimport {formatMoney} from \"../../pipes/priceFormatter\";\nimport {addProductToCart} from \"../../actions\";\n\nconst ProductDetail = (props) => {\n\n    const {\n        title,\n        images,\n        brand,\n        price,\n        cpu,\n        camera,\n        size,\n        weight,\n        display,\n        battery,\n        memory,\n        description,\n        id\n    } = props.product;\n\n\n    const onCart = () => {\n        props.dispatch(addProductToCart(props.product));\n    };\n\n    return (\n        <aside className=\"col-sm-7\">\n            <article className=\"card-body p-5\">\n                <h3 className=\"title mb-3\">{title}</h3>\n\n                <p className=\"price-detail-wrap\">\n\t<span className=\"price h3 text-warning\">\n\t\t<span className=\"currency\">$</span><span className=\"num\">{formatMoney(price)}</span>\n\t</span>\n                </p>\n                <dl className=\"item-property\">\n                    <dt>Description</dt>\n                    <dd><p className=\"text-capitalize\">{description}</p></dd>\n                </dl>\n                <dl className=\"param param-feature\">\n                    <dt>Brand</dt>\n                    <dd className=\"text-capitalize\">{brand}</dd>\n                </dl>\n                <dl className=\"param param-feature\">\n                    <dt>Size</dt>\n                    <dd>{size}</dd>\n                </dl>\n                <dl className=\"param param-feature\">\n                    <dt>Camera</dt>\n                    <dd>{camera}</dd>\n                </dl>\n                <dl className=\"param param-feature\">\n                    <dt>CPU</dt>\n                    <dd>{cpu}</dd>\n                </dl>\n                <dl className=\"param param-feature\">\n                    <dt>Memory</dt>\n                    <dd>{memory}</dd>\n                </dl>\n                <dl className=\"param param-feature\">\n                    <dt>Display</dt>\n                    <dd>{display}</dd>\n                </dl>\n                <dl className=\"param param-feature\">\n                    <dt>Battery</dt>\n                    <dd>{battery}</dd>\n                </dl>\n                <hr/>\n                <hr/>\n                <button\n                    onClick={onCart}\n                    className=\"btn btn-lg btn-outline-primary text-uppercase\"><i\n                    className=\"fa fa-shopping-cart\"/> Add to cart\n                </button>\n            </article>\n        </aside>\n    );\n};\n\nexport default connect()(ProductDetail);\n"
  },
  {
    "path": "src/components/ProductSlider/ProductSlider.js",
    "content": "import React, {useState} from 'react';\nimport {cumulativeOffSet} from \"../../utilities/cumulativeOffset\"\nimport './ProductSlider.scss';\n\nconst ProductSlider = (\n    {\n        images\n    }\n) => {\n    const imageRef = React.createRef();\n    const [img, setImg] = useState(images[0]);\n    const [aItem, setAItem] = useState(0);\n\n\n    const handleImageChange = (e) => {\n        const currentX = e.clientX - cumulativeOffSet(imageRef.current).left;\n\n        console.dir(imageRef.current);\n\n        const part = imageRef.current.clientWidth / images.length;\n        console.log(Math.ceil(currentX / part) - 1);\n\n        let imgIndex = Math.ceil(currentX / part) - 1;\n        if (imgIndex < 0) {\n            imgIndex = 0;\n        }\n\n        if (imgIndex >= images.length) {\n            imgIndex = images.length - 1;\n        }\n        setAItem(imgIndex);\n        setImg(images[imgIndex]);\n    };\n\n    const handleMouseOut = (e) => {\n        setImg(images[0]);\n        setAItem(0);\n    };\n\n    const changeImage = (i) => {\n        setImg(images[i]);\n        setAItem(i);\n    }\n\n\n    return (\n        <aside className=\"col-sm-5 border-right\">\n            <article className=\"gallery-wrap\">\n                <div className=\"img-big-wrap\">\n                    <div style={{padding: '2rem'}}><a href=\"#\"><img\n                        ref={imageRef}\n                        onMouseMove={handleImageChange}\n                        onMouseOut={handleMouseOut}\n                        src={img}\n                        style={{width: '100%',\n                                height: '100%'}}\n                    /></a></div>\n                </div>\n                <div className=\"img-small-wrap\">\n                    {images.map((img , i ) => (\n                        <div className=\"item-gallery\" onClick={() => {changeImage(i)}}><img src={img}/></div>\n                    ))}\n                </div>\n            </article>\n        </aside>\n    );\n};\n\nexport default ProductSlider;"
  },
  {
    "path": "src/components/ProductSlider/ProductSlider.scss",
    "content": ".gallery-wrap .img-big-wrap img {\n  height: 450px;\n  width: auto;\n  display: inline-block;\n}\n\n\n\n.gallery-wrap .img-small-wrap .item-gallery {\n  width: 60px;\n  height: 60px;\n  border: 1px solid #ddd;\n  margin: 7px 2px;\n  display: inline-block;\n  overflow: hidden;\n}\n\n.gallery-wrap .img-small-wrap {\n  text-align: center;\n}\n.gallery-wrap .img-small-wrap img {\n  max-width: 100%;\n  max-height: 100%;\n  object-fit: cover;\n  border-radius: 4px;\n  cursor: pointer;\n}"
  },
  {
    "path": "src/components/SlideDots/SlideDots.js",
    "content": "import React from 'react';\nimport './SlideDots.scss';\n\nconst SlideDots = (\n    {\n        len,\n        activeItem,\n        changeItem\n    }\n) => {\n\n    const dots = [];\n    for(let i = 0; i < len; i++) {\n        let dotClass = 'owl-dot';\n\n        if(activeItem === i) {\n            dotClass += ' active';\n        }\n\n        dots.push(<button\n            onClick={() => {changeItem(i)}}\n            role=\"button\"\n            className={dotClass}><span></span></button>)\n    }\n\n    return (\n        <div className=\"owl-dots\">\n            {dots}\n        </div>\n    );\n};\n\nexport default SlideDots;"
  },
  {
    "path": "src/components/SlideDots/SlideDots.scss",
    "content": ".owl-dots {\n  display: none;\n  position: absolute;\n  bottom: -1rem;\n  left: 0;\n\n}\n\n.owl-dots {\n  width: 100%;\n  text-align: center;\n}\n\n.owl-dots .active.owl-dot {\n  background-color: #f28b00;\n  border-color: #f28b00;\n}\n\n.owl-dots .owl-dot {\n  display: inline-block;\n  zoom: 1;\n  margin: 8px 4px;\n  border-radius: 10px;\n  -moz-border-radius: 10px;\n  -o-border-radius: 10px;\n  -webkit-border-radius: 10px;\n  -ms-webkit-radius: 10px;\n  zoom: 1;\n  background-color: #fff;\n  padding: 3px;\n  border: solid 1px #e9e9e9;\n  cursor: pointer;\n}"
  },
  {
    "path": "src/containers/FilterBar/FilterBar.js",
    "content": "import React, {Component} from 'react';\nimport BrandFilter from \"../../components/BrandFilter/BrandFilter\";\nimport OrderFilter from \"../../components/OrderFilter/OrderFilter\";\n\nclass FilterBar extends Component {\n    render() {\n        return (\n            <div className=\"col-lg-3\">\n                <div className=\"row\">\n                    <div className=\"col-12\">\n                        <BrandFilter/>\n                    </div>\n                    <div className=\"col-12\">\n                        <OrderFilter/>\n                    </div>\n                </div>\n            </div>\n        );\n    }\n}\n\nexport default FilterBar;"
  },
  {
    "path": "src/containers/ProductList/ProductList.js",
    "content": "import React, {Component} from 'react';\nimport {connect} from 'react-redux';\nimport Product from \"../../components/Product/Product\";\n\nimport {brandFilter} from \"../../pipes/brandFilter\";\nimport {orderByFilter} from \"../../pipes/orderByFilter\";\nimport LayoutMode from \"../../components/LayoutMode/LayoutMode\";\nimport {paginationPipe} from \"../../pipes/paginationFilter\";\nimport Pagination from \"../../components/Pagination/Pagination\";\n\nclass ProductList extends Component {\n\n    state = {\n        colValue : 'col-lg-4',\n        perPage: 12,\n        currentPage: 1,\n        pagesToShow: 3,\n        gridValue: 3\n    };\n\n    changeLayout = (n) => {\n        this.setState({gridValue: n});\n\n        let realGridValue;\n\n        if(n === 4) {\n            realGridValue = 3\n        } else {\n            realGridValue = 4;\n        }\n\n      this.setState({\n          colValue: `col-lg-${realGridValue}`\n      });\n    };\n\n\n    onPrev = () => {\n        const updatedState = {...this.state};\n        updatedState.currentPage = this.state.currentPage - 1;\n        this.setState(updatedState);\n    };\n\n\n    onNext = () => {\n        this.setState({\n            ...this.state,\n            currentPage: this.state.currentPage + 1\n        });\n    };\n\n    goPage = (n) => {\n        this.setState({\n            ...this.state,\n            currentPage: n\n        });\n    };\n\n\n    render() {\n\n        let isActive = this.state.colValue[this.state.colValue.length -1];\n\n        return (\n            <div className=\"col-lg-9\">\n                <div className=\"row mb-3\">\n                    <div className=\"col-12 d-none d-lg-block d-xl-block\">\n                        <div className=\"card \">\n                            <div className=\"card-header d-flex justify-content-end\">\n                                <span className=\"mr-3\">Change Layout: </span>\n                                <LayoutMode len={3} isActive={this.state.gridValue === 3} click={this.changeLayout} />\n                                <LayoutMode len={4} isActive={this.state.gridValue === 4}  click={this.changeLayout} />\n                            </div>\n                        </div>\n                    </div>\n                </div>\n                <div className=\"row\">\n                    {paginationPipe(this.props.products, this.state).map(product =>{\n                        let classes = `${this.state.colValue} col-md-6 mb-4`;\n                        return (<div className={classes}>\n                            <Product key={product.id} product={product} />\n                        </div>)\n                    })}\n                </div>\n                <div className=\"d-flex justify-content-end\">\n                    <Pagination\n                        totalItemsCount={this.props.products.length}\n                        currentPage={this.state.currentPage}\n                        perPage={this.state.perPage}\n                        pagesToShow={this.state.pagesToShow}\n                        onGoPage={this.goPage}\n                        onPrevPage={this.onPrev}\n                        onNextPage={this.onNext}\n                    />\n                </div>\n            </div>\n        );\n    }\n}\n\nconst mapStateToProps = state => {\n    const brands = state.brandFilter;\n    const orderBy = state.orderBy;\n\n    const filterByBrandArr = brandFilter(state.shop.products, brands);\n    const filterByOrderArr = orderByFilter(filterByBrandArr, orderBy);\n\n\n    return {products: filterByOrderArr }\n};\n\nexport default connect(mapStateToProps, null)(ProductList);\n"
  },
  {
    "path": "src/containers/ProductList/ProductList.scss",
    "content": "\n$body-bg: #000;\n\n@import '~bootstrap/scss/bootstrap.scss';"
  },
  {
    "path": "src/data/brands.js",
    "content": "export const brands = [\"apple\",\"huawei\",\"meizu\",\"samsung\",\"vestel\",\"xiaomi\",\"asus\"];"
  },
  {
    "path": "src/data/getData.js",
    "content": "\nvar imagesMap = {};\n\nvar images = document.querySelectorAll('.product-image');\n\nconsole.log(images);\n\nimages.forEach(img => {\n\n    if(!imagesMap[img.title]) {\n        imagesMap[img.title] = [];\n        imagesMap[img.title].push(img.src);\n    } else {\n        imagesMap[img.title].push(img.src);\n    }\n\n});\n\nfor (let key in imagesMap) {\n\n    if(imagesMap[key].length === 0) {\n        delete imagesMap[key];\n    }\n\n    if(!imagesMap[key][0]) {\n        imagesMap[key].splice(0,1);\n    }\n\n\n}\n\nfunction getRandomArbitrary(min, max) {\n    return Math.random() * (max - min) + min;\n}\n\nbrand\nvar phones = Object.keys(imagesMap).reduce((acc, key , i) => {\n\n    if(imagesMap[key].length !== 0) {\n        var newPhone = {\n            price: getRandomArbitrary(1500, 10000),\n            cpu: \"1.3GHz Apple A6\",\n            camera: \"8mp (3264x2448)\",\n            size: \"124.4mm x 59.2mm x 8.97mm (4.9 x 2.33 x 0.35)\",\n            weight: \"132 grams (4.7 ounces) with battery\",\n            display: \"4.0 326 pixel density\",\n            battery: \"1480 mAh\",\n            memory: \"16GB, 32GB and RAM 1 GB\"\n        };\n        newPhone.title = key;\n        newPhone.brand = key.split(' ')[0].toLowerCase();\n        newPhone.category = 'phone';\n        newPhone.images = imagesMap[key];\n\n        acc.push(newPhone);\n    }\n\n    return acc;\n}, []);\n\nconsole.log(JSON.stringify(phones));"
  },
  {
    "path": "src/data/phones.js",
    "content": "export const phones = [{\n    \"title\": \"Apple iPhone 7 Plus 32 GB (Apple Türkiye Garantili)\",\n    \"category\": \"phone\",\n    \"images\": [\"https://productimages.hepsiburada.net/s/18/280-413/9801258663986.jpg?v1\", \"https://productimages.hepsiburada.net/s/18/280-413/9801258696754.jpg?v1\", \"https://productimages.hepsiburada.net/s/18/280-413/9801258729522.jpg?v1\", \"https://productimages.hepsiburada.net/s/18/280-413/9801258762290.jpg?v1\"],\n    \"brand\": \"apple\",\n    \"price\": 4241.499828399639,\n    \"cpu\": \"1.3GHz Apple A6\",\n    \"camera\": \"8mp (3264x2448)\",\n    \"size\": \"124.4mm x 59.2mm x 8.97mm (4.9 x 2.33 x 0.35)\",\n    \"weight\": \"132 grams (4.7 ounces) with battery\",\n    \"display\": \"4.0 326 pixel density\",\n    \"battery\": \"1480 mAh\",\n    \"memory\": \"16GB, 32GB and RAM 1 GB\",\n    \"id\": 0,\n    \"description\": \"Lorem ipsum dolor sit amet, consectetur adipisicing elit. Amet numquam aspernatur!\"\n}, {\n    \"title\": \"Huawei Mate 20 Lite 64 GB (Huawei Türkiye Garantili)\",\n    \"category\": \"phone\",\n    \"images\": [\"https://productimages.hepsiburada.net/s/21/280-413/9933217792050.jpg?v1\", \"https://productimages.hepsiburada.net/s/21/280-413/9933217628210.jpg?v1\", \"https://productimages.hepsiburada.net/s/21/280-413/9933217660978.jpg?v1\", \"https://productimages.hepsiburada.net/s/21/280-413/9933217693746.jpg?v1\"],\n    \"brand\": \"huawei\",\n    \"price\": 1823.6625483451157,\n    \"cpu\": \"1.3GHz Apple A6\",\n    \"camera\": \"8mp (3264x2448)\",\n    \"size\": \"124.4mm x 59.2mm x 8.97mm (4.9 x 2.33 x 0.35)\",\n    \"weight\": \"132 grams (4.7 ounces) with battery\",\n    \"display\": \"4.0 326 pixel density\",\n    \"battery\": \"1480 mAh\",\n    \"memory\": \"16GB, 32GB and RAM 1 GB\",\n    \"id\": 1,\n    \"description\": \"Lorem ipsum dolor sit amet, consectetur adipisicing elit. Amet numquam aspernatur!\"\n}, {\n    \"title\": \"Huawei P20 Lite 64 GB (Huawei Türkiye Garantili)\",\n    \"category\": \"phone\",\n    \"images\": [\"https://productimages.hepsiburada.net/s/19/280-413/9826975907890.jpg?v1\", \"https://productimages.hepsiburada.net/s/19/280-413/9826975940658.jpg?v1\", \"https://productimages.hepsiburada.net/s/19/280-413/9826975973426.jpg?v1\", \"https://productimages.hepsiburada.net/s/19/280-413/9826976006194.jpg?v1\"],\n    \"brand\": \"huawei\",\n    \"price\": 7429.467511354926,\n    \"cpu\": \"1.3GHz Apple A6\",\n    \"camera\": \"8mp (3264x2448)\",\n    \"size\": \"124.4mm x 59.2mm x 8.97mm (4.9 x 2.33 x 0.35)\",\n    \"weight\": \"132 grams (4.7 ounces) with battery\",\n    \"display\": \"4.0 326 pixel density\",\n    \"battery\": \"1480 mAh\",\n    \"memory\": \"16GB, 32GB and RAM 1 GB\",\n    \"id\": 2,\n    \"description\": \"Lorem ipsum dolor sit amet, consectetur adipisicing elit. Amet numquam aspernatur!\"\n}, {\n    \"title\": \"Meizu 16TH 64 GB (Meizu Türkiye Garantili)\",\n    \"category\": \"phone\",\n    \"images\": [\"https://productimages.hepsiburada.net/s/24/280-413/10094991409202.jpg?v1\", \"https://productimages.hepsiburada.net/s/24/280-413/10094991441970.jpg?v1\", \"https://productimages.hepsiburada.net/s/24/280-413/10094991474738.jpg?v1\", \"https://productimages.hepsiburada.net/s/24/280-413/10094991507506.jpg?v1\"],\n    \"brand\": \"meizu\",\n    \"price\": 5664.265944453384,\n    \"cpu\": \"1.3GHz Apple A6\",\n    \"camera\": \"8mp (3264x2448)\",\n    \"size\": \"124.4mm x 59.2mm x 8.97mm (4.9 x 2.33 x 0.35)\",\n    \"weight\": \"132 grams (4.7 ounces) with battery\",\n    \"display\": \"4.0 326 pixel density\",\n    \"battery\": \"1480 mAh\",\n    \"memory\": \"16GB, 32GB and RAM 1 GB\",\n    \"id\": 3,\n    \"description\": \"Lorem ipsum dolor sit amet, consectetur adipisicing elit. Amet numquam aspernatur!\"\n}, {\n    \"title\": \"Meizu X8 64 GB (Meizu Türkiye Garantili)\",\n    \"category\": \"phone\",\n    \"images\": [\"https://productimages.hepsiburada.net/s/25/280-413/10108030091314.jpg?v1\", \"https://productimages.hepsiburada.net/s/24/280-413/10082391818290.jpg?v1\", \"https://productimages.hepsiburada.net/s/24/280-413/10082391851058.jpg?v1\", \"https://productimages.hepsiburada.net/s/24/280-413/10082391883826.jpg?v1\"],\n    \"brand\": \"meizu\",\n    \"price\": 4596.99884783711,\n    \"cpu\": \"1.3GHz Apple A6\",\n    \"camera\": \"8mp (3264x2448)\",\n    \"size\": \"124.4mm x 59.2mm x 8.97mm (4.9 x 2.33 x 0.35)\",\n    \"weight\": \"132 grams (4.7 ounces) with battery\",\n    \"display\": \"4.0 326 pixel density\",\n    \"battery\": \"1480 mAh\",\n    \"memory\": \"16GB, 32GB and RAM 1 GB\",\n    \"id\": 4,\n    \"description\": \"Lorem ipsum dolor sit amet, consectetur adipisicing elit. Amet numquam aspernatur!\"\n}, {\n    \"title\": \"Samsung Galaxy A7 2018 64 GB (Samsung Türkiye Garantili)\",\n    \"category\": \"phone\",\n    \"images\": [\"https://productimages.hepsiburada.net/s/22/280-413/9946187399218.jpg?v1\", \"https://productimages.hepsiburada.net/s/22/280-413/9946187431986.jpg?v1\", \"https://productimages.hepsiburada.net/s/22/280-413/9946187464754.jpg?v1\", \"https://productimages.hepsiburada.net/s/22/280-413/9946187497522.jpg?v1\"],\n    \"brand\": \"samsung\",\n    \"price\": 4108.082941215698,\n    \"cpu\": \"1.3GHz Apple A6\",\n    \"camera\": \"8mp (3264x2448)\",\n    \"size\": \"124.4mm x 59.2mm x 8.97mm (4.9 x 2.33 x 0.35)\",\n    \"weight\": \"132 grams (4.7 ounces) with battery\",\n    \"display\": \"4.0 326 pixel density\",\n    \"battery\": \"1480 mAh\",\n    \"memory\": \"16GB, 32GB and RAM 1 GB\",\n    \"id\": 5,\n    \"description\": \"Lorem ipsum dolor sit amet, consectetur adipisicing elit. Amet numquam aspernatur!\"\n}, {\n    \"title\": \"Samsung Galaxy J6 Plus 32 GB (Samsung Türkiye Garantili)\",\n    \"category\": \"phone\",\n    \"images\": [\"https://productimages.hepsiburada.net/s/22/280-413/9941129494578.jpg?v1\", \"https://productimages.hepsiburada.net/s/22/280-413/9941129527346.jpg?v1\", \"https://productimages.hepsiburada.net/s/22/280-413/9941129560114.jpg?v1\", \"https://productimages.hepsiburada.net/s/22/280-413/9941129592882.jpg?v1\"],\n    \"brand\": \"samsung\",\n    \"price\": 4260.9529075338505,\n    \"cpu\": \"1.3GHz Apple A6\",\n    \"camera\": \"8mp (3264x2448)\",\n    \"size\": \"124.4mm x 59.2mm x 8.97mm (4.9 x 2.33 x 0.35)\",\n    \"weight\": \"132 grams (4.7 ounces) with battery\",\n    \"display\": \"4.0 326 pixel density\",\n    \"battery\": \"1480 mAh\",\n    \"memory\": \"16GB, 32GB and RAM 1 GB\",\n    \"id\": 6,\n    \"description\": \"Lorem ipsum dolor sit amet, consectetur adipisicing elit. Amet numquam aspernatur!\"\n}, {\n    \"title\": \"Vestel Venus Z20 (Vestel Garantili)\",\n    \"category\": \"phone\",\n    \"images\": [\"https://productimages.hepsiburada.net/s/19/280-413/9841497047090.jpg?v1\", \"https://productimages.hepsiburada.net/s/19/280-413/9841497079858.jpg?v1\", \"https://productimages.hepsiburada.net/s/19/280-413/9841497112626.jpg?v1\", \"https://productimages.hepsiburada.net/s/19/280-413/9841497145394.jpg?v1\"],\n    \"brand\": \"vestel\",\n    \"price\": 4730.962860489047,\n    \"cpu\": \"1.3GHz Apple A6\",\n    \"camera\": \"8mp (3264x2448)\",\n    \"size\": \"124.4mm x 59.2mm x 8.97mm (4.9 x 2.33 x 0.35)\",\n    \"weight\": \"132 grams (4.7 ounces) with battery\",\n    \"display\": \"4.0 326 pixel density\",\n    \"battery\": \"1480 mAh\",\n    \"memory\": \"16GB, 32GB and RAM 1 GB\",\n    \"id\": 7,\n    \"description\": \"Lorem ipsum dolor sit amet, consectetur adipisicing elit. Amet numquam aspernatur!\"\n}, {\n    \"title\": \"Xiaomi Mi 8 Lite 128 GB (İthalatçı Garantili)\",\n    \"category\": \"phone\",\n    \"images\": [\"https://productimages.hepsiburada.net/s/22/280-413/9957349523506.jpg?v1\", \"https://productimages.hepsiburada.net/s/22/280-413/9957349556274.jpg?v1\", \"https://productimages.hepsiburada.net/s/22/280-413/9957349589042.jpg?v1\", \"https://productimages.hepsiburada.net/s/22/280-413/9957349621810.jpg?v1\"],\n    \"brand\": \"xiaomi\",\n    \"price\": 5565.737301732921,\n    \"cpu\": \"1.3GHz Apple A6\",\n    \"camera\": \"8mp (3264x2448)\",\n    \"size\": \"124.4mm x 59.2mm x 8.97mm (4.9 x 2.33 x 0.35)\",\n    \"weight\": \"132 grams (4.7 ounces) with battery\",\n    \"display\": \"4.0 326 pixel density\",\n    \"battery\": \"1480 mAh\",\n    \"memory\": \"16GB, 32GB and RAM 1 GB\",\n    \"id\": 8,\n    \"description\": \"Lorem ipsum dolor sit amet, consectetur adipisicing elit. Amet numquam aspernatur!\"\n}, {\n    \"title\": \"Xiaomi Mi 8 Lite 64 GB (İthalatçı Garantili)\",\n    \"category\": \"phone\",\n    \"images\": [\"https://productimages.hepsiburada.net/s/23/280-413/10051147202610.jpg?v1\", \"https://productimages.hepsiburada.net/s/23/280-413/10051147235378.jpg?v1\", \"https://productimages.hepsiburada.net/s/23/280-413/10051147268146.jpg?v1\", \"https://productimages.hepsiburada.net/s/23/280-413/10051147300914.jpg?v1\"],\n    \"brand\": \"xiaomi\",\n    \"price\": 5830.067673371856,\n    \"cpu\": \"1.3GHz Apple A6\",\n    \"camera\": \"8mp (3264x2448)\",\n    \"size\": \"124.4mm x 59.2mm x 8.97mm (4.9 x 2.33 x 0.35)\",\n    \"weight\": \"132 grams (4.7 ounces) with battery\",\n    \"display\": \"4.0 326 pixel density\",\n    \"battery\": \"1480 mAh\",\n    \"memory\": \"16GB, 32GB and RAM 1 GB\",\n    \"id\": 9,\n    \"description\": \"Lorem ipsum dolor sit amet, consectetur adipisicing elit. Amet numquam aspernatur!\"\n}, {\n    \"title\": \"Apple iPhone 7 32 GB (Apple Türkiye Garantili)\",\n    \"category\": \"phone\",\n    \"images\": [\"https://productimages.hepsiburada.net/s/1/280-413/9502147641394.jpg?v1\", \"https://productimages.hepsiburada.net/s/1/280-413/9502147674162.jpg?v1\", \"https://productimages.hepsiburada.net/s/1/280-413/9502147706930.jpg?v1\", \"https://productimages.hepsiburada.net/s/1/280-413/9502147739698.jpg?v1\"],\n    \"brand\": \"apple\",\n    \"price\": 1525.6236967422828,\n    \"cpu\": \"1.3GHz Apple A6\",\n    \"camera\": \"8mp (3264x2448)\",\n    \"size\": \"124.4mm x 59.2mm x 8.97mm (4.9 x 2.33 x 0.35)\",\n    \"weight\": \"132 grams (4.7 ounces) with battery\",\n    \"display\": \"4.0 326 pixel density\",\n    \"battery\": \"1480 mAh\",\n    \"memory\": \"16GB, 32GB and RAM 1 GB\",\n    \"id\": 10,\n    \"description\": \"Lorem ipsum dolor sit amet, consectetur adipisicing elit. Amet numquam aspernatur!\"\n}, {\n    \"title\": \"Samsung Galaxy S10 Plus 128 GB (Samsung Türkiye Garantili)\",\n    \"category\": \"phone\",\n    \"images\": [\"https://productimages.hepsiburada.net/s/25/280-413/10107992703026.jpg?v1\", \"https://productimages.hepsiburada.net/s/25/280-413/10107992735794.jpg?v1\", \"https://productimages.hepsiburada.net/s/25/280-413/10107992768562.jpg?v1\", \"https://productimages.hepsiburada.net/s/25/280-413/10107992801330.jpg?v1\"],\n    \"brand\": \"samsung\",\n    \"price\": 3429.3471420603028,\n    \"cpu\": \"1.3GHz Apple A6\",\n    \"camera\": \"8mp (3264x2448)\",\n    \"size\": \"124.4mm x 59.2mm x 8.97mm (4.9 x 2.33 x 0.35)\",\n    \"weight\": \"132 grams (4.7 ounces) with battery\",\n    \"display\": \"4.0 326 pixel density\",\n    \"battery\": \"1480 mAh\",\n    \"memory\": \"16GB, 32GB and RAM 1 GB\",\n    \"id\": 11,\n    \"description\": \"Lorem ipsum dolor sit amet, consectetur adipisicing elit. Amet numquam aspernatur!\"\n}, {\n    \"title\": \"Samsung Galaxy S10 128 GB (Samsung Türkiye Garantili)\",\n    \"category\": \"phone\",\n    \"images\": [\"https://productimages.hepsiburada.net/s/25/280-413/10107307425842.jpg?v1\", \"https://productimages.hepsiburada.net/s/25/280-413/10107307458610.jpg?v1\", \"https://productimages.hepsiburada.net/s/25/280-413/10107307491378.jpg?v1\", \"https://productimages.hepsiburada.net/s/25/280-413/10107307524146.jpg?v1\"],\n    \"brand\": \"samsung\",\n    \"price\": 1017.7877018963508,\n    \"cpu\": \"1.3GHz Apple A6\",\n    \"camera\": \"8mp (3264x2448)\",\n    \"size\": \"124.4mm x 59.2mm x 8.97mm (4.9 x 2.33 x 0.35)\",\n    \"weight\": \"132 grams (4.7 ounces) with battery\",\n    \"display\": \"4.0 326 pixel density\",\n    \"battery\": \"1480 mAh\",\n    \"memory\": \"16GB, 32GB and RAM 1 GB\",\n    \"id\": 12,\n    \"description\": \"Lorem ipsum dolor sit amet, consectetur adipisicing elit. Amet numquam aspernatur!\"\n}, {\n    \"title\": \"Samsung Galaxy S10e 128 GB (Samsung Türkiye Garantili)\",\n    \"category\": \"phone\",\n    \"images\": [\"https://productimages.hepsiburada.net/s/25/280-413/10107307032626.jpg?v1\", \"https://productimages.hepsiburada.net/s/25/280-413/10107307065394.jpg?v1\", \"https://productimages.hepsiburada.net/s/25/280-413/10107307098162.jpg?v1\", \"https://productimages.hepsiburada.net/s/25/280-413/10107307130930.jpg?v1\"],\n    \"brand\": \"samsung\",\n    \"price\": 3235.202225041739,\n    \"cpu\": \"1.3GHz Apple A6\",\n    \"camera\": \"8mp (3264x2448)\",\n    \"size\": \"124.4mm x 59.2mm x 8.97mm (4.9 x 2.33 x 0.35)\",\n    \"weight\": \"132 grams (4.7 ounces) with battery\",\n    \"display\": \"4.0 326 pixel density\",\n    \"battery\": \"1480 mAh\",\n    \"memory\": \"16GB, 32GB and RAM 1 GB\",\n    \"id\": 13,\n    \"description\": \"Lorem ipsum dolor sit amet, consectetur adipisicing elit. Amet numquam aspernatur!\"\n}, {\n    \"title\": \"Samsung Galaxy M20 32 GB (Samsung Türkiye Garantili)\",\n    \"category\": \"phone\",\n    \"images\": [\"https://productimages.hepsiburada.net/s/25/280-413/10094999240754.jpg?v1\", \"https://productimages.hepsiburada.net/s/25/280-413/10094999273522.jpg?v1\", \"https://productimages.hepsiburada.net/s/25/280-413/10094999306290.jpg?v1\", \"https://productimages.hepsiburada.net/s/25/280-413/10094999339058.jpg?v1\"],\n    \"brand\": \"samsung\",\n    \"price\": 5850.5748675199875,\n    \"cpu\": \"1.3GHz Apple A6\",\n    \"camera\": \"8mp (3264x2448)\",\n    \"size\": \"124.4mm x 59.2mm x 8.97mm (4.9 x 2.33 x 0.35)\",\n    \"weight\": \"132 grams (4.7 ounces) with battery\",\n    \"display\": \"4.0 326 pixel density\",\n    \"battery\": \"1480 mAh\",\n    \"memory\": \"16GB, 32GB and RAM 1 GB\",\n    \"id\": 14,\n    \"description\": \"Lorem ipsum dolor sit amet, consectetur adipisicing elit. Amet numquam aspernatur!\"\n}, {\n    \"title\": \"Samsung Galaxy S8 (Samsung Türkiye Garantili)\",\n    \"category\": \"phone\",\n    \"images\": [\"https://productimages.hepsiburada.net/s/3/280-413/9604775739442.jpg?v1\", \"https://productimages.hepsiburada.net/s/4/280-413/9665566703666.jpg?v1\", \"https://productimages.hepsiburada.net/s/4/280-413/9665566736434.jpg?v1\", \"https://productimages.hepsiburada.net/s/4/280-413/9665566769202.jpg?v1\"],\n    \"brand\": \"samsung\",\n    \"price\": 3207.2840718201587,\n    \"cpu\": \"1.3GHz Apple A6\",\n    \"camera\": \"8mp (3264x2448)\",\n    \"size\": \"124.4mm x 59.2mm x 8.97mm (4.9 x 2.33 x 0.35)\",\n    \"weight\": \"132 grams (4.7 ounces) with battery\",\n    \"display\": \"4.0 326 pixel density\",\n    \"battery\": \"1480 mAh\",\n    \"memory\": \"16GB, 32GB and RAM 1 GB\",\n    \"id\": 15,\n    \"description\": \"Lorem ipsum dolor sit amet, consectetur adipisicing elit. Amet numquam aspernatur!\"\n}, {\n    \"title\": \"Huawei P Smart 2019 64 GB (Huawei Türkiye Garantili)\",\n    \"category\": \"phone\",\n    \"images\": [\"https://productimages.hepsiburada.net/s/23/280-413/10059934859314.jpg?v1\", \"https://productimages.hepsiburada.net/s/23/280-413/10059934892082.jpg?v1\", \"https://productimages.hepsiburada.net/s/23/280-413/10059934924850.jpg?v1\", \"https://productimages.hepsiburada.net/s/23/280-413/10059934957618.jpg?v1\"],\n    \"brand\": \"huawei\",\n    \"price\": 5288.552334214134,\n    \"cpu\": \"1.3GHz Apple A6\",\n    \"camera\": \"8mp (3264x2448)\",\n    \"size\": \"124.4mm x 59.2mm x 8.97mm (4.9 x 2.33 x 0.35)\",\n    \"weight\": \"132 grams (4.7 ounces) with battery\",\n    \"display\": \"4.0 326 pixel density\",\n    \"battery\": \"1480 mAh\",\n    \"memory\": \"16GB, 32GB and RAM 1 GB\",\n    \"id\": 16,\n    \"description\": \"Lorem ipsum dolor sit amet, consectetur adipisicing elit. Amet numquam aspernatur!\"\n}, {\n    \"title\": \"Xiaomi Mi 8 128 GB (İthalatçı Garantili)\",\n    \"category\": \"phone\",\n    \"images\": [\"https://productimages.hepsiburada.net/s/20/280-413/9873948540978.jpg?v1\", \"https://productimages.hepsiburada.net/s/20/280-413/9873948573746.jpg?v1\", \"https://productimages.hepsiburada.net/s/20/280-413/9873948606514.jpg?v1\", \"https://productimages.hepsiburada.net/s/20/280-413/9873948639282.jpg?v1\"],\n    \"brand\": \"xiaomi\",\n    \"price\": 1354.662450097338,\n    \"cpu\": \"1.3GHz Apple A6\",\n    \"camera\": \"8mp (3264x2448)\",\n    \"size\": \"124.4mm x 59.2mm x 8.97mm (4.9 x 2.33 x 0.35)\",\n    \"weight\": \"132 grams (4.7 ounces) with battery\",\n    \"display\": \"4.0 326 pixel density\",\n    \"battery\": \"1480 mAh\",\n    \"memory\": \"16GB, 32GB and RAM 1 GB\",\n    \"id\": 17,\n    \"description\": \"Lorem ipsum dolor sit amet, consectetur adipisicing elit. Amet numquam aspernatur!\"\n}, {\n    \"title\": \"Apple iPhone 6S Plus 32 GB (Apple Türkiye Garantili)\",\n    \"category\": \"phone\",\n    \"images\": [\"https://productimages.hepsiburada.net/s/1/280-413/9489589993522.jpg?v1\", \"https://productimages.hepsiburada.net/s/1/280-413/9489589927986.jpg?v1\", \"https://productimages.hepsiburada.net/s/1/280-413/9489589960754.jpg?v1\"],\n    \"brand\": \"apple\",\n    \"price\": 5467.082548922358,\n    \"cpu\": \"1.3GHz Apple A6\",\n    \"camera\": \"8mp (3264x2448)\",\n    \"size\": \"124.4mm x 59.2mm x 8.97mm (4.9 x 2.33 x 0.35)\",\n    \"weight\": \"132 grams (4.7 ounces) with battery\",\n    \"display\": \"4.0 326 pixel density\",\n    \"battery\": \"1480 mAh\",\n    \"memory\": \"16GB, 32GB and RAM 1 GB\",\n    \"id\": 18,\n    \"description\": \"Lorem ipsum dolor sit amet, consectetur adipisicing elit. Amet numquam aspernatur!\"\n}, {\n    \"title\": \"Meizu 16 64 GB (Meizu Türkiye Garantili)\",\n    \"category\": \"phone\",\n    \"images\": [\"https://productimages.hepsiburada.net/s/24/280-413/10082399387698.jpg?v1\", \"https://productimages.hepsiburada.net/s/24/280-413/10082399420466.jpg?v1\", \"https://productimages.hepsiburada.net/s/24/280-413/10082399453234.jpg?v1\", \"https://productimages.hepsiburada.net/s/24/280-413/10082399486002.jpg?v1\"],\n    \"brand\": \"meizu\",\n    \"price\": 1173.3514841571446,\n    \"cpu\": \"1.3GHz Apple A6\",\n    \"camera\": \"8mp (3264x2448)\",\n    \"size\": \"124.4mm x 59.2mm x 8.97mm (4.9 x 2.33 x 0.35)\",\n    \"weight\": \"132 grams (4.7 ounces) with battery\",\n    \"display\": \"4.0 326 pixel density\",\n    \"battery\": \"1480 mAh\",\n    \"memory\": \"16GB, 32GB and RAM 1 GB\",\n    \"id\": 19,\n    \"description\": \"Lorem ipsum dolor sit amet, consectetur adipisicing elit. Amet numquam aspernatur!\"\n}, {\n    \"title\": \"Vestel Venüs E3 (Vestel Türkiye Garantili)\",\n    \"category\": \"phone\",\n    \"images\": [\"https://productimages.hepsiburada.net/s/20/280-413/9885707108402.jpg?v1\", \"https://productimages.hepsiburada.net/s/20/280-413/9885707141170.jpg?v1\", \"https://productimages.hepsiburada.net/s/20/280-413/9885707173938.jpg?v1\"],\n    \"brand\": \"vestel\",\n    \"price\": 2371.8351283872053,\n    \"cpu\": \"1.3GHz Apple A6\",\n    \"camera\": \"8mp (3264x2448)\",\n    \"size\": \"124.4mm x 59.2mm x 8.97mm (4.9 x 2.33 x 0.35)\",\n    \"weight\": \"132 grams (4.7 ounces) with battery\",\n    \"display\": \"4.0 326 pixel density\",\n    \"battery\": \"1480 mAh\",\n    \"memory\": \"16GB, 32GB and RAM 1 GB\",\n    \"id\": 20,\n    \"description\": \"Lorem ipsum dolor sit amet, consectetur adipisicing elit. Amet numquam aspernatur!\"\n}, {\n    \"title\": \"Asus Zenfone Max Pro ZB602KL 64 GB (Asus Türkiye Garantili)\",\n    \"category\": \"phone\",\n    \"images\": [\"https://productimages.hepsiburada.net/s/21/280-413/9924255121458.jpg?v1\", \"https://productimages.hepsiburada.net/s/21/280-413/9924255154226.jpg?v1\", \"https://productimages.hepsiburada.net/s/21/280-413/9924255186994.jpg?v1\"],\n    \"brand\": \"asus\",\n    \"price\": 2603.504706144322,\n    \"cpu\": \"1.3GHz Apple A6\",\n    \"camera\": \"8mp (3264x2448)\",\n    \"size\": \"124.4mm x 59.2mm x 8.97mm (4.9 x 2.33 x 0.35)\",\n    \"weight\": \"132 grams (4.7 ounces) with battery\",\n    \"display\": \"4.0 326 pixel density\",\n    \"battery\": \"1480 mAh\",\n    \"memory\": \"16GB, 32GB and RAM 1 GB\",\n    \"id\": 21,\n    \"description\": \"Lorem ipsum dolor sit amet, consectetur adipisicing elit. Amet numquam aspernatur!\"\n}, {\n    \"title\": \"Samsung Galaxy Note 9 128 GB (Samsung Türkiye Garantili)\",\n    \"category\": \"phone\",\n    \"images\": [\"https://productimages.hepsiburada.net/s/20/280-413/9902572142642.jpg?v1\", \"https://productimages.hepsiburada.net/s/20/280-413/9902572175410.jpg?v1\", \"https://productimages.hepsiburada.net/s/20/280-413/9902572208178.jpg?v1\", \"https://productimages.hepsiburada.net/s/20/280-413/9902572240946.jpg?v1\"],\n    \"brand\": \"samsung\",\n    \"price\": 1165.0255199945123,\n    \"cpu\": \"1.3GHz Apple A6\",\n    \"camera\": \"8mp (3264x2448)\",\n    \"size\": \"124.4mm x 59.2mm x 8.97mm (4.9 x 2.33 x 0.35)\",\n    \"weight\": \"132 grams (4.7 ounces) with battery\",\n    \"display\": \"4.0 326 pixel density\",\n    \"battery\": \"1480 mAh\",\n    \"memory\": \"16GB, 32GB and RAM 1 GB\",\n    \"id\": 22,\n    \"description\": \"Lorem ipsum dolor sit amet, consectetur adipisicing elit. Amet numquam aspernatur!\"\n}, {\n    \"title\": \"Huawei Mate 20 Lite Dual Sim 64 GB (İthalatçı Garantili)\",\n    \"category\": \"phone\",\n    \"images\": [\"https://productimages.hepsiburada.net/s/21/280-413/9933217792050.jpg?v1\", \"https://productimages.hepsiburada.net/s/21/280-413/9933217660978.jpg?v1\", \"https://productimages.hepsiburada.net/s/21/280-413/9933217693746.jpg?v1\", \"https://productimages.hepsiburada.net/s/21/280-413/9933217726514.jpg?v1\"],\n    \"brand\": \"huawei\",\n    \"price\": 2693.4407990587074,\n    \"cpu\": \"1.3GHz Apple A6\",\n    \"camera\": \"8mp (3264x2448)\",\n    \"size\": \"124.4mm x 59.2mm x 8.97mm (4.9 x 2.33 x 0.35)\",\n    \"weight\": \"132 grams (4.7 ounces) with battery\",\n    \"display\": \"4.0 326 pixel density\",\n    \"battery\": \"1480 mAh\",\n    \"memory\": \"16GB, 32GB and RAM 1 GB\",\n    \"id\": 23,\n    \"description\": \"Lorem ipsum dolor sit amet, consectetur adipisicing elit. Amet numquam aspernatur!\"\n}]"
  },
  {
    "path": "src/index.js",
    "content": "import React from 'react';\nimport ReactDOM from 'react-dom';\nimport './index.scss';\nimport App from './App';\nimport * as serviceWorker from './serviceWorker';\n\nReactDOM.render(<App />, document.getElementById('root'));\n\nserviceWorker.unregister();\n"
  },
  {
    "path": "src/index.scss",
    "content": "$body-bg: #fff;\n\n\n\n\n@import '~bootstrap/scss/bootstrap.scss';\n\nhtml{ height:100%; }\nbody{ min-height:100%; padding:0; margin:0; position:relative; }\n\nbody::after{ content:''; display:block; height:100px; }\n\nfooter{\n  position:absolute;\n  bottom:0;\n  width:100%;\n  height:100px;\n}\n"
  },
  {
    "path": "src/pages/Home/Home.js",
    "content": "import React from 'react';\nimport FilterBar from \"../../containers/FilterBar/FilterBar\";\nimport ProductList from \"../../containers/ProductList/ProductList\";\nimport Pagination from \"../../components/Pagination/Pagination\";\n\nconst Home = () => {\n    return (\n        <React.Fragment>\n            <div className=\"container\" style={{paddingTop: '6rem'}} >\n                <div className=\"row\">\n                    <FilterBar/>\n                    <ProductList/>\n                </div>\n            </div>\n        </React.Fragment>\n    );\n};\n\n\nexport default Home;\n"
  },
  {
    "path": "src/pages/ProductDetail/ProductDetail.js",
    "content": "import React from 'react';\nimport {connect} from 'react-redux';\nimport ProductDetailComponent from '../../components/ProductDetail/ProductDetail';\nimport ProductSlider from \"../../components/ProductSlider/ProductSlider\";\n\nconst ProductDetail = (props) => {\n\n    console.log(props);\n\n    return (\n        <div className=\"container\" style={{padding: '6rem 0'}}>\n            <div className=\"card\">\n                <div className=\"row\">\n                    <ProductSlider images={props.product.images}/>\n                    <ProductDetailComponent product={props.product}/>\n                </div>\n            </div>\n        </div>\n    );\n};\n\nconst mapStateToProps = (state, props) =>  {\n\n    const product = state.shop.products.find(product => product.id === +props.match.params.id);\n\n    return {\n        product\n    }\n};\n\n\n\nexport default connect(mapStateToProps, null)(ProductDetail);\n"
  },
  {
    "path": "src/pages/ShopingCart/ShoppingCart.js",
    "content": "import React from 'react';\nimport {connect} from 'react-redux';\nimport {formatMoney} from \"../../pipes/priceFormatter\";\nimport CartItem from \"../../components/CartItem/CartItem\";\n\nconst ShoppingCart = (props) => {\n    return (\n        <>\n                <div className=\"container\" style={{paddingTop: '6rem'}}>\n                    <div className=\"card shopping-cart\">\n                        <div className=\"card-header bg-dark text-light\">\n                            <i className=\"fa fa-shopping-cart pr-2\" aria-hidden=\"true\"></i>\n                            Shipping cart\n                            <div className=\"clearfix\"></div>\n                        </div>\n                        <div className=\"card-body\">\n                            {props.cartItemCount ? props.cartItems.map(cart => (\n                                <CartItem {...cart} img={cart.images[0]} />\n                            )) : <h1 className=\"display-4 mt-5 text-center\">There is no product in your cart</h1> }\n                        </div>\n                        <div className=\"card-footer\">\n                            <div className=\"pull-right\" style={{margin: '10px'}}>\n                                <div className=\"pull-right\" style={{margin: '5px'}}>\n                                    Total price: <b>{formatMoney(props.totalPrice)}€</b>\n                                </div>\n                            </div>\n                        </div>\n                    </div>\n                </div>\n            </>\n    );\n};\n\n\nconst mapStateToProps = state => {\n\n    console.log(state, 'state has changed');\n\n    return {\n        cartItems: state.shop.cart,\n        cartItemCount: state.shop.cart.reduce((count, curItem) => {\n            return count + curItem.quantity;\n        }, 0),\n        totalPrice: state.shop.cart.reduce((count, curItem) => {\n            return count + (curItem.price * curItem.quantity);\n        }, 0)\n    }\n}\n\nexport default connect(mapStateToProps, null)(ShoppingCart);\n"
  },
  {
    "path": "src/pipes/brandFilter.js",
    "content": "export const brandFilter = (arr, brand) => {\n    if(!brand) return arr;\n\n    return arr.filter(product => brand.includes(product.brand));\n};"
  },
  {
    "path": "src/pipes/orderByFilter.js",
    "content": "import {ORDER_BY_ASC} from \"../actions\";\n\nexport const orderByFilter = (arr, type ) => {\n    if(!type) return arr;\n    console.log('orderbYmethod', type);\n    if(type === 'asc') {\n        return arr.slice().sort((el1, el2) => el1.price - el2.price);\n    } else {\n        return arr.slice().sort((el1, el2) => el2.price - el1.price);\n    }\n};"
  },
  {
    "path": "src/pipes/paginationFilter.js",
    "content": "import {store} from \"../App\";\nimport {countItem} from \"../actions\";\n\nexport const paginationPipe = (state,args) => {\n    if (!args || !args.perPage || !args.currentPage) {\n        return state;\n    }\n    const location = (args.perPage * (args.currentPage - 1)) || 0 ;\n\n    return state.slice(location, location + args.perPage);\n};\n\n"
  },
  {
    "path": "src/pipes/priceFormatter.js",
    "content": "export const formatMoney = (price) => {\n    return price.toFixed(2).replace(/\\d(?=(\\d{3})+\\.)/g, '$&,');\n};"
  },
  {
    "path": "src/pipes/shortenTitle.js",
    "content": "export const shortenTitle = (title) => {\n    return title.split(' (')[0];\n};"
  },
  {
    "path": "src/reducers/brand.filter.reducer.js",
    "content": "import {ADD_BRAND_TO_FILTER, REMOVE_BRAND_FROM_FILTER} from \"../actions\";\n\nexport const  brandFilterReducer = (state = '', action) => {\n    switch (action.type) {\n        case ADD_BRAND_TO_FILTER:\n            if(state.includes(action.brand)) return state;\n            return state += action.brand;\n        case REMOVE_BRAND_FROM_FILTER:\n            console.log('remove brand', action);\n            const reg = new RegExp(action.brand, 'gi');\n            return state.replace(reg, '');\n        default:\n            return state;\n    }\n};\n\n"
  },
  {
    "path": "src/reducers/index.js",
    "content": "import {combineReducers} from 'redux';\nimport shop from './shop.reducer';\nimport {brandFilterReducer} from \"./brand.filter.reducer\";\nimport {orderByPriceReducer} from \"./orderByPrice.filter.reducer\";\nimport {paginationReducer} from \"./pagination.reducer\";\n\nexport default combineReducers({\n    shop,\n    brandFilter: brandFilterReducer,\n    orderBy: orderByPriceReducer,\n    pagination: paginationReducer\n});\n"
  },
  {
    "path": "src/reducers/orderByPrice.filter.reducer.js",
    "content": "import {CLEAR_ORDER_BY_PRICE, ORDER_BY_ASC, ORDER_BY_DESC} from \"../actions\";\n\nexport const orderByPriceReducer = (state = '', action) => {\n    switch (action.type) {\n        case ORDER_BY_ASC:\n            return 'asc';\n        case ORDER_BY_DESC:\n            return 'desc';\n        case CLEAR_ORDER_BY_PRICE:\n            return '';\n        default:\n            return state;\n    }\n}"
  },
  {
    "path": "src/reducers/pagination.reducer.js",
    "content": "import {COUNT_ITEM, GO_PAGE, NEXT_PAGE, PREV_PAGE} from \"../actions\";\n\nconst initialState = {\n    perPage: 12,\n    currentPage: 1,\n    pagesToShow: 3,\n    totalItemsCount: 0\n};\n\n\nexport const paginationReducer = (state = initialState, action) => {\n    switch (action.type) {\n        case PREV_PAGE:\n            if(state.currentPage === 1) return state;\n\n            return {\n                ...state,\n                currentPage: state.currentPage - 1\n            };\n        case NEXT_PAGE:\n            return {\n                ...state,\n                currentPage: state.currentPage + 1\n            };\n        case GO_PAGE:\n            return {\n                ...state,\n                currentPage: action.currentPage\n            };\n        case COUNT_ITEM:\n            return {\n                ...state,\n                totalItemsCount: action.totalItemsCount\n            };\n        default:\n            return state;\n    }\n};\n"
  },
  {
    "path": "src/reducers/shop.reducer.js",
    "content": "import {\n    ADD_PRODUCT_TO_CART,\n    DECREMENT_CART_ITEM_QUANTITY,\n    INCREMENT_CART_ITEM_QUANTITY,\n    REMOVE_PRODUCT_FROM_CART\n} from '../actions';\nimport {phones} from \"../data/phones\";\n\nconst initialState = {\n    products: phones,\n    cart: []\n};\n\n\nconst shopReducer = (state = initialState, action ) => {\n    let updatedCart;\n    let updatedItemIndex;\n\n    switch (action.type) {\n        case INCREMENT_CART_ITEM_QUANTITY:\n            updatedCart = [...state.cart];\n            updatedItemIndex = updatedCart.findIndex(\n                item => item.id === action.payload\n            );\n\n            const incrementedItem = {\n                ...updatedCart[updatedItemIndex]\n            };\n\n            incrementedItem.quantity++;\n\n            updatedCart[updatedItemIndex] = incrementedItem;\n\n\n            return {...state, cart: updatedCart};\n\n        case DECREMENT_CART_ITEM_QUANTITY:\n            updatedCart = [...state.cart];\n            updatedItemIndex = updatedCart.findIndex(\n                item => item.id === action.payload\n            );\n\n            const decrementedItem = {\n                ...updatedCart[updatedItemIndex]\n            };\n\n            decrementedItem.quantity--;\n\n            updatedCart[updatedItemIndex] = decrementedItem;\n\n            return {...state, cart: updatedCart};\n\n        case ADD_PRODUCT_TO_CART:\n            updatedCart = [...state.cart];\n            updatedItemIndex = updatedCart.findIndex(item => item.id === action.payload.id);\n\n            if(updatedItemIndex < 0) {\n                updatedCart.push({...action.payload, quantity: 1});\n            } else {\n                const updatedItem = {\n                    ...updatedCart[updatedItemIndex]\n                };\n\n                updatedItem.quantity++;\n                updatedCart[updatedItemIndex] = updatedItem;\n            }\n\n            return {...state, cart: updatedCart};\n        case REMOVE_PRODUCT_FROM_CART:\n            updatedCart = [...state.cart];\n            updatedItemIndex = updatedCart.findIndex(\n                item => item.id === action.payload\n            );\n\n            updatedCart.splice(updatedItemIndex, 1);\n\n            return {...state, cart: updatedCart};\n        default:\n            return state;\n\n    }\n};\n\nexport default shopReducer;\n"
  },
  {
    "path": "src/serviceWorker.js",
    "content": "// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read http://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n  window.location.hostname === 'localhost' ||\n    // [::1] is the IPv6 localhost address.\n    window.location.hostname === '[::1]' ||\n    // 127.0.0.1/8 is considered localhost for IPv4.\n    window.location.hostname.match(\n      /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n    )\n);\n\nexport function register(config) {\n  if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n    // The URL constructor is available in all browsers that support SW.\n    const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n    if (publicUrl.origin !== window.location.origin) {\n      // Our service worker won't work if PUBLIC_URL is on a different origin\n      // from what our page is served on. This might happen if a CDN is used to\n      // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n      return;\n    }\n\n    window.addEventListener('load', () => {\n      const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n      if (isLocalhost) {\n        // This is running on localhost. Let's check if a service worker still exists or not.\n        checkValidServiceWorker(swUrl, config);\n\n        // Add some additional logging to localhost, pointing developers to the\n        // service worker/PWA documentation.\n        navigator.serviceWorker.ready.then(() => {\n          console.log(\n            'This web app is being served cache-first by a service ' +\n              'worker. To learn more, visit http://bit.ly/CRA-PWA'\n          );\n        });\n      } else {\n        // Is not localhost. Just register service worker\n        registerValidSW(swUrl, config);\n      }\n    });\n  }\n}\n\nfunction registerValidSW(swUrl, config) {\n  navigator.serviceWorker\n    .register(swUrl)\n    .then(registration => {\n      registration.onupdatefound = () => {\n        const installingWorker = registration.installing;\n        if (installingWorker == null) {\n          return;\n        }\n        installingWorker.onstatechange = () => {\n          if (installingWorker.state === 'installed') {\n            if (navigator.serviceWorker.controller) {\n              // At this point, the updated precached content has been fetched,\n              // but the previous service worker will still serve the older\n              // content until all client tabs are closed.\n              console.log(\n                'New content is available and will be used when all ' +\n                  'tabs for this page are closed. See http://bit.ly/CRA-PWA.'\n              );\n\n              // Execute callback\n              if (config && config.onUpdate) {\n                config.onUpdate(registration);\n              }\n            } else {\n              // At this point, everything has been precached.\n              // It's the perfect time to display a\n              // \"Content is cached for offline use.\" message.\n              console.log('Content is cached for offline use.');\n\n              // Execute callback\n              if (config && config.onSuccess) {\n                config.onSuccess(registration);\n              }\n            }\n          }\n        };\n      };\n    })\n    .catch(error => {\n      console.error('Error during service worker registration:', error);\n    });\n}\n\nfunction checkValidServiceWorker(swUrl, config) {\n  // Check if the service worker can be found. If it can't reload the page.\n  fetch(swUrl)\n    .then(response => {\n      // Ensure service worker exists, and that we really are getting a JS file.\n      const contentType = response.headers.get('content-type');\n      if (\n        response.status === 404 ||\n        (contentType != null && contentType.indexOf('javascript') === -1)\n      ) {\n        // No service worker found. Probably a different app. Reload the page.\n        navigator.serviceWorker.ready.then(registration => {\n          registration.unregister().then(() => {\n            window.location.reload();\n          });\n        });\n      } else {\n        // Service worker found. Proceed as normal.\n        registerValidSW(swUrl, config);\n      }\n    })\n    .catch(() => {\n      console.log(\n        'No internet connection found. App is running in offline mode.'\n      );\n    });\n}\n\nexport function unregister() {\n  if ('serviceWorker' in navigator) {\n    navigator.serviceWorker.ready.then(registration => {\n      registration.unregister();\n    });\n  }\n}\n"
  },
  {
    "path": "src/utilities/cumulativeOffset.js",
    "content": "export const cumulativeOffSet = (element) => {\n    let top = 0, left = 0;\n    do {\n        top += element.offsetTop  || 0;\n        left += element.offsetLeft || 0;\n        element = element.offsetParent;\n    } while(element);\n\n    return {\n        top: top,\n        left: left\n    };\n};"
  }
]