From 8fcf50fa7b10dbda264c9e6b5e57c1a892956278 Mon Sep 17 00:00:00 2001 From: Amirreza vishteh <74289878+amirrezavishteh@users.noreply.github.com> Date: Thu, 30 Nov 2023 17:31:14 +0330 Subject: [PATCH 1/6] fix colors --- vakilpors-front/src/css/PremiumLawyer.css | 34 +++++++++++++++-------- 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/vakilpors-front/src/css/PremiumLawyer.css b/vakilpors-front/src/css/PremiumLawyer.css index 544143f2e..f831b103b 100644 --- a/vakilpors-front/src/css/PremiumLawyer.css +++ b/vakilpors-front/src/css/PremiumLawyer.css @@ -1,24 +1,36 @@ .custom-styles { - background: linear-gradient(to bottom, #8e44ad, #6a0dad); + background: linear-gradient(to bottom, #8e44ad, #d2b4de); padding: 30px; text-align: center; + +} +.custom-header{ + /* background: linear-gradient(to bottom, #8e44ad, #6a0dad); */ + margin-top: 0px; + padding-top:0px; } - .custom-styles .custom-title { + margin-top: 0px; + padding-top:0px; color: white; font-size: 2.5em; margin-bottom: 10px; } .custom-subtitle { + vmargin-top: 0px; + padding-top:0px; font-style: italic; font-size: 1.2em; line-height: 1.5; } .custom-container { + margin-top: 0px; max-width: 1000px; margin: 40px auto; + background:#d2b4de; + padding-top:0px; } .custom-plans { @@ -27,14 +39,14 @@ } .custom-plan-card { - background: #e6e6fa; /* Purple */ + background: white; /* White background for the body */ padding: 30px; border: 1px solid #d2b4de; /* Lighter Purple */ border-radius: 10px; } -.custom-price { - background: #9b59b6; /* Lighter Purple */ +.custom-plan-card .custom-price { + background: #8e44ad; /* Purple for the heading */ border-radius: 10px; display: flex; justify-content: space-between; @@ -42,27 +54,27 @@ padding: 10px 15px; } -.custom-price .amount { +.custom-plan-card .custom-price .amount { font-size: 24px; font-weight: bold; color: white; } -.custom-price .period { +.custom-plan-card .custom-price .period { font-size: 16px; color: white; } -.custom-description { - color: #753240; +.custom-plan-card .custom-description { + color: #753240; /* Text color for the body */ margin-top: 20px; line-height: 1.6; } -.custom-features { +.custom-plan-card .custom-features { list-style-type: disc; margin-left: 20px; - color: #753240; + color: #753240; /* Text color for the body */ } .custom-button { From c2bff06109605041ef728771aeaa4ea31ad4e104 Mon Sep 17 00:00:00 2001 From: Amirreza vishteh <74289878+amirrezavishteh@users.noreply.github.com> Date: Thu, 30 Nov 2023 19:05:38 +0330 Subject: [PATCH 2/6] add test : moving bar and app.js and modify test of advertising --- vakilpors-front/src/App.test.js | 72 ++++++++++- .../premium-page/test/Avertising.test.jsx | 118 ++++++++++++++++-- .../test/MovingBarComponent.test.jsx | 38 ++++++ 3 files changed, 214 insertions(+), 14 deletions(-) create mode 100644 vakilpors-front/src/components/premium-page/test/MovingBarComponent.test.jsx diff --git a/vakilpors-front/src/App.test.js b/vakilpors-front/src/App.test.js index 4de7037e0..d0c0d4f5c 100644 --- a/vakilpors-front/src/App.test.js +++ b/vakilpors-front/src/App.test.js @@ -1,8 +1,68 @@ -import { render, screen } from '@testing-library/react'; -import App from './App'; +import React from 'react'; +import { render, screen, waitFor, act, fireEvent } from '@testing-library/react'; +import axios from 'axios'; +import MockAdapter from 'axios-mock-adapter'; +import { BrowserRouter as Router } from 'react-router-dom'; +import App, { BASE_API_ROUTE } from './App'; -test('renders learn react link', () => { - render(); - const linkElement = screen.getByText(/learn react/i); - expect(linkElement).toBeInTheDocument(); +const mockAxios = new MockAdapter(axios); + +const mockLawyers = [ + { + id: 134, + user: { + id: 13, + name: "ترانه", + }, + title: null, + city: null, + }, + { + id: 1, + user: { + id: 100, + name: "شادی هراتی", + }, + title: "معاضدتی", + city: "گلستان", + }, +]; + +mockAxios.onGet(`${BASE_API_ROUTE}Lawyer/GetAll`).reply(200, { + data: mockLawyers, +}); + +describe('App component', () => { + it('renders the App component with lawyer information and advertising', async () => { + await act(async () => { + render( + + + + ); + }); + + await waitFor(() => expect(screen.getByText(mockLawyers[0].user.name)).toBeInTheDocument()); + + expect(screen.getByText(`عنوان: ${mockLawyers[0].title ? mockLawyers[0].title : "وکیل"}`)).toBeInTheDocument(); + expect(screen.getByText(`شهر: ${mockLawyers[0].city ? mockLawyers[0].city : "نامشخص"}`)).toBeInTheDocument(); + + expect(screen.getByText(mockLawyers[1].user.name)).toBeInTheDocument(); + expect(screen.getByText(`عنوان: ${mockLawyers[1].title ? mockLawyers[1].title : "وکیل"}`)).toBeInTheDocument(); + expect(screen.getByText(`شهر: ${mockLawyers[1].city ? mockLawyers[1].city : "نامشخص"}`)).toBeInTheDocument(); + }); + + it('navigates to Lawyer-search-page when "جست و جوی وکلا" button is clicked', async () => { + const { getByText } = render( + + + + ); + + await act(async () => { + fireEvent.click(getByText('جست و جوی وکلا')); + }); + + await waitFor(() => expect(window.location.pathname).toBe('/Lawyer-search-page')); + }); }); diff --git a/vakilpors-front/src/components/premium-page/test/Avertising.test.jsx b/vakilpors-front/src/components/premium-page/test/Avertising.test.jsx index fcfc1ddf5..6521bf0bb 100644 --- a/vakilpors-front/src/components/premium-page/test/Avertising.test.jsx +++ b/vakilpors-front/src/components/premium-page/test/Avertising.test.jsx @@ -1,15 +1,33 @@ import React from 'react'; -import { render, screen } from '@testing-library/react'; +import { render, screen, act, fireEvent } from '@testing-library/react'; import { BrowserRouter as Router } from 'react-router-dom'; import Advertising from '../Avertising'; -const mockLawyer = { - // your mock lawyer data here -}; - -const mockLawyers = [mockLawyer]; +const mockLawyers = [ + { + id: 1, + user: { name: 'John Doe' }, + title: 'Senior Lawyer', + licenseNumber: 'ABC123', + aboutMe: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.', + profileImageUrl: 'mock_image_url', + rating: 4, + }, + // Add more mock lawyers as needed +]; describe('Advertising component', () => { + it('displays loading state initially', async () => { + render( + + + + ); + + expect(screen.getByRole('progressbar')).toBeInTheDocument(); + expect(screen.queryByRole('button', { name: /بیشتر/i })).not.toBeInTheDocument(); + }); + it('displays lawyer information when data is loaded', async () => { render( @@ -17,8 +35,92 @@ describe('Advertising component', () => { ); + await screen.findByText(mockLawyers[0].user.name); // Wait for the data to be loaded + + // Assertions for LawyerCard component + expect(screen.getByAltText(mockLawyers[0].user.name)).toBeInTheDocument(); + expect(screen.getByText(mockLawyers[0].user.name)).toBeInTheDocument(); + expect(screen.getByText(`عنوان: ${mockLawyers[0].title}`)).toBeInTheDocument(); + expect(screen.getByText(`شماره پرونده وکالت: ${mockLawyers[0].licenseNumber}`)).toBeInTheDocument(); + expect(screen.getByText(`توضیحات: ${mockLawyers[0].aboutMe.split(' ').slice(0, 30).join(' ')}...`)).toBeInTheDocument(); + expect(screen.getByRole('link', { name: /بیشتر/i })).toHaveAttribute('href', `/LawyerPage/${mockLawyers[0].id}`); + expect(screen.getByLabelText('Rated')).toHaveValue(mockLawyers[0].rating); + }); + + it('cycles through lawyers with button clicks', async () => { + render( + + + + ); + + await screen.findByText(mockLawyers[0].user.name); // Wait for the data to be loaded + + // Initial display expect(screen.getByText(mockLawyers[0].user.name)).toBeInTheDocument(); - expect(screen.getByText(`عنوان: ${mockLawyers[0].title ? mockLawyers[0].title : "وکیل"}`)).toBeInTheDocument(); - expect(screen.getByText(`شهر: ${mockLawyers[0].city ? mockLawyers[0].city : "نامشخص"}`)).toBeInTheDocument(); + expect(screen.getByText(mockLawyers[0].title)).toBeInTheDocument(); + + // Click next button + fireEvent.click(screen.getByRole('button', { name: /•/ })); + await screen.findByText(mockLawyers[1].user.name); + + // Check if the next lawyer is displayed + expect(screen.getByText(mockLawyers[1].user.name)).toBeInTheDocument(); + expect(screen.getByText(mockLawyers[1].title)).toBeInTheDocument(); + + // Click previous button + fireEvent.click(screen.getByRole('button', { name: /•/ })); + await screen.findByText(mockLawyers[0].user.name); + + // Check if it cycles back to the initial lawyer + expect(screen.getByText(mockLawyers[0].user.name)).toBeInTheDocument(); + expect(screen.getByText(mockLawyers[0].title)).toBeInTheDocument(); }); }); + + + + + + + + + + + + + + + + + + + + + + + +// import React from 'react'; +// import { render, screen } from '@testing-library/react'; +// import { BrowserRouter as Router } from 'react-router-dom'; +// import Advertising from '../Avertising'; + +// const mockLawyer = { +// // your mock lawyer data here +// }; + +// const mockLawyers = [mockLawyer]; + +// describe('Advertising component', () => { +// it('displays lawyer information when data is loaded', async () => { +// render( +// +// +// +// ); + +// expect(screen.getByText(mockLawyers[0].user.name)).toBeInTheDocument(); +// expect(screen.getByText(`عنوان: ${mockLawyers[0].title ? mockLawyers[0].title : "وکیل"}`)).toBeInTheDocument(); +// expect(screen.getByText(`شهر: ${mockLawyers[0].city ? mockLawyers[0].city : "نامشخص"}`)).toBeInTheDocument(); +// }); +// }); diff --git a/vakilpors-front/src/components/premium-page/test/MovingBarComponent.test.jsx b/vakilpors-front/src/components/premium-page/test/MovingBarComponent.test.jsx new file mode 100644 index 000000000..6d8bb49e2 --- /dev/null +++ b/vakilpors-front/src/components/premium-page/test/MovingBarComponent.test.jsx @@ -0,0 +1,38 @@ +import React from 'react'; +import { shallow } from 'enzyme'; +import MovingBarComponent from './MovingBarComponent'; + +describe('MovingBarComponent', () => { + it('renders without crashing', () => { + shallow(); + }); + + it('changes background color every 2 seconds', () => { + jest.useFakeTimers(); + + const wrapper = shallow(); + const instance = wrapper.instance(); + + // Initial background color + const initialBackgroundColor = wrapper.find('.movingBar').prop('style').backgroundColor; + + // Trigger the useEffect function + jest.runOnlyPendingTimers(); + + // Check if the background color changes after 2 seconds + jest.advanceTimersByTime(2000); + const updatedBackgroundColor = wrapper.find('.movingBar').prop('style').backgroundColor; + + expect(updatedBackgroundColor).not.toBe(initialBackgroundColor); + + jest.useRealTimers(); + }); + + it('navigates to the specified page when clicked', () => { + const mockLocationHref = jest.spyOn(window.location, 'href', 'set'); + const wrapper = shallow(); + + wrapper.find('.container').simulate('click'); + expect(mockLocationHref).toHaveBeenCalledWith('/PremiumLawyers'); + }); +}); From c97fb133c81ff028fc8684db2a5b3c430e3606fd Mon Sep 17 00:00:00 2001 From: Amirreza vishteh <74289878+amirrezavishteh@users.noreply.github.com> Date: Thu, 30 Nov 2023 19:23:26 +0330 Subject: [PATCH 3/6] fix : tests --- .../test/MovingBarComponent.test.jsx | 113 ++++++++++++++---- .../premium-page/test/PremiumLawyers.test.jsx | 45 +++++++ 2 files changed, 135 insertions(+), 23 deletions(-) create mode 100644 vakilpors-front/src/components/premium-page/test/PremiumLawyers.test.jsx diff --git a/vakilpors-front/src/components/premium-page/test/MovingBarComponent.test.jsx b/vakilpors-front/src/components/premium-page/test/MovingBarComponent.test.jsx index 6d8bb49e2..c7455a39f 100644 --- a/vakilpors-front/src/components/premium-page/test/MovingBarComponent.test.jsx +++ b/vakilpors-front/src/components/premium-page/test/MovingBarComponent.test.jsx @@ -1,38 +1,105 @@ +// Import Enzyme and Jest +import { shallow, mount } from 'enzyme'; import React from 'react'; -import { shallow } from 'enzyme'; -import MovingBarComponent from './MovingBarComponent'; +import '@testing-library/jest-dom/extend-expect'; -describe('MovingBarComponent', () => { - it('renders without crashing', () => { - shallow(); - }); +// Import the component to be tested +import MovingBarComponent from '../MovingBarComponent;'; - it('changes background color every 2 seconds', () => { - jest.useFakeTimers(); +// Write a test suite for the component +describe('MovingBarComponent', () => { + // Write a test case for rendering the component + test('renders the component with the given text', () => { + // Render the component with shallow rendering + const wrapper = shallow(); - const wrapper = shallow(); - const instance = wrapper.instance(); + // Assert that the text is present in the component + expect(wrapper.find('.custom-text').text()).toBe('This is a test '); + }); - // Initial background color - const initialBackgroundColor = wrapper.find('.movingBar').prop('style').backgroundColor; + // Write a test case for changing the background color + test('changes the background color every 2 seconds', () => { + // Render the component with full DOM rendering + const wrapper = mount(); - // Trigger the useEffect function - jest.runOnlyPendingTimers(); + // Get the initial background color + const initialColor = wrapper.find('.custom-price').prop('style').backgroundColor; - // Check if the background color changes after 2 seconds + // Wait for 2 seconds jest.advanceTimersByTime(2000); - const updatedBackgroundColor = wrapper.find('.movingBar').prop('style').backgroundColor; - expect(updatedBackgroundColor).not.toBe(initialBackgroundColor); + // Get the updated background color + const updatedColor = wrapper.find('.custom-price').prop('style').backgroundColor; - jest.useRealTimers(); + // Assert that the background color has changed + expect(updatedColor).not.toBe(initialColor); }); - it('navigates to the specified page when clicked', () => { - const mockLocationHref = jest.spyOn(window.location, 'href', 'set'); - const wrapper = shallow(); + // Write a test case for navigating to another page + test('navigates to the PremiumLawyers page when clicked', () => { + // Render the component with shallow rendering + const wrapper = shallow(); - wrapper.find('.container').simulate('click'); - expect(mockLocationHref).toHaveBeenCalledWith('/PremiumLawyers'); + // Mock the window.location.href property + Object.defineProperty(window, 'location', { + value: { + href: '', + }, + writable: true, + }); + + // Simulate a click on the component + wrapper.find('.custom-container').simulate('click'); + + // Assert that the window.location.href has changed to the PremiumLawyers page + expect(window.location.href).toBe('/PremiumLawyers'); }); }); + + + + + + + + + + +// import React from 'react'; +// import { shallow } from 'enzyme'; +// import MovingBarComponent from '../MovingBarComponent;'; + +// describe('MovingBarComponent', () => { +// it('renders without crashing', () => { +// shallow(); +// }); + +// it('changes background color every 2 seconds', () => { +// jest.useFakeTimers(); + +// const wrapper = shallow(); +// const instance = wrapper.instance(); + +// // Initial background color +// const initialBackgroundColor = wrapper.find('.movingBar').prop('style').backgroundColor; + +// // Trigger the useEffect function +// jest.runOnlyPendingTimers(); + +// // Check if the background color changes after 2 seconds +// jest.advanceTimersByTime(2000); +// const updatedBackgroundColor = wrapper.find('.movingBar').prop('style').backgroundColor; + +// expect(updatedBackgroundColor).not.toBe(initialBackgroundColor); + +// jest.useRealTimers(); +// }); + +// it('navigates to the specified page when clicked', () => { +// const mockLocationHref = jest.spyOn(window.location, 'href', 'set'); +// const wrapper = shallow(); + +// wrapper.find('.container').simulate('click'); +// expect(mockLocationHref).toHaveBeenCalledWith('/PremiumLawyers'); +// }); +// }); diff --git a/vakilpors-front/src/components/premium-page/test/PremiumLawyers.test.jsx b/vakilpors-front/src/components/premium-page/test/PremiumLawyers.test.jsx new file mode 100644 index 000000000..17bbb140e --- /dev/null +++ b/vakilpors-front/src/components/premium-page/test/PremiumLawyers.test.jsx @@ -0,0 +1,45 @@ +// Import React Testing Library and Jest +import { render, screen, fireEvent } from '@testing-library/react'; +import '@testing-library/jest-dom/extend-expect'; +import React from 'react'; + +// Import the component to be tested +import PremiumLawyers from '../PremiumLawyers'; + +// Write a test suite for the component +describe('PremiumLawyers component', () => { + // Write a test case for rendering the component + test('renders the component with header and plans', () => { + // Render the component + render(); + + // Assert that the header elements are present + expect(screen.getByText('رشد کسب و کار خود را با تبلیغات هدفمند آنلاین افزایش دهید')).toBeInTheDocument(); + expect(screen.getByText('بین برنامه های روزانه یا هفتگی انتخاب کنید تا با مشتریان جدید ارتباط برقرار کنید.')).toBeInTheDocument(); + + // Assert that the plan cards are present + expect(screen.getByText('برنامه روزانه')).toBeInTheDocument(); + expect(screen.getByText('برنامه هفتگی')).toBeInTheDocument(); + + // Assert that the plan features are present + expect(screen.getByText('قرار دادن لیست ویژه')).toBeInTheDocument(); + expect(screen.getByText('نمایش تبلیغات در صفحات با ترافیک بالا')).toBeInTheDocument(); + expect(screen.getByText('گزارش تحلیلی از کلیک ها و تاثیرات')).toBeInTheDocument(); + expect(screen.getByText('خلاقیت های سفارشی برای تبلیغات موثر')).toBeInTheDocument(); + }); + + // Write a test case for selecting a plan + test('selects a plan and shows a confirmation message', () => { + // Render the component + render(); + + // Find the button for the daily plan + const dailyPlanButton = screen.getByText('انتخاب', { selector: 'button' }); + + // Click the button + fireEvent.click(dailyPlanButton); + + // Assert that a confirmation message is shown + expect(screen.getByText('شما برنامه روزانه را انتخاب کرده اید. لطفا اطلاعات پرداخت خود را وارد کنید.')).toBeInTheDocument(); + }); +}); From baeb3fdcaa2c6fb95b4f01e634a32ae12839ea94 Mon Sep 17 00:00:00 2001 From: Amirreza vishteh <74289878+amirrezavishteh@users.noreply.github.com> Date: Thu, 30 Nov 2023 19:28:58 +0330 Subject: [PATCH 4/6] add:test --- vakilpors-front/src/App.test.js | 59 +- .../src/components/authentication/Login.jsx | 434 +++++---- .../src/components/case-pages/ShowCases.jsx | 545 ++++++++--- .../src/components/case-pages/addNewCase.jsx | 879 +++++++++++++----- .../components/premium-page/PremiumPage.jsx | 6 +- .../premium-page/test/Avertising.test.jsx | 47 - .../src/components/profile/Lawyer_Jobinfo.jsx | 277 +++++- vakilpors-front/src/images/background.jpg | Bin 0 -> 78875 bytes 8 files changed, 1611 insertions(+), 636 deletions(-) create mode 100644 vakilpors-front/src/images/background.jpg diff --git a/vakilpors-front/src/App.test.js b/vakilpors-front/src/App.test.js index d0c0d4f5c..9c15a15f7 100644 --- a/vakilpors-front/src/App.test.js +++ b/vakilpors-front/src/App.test.js @@ -1,9 +1,10 @@ import React from 'react'; -import { render, screen, waitFor, act, fireEvent } from '@testing-library/react'; +import { render, screen, waitFor } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; import axios from 'axios'; import MockAdapter from 'axios-mock-adapter'; import { BrowserRouter as Router } from 'react-router-dom'; -import App, { BASE_API_ROUTE } from './App'; +import App from './App'; const mockAxios = new MockAdapter(axios); @@ -33,36 +34,38 @@ mockAxios.onGet(`${BASE_API_ROUTE}Lawyer/GetAll`).reply(200, { }); describe('App component', () => { - it('renders the App component with lawyer information and advertising', async () => { - await act(async () => { - render( - - - - ); - }); + it('renders learn react link', () => { + render(); + const linkElement = screen.getByText(/learn react/i); + expect(linkElement).toBeInTheDocument(); + }); - await waitFor(() => expect(screen.getByText(mockLawyers[0].user.name)).toBeInTheDocument()); + it('renders the App component with lawyer information and advertising', async () => { + render( + + + + ); - expect(screen.getByText(`عنوان: ${mockLawyers[0].title ? mockLawyers[0].title : "وکیل"}`)).toBeInTheDocument(); - expect(screen.getByText(`شهر: ${mockLawyers[0].city ? mockLawyers[0].city : "نامشخص"}`)).toBeInTheDocument(); + await waitFor(() => expect(screen.getByText(mockLawyers[0].user.name)).toBeInTheDocument()); - expect(screen.getByText(mockLawyers[1].user.name)).toBeInTheDocument(); - expect(screen.getByText(`عنوان: ${mockLawyers[1].title ? mockLawyers[1].title : "وکیل"}`)).toBeInTheDocument(); - expect(screen.getByText(`شهر: ${mockLawyers[1].city ? mockLawyers[1].city : "نامشخص"}`)).toBeInTheDocument(); - }); + expect(screen.getByText(`عنوان: ${mockLawyers[0].title ? mockLawyers[0].title : "وکیل"}`)).toBeInTheDocument(); + expect(screen.getByText(`شهر: ${mockLawyers[0].city ? mockLawyers[0].city : "نامشخص"}`)).toBeInTheDocument(); - it('navigates to Lawyer-search-page when "جست و جوی وکلا" button is clicked', async () => { - const { getByText } = render( - - - - ); + expect(screen.getByText(mockLawyers[1].user.name)).toBeInTheDocument(); + expect(screen.getByText(`عنوان: ${mockLawyers[1].title ? mockLawyers[1].title : "وکیل"}`)).toBeInTheDocument(); + expect(screen.getByText(`شهر: ${mockLawyers[1].city ? mockLawyers[1].city : "نامشخص"}`)).toBeInTheDocument(); + }); - await act(async () => { - fireEvent.click(getByText('جست و جوی وکلا')); - }); + it('navigates to Lawyer-search-page when "جست و جوی وکلا" button is clicked', async () => { + const { getByText } = render( + + + + ); - await waitFor(() => expect(window.location.pathname).toBe('/Lawyer-search-page')); - }); + userEvent.click(getByText('جست و جوی وکلا')); + + await waitFor(() => expect(window.location.pathname).toBe('/Lawyer-search-page')); + }); }); diff --git a/vakilpors-front/src/components/authentication/Login.jsx b/vakilpors-front/src/components/authentication/Login.jsx index 2b191f117..07837d22d 100644 --- a/vakilpors-front/src/components/authentication/Login.jsx +++ b/vakilpors-front/src/components/authentication/Login.jsx @@ -1,200 +1,294 @@ import React, { useState, useEffect } from "react"; import { Link, useNavigate } from "react-router-dom"; -import { Helmet } from 'react-helmet-async'; -import { Grid, TextField, Typography, Slide, Button, InputAdornment, IconButton } from '@mui/material'; -import { CastForEducation, Visibility, VisibilityOff } from "@mui/icons-material"; -import { toast } from 'react-toastify'; +import { Helmet } from "react-helmet-async"; +import { + Grid, + TextField, + Typography, + Slide, + Button, + InputAdornment, + IconButton, +} from "@mui/material"; +import { + CastForEducation, + Visibility, + VisibilityOff, +} from "@mui/icons-material"; +import { toast } from "react-toastify"; import { useAuth } from "../../context/AuthProvider"; -import lawOnline from '../../assests/images/law-online.jpg'; +import lawOnline from "../../assests/images/law-online.jpg"; import StyledButton from "../ButtonComponent"; +import ReactLoading from "react-loading"; // mui rtl -import rtlPlugin from 'stylis-plugin-rtl'; -import { CacheProvider } from '@emotion/react'; -import createCache from '@emotion/cache'; -import { createTheme } from '@mui/material/styles'; -import { ThemeProvider } from '@mui/material/styles'; +import rtlPlugin from "stylis-plugin-rtl"; +import { CacheProvider } from "@emotion/react"; +import createCache from "@emotion/cache"; +import { createTheme } from "@mui/material/styles"; +import { ThemeProvider } from "@mui/material/styles"; const cacheRtl = createCache({ - key: 'muirtl', - stylisPlugins: [rtlPlugin], - typography: { - fontFamily: 'shabnam', - }, + key: "muirtl", + stylisPlugins: [rtlPlugin], + typography: { + fontFamily: "shabnam", + }, }); const theme = createTheme({ - direction: 'rtl', + direction: "rtl", }); // mui rtl const Login = () => { - - const [password, setPassword] = useState(''); - const [phoneNumber, setPhoneNumber] = useState(''); - const [show, setShow] = useState(false); - const [showPassword, setShowPassword] = useState(false); - const handleClickShowPassword = () => setShowPassword(!showPassword); - const handleMouseDownPassword = () => setShowPassword(!showPassword); + const [password, setPassword] = useState(""); + const [phoneNumber, setPhoneNumber] = useState(""); + const [show, setShow] = useState(false); + const [showPassword, setShowPassword] = useState(false); + const handleClickShowPassword = () => setShowPassword(!showPassword); + const handleMouseDownPassword = () => setShowPassword(!showPassword); + const [loading, setloading] = useState(false); - useEffect(() => { - setShow(true); - }, []); + useEffect(() => { + setShow(true); + }, []); - const showErrorMessage = (errorMessage) => { - toast.error(errorMessage, { - position: "bottom-right", - autoClose: 5000, - hideProgressBar: false, - closeOnClick: true, - pauseOnHover: true, - draggable: true, - progress: undefined, - theme: "light", - rtl:true, - }); - }; - const showSuccesMessage = (payam) => { - toast.success(payam, { - position: "bottom-right", - autoClose: 3000, - hideProgressBar: false, - closeOnClick: true, - pauseOnHover: true, - draggable: true, - progress: undefined, - theme: "light", - rtl:true, - }); - }; + const showErrorMessage = (errorMessage) => { + toast.error(errorMessage, { + position: "bottom-right", + autoClose: 5000, + hideProgressBar: false, + closeOnClick: true, + pauseOnHover: true, + draggable: true, + progress: undefined, + theme: "light", + rtl: true, + }); + }; + const showSuccesMessage = (payam) => { + toast.success(payam, { + position: "bottom-right", + autoClose: 3000, + hideProgressBar: false, + closeOnClick: true, + pauseOnHover: true, + draggable: true, + progress: undefined, + theme: "light", + rtl: true, + }); + }; - const { login } = useAuth(); + const { login } = useAuth(); - const navigate = useNavigate(); + const navigate = useNavigate(); - const handleLoginClick = async (event) => { - event.preventDefault(); - if (phoneNumber === '' || password === '') { - showErrorMessage("لطفا شماره موبایل و رمز عبور را وارد کنید."); - return; - } - else { - const success = await login(phoneNumber, password); - if(success === "success"){ - showSuccesMessage("با موفقیت وارد شدید."); - await delay(3000); - navigate("/"); - } - else{ - showErrorMessage("ورود با خطا مواجه شد."); - } - } - }; + const handleLoginClick = async (event) => { + event.preventDefault(); + if (phoneNumber === "" || password === "") { + showErrorMessage("لطفا شماره موبایل و رمز عبور را وارد کنید."); + return; + } else { + setloading(true); + const success = await login(phoneNumber, password); + if (success === "success") { + setloading(false); + showSuccesMessage("با موفقیت وارد شدید."); + await delay(3000); + navigate("/"); + } else { + setloading(false); + showErrorMessage("ورود با خطا مواجه شد."); + } + } + }; - const delay = ms => new Promise( - resolve => setTimeout(resolve, ms) - ); + const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms)); - return ( - <> - - ورود - - + return ( + <> + + ورود + + - - - - - به وکیل پرس خوش آمدید! - - - - setPhoneNumber(e.target.value)} - variant="outlined" - inputProps={{ dir: "rtl", style: { fontFamily:"shabnam", fontSize: "17px",color:"black",} }} - InputLabelProps={{ align: "right", dir: "rtl", style: { fontFamily:"shabnam", fontSize: "17px",color:"black",} }} - sx={{ - width: {xs:'100%',sm:'80%'}, - padding: 0, - backgroundColor: 'rgba(255,255,255,0.5)', - mb: '10px', - borderRadius:"5px", - }}/> - - - setPassword(e.target.value)} - variant="outlined" - InputProps={{ dir: "rtl", style: { fontFamily:"shabnam", fontSize: "17px",color:"black",}, - endAdornment: ( - - - {showPassword ? : } - - - ) - }} - InputLabelProps={{ align: "right", dir: "rtl", style: { fontFamily:"shabnam", fontSize: "17px",color:"black",} }} - sx={{ - width: {xs:'100%',sm:'80%'}, - padding: 0, - backgroundColor: 'rgba(255,255,255,0.5)', - borderRadius:"5px", - }}/> - - - - {/* */} - - ورود - - - - - - - اکانت ندارید؟ ثبت نام کنید! - - - فراموشی رمز عبور - - - + + {!loading && ( + ورورد + )} + {loading && ( +
+ +
+ )} +
+
+ + + + + اکانت ندارید؟ ثبت نام کنید! + + + فراموشی رمز عبور + + +
- +
-
- - ); -} +
+ + ); +}; -export default Login; \ No newline at end of file +export default Login; diff --git a/vakilpors-front/src/components/case-pages/ShowCases.jsx b/vakilpors-front/src/components/case-pages/ShowCases.jsx index bdf04e685..9cc24f664 100644 --- a/vakilpors-front/src/components/case-pages/ShowCases.jsx +++ b/vakilpors-front/src/components/case-pages/ShowCases.jsx @@ -1,39 +1,95 @@ import React, { useEffect, useState } from "react"; -import { Helmet } from 'react-helmet-async'; +import { Helmet } from "react-helmet-async"; import { useNavigate } from "react-router-dom"; import { useParams } from "react-router-dom"; -import useStateRef from 'react-usestateref'; +import useStateRef from "react-usestateref"; import { useAuth } from "../../context/AuthProvider"; import { BASE_API_ROUTE } from "../../Constants"; import axios from "axios"; -import jwt from 'jwt-decode'; -import { Box, Grid, Button, Typography, Card, CardActions, CardContent, IconButton, styled } from '@mui/material'; -import Tooltip, { tooltipClasses } from '@mui/material/Tooltip'; -import { Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle } from '@mui/material'; -import { DownloadForOfflineOutlined, } from '@mui/icons-material'; -import { toast } from 'react-toastify'; - -const HtmlTooltip = styled (({ className, ...props }) => ( - +import jwt from "jwt-decode"; +import { + Box, + Grid, + Button, + Typography, + Card, + CardActions, + CardContent, + IconButton, + styled, +} from "@mui/material"; +import Tooltip, { tooltipClasses } from "@mui/material/Tooltip"; +import { + Dialog, + DialogActions, + DialogContent, + DialogContentText, + DialogTitle, +} from "@mui/material"; +import { DownloadForOfflineOutlined } from "@mui/icons-material"; +import { toast } from "react-toastify"; +import { + Audio, + BallTriangle, + Bars, + Circles, + Hearts, + Oval, + Puff, + Rings, + SpinningCircles, + TailSpin, + ThreeDots, +} from "@agney/react-loading"; +import backgroun from "../../images/background.jpg"; +import { CacheProvider } from "@emotion/react"; +import createCache from "@emotion/cache"; +import { createTheme } from "@mui/material/styles"; +import rtlPlugin from "stylis-plugin-rtl"; +import { ThemeProvider } from "@mui/material/styles"; +import AddIcon from "@mui/icons-material/Add"; + +const cacheRtl = createCache({ + key: "muirtl", + stylisPlugins: [rtlPlugin], +}); +const theme = createTheme({ + typography: { + fontFamily: "shabnam", + }, + direction: "rtl", +}); + +const HtmlTooltip = styled(({ className, ...props }) => ( + ))(({ theme }) => ({ [`& .${tooltipClasses.tooltip}`]: { - backgroundColor: '#f5f5f9', - color: 'rgba(0, 0, 0, 0.87)', + backgroundColor: "#f5f5f9", + color: "rgba(0, 0, 0, 0.87)", maxWidth: 300, - fontSize: '15px', - border: '1px solid #dadde9', - fontFamily: 'shabnam', + fontSize: "15px", + border: "1px solid #dadde9", + fontFamily: "shabnam", }, })); - -const ShowCases = () => { +const ShowCases = () => { const [Cases, setCases, refCases] = useStateRef([]); const [openDescription, setOpenDescription] = useState(false); - const [description, setDescription] = useState(''); + const [description, setDescription] = useState(""); const { getAccessToken } = useAuth(); const navigate = useNavigate(); + const [loading, setloading] = useState(false); const { isLawyer } = useParams(); + const [openDialog, setOpenDialog] = useState(false); + + const handleClickDelete = () => { + setOpenDialog(true); + }; + + const handleCloseDialog = () => { + setOpenDialog(false); + }; const handleOpenDescription = (des) => { setOpenDescription(true); @@ -46,29 +102,43 @@ const ShowCases = () => { const getLawyersThatHaveAccessToDoc = async (docId) => { const token = await getAccessToken(); - if(token){ - const url = BASE_API_ROUTE + `Document/GetLawyersThatHaveAccessToDocument?documentId=${docId}`; + if (token) { + const url = + BASE_API_ROUTE + + `Document/GetLawyersThatHaveAccessToDocument?documentId=${docId}`; try { - const response = await axios.get(url, {headers: {Authorization: `Bearer ${token}`}}); + const response = await axios.get(url, { + headers: { Authorization: `Bearer ${token}` }, + }); // console.log('response in getLawyersThatHaveAccessToDoc : ',response); return response.data.data; } catch (error) { - console.log('error in getLawyersThatHaveAccessToDoc : ',error); + console.log("error in getLawyersThatHaveAccessToDoc : ", error); } } }; const getCases = async () => { const token = await getAccessToken(); - if(token){ + if (token) { + setloading(true); const tokenData = jwt(token); - const url = BASE_API_ROUTE + ( isLawyer.split('_')[0] == 'true' ? `Document/GetDocumentsThatLawyerHasAccessToByUserId` : `Document/GetDocumentsByUserId?userId=${tokenData.uid}`); + const url = + BASE_API_ROUTE + + (isLawyer.split("_")[0] == "true" + ? `Document/GetDocumentsThatLawyerHasAccessToByUserId` + : `Document/GetDocumentsByUserId?userId=${tokenData.uid}`); const Data = { - "userId": isLawyer.split('_')[1], - "lawyerId": isLawyer.split('_')[2] - } + userId: isLawyer.split("_")[1], + lawyerId: isLawyer.split("_")[2], + }; try { - const response = await (isLawyer.split('_')[0] == 'true' ? axios.post(url, Data, {headers: {Authorization: `Bearer ${token}`}}) : axios.get(url,{headers: {Authorization: `Bearer ${token}`}})); + const response = await (isLawyer.split("_")[0] == "true" + ? axios.post(url, Data, { + headers: { Authorization: `Bearer ${token}` }, + }) + : axios.get(url, { headers: { Authorization: `Bearer ${token}` } })); + setloading(false); setCases(response.data.data); // response.data.data.map(async (casei) => { // const lawyers = await getLawyersThatHaveAccessToDoc(casei.id); @@ -77,11 +147,12 @@ const ShowCases = () => { // }); // console.log('response in getDocument : ',response); } catch (error) { - console.log('error in getDocument : ',error); + setloading(false); + console.log("error in getDocument : ", error); } } }; - + useEffect(() => { getCases(); }, []); @@ -96,7 +167,7 @@ const ShowCases = () => { draggable: true, progress: undefined, theme: "light", - rtl:true, + rtl: true, }); }; const showSuccesMessage = (payam) => { @@ -109,43 +180,51 @@ const ShowCases = () => { draggable: true, progress: undefined, theme: "light", - rtl:true, + rtl: true, }); }; const handleChooseCase = async (docId) => { const token = await getAccessToken(); - if(token){ - const url = BASE_API_ROUTE + 'Document/GrantAccessToLawyer'; + if (token) { + const url = BASE_API_ROUTE + "Document/GrantAccessToLawyer"; const data = { - "lawyerId": isLawyer.split('_')[1], // or number - "documentId": docId, - } + lawyerId: isLawyer.split("_")[1], // or number + documentId: docId, + }; try { - const response = await axios.post(url, data, {headers: {Authorization: `Bearer ${token}`}}); + const response = await axios.post(url, data, { + headers: { Authorization: `Bearer ${token}` }, + }); // console.log('response in GrantAccessToLawyer : ',response); - showSuccesMessage('پرونده مورد نظر با موفقیت برای وکیل مورد نظر ارسال شد.'); + showSuccesMessage( + "پرونده مورد نظر با موفقیت برای وکیل مورد نظر ارسال شد." + ); } catch (error) { - console.log('error in GrantAccessToLawyer : ',error); - showErrorMessage('خطا در ارسال پرونده'); + console.log("error in GrantAccessToLawyer : ", error); + showErrorMessage("خطا در ارسال پرونده"); } } }; const handleDeleteCase = async (docId) => { const token = await getAccessToken(); - if(token){ - const url = BASE_API_ROUTE + `Document/DeleteDocument?documentId=${docId}`; + if (token) { + const url = + BASE_API_ROUTE + `Document/DeleteDocument?documentId=${docId}`; try { - const response = await axios.get(url, {headers: {Authorization: `Bearer ${token}`}}); + const response = await axios.get(url, { + headers: { Authorization: `Bearer ${token}` }, + }); // console.log('response in deleting case : ',response); getCases(); - showSuccesMessage('پرونده مورد نظر با موفقیت حذف شد.'); + showSuccesMessage("پرونده مورد نظر با موفقیت حذف شد."); } catch (error) { - console.log('error in deleting case : ',error); - showErrorMessage('خطا در حذف پرونده'); + console.log("error in deleting case : ", error); + showErrorMessage("خطا در حذف پرونده"); } } + setOpenDialog(false) }; const showLawyersThatHaveAccessToDoc = (docId) => { @@ -153,103 +232,293 @@ const ShowCases = () => { }; const card = (casei) => { - return ( - - - - عنوان : {casei.title} - - - نام : {casei.caseName} - - - گروه : {casei.documentCategory} - - - حداقل بودجه : {casei.minimumBudget} تومان -
- حداکثر بودجه : {casei.maximumBudget} تومان -
- handleOpenDescription(casei.description)}> - - توضیحات : {casei.description} + return ( + + +
+ img +
+ + عنوان : {casei.title} -
- - - - - {'دانلود فایل'} - - - - {showLawyersThatHaveAccessToDoc(casei.id)} -
- {isLawyer == 'false' && - - - - - } - {isLawyer.split('_')[0] == 'choose' && - - - - } -
+ + نام : {casei.caseName} + + + گروه : {casei.documentCategory} + + + حداقل بودجه : {casei.minimumBudget} تومان +
+ حداکثر بودجه : {casei.maximumBudget} تومان +
+ {/* handleOpenDescription(casei.description)} + > + + توضیحات : {casei.description} + + */} + {isLawyer !== "false" && ( + + + + + + {"دانلود فایل"} + + + + + )} + {showLawyersThatHaveAccessToDoc(casei.id)} + + {isLawyer === "false" && ( +
+ + + + + +
آیا از حذف کردن مطمئنید؟
+
+ +
+ + +
+
+
+
+
+ )} + {isLawyer.split("_")[0] == "choose" && ( + + + + )} + ); }; - + const ClickNewCase = () => { - navigate('/new-case/add'); + navigate("/new-case/add"); }; - return( - <> - - پرونده های من - - - - - - {refCases.current.length == 0 ? {isLawyer.split('_')[0] == 'true' ? 'هنوز پرونده ای برای شما ارسال نشده است.' : 'شما هنوز پرونده‌ ای ایجاد نکرده اید.'} - : - refCases.current.map((casei) => - - {card(casei)} + return ( + <> + {loading && ( +
+ +
+ )} + {!loading && ( + <> + + پرونده های من + + + + +
+
+
+ پرونده های من +
+
+ {isLawyer === "false" && ( + + + + )} +
+
+
+
+ + {refCases.current.length == 0 ? ( + + {isLawyer.split("_")[0] == "true" + ? "هنوز پرونده ای برای شما ارسال نشده است." + : "شما هنوز پرونده‌ ای ایجاد نکرده اید."} + + ) : ( + refCases.current.map((casei) => ( + + + {card(casei)} + + + )) + )} + +
+ {/* {isLawyer == "false" && ( + + - ) - } + )} */}
- {isLawyer == 'false' && - - - - } -
-
- - - متن کامل توضیحات: - - - - {description} - - - - - - - + + + + متن کامل توضیحات: + + + + + + {description} + + + + + + + + + )} + ); -} - -export default ShowCases; \ No newline at end of file +}; +export default ShowCases; diff --git a/vakilpors-front/src/components/case-pages/addNewCase.jsx b/vakilpors-front/src/components/case-pages/addNewCase.jsx index 3b5f7756a..516b9d959 100644 --- a/vakilpors-front/src/components/case-pages/addNewCase.jsx +++ b/vakilpors-front/src/components/case-pages/addNewCase.jsx @@ -1,59 +1,84 @@ import React, { useState, useEffect } from "react"; -import { Helmet } from 'react-helmet-async'; +import { Helmet } from "react-helmet-async"; import { useAuth } from "../../context/AuthProvider"; import { BASE_API_ROUTE } from "../../Constants"; import axios from "axios"; import { useParams } from "react-router-dom"; -import { Typography, Grid, TextField, InputAdornment, IconButton, Box, OutlinedInput, InputLabel, FormControl } from "@mui/material"; -import { toast } from 'react-toastify'; -import Autocomplete, { createFilterOptions } from '@mui/material/Autocomplete'; -import { MuiFileInput } from 'mui-file-input' -import '../../css/Newcase.css'; +import { + Typography, + Grid, + TextField, + InputAdornment, + IconButton, + Box, + OutlinedInput, + InputLabel, + FormControl, +} from "@mui/material"; +import { toast } from "react-toastify"; +import Autocomplete, { createFilterOptions } from "@mui/material/Autocomplete"; +import { MuiFileInput } from "mui-file-input"; +import "../../css/Newcase.css"; +import { AddCircleOutline } from "@mui/icons-material"; +import StyledButton from "../ButtonComponent"; +import ReactLoading from "react-loading"; +import { useNavigate } from "react-router-dom"; +import { Button } from "@mui/material"; // mui rtl -import rtlPlugin from 'stylis-plugin-rtl'; -import { CacheProvider } from '@emotion/react'; -import createCache from '@emotion/cache'; -import { createTheme } from '@mui/material/styles'; -import { ThemeProvider } from '@mui/material/styles'; +import rtlPlugin from "stylis-plugin-rtl"; +import { CacheProvider } from "@emotion/react"; +import createCache from "@emotion/cache"; +import { createTheme } from "@mui/material/styles"; +import { ThemeProvider } from "@mui/material/styles"; const cacheRtl = createCache({ - key: 'muirtl', - stylisPlugins: [rtlPlugin], + key: "muirtl", + stylisPlugins: [rtlPlugin], }); const theme = createTheme({ - direction: 'rtl', + typography: { + fontFamily: "shabnam", + }, + direction: "rtl", }); // mui rtl const filter = createFilterOptions(); const AddNewCase = () => { - + const navigate = useNavigate(); const [DocumentId, setDocumentId] = useState(); - const [isEdit, setisEdit] = useState(false); - const [Title, setTitle] = useState(''); + const [isEdit, setisEdit] = useState(false); + const [Title, setTitle] = useState(""); const [File, setFile] = useState(null); - const [FileURL, setFileURL] = useState(''); - const [MinimumBudget, setMinimumBadget] = useState(''); - const [MaximumBudget, setMaximumBadget] = useState(''); - const [Description, setDescription] = useState(''); - const [caseName, setCaseName] = useState(''); - const [DocumentCategory, setDocumentCategory] = useState(''); + const [FileURL, setFileURL] = useState(""); + const [MinimumBudget, setMinimumBadget] = useState(""); + const [MaximumBudget, setMaximumBadget] = useState(""); + const [Description, setDescription] = useState(""); + const [caseName, setCaseName] = useState(""); + const [DocumentCategory, setDocumentCategory] = useState(""); + const [loading, setloading] = useState(false); + const { getAccessToken } = useAuth(); const { func } = useParams(); useEffect(() => { const getDocData = async () => { - if(func.split('_')[0] == "edit"){ + if (func.split("_")[0] == "edit") { setisEdit(true); } - setDocumentId(func.split('_')[1]); - if(func.split('_')[0] == "edit"){ - const url = BASE_API_ROUTE + `Document/GetDocumentById?documentId=${func.split('_')[1]}`; + setDocumentId(func.split("_")[1]); + if (func.split("_")[0] == "edit") { + const url = + BASE_API_ROUTE + + `Document/GetDocumentById?documentId=${func.split("_")[1]}`; const token = await getAccessToken(); - try{ - const response = await axios.get(url, {headers: {Authorization: `Bearer ${token}`}}); + try { + const response = await axios.get(url, { + headers: { Authorization: `Bearer ${token}` }, + }); // console.log("success in Getting Document Data!!! : ",response); + console.log(response.data.data); setTitle(response.data.data.title); setMinimumBadget(response.data.data.minimumBudget); setMaximumBadget(response.data.data.maximumBudget); @@ -61,14 +86,13 @@ const AddNewCase = () => { setDescription(response.data.data.description); setDocumentCategory(response.data.data.documentCategory); setFileURL(response.data.data.fileUrl); - } - catch (error) { - console.log("error in Getting Document Data!!! : ",error); + } catch (error) { + console.log("error in Getting Document Data!!! : ", error); } } }; getDocData(); - },[]); + }, []); const showErrorMessage = (errorMessage) => { toast.error(errorMessage, { @@ -80,7 +104,7 @@ const AddNewCase = () => { draggable: true, progress: undefined, theme: "light", - rtl:true, + rtl: true, }); }; const showSuccesMessage = (payam) => { @@ -93,62 +117,66 @@ const AddNewCase = () => { draggable: true, progress: undefined, theme: "light", - rtl:true, + rtl: true, }); }; const categories = [ - { category: 'ثبت احوال' }, - { category: 'بیمه' }, - { category: 'ملکی' }, - { category: 'مالیات' }, - { category: 'شرکت ها' }, - { category: 'انحصار وراثت' }, - { category: 'دیوان عدالت اداری' }, - { category: 'مالکیت معنوی' }, - { category: 'بین الملل' }, - { category: 'اداره کار' }, - { category: 'جرایم اینترنتی' }, - { category: 'قراردها' }, - { category: 'وصول مطالبات' }, - { category: 'خانواده' }, - { category: 'کیفری (جرائم)' }, - { category: 'اجرای احکام' }, - { category: 'جرایم علیه اشخاص' }, - { category: 'جرایم علیه اموال' }, - { category: 'جرایم علیه امنیت کشور' }, - { category: 'اموال و مالکیت' }, - { category: 'ثبت اسناد' }, - { category: 'داوری' }, - { category: 'سربازی و نظام وظیفه' }, + { category: "ثبت احوال" }, + { category: "بیمه" }, + { category: "ملکی" }, + { category: "مالیات" }, + { category: "شرکت ها" }, + { category: "انحصار وراثت" }, + { category: "دیوان عدالت اداری" }, + { category: "مالکیت معنوی" }, + { category: "بین الملل" }, + { category: "اداره کار" }, + { category: "جرایم اینترنتی" }, + { category: "قراردها" }, + { category: "وصول مطالبات" }, + { category: "خانواده" }, + { category: "کیفری (جرائم)" }, + { category: "اجرای احکام" }, + { category: "جرایم علیه اشخاص" }, + { category: "جرایم علیه اموال" }, + { category: "جرایم علیه امنیت کشور" }, + { category: "اموال و مالکیت" }, + { category: "ثبت اسناد" }, + { category: "داوری" }, + { category: "سربازی و نظام وظیفه" }, ]; const titles = [ - { title: 'مشاوره حضوری' }, - { title: 'مشاوره تلفنی' }, - { title: 'مشاوره آنلاین' }, - { title: 'وکالت' }, - { title: 'داوری' }, - ] + { title: "مشاوره حضوری" }, + { title: "مشاوره تلفنی" }, + { title: "مشاوره آنلاین" }, + { title: "وکالت" }, + { title: "داوری" }, + ]; const titleLists = () => { return ( - { - if (typeof newValue === 'string') { - setTitle(newValue) + if (typeof newValue === "string") { + setTitle(newValue); } else if (newValue && newValue.inputValue) { - setTitle(newValue.inputValue) - } else if(newValue && newValue.title) { - setTitle(newValue.title) + setTitle(newValue.inputValue); + } else if (newValue && newValue.title) { + setTitle(newValue.title); } }} filterOptions={(options, params) => { const filtered = filter(options, params); const { inputValue } = params; - const isExisting = options.some((option) => inputValue === option.title); - if (inputValue !== '' && !isExisting) { + const isExisting = options.some( + (option) => inputValue === option.title + ); + if (inputValue !== "" && !isExisting) { filtered.push({ inputValue, title: `Add "${inputValue}"`, @@ -163,7 +191,7 @@ const AddNewCase = () => { options={titles} getOptionLabel={(option) => { // Value selected with enter, right from the input - if (typeof option === 'string') { + if (typeof option === "string") { return option; } // Add "xxx" option created dynamically @@ -173,33 +201,45 @@ const AddNewCase = () => { // Regular option return option.title; }} - renderOption={(props, option) =>
  • {option.title}
  • } + renderOption={(props, option) => ( +
  • + {option.title} +
  • + )} freeSolo renderInput={(params) => ( - + )} /> ); }; - + const categoryList = () => { return ( { - if (typeof newValue === 'string') { - setDocumentCategory(newValue) + if (typeof newValue === "string") { + setDocumentCategory(newValue); } else if (newValue && newValue.inputValue) { - setDocumentCategory(newValue.inputValue) - } else if(newValue && newValue.category) { - setDocumentCategory(newValue.category) + setDocumentCategory(newValue.inputValue); + } else if (newValue && newValue.category) { + setDocumentCategory(newValue.category); } }} filterOptions={(options, params) => { const filtered = filter(options, params); const { inputValue } = params; - const isExisting = options.some((option) => inputValue === option.category); - if (inputValue !== '' && !isExisting) { + const isExisting = options.some( + (option) => inputValue === option.category + ); + if (inputValue !== "" && !isExisting) { filtered.push({ inputValue, category: `Add "${inputValue}"`, @@ -214,7 +254,7 @@ const AddNewCase = () => { options={categories} getOptionLabel={(option) => { // Value selected with enter, right from the input - if (typeof option === 'string') { + if (typeof option === "string") { return option; } // Add "xxx" option created dynamically @@ -224,166 +264,583 @@ const AddNewCase = () => { // Regular option return option.category; }} - renderOption={(props, option) =>
  • {option.category}
  • } + renderOption={(props, option) => ( +
  • + {option.category} +
  • + )} freeSolo renderInput={(params) => ( - + )} /> ); }; - + const Check = () => { + if ((Title === "") | (Title === null)) { + showErrorMessage("باید حتما انتخاب کنید چه کاری می خواهید انجام دهید"); + return false; + } + if (MaximumBudget <= MinimumBudget) { + showErrorMessage("مقدار حداکثر بودجه باید بیشتر از حداقل آن باشد."); + return false; + } + if ((caseName === "") | (caseName === null)) { + showErrorMessage("باید حتما نام پرونده خود را انتخاب کنید."); + return false; + } + if ((DocumentCategory === "") | (DocumentCategory === null)) { + showErrorMessage("باید زمینه پرونده را حتما انتخاب کنید."); + return false; + } + return true; + }; const handleCreateCase = async () => { - if(MaximumBudget <= MinimumBudget){ - showErrorMessage('مقدار حداکثر بودجه باید بیشتر از حداقل آن باشد.'); + if (Check() === false) { return; } + setloading(true); const data = new FormData(); - data.append('MaximumBudget', MaximumBudget); - data.append('MinimumBudget', MinimumBudget); - data.append('FileUrl', ''); - data.append('Title', Title); - data.append('DocumentCategory', DocumentCategory); - data.append('File', File); - data.append('Description', Description); - data.append('caseName', caseName); + data.append("MaximumBudget", MaximumBudget); + data.append("MinimumBudget", MinimumBudget); + data.append("FileUrl", ""); + data.append("Title", Title); + data.append("DocumentCategory", DocumentCategory); + data.append("File", File); + data.append("Description", Description); + data.append("caseName", caseName); // console.log({MaximumBudget, MinimumBudget, Title, DocumentCategory, File, Description, caseName}); const token = await getAccessToken(); - if(token){ - const url = BASE_API_ROUTE + 'Document/AddDocument'; + if (token) { + const url = BASE_API_ROUTE + "Document/AddDocument"; try { - const response = await axios.post(url,data,{headers: {Authorization: `Bearer ${token}`}}); - // console.log('response in adding doc : ', response); - showSuccesMessage('پرونده با موفقیت ایجاد شد.'); + const response = await axios.post(url, data, { + headers: { Authorization: `Bearer ${token}` }, + }); + // console.log('response in adding doc : ', response); + setloading(false); + showSuccesMessage("پرونده با موفقیت ایجاد شد."); + navigate("/show-cases/false"); } catch (error) { - console.log('error in adding doc : ',error); - showErrorMessage('ایجاد پرونده با خطا مواجه شد'); + console.log("error in adding doc : ", error); + setloading(false); + showErrorMessage("ایجاد پرونده با خطا مواجه شد"); } } }; const handleEditCase = async () => { - if(MaximumBudget <= MinimumBudget){ - showErrorMessage('مقدار حداکثر بودجه باید بیشتر از حداقل آن باشد.'); + if (Check() === false) { + return; + } + if ((Title === "") | (Title === null)) { + showErrorMessage("باید حتما انتخاب کنید چه کاری می خواهید انجام دهید"); + return; + } + if (MaximumBudget <= MinimumBudget) { + showErrorMessage("مقدار حداکثر بودجه باید بیشتر از حداقل آن باشد."); return; } + setloading(true); const data = new FormData(); - data.append('MaximumBudget', MaximumBudget); - data.append('MinimumBudget', MinimumBudget); - data.append('FileUrl', FileURL); - data.append('Title', Title); - data.append('DocumentCategory', DocumentCategory); - data.append('Id', DocumentId); - data.append('File', File); - data.append('Description', Description); - data.append('caseName', caseName); - + data.append("MaximumBudget", MaximumBudget); + data.append("MinimumBudget", MinimumBudget); + data.append("FileUrl", FileURL); + data.append("Title", Title); + data.append("DocumentCategory", DocumentCategory); + data.append("Id", DocumentId); + data.append("File", File); + data.append("Description", Description); + data.append("caseName", caseName); + const token = await getAccessToken(); - if(token){ - const url = BASE_API_ROUTE + 'Document/UpdateDocument'; + if (token) { + const url = BASE_API_ROUTE + "Document/UpdateDocument"; try { - const response = await axios.post(url,data,{headers: {Authorization: `Bearer ${token}`}}); - // console.log('response in updating Document : ', response); - showSuccesMessage('پرونده با موفقیت ویرایش شد.'); + const response = await axios.post(url, data, { + headers: { Authorization: `Bearer ${token}` }, + }); + setloading(false); + // console.log('response in updating Document : ', response); + showSuccesMessage("پرونده با موفقیت ویرایش شد."); + navigate("/show-cases/false"); } catch (error) { - console.log('error in updating Document : ',error); - showErrorMessage('ویرایش پرونده با خطا مواجه شد'); + console.log("error in updating Document : ", error); + setloading(false); + showErrorMessage("ویرایش پرونده با خطا مواجه شد"); } } }; return ( <> - - {isEdit ? "ویرایش پرونده" : "افزودن پرونده"} - - - - - - {isEdit ? "ویرایش پرونده" : "افزودن پرونده جدید"} -
    - -
    1
    - چه کاری می خواهید برای شما انجام شود؟ -
    - {titleLists()} -

    -

    - -
    2
    - پرونده شما در چه زمینه ای است؟ -
    - {categoryList()} -

    -

    - -
    3
    - نام پرونده -
    - setCaseName(e.target.value)} - variant="outlined" - inputProps={{style: { fontFamily:"shabnam"}}}/> -

    -

    - -
    4
    - پرونده خود را توضیح دهید : -
    - setDescription(e.target.value)} - variant="outlined" - inputProps={{style: {fontFamily:"shabnam"}}}/> -

    -

    - -
    5
    - اپلود فایل پرونده -
    - setFile(File)} /> -

    -

    - -
    6
    - بودجه شما چقدر است ؟ -
    - setMinimumBadget(e.target.value)} - variant="outlined" - inputProps={{ dir: "rtl", style: { fontFamily:"shabnam", fontSize: "15px",color:"black",} }} - InputLabelProps={{ align: "right", dir: "rtl", style: { fontFamily:"shabnam", fontSize: "15px",color:"black",} }} - sx={{width:{xs:'100%',sm:'50%'},mb:'10px'}}/> - setMaximumBadget(e.target.value)} - variant="outlined" - inputProps={{ dir: "rtl", style: { fontFamily:"shabnam", fontSize: "15px",color:"black",}}} - InputLabelProps={{ align: "right", dir: "rtl", style: { fontFamily:"shabnam", fontSize: "15px",color:"black",} }} - sx={{width:{xs:'100%',sm:'50%'}}}/> -

    -

    - -
    -
    -
    -
    + + {isEdit ? "ویرایش پرونده" : "افزودن پرونده"} + + + + + + + + + {isEdit ? "ویرایش پرونده" : "افزودن پرونده جدید"} + +
    + +
    + 1 +
    + + چه کاری می خواهید برای شما انجام شود؟ + +
    + {titleLists()} +

    + +
    + 2 +
    + + پرونده شما در چه زمینه ای است؟ + +
    + {categoryList()} +

    + +
    + 3 +
    + + نام پرونده + +
    + setCaseName(e.target.value)} + variant="outlined" + inputProps={{ style: { fontFamily: "shabnam" } }} + /> +

    + +
    + 4 +
    + + پرونده خود را توضیح دهید :{" "} + +
    + setDescription(e.target.value)} + variant="outlined" + inputProps={{ style: { fontFamily: "shabnam" } }} + /> +

    + +
    + 5 +
    + + اپلود فایل پرونده + +
    +
    + setFile(File)} + /> + {FileURL && ( + + )} +
    +

    + +
    + 6 +
    + + بودجه شما چقدر است ؟{" "} + +
    + setMinimumBadget(e.target.value)} + variant="outlined" + inputProps={{ + dir: "rtl", + style: { + fontFamily: "shabnam", + fontSize: "15px", + color: "black", + }, + }} + InputLabelProps={{ + align: "right", + dir: "rtl", + style: { + fontFamily: "shabnam", + fontSize: "15px", + color: "black", + }, + }} + sx={{ width: { xs: "100%", sm: "50%" }, mb: "10px" }} + size="small" + /> + setMaximumBadget(e.target.value)} + variant="outlined" + inputProps={{ + dir: "rtl", + style: { + fontFamily: "shabnam", + fontSize: "15px", + color: "black", + }, + }} + InputLabelProps={{ + align: "right", + dir: "rtl", + style: { + fontFamily: "shabnam", + fontSize: "15px", + color: "black", + }, + }} + sx={{ width: { xs: "100%", sm: "50%" } }} + size="small" + /> +

    +
    + { + isEdit ? handleEditCase() : handleCreateCase(); + }} + > + {!loading && ( + + {" "} + {isEdit ? "ویرایش پرونده" : "ایجاد پرونده"}{" "} + + )} + {loading && ( +
    + +
    + )} +
    +
    +
    +
    + + + + راهنمای پرونده + +
    + کار مورد انتظار +
    +
    + در این قسمت در میخواهید مشاوره حضوری یا غیر حضوری یا داوری + میخواهید باید یکی از گزینه های مورد نظر را انتخاب کنید +
    + +
    + زمینه پرونده +
    +
    + در این قسمت، توضیح دهید که پرونده شما در چه زمینه‌ای قرار + دارد و چه نوع فعالیتی را پوشش می‌دهد. +
    + +
    + انتخاب نام +
    +
    + یک نام برای پرونده خودتان انتخاب کنید تا وکیل مورد نظر از + روی نام متوجه موضوع مورد نظر بشود +
    + +
    + توضیح پرونده +
    +
    + نکاتی که در رابطه با پرونده تان ضروری هست را توضیح دهید تا + وکیل مورد نظر بتواند کمکتان کند +
    + +
    + آپلود اسناد +
    +
    + مدرک و اسنادی که در رابطه با پرونده خود دارید را اپلود کنید + تا وکیل مورد نظر بعد بررسی اسناد بتواند مشاوره بهتری به شما + بدهد +
    + +
    + هزینه مورد نظر +
    +
    + حداقل و حداکثر هزینه خود را وارد کنید تا بتوانیم شما را کمک + کنید فقط هزینه حداقل کمتر از حداکثر باشد +
    +
    +
    +
    +
    +
    +
    ); -} +}; -export default AddNewCase; \ No newline at end of file +export default AddNewCase; diff --git a/vakilpors-front/src/components/premium-page/PremiumPage.jsx b/vakilpors-front/src/components/premium-page/PremiumPage.jsx index 70d65b5d0..469edae93 100644 --- a/vakilpors-front/src/components/premium-page/PremiumPage.jsx +++ b/vakilpors-front/src/components/premium-page/PremiumPage.jsx @@ -193,7 +193,7 @@ const PremiumPage = () => { setmonthtransaction([]); setmonth([]); for (let i = 0; i < transactionmonth.data.data.length; i++) { - const newData = transactionmonth.data.data[i].amount; + const newData =Math.floor(transactionmonth.data.data[i].amount); const newmonth = transactionmonth.data.data[i].month; console.log(transactionmonth.data.data[i].amount); setmonthtransaction((prevState) => [...prevState, newData]); @@ -408,8 +408,8 @@ const PremiumPage = () => { borderRadius: "20px", padding: "5px 50px 5px 50px ", fontWeight: "bold", - width: "80%", - fontSize: "1rem", + width: "85%", + fontSize: "13px", }} > ویرایش پروفایل diff --git a/vakilpors-front/src/components/premium-page/test/Avertising.test.jsx b/vakilpors-front/src/components/premium-page/test/Avertising.test.jsx index 6521bf0bb..a2c925e38 100644 --- a/vakilpors-front/src/components/premium-page/test/Avertising.test.jsx +++ b/vakilpors-front/src/components/premium-page/test/Avertising.test.jsx @@ -77,50 +77,3 @@ describe('Advertising component', () => { expect(screen.getByText(mockLawyers[0].title)).toBeInTheDocument(); }); }); - - - - - - - - - - - - - - - - - - - - - - - -// import React from 'react'; -// import { render, screen } from '@testing-library/react'; -// import { BrowserRouter as Router } from 'react-router-dom'; -// import Advertising from '../Avertising'; - -// const mockLawyer = { -// // your mock lawyer data here -// }; - -// const mockLawyers = [mockLawyer]; - -// describe('Advertising component', () => { -// it('displays lawyer information when data is loaded', async () => { -// render( -// -// -// -// ); - -// expect(screen.getByText(mockLawyers[0].user.name)).toBeInTheDocument(); -// expect(screen.getByText(`عنوان: ${mockLawyers[0].title ? mockLawyers[0].title : "وکیل"}`)).toBeInTheDocument(); -// expect(screen.getByText(`شهر: ${mockLawyers[0].city ? mockLawyers[0].city : "نامشخص"}`)).toBeInTheDocument(); -// }); -// }); diff --git a/vakilpors-front/src/components/profile/Lawyer_Jobinfo.jsx b/vakilpors-front/src/components/profile/Lawyer_Jobinfo.jsx index 13d49b660..ccc2477b8 100644 --- a/vakilpors-front/src/components/profile/Lawyer_Jobinfo.jsx +++ b/vakilpors-front/src/components/profile/Lawyer_Jobinfo.jsx @@ -22,6 +22,13 @@ import InputAdornment from "@material-ui/core/InputAdornment"; import IconButton from "@material-ui/core/IconButton"; import CloudUploadIcon from "@material-ui/icons/CloudUpload"; import { useNavigate } from "react-router-dom"; +import Dialog from "@mui/material/Dialog"; +import DialogActions from "@mui/material/DialogActions"; +import DialogContent from "@mui/material/DialogContent"; +import DialogContentText from "@mui/material/DialogContentText"; +import DialogTitle from "@mui/material/DialogTitle"; +import Slide from "@mui/material/Slide"; +import { TransitionProps } from "@mui/material/transitions"; // mui rtl import rtlPlugin from "stylis-plugin-rtl"; @@ -57,6 +64,17 @@ const Lawyer_Jobinfo = () => { const [specialties, setSpecialties] = useState([]); const fileInputRef = useRef(null); const [loading, setloading] = useState(false); + + const [open, setOpen] = useState(false); + + const handleClickOpen = () => { + setOpen(true); + }; + + const handleClose = () => { + setOpen(false); + }; + const descriptionUser = "کاربر گرامی! در این قسمت می‌توانید تمامی اطلاعات شغلی خود را به‌روزرسانی و یا ویرایش کنید. لطفا از صحت اطلاعات وارد شده اطمینان حاصل نمائید."; @@ -212,6 +230,97 @@ const Lawyer_Jobinfo = () => { ); }; + const OCRDialog = () => { + return ( + + +
    +
    + شماره کد ملی +
    +
    + از کیفیت و صحت کارت ملی خود مطمئن شوید و پس از ان دکمه ارسال را + فشار دهید تا شماره ملی شما استخراج شود اگر شماره ملی درست نیود + خودتان اصلاح کنید +
    +
    +
    + + +
    + + + + {/* {!loading && ارسال} + {loading && ( +
    + +
    + )} */} + ارسال +
    +
    +
    +
    + + + +
    + ); + }; + const handleCallingCardChange = (event) => { const file = event.target.files[0]; console.log(file); @@ -300,6 +409,7 @@ const Lawyer_Jobinfo = () => { : specialtiesString + "/" + takh.title; }); formData.append("specialties", specialtiesString); + console.log(formData); const token = await getAccessToken(); if (token) { const tokenData = jwt(token); @@ -315,6 +425,58 @@ const Lawyer_Jobinfo = () => { } } }; + function convertImageUrlToFile(url, fileName) { + return fetch(url) + .then((response) => response.blob()) + .then((blob) => { + const file = new File([blob], fileName, { + lastModified: new Date().getTime(), + lastModifiedDate: new Date(), + type: blob.type, + }); + return file; + }); + } + const HandleOcr = async (event) => { + console.log(refdetail.current.nationalCardImage); + + const url = BASE_API_ROUTE + `Ocr`; + const file = refdetail.current.nationalCardImage; + + console.log(file); // اضافه کردن این خط + + if (file && file instanceof Blob) { + const reader = new FileReader(); + + reader.onloadend = () => { + const fileString = reader.result; + console.log(fileString); + setdetail({ + ...refdetail.current, + ["nationalCardImage"]: file, + }); + }; + + reader.readAsDataURL(file); + } + + const formData = new FormData(); + formData.append("imageFile", refdetail.current.nationalCardImage); + console.log(formData); + + axios + .post(url, formData, { + headers: { + "Content-Type": "multipart/form-data" + }, + }) + .then((response) => { + console.log(response); + }) + .catch((error) => { + console.log(error); + }); + }; const setUserInfo = (event) => { event.target.name.includes("user") @@ -575,16 +737,16 @@ const Lawyer_Jobinfo = () => { accept=".pdf" onChange={handleResumeChange} /> - + + )} ), }} @@ -618,33 +780,70 @@ const Lawyer_Jobinfo = () => { flexDirection: "column", }} > - +
    + + {refdetail.current.nationalCardImageUrl && ( +
    + + {OCRDialog()} +
    + )} +

    کارت ملی شما در پروفایل شما نمایش داده نخواهد شد و تنها جهت احراز هویت شما توسط ادمین مورد بررسی قرار می گیرد diff --git a/vakilpors-front/src/images/background.jpg b/vakilpors-front/src/images/background.jpg new file mode 100644 index 0000000000000000000000000000000000000000..66c6b44169be465a96419ed2005da0b0e0033c10 GIT binary patch literal 78875 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�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 Date: Thu, 30 Nov 2023 20:08:13 +0330 Subject: [PATCH 5/6] fix : some style in moving bar --- .../premium-page/MovingBarComponent;.jsx | 27 ++++++------------- 1 file changed, 8 insertions(+), 19 deletions(-) diff --git a/vakilpors-front/src/components/premium-page/MovingBarComponent;.jsx b/vakilpors-front/src/components/premium-page/MovingBarComponent;.jsx index 2a42620a7..70b832ec6 100644 --- a/vakilpors-front/src/components/premium-page/MovingBarComponent;.jsx +++ b/vakilpors-front/src/components/premium-page/MovingBarComponent;.jsx @@ -26,25 +26,20 @@ const useStyles = makeStyles((theme) => ({ }, textContainer: { whiteSpace: 'nowrap', - animation: '$marquee 20s linear infinite', color: '#ffffff', textAlign: 'center', - width: '200%', fontFamily: 'Vazir, sans-serif', // Use 'Vazir' font fontSize: '20px', textShadow: '2px 2px 4px rgba(0, 0, 0, 0.2)', - }, - text: { - display: 'inline-block', - color: 'black', - padding: '0 10px', + animation: '$marquee 50s linear infinite', // Adjusted duration to slow down + width: 'fit-content', // Adjust width for better readability }, '@keyframes marquee': { '0%': { - transform: 'translateX(100%)', + transform: 'translateX(-100%)', }, '100%': { - transform: 'translateX(-100%)', + transform: 'translateX(100%)', }, }, })); @@ -57,20 +52,14 @@ const MovingBarComponent = ({ fullText }) => { // Change background color every 3 seconds for a more dynamic effect const interval = setInterval(() => { setBackgroundColor(getRandomColor()); - }, 2000); + }, 2000); // Adjusted interval between appearances return () => clearInterval(interval); }, []); function getRandomColor() { - const colors = [ - // Base color (gray) - '#42A5F5', // Blue - '#66BB6A', // Green - '#8E24AA', // Purple - ]; - - const randomIndex = Math.floor(Math.random() * (colors.length - 1)); + const colors = ['#42A5F5', '#66BB6A', '#8E24AA']; + const randomIndex = Math.floor(Math.random() * colors.length); return colors[randomIndex]; } @@ -90,7 +79,7 @@ const MovingBarComponent = ({ fullText }) => {
    - + {initialText}
    From fa45af8e6224be9560951faa175cadd1d5d3b024 Mon Sep 17 00:00:00 2001 From: FatemehAsakri Date: Thu, 30 Nov 2023 20:55:22 +0330 Subject: [PATCH 6/6] [add]:handle ocr --- .../src/components/profile/Lawyer_Jobinfo.jsx | 82 ++++++++++--------- 1 file changed, 42 insertions(+), 40 deletions(-) diff --git a/vakilpors-front/src/components/profile/Lawyer_Jobinfo.jsx b/vakilpors-front/src/components/profile/Lawyer_Jobinfo.jsx index ccc2477b8..28fe42cf7 100644 --- a/vakilpors-front/src/components/profile/Lawyer_Jobinfo.jsx +++ b/vakilpors-front/src/components/profile/Lawyer_Jobinfo.jsx @@ -64,8 +64,9 @@ const Lawyer_Jobinfo = () => { const [specialties, setSpecialties] = useState([]); const fileInputRef = useRef(null); const [loading, setloading] = useState(false); - const [open, setOpen] = useState(false); + const [loadingocr, setloadingocr] = useState(false); + const [code, setcode] = useState(""); const handleClickOpen = () => { setOpen(true); @@ -171,7 +172,7 @@ const Lawyer_Jobinfo = () => { reader.onloadend = () => { const fileString = reader.result; - console.log(fileString); + // console.log(fileString); setdetail({ ...refdetail.current, ["nationalCardImage"]: file, @@ -285,7 +286,6 @@ const Lawyer_Jobinfo = () => { src={refdetail.current.nationalCardImageUrl} variant="square" /> - { type="submit" onClick={HandleOcr} > - {/* {!loading && ارسال} - {loading && ( + {!loadingocr && ارسال} + {loadingocr && (
    { >
    - )} */} - ارسال + )}
    +
    کد ملی شما:
    +
    {code}
    @@ -425,56 +426,57 @@ const Lawyer_Jobinfo = () => { } } }; - function convertImageUrlToFile(url, fileName) { - return fetch(url) - .then((response) => response.blob()) - .then((blob) => { - const file = new File([blob], fileName, { - lastModified: new Date().getTime(), - lastModifiedDate: new Date(), - type: blob.type, - }); - return file; + async function convertImageUrlToFile(url, fileName) { + try { + const response = await fetch(url); + const blob = await response.blob(); + const file = new File([blob], fileName, { + lastModified: new Date().getTime(), + lastModifiedDate: new Date(), + type: blob.type, }); + return file; + } catch (error) { + console.error("خطا:", error); + throw error; + } } const HandleOcr = async (event) => { + setcode("") console.log(refdetail.current.nationalCardImage); - + const img1 = await convertImageUrlToFile( + refdetail.current.nationalCardImageUrl, + "ocr.jpeg" + ); + console.log(img1); const url = BASE_API_ROUTE + `Ocr`; const file = refdetail.current.nationalCardImage; - console.log(file); // اضافه کردن این خط - - if (file && file instanceof Blob) { - const reader = new FileReader(); - - reader.onloadend = () => { - const fileString = reader.result; - console.log(fileString); - setdetail({ - ...refdetail.current, - ["nationalCardImage"]: file, - }); - }; - - reader.readAsDataURL(file); + const formData1 = new FormData(); + if (refdetail.current.nationalCardImage === null) { + console.log("dfdf"); + formData1.append("imageFile", img1); + } else { + console.log("sdfdsf"); + formData1.append("imageFile", file); } - - const formData = new FormData(); - formData.append("imageFile", refdetail.current.nationalCardImage); - console.log(formData); - + console.log(formData1); + setloadingocr(true); axios - .post(url, formData, { + .post(url, formData1, { headers: { - "Content-Type": "multipart/form-data" + "Content-Type": "multipart/form-data", }, }) .then((response) => { console.log(response); + setcode(response.data.data.nationalCode); + console.log(response.data.data.nationalCode); + setloadingocr(false); }) .catch((error) => { console.log(error); + setloadingocr(false); }); };