Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
8 changes: 7 additions & 1 deletion src/components/Points/PointImage.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,20 @@ function PointImage({ data, sx }) {
const images = [];

function isImgUrl(string) {
// Handle data URIs
if (/^data:image\//.test(string)) {
return true;
}

let url;
try {
url = new URL(string);
} catch (_) {
return false;
}
if (url) {
return /\.(jpg|jpeg|png|webp|gif|svg)$/.test(url.pathname);
const pathname = url.pathname.split('?')[0].split('#')[0];
return /\.(jpg|jpeg|png|webp|gif|svg|bmp|ico|tiff|tif|avif|heic|heif)$/i.test(pathname);
}
return false;
}
Expand Down
2 changes: 1 addition & 1 deletion src/components/ToastNotifications/ErrorNotifier.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ export const ErrorNotifier = ({ message = 'Something went wrong', callback }) =>
useEffect(() => {
enqueueSnackbar(message, errorSnackbarOptions);
typeof callback === 'function' && callback();
}, [enqueueSnackbar, errorSnackbarOptions, message]);
}, [enqueueSnackbar, errorSnackbarOptions, message, callback]);

return null;
};
Expand Down
25 changes: 25 additions & 0 deletions src/components/ToastNotifications/ErrorNotifier.test.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import { render, waitFor } from '@testing-library/react';
import { describe, expect, it, vi } from 'vitest';
import { ErrorNotifier } from './ErrorNotifier';

const enqueueSnackbar = vi.fn();
const closeSnackbar = vi.fn();

vi.mock('notistack', () => ({
useSnackbar: () => ({
enqueueSnackbar,
closeSnackbar,
}),
}));

describe('ErrorNotifier', () => {
it('passes the full message to the snackbar', async () => {
const message = 'x'.repeat(300);

render(<ErrorNotifier message={message} />);

await waitFor(() => {
expect(enqueueSnackbar).toHaveBeenCalledWith(message, expect.any(Object));
});
});
});
7 changes: 6 additions & 1 deletion src/lib/get-error-message.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,5 +27,10 @@ export const getErrorMessage = (e, options = {}) => {
// error is not instance of ApiError
message = e?.message || fallbackMessage;
}
return message;

if (!message || !message.trim()) {
message = fallbackMessage;
}

return message.trim();
};
36 changes: 36 additions & 0 deletions src/lib/get-error-message.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import { describe, expect, it } from 'vitest';
import { getErrorMessage } from './get-error-message';

describe('getErrorMessage', () => {
it('returns the fallback when the extracted API error message is empty', () => {
const error = {
message: 'Request error:',
getActualType: () => ({
status: 400,
data: {
status: {
error: ' ',
},
},
}),
};

expect(getErrorMessage(error, { fallbackMessage: 'Something went wrong.' })).toBe('Something went wrong.');
});

it('trims a non-empty API error message', () => {
const error = {
message: 'Request error:',
getActualType: () => ({
status: 400,
data: {
status: {
error: ' Detailed backend message ',
},
},
}),
};

expect(getErrorMessage(error)).toBe('Detailed backend message');
});
});