···66 import { parse, createFormat } from './parse'
77 import type { FormatToken } from './parse'
88 import DateTimePicker from './DatePicker.svelte'
99+ import { writable } from 'svelte/store'
1010+1111+ const defaultDate = new Date()
1212+1313+ // inner date value store for preventing value updates (and also
1414+ // text updates as a result) when date is unchanged
1515+ const innerStore = writable(defaultDate)
1616+ const store = (() => {
1717+ return {
1818+ subscribe: innerStore.subscribe,
1919+ set: (d: Date) => {
2020+ if (d.getTime() !== $innerStore.getTime()) {
2121+ innerStore.set(d)
2222+ value = d
2323+ }
2424+ },
2525+ }
2626+ })()
9271028 /** Date value */
1111- export let value = new Date()
1212- function setValue(d: Date) {
1313- if (d.getTime() !== value.getTime()) value = d
1414- }
2929+ export let value = defaultDate
3030+ $: store.set(value)
1531 /** The earliest value the user can select */
1616- export let min = new Date(new Date().getFullYear() - 20, 0, 1)
3232+ export let min = new Date(defaultDate.getFullYear() - 20, 0, 1)
1733 /** The latest value the user can select */
1818- export let max = new Date(new Date().getFullYear(), 11, 31, 23, 59, 59, 999)
3434+ export let max = new Date(defaultDate.getFullYear(), 11, 31, 23, 59, 59, 999)
1935 /** Placeholder text to show when input field is empty */
2036 export let placeholder = '2020-12-31 23:00:00'
2137 /** Whether the text is valid */
···3248 function valueUpdate(value: Date, formatTokens: FormatToken[]) {
3349 text = toText(value, formatTokens)
3450 }
3535- $: valueUpdate(value, formatTokens)
5151+ $: valueUpdate($store, formatTokens)
36523737- export let text = toText(value, formatTokens)
5353+ export let text = toText($store, formatTokens)
3854 let textHistory = [text, text]
3955 $: textHistory = [textHistory[1], text]
40564157 function textUpdate(text: string, formatTokens: FormatToken[]) {
4242- const result = parse(text, formatTokens, value)
5858+ const result = parse(text, formatTokens, $store)
4359 if (result.date !== null) {
4460 valid = true
4545- setValue(result.date)
6161+ store.set(result.date)
4662 } else {
4763 valid = false
4864 }
···5672 typeof e.data === 'string' &&
5773 text === textHistory[0] + e.data
5874 ) {
5959- let result = parse(textHistory[0], formatTokens, value)
7575+ let result = parse(textHistory[0], formatTokens, $store)
6076 if (result.missingPunctuation !== '' && !result.missingPunctuation.startsWith(e.data)) {
6177 text = textHistory[0] + result.missingPunctuation + e.data
6278 }
···104120 on:input={input} />
105121 {#if visible}
106122 <div class="picker" class:visible transition:fly={{ duration: 80, easing: cubicInOut, y: -5 }}>
107107- <DateTimePicker on:focusout={onFocusOut} bind:value bind:min bind:max {locale} />
123123+ <DateTimePicker on:focusout={onFocusOut} bind:value={$store} {min} {max} {locale} />
108124 </div>
109125 {/if}
110126</div>
+1-1
src/lib/DatePicker.svelte
···1111 }
1212 function updateValue(updater: (date: Date) => Date) {
1313 let d = updater(new Date(value.getTime()))
1414- if (d.getTime() !== value.getTime()) value = d
1414+ setValue(d)
1515 }
1616 /** The earliest year the user can select */
1717 export let min = new Date(new Date().getFullYear() - 20, 0, 1)