mirror of
https://github.com/chanzuckerberg/cellxgene.git
synced 2026-09-25 12:18:12 +08:00
* revert all commits to before Typescript migration * update compat workflow to match latest deps (#2335) * update compat workflow to match latest deps * attempt to debug * attempt to debug * remove debugging code * typo * update deps to match desktop (#2340) * fix: don't run lint with `--fix` on push tests (#2273) * fix: don't run lint with `--fix` on push tests * npx Co-authored-by: maniarathi <mani.arathi@gmail.com> Co-authored-by: Madison Dunitz <madison.dunitz@chanzuckerberg.com> * rename X_approx_distribution to X_approximate_distribution (#2337) * Correctly handle non-finite numbers in heuristic determination of X distribution (#2342) * handle non-finites explicitly * improve and test edge case handling for distribution estimation * revert debugging changes * code readability * clean up type inferencing (#2332) * unit tests for 64 bit conversion * clean up type handling * type inference tests * more type inference fixes * use schema to determine user intent for data typing * stop using deprecated API * fbs type encoding test * add missing test * add more tests * correctly infer X type for CXG adaptor * lint * fix typo * ts migration * cleanup from PR review * lint * PR review changes * remove unused packages from client (#2359) * remove unused packages from client * add missing peer dep * fix: disable FE auth testing on compatibility tests (#2377) * update: release process (#2277) Co-authored-by: maniarathi <mani.arathi@gmail.com> * fix: remove spaces in param setup (#2380) * delete deploy workflow (#2396) * undo reformatting which now does not pass lint * fix snapshots which changed due to npm dep changes * add missing quoting to snapshot * another snapshot typo fix * TS Revert (2) - replay PR #2347 and #2354 (#2403) * replay edits from PR 2347 * TS Revert (3) - replay edits in PR #2327 (#2404) * replay edits in PR 2327 * TS Revert (4) - replay PR #2355 (#2405) * replay edits in PR 2355 * add additional babel config * reformat with new prettier config Co-authored-by: Severiano Badajoz <sbadajoz@chanzuckerberg.com> Co-authored-by: maniarathi <mani.arathi@gmail.com> Co-authored-by: Madison Dunitz <madison.dunitz@chanzuckerberg.com>
176 lines
4.0 KiB
JavaScript
176 lines
4.0 KiB
JavaScript
import React, { useState } from "react";
|
|
|
|
import {
|
|
AnchorButton,
|
|
Button,
|
|
MenuItem,
|
|
Tooltip,
|
|
Popover,
|
|
Menu,
|
|
Elevation,
|
|
PopoverPosition,
|
|
Checkbox,
|
|
Card,
|
|
} from "@blueprintjs/core";
|
|
|
|
import { IconNames } from "@blueprintjs/icons";
|
|
|
|
import * as globals from "../../globals";
|
|
|
|
import styles from "./menubar.css";
|
|
|
|
import { storageGet, storageSet, KEYS } from "../util/localStorage";
|
|
|
|
const BASE_EMOJI = [0x1f9d1, 0x1f468, 0x1f469];
|
|
const SKIN_TONES = [0x1f3fb, 0x1f3fc, 0x1f3fd, 0x1f3fe, 0x1f3ff];
|
|
const MICROSCOPE = 0x1f52c;
|
|
const ZERO_WIDTH_JOINER = 0x0200d;
|
|
|
|
const LOGIN_PROMPT_OFF = "off";
|
|
|
|
const Auth = React.memo((props) => {
|
|
const [isPromptOpen, setIsPromptOpen] = useState(shouldShowPrompt());
|
|
|
|
const { auth, userInfo } = props;
|
|
|
|
const isAuthenticated = userInfo && userInfo.is_authenticated;
|
|
|
|
window.userInfo = userInfo;
|
|
|
|
const randomInt = Math.random() * 15;
|
|
const sexIndex = Math.floor(randomInt / 5);
|
|
const skinToneIndex = Math.floor(randomInt % 5);
|
|
|
|
const scientist = String.fromCodePoint(
|
|
BASE_EMOJI[sexIndex],
|
|
SKIN_TONES[skinToneIndex],
|
|
ZERO_WIDTH_JOINER,
|
|
MICROSCOPE
|
|
);
|
|
|
|
if (!shouldShowAuth()) return null;
|
|
|
|
if (isAuthenticated) {
|
|
const PopoverContent = (
|
|
<Menu>
|
|
<MenuItem
|
|
data-testid="user-email"
|
|
text={`Logged in as: ${userInfo.email}`}
|
|
/>
|
|
<MenuItem
|
|
data-testid="log-out"
|
|
text="Log Out"
|
|
href={auth.logout}
|
|
icon={IconNames.LOG_OUT}
|
|
/>
|
|
</Menu>
|
|
);
|
|
|
|
return (
|
|
<Popover content={PopoverContent}>
|
|
<Button
|
|
data-testid="user-info"
|
|
className={styles.menubarButton}
|
|
style={{ padding: 0 }}
|
|
>
|
|
{/* eslint-disable-next-line no-constant-condition -- disable profile picture until CSP is tweaked */}
|
|
{userInfo?.picture && false ? (
|
|
<img alt="profile" size="21px" src={userInfo?.picture} />
|
|
) : (
|
|
<span style={{ fontSize: "18px" }}>{scientist}</span>
|
|
)}
|
|
</Button>
|
|
</Popover>
|
|
);
|
|
}
|
|
|
|
const LoginButton = (
|
|
<Tooltip
|
|
content="Log in to cellxgene"
|
|
position="bottom"
|
|
hoverOpenDelay={globals.tooltipHoverOpenDelay}
|
|
>
|
|
<AnchorButton
|
|
type="button"
|
|
data-testid="log-in"
|
|
href={auth.login}
|
|
className={styles.menubarButton}
|
|
>
|
|
Log In
|
|
</AnchorButton>
|
|
</Tooltip>
|
|
);
|
|
|
|
if (isPromptOpen) {
|
|
return (
|
|
<Popover
|
|
position={PopoverPosition.AUTO_END}
|
|
isOpen
|
|
content={<PromptContent setIsPromptOpen={setIsPromptOpen} />}
|
|
onInteraction={setIsPromptOpen}
|
|
>
|
|
{LoginButton}
|
|
</Popover>
|
|
);
|
|
}
|
|
|
|
return LoginButton;
|
|
|
|
function shouldShowAuth() {
|
|
return auth && auth.requires_client_login;
|
|
}
|
|
|
|
function shouldShowPrompt() {
|
|
if (storageGet(KEYS.LOGIN_PROMPT) === LOGIN_PROMPT_OFF) return false;
|
|
|
|
return shouldShowAuth && !isAuthenticated;
|
|
}
|
|
});
|
|
|
|
function PromptContent({ setIsPromptOpen }) {
|
|
const [isChecked, setIsChecked] = useState(false);
|
|
|
|
function handleOKClick() {
|
|
if (isChecked) {
|
|
storageSet(KEYS.LOGIN_PROMPT, LOGIN_PROMPT_OFF);
|
|
}
|
|
|
|
setIsPromptOpen(false);
|
|
}
|
|
|
|
function handleCheckboxChange() {
|
|
setIsChecked(!isChecked);
|
|
}
|
|
|
|
return (
|
|
<Card style={{ width: "500px" }} elevation={Elevation.TWO}>
|
|
<p>
|
|
Logging in will enable you to create your own categories and labels.
|
|
Logging in later will reset cellxgene to the default view and cause you
|
|
to lose progress.
|
|
</p>
|
|
<Checkbox
|
|
style={{ width: "230px" }}
|
|
checked={isChecked}
|
|
onChange={handleCheckboxChange}
|
|
data-testid="login-hint-do-not-show-again"
|
|
>
|
|
Do not show me this message again
|
|
</Checkbox>
|
|
<div
|
|
style={{ display: "flex", justifyContent: "flex-end", marginTop: 15 }}
|
|
>
|
|
<Button
|
|
onClick={handleOKClick}
|
|
intent="primary"
|
|
data-testid="login-hint-yes"
|
|
>
|
|
Acknowledge
|
|
</Button>
|
|
</div>
|
|
</Card>
|
|
);
|
|
}
|
|
|
|
export default Auth;
|