diff --git a/packages/repl/src/components/settings/login/Login.tsx b/packages/repl/src/components/settings/login/Login.tsx index 4d14c11..09cfb20 100644 --- a/packages/repl/src/components/settings/login/Login.tsx +++ b/packages/repl/src/components/settings/login/Login.tsx @@ -1,6 +1,7 @@ import type { mtcute, TelegramAccount } from 'mtcute-repl-worker/client' +import type { Setter } from 'solid-js' import { unknownToError } from '@fuman/utils' -import { LucideChevronRight } from 'lucide-solid' +import { LucideChevronRight, MessageSquareMore } from 'lucide-solid' import { workerInvoke, workerOn } from 'mtcute-repl-worker/client' import { createEffect, createSignal, For, Match, onCleanup, onMount, Show, Switch } from 'solid-js' import { Button } from '../../../lib/components/ui/button.tsx' @@ -20,12 +21,13 @@ export type LoginStep = | 'done' export interface StepContext { qr: void - phone: void + phone: { setInputRef: Setter } otp: { + setInputRef: Setter phone: string code: mtcute.SentCode } - password: void + password: { setInputRef: Setter } done: { account: TelegramAccount } } @@ -105,7 +107,6 @@ function PhoneNumberStep(props: StepProps<'phone'>) { const [phone, setPhone] = createSignal('') const [error, setError] = createSignal() const [loading, setLoading] = createSignal(false) - const [inputRef, setInputRef] = createSignal() const abortController = new AbortController() const handleSubmit = async () => { @@ -120,8 +121,9 @@ function PhoneNumberStep(props: StepProps<'phone'>) { }) setLoading(false) props.setStep('otp', { - code, phone: phone(), + code, + setInputRef: props.ctx.setInputRef, }) } catch (e) { setLoading(false) @@ -133,7 +135,6 @@ function PhoneNumberStep(props: StepProps<'phone'>) { } } onCleanup(() => abortController.abort()) - createEffect(() => inputRef()?.focus()) return (
@@ -161,7 +162,7 @@ function PhoneNumberStep(props: StepProps<'phone'>) { onChange={setPhone} onSubmit={handleSubmit} disabled={loading()} - ref={setInputRef} + ref={props.ctx.setInputRef} /> -
@@ -474,9 +480,9 @@ function DoneStep(props: StepProps<'done'>) {
-
+
Welcome, {' '} {props.ctx.account.name} @@ -500,21 +506,23 @@ export function LoginForm(props: { props.onStepChange?.(step, ctx()) } + const [inputRef, setInputRef] = createSignal() + return (
- + inputRef()?.focus()} mode="outin"> - + - + - + void, children: JSX.Element }) { return ( {props.children} diff --git a/packages/repl/tailwind.config.js b/packages/repl/tailwind.config.js index b118ed2..59ae5cc 100644 --- a/packages/repl/tailwind.config.js +++ b/packages/repl/tailwind.config.js @@ -89,6 +89,14 @@ module.exports = { '0%, 70%, 100%': { opacity: 1 }, '20%, 50%': { opacity: 0 }, }, + 'scale-up': { + '0%': { transform: 'scale(1)' }, + '100%': { transform: 'scale(2) translateY(10px)' }, + }, + 'fade-out-down': { + '0%': { opacity: 1, transform: 'scale(1)' }, + '100%': { opacity: 0, transform: 'scale(0.8) translateY(16px)' }, + }, }, fontSize: { '2xs': ['0.625rem', { lineHeight: '1rem' }], @@ -99,6 +107,8 @@ module.exports = { 'content-show': 'content-show 0.2s ease-out', 'content-hide': 'content-hide 0.2s ease-out', 'caret-blink': 'caret-blink 1.2s ease-out infinite', + 'scale-up': 'scale-up 1.0s cubic-bezier(0.33, 1, 0.68, 1) 1s', + 'fade-out-down': 'fade-out-down 0.25s cubic-bezier(0.33, 1, 0.68, 1) 1s', }, }, },