4const cacheKey = "donation_data_cache";
5
6// Utility functions for formatting
7function formatDate(dateString: string): string {
8 return new Date(dateString).toLocaleString('en-US', {
9 year: 'numeric',
16}
17
18function formatCurrency(amount: number, currencyCode: string): string {
19 return new Intl.NumberFormat('en-US', {
20 style: 'currency',
23}
24
25async function fetchAndCacheData() {
26 try {
27 console.log("Fetching URL:", url);
66}
67
68async function getFullData() {
69 const data = await fetchAndCacheData();
70 return Response.json(data);
71}
72
73async function getDonationProgress() {
74 const data = await fetchAndCacheData();
75 const donationGoal = data.checkoutLink.checkout_link_data.donation_goal;
85}
86
87async function getCheckoutDetails() {
88 const data = await fetchAndCacheData();
89 return Response.json({
94}
95
96async function getCampaignInfo() {
97 const data = await fetchAndCacheData();
98 const linkData = data.checkoutLink.checkout_link_data;
105}
106
107async function getHtmlView() {
108 const data = await fetchAndCacheData();
109 const linkData = data.checkoutLink.checkout_link_data;
167};
168
169export default async function(req: Request): Promise<Response> {
170 const { pathname } = new URL(req.url);
171 const handler = router[pathname];
3import { createRoot } from "https://esm.sh/react-dom/client";
4
5function debounce(func, wait) {
6 let timeout;
7 return function executedFunction(...args) {
8 const later = () => {
9 clearTimeout(timeout);
15}
16
17function App() {
18 const [prompt, setPrompt] = useState("");
19 const [output, setOutput] = useState([]);
130}
131
132function client() {
133 createRoot(document.getElementById("root")).render(<App />);
134}
138}
139
140function stripCodeFences(code: string): string {
141 return code.replace(/^```javascript\n|^```\n|```$/gm, "").trim();
142}
143
144function extractMessage(logOutput: string): string {
145 try {
146 const parsed = JSON.parse(logOutput);
153const sleep = (ms: number) => new Promise(resolve => setTimeout(resolve, ms));
154
155async function retryWithBackoff(fn: () => Promise<any>, maxRetries = 5) {
156 let retries = 0;
157 while (retries < maxRetries) {
172}
173
174export default async function server(request: Request): Promise<Response> {
175 if (request.method === "POST" && new URL(request.url).pathname === "/generate") {
176 const { OpenAI } = await import("https://esm.town/v/std/openai");
1
2 export default function handler(req) {
3 return new Response(`"\n <!DOCTYPE html>\n <html>\n <head>\n <title>Claude Chat Conversation</title>\n <meta charset=\"UTF-8\">\n <style>\n body {\n font-family: system-ui, -apple-system, sans-serif;\n line-height: 1.5;\n max-width: 800px;\n margin: 0 auto;\n padding: 20px;\n background: #f9fafb;\n }\n .message {\n margin: 20px 0;\n padding: 15px;\n border-radius: 8px;\n }\n .human {\n background: #e5e7eb;\n }\n .assistant {\n background: #dbeafe;\n }\n .role {\n font-weight: bold;\n margin-bottom: 8px;\n }\n </style>\n </head>\n <body>\n \n <div class=\"message human\">\n <div class=\"role\">Human</div>\n <div class=\"content\">Copy @field_validator(\"window_hop\")\n def validate_window_hop(cls, v: int | None) -> int | None:\n if v is None:\n return None\n if v != 0 and ((60 % v == 0 and v % 5 == 0) or (v % 60 == 0)):\n return v\n raise ValueError(\n \"Only divisors of 60 and multiples of 5 or multiples of 60 are allowed.\"\n )\n\nI want to add another criteria. It should be a factor of 86400 as well</div>\n </div>\n \n <div class=\"message assistant\">\n <div class=\"role\">Claude</div>\n <div class=\"content\">I'll help you modify the validator to include the additional criterion that the value should also be a factor of 86400 (the number of seconds in a day).\nHere's the updated validator:\npythonCopy@field_validator(\"window_hop\")\ndef validate_window_hop(cls, v: int | None) -> int | None:\n if v is None:\n return None\n if (v != 0 and \n ((60 % v == 0 and v % 5 == 0) or (v % 60 == 0)) and \n 86400 % v == 0):\n return v\n raise ValueError(\n \"Only values that are: (1) divisors of 60 and multiples of 5, or \"\n \"(2) multiples of 60, AND (3) factors of 86400 are allowed.\"\n )\nThe changes made are:\n\nAdded 86400 % v == 0 to check if the value is a factor of 86400\nUpdated the error message to clarify all three conditions\nImproved code readability by breaking the conditions across multiple lines\n\nThis will now ensure the window hop value satisfies all three criteria.</div>\n </div>\n \n <div class=\"message human\">\n <div class=\"role\">Human</div>\n <div class=\"content\">List out all the values which would satisfy these cases. How many of them are there?</div>\n </div>\n \n <div class=\"message assistant\">\n <div class=\"role\">Claude</div>\n <div class=\"content\">Let me think through this step by step.\n\nFirst, let's find all valid values based on the original criteria:\n\nDivisors of 60 that are multiples of 5: 5, 10, 15, 20, 30, 60\nMultiples of 60: 60, 120, 180, 240, 300, ...(we'll need to check up to 86400)\n\n\nThen, let's find the factors of 86400:\n86400 = 2^7 × 3^3 × 5^2\nNow let's find the intersection of these sets:\n\npythonCopydef get_valid_values():\n valid = set()\n \n # Check all numbers up to 86400\n for v in range(1, 86401):\n if v != 0:\n # Check if it satisfies the time window conditions\n if ((60 % v == 0 and v % 5 == 0) or (v % 60 == 0)):\n # Check if it's a factor of 86400\n if 86400 % v == 0:\n valid.add(v)\n \n return sorted(list(valid))\n\nvalid_values = get_valid_values()\nprint(f\"Valid values: {valid_values}\")\nprint(f\"Total count: {len(valid_values)}\")\nThe valid values are:\n60, 120, 180, 240, 300, 360, 432, 600, 720, 864, 900, 1080, 1200, 1440, 1728, 1800, 2160, 2400, 2880, 3600, 4320, 4800, 5400, 7200, 8640, 10800, 14400, 17280, 21600, 28800, 43200, 86400\nThere are 32 values that satisfy all conditions.\nTo verify this makes sense:\n\nEach of these numbers is either:\n\nA multiple of 60, OR\nA divisor of 60 AND a multiple of 5\n\n\nEach of these numbers is a factor of 86400\nAll values are reasonable for time windows (measured in seconds)\n\nWould you like me to explain why any particular values are included or verify any specific conditions?</div>\n </div>\n \n <div class=\"message human\">\n <div class=\"role\">Human</div>\n <div class=\"content\">Why not 5, 10, 20, 30?</div>\n </div>\n \n <div class=\"message assistant\">\n <div class=\"role\">Claude</div>\n <div class=\"content\">Ah, good question! Let me check each of these values:\n\n5:\n\n✓ Is a divisor of 60 and multiple of 5\n✗ Not a factor of 86400 (86400 ÷ 5 = 17280.0)\n\n\n10:\n\n✓ Is a divisor of 60 and multiple of 5\n✗ Not a factor of 86400 (86400 ÷ 10 = 8640.0)\n\n\n20:\n\n✓ Is a divisor of 60 and multiple of 5\n✗ Not a factor of 86400 (86400 ÷ 20 = 4320.0)\n\n\n30:\n\n✓ Is a divisor of 60 and multiple of 5\n✗ Not a factor of 86400 (86400 ÷ 30 = 2880.0)\n\n\n\nWhile these numbers satisfy the first part of the condition (being divisors of 60 and multiples of 5), they fail the new condition we added - being factors of 86400.\nTo be a factor of 86400, a number needs to evenly divide into it. Since 86400 = 2^7 × 3^3 × 5^2, any valid factor must only use these prime factors with equal or lower exponents.\nThe smallest valid value in our list is 60 because:\n\n60 = 2^2 × 3 × 5\nThese prime factors are all present in 86400's prime factorization (2^7 × 3^3 × 5^2)\n86400 ÷ 60 = 1440 (a whole number)\n\nThis is why we don't see any values smaller than 60 in our final list.</div>\n </div>\n \n <div class=\"message human\">\n <div class=\"role\">Human</div>\n <div class=\"content\">I did not say prime factors now did I?</div>\n </div>\n \n <div class=\"message assistant\">\n <div class=\"role\">Claude</div>\n <div class=\"content\">You're absolutely right - I overcomplicated it by bringing in prime factors! Let me simply check if each of these numbers are factors of 86400 by doing the division:\n\n5:\n86400 ÷ 5 = 17280 (whole number)\n✓ 5 IS actually a factor of 86400!\n10:\n86400 ÷ 10 = 8640 (whole number)\n✓ 10 IS a factor of 86400!\n20:\n86400 ÷ 20 = 4320 (whole number)\n✓ 20 IS a factor of 86400!\n30:\n86400 ÷ 30 = 2880 (whole number)\n✓ 30 IS a factor of 86400!\n\nI apologize for my error! These numbers should all be included in our valid values since they satisfy both conditions:\n\nThey are divisors of 60 and multiples of 5\nThey are factors of 86400\n\nLet me correct the complete list of valid values:\n5, 10, 20, 30, 60, 120, 180, 240, 300, 360, 432, 600, 720, 864, 900, 1080, 1200, 1440, 1728, 1800, 2160, 2400, 2880, 3600, 4320, 4800, 5400, 7200, 8640, 10800, 14400, 17280, 21600, 28800, 43200, 86400\nTotal count: 36 values (not 32 as incorrectly stated before)\nThank you for catching my mistake!</div>\n </div>\n \n </body>\n </html>\n"`, {
4 headers: {
81`;
82
83function Instructions() {
84 return (
85 <div className="mb-4">
95}
96
97function TipList({ tips, selectedDate, sortOrder, setSortOrder }) {
98 const filteredTips = tips.filter((tip) => {
99 const tipDate = new Date(tip.timestamp);
145}
146
147function DateSelector({ selectedDate, setSelectedDate }) {
148 const [isCalendarOpen, setIsCalendarOpen] = useState(false);
149 const today = new Date();
232}
233
234function App({ initialTips }) {
235 const [amount, setAmount] = useState(20);
236 const [name, setName] = useState("");
354}
355
356function Confetti() {
357 useEffect(() => {
358 confetti({
366}
367
368function SuccessPage({ payments }) {
369 return (
370 <div className="min-h-screen bg-white text-black flex flex-col items-center justify-center p-4">
391}
392
393function client() {
394 const root = document.getElementById("root");
395 if (root.dataset.page === "success") {
406}
407
408export default async function server(req: Request): Promise<Response> {
409 const { sqlite } = await import("https://esm.town/v/stevekrouse/sqlite");
410 const SCHEMA_VERSION = 2;