Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Task/ime-329 generic error #63

Open
wants to merge 50 commits into
base: task/ime-329-generic-error
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
50 commits
Select commit Hold shift + click to select a range
620bbd4
feat: Enhance GraphQL queries with additional fields for transfer det…
mwan9ilwa Oct 28, 2024
aefe82b
Added optional chaining to safely access the uid=1000(harlem) gid=100…
mwan9ilwa Oct 29, 2024
3d7f600
Added optional chaining to safely access the uid=1000(harlem) gid=100…
mwan9ilwa Oct 31, 2024
20233bb
merged the code in preparation for enhancements
mwan9ilwa Nov 4, 2024
6daff13
Make fx fields and buttons hidden
Nov 5, 2024
078dbc0
task/ime-242-verify_ui
mwan9ilwa Nov 5, 2024
bccafd2
updated technical details fields
Nov 6, 2024
6f44f4f
task/ime-242-verify_ui
mwan9ilwa Nov 6, 2024
7523d15
Merge pull request #1 from mwan9ilwa/task/ime-242-verify_ui
mwan9ilwa Nov 6, 2024
09abd3d
updated technical details mapping
Nov 6, 2024
4a33a49
updated mapping
NgaseBupe Nov 6, 2024
dfcd3ed
updated mapping
NgaseBupe Nov 6, 2024
4757828
Fix formatting issue
Nov 6, 2024
c969eac
task/ime-242-verify_ui
mwan9ilwa Nov 6, 2024
429f107
Merge branch 'task/ime-261-redo-mapping-graphql' of https://github.co…
mwan9ilwa Nov 6, 2024
261f5be
task/ime-242-verify_ui
mwan9ilwa Nov 7, 2024
312b714
updated the models and removed Transaction model
mwan9ilwa Nov 7, 2024
058b954
feat: Update GraphQL queries to align with mock data structure
mwan9ilwa Nov 7, 2024
22f12c5
feat: Update GraphQL queries to align with mock data structure
mwan9ilwa Nov 7, 2024
87be3d7
changes
NgaseBupe Nov 8, 2024
3421d1a
updated graphs and modal css
NgaseBupe Nov 8, 2024
cb5ea56
feat: Update GraphQL queries to align with mock data structure
mwan9ilwa Nov 11, 2024
2845ff9
merged branch
Nov 11, 2024
2472943
updated types
Nov 11, 2024
760b47f
updated mapping to types
Nov 13, 2024
d44d949
updated mocks
Nov 13, 2024
f8ffe95
updated dashboard ui
NgaseBupe Nov 19, 2024
d61c740
update: transfer summary dashboard ui and mapping
Akku-Rawat Nov 20, 2024
8f3de79
UI mapping modal
NgaseBupe Nov 20, 2024
a4d5daf
Merge branch 'task/ime-302-transfer-summary' of https://github.com/mw…
NgaseBupe Nov 20, 2024
aca77a9
mapping done for modals
NgaseBupe Nov 20, 2024
e5791a7
fixed lint errors
NgaseBupe Nov 21, 2024
2179dfa
updated ui
NgaseBupe Nov 21, 2024
f5b6c89
update: transfer summary dashboard UI
Akku-Rawat Nov 21, 2024
1f99bff
completed mapping
NgaseBupe Nov 21, 2024
a24c665
updated payer information modal
NgaseBupe Nov 21, 2024
3635494
Merge branch 'task/ime-261-redo-mapping-graphql-final-UI' into task/i…
Akku-Rawat Nov 22, 2024
6e96c35
Merge pull request #4 from mwan9ilwa/task/ime-302-transfer-summary
Akku-Rawat Nov 22, 2024
df34b8e
fix: white screen bug due to mock.ts
Akku-Rawat Nov 22, 2024
1ea8d8d
update: transfer query to also add events fields
Akku-Rawat Nov 22, 2024
05b9b63
fix: payer and payeeDFSP undefined bug in tranfer tables
Akku-Rawat Nov 22, 2024
269df50
updated final ui
NgaseBupe Nov 25, 2024
f6b245b
latest
NgaseBupe Nov 29, 2024
4b98461
updated work
NgaseBupe Nov 29, 2024
a46763a
updated error message
NgaseBupe Dec 4, 2024
c2827cd
updated error messages
NgaseBupe Dec 4, 2024
94a1374
create: error modal for transfers forbidden message
Akku-Rawat Dec 5, 2024
3343498
Merge branch 'task/ime-329-generic-error' into task/ime-329-generic-e…
Akku-Rawat Feb 6, 2025
2995acf
fix: lint errors
Akku-Rawat Feb 6, 2025
2ae6396
fix: build errors
Akku-Rawat Feb 10, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
# Changelog: [mojaloop/reporting-hub-bop-trx-ui](https://github.com/mojaloop/reporting-hub-bop-trx-ui)
### Features

