Files
AFFiNE-Mirror/packages/frontend/component/src/components/auth-components/sign-up-page.tsx
CatsJuice 3d855647c7 refactor(component): refactor the implementation of Button and IconButton (#7716)
## Button
- Remove props withoutHoverStyle
   refactor hover impl with independent layer, so that hover-color won't affect the background even if is overridden outside
- Update `type` (renamed to `variant`):
  - remove `processing` and `warning`
  - rename `default` with `secondary`
- Remove `shape` props
- Remove `icon` and `iconPosition`, replaced with `prefix: ReactNode` and `suffix: ReactNode`
- Integrate tooltip for more convenient usage
- New Storybook document
- Focus style

## IconButton
- A Wrapper base on `<Button />`
- Override Button size and variant
  - size: `'12' | '14' | '16' | '20' | '24' | number`
     These presets size are referenced from the design system.
  - variant:  `'plain' | 'solid' | 'danger' | 'custom'`
- Inset icon via Button 's prefix

## Fix
- fix some button related issues
- close AF-1159, AF-1160, AF-1161, AF-1162, AF-1163, AF-1158, AF-1157

## Storybook

![CleanShot 2024-08-03 at 14.57.20@2x.png](https://graphite-user-uploaded-assets-prod.s3.amazonaws.com/LakojjjzZNf6ogjOVwKE/f5a76110-35d0-4082-a940-efc12bed87b0.png)
2024-08-05 02:57:23 +00:00

80 lines
2.1 KiB
TypeScript

import type { PasswordLimitsFragment } from '@affine/graphql';
import { useI18n } from '@affine/i18n';
import type { FC } from 'react';
import { useCallback, useState } from 'react';
import { Button } from '../../ui/button';
import { notify } from '../../ui/notification';
import { AuthPageContainer } from './auth-page-container';
import { SetPassword } from './set-password';
export const SignUpPage: FC<{
passwordLimits: PasswordLimitsFragment;
user: { email?: string };
onSetPassword: (password: string) => Promise<void>;
openButtonText?: string;
onOpenAffine: () => void;
}> = ({
passwordLimits,
user: { email },
onSetPassword: propsOnSetPassword,
onOpenAffine,
openButtonText,
}) => {
const t = useI18n();
const [hasSetUp, setHasSetUp] = useState(false);
const onSetPassword = useCallback(
(passWord: string) => {
propsOnSetPassword(passWord)
.then(() => setHasSetUp(true))
.catch(e =>
notify.error({
title: t['com.affine.auth.password.set-failed'](),
message: String(e),
})
);
},
[propsOnSetPassword, t]
);
const onLater = useCallback(() => {
setHasSetUp(true);
}, []);
return (
<AuthPageContainer
title={
hasSetUp
? t['com.affine.auth.sign.up.success.title']()
: t['com.affine.auth.page.sent.email.title']()
}
subtitle={
hasSetUp ? (
t['com.affine.auth.sign.up.success.subtitle']()
) : (
<>
{t['com.affine.auth.page.sent.email.subtitle']({
min: String(passwordLimits.minLength),
max: String(passwordLimits.maxLength),
})}
<a href={`mailto:${email}`}>{email}</a>
</>
)
}
>
{hasSetUp ? (
<Button variant="primary" size="large" onClick={onOpenAffine}>
{openButtonText ?? t['com.affine.auth.open.affine']()}
</Button>
) : (
<SetPassword
passwordLimits={passwordLimits}
onSetPassword={onSetPassword}
onLater={onLater}
showLater={true}
/>
)}
</AuthPageContainer>
);
};