diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index 5651f71..ae0c079 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -6,6 +6,19 @@ import { zod } from 'sveltekit-superforms/adapters' import { formSchema, intervals } from './schema' import { categories } from './schema' + import { CalendarIcon } from 'lucide-svelte' + import { Calendar } from '$lib/components/ui/calendar/index.js' + import * as Popover from '$lib/components/ui/popover/index.js' + import { + CalendarDate, + DateFormatter, + type DateValue, + getLocalTimeZone, + parseDate, + today, + } from '@internationalized/date' + import { cn } from '$lib/utils.js' + import { buttonVariants } from '$lib/components/ui/button' let { data } = $props() @@ -14,16 +27,25 @@ resetForm: false, SPA: true, validators: zod(formSchema), - onUpdate: async ({ form }) => { + onUpdated: async ({ form }) => { + if (!form.valid) return + + console.log(form.data) // Form validation const url = new URL(apiEndpoint) url.searchParams.set('symbol', form.data.symbol) url.searchParams.set('interval', form.data.interval) - if (form.data.start) - url.searchParams.set('start', form.data.start.toString()) - if (form.data.end) - url.searchParams.set('end', form.data.end.toString()) + const start = new Date( + form.data.start + ' ' + form.data.startTime + ':00', + ) + url.searchParams.set('start', start.getTime().toString()) + + const end = new Date( + form.data.end + ' ' + form.data.endTime + ':00', + ) + + url.searchParams.set('end', end.getTime().toString()) if (form.data.limit) url.searchParams.set('limit', form.data.limit.toString()) @@ -36,10 +58,20 @@ const data = await response.json() console.log(data.result.list) + let csvContent = 'data:text/csv;charset=utf-8,' + 'startTime,openPrice,highPrice,lowPrice,closePrice,volume,turnover\n' + - data.result.list.map((e: any) => e.join(',')).join('\n') + data.result.list + .map((data: string[]) => { + let newData = data + newData[0] = new Date(parseInt(newData[0])) + .toLocaleString() + .replace(',', ' |') + return newData + }) + .map((e: any) => e.join(',')) + .join('\n') var encodedUri = encodeURI(csvContent) var link = document.createElement('a') @@ -52,6 +84,20 @@ }) const { form: formData, enhance } = form + + const df = new DateFormatter('en-US', { + dateStyle: 'long', + }) + + let start = $state() + let end = $state() + + $effect(() => { + start = $formData.start ? parseDate($formData.start) : undefined + end = $formData.end ? parseDate($formData.end) : undefined + }) + + let placeholder = $state(today(getLocalTimeZone()))
@@ -122,27 +168,114 @@ Category - + {#snippet children({ props })} - Start + Start Date + + + {start + ? df.format(start.toDate(getLocalTimeZone())) + : 'Pick a date'} + + + + { + if (v) { + $formData.start = v.toString() + } else { + $formData.start = '' + } + }} /> + + + + Your date of birth is used to calculator your age + + + + {/snippet} + + + + + {#snippet children({ props })} + Start Time + bind:value={$formData.startTime} + type="time" /> {/snippet} - Start + Limit - + + + {#snippet children({ props })} + End Date + + + {end + ? df.format(end.toDate(getLocalTimeZone())) + : 'Pick a date'} + + + + { + if (v) { + $formData.end = v.toString() + } else { + $formData.end = '' + } + }} /> + + + + Your date of birth is used to calculator your age + + + + {/snippet} + + + {#snippet children({ props })} - End - + End Time + {/snippet} - End + Limit Submit diff --git a/src/routes/schema.ts b/src/routes/schema.ts index 08ab873..6088f75 100644 --- a/src/routes/schema.ts +++ b/src/routes/schema.ts @@ -1,4 +1,3 @@ -import type { DateValue } from '@internationalized/date' import { z } from 'zod' export type Category = 'spot' | 'linear' | 'inverse' @@ -40,8 +39,10 @@ export const formSchema = z.object({ category: z.custom(), symbol: z.string(), interval: z.custom(), - start: z.number().min(0).optional(), - end: z.number().min(0).optional(), + start: z.string().min(1), + startTime: z.string().min(1), + end: z.string().min(1), + endTime: z.string().min(1), limit: z.number().int().min(1).max(1000).optional(), })