Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
94 commits
Select commit Hold shift + click to select a range
c40fafe
init: start catalog page task
Nargiza14 Aug 23, 2023
ec86ac8
feat: add filtering and sorting functionality
Nargiza14 Aug 24, 2023
b684579
feat: add products image, list and cards
Nargiza14 Aug 24, 2023
8b3d89f
feat: add list styles
Nargiza14 Aug 25, 2023
6220277
feat: add search form
Nargiza14 Aug 26, 2023
d2c96d0
feat: add search form styles
Nargiza14 Aug 26, 2023
7a2e553
feat: add link button
Nargiza14 Aug 27, 2023
1d51ece
update: add changes
Nargiza14 Aug 27, 2023
a8a8474
init: start product page layout
Nargiza14 Aug 27, 2023
691a89e
Merge pull request #25 from evgueniazet/sprint-3_catalog-page_layout
euguenia Aug 27, 2023
1788df0
feat: add second test image
Nargiza14 Aug 27, 2023
25284c5
update: change product page
Nargiza14 Aug 27, 2023
903bb5f
feat: add left side styles
Nargiza14 Aug 27, 2023
785e6d0
feat: add right part styles
Nargiza14 Aug 28, 2023
f70f2e2
feat: add modal window
Nargiza14 Aug 28, 2023
feb65bb
feat: add modal close btn
Nargiza14 Aug 28, 2023
0797c03
feat: add redirect from user page
Aug 29, 2023
54a7d8b
Merge branch 'sprint-3_catalog-product-profile' into sprint-3_routing…
Aug 29, 2023
35251d5
feat: add modal pic arrow btns
Nargiza14 Aug 29, 2023
d6309f7
fix: change modal top position
Nargiza14 Aug 29, 2023
448b388
feat: add base query interface and query all products response
LikeKugi Aug 29, 2023
a481552
fix: fix module scss and layout
LikeKugi Aug 30, 2023
ee75a4a
feat: add responses to products api
LikeKugi Aug 30, 2023
c952e13
feat: add component to fetch products from api and refactored routes
LikeKugi Aug 30, 2023
80f58c2
fix: fix link to product page
LikeKugi Aug 30, 2023
c8ac385
fix: remove text underline in header
LikeKugi Aug 30, 2023
8597f47
refactor: change navigation links in header
LikeKugi Aug 30, 2023
12c2721
feat: add products api
LikeKugi Aug 30, 2023
cc132b8
feat: add products middleware to the store
LikeKugi Aug 30, 2023
afb833f
init: start profile page layout
Nargiza14 Aug 30, 2023
390f646
feat: add categories to layout products page
LikeKugi Aug 30, 2023
619c5b4
feat: show products in cards
LikeKugi Aug 30, 2023
17e786b
fix: card layout
LikeKugi Aug 30, 2023
4690d3c
feat: add LoadingProgress on main page
LikeKugi Aug 30, 2023
5603b55
fix: remove strict mode from index
LikeKugi Aug 30, 2023
4ccb23e
feat: products list layout using api data
LikeKugi Aug 30, 2023
fc3f19a
Merge pull request #26 from evgueniazet/sprint-3_product-page_layout
euguenia Aug 30, 2023
ce0284d
Merge pull request #27 from evgueniazet/sprint-3_catalog-page_fetch-api
euguenia Aug 30, 2023
c5ed8e6
feat: add product page detailed info
LikeKugi Aug 31, 2023
a4b12d3
feat: add product page detailed info
LikeKugi Aug 31, 2023
397948b
feat: add userId route
Aug 31, 2023
143d102
fix:replace isLoggedIn in private route
Aug 31, 2023
121867c
fix: change approutes
Aug 31, 2023
c42c679
Merge branch 'sprint-3_catalog-product-profile' into sprint-3_routing…
euguenia Aug 31, 2023
3b416c9
feat: add hover for cards
Aug 31, 2023
82ff2d8
fix: remove hover on cards
Aug 31, 2023
83a9108
feat: add hover for cards
Aug 31, 2023
71934bd
Merge pull request #28 from evgueniazet/sprint-3_product-page_display…
euguenia Aug 31, 2023
b47a70a
feat: add navigation on the page
Nargiza14 Aug 31, 2023
ece7c5d
feat: add page image
Nargiza14 Aug 31, 2023
4af5653
feat: add api for taxes and taxes slice
LikeKugi Aug 31, 2023
fe1d719
feat: add api for taxes and taxes slice
LikeKugi Aug 31, 2023
380b117
feat: add hover for cards
Aug 31, 2023
649968c
fix: remove hover on cards
Aug 31, 2023
96ccfe4
fix: change userpage route
Aug 31, 2023
631b46b
Merge pull request #30 from evgueniazet/sprint-3_catalog-page_interac…
euguenia Aug 31, 2023
0cd1e5d
Merge pull request #29 from evgueniazet/sprint-3_routing-implementation
euguenia Aug 31, 2023
9310b27
feat: add user form 1
Nargiza14 Aug 31, 2023
a88dd22
feat: add sales for products
Aug 31, 2023
ad73451
Merge branch 'sprint-3_catalog-product-profile' into sprint-3_product…
euguenia Aug 31, 2023
d9c29c3
Merge pull request #31 from evgueniazet/sprint-3_product-page_sales
euguenia Aug 31, 2023
d72a037
chores: start searching implementation task
LikeKugi Aug 31, 2023
ecf43d8
feat: add sale on catalog page
Sep 1, 2023
e391590
feat: add edit icons
Nargiza14 Sep 1, 2023
10792f7
fix: change final price designation
Sep 1, 2023
c7d8080
feat: search plants implementation
LikeKugi Sep 1, 2023
c1bf456
feat: search plants implementation
LikeKugi Sep 1, 2023
10214da
Merge branch 'sprint-3_catalog-product-profile' into sprint-3_catalog…
LikeKugi Sep 1, 2023
f4660c5
feat: add message for empty product list
Sep 1, 2023
d646afd
Merge pull request #33 from evgueniazet/sprint-3_catalog-page_search
euguenia Sep 1, 2023
61c9cbc
Merge pull request #32 from evgueniazet/sprint-3_catalog-page_sales
euguenia Sep 1, 2023
ddbc90a
feat: add shipping address board
Nargiza14 Sep 1, 2023
2f8f578
fix: change styles
Nargiza14 Sep 1, 2023
a933943
feat: add checkbox and button to UserForm2
Nargiza14 Sep 1, 2023
bfed1de
feat: add page UserForm3
Nargiza14 Sep 1, 2023
8a3d7d2
feat: add sort
LikeKugi Sep 1, 2023
86e5a1f
feat: add sort
LikeKugi Sep 1, 2023
8dd91e0
update: change UserForm1
Nargiza14 Sep 2, 2023
5e053cc
Merge pull request #35 from evgueniazet/sprint-3_profile-page_layout
euguenia Sep 2, 2023
11fe5ac
Merge pull request #34 from evgueniazet/sprint-3_catalog-page_sort
euguenia Sep 2, 2023
6c89d6c
feat: add api to fetch myCustomer detail and add slice for myCustomer
LikeKugi Sep 2, 2023
2ed02c5
Merge pull request #36 from evgueniazet/sprint-3_profile-page_user-info
euguenia Sep 2, 2023
9bc7558
feat: add display data for lastname,firstname, birthdate,email fields
Sep 2, 2023
6436e38
feat: add editing for email,lastname,firstname and birthdate fields
Sep 2, 2023
62e4c99
fix: fix ignorance of fetching taxes
LikeKugi Sep 2, 2023
4071a4e
feat: add ability to set sort and filter goods
LikeKugi Sep 3, 2023
f986348
fix: fix query with empty filter array
LikeKugi Sep 3, 2023
e5b288e
feat: add validation for user data
Sep 3, 2023
57c5ba0
feat: add adresses in fields
Sep 3, 2023
a3a3ae9
Merge pull request #37 from evgueniazet/sprint-3_catalog-page_filter
euguenia Sep 3, 2023
f54e683
feat: add password validation on userpage
Sep 3, 2023
f1df6c6
feat: add password validation
Sep 3, 2023
abdb544
fead: add error handle in password page
Sep 3, 2023
c0a9b71
Merge pull request #38 from evgueniazet/sprint-3_user-page_settings
euguenia Sep 3, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added .DS_Store
Binary file not shown.
4 changes: 2 additions & 2 deletions e-commerce-app/src/App.css
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
.App {
text-align: center;
.app {
min-height: max-content;
}

.App-logo {
Expand Down
8 changes: 7 additions & 1 deletion e-commerce-app/src/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,13 @@ import { useLocalToken } from './hooks/useLocalToken';
import { useAppDispatch, useAppSelector } from './store/hooks';
import { getAccessToken, setAuth, setLogIn, setLogOut } from './store/slices/userSlice';
import { useGetMyCustomerDetailsMutation } from './api/myCustomerApi';
import LoadingProgress from './components/LoadingProgress/LoadingProgress';

export const App = () => {
const [getAnonymousToken] = useGetAnonymousTokenMutation();
const { isTokenInStorage, getTokenFromStorage, delTokenFromStorage } = useLocalToken();
const [getAccessTokenApi, { data, isSuccess, isError }] = useGetAccessTokenFromRefreshMutation();
const [getAccessTokenApi, { data, isSuccess, isError, isLoading }] =
useGetAccessTokenFromRefreshMutation();
const [getDetails] = useGetMyCustomerDetailsMutation();
const dispatch = useAppDispatch();
const accessToken = useAppSelector(getAccessToken);
Expand Down Expand Up @@ -52,6 +54,10 @@ export const App = () => {
}
}, [accessToken]);

if (isLoading) {
return <LoadingProgress />;
}

return (
<>
<AppRoutes />
Expand Down
27 changes: 27 additions & 0 deletions e-commerce-app/src/api/categoriesApi.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react';
import { IGetAllCategoriesResponse } from '../types/slicesTypes/categoriesApiTypes';

export const categoriesApi = createApi({
reducerPath: 'categoriesApi',
baseQuery: fetchBaseQuery({
baseUrl: `${process.env.REACT_APP_CTP_API_URL}/${process.env.REACT_APP_CTP_PROJECT_KEY}/categories`,
}),
tagTypes: ['categories'],
endpoints: (build) => ({
getAllCategories: build.query<IGetAllCategoriesResponse, string>({
query(token: string) {
return {
url: '',
method: 'GET',
headers: {
Authorization: `Bearer ${token}`,
'Content-Type': 'application/json',
},
};
},
providesTags: ['categories'],
}),
}),
});

export const { useGetAllCategoriesQuery } = categoriesApi;
29 changes: 29 additions & 0 deletions e-commerce-app/src/api/productProjectionApi.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react';
import { IGetAllProductsRequest } from '../types/slicesTypes/productsApiTypes';
import { ISearchProductsResponse } from '../types/slicesTypes/productProjectionsApiTypes';

export const productProjectionApi = createApi({
reducerPath: 'productProjectionApi',
baseQuery: fetchBaseQuery({
baseUrl: `${process.env.REACT_APP_CTP_API_URL}/${process.env.REACT_APP_CTP_PROJECT_KEY}/product-projections`,
}),
endpoints: (build) => ({
searchProducts: build.mutation<ISearchProductsResponse, IGetAllProductsRequest>({
query(queryObject) {
let path = '';
if (queryObject.params && queryObject.params.resultPath) {
path = queryObject.params.resultPath;
}
return {
url: '/search' + path,
method: 'GET',
headers: {
Authorization: `Bearer ${queryObject.token}`,
},
};
},
}),
}),
});
// ,'variants.price.centAmount:range+(1200+to+*)'].join('&filter=')
export const { useSearchProductsMutation } = productProjectionApi;
45 changes: 45 additions & 0 deletions e-commerce-app/src/api/productsApi.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react';
import {
IGetAllProductsRequest,
IGetAllProductsResponse,
IGetProductByIdRequest,
IProductApiResponse,
} from '../types/slicesTypes/productsApiTypes';

export const productsApi = createApi({
reducerPath: 'productsApi',
baseQuery: fetchBaseQuery({
baseUrl: `${process.env.REACT_APP_CTP_API_URL}/${process.env.REACT_APP_CTP_PROJECT_KEY}/products`,
}),
endpoints: (build) => ({
getAllProducts: build.mutation<IGetAllProductsResponse, IGetAllProductsRequest>({
query(queryObject) {
return {
url: '',
method: 'GET',
params: {
...queryObject.params,
},
headers: {
Authorization: `Bearer ${queryObject.token}`,
'Content-Type': 'application/json',
},
};
},
}),
getProductById: build.query<IProductApiResponse, IGetProductByIdRequest>({
query(queryObject) {
return {
url: `/${queryObject.productId}`,
method: 'GET',
headers: {
Authorization: `Bearer ${queryObject.token}`,
'Content-Type': 'application/json',
},
};
},
}),
}),
});

export const { useGetAllProductsMutation, useGetProductByIdQuery } = productsApi;
24 changes: 24 additions & 0 deletions e-commerce-app/src/api/taxApi.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react';
import { IGetAllTaxesResponse } from '../types/slicesTypes/taxApiTypes';

export const taxApi = createApi({
reducerPath: 'taxApi',
baseQuery: fetchBaseQuery({
baseUrl: `${process.env.REACT_APP_CTP_API_URL}/${process.env.REACT_APP_CTP_PROJECT_KEY}/tax-categories`,
}),
endpoints: (build) => ({
getAllTaxes: build.query<IGetAllTaxesResponse, string>({
query(token: string) {
return {
url: '',
method: 'GET',
headers: {
Authorization: `Bearer ${token}`,
},
};
},
}),
}),
});

export const { useGetAllTaxesQuery } = taxApi;
1 change: 1 addition & 0 deletions e-commerce-app/src/assets/images/EmptyCatalogPage.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added e-commerce-app/src/assets/images/TestImg-1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added e-commerce-app/src/assets/images/TestImg-2.jpeg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added e-commerce-app/src/assets/images/TestImg.jpeg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added e-commerce-app/src/assets/images/UserPageImg.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
61 changes: 61 additions & 0 deletions e-commerce-app/src/components/AddressItem/AddressItem.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
import { FC } from 'react';
import { Typography, Box, Paper, IconButton } from '@mui/material';
import DeleteIcon from '@mui/icons-material/Delete';
import EditIcon from '@mui/icons-material/Edit';
import type { Board } from '../../pages/UserPage/UserAddresses';
import { IMyCustomerApiAddressRequest } from '../../types/addressesTypes';

interface addressItemProps {
todo: Board;
onDeleteAddr: (id: Board['id']) => void;
onCheckAddr: (id: Board['id']) => void;
onEdit: (id: Board['id']) => void;
address: IMyCustomerApiAddressRequest | undefined;
}

export const AddressItem: FC<addressItemProps> = ({
todo,
onDeleteAddr,
onCheckAddr,
onEdit,
address,
}) => (
<Paper
elevation={1}
sx={{
marginBottom: '5px',
width: '100%',
padding: '5px 10px',
borderRadius: 1,
gap: 1,
opacity: todo.checked ? 0.5 : 1,
}}
>
<Box textAlign="left">
<Typography
onClick={() => onCheckAddr(todo.id)}
sx={{ cursor: 'pointer', textDecorationLine: todo.checked ? 'line-through' : 'none' }}
variant="h6"
component="h6"
gutterBottom
>
{todo.name}
</Typography>
</Box>
<Box display="flex" textAlign="left">
{address && (
<Typography variant="subtitle1" component="div" gutterBottom>
{address.streetName}, {address.city}, {address.country}, {address.postalCode}
</Typography>
)}
</Box>
<Box display="flex" justifyContent="flex-end">
<IconButton onClick={() => onEdit(todo.id)} color="primary" aria-label="edit">
<EditIcon />
</IconButton>
<IconButton onClick={() => onDeleteAddr(todo.id)} color="error" aria-label="delete">
<DeleteIcon />
</IconButton>
</Box>
</Paper>
);
43 changes: 43 additions & 0 deletions e-commerce-app/src/components/AddressList/AddressList.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
import { FC } from 'react';
import { Box } from '@mui/material';
import { AddressItem } from '../AddressItem/AddressItem';
import type { Board } from '../../pages/UserPage/UserAddresses';
import { AddressPanel } from '../Panel/Panel';
import { IMyCustomerApiAddressRequest } from '../../types/addressesTypes';

interface TodoListProps {
editTodoId: Board['id'] | null;
todoList: Board[];
onDeleteAddr: (id: Board['id']) => void;
onCheckAddr: (id: Board['id']) => void;
onEdit: (id: Board['id']) => void;
onChangeAddr: ({ name, street, city, country, postcode }: Omit<Board, 'id' | 'checked'>) => void;
address: IMyCustomerApiAddressRequest | undefined;
}

export const BoardList: FC<TodoListProps> = ({
todoList,
editTodoId,
onChangeAddr,
onDeleteAddr,
onCheckAddr,
onEdit,
address,
}) => (
<Box>
{todoList.map((todo) => {
if (todo.id === editTodoId)
return <AddressPanel mode="edit" onChangeAddr={onChangeAddr} editTodo={todo} />;
return (
<AddressItem
key={todo.id}
todo={todo}
onDeleteAddr={onDeleteAddr}
onCheckAddr={onCheckAddr}
onEdit={onEdit}
address={address}
/>
);
})}
</Box>
);
4 changes: 2 additions & 2 deletions e-commerce-app/src/components/Header/Header.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -83,11 +83,11 @@ export const Header: React.FC = () => {
<MenuLinks navigation={navigationRoutes} handler={handleCloseNavMenu} />
</Menu>
</Box>
<Link to={'/'}>
<Link to={'/'} style={{ textDecoration: 'none' }}>
<Typography
variant="h5"
noWrap
component="a"
component="span"
sx={{
mr: 2,
display: { xs: 'flex', md: 'none' },
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
.box {
position: fixed;
top: 0;
left: 0;
bottom: 0;
right: 0;
overflow: hidden;
}
16 changes: 16 additions & 0 deletions e-commerce-app/src/components/LoadingProgress/LoadingProgress.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import React, { JSX } from 'react';
import { Box, CircularProgress, Typography } from '@mui/material';

import styles from './LoadingProgress.module.scss';

const LoadingProgress = (): JSX.Element => {
return (
<Box display="flex" justifyContent="center" alignItems="center" className={styles.box}>
<CircularProgress size={200} thickness={10} />
<Typography position="absolute" variant="h4">
Loading...
</Typography>
</Box>
);
};
export default LoadingProgress;
2 changes: 1 addition & 1 deletion e-commerce-app/src/components/MenuLinks/MenuLinks.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ const MenuLinks: FC<IMenuLinksProps> = ({ navigation, handler }): JSX.Element =>
<>
{Object.entries(navigation).map(([title, path]) => (
<MenuItem key={title} onClick={handler}>
<Button onClick={() => navigate(path)} sx={{ color: 'green' }}>
<Button fullWidth onClick={() => navigate(path)} sx={{ color: 'green' }}>
{title}
</Button>
</MenuItem>
Expand Down
Loading