### [1.7.4](https://github.com/mojaloop/reporting-hub-bop-trx-ui/compare/v1.7.3...v1.7.4) (2024-12-24)

### [1.7.3](https://github.com/mojaloop/reporting-hub-bop-trx-ui/compare/v1.7.2...v1.7.3) (2024-10-25)
Expand Down
41 changes: 41 additions & 0 deletions src/App/Transfers/Dashboard/ErrorBoundary.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import { Component, ReactNode } from 'react';

interface ErrorBoundaryProps {
children: ReactNode;
onError: () => void;
}

interface ErrorBoundaryState {
hasError: boolean;
isForbidden: boolean;
}

class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {
constructor(props: ErrorBoundaryProps) {
super(props);
this.state = { hasError: false, isForbidden: false };
}

static getDerivedStateFromError(): ErrorBoundaryState {
return { hasError: true, isForbidden: false };
}

componentDidCatch(error: any): void {
// Check for 403 error
const status = error?.response?.status || error?.networkError?.statusCode;
if (status === 403) {
this.setState({ isForbidden: true });
this.props.onError();
}
}

render() {
if (this.state.hasError && this.state.isForbidden) {
return null; // Do not render anything if a 403 error occurs
}

return this.props.children;
}
}

export default ErrorBoundary;
38 changes: 38 additions & 0 deletions src/App/Transfers/Dashboard/ErrorMessage.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import React, { FC } from 'react';
import { MessageBox } from 'components';

interface ErrorMessageProps {
message: string;
}

const ErrorMessage: FC<ErrorMessageProps> = () => {
return (
<div
style={{
display: 'flex',
justifyContent: 'center',
alignItems: 'center',
marginTop: '-8px',
marginBottom: '-8px',
marginLeft: '-16px',
marginRight: '-16px',
}}
>
<MessageBox
kind="default"
style={{
width: '100%',
textAlign: 'center',
marginTop: '-8px',
marginBottom: '-8px',
marginLeft: '-16px',
marginRight: '-16px',
}}
>
<p style={{ fontSize: '14px', fontWeight: 'bold' }}>Restricted Access</p>
</MessageBox>
</div>
);
};

