feat(core): expose skip login button to web (#8115)
 Allow user skip login page on client
This commit is contained in:
@@ -31,6 +31,7 @@ export type AuthPanelProps<State extends AuthAtomData['state']> = {
|
|||||||
setAuthData: <T extends AuthAtomData['state']>(
|
setAuthData: <T extends AuthAtomData['state']>(
|
||||||
updates: { state: T } & Difference<AuthAtomType<State>, AuthAtomType<T>>
|
updates: { state: T } & Difference<AuthAtomType<State>, AuthAtomType<T>>
|
||||||
) => void;
|
) => void;
|
||||||
|
onSkip?: () => void;
|
||||||
} & Extract<AuthAtomData, { state: State }>;
|
} & Extract<AuthAtomData, { state: State }>;
|
||||||
|
|
||||||
const config: {
|
const config: {
|
||||||
@@ -100,7 +101,7 @@ export function AuthModal() {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
export function AuthPanel() {
|
export function AuthPanel({ onSkip }: { onSkip?: () => void }) {
|
||||||
const t = useI18n();
|
const t = useI18n();
|
||||||
const [authAtomValue, setAuthAtom] = useAtom(authAtom);
|
const [authAtomValue, setAuthAtom] = useAtom(authAtom);
|
||||||
const authService = useService(AuthService);
|
const authService = useService(AuthService);
|
||||||
@@ -137,6 +138,12 @@ export function AuthPanel() {
|
|||||||
|
|
||||||
const CurrentPanel = config[authAtomValue.state];
|
const CurrentPanel = config[authAtomValue.state];
|
||||||
|
|
||||||
|
const props = {
|
||||||
|
...authAtomValue,
|
||||||
|
onSkip,
|
||||||
|
setAuthData,
|
||||||
|
};
|
||||||
|
|
||||||
// @ts-expect-error checked in impls
|
// @ts-expect-error checked in impls
|
||||||
return <CurrentPanel {...authAtomValue} setAuthData={setAuthData} />;
|
return <CurrentPanel {...props} />;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ function validateEmail(email: string) {
|
|||||||
|
|
||||||
export const SignIn: FC<AuthPanelProps<'signIn'>> = ({
|
export const SignIn: FC<AuthPanelProps<'signIn'>> = ({
|
||||||
setAuthData: setAuthState,
|
setAuthData: setAuthState,
|
||||||
|
onSkip,
|
||||||
}) => {
|
}) => {
|
||||||
const t = useI18n();
|
const t = useI18n();
|
||||||
const authService = useService(AuthService);
|
const authService = useService(AuthService);
|
||||||
@@ -134,6 +135,29 @@ export const SignIn: FC<AuthPanelProps<'signIn'>> = ({
|
|||||||
</Trans>
|
</Trans>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
{onSkip ? (
|
||||||
|
<>
|
||||||
|
<div className={style.skipDivider}>
|
||||||
|
<div className={style.skipDividerLine} />
|
||||||
|
<span className={style.skipDividerText}>or</span>
|
||||||
|
<div className={style.skipDividerLine} />
|
||||||
|
</div>
|
||||||
|
<div className={style.skipSection}>
|
||||||
|
<div className={style.skipText}>
|
||||||
|
{t['com.affine.mobile.sign-in.skip.hint']()}
|
||||||
|
</div>
|
||||||
|
<Button
|
||||||
|
variant="plain"
|
||||||
|
onClick={onSkip}
|
||||||
|
className={style.skipLink}
|
||||||
|
suffix={<ArrowRightBigIcon className={style.skipLinkIcon} />}
|
||||||
|
>
|
||||||
|
{t['com.affine.mobile.sign-in.skip.link']()}
|
||||||
|
</Button>
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
) : null}
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import { cssVar } from '@toeverything/theme';
|
import { cssVar } from '@toeverything/theme';
|
||||||
|
import { cssVarV2 } from '@toeverything/theme/v2';
|
||||||
import { globalStyle, style } from '@vanilla-extract/css';
|
import { globalStyle, style } from '@vanilla-extract/css';
|
||||||
export const authModalContent = style({
|
export const authModalContent = style({
|
||||||
marginTop: '30px',
|
marginTop: '30px',
|
||||||
@@ -113,3 +114,44 @@ export const userPlanButton = style({
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
export const skipDivider = style({
|
||||||
|
display: 'flex',
|
||||||
|
gap: 12,
|
||||||
|
alignItems: 'center',
|
||||||
|
height: 20,
|
||||||
|
marginTop: 12,
|
||||||
|
marginBottom: 12,
|
||||||
|
});
|
||||||
|
|
||||||
|
export const skipDividerLine = style({
|
||||||
|
flex: 1,
|
||||||
|
height: 0,
|
||||||
|
borderBottom: `1px solid ${cssVarV2('layer/insideBorder/border')}`,
|
||||||
|
});
|
||||||
|
|
||||||
|
export const skipDividerText = style({
|
||||||
|
color: cssVarV2('text/secondary'),
|
||||||
|
fontSize: cssVar('fontXs'),
|
||||||
|
});
|
||||||
|
|
||||||
|
export const skipText = style({
|
||||||
|
color: cssVarV2('text/primary'),
|
||||||
|
fontSize: cssVar('fontXs'),
|
||||||
|
fontWeight: 500,
|
||||||
|
});
|
||||||
|
|
||||||
|
export const skipLink = style({
|
||||||
|
color: cssVarV2('text/link'),
|
||||||
|
fontSize: cssVar('fontXs'),
|
||||||
|
});
|
||||||
|
|
||||||
|
export const skipLinkIcon = style({
|
||||||
|
color: cssVarV2('text/link'),
|
||||||
|
});
|
||||||
|
|
||||||
|
export const skipSection = style({
|
||||||
|
display: 'flex',
|
||||||
|
flexDirection: 'column',
|
||||||
|
alignItems: 'center',
|
||||||
|
});
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ export const SignIn = () => {
|
|||||||
return (
|
return (
|
||||||
<SignInPageContainer>
|
<SignInPageContainer>
|
||||||
<div style={{ maxWidth: '400px', width: '100%' }}>
|
<div style={{ maxWidth: '400px', width: '100%' }}>
|
||||||
<AuthPanel />
|
<AuthPanel onSkip={jumpToIndex} />
|
||||||
</div>
|
</div>
|
||||||
</SignInPageContainer>
|
</SignInPageContainer>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
import { cssVar } from '@toeverything/theme';
|
|
||||||
import { cssVarV2 } from '@toeverything/theme/v2';
|
|
||||||
import { style } from '@vanilla-extract/css';
|
import { style } from '@vanilla-extract/css';
|
||||||
|
|
||||||
export const root = style({
|
export const root = style({
|
||||||
@@ -18,44 +16,3 @@ export const content = style({
|
|||||||
alignItems: 'stretch',
|
alignItems: 'stretch',
|
||||||
gap: 24,
|
gap: 24,
|
||||||
});
|
});
|
||||||
|
|
||||||
export const skipDivider = style({
|
|
||||||
display: 'flex',
|
|
||||||
gap: 12,
|
|
||||||
alignItems: 'center',
|
|
||||||
height: 20,
|
|
||||||
marginTop: 12,
|
|
||||||
marginBottom: 12,
|
|
||||||
});
|
|
||||||
|
|
||||||
export const skipDividerLine = style({
|
|
||||||
flex: 1,
|
|
||||||
height: 0,
|
|
||||||
borderBottom: `1px solid ${cssVarV2('layer/insideBorder/border')}`,
|
|
||||||
});
|
|
||||||
|
|
||||||
export const skipDividerText = style({
|
|
||||||
color: cssVarV2('text/secondary'),
|
|
||||||
fontSize: cssVar('fontXs'),
|
|
||||||
});
|
|
||||||
|
|
||||||
export const skipText = style({
|
|
||||||
color: cssVarV2('text/primary'),
|
|
||||||
fontSize: cssVar('fontXs'),
|
|
||||||
fontWeight: 500,
|
|
||||||
});
|
|
||||||
|
|
||||||
export const skipLink = style({
|
|
||||||
color: cssVarV2('text/link'),
|
|
||||||
fontSize: cssVar('fontXs'),
|
|
||||||
});
|
|
||||||
|
|
||||||
export const skipLinkIcon = style({
|
|
||||||
color: cssVarV2('text/link'),
|
|
||||||
});
|
|
||||||
|
|
||||||
export const skipSection = style({
|
|
||||||
display: 'flex',
|
|
||||||
flexDirection: 'column',
|
|
||||||
alignItems: 'center',
|
|
||||||
});
|
|
||||||
|
|||||||
@@ -1,40 +1,13 @@
|
|||||||
import { Button } from '@affine/component';
|
|
||||||
import { useI18n } from '@affine/i18n';
|
|
||||||
import { ArrowRightBigIcon } from '@blocksuite/icons/rc';
|
|
||||||
import type { PropsWithChildren } from 'react';
|
import type { PropsWithChildren } from 'react';
|
||||||
|
|
||||||
import { SignInBackground } from './background';
|
import { SignInBackground } from './background';
|
||||||
import * as styles from './layout.css';
|
import * as styles from './layout.css';
|
||||||
|
|
||||||
export const MobileSignInLayout = ({
|
export const MobileSignInLayout = ({ children }: PropsWithChildren) => {
|
||||||
children,
|
|
||||||
onSkip,
|
|
||||||
}: PropsWithChildren<{
|
|
||||||
onSkip: () => void;
|
|
||||||
}>) => {
|
|
||||||
const t = useI18n();
|
|
||||||
return (
|
return (
|
||||||
<div className={styles.root}>
|
<div className={styles.root}>
|
||||||
<SignInBackground />
|
<SignInBackground />
|
||||||
<div className={styles.content}>{children}</div>
|
<div className={styles.content}>{children}</div>
|
||||||
<div className={styles.skipDivider}>
|
|
||||||
<div className={styles.skipDividerLine} />
|
|
||||||
<span className={styles.skipDividerText}>or</span>
|
|
||||||
<div className={styles.skipDividerLine} />
|
|
||||||
</div>
|
|
||||||
<div className={styles.skipSection}>
|
|
||||||
<div className={styles.skipText}>
|
|
||||||
{t['com.affine.mobile.sign-in.skip.hint']()}
|
|
||||||
</div>
|
|
||||||
<Button
|
|
||||||
variant="plain"
|
|
||||||
onClick={onSkip}
|
|
||||||
className={styles.skipLink}
|
|
||||||
suffix={<ArrowRightBigIcon className={styles.skipLinkIcon} />}
|
|
||||||
>
|
|
||||||
{t['com.affine.mobile.sign-in.skip.link']()}
|
|
||||||
</Button>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -4,8 +4,8 @@ import { MobileSignInLayout } from './layout';
|
|||||||
|
|
||||||
export const MobileSignIn = ({ onSkip }: { onSkip: () => void }) => {
|
export const MobileSignIn = ({ onSkip }: { onSkip: () => void }) => {
|
||||||
return (
|
return (
|
||||||
<MobileSignInLayout onSkip={onSkip}>
|
<MobileSignInLayout>
|
||||||
<AuthPanel />
|
<AuthPanel onSkip={onSkip} />
|
||||||
</MobileSignInLayout>
|
</MobileSignInLayout>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user