From f8e79c3f6213ca0a454b7f6173520c9acfc458a2 Mon Sep 17 00:00:00 2001 From: Notsmartname Date: Wed, 8 May 2024 09:21:15 +0500 Subject: [PATCH 01/12] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20=D0=B7=D0=B0=D0=BF=D1=80=D0=BE=D1=81=20=D0=BD?= =?UTF-8?q?=D0=B0=20=D0=BF=D0=BE=D0=B4=D0=BA=D0=BB=D1=8E=D1=87=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=BF=D0=BB=D0=B0=D1=82=D0=B5=D0=B6=D0=B5=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/AboutShelter/AboutShelter.jsx | 9 +- .../AboutShelter/AboutShelter.test.jsx | 218 +++++++++--------- src/modules/AboutShelter/api.js | 20 ++ 3 files changed, 137 insertions(+), 110 deletions(-) create mode 100644 src/modules/AboutShelter/api.js diff --git a/src/modules/AboutShelter/AboutShelter.jsx b/src/modules/AboutShelter/AboutShelter.jsx index 6dcb9f8a..2fe22467 100644 --- a/src/modules/AboutShelter/AboutShelter.jsx +++ b/src/modules/AboutShelter/AboutShelter.jsx @@ -9,6 +9,7 @@ import EditIcon from '../../images/EditIcon/EditIcon'; import DeleteIcon from '../../images/DeleteIcon/DeleteIcon'; import ShelterOwnerStatistics from '../ShelterOwnerStatistics/ShelterOwnerStatistics'; import petLogo from '../../images/pet.jpg'; +import setPayment from './api'; // TODO переделать названия классов (объединить?), не совсем понятно, по какому принципу about-shelter, shelter-info @@ -22,6 +23,10 @@ const AboutShelter = () => { // TODO подключить рероутер на редактирование инфо о приюте (6.2.1.4 в фигме) // TODO сделать попап при удалении приюта (6.2.1.3 в фигме) + const handleSetPayment = () => { + setPayment(); + }; + return (
@@ -100,7 +105,9 @@ const AboutShelter = () => {

Подключить платежную систему

- +
)}
diff --git a/src/modules/AboutShelter/AboutShelter.test.jsx b/src/modules/AboutShelter/AboutShelter.test.jsx index 4ad41dde..3ce54381 100644 --- a/src/modules/AboutShelter/AboutShelter.test.jsx +++ b/src/modules/AboutShelter/AboutShelter.test.jsx @@ -1,109 +1,109 @@ -import React from 'react'; -import { render, screen } from '@testing-library/react'; -import '@testing-library/jest-dom/extend-expect'; -import * as RRD from 'react-router-dom'; -import AboutShelter from './AboutShelter'; - -const mockData = { - shelter: { - name: 'Название приюта', - logo: 'путь/к/логотипу', - address: 'Адрес приюта', - working_from_hour: '09:00', - working_to_hour: '17:00', - phone_number: '123-456-7890', - email: 'example@example.com', - web_site: 'https://www.example.com', - vk_page: 'https://vk.com/example', - ok_page: 'https://ok.ru/example', - telegram: 'https://t.me/example', - description: 'Описание приюта', - money_collected: '100000 руб.', - animals_adopted: '50', - }, - isOwner: true, - isLoading: false, -}; - -jest.mock('../../images/EditPenIcon/EditPenIcon', () => { - return function EditPenIcon() { - return
; - }; -}); - -jest.mock('../../modules/ShelterOwnerStatistics/ShelterOwnerStatistics', () => { - return function ShelterOwnerStatistics() { - return
; - }; -}); - -jest.mock('react-router-dom', () => { - const actualModule = jest.requireActual('react-router-dom'); - return { - ...actualModule, - useOutletContext: jest.fn(() => { - return { ...mockData }; - }), - }; -}); - -describe('AboutShelter', () => { - it('does not render owner functionality when member is not owner', () => { - jest.spyOn(RRD, 'useOutletContext').mockReturnValue({ ...mockData, isOwner: false }); - - const { queryByText, queryByTestId } = render( - - - - ); - - const shelterOwnerStatistics = queryByText('Количество питомцев: '); - const deleteLink = queryByTestId('edit-icon'); - - expect(deleteLink).toBeNull(); - expect(shelterOwnerStatistics).toBeNull(); - }); - - it('renders owners functionality when member is owner', () => { - jest.spyOn(RRD, 'useOutletContext').mockReturnValue({ ...mockData }); - - render( - - - - ); - - expect(screen.getByTestId('edit-icon')).toBeInTheDocument(); - expect(screen.getByTestId('metrics-overview')).toBeInTheDocument(); - }); - - it('should renders correctly with provided data', () => { - jest.spyOn(RRD, 'useOutletContext').mockReturnValue({ ...mockData }); - - render( - - - - ); - - expect(screen.getByText('Название приюта')).toBeInTheDocument(); - expect(screen.getByText('Адрес приюта')).toBeInTheDocument(); - expect(screen.getByText('123-456-7890')).toBeInTheDocument(); - expect(screen.getByText('example@example.com')).toBeInTheDocument(); - expect(screen.getByAltText('вконтакте')).toBeInTheDocument(); - expect(screen.getByAltText('одноклассники')).toBeInTheDocument(); - expect(screen.getByAltText('телеграм')).toBeInTheDocument(); - }); - - it('should not render when data is not load', () => { - jest.spyOn(RRD, 'useOutletContext').mockReturnValue({ ...mockData, isLoading: true }); - - const { container } = render( - - - - ); - - expect(container.firstChild).toBeNull(); - }); -}); +// import React from 'react'; +// import { render, screen } from '@testing-library/react'; +// import '@testing-library/jest-dom/extend-expect'; +// import * as RRD from 'react-router-dom'; +// import AboutShelter from './AboutShelter'; + +// const mockData = { +// shelter: { +// name: 'Название приюта', +// logo: 'путь/к/логотипу', +// address: 'Адрес приюта', +// working_from_hour: '09:00', +// working_to_hour: '17:00', +// phone_number: '123-456-7890', +// email: 'example@example.com', +// web_site: 'https://www.example.com', +// vk_page: 'https://vk.com/example', +// ok_page: 'https://ok.ru/example', +// telegram: 'https://t.me/example', +// description: 'Описание приюта', +// money_collected: '100000 руб.', +// animals_adopted: '50', +// }, +// isOwner: true, +// isLoading: false, +// }; + +// jest.mock('../../images/EditPenIcon/EditPenIcon', () => { +// return function EditPenIcon() { +// return
; +// }; +// }); + +// jest.mock('../../modules/ShelterOwnerStatistics/ShelterOwnerStatistics', () => { +// return function ShelterOwnerStatistics() { +// return
; +// }; +// }); + +// jest.mock('react-router-dom', () => { +// const actualModule = jest.requireActual('react-router-dom'); +// return { +// ...actualModule, +// useOutletContext: jest.fn(() => { +// return { ...mockData }; +// }), +// }; +// }); + +// describe('AboutShelter', () => { +// it('does not render owner functionality when member is not owner', () => { +// jest.spyOn(RRD, 'useOutletContext').mockReturnValue({ ...mockData, isOwner: false }); + +// const { queryByText, queryByTestId } = render( +// +// +// +// ); + +// const shelterOwnerStatistics = queryByText('Количество питомцев: '); +// const deleteLink = queryByTestId('edit-icon'); + +// expect(deleteLink).toBeNull(); +// expect(shelterOwnerStatistics).toBeNull(); +// }); + +// it('renders owners functionality when member is owner', () => { +// jest.spyOn(RRD, 'useOutletContext').mockReturnValue({ ...mockData }); + +// render( +// +// +// +// ); + +// expect(screen.getByTestId('edit-icon')).toBeInTheDocument(); +// expect(screen.getByTestId('metrics-overview')).toBeInTheDocument(); +// }); + +// it('should renders correctly with provided data', () => { +// jest.spyOn(RRD, 'useOutletContext').mockReturnValue({ ...mockData }); + +// render( +// +// +// +// ); + +// expect(screen.getByText('Название приюта')).toBeInTheDocument(); +// expect(screen.getByText('Адрес приюта')).toBeInTheDocument(); +// expect(screen.getByText('123-456-7890')).toBeInTheDocument(); +// expect(screen.getByText('example@example.com')).toBeInTheDocument(); +// expect(screen.getByAltText('вконтакте')).toBeInTheDocument(); +// expect(screen.getByAltText('одноклассники')).toBeInTheDocument(); +// expect(screen.getByAltText('телеграм')).toBeInTheDocument(); +// }); + +// it('should not render when data is not load', () => { +// jest.spyOn(RRD, 'useOutletContext').mockReturnValue({ ...mockData, isLoading: true }); + +// const { container } = render( +// +// +// +// ); + +// expect(container.firstChild).toBeNull(); +// }); +// }); diff --git a/src/modules/AboutShelter/api.js b/src/modules/AboutShelter/api.js new file mode 100644 index 00000000..2ba363cd --- /dev/null +++ b/src/modules/AboutShelter/api.js @@ -0,0 +1,20 @@ +import { apiHeaders, baseUrl } from '../../utils/constants'; + +const setPayment = async () => { + const response = await fetch(`${baseUrl}/v1/payments/get-partner-link/`, { + method: 'GET', + headers: apiHeaders, + redirect: 'follow' + }).then( + console.log('OK') + ); + // Перенаправить на страницу OAuth-сервера ЮKassa + // .then((res) => { + // console.log(res); + // }); + if (!response.ok) { + throw new Error(`HTTP error! Status: ${response.status}`); + } + +}; +export default setPayment; From 15ffd357484bb91a9b8489211a47e27803df3999 Mon Sep 17 00:00:00 2001 From: Notsmartname Date: Wed, 8 May 2024 09:35:25 +0500 Subject: [PATCH 02/12] =?UTF-8?q?=D0=92=D0=B5=D1=80=D0=BD=D1=83=D0=BB=20?= =?UTF-8?q?=D1=82=D0=B5=D1=81=D1=82=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AboutShelter/AboutShelter.test.jsx | 218 +++++++++--------- 1 file changed, 109 insertions(+), 109 deletions(-) diff --git a/src/modules/AboutShelter/AboutShelter.test.jsx b/src/modules/AboutShelter/AboutShelter.test.jsx index 3ce54381..4ad41dde 100644 --- a/src/modules/AboutShelter/AboutShelter.test.jsx +++ b/src/modules/AboutShelter/AboutShelter.test.jsx @@ -1,109 +1,109 @@ -// import React from 'react'; -// import { render, screen } from '@testing-library/react'; -// import '@testing-library/jest-dom/extend-expect'; -// import * as RRD from 'react-router-dom'; -// import AboutShelter from './AboutShelter'; - -// const mockData = { -// shelter: { -// name: 'Название приюта', -// logo: 'путь/к/логотипу', -// address: 'Адрес приюта', -// working_from_hour: '09:00', -// working_to_hour: '17:00', -// phone_number: '123-456-7890', -// email: 'example@example.com', -// web_site: 'https://www.example.com', -// vk_page: 'https://vk.com/example', -// ok_page: 'https://ok.ru/example', -// telegram: 'https://t.me/example', -// description: 'Описание приюта', -// money_collected: '100000 руб.', -// animals_adopted: '50', -// }, -// isOwner: true, -// isLoading: false, -// }; - -// jest.mock('../../images/EditPenIcon/EditPenIcon', () => { -// return function EditPenIcon() { -// return
; -// }; -// }); - -// jest.mock('../../modules/ShelterOwnerStatistics/ShelterOwnerStatistics', () => { -// return function ShelterOwnerStatistics() { -// return
; -// }; -// }); - -// jest.mock('react-router-dom', () => { -// const actualModule = jest.requireActual('react-router-dom'); -// return { -// ...actualModule, -// useOutletContext: jest.fn(() => { -// return { ...mockData }; -// }), -// }; -// }); - -// describe('AboutShelter', () => { -// it('does not render owner functionality when member is not owner', () => { -// jest.spyOn(RRD, 'useOutletContext').mockReturnValue({ ...mockData, isOwner: false }); - -// const { queryByText, queryByTestId } = render( -// -// -// -// ); - -// const shelterOwnerStatistics = queryByText('Количество питомцев: '); -// const deleteLink = queryByTestId('edit-icon'); - -// expect(deleteLink).toBeNull(); -// expect(shelterOwnerStatistics).toBeNull(); -// }); - -// it('renders owners functionality when member is owner', () => { -// jest.spyOn(RRD, 'useOutletContext').mockReturnValue({ ...mockData }); - -// render( -// -// -// -// ); - -// expect(screen.getByTestId('edit-icon')).toBeInTheDocument(); -// expect(screen.getByTestId('metrics-overview')).toBeInTheDocument(); -// }); - -// it('should renders correctly with provided data', () => { -// jest.spyOn(RRD, 'useOutletContext').mockReturnValue({ ...mockData }); - -// render( -// -// -// -// ); - -// expect(screen.getByText('Название приюта')).toBeInTheDocument(); -// expect(screen.getByText('Адрес приюта')).toBeInTheDocument(); -// expect(screen.getByText('123-456-7890')).toBeInTheDocument(); -// expect(screen.getByText('example@example.com')).toBeInTheDocument(); -// expect(screen.getByAltText('вконтакте')).toBeInTheDocument(); -// expect(screen.getByAltText('одноклассники')).toBeInTheDocument(); -// expect(screen.getByAltText('телеграм')).toBeInTheDocument(); -// }); - -// it('should not render when data is not load', () => { -// jest.spyOn(RRD, 'useOutletContext').mockReturnValue({ ...mockData, isLoading: true }); - -// const { container } = render( -// -// -// -// ); - -// expect(container.firstChild).toBeNull(); -// }); -// }); +import React from 'react'; +import { render, screen } from '@testing-library/react'; +import '@testing-library/jest-dom/extend-expect'; +import * as RRD from 'react-router-dom'; +import AboutShelter from './AboutShelter'; + +const mockData = { + shelter: { + name: 'Название приюта', + logo: 'путь/к/логотипу', + address: 'Адрес приюта', + working_from_hour: '09:00', + working_to_hour: '17:00', + phone_number: '123-456-7890', + email: 'example@example.com', + web_site: 'https://www.example.com', + vk_page: 'https://vk.com/example', + ok_page: 'https://ok.ru/example', + telegram: 'https://t.me/example', + description: 'Описание приюта', + money_collected: '100000 руб.', + animals_adopted: '50', + }, + isOwner: true, + isLoading: false, +}; + +jest.mock('../../images/EditPenIcon/EditPenIcon', () => { + return function EditPenIcon() { + return
; + }; +}); + +jest.mock('../../modules/ShelterOwnerStatistics/ShelterOwnerStatistics', () => { + return function ShelterOwnerStatistics() { + return
; + }; +}); + +jest.mock('react-router-dom', () => { + const actualModule = jest.requireActual('react-router-dom'); + return { + ...actualModule, + useOutletContext: jest.fn(() => { + return { ...mockData }; + }), + }; +}); + +describe('AboutShelter', () => { + it('does not render owner functionality when member is not owner', () => { + jest.spyOn(RRD, 'useOutletContext').mockReturnValue({ ...mockData, isOwner: false }); + + const { queryByText, queryByTestId } = render( + + + + ); + + const shelterOwnerStatistics = queryByText('Количество питомцев: '); + const deleteLink = queryByTestId('edit-icon'); + + expect(deleteLink).toBeNull(); + expect(shelterOwnerStatistics).toBeNull(); + }); + + it('renders owners functionality when member is owner', () => { + jest.spyOn(RRD, 'useOutletContext').mockReturnValue({ ...mockData }); + + render( + + + + ); + + expect(screen.getByTestId('edit-icon')).toBeInTheDocument(); + expect(screen.getByTestId('metrics-overview')).toBeInTheDocument(); + }); + + it('should renders correctly with provided data', () => { + jest.spyOn(RRD, 'useOutletContext').mockReturnValue({ ...mockData }); + + render( + + + + ); + + expect(screen.getByText('Название приюта')).toBeInTheDocument(); + expect(screen.getByText('Адрес приюта')).toBeInTheDocument(); + expect(screen.getByText('123-456-7890')).toBeInTheDocument(); + expect(screen.getByText('example@example.com')).toBeInTheDocument(); + expect(screen.getByAltText('вконтакте')).toBeInTheDocument(); + expect(screen.getByAltText('одноклассники')).toBeInTheDocument(); + expect(screen.getByAltText('телеграм')).toBeInTheDocument(); + }); + + it('should not render when data is not load', () => { + jest.spyOn(RRD, 'useOutletContext').mockReturnValue({ ...mockData, isLoading: true }); + + const { container } = render( + + + + ); + + expect(container.firstChild).toBeNull(); + }); +}); From e4d65779b6019a8154dd0530ce1a6292c30853c4 Mon Sep 17 00:00:00 2001 From: Notsmartname Date: Wed, 8 May 2024 20:12:03 +0500 Subject: [PATCH 03/12] added token --- src/modules/AboutShelter/AboutShelter.jsx | 5 +++-- src/modules/AboutShelter/api.js | 16 +++++++++------- .../ShelterOwnerProfile/ShelterOwnerProfile.jsx | 1 - 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/modules/AboutShelter/AboutShelter.jsx b/src/modules/AboutShelter/AboutShelter.jsx index 2fe22467..7d4632d0 100644 --- a/src/modules/AboutShelter/AboutShelter.jsx +++ b/src/modules/AboutShelter/AboutShelter.jsx @@ -15,7 +15,7 @@ import setPayment from './api'; const AboutShelter = () => { const { shelter, isOwner, isLoading } = useOutletContext(); - + console.log(shelter); if (isLoading) { return null; } @@ -24,7 +24,8 @@ const AboutShelter = () => { // TODO сделать попап при удалении приюта (6.2.1.3 в фигме) const handleSetPayment = () => { - setPayment(); + // let token = localStorage.getItem('access'); + setPayment(localStorage.getItem('access')); }; return ( diff --git a/src/modules/AboutShelter/api.js b/src/modules/AboutShelter/api.js index 2ba363cd..42b560ed 100644 --- a/src/modules/AboutShelter/api.js +++ b/src/modules/AboutShelter/api.js @@ -1,17 +1,19 @@ -import { apiHeaders, baseUrl } from '../../utils/constants'; +import { baseUrl } from '../../utils/constants'; -const setPayment = async () => { +const setPayment = async (token) => { + // Перенаправить на страницу OAuth-сервера ЮKassa const response = await fetch(`${baseUrl}/v1/payments/get-partner-link/`, { method: 'GET', - headers: apiHeaders, + headers: { + Accept: 'application/json', + 'Content-Type': 'application/json', + authorization: `Bearer ${token}`, + }, redirect: 'follow' }).then( console.log('OK') ); - // Перенаправить на страницу OAuth-сервера ЮKassa - // .then((res) => { - // console.log(res); - // }); + if (!response.ok) { throw new Error(`HTTP error! Status: ${response.status}`); } diff --git a/src/modules/ShelterOwnerProfile/ShelterOwnerProfile.jsx b/src/modules/ShelterOwnerProfile/ShelterOwnerProfile.jsx index 672e5168..76849910 100644 --- a/src/modules/ShelterOwnerProfile/ShelterOwnerProfile.jsx +++ b/src/modules/ShelterOwnerProfile/ShelterOwnerProfile.jsx @@ -6,7 +6,6 @@ import ProfileSheltersBlock from '../../components/ProfileSheltersBlock/ProfileS const ShelterOwnerProfile = () => { const currentUser = useContext(CurrentUserContext); const myShelters = [currentUser.own_shelter]; - return (
Date: Thu, 9 May 2024 08:34:56 +0500 Subject: [PATCH 04/12] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=BD=D1=8B?= =?UTF-8?q?=D0=B5=20=D0=BE=D0=BA=D1=80=D1=83=D0=B6=D0=B5=D0=BD=D0=B8=D1=8F?= =?UTF-8?q?=20=D0=B4=D0=BB=D1=8F=20Yookassa?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/pr_closed.yml | 2 ++ .github/workflows/pr_closed_test.yml | 2 ++ 2 files changed, 4 insertions(+) diff --git a/.github/workflows/pr_closed.yml b/.github/workflows/pr_closed.yml index 2c169ebe..0a6a6a2f 100644 --- a/.github/workflows/pr_closed.yml +++ b/.github/workflows/pr_closed.yml @@ -61,6 +61,8 @@ jobs: echo EMAIL_USE_TLS=${{ secrets.EMAIL_USE_TLS }} >> .env echo DEBUG=${{ secrets.DEBUG }} >> .env echo EMAIL_BACKEND_TYPE=${{ secrets.EMAIL_BACKEND_TYPE }} >> .env + echo YOOKASSA_CLIENT_ID=${{ secrets.YOOKASSA_CLIENT_ID }} >> .env + echo YOOKASSA_CLIENT_SECRET=${{ secrets.YOOKASSA_CLIENT_SECRET }} >> .env sudo docker-compose pull sudo docker-compose up -d diff --git a/.github/workflows/pr_closed_test.yml b/.github/workflows/pr_closed_test.yml index 23205c2b..082b4fe1 100644 --- a/.github/workflows/pr_closed_test.yml +++ b/.github/workflows/pr_closed_test.yml @@ -62,6 +62,8 @@ jobs: echo DEBUG=${{ secrets.TEST_DEBUG }} >> .env echo EMAIL_BACKEND_TYPE=${{ secrets.EMAIL_BACKEND_TYPE }} >> .env echo REACT_APP_SERVER_TYPE=${{ secrets.REACT_APP_SERVER_TYPE_TEST }} >> .env + echo YOOKASSA_CLIENT_ID=${{ secrets.YOOKASSA_CLIENT_ID }} >> .env + echo YOOKASSA_CLIENT_SECRET=${{ secrets.YOOKASSA_CLIENT_SECRET }} >> .env sudo docker-compose pull sudo docker-compose up -d From 16f5f778546efaa9cb31a57ddb31a0a3cfcd286a Mon Sep 17 00:00:00 2001 From: Notsmartname Date: Thu, 9 May 2024 09:23:11 +0500 Subject: [PATCH 05/12] =?UTF-8?q?=D0=A3=D0=B1=D1=80=D0=B0=D0=BB=20=D0=B8?= =?UTF-8?q?=D0=B7=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BC=20=D0=B8=D0=B7=20pr=5Fc?= =?UTF-8?q?losed?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/pr_closed.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/pr_closed.yml b/.github/workflows/pr_closed.yml index 0a6a6a2f..2c169ebe 100644 --- a/.github/workflows/pr_closed.yml +++ b/.github/workflows/pr_closed.yml @@ -61,8 +61,6 @@ jobs: echo EMAIL_USE_TLS=${{ secrets.EMAIL_USE_TLS }} >> .env echo DEBUG=${{ secrets.DEBUG }} >> .env echo EMAIL_BACKEND_TYPE=${{ secrets.EMAIL_BACKEND_TYPE }} >> .env - echo YOOKASSA_CLIENT_ID=${{ secrets.YOOKASSA_CLIENT_ID }} >> .env - echo YOOKASSA_CLIENT_SECRET=${{ secrets.YOOKASSA_CLIENT_SECRET }} >> .env sudo docker-compose pull sudo docker-compose up -d From b09fc08757053ec2d573e5ff5c751cd8ce318af2 Mon Sep 17 00:00:00 2001 From: Notsmartname Date: Fri, 10 May 2024 11:24:22 +0500 Subject: [PATCH 06/12] Fix DeclarationInput, HelpToShelter visibility btn-donate --- src/modules/HelpToShelter/ApiHelpToShelter.js | 2 +- src/modules/HelpToShelter/HelpToShelter.jsx | 24 +++++++++---------- src/ui/DeclarationInput/DeclarationInput.jsx | 5 ++-- 3 files changed, 15 insertions(+), 16 deletions(-) diff --git a/src/modules/HelpToShelter/ApiHelpToShelter.js b/src/modules/HelpToShelter/ApiHelpToShelter.js index f5e51478..ebe81b14 100644 --- a/src/modules/HelpToShelter/ApiHelpToShelter.js +++ b/src/modules/HelpToShelter/ApiHelpToShelter.js @@ -6,7 +6,7 @@ export const donateToShelter = async (id, amount) => { const response = await fetch(`${baseUrl}/v1/payments/shelters/${id}/donate/`, { method: 'POST', headers: { - 'Content-Type': 'application/json' + 'Content-Type': 'application/json', }, body: JSON.stringify({ amount diff --git a/src/modules/HelpToShelter/HelpToShelter.jsx b/src/modules/HelpToShelter/HelpToShelter.jsx index 60cd70c0..f847e91e 100644 --- a/src/modules/HelpToShelter/HelpToShelter.jsx +++ b/src/modules/HelpToShelter/HelpToShelter.jsx @@ -11,7 +11,7 @@ import { donateToShelter } from './ApiHelpToShelter'; const HelpToShelter = () => { const { id } = useParams(); const materialAid = useInput('', { notEmpty: true, maxLength: 12, regex: regex.NUMBER }, errorMessage.DONATION_AMOUNT); - const { isOwner, isAuth, isShelterOwner } = useOutletContext(); + const { shelter } = useOutletContext(); const handleDonate = async () => { if (materialAid.value !== '') { @@ -27,23 +27,21 @@ const HelpToShelter = () => { return (
- { !isOwner && ( + {shelter.is_partner && (

Материальная помощь

- { (isShelterOwner || isAuth) && (isAuth || isShelterOwner) && ( - - )} + diff --git a/src/ui/DeclarationInput/DeclarationInput.jsx b/src/ui/DeclarationInput/DeclarationInput.jsx index 6d2fbfb8..71540057 100644 --- a/src/ui/DeclarationInput/DeclarationInput.jsx +++ b/src/ui/DeclarationInput/DeclarationInput.jsx @@ -2,9 +2,10 @@ import React from 'react'; import './DeclarationInput.scss'; // TODO убрать li, это форма, а не список. Выше, где используется, заменить ul на form +// li изменено на div const DeclarationInput = ({ caption, inputState, type, name, placeholder, required, showError = true }) => { return ( -
  • +
    @@ -20,7 +21,7 @@ const DeclarationInput = ({ caption, inputState, type, name, placeholder, requir required={required} /> {showError &&

    {inputState.dirty && inputState.invalidText}

    } -
  • +
    ); }; From f395e3f733f951b6989ba874d69c83a98e78211f Mon Sep 17 00:00:00 2001 From: Notsmartname Date: Fri, 10 May 2024 13:52:51 +0500 Subject: [PATCH 07/12] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=20=D0=BA=D0=BE=D0=BD=D1=81=D1=82=D0=B0=D0=BD?= =?UTF-8?q?=D1=82=D0=B0=20IS=5FZERO=20=D0=B2=20errorMessage.DONATION=5FAMO?= =?UTF-8?q?UNT?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/utils/errorMessage.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/utils/errorMessage.js b/src/utils/errorMessage.js index 2838adfe..ea8d00a6 100644 --- a/src/utils/errorMessage.js +++ b/src/utils/errorMessage.js @@ -123,4 +123,5 @@ export const VACANCY_DESCRIPTION = { export const DONATION_AMOUNT = { TOO_LONG: tooLong, NOT_FOUND: 'Введите сумму пожертвования', + IS_ZERO: 'Cумма должно превышать нулевое значение', }; \ No newline at end of file From e6acc15226ce26dba8637535c1a00b2c71b9723c Mon Sep 17 00:00:00 2001 From: Notsmartname Date: Fri, 10 May 2024 14:48:34 +0500 Subject: [PATCH 08/12] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA?= =?UTF-8?q?=D0=B0=20=D0=BD=D0=B0=20=D0=BD=D1=83=D0=BB=D1=8C=20isZero?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/useValidation.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/hooks/useValidation.js b/src/hooks/useValidation.js index ebae6d43..f6dfcd2b 100644 --- a/src/hooks/useValidation.js +++ b/src/hooks/useValidation.js @@ -8,6 +8,7 @@ const useValidation = (value, validations, errorValidateMessage) => { const [minLengthError, setMinLengthError] = useState(false); const [maxLengthError, setMaxLengthError] = useState(false); const [regexError, setRegexError] = useState(false); + const [isZeroError, setIsZeroError] = useState(false); useEffect(() => { if (!validations.notEmpty && !value) { @@ -28,6 +29,9 @@ const useValidation = (value, validations, errorValidateMessage) => { case 'regex': validations[validation].test(value) ? setRegexError(false) : setRegexError(true); break; + case 'isZero': + parseInt(value, 10) === 0 ? setIsZeroError(true) : setIsZeroError(false); + break; default: break; } @@ -43,10 +47,12 @@ const useValidation = (value, validations, errorValidateMessage) => { setErrorText(errorValidateMessage.TOO_LONG); } else if (regexError) { setErrorText(errorValidateMessage.INVALID); + } else if (isZeroError) { + setErrorText(errorValidateMessage.IS_ZERO); } else { setErrorText(''); } - }, [emptyError, minLengthError, maxLengthError, regexError]); + }, [emptyError, minLengthError, maxLengthError, regexError, isZeroError]); return errorText; }; From d8dffbd45224e49d8e60ce95c27bb25be47860a4 Mon Sep 17 00:00:00 2001 From: Notsmartname Date: Fri, 10 May 2024 14:51:54 +0500 Subject: [PATCH 09/12] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA?= =?UTF-8?q?=D0=B0=20=D0=BD=D0=B0=20=D0=BD=D0=BE=D0=BB=D1=8C=20=D0=B8=20?= =?UTF-8?q?=D0=BE=D0=B3=D1=80=20=D1=87=D0=B8=D1=81=D0=BB=D0=B0=20=D1=81?= =?UTF-8?q?=D0=B8=D0=BC=D0=B2=D0=BE=D0=BB=D0=BE=D0=B2,=20=D1=80=D0=B5?= =?UTF-8?q?=D0=B4=D0=B8=D1=80=D0=B5=D0=BA=D1=82=20=D0=BA=D0=BD=D0=BE=D0=BF?= =?UTF-8?q?=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/HelpToShelter/HelpToShelter.jsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/modules/HelpToShelter/HelpToShelter.jsx b/src/modules/HelpToShelter/HelpToShelter.jsx index f847e91e..0fd111d1 100644 --- a/src/modules/HelpToShelter/HelpToShelter.jsx +++ b/src/modules/HelpToShelter/HelpToShelter.jsx @@ -8,14 +8,14 @@ import * as errorMessage from '../../utils/errorMessage'; import useInput from '../../hooks/useInput'; import { donateToShelter } from './ApiHelpToShelter'; + const HelpToShelter = () => { const { id } = useParams(); - const materialAid = useInput('', { notEmpty: true, maxLength: 12, regex: regex.NUMBER }, errorMessage.DONATION_AMOUNT); + const materialAid = useInput('', { notEmpty: true, maxLength: 12, regex: regex.NUMBER, isZero: true }, errorMessage.DONATION_AMOUNT); const { shelter } = useOutletContext(); - const handleDonate = async () => { - if (materialAid.value !== '') { - const donationAmount = parseInt(materialAid.value, 10); + const donationAmount = parseInt(materialAid.value, 10); + if ((donationAmount > 0) && (materialAid.value.length < 12)) { try { const paymentConfirmUrl = await donateToShelter(id, donationAmount); window.open(paymentConfirmUrl, '_blank'); From 65686f282046d52c62ce0c29156ca94594944762 Mon Sep 17 00:00:00 2001 From: Notsmartname Date: Fri, 10 May 2024 22:00:04 +0500 Subject: [PATCH 10/12] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA?= =?UTF-8?q?=D0=B0=20=D0=BD=D0=B0=20=D1=82=D0=BE=D0=BA=D0=B5=D0=BD=20=D0=B8?= =?UTF-8?q?=20=D0=B4=D0=B8=D0=BD=20=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20headers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/HelpToShelter/ApiHelpToShelter.js | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/modules/HelpToShelter/ApiHelpToShelter.js b/src/modules/HelpToShelter/ApiHelpToShelter.js index ebe81b14..854374e3 100644 --- a/src/modules/HelpToShelter/ApiHelpToShelter.js +++ b/src/modules/HelpToShelter/ApiHelpToShelter.js @@ -1,13 +1,18 @@ import { baseUrl } from '../../utils/constants'; +const donateHeaders = new Headers(); +donateHeaders.append('Content-Type', 'application/json'); + // eslint-disable-next-line export const donateToShelter = async (id, amount) => { try { + if (localStorage.getItem('access')) { + const token = localStorage.getItem('access'); + donateHeaders.append('authorization', `Bearer ${token}`); + } const response = await fetch(`${baseUrl}/v1/payments/shelters/${id}/donate/`, { method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, + headers: donateHeaders, body: JSON.stringify({ amount }) From 733e90965ef1de0136d7e154c8bddf7d0b42faff Mon Sep 17 00:00:00 2001 From: Notsmartname Date: Fri, 10 May 2024 23:03:59 +0500 Subject: [PATCH 11/12] Fix ApiHelpToShelter --- src/modules/HelpToShelter/ApiHelpToShelter.js | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/modules/HelpToShelter/ApiHelpToShelter.js b/src/modules/HelpToShelter/ApiHelpToShelter.js index 854374e3..07143ba4 100644 --- a/src/modules/HelpToShelter/ApiHelpToShelter.js +++ b/src/modules/HelpToShelter/ApiHelpToShelter.js @@ -1,18 +1,15 @@ -import { baseUrl } from '../../utils/constants'; - -const donateHeaders = new Headers(); -donateHeaders.append('Content-Type', 'application/json'); +import { baseUrl, apiHeaders } from '../../utils/constants'; // eslint-disable-next-line export const donateToShelter = async (id, amount) => { try { if (localStorage.getItem('access')) { const token = localStorage.getItem('access'); - donateHeaders.append('authorization', `Bearer ${token}`); + apiHeaders.authorization = `Bearer ${token}`; } const response = await fetch(`${baseUrl}/v1/payments/shelters/${id}/donate/`, { method: 'POST', - headers: donateHeaders, + headers: apiHeaders, body: JSON.stringify({ amount }) @@ -20,6 +17,7 @@ export const donateToShelter = async (id, amount) => { if (response.ok) { const data = await response.json(); + delete apiHeaders.authorization; return data.payment_confirm_url; } throw new Error('Ошибка при отправке запроса'); From 3b37135e10ecfa2f05faeaadd268403d30ae9a26 Mon Sep 17 00:00:00 2001 From: Notsmartname Date: Mon, 13 May 2024 15:53:16 +0500 Subject: [PATCH 12/12] Fix api --- src/modules/AboutShelter/AboutShelter.jsx | 13 +++++--- src/modules/AboutShelter/api.js | 38 ++++++++++++----------- 2 files changed, 28 insertions(+), 23 deletions(-) diff --git a/src/modules/AboutShelter/AboutShelter.jsx b/src/modules/AboutShelter/AboutShelter.jsx index 7d4632d0..2440ed22 100644 --- a/src/modules/AboutShelter/AboutShelter.jsx +++ b/src/modules/AboutShelter/AboutShelter.jsx @@ -9,13 +9,12 @@ import EditIcon from '../../images/EditIcon/EditIcon'; import DeleteIcon from '../../images/DeleteIcon/DeleteIcon'; import ShelterOwnerStatistics from '../ShelterOwnerStatistics/ShelterOwnerStatistics'; import petLogo from '../../images/pet.jpg'; -import setPayment from './api'; +import { setPayment } from './api'; // TODO переделать названия классов (объединить?), не совсем понятно, по какому принципу about-shelter, shelter-info const AboutShelter = () => { const { shelter, isOwner, isLoading } = useOutletContext(); - console.log(shelter); if (isLoading) { return null; } @@ -23,9 +22,13 @@ const AboutShelter = () => { // TODO подключить рероутер на редактирование инфо о приюте (6.2.1.4 в фигме) // TODO сделать попап при удалении приюта (6.2.1.3 в фигме) - const handleSetPayment = () => { - // let token = localStorage.getItem('access'); - setPayment(localStorage.getItem('access')); + const handleSetPayment = async () => { + try { + const paymentConfirmUrl = await setPayment(); + window.open(paymentConfirmUrl, '_blank'); + } catch (error) { + throw new Error(error.message); + } }; return ( diff --git a/src/modules/AboutShelter/api.js b/src/modules/AboutShelter/api.js index 42b560ed..ec2941c0 100644 --- a/src/modules/AboutShelter/api.js +++ b/src/modules/AboutShelter/api.js @@ -1,22 +1,24 @@ -import { baseUrl } from '../../utils/constants'; +import { baseUrl, apiHeaders } from '../../utils/constants'; -const setPayment = async (token) => { - // Перенаправить на страницу OAuth-сервера ЮKassa - const response = await fetch(`${baseUrl}/v1/payments/get-partner-link/`, { - method: 'GET', - headers: { - Accept: 'application/json', - 'Content-Type': 'application/json', - authorization: `Bearer ${token}`, - }, - redirect: 'follow' - }).then( - console.log('OK') - ); +// eslint-disable-next-line +export const setPayment = async (id, amount) => { + try { + if (localStorage.getItem('access')) { + const token = localStorage.getItem('access'); + apiHeaders.authorization = `Bearer ${token}`; + } + const response = await fetch(`${baseUrl}/v1/payments/get-partner-link/`, { + method: 'GET', + headers: apiHeaders, + }); - if (!response.ok) { - throw new Error(`HTTP error! Status: ${response.status}`); + if (response.ok) { + const data = await response.json(); + delete apiHeaders.authorization; + return data.partner_link; + } + throw new Error('Ошибка при отправке запроса'); + } catch (error) { + throw new Error('Ошибка:', error); } - }; -export default setPayment;