diff --git a/src/1_app/ui/app/App.tsx b/src/1_app/ui/app/App.tsx index d5943bf..38b4cc8 100644 --- a/src/1_app/ui/app/App.tsx +++ b/src/1_app/ui/app/App.tsx @@ -10,6 +10,7 @@ import { DashBoard } from '@widgets/dashboard' import { Protected } from '@features/protected' import { AuthContextProvider } from '@shared/model' import { PrivacyPolicy } from '@widgets/privacyPolicy' +import { Support } from '@widgets/support' const queryClient = new QueryClient() @@ -26,12 +27,13 @@ export function App() { } /> } /> } /> + } /> + } /> } /> -} /> diff --git a/src/3_widgets/dashboard/ui/components/ConfirmationModal.tsx b/src/3_widgets/dashboard/ui/components/ConfirmationModal.tsx index cfc9579..7c4617d 100644 --- a/src/3_widgets/dashboard/ui/components/ConfirmationModal.tsx +++ b/src/3_widgets/dashboard/ui/components/ConfirmationModal.tsx @@ -1,7 +1,10 @@ import React, { useState, useEffect } from 'react'; import { Button, TextField, Dialog, DialogTitle, DialogContent, DialogActions, CircularProgress, Box } from '@mui/material'; +import { useAuth } from "@shared/model"; interface Props { + totalAmount: number + surchargeAmount: number status: string surchargeId: string; imageName: string | undefined; @@ -10,11 +13,13 @@ interface Props { onConfirm: (surchargeId: string, action: string, newSurchargeAmount: number | undefined, newTotalAmount: number | undefined) => Promise; } -const ConfirmationModal: React.FC = ({status, surchargeId, imageName, isOpen, onClose, onConfirm }) => { +const ConfirmationModal: React.FC = ({totalAmount, surchargeAmount, status, surchargeId, imageName, isOpen, onClose, onConfirm }) => { const [newSurchargeAmount, setNewSurchargeAmount] = useState(''); const [newTotalAmount, setNewTotalAmount] = useState(''); const [imageBase64, setImageBase64] = useState(null); const [loadingImage, setLoadingImage] = useState(false); + const [isTotalBiggerThatnSurcharge, setIsTotalBiggerThatnSurcharge] = useState(true); + const { user } = useAuth(); useEffect(() => { if (isOpen && imageName) { @@ -22,17 +27,20 @@ const ConfirmationModal: React.FC = ({status, surchargeId, imageName, isO setLoadingImage(true); try { const baseURL = import.meta.env.VITE_BASE_URL; - const response = await fetch(`${baseURL}/admin/image?image=${imageName}`, { // TODO: api -> admin + const token = user ? await user.getIdToken() : ""; + + const response = await fetch(`${baseURL}/admin/image?image=${imageName}`, { method: 'GET', headers: { Accept: 'application/json', 'Content-Type': 'application/json', + Authorization: `Bearer ${token}`, }, }); if (response.ok) { const data = await response.json(); - setImageBase64(data.image); // Assuming `data.image` contains the Base64 string + setImageBase64(data.image); } else { console.error('Error fetching image:', response.statusText); setImageBase64(null); @@ -49,64 +57,86 @@ const ConfirmationModal: React.FC = ({status, surchargeId, imageName, isO } else { setImageBase64(null); } - }, [isOpen, imageName]); + }, [user, isOpen, imageName]); + + const checkIfTotalBiggerThenSurcharge = ( + newTotalAmount: string, newSurchargeAmount: string ) => { + if(Number(newTotalAmount) < Number(newSurchargeAmount)){setIsTotalBiggerThatnSurcharge(false)} + else {setIsTotalBiggerThatnSurcharge(true)} + } const handleInputChange = ( e: React.ChangeEvent, - setFunction: (value: React.SetStateAction) => void + setFunction: (value: React.SetStateAction) => void, ) => { setFunction(e.target.value); + checkIfTotalBiggerThenSurcharge(newTotalAmount, newSurchargeAmount) }; function renderContent() { - if (status === "REPORTED") { - return ( - <> + if (isTotalBiggerThatnSurcharge){ + if (status === "REPORTED") { + return ( + <> + + + + ); + } else if (status === "CONFIRMED") { + return ( + ); + } else if (status === "REJECTED") { + return ( - - ); - } else if (status === "CONFIRMED") { - return ( - - ); - } else if (status === "REJECTED") { + ); + } + } else { return ( - - ); + Probably a mistake, "newSurchargeAmount" value is bigger that "newTotalAmount", please correct + ) } + } @@ -128,26 +158,34 @@ const ConfirmationModal: React.FC = ({status, surchargeId, imageName, isO )} handleInputChange(e, setNewSurchargeAmount)} + value={newTotalAmount} + onChange={(e) => handleInputChange(e, setNewTotalAmount)} fullWidth variant="outlined" margin="normal" + slotProps={{ + inputLabel: { shrink: true } + }} /> handleInputChange(e, setNewTotalAmount)} + value={newSurchargeAmount} + onChange={(e) => handleInputChange(e, setNewSurchargeAmount)} fullWidth variant="outlined" margin="normal" + slotProps={{ + inputLabel: { shrink: true } + }} /> - {renderContent()} diff --git a/src/3_widgets/dashboard/ui/components/SurchargesList.tsx b/src/3_widgets/dashboard/ui/components/SurchargesList.tsx index 55e780c..0d9c724 100644 --- a/src/3_widgets/dashboard/ui/components/SurchargesList.tsx +++ b/src/3_widgets/dashboard/ui/components/SurchargesList.tsx @@ -30,6 +30,9 @@ const SurhcargesList: React.FC = ({ searchedSurcharges, load setSelectedSurcharge(null); }; + // useEffect(() => { + // }, [user]); + const confirmSurcharge = async ( id: string, action: string, @@ -104,7 +107,6 @@ const SurhcargesList: React.FC = ({ searchedSurcharges, load

Error: {error || errorProp}

) : (
-

Surcharges:

{searchedSurcharges.length === 0 ? (

No surcharge records match the selected filter.

) : ( @@ -128,31 +130,37 @@ const SurhcargesList: React.FC = ({ searchedSurcharges, load ).toLocaleDateString()}

- Surcharge Amount: $ - {surcharge.surchargeAmount} + Total Amount: ${surcharge.totalAmount}

- Total Amount: ${surcharge.totalAmount} + Surcharge Amount: $ + {surcharge.surchargeAmount}

Status:{' '} - + ? 'red' + : 'yellow', + color: 'white', // Text color for contrast + padding: '4px 8px', // Padding for the badge + borderRadius: '8px', // Rounded corners + fontWeight: 'bold', + display: 'inline-block', // Keeps the box inline + }} + > {surcharge.surchargeStatus} - +

{selectedSurcharge && ( { const surchargeStatus = () => { switch (data.surchargeStatus) { - case "UNKNOWN": - return SurchargesStatusDTO.UNKNOWN case "REPORTED": return SurchargesStatusDTO.REPORTED case "CONFIRMED": return SurchargesStatusDTO.CONFIRMED + case "AUTO_GENERATED": + return SurchargesStatusDTO.AUTO_GENERATED + case "REJECTED": + return SurchargesStatusDTO.REJECTED default: return SurchargesStatusDTO.UNKNOWN } diff --git a/src/3_widgets/detail/model/usePlaceViewModel.ts b/src/3_widgets/detail/model/usePlaceViewModel.ts index d0c2d5e..73b2b63 100644 --- a/src/3_widgets/detail/model/usePlaceViewModel.ts +++ b/src/3_widgets/detail/model/usePlaceViewModel.ts @@ -18,12 +18,14 @@ export const usePlaceViewModel = (placeId: string) => { const surchargesStatus = (): SurchargesStatusModel => { switch (useGetPlaceQueryData?.status) { - case SurchargesStatusDTO.CONFIRMED: - return SurchargesStatusModel.Confirmed case SurchargesStatusDTO.REPORTED: return SurchargesStatusModel.Reported - case SurchargesStatusDTO.UNKNOWN: - return SurchargesStatusModel.Unknown + case SurchargesStatusDTO.CONFIRMED: + return SurchargesStatusModel.Confirmed + case SurchargesStatusDTO.AUTO_GENERATED: + return SurchargesStatusModel.AutoGenerated + case SurchargesStatusDTO.REJECTED: + return SurchargesStatusModel.Rejected default: return SurchargesStatusModel.Unknown } @@ -61,12 +63,12 @@ export const usePlaceViewModel = (placeId: string) => { const surchargesStatus = (): SurchargesStatusUI => { switch (placeModel.surcharges.status) { - case SurchargesStatusModel.Confirmed: - return SurchargesStatusUI.Confirmed case SurchargesStatusModel.Reported: return SurchargesStatusUI.Reported - case SurchargesStatusModel.Unknown: - return SurchargesStatusUI.Unknown + case SurchargesStatusModel.Confirmed: + return SurchargesStatusUI.Confirmed + case SurchargesStatusModel.AutoGenerated: + return SurchargesStatusUI.AutoGenerated default: return SurchargesStatusUI.Unknown } diff --git a/src/3_widgets/detail/ui/components/surchargeInformation/SurchargesDetail.tsx b/src/3_widgets/detail/ui/components/surchargeInformation/SurchargesDetail.tsx index 9ac96ca..e158688 100644 --- a/src/3_widgets/detail/ui/components/surchargeInformation/SurchargesDetail.tsx +++ b/src/3_widgets/detail/ui/components/surchargeInformation/SurchargesDetail.tsx @@ -1,5 +1,5 @@ import { SurchargesUI, SurchargesStatusUI } from "@entities/surcharges" -import { Confirmed, Reported, Unknown, StatusHelp } from '@shared/ui' +import { Confirmed, Reported, Unknown, StatusHelp, AutoGenerated } from '@shared/ui' import { ReportedDate } from "./dates/ReportedDate" import { SurchargeRate } from "./rates/SurchargeRate" import { ReportButton } from "./buttons/ReportButton" @@ -21,13 +21,20 @@ export function SurchargesDetail(props: SurchargesDetailProps) { return case SurchargesStatusUI.Reported: return + case SurchargesStatusUI.AutoGenerated: + return case SurchargesStatusUI.Unknown: return } } function Rate() { - if (!props.surchargesUI.rate) { + + if (props.surchargesUI.status === SurchargesStatusUI.Unknown) { + return null + } + + if (props.surchargesUI.rate === undefined) { return null } @@ -36,7 +43,7 @@ export function SurchargesDetail(props: SurchargesDetailProps) { function Report() { switch (props.surchargesUI.status) { - case SurchargesStatusUI.Confirmed: + case SurchargesStatusUI.Confirmed || SurchargesStatusUI.AutoGenerated: return case SurchargesStatusUI.Reported: return null diff --git a/src/3_widgets/privacyPolicy/ui/PrivacyPolicy.tsx b/src/3_widgets/privacyPolicy/ui/PrivacyPolicy.tsx index 56f4e42..d8cbd6d 100644 --- a/src/3_widgets/privacyPolicy/ui/PrivacyPolicy.tsx +++ b/src/3_widgets/privacyPolicy/ui/PrivacyPolicy.tsx @@ -2,14 +2,15 @@ import { Link } from "react-router-dom"; export function PrivacyPolicy() { return ( -
+

Surcharges Privacy Policy

-

The Surcharges service including, iOS App, does not collect any user data of any kind.

+

The Surcharges service including, iOS App, does not collect any user data except purchages receipt image or photo.

If you wish to verify this for yourself, see the source code through below links

https://github.com/Surcharges/Front-end + https://github.com/Surcharges/Back-end https://github.com/Surcharges/iOS
diff --git a/src/3_widgets/report/model/viewmodels/useReportViewModel.ts b/src/3_widgets/report/model/viewmodels/useReportViewModel.ts index f93f1dd..4618191 100644 --- a/src/3_widgets/report/model/viewmodels/useReportViewModel.ts +++ b/src/3_widgets/report/model/viewmodels/useReportViewModel.ts @@ -7,10 +7,6 @@ import { useUploadStore } from "../stores/useUploadStore" import { UploadSurchargeInformation } from "../usecases/UploadSurchargeInformation" import { PlaceModel } from "@entities/place" -import { PlaceUI } from "@entities/place" - -import { MakeAddress } from "@shared/model" -import { SurchargesStatusModel, SurchargesStatusUI } from "@entities/surcharges" export const useReportViewModel = (initialPlaceModel: PlaceModel) => { @@ -37,33 +33,8 @@ export const useReportViewModel = (initialPlaceModel: PlaceModel) => { const _setIsUploaded = useUploadStore((state) => state.setIsUploaded) const setIsError = useUploadStore((state) => state.setIsError) - const placeUI = useMemo((): PlaceUI => { - - const surchargeState = () => { - switch (_placeModel.surcharges.status) { - case SurchargesStatusModel.Unknown: - return SurchargesStatusUI.Unknown - case SurchargesStatusModel.Reported: - return SurchargesStatusUI.Reported - case SurchargesStatusModel.Confirmed: - return SurchargesStatusUI.Confirmed - } - } - - return { - id: _placeModel.id, - name: _placeModel.displayName.text, - address: MakeAddress(_placeModel.addressComponents), - location: { - latitude: _placeModel.location.latitude, - longitude: _placeModel.location.longitude - }, - surcharges: { - status: surchargeState(), - rate: _placeModel.surcharges.rate, - reportedDate: _placeModel.surcharges.reportedDate - } - } + const placeName = useMemo((): string => { + return _placeModel.displayName.text }, [_placeModel] ) @@ -136,7 +107,7 @@ export const useReportViewModel = (initialPlaceModel: PlaceModel) => { } return { - placeUI, + placeName, totalAmount, surchargeAmount, isUploadImageButtonLoading, diff --git a/src/3_widgets/report/ui/Report.tsx b/src/3_widgets/report/ui/Report.tsx index e402cf6..7b45fab 100644 --- a/src/3_widgets/report/ui/Report.tsx +++ b/src/3_widgets/report/ui/Report.tsx @@ -59,7 +59,7 @@ export function Report() { return (
- +
diff --git a/src/3_widgets/results/api/GetPlaces.ts b/src/3_widgets/results/api/GetPlaces.ts index d3441ed..dd82624 100644 --- a/src/3_widgets/results/api/GetPlaces.ts +++ b/src/3_widgets/results/api/GetPlaces.ts @@ -7,9 +7,9 @@ export async function GetPlaces(searchText: string, nextPageToken?: string): Pro const baseURL = import.meta.env.VITE_BASE_URL - const requestURL = nextPageToken && nextPageToken != '' - ? `${baseURL}/api/places?searchText=${searchText}&nextPageToken=${nextPageToken}` - : `${baseURL}/api/places?searchText=${searchText}` + const requestURL = nextPageToken && nextPageToken != '' + ? `${baseURL}/api/places?searchText=${searchText}&nextPageToken=${nextPageToken}` + : `${baseURL}/api/places?searchText=${searchText}` const response = await fetch(requestURL, { method: 'GET' @@ -21,17 +21,21 @@ export async function GetPlaces(searchText: string, nextPageToken?: string): Pro const data = await response.json() + console.log(data) + return { places: data.places.map((place: any): PlaceDTO => { const surchargeStatus = () => { switch (place.surchargeStatus) { - case "UNKNOWN": - return SurchargesStatusDTO.UNKNOWN case "REPORTED": return SurchargesStatusDTO.REPORTED case "CONFIRMED": return SurchargesStatusDTO.CONFIRMED + case "AUTO_GENERATED": + return SurchargesStatusDTO.AUTO_GENERATED + case "REJECTED": + return SurchargesStatusDTO.REJECTED default: return SurchargesStatusDTO.UNKNOWN } diff --git a/src/3_widgets/results/model/usePlaceListViewModel.ts b/src/3_widgets/results/model/usePlaceListViewModel.ts index 108a836..006610e 100644 --- a/src/3_widgets/results/model/usePlaceListViewModel.ts +++ b/src/3_widgets/results/model/usePlaceListViewModel.ts @@ -17,11 +17,13 @@ export const usePlaceListViewModel = (searchText: string, nextPageToken?: string const status = () => { switch (place.status) { - case SurchargesStatusDTO.CONFIRMED: - return SurchargesStatusUI.Confirmed case SurchargesStatusDTO.REPORTED: return SurchargesStatusUI.Reported - case SurchargesStatusDTO.UNKNOWN: + case SurchargesStatusDTO.CONFIRMED: + return SurchargesStatusUI.Confirmed + case SurchargesStatusDTO.AUTO_GENERATED: + return SurchargesStatusUI.AutoGenerated + default: return SurchargesStatusUI.Unknown } } @@ -41,9 +43,9 @@ export const usePlaceListViewModel = (searchText: string, nextPageToken?: string } } }) ?? [] - }, - [useGetPlacesQueryData] - ) + }, + [useGetPlacesQueryData] + ) return { places, isFetching } } \ No newline at end of file diff --git a/src/3_widgets/results/ui/Results.tsx b/src/3_widgets/results/ui/Results.tsx index 9526735..7aefc77 100644 --- a/src/3_widgets/results/ui/Results.tsx +++ b/src/3_widgets/results/ui/Results.tsx @@ -3,7 +3,7 @@ import { Link, useLocation, useNavigate } from 'react-router-dom' import { SearchBox } from '@features/searchBox' import { Footer, StatusHelp } from '@shared/ui' import { WrongAccess } from '@shared/ui' -import { Confirmed, Reported } from '@shared/ui' +import { Confirmed, Reported, AutoGenerated } from '@shared/ui' import { usePlaceListViewModel } from '../model/usePlaceListViewModel' import PlacesList from './placelist/PlaceList' @@ -43,6 +43,7 @@ export function Results() {
+
diff --git a/src/3_widgets/results/ui/placelist/PlaceItem.tsx b/src/3_widgets/results/ui/placelist/PlaceItem.tsx index 84d406f..d42e08e 100644 --- a/src/3_widgets/results/ui/placelist/PlaceItem.tsx +++ b/src/3_widgets/results/ui/placelist/PlaceItem.tsx @@ -32,14 +32,18 @@ function SurchargesBadge({ status, rate }: { status: SurchargesStatusUI, rate?: return null } + if (status === SurchargesStatusUI.Unknown) { + return null + } + const backgroundColor = () => { switch (status) { case SurchargesStatusUI.Confirmed: return 'bg-green-300' case SurchargesStatusUI.Reported: return 'bg-blue-300' - case SurchargesStatusUI.Unknown: - return 'bg-red-300' + case SurchargesStatusUI.AutoGenerated: + return 'bg-yellow-300' } } @@ -49,8 +53,8 @@ function SurchargesBadge({ status, rate }: { status: SurchargesStatusUI, rate?: return 'text-green-800' case SurchargesStatusUI.Reported: return 'text-blue-800' - case SurchargesStatusUI.Unknown: - return 'text-red-800' + case SurchargesStatusUI.AutoGenerated: + return 'text-yellow-800' } } diff --git a/src/3_widgets/support/index.ts b/src/3_widgets/support/index.ts new file mode 100644 index 0000000..68570f6 --- /dev/null +++ b/src/3_widgets/support/index.ts @@ -0,0 +1 @@ +export { Support } from "./ui/Support" \ No newline at end of file diff --git a/src/3_widgets/support/ui/Support.tsx b/src/3_widgets/support/ui/Support.tsx new file mode 100644 index 0000000..ee46b09 --- /dev/null +++ b/src/3_widgets/support/ui/Support.tsx @@ -0,0 +1,17 @@ +import { Footer } from "@shared/ui" +import { Link } from "react-router-dom" + +export function Support() { + return ( +
+

Surcharges

+

We are here for hearing from you.

+
+

Any kind of suggestion or inquery, click

+ Here +

to mail us!

+
+
+
+ ) +} \ No newline at end of file diff --git a/src/5_entities/surcharges/api/SurchargesStatusDTO.ts b/src/5_entities/surcharges/api/SurchargesStatusDTO.ts index 3593feb..7263a7e 100644 --- a/src/5_entities/surcharges/api/SurchargesStatusDTO.ts +++ b/src/5_entities/surcharges/api/SurchargesStatusDTO.ts @@ -1,5 +1,7 @@ export enum SurchargesStatusDTO { CONFIRMED = 'CONFIRMED', REPORTED = 'REPORTED', - UNKNOWN = 'UNKNOWN' + UNKNOWN = 'UNKNOWN', + AUTO_GENERATED = 'AUTO_GENERATED', + REJECTED = 'REJECTED' } \ No newline at end of file diff --git a/src/5_entities/surcharges/model/SurchargesStatusModel.ts b/src/5_entities/surcharges/model/SurchargesStatusModel.ts index 193a661..d5792c4 100644 --- a/src/5_entities/surcharges/model/SurchargesStatusModel.ts +++ b/src/5_entities/surcharges/model/SurchargesStatusModel.ts @@ -1,5 +1,7 @@ export enum SurchargesStatusModel { Confirmed, Reported, + AutoGenerated, + Rejected, Unknown, } \ No newline at end of file diff --git a/src/5_entities/surcharges/ui/SurchargesStatusUI.ts b/src/5_entities/surcharges/ui/SurchargesStatusUI.ts index 38c6806..1c79841 100644 --- a/src/5_entities/surcharges/ui/SurchargesStatusUI.ts +++ b/src/5_entities/surcharges/ui/SurchargesStatusUI.ts @@ -1,5 +1,6 @@ export enum SurchargesStatusUI { Confirmed, Reported, + AutoGenerated, Unknown, } \ No newline at end of file diff --git a/src/6_shared/ui/footer/bonsung/Bonsung.tsx b/src/6_shared/ui/footer/bonsung/Bonsung.tsx index 0fb9f84..7d0f495 100644 --- a/src/6_shared/ui/footer/bonsung/Bonsung.tsx +++ b/src/6_shared/ui/footer/bonsung/Bonsung.tsx @@ -4,11 +4,11 @@ export function Bonsung() { return (
- Bonsung Koo - + to='https://bonsung.me' + className='mr-2 underline' + > + Bonsung Koo + - - On The Code -
) } \ No newline at end of file diff --git a/src/6_shared/ui/footer/petr/Petr.tsx b/src/6_shared/ui/footer/petr/Petr.tsx index fdeec2e..772755c 100644 --- a/src/6_shared/ui/footer/petr/Petr.tsx +++ b/src/6_shared/ui/footer/petr/Petr.tsx @@ -1,7 +1,28 @@ +import { Link } from "react-router-dom"; + export function Petr() { return (
-

Petr Utkin

+ + Petr Utkin + + + LinkedIn + + + GitHub +
) } \ No newline at end of file diff --git a/src/6_shared/ui/index.ts b/src/6_shared/ui/index.ts index fa4470d..deb29a2 100644 --- a/src/6_shared/ui/index.ts +++ b/src/6_shared/ui/index.ts @@ -4,5 +4,6 @@ export { WrongAccess } from "./wrongAccess/WrongAccess" export { ErrorAlert } from "./errorAlert/ErrorAlert" export { Confirmed } from "./surchargeStatus/Confirmed" export { Reported } from "./surchargeStatus/Reported" +export { AutoGenerated } from "./surchargeStatus/AutoGenerated" export { Unknown } from "./surchargeStatus/Unknown" export { StatusHelp } from "./surchargeStatus/help/StatusHelp" \ No newline at end of file diff --git a/src/6_shared/ui/surchargeStatus/AutoGenerated.tsx b/src/6_shared/ui/surchargeStatus/AutoGenerated.tsx new file mode 100644 index 0000000..2bc8930 --- /dev/null +++ b/src/6_shared/ui/surchargeStatus/AutoGenerated.tsx @@ -0,0 +1,9 @@ +export function AutoGenerated() { + return ( +
+
+

Auto-Generated

+
+
+ ) +} \ No newline at end of file diff --git a/src/6_shared/ui/surchargeStatus/help/StatusHelp.tsx b/src/6_shared/ui/surchargeStatus/help/StatusHelp.tsx index 548753d..d8a683e 100644 --- a/src/6_shared/ui/surchargeStatus/help/StatusHelp.tsx +++ b/src/6_shared/ui/surchargeStatus/help/StatusHelp.tsx @@ -3,6 +3,7 @@ import { useMediaQuery } from "@mui/material" import { Tooltip } from "@mui/material" import { Confirmed } from "../Confirmed" import { Reported } from "../Reported" +import { AutoGenerated } from "../AutoGenerated" import { Unknown } from "../Unknown" import HelpIcon from '@mui/icons-material/Help' @@ -41,6 +42,10 @@ export function StatusHelp(props: StatusHelpProps) {

The surcharge rate is reported by someone but not confirmed, It may not be accurate.

+
+ +

The surcharge rate is assumed, It may not be accurate.

+
{ props.includingUnknown && (