@asteby/metacore-auth 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +101 -0
- package/dist/api-client.d.ts +35 -0
- package/dist/api-client.d.ts.map +1 -0
- package/dist/api-client.js +57 -0
- package/dist/api-client.js.map +1 -0
- package/dist/components/index.d.ts +4 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +3 -0
- package/dist/components/index.js.map +1 -0
- package/dist/components/password-input.d.ts +7 -0
- package/dist/components/password-input.d.ts.map +1 -0
- package/dist/components/password-input.js +10 -0
- package/dist/components/password-input.js.map +1 -0
- package/dist/components/sign-out-dialog.d.ts +16 -0
- package/dist/components/sign-out-dialog.d.ts.map +1 -0
- package/dist/components/sign-out-dialog.js +20 -0
- package/dist/components/sign-out-dialog.js.map +1 -0
- package/dist/guards.d.ts +28 -0
- package/dist/guards.d.ts.map +1 -0
- package/dist/guards.js +33 -0
- package/dist/guards.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/dist/pages/auth-layout.d.ts +14 -0
- package/dist/pages/auth-layout.d.ts.map +1 -0
- package/dist/pages/auth-layout.js +9 -0
- package/dist/pages/auth-layout.js.map +1 -0
- package/dist/pages/forgot-password.d.ts +21 -0
- package/dist/pages/forgot-password.d.ts.map +1 -0
- package/dist/pages/forgot-password.js +33 -0
- package/dist/pages/forgot-password.js.map +1 -0
- package/dist/pages/index.d.ts +11 -0
- package/dist/pages/index.d.ts.map +1 -0
- package/dist/pages/index.js +6 -0
- package/dist/pages/index.js.map +1 -0
- package/dist/pages/otp.d.ts +37 -0
- package/dist/pages/otp.d.ts.map +1 -0
- package/dist/pages/otp.js +50 -0
- package/dist/pages/otp.js.map +1 -0
- package/dist/pages/sign-in.d.ts +54 -0
- package/dist/pages/sign-in.d.ts.map +1 -0
- package/dist/pages/sign-in.js +41 -0
- package/dist/pages/sign-in.js.map +1 -0
- package/dist/pages/sign-up.d.ts +32 -0
- package/dist/pages/sign-up.d.ts.map +1 -0
- package/dist/pages/sign-up.js +54 -0
- package/dist/pages/sign-up.js.map +1 -0
- package/dist/provider.d.ts +35 -0
- package/dist/provider.d.ts.map +1 -0
- package/dist/provider.js +48 -0
- package/dist/provider.js.map +1 -0
- package/dist/store.d.ts +40 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +47 -0
- package/dist/store.js.map +1 -0
- package/package.json +81 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-layout.js","sourceRoot":"","sources":["../../src/pages/auth-layout.tsx"],"names":[],"mappings":";AAUA;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAmB;IACvE,OAAO,CACL,cAAK,SAAS,EAAC,6DAA6D,YAC1E,eAAK,SAAS,EAAC,gFAAgF,aAC5F,CAAC,IAAI,IAAI,SAAS,CAAC,IAAI,CACtB,eAAK,SAAS,EAAC,uCAAuC,aACnD,IAAI,IAAI,eAAM,SAAS,EAAC,MAAM,YAAE,IAAI,GAAQ,EAC5C,SAAS,IAAI,aAAI,SAAS,EAAC,qBAAqB,YAAE,SAAS,GAAM,IAC9D,CACP,EACA,QAAQ,IACL,GACF,CACP,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
declare const formSchema: z.ZodObject<{
|
|
4
|
+
email: z.ZodString;
|
|
5
|
+
}, z.core.$strip>;
|
|
6
|
+
export type ForgotPasswordValues = z.infer<typeof formSchema>;
|
|
7
|
+
export interface ForgotPasswordPageProps {
|
|
8
|
+
brandName?: string;
|
|
9
|
+
logo?: ReactNode;
|
|
10
|
+
showcase?: ReactNode;
|
|
11
|
+
title?: string;
|
|
12
|
+
subtitle?: string;
|
|
13
|
+
submitLabel?: string;
|
|
14
|
+
onSubmit: (values: ForgotPasswordValues) => Promise<void> | void;
|
|
15
|
+
headerSlot?: ReactNode;
|
|
16
|
+
footerSlot?: ReactNode;
|
|
17
|
+
className?: string;
|
|
18
|
+
}
|
|
19
|
+
export declare function ForgotPasswordPage({ brandName, logo, showcase, title, subtitle, submitLabel, onSubmit, headerSlot, footerSlot, className, }: ForgotPasswordPageProps): import("react/jsx-runtime").JSX.Element;
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=forgot-password.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"forgot-password.d.ts","sourceRoot":"","sources":["../../src/pages/forgot-password.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACtC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAgBvB,QAAA,MAAM,UAAU;;iBAKd,CAAA;AAEF,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAA;AAE7D,MAAM,WAAW,uBAAuB;IACtC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB,QAAQ,CAAC,EAAE,SAAS,CAAA;IACpB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,EAAE,CAAC,MAAM,EAAE,oBAAoB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;IAChE,UAAU,CAAC,EAAE,SAAS,CAAA;IACtB,UAAU,CAAC,EAAE,SAAS,CAAA;IACtB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,wBAAgB,kBAAkB,CAAC,EACjC,SAAS,EACT,IAAI,EACJ,QAAQ,EACR,KAA0B,EAC1B,QAAqD,EACrD,WAAyB,EACzB,QAAQ,EACR,UAAU,EACV,UAAU,EACV,SAAS,GACV,EAAE,uBAAuB,2CAmFzB"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from 'react';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
import { useForm } from 'react-hook-form';
|
|
5
|
+
import { zodResolver } from '@hookform/resolvers/zod';
|
|
6
|
+
import { ArrowRight, Loader2 } from 'lucide-react';
|
|
7
|
+
import { Button, Form, FormControl, FormField, FormItem, FormLabel, FormMessage, Input, } from '@asteby/metacore-ui/primitives';
|
|
8
|
+
import { cn } from '@asteby/metacore-ui/lib';
|
|
9
|
+
const formSchema = z.object({
|
|
10
|
+
email: z
|
|
11
|
+
.string()
|
|
12
|
+
.min(1, 'Por favor, ingresa tu correo electrónico')
|
|
13
|
+
.email('Correo electrónico inválido'),
|
|
14
|
+
});
|
|
15
|
+
export function ForgotPasswordPage({ brandName, logo, showcase, title = 'Recuperar acceso', subtitle = 'Te enviaremos instrucciones a tu correo.', submitLabel = 'Continuar', onSubmit, headerSlot, footerSlot, className, }) {
|
|
16
|
+
const [isLoading, setIsLoading] = useState(false);
|
|
17
|
+
const form = useForm({
|
|
18
|
+
resolver: zodResolver(formSchema),
|
|
19
|
+
defaultValues: { email: '' },
|
|
20
|
+
});
|
|
21
|
+
async function handleSubmit(data) {
|
|
22
|
+
setIsLoading(true);
|
|
23
|
+
try {
|
|
24
|
+
await onSubmit(data);
|
|
25
|
+
form.reset();
|
|
26
|
+
}
|
|
27
|
+
finally {
|
|
28
|
+
setIsLoading(false);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return (_jsxs("div", { className: 'h-svh flex overflow-hidden', children: [_jsxs("div", { className: 'w-full lg:w-1/2 flex flex-col bg-background', children: [(logo || brandName || headerSlot) && (_jsx("div", { className: 'px-6 pt-8 pb-4 lg:px-12 xl:px-20 max-w-lg mx-auto w-full', children: _jsxs("div", { className: 'flex items-center justify-center gap-3', children: [(logo || brandName) && (_jsxs("div", { className: 'inline-flex items-center gap-2', children: [logo, brandName && _jsx("span", { className: 'text-lg font-semibold', children: brandName })] })), headerSlot && (_jsxs(_Fragment, { children: [_jsx("span", { className: 'text-muted-foreground/50', children: "|" }), _jsx("div", { className: 'text-sm text-muted-foreground', children: headerSlot })] }))] }) })), _jsxs("div", { className: 'flex-1 flex flex-col justify-center px-6 lg:px-12 xl:px-20 max-w-lg mx-auto w-full', children: [_jsxs("div", { className: 'mb-8 text-center lg:text-left', children: [_jsx("h1", { className: 'text-2xl font-bold tracking-tight', children: title }), subtitle && (_jsx("p", { className: 'text-muted-foreground text-sm mt-1', children: subtitle }))] }), _jsx(Form, { ...form, children: _jsxs("form", { onSubmit: form.handleSubmit(handleSubmit), className: cn('grid gap-2', className), children: [_jsx(FormField, { control: form.control, name: 'email', render: ({ field }) => (_jsxs(FormItem, { children: [_jsx(FormLabel, { children: "Correo electr\u00F3nico" }), _jsx(FormControl, { children: _jsx(Input, { placeholder: 'name@example.com', ...field }) }), _jsx(FormMessage, {})] })) }), _jsxs(Button, { className: 'mt-2', disabled: isLoading, children: [submitLabel, isLoading ? _jsx(Loader2, { className: 'animate-spin' }) : _jsx(ArrowRight, {})] }), footerSlot] }) })] })] }), showcase && (_jsx("div", { className: 'hidden lg:flex lg:w-1/2 bg-gradient-to-br from-primary/5 via-primary/10 to-primary/5 flex-col items-center pt-12 relative overflow-hidden', children: showcase }))] }));
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=forgot-password.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"forgot-password.js","sourceRoot":"","sources":["../../src/pages/forgot-password.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export { AuthLayout } from './auth-layout';
|
|
2
|
+
export type { AuthLayoutProps } from './auth-layout';
|
|
3
|
+
export { SignInPage } from './sign-in';
|
|
4
|
+
export type { SignInPageProps, SignInValues } from './sign-in';
|
|
5
|
+
export { SignUpPage } from './sign-up';
|
|
6
|
+
export type { SignUpPageProps, SignUpValues } from './sign-up';
|
|
7
|
+
export { ForgotPasswordPage } from './forgot-password';
|
|
8
|
+
export type { ForgotPasswordPageProps, ForgotPasswordValues } from './forgot-password';
|
|
9
|
+
export { OtpPage } from './otp';
|
|
10
|
+
export type { OtpPageProps, OtpValues } from './otp';
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/pages/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAC1C,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AACtC,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AACtC,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AACtD,YAAY,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AACtF,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AAC/B,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/pages/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAE1C,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AAEtC,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AAEtC,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAEtD,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
export type OtpValues = {
|
|
3
|
+
otp: string;
|
|
4
|
+
};
|
|
5
|
+
export interface OtpPageProps {
|
|
6
|
+
/** Brand display name. */
|
|
7
|
+
brandName?: string;
|
|
8
|
+
/** Logo slot. */
|
|
9
|
+
logo?: ReactNode;
|
|
10
|
+
/** Heading. */
|
|
11
|
+
title?: string;
|
|
12
|
+
/** Subtitle (e.g. "Revisa tu correo"). */
|
|
13
|
+
subtitle?: string;
|
|
14
|
+
/** OTP length. Default 6. */
|
|
15
|
+
length?: number;
|
|
16
|
+
/** Submit-button label. */
|
|
17
|
+
submitLabel?: string;
|
|
18
|
+
/** Resend-button label. */
|
|
19
|
+
resendLabel?: string;
|
|
20
|
+
/** OTP field label. */
|
|
21
|
+
otpLabel?: string;
|
|
22
|
+
/** Submit handler. */
|
|
23
|
+
onSubmit: (values: OtpValues) => Promise<void> | void;
|
|
24
|
+
/** Optional resend handler. Hides the resend UI when omitted. */
|
|
25
|
+
onResend?: () => Promise<void> | void;
|
|
26
|
+
/** Slot rendered above the form (e.g. contextual text). */
|
|
27
|
+
headerSlot?: ReactNode;
|
|
28
|
+
/** Slot rendered below the submit button. */
|
|
29
|
+
footerSlot?: ReactNode;
|
|
30
|
+
/** Extra className on the form. */
|
|
31
|
+
className?: string;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Generic, brand-less one-time-code verification page.
|
|
35
|
+
*/
|
|
36
|
+
export declare function OtpPage({ brandName, logo, title, subtitle, length, submitLabel, resendLabel, otpLabel, onSubmit, onResend, headerSlot, footerSlot, className, }: OtpPageProps): import("react/jsx-runtime").JSX.Element;
|
|
37
|
+
//# sourceMappingURL=otp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"otp.d.ts","sourceRoot":"","sources":["../../src/pages/otp.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AA4BtC,MAAM,MAAM,SAAS,GAAG;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,CAAA;AAEvC,MAAM,WAAW,YAAY;IAC3B,0BAA0B;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,iBAAiB;IACjB,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB,eAAe;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,6BAA6B;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,2BAA2B;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,2BAA2B;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,uBAAuB;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,sBAAsB;IACtB,QAAQ,EAAE,CAAC,MAAM,EAAE,SAAS,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;IACrD,iEAAiE;IACjE,QAAQ,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;IACrC,2DAA2D;IAC3D,UAAU,CAAC,EAAE,SAAS,CAAA;IACtB,6CAA6C;IAC7C,UAAU,CAAC,EAAE,SAAS,CAAA;IACtB,mCAAmC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,EACtB,SAAS,EACT,IAAI,EACJ,KAAgC,EAChC,QAAQ,EACR,MAAU,EACV,WAAyB,EACzB,WAA+B,EAC/B,QAAmB,EACnB,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,UAAU,EACV,SAAS,GACV,EAAE,YAAY,2CA+Fd"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from 'react';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
import { useForm } from 'react-hook-form';
|
|
5
|
+
import { zodResolver } from '@hookform/resolvers/zod';
|
|
6
|
+
import { Loader2 } from 'lucide-react';
|
|
7
|
+
import { Button, Form, FormControl, FormField, FormItem, FormLabel, FormMessage, InputOTP, InputOTPGroup, InputOTPSlot, } from '@asteby/metacore-ui/primitives';
|
|
8
|
+
import { cn } from '@asteby/metacore-ui/lib';
|
|
9
|
+
function buildSchema(length) {
|
|
10
|
+
return z.object({
|
|
11
|
+
otp: z
|
|
12
|
+
.string()
|
|
13
|
+
.min(length, `Por favor, ingresa el código de ${length} dígitos.`)
|
|
14
|
+
.max(length, `Por favor, ingresa el código de ${length} dígitos.`),
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Generic, brand-less one-time-code verification page.
|
|
19
|
+
*/
|
|
20
|
+
export function OtpPage({ brandName, logo, title = 'Código de verificación', subtitle, length = 6, submitLabel = 'Verificar', resendLabel = 'Reenviar código', otpLabel = 'Código', onSubmit, onResend, headerSlot, footerSlot, className, }) {
|
|
21
|
+
const [isLoading, setIsLoading] = useState(false);
|
|
22
|
+
const [isResending, setIsResending] = useState(false);
|
|
23
|
+
const schema = buildSchema(length);
|
|
24
|
+
const form = useForm({
|
|
25
|
+
resolver: zodResolver(schema),
|
|
26
|
+
defaultValues: { otp: '' },
|
|
27
|
+
});
|
|
28
|
+
async function handleSubmit(data) {
|
|
29
|
+
setIsLoading(true);
|
|
30
|
+
try {
|
|
31
|
+
await onSubmit(data);
|
|
32
|
+
}
|
|
33
|
+
finally {
|
|
34
|
+
setIsLoading(false);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
async function handleResend() {
|
|
38
|
+
if (!onResend)
|
|
39
|
+
return;
|
|
40
|
+
setIsResending(true);
|
|
41
|
+
try {
|
|
42
|
+
await onResend();
|
|
43
|
+
}
|
|
44
|
+
finally {
|
|
45
|
+
setIsResending(false);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return (_jsx("div", { className: 'h-svh flex overflow-hidden', children: _jsxs("div", { className: 'w-full flex flex-col bg-background', children: [(logo || brandName) && (_jsx("div", { className: 'px-6 pt-8 pb-4 lg:px-12 max-w-md mx-auto w-full', children: _jsxs("div", { className: 'flex items-center justify-center gap-2', children: [logo, brandName && _jsx("span", { className: 'text-lg font-semibold', children: brandName })] }) })), _jsxs("div", { className: 'flex-1 flex flex-col justify-center px-6 lg:px-12 max-w-md mx-auto w-full', children: [_jsxs("div", { className: 'mb-8 text-center', children: [_jsx("h1", { className: 'text-2xl font-bold tracking-tight', children: title }), subtitle && (_jsx("p", { className: 'text-muted-foreground text-sm mt-1', children: subtitle })), headerSlot] }), _jsx(Form, { ...form, children: _jsxs("form", { onSubmit: form.handleSubmit(handleSubmit), className: cn('space-y-4', className), children: [_jsx(FormField, { control: form.control, name: 'otp', render: ({ field }) => (_jsxs(FormItem, { className: 'flex flex-col items-center', children: [_jsx(FormLabel, { className: 'sr-only', children: otpLabel }), _jsx(FormControl, { children: _jsx(InputOTP, { maxLength: length, ...field, children: _jsx(InputOTPGroup, { children: Array.from({ length }).map((_, i) => (_jsx(InputOTPSlot, { index: i }, i))) }) }) }), _jsx(FormMessage, {})] })) }), _jsx(Button, { className: 'w-full h-10', disabled: isLoading, children: isLoading ? _jsx(Loader2, { className: 'animate-spin' }) : submitLabel }), onResend && (_jsx(Button, { type: 'button', variant: 'ghost', className: 'w-full', disabled: isResending, onClick: handleResend, children: isResending ? _jsx(Loader2, { className: 'animate-spin' }) : resendLabel })), footerSlot] }) })] })] }) }));
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=otp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"otp.js","sourceRoot":"","sources":["../../src/pages/otp.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
declare const formSchema: z.ZodObject<{
|
|
4
|
+
email: z.ZodString;
|
|
5
|
+
password: z.ZodString;
|
|
6
|
+
}, z.core.$strip>;
|
|
7
|
+
export type SignInValues = z.infer<typeof formSchema>;
|
|
8
|
+
export interface SignInPageProps {
|
|
9
|
+
/** Brand display name (e.g. `"Ops"`). No default — caller owns branding. */
|
|
10
|
+
brandName?: string;
|
|
11
|
+
/** Logo slot (any React node). */
|
|
12
|
+
logo?: ReactNode;
|
|
13
|
+
/**
|
|
14
|
+
* Showcase slot rendered on the right-hand side on lg+ viewports. Typically a
|
|
15
|
+
* marketing panel (module grid, hero illustration, etc.). If omitted, only
|
|
16
|
+
* the form column is rendered.
|
|
17
|
+
*/
|
|
18
|
+
showcase?: ReactNode;
|
|
19
|
+
/** Form heading. */
|
|
20
|
+
title?: string;
|
|
21
|
+
/** Form subtitle. */
|
|
22
|
+
subtitle?: string;
|
|
23
|
+
/** Submit-button label when idle. */
|
|
24
|
+
submitLabel?: string;
|
|
25
|
+
/**
|
|
26
|
+
* Submit handler. Receive `{ email, password }` + an optional `redirectTo`
|
|
27
|
+
* value passed through by the app. Resolve to signal success; reject to let
|
|
28
|
+
* the form surface an error.
|
|
29
|
+
*/
|
|
30
|
+
onSubmit: (values: SignInValues & {
|
|
31
|
+
redirectTo?: string;
|
|
32
|
+
}) => Promise<void> | void;
|
|
33
|
+
/** Optional upstream redirect target (from a route search param). */
|
|
34
|
+
redirectTo?: string;
|
|
35
|
+
/** Slot for extra links (e.g. "Forgot password?", "Sign up"). */
|
|
36
|
+
headerSlot?: ReactNode;
|
|
37
|
+
/** Slot rendered below the submit button (e.g. terms copy, OAuth buttons). */
|
|
38
|
+
footerSlot?: ReactNode;
|
|
39
|
+
/** Forgot-password link shown above the password input. */
|
|
40
|
+
forgotPasswordSlot?: ReactNode;
|
|
41
|
+
/** Email-field label. */
|
|
42
|
+
emailLabel?: string;
|
|
43
|
+
/** Password-field label. */
|
|
44
|
+
passwordLabel?: string;
|
|
45
|
+
/** Extra className on the form element. */
|
|
46
|
+
className?: string;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Generic, brand-less sign-in page. Owns the form + client validation, delegates
|
|
50
|
+
* the network call to `onSubmit`.
|
|
51
|
+
*/
|
|
52
|
+
export declare function SignInPage({ brandName, logo, showcase, title, subtitle, submitLabel, onSubmit, redirectTo, headerSlot, footerSlot, forgotPasswordSlot, emailLabel, passwordLabel, className, }: SignInPageProps): import("react/jsx-runtime").JSX.Element;
|
|
53
|
+
export {};
|
|
54
|
+
//# sourceMappingURL=sign-in.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sign-in.d.ts","sourceRoot":"","sources":["../../src/pages/sign-in.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACtC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAiBvB,QAAA,MAAM,UAAU;;;iBASd,CAAA;AAEF,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAA;AAErD,MAAM,WAAW,eAAe;IAC9B,4EAA4E;IAC5E,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,kCAAkC;IAClC,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAA;IACpB,oBAAoB;IACpB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,qBAAqB;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,qCAAqC;IACrC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB;;;;OAIG;IACH,QAAQ,EAAE,CAAC,MAAM,EAAE,YAAY,GAAG;QAAE,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;IAClF,qEAAqE;IACrE,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,iEAAiE;IACjE,UAAU,CAAC,EAAE,SAAS,CAAA;IACtB,8EAA8E;IAC9E,UAAU,CAAC,EAAE,SAAS,CAAA;IACtB,2DAA2D;IAC3D,kBAAkB,CAAC,EAAE,SAAS,CAAA;IAC9B,yBAAyB;IACzB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,4BAA4B;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,2CAA2C;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,EACzB,SAAS,EACT,IAAI,EACJ,QAAQ,EACR,KAAwB,EACxB,QAAQ,EACR,WAAsB,EACtB,QAAQ,EACR,UAAU,EACV,UAAU,EACV,UAAU,EACV,kBAAkB,EAClB,UAAiC,EACjC,aAA4B,EAC5B,SAAS,GACV,EAAE,eAAe,2CA2GjB"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from 'react';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
import { useForm } from 'react-hook-form';
|
|
5
|
+
import { zodResolver } from '@hookform/resolvers/zod';
|
|
6
|
+
import { Loader2 } from 'lucide-react';
|
|
7
|
+
import { Button, Form, FormControl, FormField, FormItem, FormLabel, FormMessage, Input, } from '@asteby/metacore-ui/primitives';
|
|
8
|
+
import { cn } from '@asteby/metacore-ui/lib';
|
|
9
|
+
import { PasswordInput } from '../components/password-input';
|
|
10
|
+
const formSchema = z.object({
|
|
11
|
+
email: z
|
|
12
|
+
.string()
|
|
13
|
+
.min(1, 'Por favor, ingresa tu correo electrónico')
|
|
14
|
+
.email('Correo electrónico inválido'),
|
|
15
|
+
password: z
|
|
16
|
+
.string()
|
|
17
|
+
.min(1, 'Por favor, ingresa tu contraseña')
|
|
18
|
+
.min(7, 'La contraseña debe tener al menos 7 caracteres'),
|
|
19
|
+
});
|
|
20
|
+
/**
|
|
21
|
+
* Generic, brand-less sign-in page. Owns the form + client validation, delegates
|
|
22
|
+
* the network call to `onSubmit`.
|
|
23
|
+
*/
|
|
24
|
+
export function SignInPage({ brandName, logo, showcase, title = 'Iniciar sesión', subtitle, submitLabel = 'Entrar', onSubmit, redirectTo, headerSlot, footerSlot, forgotPasswordSlot, emailLabel = 'Correo electrónico', passwordLabel = 'Contraseña', className, }) {
|
|
25
|
+
const [isLoading, setIsLoading] = useState(false);
|
|
26
|
+
const form = useForm({
|
|
27
|
+
resolver: zodResolver(formSchema),
|
|
28
|
+
defaultValues: { email: '', password: '' },
|
|
29
|
+
});
|
|
30
|
+
async function handleSubmit(data) {
|
|
31
|
+
setIsLoading(true);
|
|
32
|
+
try {
|
|
33
|
+
await onSubmit({ ...data, redirectTo });
|
|
34
|
+
}
|
|
35
|
+
finally {
|
|
36
|
+
setIsLoading(false);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return (_jsxs("div", { className: 'h-svh flex overflow-hidden', children: [_jsxs("div", { className: 'w-full lg:w-[45%] flex flex-col bg-background', children: [(logo || brandName || headerSlot) && (_jsx("div", { className: 'px-6 pt-8 pb-4 lg:px-12 xl:px-16 max-w-md mx-auto w-full', children: _jsxs("div", { className: 'flex items-center justify-center gap-3', children: [(logo || brandName) && (_jsxs("div", { className: 'inline-flex items-center gap-2', children: [logo, brandName && _jsx("span", { className: 'text-lg font-semibold', children: brandName })] })), headerSlot && (_jsxs(_Fragment, { children: [_jsx("span", { className: 'text-muted-foreground/50', children: "|" }), _jsx("div", { className: 'text-sm text-muted-foreground', children: headerSlot })] }))] }) })), _jsxs("div", { className: 'flex-1 flex flex-col justify-center px-6 lg:px-12 xl:px-16 max-w-md mx-auto w-full', children: [_jsxs("div", { className: 'mb-8 text-center lg:text-left', children: [_jsx("h1", { className: 'text-2xl font-bold tracking-tight', children: title }), subtitle && (_jsx("p", { className: 'text-muted-foreground text-sm mt-1', children: subtitle }))] }), _jsx(Form, { ...form, children: _jsxs("form", { onSubmit: form.handleSubmit(handleSubmit), className: cn('space-y-3', className), children: [_jsx(FormField, { control: form.control, name: 'email', render: ({ field }) => (_jsxs(FormItem, { children: [_jsx(FormLabel, { className: 'text-xs', children: emailLabel }), _jsx(FormControl, { children: _jsx(Input, { placeholder: 'tu@email.com', autoComplete: 'email', className: 'h-10', ...field }) }), _jsx(FormMessage, {})] })) }), _jsx(FormField, { control: form.control, name: 'password', render: ({ field }) => (_jsxs(FormItem, { className: 'relative', children: [_jsxs("div", { className: 'flex items-center justify-between', children: [_jsx(FormLabel, { className: 'text-xs', children: passwordLabel }), forgotPasswordSlot] }), _jsx(FormControl, { children: _jsx(PasswordInput, { placeholder: '********', autoComplete: 'current-password', className: 'h-10', ...field }) }), _jsx(FormMessage, {})] })) }), _jsx(Button, { className: 'w-full h-10', disabled: isLoading, children: isLoading ? _jsx(Loader2, { className: 'animate-spin' }) : submitLabel }), footerSlot] }) })] })] }), showcase && (_jsx("div", { className: 'hidden lg:flex lg:w-[55%] bg-muted/50 dark:bg-muted/20 flex-col justify-center relative overflow-hidden', children: showcase }))] }));
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=sign-in.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sign-in.js","sourceRoot":"","sources":["../../src/pages/sign-in.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAEhC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EACL,MAAM,EACN,IAAI,EACJ,WAAW,EACX,SAAS,EACT,QAAQ,EACR,SAAS,EACT,WAAW,EACX,KAAK,GACN,MAAM,gCAAgC,CAAA;AACvC,OAAO,EAAE,EAAE,EAAE,MAAM,yBAAyB,CAAA;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAA;AAE5D,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1B,KAAK,EAAE,CAAC;SACL,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,EAAE,0CAA0C,CAAC;SAClD,KAAK,CAAC,6BAA6B,CAAC;IACvC,QAAQ,EAAE,CAAC;SACR,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,EAAE,kCAAkC,CAAC;SAC1C,GAAG,CAAC,CAAC,EAAE,gDAAgD,CAAC;CAC5D,CAAC,CAAA;AA2CF;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,EACzB,SAAS,EACT,IAAI,EACJ,QAAQ,EACR,KAAK,GAAG,gBAAgB,EACxB,QAAQ,EACR,WAAW,GAAG,QAAQ,EACtB,QAAQ,EACR,UAAU,EACV,UAAU,EACV,UAAU,EACV,kBAAkB,EAClB,UAAU,GAAG,oBAAoB,EACjC,aAAa,GAAG,YAAY,EAC5B,SAAS,GACO;IAChB,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAEjD,MAAM,IAAI,GAAG,OAAO,CAAe;QACjC,QAAQ,EAAE,WAAW,CAAC,UAAU,CAAC;QACjC,aAAa,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;KAC3C,CAAC,CAAA;IAEF,KAAK,UAAU,YAAY,CAAC,IAAkB;QAC5C,YAAY,CAAC,IAAI,CAAC,CAAA;QAClB,IAAI,CAAC;YACH,MAAM,QAAQ,CAAC,EAAE,GAAG,IAAI,EAAE,UAAU,EAAE,CAAC,CAAA;QACzC,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,KAAK,CAAC,CAAA;QACrB,CAAC;IACH,CAAC;IAED,OAAO,CACL,eAAK,SAAS,EAAC,4BAA4B,aACzC,eAAK,SAAS,EAAC,+CAA+C,aAC3D,CAAC,IAAI,IAAI,SAAS,IAAI,UAAU,CAAC,IAAI,CACpC,cAAK,SAAS,EAAC,0DAA0D,YACvE,eAAK,SAAS,EAAC,wCAAwC,aACpD,CAAC,IAAI,IAAI,SAAS,CAAC,IAAI,CACtB,eAAK,SAAS,EAAC,gCAAgC,aAC5C,IAAI,EACJ,SAAS,IAAI,eAAM,SAAS,EAAC,uBAAuB,YAAE,SAAS,GAAQ,IACpE,CACP,EACA,UAAU,IAAI,CACb,8BACE,eAAM,SAAS,EAAC,0BAA0B,kBAAS,EACnD,cAAK,SAAS,EAAC,+BAA+B,YAAE,UAAU,GAAO,IAChE,CACJ,IACG,GACF,CACP,EAED,eAAK,SAAS,EAAC,oFAAoF,aACjG,eAAK,SAAS,EAAC,+BAA+B,aAC5C,aAAI,SAAS,EAAC,mCAAmC,YAAE,KAAK,GAAM,EAC7D,QAAQ,IAAI,CACX,YAAG,SAAS,EAAC,oCAAoC,YAAE,QAAQ,GAAK,CACjE,IACG,EAEN,KAAC,IAAI,OAAK,IAAI,YACZ,gBACE,QAAQ,EAAE,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,EACzC,SAAS,EAAE,EAAE,CAAC,WAAW,EAAE,SAAS,CAAC,aAErC,KAAC,SAAS,IACR,OAAO,EAAE,IAAI,CAAC,OAAO,EACrB,IAAI,EAAC,OAAO,EACZ,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CACrB,MAAC,QAAQ,eACP,KAAC,SAAS,IAAC,SAAS,EAAC,SAAS,YAAE,UAAU,GAAa,EACvD,KAAC,WAAW,cACV,KAAC,KAAK,IACJ,WAAW,EAAC,cAAc,EAC1B,YAAY,EAAC,OAAO,EACpB,SAAS,EAAC,MAAM,KACZ,KAAK,GACT,GACU,EACd,KAAC,WAAW,KAAG,IACN,CACZ,GACD,EACF,KAAC,SAAS,IACR,OAAO,EAAE,IAAI,CAAC,OAAO,EACrB,IAAI,EAAC,UAAU,EACf,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CACrB,MAAC,QAAQ,IAAC,SAAS,EAAC,UAAU,aAC5B,eAAK,SAAS,EAAC,mCAAmC,aAChD,KAAC,SAAS,IAAC,SAAS,EAAC,SAAS,YAAE,aAAa,GAAa,EACzD,kBAAkB,IACf,EACN,KAAC,WAAW,cACV,KAAC,aAAa,IACZ,WAAW,EAAC,UAAU,EACtB,YAAY,EAAC,kBAAkB,EAC/B,SAAS,EAAC,MAAM,KACZ,KAAK,GACT,GACU,EACd,KAAC,WAAW,KAAG,IACN,CACZ,GACD,EACF,KAAC,MAAM,IAAC,SAAS,EAAC,aAAa,EAAC,QAAQ,EAAE,SAAS,YAChD,SAAS,CAAC,CAAC,CAAC,KAAC,OAAO,IAAC,SAAS,EAAC,cAAc,GAAG,CAAC,CAAC,CAAC,WAAW,GACxD,EACR,UAAU,IACN,GACF,IACH,IACF,EAEL,QAAQ,IAAI,CACX,cAAK,SAAS,EAAC,yGAAyG,YACrH,QAAQ,GACL,CACP,IACG,CACP,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
/**
|
|
4
|
+
* Single-step sign-up schema. Apps that need a multi-step wizard (e.g. Ops'
|
|
5
|
+
* account → organization → complete flow) should compose their own stepper
|
|
6
|
+
* using these building blocks — the kit ships a sensible default.
|
|
7
|
+
*
|
|
8
|
+
* TODO(compose): extract the Ops multi-step wizard into `SignUpWizard` once we
|
|
9
|
+
* have a second app that needs it. For now keep the interface simple.
|
|
10
|
+
*/
|
|
11
|
+
declare const formSchema: z.ZodObject<{
|
|
12
|
+
name: z.ZodString;
|
|
13
|
+
email: z.ZodString;
|
|
14
|
+
password: z.ZodString;
|
|
15
|
+
confirmPassword: z.ZodString;
|
|
16
|
+
}, z.core.$strip>;
|
|
17
|
+
export type SignUpValues = z.infer<typeof formSchema>;
|
|
18
|
+
export interface SignUpPageProps {
|
|
19
|
+
brandName?: string;
|
|
20
|
+
logo?: ReactNode;
|
|
21
|
+
showcase?: ReactNode;
|
|
22
|
+
title?: string;
|
|
23
|
+
subtitle?: string;
|
|
24
|
+
submitLabel?: string;
|
|
25
|
+
onSubmit: (values: SignUpValues) => Promise<void> | void;
|
|
26
|
+
headerSlot?: ReactNode;
|
|
27
|
+
footerSlot?: ReactNode;
|
|
28
|
+
className?: string;
|
|
29
|
+
}
|
|
30
|
+
export declare function SignUpPage({ brandName, logo, showcase, title, subtitle, submitLabel, onSubmit, headerSlot, footerSlot, className, }: SignUpPageProps): import("react/jsx-runtime").JSX.Element;
|
|
31
|
+
export {};
|
|
32
|
+
//# sourceMappingURL=sign-up.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sign-up.d.ts","sourceRoot":"","sources":["../../src/pages/sign-up.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACtC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAiBvB;;;;;;;GAOG;AACH,QAAA,MAAM,UAAU;;;;;iBAaZ,CAAA;AAEJ,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAA;AAErD,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB,QAAQ,CAAC,EAAE,SAAS,CAAA;IACpB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;IACxD,UAAU,CAAC,EAAE,SAAS,CAAA;IACtB,UAAU,CAAC,EAAE,SAAS,CAAA;IACtB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,wBAAgB,UAAU,CAAC,EACzB,SAAS,EACT,IAAI,EACJ,QAAQ,EACR,KAAwB,EACxB,QAAQ,EACR,WAA4B,EAC5B,QAAQ,EACR,UAAU,EACV,UAAU,EACV,SAAS,GACV,EAAE,eAAe,2CAyIjB"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from 'react';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
import { useForm } from 'react-hook-form';
|
|
5
|
+
import { zodResolver } from '@hookform/resolvers/zod';
|
|
6
|
+
import { Loader2 } from 'lucide-react';
|
|
7
|
+
import { Button, Form, FormControl, FormField, FormItem, FormLabel, FormMessage, Input, } from '@asteby/metacore-ui/primitives';
|
|
8
|
+
import { cn } from '@asteby/metacore-ui/lib';
|
|
9
|
+
import { PasswordInput } from '../components/password-input';
|
|
10
|
+
/**
|
|
11
|
+
* Single-step sign-up schema. Apps that need a multi-step wizard (e.g. Ops'
|
|
12
|
+
* account → organization → complete flow) should compose their own stepper
|
|
13
|
+
* using these building blocks — the kit ships a sensible default.
|
|
14
|
+
*
|
|
15
|
+
* TODO(compose): extract the Ops multi-step wizard into `SignUpWizard` once we
|
|
16
|
+
* have a second app that needs it. For now keep the interface simple.
|
|
17
|
+
*/
|
|
18
|
+
const formSchema = z
|
|
19
|
+
.object({
|
|
20
|
+
name: z.string().min(1, 'Ingresa tu nombre completo'),
|
|
21
|
+
email: z.string().email('Ingresa un correo válido'),
|
|
22
|
+
password: z
|
|
23
|
+
.string()
|
|
24
|
+
.min(1, 'Ingresa una contraseña')
|
|
25
|
+
.min(7, 'Mínimo 7 caracteres'),
|
|
26
|
+
confirmPassword: z.string().min(1, 'Confirma tu contraseña'),
|
|
27
|
+
})
|
|
28
|
+
.refine((data) => data.password === data.confirmPassword, {
|
|
29
|
+
message: 'Las contraseñas no coinciden',
|
|
30
|
+
path: ['confirmPassword'],
|
|
31
|
+
});
|
|
32
|
+
export function SignUpPage({ brandName, logo, showcase, title = 'Crea tu cuenta', subtitle, submitLabel = 'Crear cuenta', onSubmit, headerSlot, footerSlot, className, }) {
|
|
33
|
+
const [isLoading, setIsLoading] = useState(false);
|
|
34
|
+
const form = useForm({
|
|
35
|
+
resolver: zodResolver(formSchema),
|
|
36
|
+
defaultValues: {
|
|
37
|
+
name: '',
|
|
38
|
+
email: '',
|
|
39
|
+
password: '',
|
|
40
|
+
confirmPassword: '',
|
|
41
|
+
},
|
|
42
|
+
});
|
|
43
|
+
async function handleSubmit(data) {
|
|
44
|
+
setIsLoading(true);
|
|
45
|
+
try {
|
|
46
|
+
await onSubmit(data);
|
|
47
|
+
}
|
|
48
|
+
finally {
|
|
49
|
+
setIsLoading(false);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return (_jsxs("div", { className: 'h-svh flex overflow-hidden', children: [_jsxs("div", { className: 'w-full lg:w-[45%] flex flex-col', children: [(logo || brandName || headerSlot) && (_jsx("div", { className: 'px-6 pt-8 pb-4 lg:px-12 xl:px-16 max-w-md mx-auto w-full', children: _jsxs("div", { className: 'flex items-center justify-center gap-3', children: [(logo || brandName) && (_jsxs("div", { className: 'inline-flex items-center gap-2', children: [logo, brandName && _jsx("span", { className: 'text-lg font-semibold', children: brandName })] })), headerSlot && (_jsxs(_Fragment, { children: [_jsx("span", { className: 'text-muted-foreground/50', children: "|" }), _jsx("div", { className: 'text-sm text-muted-foreground', children: headerSlot })] }))] }) })), _jsxs("div", { className: 'flex-1 flex flex-col justify-center px-6 lg:px-12 xl:px-16 max-w-md mx-auto w-full overflow-y-auto', children: [_jsxs("div", { className: 'mb-8 text-center lg:text-left', children: [_jsx("h2", { className: 'text-2xl font-bold tracking-tight', children: title }), subtitle && (_jsx("p", { className: 'text-muted-foreground text-sm mt-1', children: subtitle }))] }), _jsx(Form, { ...form, children: _jsxs("form", { onSubmit: form.handleSubmit(handleSubmit), className: cn('space-y-3', className), children: [_jsx(FormField, { control: form.control, name: 'name', render: ({ field }) => (_jsxs(FormItem, { children: [_jsx(FormLabel, { className: 'text-xs', children: "Nombre completo" }), _jsx(FormControl, { children: _jsx(Input, { placeholder: 'Mar\u00EDa Garc\u00EDa', className: 'h-9', ...field }) }), _jsx(FormMessage, {})] })) }), _jsx(FormField, { control: form.control, name: 'email', render: ({ field }) => (_jsxs(FormItem, { children: [_jsx(FormLabel, { className: 'text-xs', children: "Correo electr\u00F3nico" }), _jsx(FormControl, { children: _jsx(Input, { type: 'email', placeholder: 'maria@empresa.com', className: 'h-9', ...field }) }), _jsx(FormMessage, {})] })) }), _jsxs("div", { className: 'grid grid-cols-2 gap-3', children: [_jsx(FormField, { control: form.control, name: 'password', render: ({ field }) => (_jsxs(FormItem, { children: [_jsx(FormLabel, { className: 'text-xs', children: "Contrase\u00F1a" }), _jsx(FormControl, { children: _jsx(PasswordInput, { placeholder: '********', ...field }) }), _jsx(FormMessage, {})] })) }), _jsx(FormField, { control: form.control, name: 'confirmPassword', render: ({ field }) => (_jsxs(FormItem, { children: [_jsx(FormLabel, { className: 'text-xs', children: "Confirmar" }), _jsx(FormControl, { children: _jsx(PasswordInput, { placeholder: '********', ...field }) }), _jsx(FormMessage, {})] })) })] }), _jsx(Button, { type: 'submit', className: 'w-full h-10', disabled: isLoading, children: isLoading ? _jsx(Loader2, { className: 'animate-spin' }) : submitLabel }), footerSlot] }) })] })] }), showcase && (_jsx("div", { className: 'hidden lg:flex lg:w-[55%] bg-muted/50 dark:bg-muted/20 flex-col justify-center relative overflow-hidden', children: showcase }))] }));
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=sign-up.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sign-up.js","sourceRoot":"","sources":["../../src/pages/sign-up.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAEhC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EACL,MAAM,EACN,IAAI,EACJ,WAAW,EACX,SAAS,EACT,QAAQ,EACR,SAAS,EACT,WAAW,EACX,KAAK,GACN,MAAM,gCAAgC,CAAA;AACvC,OAAO,EAAE,EAAE,EAAE,MAAM,yBAAyB,CAAA;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAA;AAE5D;;;;;;;GAOG;AACH,MAAM,UAAU,GAAG,CAAC;KACjB,MAAM,CAAC;IACN,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,4BAA4B,CAAC;IACrD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,0BAA0B,CAAC;IACnD,QAAQ,EAAE,CAAC;SACR,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,EAAE,wBAAwB,CAAC;SAChC,GAAG,CAAC,CAAC,EAAE,qBAAqB,CAAC;IAChC,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,wBAAwB,CAAC;CAC7D,CAAC;KACD,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,eAAe,EAAE;IACxD,OAAO,EAAE,8BAA8B;IACvC,IAAI,EAAE,CAAC,iBAAiB,CAAC;CAC1B,CAAC,CAAA;AAiBJ,MAAM,UAAU,UAAU,CAAC,EACzB,SAAS,EACT,IAAI,EACJ,QAAQ,EACR,KAAK,GAAG,gBAAgB,EACxB,QAAQ,EACR,WAAW,GAAG,cAAc,EAC5B,QAAQ,EACR,UAAU,EACV,UAAU,EACV,SAAS,GACO;IAChB,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAEjD,MAAM,IAAI,GAAG,OAAO,CAAe;QACjC,QAAQ,EAAE,WAAW,CAAC,UAAU,CAAC;QACjC,aAAa,EAAE;YACb,IAAI,EAAE,EAAE;YACR,KAAK,EAAE,EAAE;YACT,QAAQ,EAAE,EAAE;YACZ,eAAe,EAAE,EAAE;SACpB;KACF,CAAC,CAAA;IAEF,KAAK,UAAU,YAAY,CAAC,IAAkB;QAC5C,YAAY,CAAC,IAAI,CAAC,CAAA;QAClB,IAAI,CAAC;YACH,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAA;QACtB,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,KAAK,CAAC,CAAA;QACrB,CAAC;IACH,CAAC;IAED,OAAO,CACL,eAAK,SAAS,EAAC,4BAA4B,aACzC,eAAK,SAAS,EAAC,iCAAiC,aAC7C,CAAC,IAAI,IAAI,SAAS,IAAI,UAAU,CAAC,IAAI,CACpC,cAAK,SAAS,EAAC,0DAA0D,YACvE,eAAK,SAAS,EAAC,wCAAwC,aACpD,CAAC,IAAI,IAAI,SAAS,CAAC,IAAI,CACtB,eAAK,SAAS,EAAC,gCAAgC,aAC5C,IAAI,EACJ,SAAS,IAAI,eAAM,SAAS,EAAC,uBAAuB,YAAE,SAAS,GAAQ,IACpE,CACP,EACA,UAAU,IAAI,CACb,8BACE,eAAM,SAAS,EAAC,0BAA0B,kBAAS,EACnD,cAAK,SAAS,EAAC,+BAA+B,YAAE,UAAU,GAAO,IAChE,CACJ,IACG,GACF,CACP,EAED,eAAK,SAAS,EAAC,oGAAoG,aACjH,eAAK,SAAS,EAAC,+BAA+B,aAC5C,aAAI,SAAS,EAAC,mCAAmC,YAAE,KAAK,GAAM,EAC7D,QAAQ,IAAI,CACX,YAAG,SAAS,EAAC,oCAAoC,YAAE,QAAQ,GAAK,CACjE,IACG,EAEN,KAAC,IAAI,OAAK,IAAI,YACZ,gBACE,QAAQ,EAAE,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,EACzC,SAAS,EAAE,EAAE,CAAC,WAAW,EAAE,SAAS,CAAC,aAErC,KAAC,SAAS,IACR,OAAO,EAAE,IAAI,CAAC,OAAO,EACrB,IAAI,EAAC,MAAM,EACX,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CACrB,MAAC,QAAQ,eACP,KAAC,SAAS,IAAC,SAAS,EAAC,SAAS,gCAA4B,EAC1D,KAAC,WAAW,cACV,KAAC,KAAK,IAAC,WAAW,EAAC,wBAAc,EAAC,SAAS,EAAC,KAAK,KAAK,KAAK,GAAI,GACnD,EACd,KAAC,WAAW,KAAG,IACN,CACZ,GACD,EAEF,KAAC,SAAS,IACR,OAAO,EAAE,IAAI,CAAC,OAAO,EACrB,IAAI,EAAC,OAAO,EACZ,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CACrB,MAAC,QAAQ,eACP,KAAC,SAAS,IAAC,SAAS,EAAC,SAAS,wCAA+B,EAC7D,KAAC,WAAW,cACV,KAAC,KAAK,IACJ,IAAI,EAAC,OAAO,EACZ,WAAW,EAAC,mBAAmB,EAC/B,SAAS,EAAC,KAAK,KACX,KAAK,GACT,GACU,EACd,KAAC,WAAW,KAAG,IACN,CACZ,GACD,EAEF,eAAK,SAAS,EAAC,wBAAwB,aACrC,KAAC,SAAS,IACR,OAAO,EAAE,IAAI,CAAC,OAAO,EACrB,IAAI,EAAC,UAAU,EACf,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CACrB,MAAC,QAAQ,eACP,KAAC,SAAS,IAAC,SAAS,EAAC,SAAS,gCAAuB,EACrD,KAAC,WAAW,cACV,KAAC,aAAa,IAAC,WAAW,EAAC,UAAU,KAAK,KAAK,GAAI,GACvC,EACd,KAAC,WAAW,KAAG,IACN,CACZ,GACD,EAEF,KAAC,SAAS,IACR,OAAO,EAAE,IAAI,CAAC,OAAO,EACrB,IAAI,EAAC,iBAAiB,EACtB,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CACrB,MAAC,QAAQ,eACP,KAAC,SAAS,IAAC,SAAS,EAAC,SAAS,0BAAsB,EACpD,KAAC,WAAW,cACV,KAAC,aAAa,IAAC,WAAW,EAAC,UAAU,KAAK,KAAK,GAAI,GACvC,EACd,KAAC,WAAW,KAAG,IACN,CACZ,GACD,IACE,EAEN,KAAC,MAAM,IAAC,IAAI,EAAC,QAAQ,EAAC,SAAS,EAAC,aAAa,EAAC,QAAQ,EAAE,SAAS,YAC9D,SAAS,CAAC,CAAC,CAAC,KAAC,OAAO,IAAC,SAAS,EAAC,cAAc,GAAG,CAAC,CAAC,CAAC,WAAW,GACxD,EAER,UAAU,IACN,GACF,IACH,IACF,EAEL,QAAQ,IAAI,CACX,cAAK,SAAS,EAAC,yGAAyG,YACrH,QAAQ,GACL,CACP,IACG,CACP,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
interface User {
|
|
3
|
+
name: string;
|
|
4
|
+
email: string;
|
|
5
|
+
role: string;
|
|
6
|
+
avatar: string;
|
|
7
|
+
}
|
|
8
|
+
interface AuthContextType {
|
|
9
|
+
user: User | null;
|
|
10
|
+
login: (email: string, role: string) => void;
|
|
11
|
+
logout: () => void;
|
|
12
|
+
isAuthenticated: boolean;
|
|
13
|
+
}
|
|
14
|
+
export interface AuthProviderProps {
|
|
15
|
+
children: ReactNode;
|
|
16
|
+
/**
|
|
17
|
+
* localStorage key used to persist the lightweight user object.
|
|
18
|
+
* Default: `saas_user`
|
|
19
|
+
*/
|
|
20
|
+
storageKey?: string;
|
|
21
|
+
/**
|
|
22
|
+
* Path to navigate to on `logout()`. Default: `/sign-in`.
|
|
23
|
+
*/
|
|
24
|
+
signInPath?: string;
|
|
25
|
+
/**
|
|
26
|
+
* Default avatar URL injected into the lightweight user returned by
|
|
27
|
+
* `login(email, role)`. Apps can override per-use by calling
|
|
28
|
+
* `useAuthStore().setUser()` directly with the full user payload.
|
|
29
|
+
*/
|
|
30
|
+
defaultAvatar?: string;
|
|
31
|
+
}
|
|
32
|
+
export declare function AuthProvider({ children, storageKey, signInPath, defaultAvatar, }: AuthProviderProps): import("react/jsx-runtime").JSX.Element;
|
|
33
|
+
export declare function useAuth(): AuthContextType;
|
|
34
|
+
export {};
|
|
35
|
+
//# sourceMappingURL=provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../src/provider.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAGtC,UAAU,IAAI;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;CACf;AAED,UAAU,eAAe;IACvB,IAAI,EAAE,IAAI,GAAG,IAAI,CAAA;IACjB,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAC5C,MAAM,EAAE,MAAM,IAAI,CAAA;IAClB,eAAe,EAAE,OAAO,CAAA;CACzB;AAID,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,SAAS,CAAA;IACnB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAED,wBAAgB,YAAY,CAAC,EAC3B,QAAQ,EACR,UAAwB,EACxB,UAAuB,EACvB,aAAkB,GACnB,EAAE,iBAAiB,2CA0CnB;AAED,wBAAgB,OAAO,oBAMtB"}
|
package/dist/provider.js
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { createContext, useContext, useEffect, useState } from 'react';
|
|
3
|
+
import { useNavigate } from '@tanstack/react-router';
|
|
4
|
+
const AuthContext = createContext(undefined);
|
|
5
|
+
export function AuthProvider({ children, storageKey = 'saas_user', signInPath = '/sign-in', defaultAvatar = '', }) {
|
|
6
|
+
const navigate = useNavigate();
|
|
7
|
+
const [user, setUser] = useState(null);
|
|
8
|
+
// Load user from localStorage on mount (simple persistence)
|
|
9
|
+
useEffect(() => {
|
|
10
|
+
const storedUser = localStorage.getItem(storageKey);
|
|
11
|
+
if (storedUser) {
|
|
12
|
+
try {
|
|
13
|
+
setUser(JSON.parse(storedUser));
|
|
14
|
+
}
|
|
15
|
+
catch (e) {
|
|
16
|
+
console.error('Failed to parse user from storage', e);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}, [storageKey]);
|
|
20
|
+
const login = (email, role) => {
|
|
21
|
+
const emailLocal = email.split('@')[0] ?? email;
|
|
22
|
+
const newUser = {
|
|
23
|
+
name: emailLocal,
|
|
24
|
+
email,
|
|
25
|
+
role,
|
|
26
|
+
avatar: defaultAvatar,
|
|
27
|
+
};
|
|
28
|
+
setUser(newUser);
|
|
29
|
+
localStorage.setItem(storageKey, JSON.stringify(newUser));
|
|
30
|
+
};
|
|
31
|
+
const logout = () => {
|
|
32
|
+
setUser(null);
|
|
33
|
+
localStorage.removeItem(storageKey);
|
|
34
|
+
localStorage.removeItem('auth-storage');
|
|
35
|
+
// Note: host app is expected to have `signInPath` in its route tree; cast to any
|
|
36
|
+
// so we don't require callers to register a literal type here.
|
|
37
|
+
navigate({ to: signInPath });
|
|
38
|
+
};
|
|
39
|
+
return (_jsx(AuthContext.Provider, { value: { user, login, logout, isAuthenticated: !!user }, children: children }));
|
|
40
|
+
}
|
|
41
|
+
export function useAuth() {
|
|
42
|
+
const context = useContext(AuthContext);
|
|
43
|
+
if (context === undefined) {
|
|
44
|
+
throw new Error('useAuth must be used within an AuthProvider');
|
|
45
|
+
}
|
|
46
|
+
return context;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAEtE,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AAgBpD,MAAM,WAAW,GAAG,aAAa,CAA8B,SAAS,CAAC,CAAA;AAqBzE,MAAM,UAAU,YAAY,CAAC,EAC3B,QAAQ,EACR,UAAU,GAAG,WAAW,EACxB,UAAU,GAAG,UAAU,EACvB,aAAa,GAAG,EAAE,GACA;IAClB,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAA;IAC9B,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAc,IAAI,CAAC,CAAA;IAEnD,4DAA4D;IAC5D,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,UAAU,GAAG,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;QACnD,IAAI,UAAU,EAAE,CAAC;YACf,IAAI,CAAC;gBACH,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAS,CAAC,CAAA;YACzC,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,OAAO,CAAC,KAAK,CAAC,mCAAmC,EAAE,CAAC,CAAC,CAAA;YACvD,CAAC;QACH,CAAC;IACH,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAA;IAEhB,MAAM,KAAK,GAAG,CAAC,KAAa,EAAE,IAAY,EAAE,EAAE;QAC5C,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAA;QAC/C,MAAM,OAAO,GAAS;YACpB,IAAI,EAAE,UAAU;YAChB,KAAK;YACL,IAAI;YACJ,MAAM,EAAE,aAAa;SACtB,CAAA;QACD,OAAO,CAAC,OAAO,CAAC,CAAA;QAChB,YAAY,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAA;IAC3D,CAAC,CAAA;IAED,MAAM,MAAM,GAAG,GAAG,EAAE;QAClB,OAAO,CAAC,IAAI,CAAC,CAAA;QACb,YAAY,CAAC,UAAU,CAAC,UAAU,CAAC,CAAA;QACnC,YAAY,CAAC,UAAU,CAAC,cAAc,CAAC,CAAA;QACvC,iFAAiF;QACjF,+DAA+D;QAC/D,QAAQ,CAAC,EAAE,EAAE,EAAE,UAAmB,EAAE,CAAC,CAAA;IACvC,CAAC,CAAA;IAED,OAAO,CACL,KAAC,WAAW,CAAC,QAAQ,IAAC,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC,IAAI,EAAE,YAC1E,QAAQ,GACY,CACxB,CAAA;AACH,CAAC;AAED,MAAM,UAAU,OAAO;IACrB,MAAM,OAAO,GAAG,UAAU,CAAC,WAAW,CAAC,CAAA;IACvC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAA;IAChE,CAAC;IACD,OAAO,OAAO,CAAA;AAChB,CAAC"}
|
package/dist/store.d.ts
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
export interface AuthUser {
|
|
2
|
+
id: string;
|
|
3
|
+
email: string;
|
|
4
|
+
name: string;
|
|
5
|
+
role: string;
|
|
6
|
+
avatar?: string;
|
|
7
|
+
organization_id?: string;
|
|
8
|
+
organization_name?: string;
|
|
9
|
+
organization_logo?: string;
|
|
10
|
+
plan_slug?: string;
|
|
11
|
+
plan_name?: string;
|
|
12
|
+
subscription_status?: 'trialing' | 'active' | 'past_due' | 'canceled' | 'unpaid';
|
|
13
|
+
current_period_end?: string;
|
|
14
|
+
is_subscription_active?: boolean;
|
|
15
|
+
currency_code?: string;
|
|
16
|
+
timezone?: string;
|
|
17
|
+
checkout_mode?: 'integrated' | 'cashier';
|
|
18
|
+
fulfillment_mode?: 'auto' | 'warehouse';
|
|
19
|
+
tax_rate?: number;
|
|
20
|
+
tax_included?: boolean;
|
|
21
|
+
ticket_width?: number;
|
|
22
|
+
print_copies?: number;
|
|
23
|
+
auto_print?: boolean;
|
|
24
|
+
}
|
|
25
|
+
export interface AuthState {
|
|
26
|
+
auth: {
|
|
27
|
+
user: AuthUser | null;
|
|
28
|
+
setUser: (user: AuthUser | null) => void;
|
|
29
|
+
accessToken: string;
|
|
30
|
+
setAccessToken: (accessToken: string) => void;
|
|
31
|
+
resetAccessToken: () => void;
|
|
32
|
+
reset: () => void;
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
export declare const useAuthStore: import("zustand").UseBoundStore<import("zustand").StoreApi<AuthState>>;
|
|
36
|
+
export declare const AUTH_STORAGE_KEYS: {
|
|
37
|
+
readonly ACCESS_TOKEN: "auth_token";
|
|
38
|
+
readonly USER_STORAGE: "auth_user";
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAE1B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,mBAAmB,CAAC,EAAE,UAAU,GAAG,QAAQ,GAAG,UAAU,GAAG,UAAU,GAAG,QAAQ,CAAA;IAChF,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,sBAAsB,CAAC,EAAE,OAAO,CAAA;IAChC,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,aAAa,CAAC,EAAE,YAAY,GAAG,SAAS,CAAA;IACxC,gBAAgB,CAAC,EAAE,MAAM,GAAG,WAAW,CAAA;IACvC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE;QACJ,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAA;QACrB,OAAO,EAAE,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,KAAK,IAAI,CAAA;QACxC,WAAW,EAAE,MAAM,CAAA;QACnB,cAAc,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAA;QAC7C,gBAAgB,EAAE,MAAM,IAAI,CAAA;QAC5B,KAAK,EAAE,MAAM,IAAI,CAAA;KAClB,CAAA;CACF;AAED,eAAO,MAAM,YAAY,wEA4CvB,CAAA;AAEF,eAAO,MAAM,iBAAiB;;;CAGpB,CAAA"}
|
package/dist/store.js
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { create } from 'zustand';
|
|
2
|
+
const ACCESS_TOKEN = 'auth_token';
|
|
3
|
+
const USER_STORAGE = 'auth_user';
|
|
4
|
+
export const useAuthStore = create()((set) => {
|
|
5
|
+
const token = typeof localStorage !== 'undefined'
|
|
6
|
+
? localStorage.getItem(ACCESS_TOKEN) || ''
|
|
7
|
+
: '';
|
|
8
|
+
const storedUser = typeof localStorage !== 'undefined' ? localStorage.getItem(USER_STORAGE) : null;
|
|
9
|
+
const initialUser = storedUser ? JSON.parse(storedUser) : null;
|
|
10
|
+
return {
|
|
11
|
+
auth: {
|
|
12
|
+
user: initialUser,
|
|
13
|
+
setUser: (user) => set((state) => {
|
|
14
|
+
if (user) {
|
|
15
|
+
localStorage.setItem(USER_STORAGE, JSON.stringify(user));
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
localStorage.removeItem(USER_STORAGE);
|
|
19
|
+
}
|
|
20
|
+
return { ...state, auth: { ...state.auth, user } };
|
|
21
|
+
}),
|
|
22
|
+
accessToken: token,
|
|
23
|
+
setAccessToken: (accessToken) => set((state) => {
|
|
24
|
+
localStorage.setItem(ACCESS_TOKEN, accessToken);
|
|
25
|
+
return { ...state, auth: { ...state.auth, accessToken } };
|
|
26
|
+
}),
|
|
27
|
+
resetAccessToken: () => set((state) => {
|
|
28
|
+
localStorage.removeItem(ACCESS_TOKEN);
|
|
29
|
+
localStorage.removeItem(USER_STORAGE);
|
|
30
|
+
return { ...state, auth: { ...state.auth, accessToken: '', user: null } };
|
|
31
|
+
}),
|
|
32
|
+
reset: () => set((state) => {
|
|
33
|
+
localStorage.removeItem(ACCESS_TOKEN);
|
|
34
|
+
localStorage.removeItem(USER_STORAGE);
|
|
35
|
+
return {
|
|
36
|
+
...state,
|
|
37
|
+
auth: { ...state.auth, user: null, accessToken: '' },
|
|
38
|
+
};
|
|
39
|
+
}),
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
});
|
|
43
|
+
export const AUTH_STORAGE_KEYS = {
|
|
44
|
+
ACCESS_TOKEN,
|
|
45
|
+
USER_STORAGE,
|
|
46
|
+
};
|
|
47
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAEhC,MAAM,YAAY,GAAG,YAAY,CAAA;AACjC,MAAM,YAAY,GAAG,WAAW,CAAA;AAuChC,MAAM,CAAC,MAAM,YAAY,GAAG,MAAM,EAAa,CAAC,CAAC,GAAG,EAAE,EAAE;IACtD,MAAM,KAAK,GACT,OAAO,YAAY,KAAK,WAAW;QACjC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE;QAC1C,CAAC,CAAC,EAAE,CAAA;IACR,MAAM,UAAU,GACd,OAAO,YAAY,KAAK,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IACjF,MAAM,WAAW,GAAG,UAAU,CAAC,CAAC,CAAE,IAAI,CAAC,KAAK,CAAC,UAAU,CAAc,CAAC,CAAC,CAAC,IAAI,CAAA;IAE5E,OAAO;QACL,IAAI,EAAE;YACJ,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAChB,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;gBACZ,IAAI,IAAI,EAAE,CAAC;oBACT,YAAY,CAAC,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAA;gBAC1D,CAAC;qBAAM,CAAC;oBACN,YAAY,CAAC,UAAU,CAAC,YAAY,CAAC,CAAA;gBACvC,CAAC;gBACD,OAAO,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAA;YACpD,CAAC,CAAC;YACJ,WAAW,EAAE,KAAK;YAClB,cAAc,EAAE,CAAC,WAAW,EAAE,EAAE,CAC9B,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;gBACZ,YAAY,CAAC,OAAO,CAAC,YAAY,EAAE,WAAW,CAAC,CAAA;gBAC/C,OAAO,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE,WAAW,EAAE,EAAE,CAAA;YAC3D,CAAC,CAAC;YACJ,gBAAgB,EAAE,GAAG,EAAE,CACrB,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;gBACZ,YAAY,CAAC,UAAU,CAAC,YAAY,CAAC,CAAA;gBACrC,YAAY,CAAC,UAAU,CAAC,YAAY,CAAC,CAAA;gBACrC,OAAO,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAA;YAC3E,CAAC,CAAC;YACJ,KAAK,EAAE,GAAG,EAAE,CACV,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;gBACZ,YAAY,CAAC,UAAU,CAAC,YAAY,CAAC,CAAA;gBACrC,YAAY,CAAC,UAAU,CAAC,YAAY,CAAC,CAAA;gBACrC,OAAO;oBACL,GAAG,KAAK;oBACR,IAAI,EAAE,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE;iBACrD,CAAA;YACH,CAAC,CAAC;SACL;KACF,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,YAAY;IACZ,YAAY;CACJ,CAAA"}
|