Skip to content

Commit

Permalink
Fork user logic into singal based disposable (#6336)
Browse files Browse the repository at this point in the history
  • Loading branch information
tjlav5 committed Sep 8, 2023
1 parent e162c4b commit 156abea
Show file tree
Hide file tree
Showing 2 changed files with 71 additions and 1 deletion.
4 changes: 3 additions & 1 deletion firebase-vscode/src/core/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import { registerEnv } from "./env";
import { pluginLogger } from "../logger-wrapper";
import { getSettings } from "../utils/settings";
import { setEnabled } from "../../../src/experiments";
import { registerUser } from "./user";

export function registerCore(broker: ExtensionBrokerImpl): Disposable {
const settings = getSettings();
Expand Down Expand Up @@ -33,6 +34,7 @@ export function registerCore(broker: ExtensionBrokerImpl): Disposable {
return Disposable.from(
registerConfig(broker),
registerEmulators(broker),
registerEnv(broker)
registerEnv(broker),
registerUser(broker)
);
}
68 changes: 68 additions & 0 deletions firebase-vscode/src/core/user.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
import { computed, effect, signal } from "@preact/signals-react";
import { Disposable } from "vscode";
import { ServiceAccountUser } from "../types";
import { User as AuthUser } from "../../../src/types/auth";
import { ExtensionBrokerImpl } from "../extension-broker";
import { getAccounts, login, logoutUser } from "../cli";

type User = ServiceAccountUser | AuthUser;

/** Available user accounts */
const users = signal<Record<string /** email */, User>>({});

/** Currently selected user email */
const currentUserId = signal("");

/** Gets the currently selected user, fallback to first available user */
const currentUser = computed<User | undefined>(() => {
return users.value[currentUserId.value] ?? Object.values(users.value)[0];
});

export function registerUser(broker: ExtensionBrokerImpl): Disposable {
effect(() => {
broker.send("notifyUsers", { users: Object.values(users.value) });
});

effect(() => {
broker.send("notifyUserChanged", { user: currentUser.value });
});

broker.on("getInitialData", async () => {
const accounts = await getAccounts();
users.value = accounts.reduce(
(cumm, curr) => ({ ...cumm, [curr.user.email]: curr.user }),
{}
);
});

broker.on("addUser", async () => {
const { user } = await login();
users.value = {
...users.value,
[user.email]: user,
};
currentUserId.value = user.email;
});

broker.on("requestChangeUser", ({ user }) => {
currentUserId.value = user.email;
});

broker.on("logout", async ({ email }) => {
try {
await logoutUser(email);
const accounts = await getAccounts();
users.value = accounts.reduce(
(cumm, curr) => ({ ...cumm, [curr.user.email]: curr.user }),
{}
);
currentUserId.value = "";
} catch (e) {
// ignored
}
});

return {
dispose() {},
};
}

0 comments on commit 156abea

Please sign in to comment.