diff --git a/pkgs/@scope/better-auth/mod.server.ts b/pkgs/@scope/better-auth/mod.server.ts
index b859ba3..3ffb9c1 100644
--- a/pkgs/@scope/better-auth/mod.server.ts
+++ b/pkgs/@scope/better-auth/mod.server.ts
@@ -2,6 +2,7 @@ import { passkey } from "@better-auth/passkey";
import { useDatabaseForBetterAuth } from "@scope/database/server";
import { betterAuth } from "better-auth";
import { admin, magicLink } from "better-auth/plugins";
+import { sendWelcomeEmail } from "./templates.tsx";
export const serverAuth = betterAuth({
database: useDatabaseForBetterAuth(),
@@ -13,9 +14,8 @@ export const serverAuth = betterAuth({
plugins: [
admin(),
magicLink({
- sendMagicLink({ email, token, url }) {
- // await sendWelcomeEmail();
- console.log("sendMagicLink", email, token, url);
+ async sendMagicLink({ email, url }) {
+ await sendWelcomeEmail({ data: { email, templateData: { url } } });
},
}),
passkey(),
diff --git a/pkgs/@scope/better-auth/templates.tsx b/pkgs/@scope/better-auth/templates.tsx
index 988a0aa..0e64acc 100644
--- a/pkgs/@scope/better-auth/templates.tsx
+++ b/pkgs/@scope/better-auth/templates.tsx
@@ -1,22 +1,41 @@
import { createServerFn } from "@tanstack/solid-start";
import { createTransport } from "nodemailer";
import { renderToStringAsync } from "solid-js/web";
+import * as v from "valibot";
+import { env } from "../../../src/data.functions/env.service.ts";
-const WelcomeEmailTemplate = () => {
- return
this is some JSX email template
;
+const WelcomeEmailTemplate = (props: { url: string }) => {
+ return (
+ <>
+ Welcome to doetlater
+ {props.url}
+ >
+ );
};
-const mailer = createTransport({
- host: "127.0.0.1",
- secure: false,
- port: 2525,
-});
-
-export const sendWelcomeEmail = createServerFn().handler(async () => {
- await mailer.sendMail({
- from: "no-reply.later@strooware.nl",
- to: "bas+testing@strootje.com",
- subject: "Welcome to the waitinglist",
- html: await renderToStringAsync(WelcomeEmailTemplate),
+const mailer = (opts: ReturnType["smtp"]) => {
+ return createTransport({
+ host: opts.host,
+ port: opts.port,
+ secure: false,
});
+};
+
+export const sendWelcomeEmail = createServerFn().inputValidator(v.object({
+ templateData: v.object({ url: v.string() }),
+ email: v.string(),
+})).handler(async ({ data }) => {
+ const html = await renderToStringAsync(() => );
+
+ if (!env().smtp.host) {
+ console.log("***NO SMTP HOST***");
+ console.log(html);
+ } else {
+ await mailer(env().smtp).sendMail({
+ from: "no-reply.later@strooware.nl",
+ subject: "Welcome to the waitinglist",
+ to: data.email,
+ html,
+ });
+ }
});
diff --git a/src/comps.ui.cards/todo-item.card.tsx b/src/comps.ui.cards/todo-item.card.tsx
index 4d0cb0f..94a038e 100644
--- a/src/comps.ui.cards/todo-item.card.tsx
+++ b/src/comps.ui.cards/todo-item.card.tsx
@@ -2,6 +2,7 @@ import type { clientModels } from "@scope/database/client";
import { cva, cx, type VariantProps } from "class-variance-authority";
import { addDays, formatISOWithOptions } from "date-fns/fp";
import { type ComponentProps, splitProps } from "solid-js";
+import { Icon } from "../comps.ui/icon.tsx";
import { Swiper } from "../comps.ui/swiper.tsx";
import { todoItemCollection } from "../data.collections/todo-item.collection.ts";
@@ -25,7 +26,7 @@ export const TodoItemCard = (props: TodoItemCardProps) => {
actions={{
left: [
{
- comp: ,
+ comp: ,
action: async () => {
todoItemCollection.update(loProps.todoItem.id, (p) => {
if (p.completedAt) {
@@ -39,7 +40,7 @@ export const TodoItemCard = (props: TodoItemCardProps) => {
],
right: [
{
- comp: ,
+ comp: ,
action: async () => {
todoItemCollection.update(loProps.todoItem.id, (p) => {
p.dueAt = formatISOWithOptions({ representation: "date" }, addDays(3, p.dueAt));
diff --git a/src/data.functions/env.service.ts b/src/data.functions/env.service.ts
index f7488f3..7ba6dd3 100644
--- a/src/data.functions/env.service.ts
+++ b/src/data.functions/env.service.ts
@@ -3,7 +3,7 @@ import { createServerOnlyFn } from "@tanstack/solid-start";
const load = (key: string, defval?: T) => {
const val = Deno.env.get(key);
- if (!val && !defval) {
+ if (!val && !defval && val !== defval) {
throw `missing env '${key}'`;
}
@@ -15,6 +15,9 @@ const load = (key: string, defval?: T) => {
};
export const env = createServerOnlyFn(() => ({
+ database: {
+ path: load("DATABASE_PATH", "."),
+ },
fider: {
token: load("FIDER_API_TOKEN"),
},
@@ -22,7 +25,8 @@ export const env = createServerOnlyFn(() => ({
login: load("LISTMONK_API_LOGIN", "later"),
token: load("LISTMONK_API_TOKEN"),
},
- database: {
- path: load("DATABASE_PATH", "."),
+ smtp: {
+ host: load("SMTP_HOST", undefined),
+ port: load("SMTP_PORT", 2525),
},
}));
diff --git a/src/routes/index.tsx b/src/routes/index.tsx
index 10c2a8d..95b9747 100644
--- a/src/routes/index.tsx
+++ b/src/routes/index.tsx
@@ -69,17 +69,16 @@ export const Route = createFileRoute("/")({