Skip to content

Commit dbf8994

Browse files
committed
Improve invite error handling
1 parent 4ec806d commit dbf8994

File tree

3 files changed

+38
-6
lines changed

3 files changed

+38
-6
lines changed

browser/data-browser/src/App.tsx

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,11 @@ import { getAgentFromLocalStorage } from './helpers/agentStorage';
66
import { registerCustomCreateActions } from './components/forms/NewForm/CustomCreateActions';
77
import { serverURLStorage } from './helpers/serverURLStorage';
88

9-
import type { JSX } from 'react';
9+
import { useEffect, type JSX } from 'react';
1010
import { RouterProvider } from '@tanstack/react-router';
1111
import { router } from './routes/Router';
12+
import { errorHandler } from './handlers/errorHandler';
13+
import { error } from 'node:console';
1214

1315
function fixDevUrl(url: string) {
1416
if (isDev()) {
@@ -54,6 +56,17 @@ if (isDev()) {
5456

5557
/** Entrypoint of the application. This is where providers go. */
5658
function App(): JSX.Element {
59+
// Handle uncaught errors
60+
useEffect(() => {
61+
window.onerror = (message, source, lineno, colno, error) => {
62+
errorHandler(error);
63+
};
64+
65+
window.onunhandledrejection = event => {
66+
errorHandler(event.reason);
67+
};
68+
}, []);
69+
5770
return (
5871
<StoreContext.Provider value={store}>
5972
<RouterProvider router={router}></RouterProvider>

browser/data-browser/src/views/InvitePage.tsx

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import type { JSX } from 'react';
2424
import { useNavigateWithTransition } from '../hooks/useNavigateWithTransition';
2525
import { useNavState } from '../components/NavState';
2626
import { toast } from 'react-hot-toast';
27+
import { errorHandler } from '../handlers/errorHandler';
2728

2829
/** A View that opens an invite */
2930
function InvitePage({ resource }: ResourcePageProps): JSX.Element {
@@ -40,11 +41,15 @@ function InvitePage({ resource }: ResourcePageProps): JSX.Element {
4041
// When this happens, a new keypair is made, but the subject of the Agent is not yet known.
4142
// It will be created by the server, and will be accessible in the Redirect response.
4243
async function handleNew() {
43-
const keypair = await generateKeyPair();
44-
const newAgent = new Agent(keypair.privateKey);
44+
try {
45+
const keypair = await generateKeyPair();
46+
const newAgent = new Agent(keypair.privateKey);
4547

46-
setAgent(newAgent);
47-
handleAccept(keypair);
48+
setAgent(newAgent);
49+
handleAccept(keypair);
50+
} catch (error) {
51+
store.notifyError(error);
52+
}
4853
}
4954

5055
const handleAccept = async (keys?: {
@@ -61,7 +66,17 @@ function InvitePage({ resource }: ResourcePageProps): JSX.Element {
6166

6267
const redirect = await store.getResource<Server.Redirect>(inviteURL.href);
6368

64-
if (redirect.props.redirectAgent && keys) {
69+
if (keys) {
70+
if (redirect.error) {
71+
store.notifyError(redirect.error);
72+
73+
return;
74+
}
75+
76+
if (!redirect.props.redirectAgent) {
77+
throw new Error('Redirect agent not found');
78+
}
79+
6580
const newAgent = new Agent(keys.privateKey, redirect.props.redirectAgent);
6681
setAgent(newAgent);
6782

lib/src/plugins/invite.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,10 @@ pub fn construct_invite_redirect(
6868
})?
6969
.to_string();
7070

71+
store
72+
.get_resource(target)
73+
.map_err(|e| format!("Target for invite does not exist: {}", target))?;
74+
7175
// If any usages left value is present, make sure it's a positive number and decrement it by 1.
7276
if let Ok(usages_left) = invite_resource.get(urls::USAGES_LEFT) {
7377
let num = usages_left.to_int()?;

0 commit comments

Comments
 (0)