export default ErrorMessage;
12 changes: 10 additions & 2 deletions src/App/Transfers/Dashboard/ErrorSummary.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,10 @@ const dispatchProps = (dispatch: Dispatch) => ({
interface ConnectorProps {
filtersModel: TransfersFilter;
onFilterChange: (field: string, value: FilterChangeValue | string) => void;
onError: (component: string, error: any) => void;
}

const ErrorSummary: FC<ConnectorProps> = ({ filtersModel }) => {
const ErrorSummary: FC<ConnectorProps> = ({ filtersModel, onError }) => {
const { loading, error, data } = useQuery(GET_TRANSFER_SUMMARY, {
fetchPolicy: 'no-cache',
variables: {
Expand All @@ -39,7 +40,14 @@ const ErrorSummary: FC<ConnectorProps> = ({ filtersModel }) => {
let content = null;

if (error) {
content = <MessageBox kind="danger">Error fetching transfers: {error.message}</MessageBox>;
const status = (error.networkError as { statusCode?: number })?.statusCode;
onError('ErrorSummaryChart', error);
const isForbidden = status === 403;
content = (
<MessageBox kind={isForbidden ? 'default' : 'danger'}>
{isForbidden ? 'Restricted Access' : `Error fetching transfers: ${error.message}`}
</MessageBox>
);
} else if (loading) {
content = <Spinner center />;
} else {
Expand Down
18 changes: 15 additions & 3 deletions src/App/Transfers/Dashboard/ErrorsByErrorCodeChart.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,10 @@ const dispatchProps = () => ({});

interface ConnectorProps {
filtersModel: TransfersFilter;
onError: (component: string, error: any) => void;
}

const ByCurrencyChart: FC<ConnectorProps> = ({ filtersModel }) => {
const ErrorsByErrorCodeChart: FC<ConnectorProps> = ({ filtersModel, onError }) => {
const { loading, error, data } = useQuery(GET_TRANSFER_SUMMARY, {
fetchPolicy: 'no-cache',
variables: {
Expand All @@ -42,7 +43,16 @@ const ByCurrencyChart: FC<ConnectorProps> = ({ filtersModel }) => {
let content = null;

if (error) {
content = <MessageBox kind="danger">Error fetching transfers: {error.message}</MessageBox>;
// Check if the error is a 403
const status = (error.networkError as { statusCode?: number })?.statusCode;

const isForbidden = status === 403;
onError('ErrorsByErrorCodeChart', error);
content = (
<MessageBox kind={isForbidden ? 'default' : 'danger'}>
{isForbidden ? 'Restricted Access' : `Error fetching transfers: ${error.message}`}
</MessageBox>
);
} else if (loading) {
content = <Spinner center />;
} else {
Expand Down Expand Up @@ -104,4 +114,6 @@ const ByCurrencyChart: FC<ConnectorProps> = ({ filtersModel }) => {
return content;
};

export default connect(stateProps, dispatchProps, null, { context: ReduxContext })(ByCurrencyChart);
export default connect(stateProps, dispatchProps, null, { context: ReduxContext })(
ErrorsByErrorCodeChart,
);
18 changes: 15 additions & 3 deletions src/App/Transfers/Dashboard/ErrorsByPayeeChart.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,10 @@ const dispatchProps = (dispatch: Dispatch) => ({
interface ConnectorProps {
filtersModel: TransfersFilter;
onFilterChange: (field: string, value: FilterChangeValue | string) => void;
onError: (component: string, error: any) => void;
}

const ByPayeeChart: FC<ConnectorProps> = ({ filtersModel, onFilterChange }) => {
const ErrorsByPayeeChart: FC<ConnectorProps> = ({ filtersModel, onFilterChange, onError }) => {
const { loading, error, data } = useQuery(GET_TRANSFER_SUMMARY_BY_PAYEE, {
fetchPolicy: 'no-cache',
variables: {
Expand All @@ -47,7 +48,15 @@ const ByPayeeChart: FC<ConnectorProps> = ({ filtersModel, onFilterChange }) => {

let content = null;
if (error) {
content = <MessageBox kind="danger">Error fetching transfers: {error.message}</MessageBox>;
const status = (error.networkError as { statusCode?: number })?.statusCode;
const isForbidden = status === 403;
onError('ErrorsByPayeeChart', error);

content = (
<MessageBox kind={isForbidden ? 'default' : 'danger'}>
{isForbidden ? 'Restricted Access' : `Error fetching transfers: ${error.message}`}
</MessageBox>
);
} else if (loading) {
content = <Spinner center />;
} else {
Expand Down Expand Up @@ -114,7 +123,10 @@ const ByPayeeChart: FC<ConnectorProps> = ({ filtersModel, onFilterChange }) => {
</PieChart>
);
}

return content;
};

export default connect(stateProps, dispatchProps, null, { context: ReduxContext })(ByPayeeChart);
export default connect(stateProps, dispatchProps, null, { context: ReduxContext })(
ErrorsByPayeeChart,
);
19 changes: 16 additions & 3 deletions src/App/Transfers/Dashboard/ErrorsByPayerChart.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,10 @@ const dispatchProps = (dispatch: Dispatch) => ({
interface ConnectorProps {
filtersModel: TransfersFilter;
onFilterChange: (field: string, value: FilterChangeValue | string) => void;
onError: (component: string, error: any) => void;
}

const ByPayerChart: FC<ConnectorProps> = ({ filtersModel, onFilterChange }) => {
const ErrorsByPayerChart: FC<ConnectorProps> = ({ filtersModel, onFilterChange, onError }) => {
const { loading, error, data } = useQuery(GET_TRANSFER_SUMMARY_BY_PAYER, {
fetchPolicy: 'no-cache',
variables: {
Expand All @@ -46,8 +47,17 @@ const ByPayerChart: FC<ConnectorProps> = ({ filtersModel, onFilterChange }) => {
};

let content = null;
// Check if the Error is a 403
if (error) {
content = <MessageBox kind="danger">Error fetching transfers: {error.message}</MessageBox>;
const status = (error.networkError as { statusCode?: number })?.statusCode;
const isForbidden = status === 403;
onError('ErrorsByPayerChart', error);

content = (
<MessageBox kind={isForbidden ? 'default' : 'danger'}>
{isForbidden ? 'Restricted Access' : `Error fetching transfers: ${error.message}`}
</MessageBox>
);
} else if (loading) {
content = <Spinner center />;
} else {
Expand Down Expand Up @@ -114,7 +124,10 @@ const ByPayerChart: FC<ConnectorProps> = ({ filtersModel, onFilterChange }) => {
</PieChart>
);
}

return content;
};

export default connect(stateProps, dispatchProps, null, { context: ReduxContext })(ByPayerChart);
export default connect(stateProps, dispatchProps, null, { context: ReduxContext })(
ErrorsByPayerChart,
);
18 changes: 15 additions & 3 deletions src/App/Transfers/Dashboard/ErrorsBySourceCurrencyChart.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,13 @@ const stateProps = (state: State) => ({
filtersModel: selectors.getTransfersFilter(state),
});
const dispatchProps = () => ({});

interface ConnectorProps {
filtersModel: TransfersFilter;
onError: (component: string, error: any) => void;
}
const BySourceCurrencyChart: FC<ConnectorProps> = ({ filtersModel }) => {

const ErrorsBySourceCurrencyChart: FC<ConnectorProps> = ({ filtersModel, onError }) => {
const { loading, error, data } = useQuery(GET_TRANSFER_SUMMARY, {
fetchPolicy: 'no-cache',
variables: {
Expand All @@ -32,9 +35,18 @@ const BySourceCurrencyChart: FC<ConnectorProps> = ({ filtersModel }) => {
const onPieLeave = () => {
setActiveIndex(undefined);
};

let content = null;
if (error) {
content = <MessageBox kind="danger">Error fetching transfers: {error.message}</MessageBox>;
const status = (error.networkError as { statusCode?: number })?.statusCode;

const isForbidden = status === 403;
onError('ErrorsBySourceCurrencyChart', error);
content = (
<MessageBox kind={isForbidden ? 'default' : 'danger'}>
{isForbidden ? 'Restricted Access' : `Error fetching transfers: ${error.message}`}
</MessageBox>
);
} else if (loading) {
content = <Spinner center />;
} else {
Expand Down Expand Up @@ -91,5 +103,5 @@ const BySourceCurrencyChart: FC<ConnectorProps> = ({ filtersModel }) => {
return content;
};
export default connect(stateProps, dispatchProps, null, { context: ReduxContext })(
BySourceCurrencyChart,
ErrorsBySourceCurrencyChart,
);
23 changes: 19 additions & 4 deletions src/App/Transfers/Dashboard/ErrorsByTargetCurrencyChart.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,29 +13,44 @@ import { RED_CHART_GRADIENT_COLORS, renderActiveShape, renderRedLegend } from '.
const stateProps = (state: State) => ({
filtersModel: selectors.getTransfersFilter(state),
});

const dispatchProps = () => ({});

interface ConnectorProps {
filtersModel: TransfersFilter;
onError: (component: string, error: any) => void;
}
const BySourceCurrencyChart: FC<ConnectorProps> = ({ filtersModel }) => {

const ErrorsByTargetCurrencyChart: FC<ConnectorProps> = ({ filtersModel, onError }) => {
const { loading, error, data } = useQuery(GET_TRANSFER_SUMMARY, {
fetchPolicy: 'no-cache',
variables: {
startDate: filtersModel.from,
endDate: filtersModel.to,
},
});

const [activeIndex, setActiveIndex] = useState<number>();
const onPieEnter = (_: any, index: number) => {
setActiveIndex(index);
};

const onPieLeave = () => {
setActiveIndex(undefined);
};
let content = null;
if (error) {
content = <MessageBox kind="danger">Error fetching transfers: {error.message}</MessageBox>;
} else if (loading) {
const status = (error.networkError as { statusCode?: number })?.statusCode;
const isForbidden = status === 403;
onError('ErrorsByTargetCurrencyChart', error);

return (
<MessageBox kind={isForbidden ? 'default' : 'danger'}>
{isForbidden ? 'Restricted Access' : `Error fetching transfers: ${error.message}`}
</MessageBox>
);
}
if (loading) {
content = <Spinner center />;
} else {
const summary = data.transferSummary
Expand Down Expand Up @@ -92,5 +107,5 @@ const BySourceCurrencyChart: FC<ConnectorProps> = ({ filtersModel }) => {
};

export default connect(stateProps, dispatchProps, null, { context: ReduxContext })(
BySourceCurrencyChart,
ErrorsByTargetCurrencyChart,
);
22 changes: 12 additions & 10 deletions src/App/Transfers/Dashboard/TransferTotalSummary.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,7 @@ import { MessageBox, Spinner } from 'components';
import { useQuery } from '@apollo/client';
import { TransferSummary } from 'apollo/types';
import { Statistic, Typography } from 'antd';
import { useRouteMatch, useHistory } from 'react-router-dom';
import { ErrorMessage, FilterChangeValue, TransfersFilter } from '../types';
import { FilterChangeValue, TransfersFilter } from '../types';
import { actions } from '../slice';
import * as selectors from '../selectors';

Expand All @@ -25,9 +24,10 @@ const dispatchProps = (dispatch: Dispatch) => ({
interface ConnectorProps {
filtersModel: TransfersFilter;
onFilterChange: (field: string, value: FilterChangeValue | string) => void;
onError: (component: string, error: any) => void;
}

const TransferTotalSummary: FC<ConnectorProps> = ({ filtersModel }) => {
const TransferTotalSummary: FC<ConnectorProps> = ({ filtersModel, onError }) => {
const { loading, error, data } = useQuery(GET_TRANSFER_SUMMARY, {
fetchPolicy: 'no-cache',
variables: {
Expand All @@ -37,13 +37,15 @@ const TransferTotalSummary: FC<ConnectorProps> = ({ filtersModel }) => {
});
let content = null;
if (error) {
if (error.message === ErrorMessage.NOT_ALLOWED) {
const match = useRouteMatch();
const history = useHistory();
const path = match.url === '/' ? '' : match.url;
history.push(`${path}/403`);
}
content = <MessageBox kind="danger">Error fetching transfers: {error.message}</MessageBox>;
const status = (error.networkError as { statusCode?: number })?.statusCode;

const isForbidden = status === 403;
onError('TransferTotalSummary', error);
content = (
<MessageBox kind={isForbidden ? 'default' : 'danger'}>
{isForbidden ? 'Restricted Access' : `Error fetching transfers: ${error.message}`}
</MessageBox>
);
} else if (loading) {
content = <Spinner center />;
} else {
Expand Down
Loading