VA-TASK-TIDYTaskForm.tsx1 match
8}
910export default function TaskForm({ onTasksSubmitted, userEmail }: TaskFormProps) {
11const [formData, setFormData] = useState<TaskFormData>({
12name: "",
VA-TASK-TIDYApp.tsx1 match
7type View = "form" | "dashboard";
89export default function App() {
10const [currentView, setCurrentView] = useState<View>("form");
11const [userEmail, setUserEmail] = useState<string>("");
VA-TASK-TIDYemailService.ts3 matches
4const BASE_URL = "https://va-task-tidy.web.val.run"; // Update this to your actual domain
56export async function sendEveningCheckIn(user: User, taskSet: TaskSet, responseToken: string) {
7const yesUrl = `${BASE_URL}/api/complete?token=${responseToken}&completed=true`;
8const noUrl = `${BASE_URL}/api/complete?token=${responseToken}&completed=false`;
182}
183184export async function sendMorningReminder(user: User, taskSet: TaskSet) {
185const html = `
186<!DOCTYPE html>
341}
342343export async function sendCompletionConfirmation(user: User, completed: boolean) {
344if (completed) {
345const html = `
VA-TASK-TIDYqueries.ts11 matches
45// User operations
6export async function createOrUpdateUser(name: string, email: string): Promise<User> {
7// Try to find existing user
8const existingUser = await sqlite.execute(
33}
3435export async function getUserByEmail(email: string): Promise<User | null> {
36const result = await sqlite.execute(
37`SELECT * FROM ${TABLE_NAMES.USERS} WHERE email = ?`,
4243// Task set operations
44export async function createTaskSet(
45userId: number,
46task1: string,
68}
6970export async function getTaskSetByUserAndDate(userId: number, date: string): Promise<TaskSet | null> {
71const result = await sqlite.execute(
72`SELECT * FROM ${TABLE_NAMES.TASK_SETS} WHERE user_id = ? AND date = ?`,
76}
7778export async function getTaskSetById(id: number): Promise<TaskSet | null> {
79const result = await sqlite.execute(
80`SELECT * FROM ${TABLE_NAMES.TASK_SETS} WHERE id = ?`,
8586// Task completion operations
87export async function createTaskCompletion(
88userId: number,
89taskSetId: number,
111}
112113export async function getCompletionByToken(token: string): Promise<TaskCompletion | null> {
114const result = await sqlite.execute(
115`SELECT * FROM ${TABLE_NAMES.COMPLETIONS} WHERE response_token = ?`,
119}
120121export async function getCompletionByUserAndDate(userId: number, date: string): Promise<TaskCompletion | null> {
122const result = await sqlite.execute(
123`SELECT * FROM ${TABLE_NAMES.COMPLETIONS} WHERE user_id = ? AND completion_date = ?`,
128129// Dashboard data
130export async function getDashboardData(userId: number): Promise<DashboardData> {
131const user = await sqlite.execute(
132`SELECT * FROM ${TABLE_NAMES.USERS} WHERE id = ?`,
182183// Get users who need evening reminders (have tasks for today but no completion record)
184export async function getUsersNeedingEveningReminder(): Promise<Array<{user: User, taskSet: TaskSet}>> {
185const today = new Date().toISOString().split('T')[0];
186
213214// Get users who need morning reminders (marked incomplete yesterday)
215export async function getUsersNeedingMorningReminder(): Promise<Array<{user: User, taskSet: TaskSet, completion: TaskCompletion}>> {
216const yesterday = new Date();
217yesterday.setDate(yesterday.getDate() - 1);
VA-TASK-TIDYmigrations.ts1 match
8const COMPLETIONS_TABLE = 'va_task_tidy_completions_v1';
910export async function runMigrations() {
11console.log('Running database migrations...');
12
2import type { ReactNode } from "npm:react@18.2.0";
34export function Layout({ children }: { children: ReactNode }) {
5return (
6<html lang="en">
markdownBlogStarterindex.tsx3 matches
5import { Layout } from "./Layout.tsx";
67function PostComponent({ markdown, link }: { markdown: string; link?: string }) {
8return (
9<div style={{ border: "1px solid gray", padding: "10px", marginBottom: "20px", borderRadius: "5px" }}>
14}
1516export default async function(req: Request): Promise<Response> {
17const url = new URL(req.url);
18if (url.pathname === "/") {
44}
4546function html(children: React.ReactNode) {
47return new Response(
48renderToString(
VA_TASK_TIDYmigrations.ts1 match
1import { sqlite } from "https://esm.town/v/stevekrouse/sqlite";
23export async function runMigrations() {
4try {
5// Users table
VA_TASK_TIDYemail.ts2 matches
4const BASE_URL = "https://vatasktidy-backend.web.val.run"; // Update this with your actual val URL
56export async function sendEveningReminder(user: User, tasks: DailyTasks) {
7const today = new Date().toISOString().split('T')[0];
8const yesUrl = `${BASE_URL}/api/complete/${user.id}/${today}/true`;
66}
6768export async function sendMorningReminder(user: User, tasks: DailyTasks) {
69const yesterday = new Date();
70yesterday.setDate(yesterday.getDate() - 1);
10import { sendMorningReminder } from "../backend/routes/email.ts";
1112export default async function morningReminderCron() {
13console.log("Running morning reminder cron job...");
14