Skip to content

Commit 2fd6a66

Browse files
authored
refactor: auth unwrap (@Miodec) (monkeytypegame#7553)
Remove dom handling from auth.tsx
1 parent 970a1b1 commit 2fd6a66

File tree

9 files changed

+261
-183
lines changed

9 files changed

+261
-183
lines changed

frontend/src/ts/auth.tsx

Lines changed: 74 additions & 177 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import {
1010

1111
import Ape from "./ape";
1212
import { updateFromServer as updateConfigFromServer } from "./config";
13-
import { navigate } from "./controllers/route-controller";
1413
import * as DB from "./db";
1514
import * as Notifications from "./elements/notifications";
1615
import {
@@ -26,18 +25,16 @@ import {
2625
import * as RegisterCaptchaModal from "./modals/register-captcha";
2726
import { showPopup } from "./modals/simple-modals-base";
2827
import * as AuthEvent from "./observables/auth-event";
29-
import * as LoginPage from "./pages/login";
3028
import * as Sentry from "./sentry";
3129
import { showLoaderBar, hideLoaderBar } from "./signals/loader-bar";
3230
import * as ConnectionState from "./states/connection";
3331
import { addBanner } from "./stores/banners";
34-
import { qs, qsa } from "./utils/dom";
3532
import * as Misc from "./utils/misc";
3633

3734
export const gmailProvider = new GoogleAuthProvider();
3835
export const githubProvider = new GithubAuthProvider();
3936

40-
async function sendVerificationEmail(): Promise<void> {
37+
export async function sendVerificationEmail(): Promise<void> {
4138
if (!isAuthAvailable()) {
4239
Notifications.add("Authentication uninitialized", -1, {
4340
duration: 3,
@@ -46,9 +43,7 @@ async function sendVerificationEmail(): Promise<void> {
4643
}
4744

4845
showLoaderBar();
49-
qs(".sendVerificationEmail")?.disable();
5046
const response = await Ape.users.verificationEmail();
51-
qs(".sendVerificationEmail")?.enable();
5247
if (response.status !== 200) {
5348
hideLoaderBar();
5449
Notifications.add("Failed to request verification email", -1, { response });
@@ -97,8 +92,6 @@ async function getDataAndInit(): Promise<boolean> {
9792
return true;
9893
} catch (error) {
9994
console.error(error);
100-
LoginPage.enableInputs();
101-
qs("header nav .view-account")?.setStyle({ opacity: "1" });
10295
if (error instanceof DB.SnapshotInitError) {
10396
if (error.responseCode === 429) {
10497
Notifications.add(
@@ -155,127 +148,95 @@ export async function onAuthStateChanged(
155148
void Sentry.clearUser();
156149
}
157150

158-
let keyframes = [
159-
{
160-
percentage: 90,
161-
durationMs: 1000,
162-
text: "Downloading user data...",
163-
},
164-
];
165-
166-
//undefined means navigate to whatever the current window.location.pathname is
167-
await navigate(undefined, {
168-
force: true,
169-
loadingOptions: {
170-
loadingMode: () => {
171-
if (user !== null) {
172-
return "sync";
173-
} else {
174-
return "none";
175-
}
176-
},
177-
loadingPromise: async () => {
178-
await userPromise;
179-
},
180-
style: "bar",
181-
keyframes: keyframes,
182-
},
183-
});
184-
185151
AuthEvent.dispatch({
186152
type: "authStateChanged",
187-
data: { isUserSignedIn: user !== null },
153+
data: { isUserSignedIn: user !== null, loadPromise: userPromise },
188154
});
189155
}
190156

191-
export async function signIn(email: string, password: string): Promise<void> {
157+
export async function signIn(
158+
email: string,
159+
password: string,
160+
rememberMe: boolean,
161+
): Promise<
162+
| {
163+
success: true;
164+
}
165+
| {
166+
success: false;
167+
message: string;
168+
}
169+
> {
192170
if (!isAuthAvailable()) {
193-
Notifications.add("Authentication uninitialized", -1);
194-
return;
195-
}
196-
if (!ConnectionState.get()) {
197-
Notifications.add("You are offline", 0, {
198-
duration: 2,
199-
});
200-
return;
171+
return { success: false, message: "Authentication uninitialized" };
201172
}
202173

203-
LoginPage.showPreloader();
204-
LoginPage.disableInputs();
205-
LoginPage.disableSignUpButton();
206-
207-
if (email === "" || password === "") {
208-
Notifications.add("Please fill in all fields", 0);
209-
LoginPage.hidePreloader();
210-
LoginPage.enableInputs();
211-
LoginPage.enableSignUpButton();
212-
return;
213-
}
214-
215-
const rememberMe =
216-
qs<HTMLInputElement>(".pageLogin .login #rememberMe input")?.isChecked() ??
217-
false;
218-
219174
const { error } = await tryCatch(
220175
signInWithEmailAndPassword(email, password, rememberMe),
221176
);
222177

223178
if (error !== null) {
224-
Notifications.add(error.message, -1);
225-
LoginPage.hidePreloader();
226-
LoginPage.enableInputs();
227-
LoginPage.updateSignupButton();
228-
return;
179+
return { success: false, message: error.message };
229180
}
181+
return { success: true };
230182
}
231183

232-
async function signInWithProvider(provider: AuthProvider): Promise<void> {
184+
async function signInWithProvider(
185+
provider: AuthProvider,
186+
rememberMe: boolean,
187+
): Promise<
188+
| {
189+
success: true;
190+
}
191+
| {
192+
success: false;
193+
message: string;
194+
}
195+
> {
233196
if (!isAuthAvailable()) {
234-
Notifications.add("Authentication uninitialized", -1, {
235-
duration: 3,
236-
});
237-
return;
238-
}
239-
if (!ConnectionState.get()) {
240-
Notifications.add("You are offline", 0, {
241-
duration: 2,
242-
});
243-
return;
197+
return { success: false, message: "Authentication uninitialized" };
244198
}
245199

246-
LoginPage.showPreloader();
247-
LoginPage.disableInputs();
248-
LoginPage.disableSignUpButton();
249-
const rememberMe =
250-
qs<HTMLInputElement>(".pageLogin .login #rememberMe input")?.isChecked() ??
251-
false;
252-
253200
const { error } = await tryCatch(signInWithPopup(provider, rememberMe));
254201

255202
if (error !== null) {
256203
if (error.message !== "") {
257204
Notifications.add(error.message, -1);
258205
}
259-
LoginPage.hidePreloader();
260-
LoginPage.enableInputs();
261-
LoginPage.updateSignupButton();
262-
return;
206+
return { success: false, message: error.message };
263207
}
208+
return { success: true };
264209
}
265210

266-
async function signInWithGoogle(): Promise<void> {
267-
return signInWithProvider(gmailProvider);
211+
export async function signInWithGoogle(rememberMe: boolean): Promise<
212+
| {
213+
success: true;
214+
}
215+
| {
216+
success: false;
217+
message: string;
218+
}
219+
> {
220+
return signInWithProvider(gmailProvider, rememberMe);
268221
}
269222

270-
async function signInWithGitHub(): Promise<void> {
271-
return signInWithProvider(githubProvider);
223+
export async function signInWithGitHub(rememberMe: boolean): Promise<
224+
| {
225+
success: true;
226+
}
227+
| {
228+
success: false;
229+
message: string;
230+
}
231+
> {
232+
return signInWithProvider(githubProvider, rememberMe);
272233
}
273234

274-
async function addGoogleAuth(): Promise<void> {
235+
export async function addGoogleAuth(): Promise<void> {
275236
return addAuthProvider("Google", gmailProvider);
276237
}
277238

278-
async function addGithubAuth(): Promise<void> {
239+
export async function addGithubAuth(): Promise<void> {
279240
return addAuthProvider("GitHub", githubProvider);
280241
}
281242

@@ -324,38 +285,27 @@ export function signOut(): void {
324285
void authSignOut();
325286
}
326287

327-
async function signUp(): Promise<void> {
288+
export async function signUp(
289+
name: string,
290+
email: string,
291+
password: string,
292+
): Promise<
293+
| {
294+
success: true;
295+
}
296+
| {
297+
success: false;
298+
message: string;
299+
}
300+
> {
328301
if (!isAuthAvailable()) {
329-
Notifications.add("Authentication uninitialized", -1, {
330-
duration: 3,
331-
});
332-
return;
333-
}
334-
if (!ConnectionState.get()) {
335-
Notifications.add("You are offline", 0, {
336-
duration: 2,
337-
});
338-
return;
302+
return { success: false, message: "Authentication uninitialized" };
339303
}
340304
await RegisterCaptchaModal.show();
341305
const captchaToken = await RegisterCaptchaModal.promise;
342306
if (captchaToken === undefined || captchaToken === "") {
343-
Notifications.add("Please complete the captcha", -1);
344-
return;
307+
return { success: false, message: "Please complete the captcha" };
345308
}
346-
LoginPage.disableInputs();
347-
LoginPage.disableSignUpButton();
348-
LoginPage.showPreloader();
349-
350-
const signupData = LoginPage.getSignupData();
351-
if (signupData === false) {
352-
LoginPage.hidePreloader();
353-
LoginPage.enableInputs();
354-
LoginPage.updateSignupButton();
355-
Notifications.add("Please fill in all fields", 0);
356-
return;
357-
}
358-
const { name: nname, email, password } = signupData;
359309

360310
try {
361311
const createdAuthUser = await createUserWithEmailAndPassword(
@@ -365,7 +315,7 @@ async function signUp(): Promise<void> {
365315

366316
const signInResponse = await Ape.users.create({
367317
body: {
368-
name: nname,
318+
name: name,
369319
captcha: captchaToken,
370320
email,
371321
uid: createdAuthUser.user.uid,
@@ -375,13 +325,13 @@ async function signUp(): Promise<void> {
375325
throw new Error(`Failed to sign in: ${signInResponse.body.message}`);
376326
}
377327

378-
await updateProfile(createdAuthUser.user, { displayName: nname });
328+
await updateProfile(createdAuthUser.user, { displayName: name });
379329
await sendVerificationEmail();
380-
LoginPage.hidePreloader();
381330
await onAuthStateChanged(true, createdAuthUser.user);
382331
resetIgnoreAuthCallback();
383332

384333
Notifications.add("Account created", 1);
334+
return { success: true };
385335
} catch (e) {
386336
let message = Misc.createErrorMessage(e, "Failed to create account");
387337

@@ -395,60 +345,7 @@ async function signUp(): Promise<void> {
395345
}
396346

397347
Notifications.add(message, -1);
398-
LoginPage.hidePreloader();
399-
LoginPage.enableInputs();
400-
LoginPage.updateSignupButton();
401348
signOut();
402-
return;
349+
return { success: false, message };
403350
}
404351
}
405-
406-
qs(".pageLogin .login form")?.on("submit", (e) => {
407-
e.preventDefault();
408-
const email =
409-
qsa<HTMLInputElement>(".pageLogin .login input")?.[0]?.getValue() ?? "";
410-
const password =
411-
qsa<HTMLInputElement>(".pageLogin .login input")?.[1]?.getValue() ?? "";
412-
void signIn(email, password);
413-
});
414-
415-
qs(".pageLogin .login button.signInWithGoogle")?.on("click", () => {
416-
void signInWithGoogle();
417-
});
418-
419-
qs(".pageLogin .login button.signInWithGitHub")?.on("click", () => {
420-
void signInWithGitHub();
421-
});
422-
423-
qs("nav .accountButtonAndMenu .menu button.signOut")?.on("click", () => {
424-
if (!isAuthAvailable()) {
425-
Notifications.add("Authentication uninitialized", -1, {
426-
duration: 3,
427-
});
428-
return;
429-
}
430-
signOut();
431-
});
432-
433-
qs(".pageLogin .register form")?.on("submit", (e) => {
434-
e.preventDefault();
435-
void signUp();
436-
});
437-
438-
qs(".pageAccountSettings")?.onChild("click", "#addGoogleAuth", () => {
439-
void addGoogleAuth();
440-
});
441-
442-
qs(".pageAccountSettings")?.onChild("click", "#addGithubAuth", () => {
443-
void addGithubAuth();
444-
});
445-
446-
qs(".pageAccount")?.onChild("click", ".sendVerificationEmail", () => {
447-
if (!ConnectionState.get()) {
448-
Notifications.add("You are offline", 0, {
449-
duration: 2,
450-
});
451-
return;
452-
}
453-
void sendVerificationEmail();
454-
});

0 commit comments

Comments
 (0)