export const register = async (prevState: unknown, formData: FormData) =>
Effect.gen(function* () {
const payload = Object.fromEntries(formData) as RegisterPayload;
const {
output: values,
success,
issues,
} = safeParse(RegisterPayloadSchema, payload);
if (!success)
return yield* Effect.succeed({
status: "validation" as const,
error: flatten(issues).nested as ValidationError,
...payload,
});
const existingUser = yield* UserRepository.findByEmail(values.email);
if (existingUser)
return yield* Effect.succeed({
status: "error" as const,
error: "Invalid credentials!" as const,
...values,
});
const hashedPassword = yield* Effect.tryPromise(() =>
hash(values.password, 10),
);
yield* UserRepository.insert({ ...values, password: hashedPassword });
yield* Effect.try(() => redirect("/auth/login"));
}).pipe(
Effect.catchAll((err) => {
console.log(err);
return Effect.succeed({
status: "error" as const,
error: "Something went wrong, try again!" as const,
});
}),
Effect.runPromise,
);
export const register = async (prevState: unknown, formData: FormData) =>
Effect.gen(function* () {
const payload = Object.fromEntries(formData) as RegisterPayload;
const {
output: values,
success,
issues,
} = safeParse(RegisterPayloadSchema, payload);
if (!success)
return yield* Effect.succeed({
status: "validation" as const,
error: flatten(issues).nested as ValidationError,
...payload,
});
const existingUser = yield* UserRepository.findByEmail(values.email);
if (existingUser)
return yield* Effect.succeed({
status: "error" as const,
error: "Invalid credentials!" as const,
...values,
});
const hashedPassword = yield* Effect.tryPromise(() =>
hash(values.password, 10),
);
yield* UserRepository.insert({ ...values, password: hashedPassword });
yield* Effect.try(() => redirect("/auth/login"));
}).pipe(
Effect.catchAll((err) => {
console.log(err);
return Effect.succeed({
status: "error" as const,
error: "Something went wrong, try again!" as const,
});
}),
Effect.runPromise,
);