Skip to content

Commit 5711e37

Browse files
committed
Refactor register
1 parent 9955f94 commit 5711e37

File tree

4 files changed

+66
-65
lines changed

4 files changed

+66
-65
lines changed

data-browser/src/components/RegisterSignIn.tsx

+18-5
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,13 @@ import {
88
import React, { FormEvent, useCallback, useEffect, useState } from 'react';
99
import { useSettings } from '../helpers/AppSettings';
1010
import { Button } from './Button';
11-
import { Agent, nameRegex, useRegister, useServerURL } from '@tomic/react';
11+
import {
12+
Agent,
13+
nameRegex,
14+
register,
15+
useServerURL,
16+
useStore,
17+
} from '@tomic/react';
1218
import Field from './forms/Field';
1319
import { InputWrapper, InputStyled } from './forms/InputStyles';
1420
import { Row } from './Row';
@@ -30,7 +36,7 @@ export function RegisterSignIn({
3036
}: React.PropsWithChildren<RegisterSignInProps>): JSX.Element {
3137
const { dialogProps, show } = useDialog();
3238
const { agent } = useSettings();
33-
const [register, setRegister] = useState(true);
39+
const [isRegister, setRegister] = useState(true);
3440

3541
if (agent) {
3642
return <>{children}</>;
@@ -56,7 +62,9 @@ export function RegisterSignIn({
5662
Sign In
5763
</Button>
5864
</Row>
59-
<Dialog {...dialogProps}>{register ? <Register /> : <SignIn />}</Dialog>
65+
<Dialog {...dialogProps}>
66+
{isRegister ? <Register /> : <SignIn />}
67+
</Dialog>
6068
</>
6169
);
6270
}
@@ -69,8 +77,9 @@ function Register() {
6977
const [newAgent, setNewAgent] = useState<Agent | undefined>(undefined);
7078
const [serverUrlStr] = useServerURL();
7179
const [nameErr, setErr] = useState<Error | undefined>(undefined);
72-
const register = useRegister();
80+
const doRegister = useCallback(register, []);
7381
const { setAgent } = useSettings();
82+
const store = useStore();
7483

7584
const serverUrl = new URL(serverUrlStr);
7685
serverUrl.host = `${name}.${serverUrl.host}`;
@@ -95,7 +104,11 @@ function Register() {
95104
}
96105

97106
try {
98-
const { driveURL: newDriveURL, agent } = await register(name, email);
107+
const { driveURL: newDriveURL, agent } = await doRegister(
108+
store,
109+
name,
110+
email,
111+
);
99112
setDriveURL(newDriveURL);
100113
setSecret(agent.buildSecret());
101114
setNewAgent(agent);

lib/src/authentication.ts

+48
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
import {
22
Agent,
3+
generateKeyPair,
34
getTimestampNow,
45
HeadersObject,
6+
properties,
57
signToBase64,
68
Store,
79
} from './index.js';
@@ -111,3 +113,49 @@ export const checkAuthenticationCookie = (): boolean => {
111113

112114
return matches.length > 0;
113115
};
116+
117+
export interface RegisterResult {
118+
agent: Agent;
119+
driveURL: string;
120+
}
121+
122+
/** Only lowercase chars, numbers and a hyphen */
123+
export const nameRegex = '^[a-z0-9_-]+';
124+
125+
/** Creates a new Agent + Drive using a shortname and email. Uses the serverURL from the Store. */
126+
export const register = async (
127+
store: Store,
128+
name: string,
129+
email: string,
130+
): Promise<RegisterResult> => {
131+
const keypair = await generateKeyPair();
132+
const agent = new Agent(keypair.privateKey);
133+
const publicKey = await agent.getPublicKey();
134+
const url = new URL('/register', store.getServerUrl());
135+
url.searchParams.set('name', name);
136+
url.searchParams.set('public-key', publicKey);
137+
url.searchParams.set('email', email);
138+
const resource = await store.getResourceAsync(url.toString());
139+
const driveURL = resource.get(properties.redirect.destination) as string;
140+
const agentSubject = resource.get(
141+
properties.redirect.redirectAgent,
142+
) as string;
143+
144+
if (resource.error) {
145+
throw resource.error;
146+
}
147+
148+
if (!driveURL) {
149+
throw new Error('No redirect destination');
150+
}
151+
152+
if (!agentSubject) {
153+
throw new Error('No agent returned');
154+
}
155+
156+
agent.subject = agentSubject;
157+
158+
store.setAgent(agent);
159+
160+
return { driveURL, agent };
161+
};

react/src/index.ts

-1
Original file line numberDiff line numberDiff line change
@@ -30,5 +30,4 @@ export * from './useImporter.js';
3030
export * from './useLocalStorage.js';
3131
export * from './useMarkdown.js';
3232
export * from './useServerSearch.js';
33-
export * from './useRegister.js';
3433
export * from '@tomic/lib';

react/src/useRegister.ts

-59
This file was deleted.

0 commit comments

Comments
 (0)