Skip to content

Commit

Permalink
fix(useCalendar): grid update condition in watcher (#827)
Browse files Browse the repository at this point in the history
* fix(useCalendar): grid update condition in watcher

* fix(useCalendar): make all props reactive

* fix: revert story
  • Loading branch information
epr3 committed Apr 7, 2024
1 parent b5113c3 commit fc0f503
Show file tree
Hide file tree
Showing 4 changed files with 52 additions and 43 deletions.
12 changes: 6 additions & 6 deletions packages/radix-vue/src/Calendar/CalendarRoot.vue
Original file line number Diff line number Diff line change
Expand Up @@ -204,17 +204,17 @@ const {
} = useCalendar({
locale,
placeholder,
weekStartsOn: props.weekStartsOn,
fixedWeeks: props.fixedWeeks,
numberOfMonths: props.numberOfMonths,
weekStartsOn,
fixedWeeks,
numberOfMonths,
minValue,
maxValue,
disabled,
weekdayFormat: props.weekdayFormat,
pagedNavigation: props.pagedNavigation,
weekdayFormat,
pagedNavigation,
isDateDisabled: propsIsDateDisabled.value,
isDateUnavailable: propsIsDateUnavailable.value,
calendarLabel: calendarLabel.value,
calendarLabel,
})
const {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import { CalendarCell, CalendarCellTrigger, CalendarGrid, CalendarGridBody, Cale
<Variant title="default">
<CalendarRoot
v-slot="{ weekDays, grid }"

class="mt-6 rounded-xl border border-black bg-white p-4 shadow-md"
>
<CalendarHeader class="flex items-center justify-between">
Expand Down
70 changes: 40 additions & 30 deletions packages/radix-vue/src/Calendar/useCalendar.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,25 +2,25 @@
* Adapted from https://github.com/melt-ui/melt-ui/blob/develop/src/lib/builders/calendar/create.ts
*/

import { type DateValue, isEqualDay, isSameDay, isSameMonth } from '@internationalized/date'
import { type DateValue, isSameDay, isSameMonth } from '@internationalized/date'
import { type Ref, computed, ref, watch } from 'vue'
import { type Grid, type Matcher, type WeekDayFormat, createMonths, isAfter, isBefore, toDate } from '@/shared/date'
import { useDateFormatter } from '@/shared'

export type UseCalendarProps = {
locale: Ref<string>
placeholder: Ref<DateValue>
weekStartsOn: 0 | 1 | 2 | 3 | 4 | 5 | 6
fixedWeeks: boolean
numberOfMonths: number
weekStartsOn: Ref<0 | 1 | 2 | 3 | 4 | 5 | 6>
fixedWeeks: Ref<boolean>
numberOfMonths: Ref<number>
minValue: Ref<DateValue | undefined>
maxValue: Ref<DateValue | undefined>
disabled: Ref<boolean>
weekdayFormat: WeekDayFormat
pagedNavigation: boolean
weekdayFormat: Ref<WeekDayFormat>
pagedNavigation: Ref<boolean>
isDateDisabled?: Matcher
isDateUnavailable?: Matcher
calendarLabel?: string
calendarLabel: Ref<string | undefined>
}

export type UseCalendarStateProps = {
Expand Down Expand Up @@ -76,10 +76,10 @@ export function useCalendar(props: UseCalendarProps) {

const grid = ref<Grid<DateValue>[]>(createMonths({
dateObj: props.placeholder.value,
weekStartsOn: props.weekStartsOn,
weekStartsOn: props.weekStartsOn.value,
locale: props.locale.value,
fixedWeeks: props.fixedWeeks,
numberOfMonths: props.numberOfMonths,
fixedWeeks: props.fixedWeeks.value,
numberOfMonths: props.numberOfMonths.value,
})) as Ref<Grid<DateValue>[]>

const visibleView = computed(() => {
Expand Down Expand Up @@ -131,19 +131,19 @@ export function useCalendar(props: UseCalendarProps) {
if (!grid.value.length)
return []
return grid.value[0].rows[0].map((date) => {
return formatter.dayOfWeek(toDate(date), props.weekdayFormat)
return formatter.dayOfWeek(toDate(date), props.weekdayFormat.value)
})
})

const nextPage = () => {
const firstDate = grid.value[0].value

const newGrid = createMonths({
dateObj: firstDate.add({ months: props.pagedNavigation ? props.numberOfMonths : 1 }),
weekStartsOn: props.weekStartsOn,
dateObj: firstDate.add({ months: props.pagedNavigation.value ? props.numberOfMonths.value : 1 }),
weekStartsOn: props.weekStartsOn.value,
locale: props.locale.value,
fixedWeeks: props.fixedWeeks,
numberOfMonths: props.numberOfMonths,
fixedWeeks: props.fixedWeeks.value,
numberOfMonths: props.numberOfMonths.value,
})

grid.value = newGrid
Expand All @@ -155,26 +155,36 @@ export function useCalendar(props: UseCalendarProps) {
const firstDate = grid.value[0].value

const newGrid = createMonths({
dateObj: firstDate.subtract({ months: props.pagedNavigation ? props.numberOfMonths : 1 }),
weekStartsOn: props.weekStartsOn,
dateObj: firstDate.subtract({ months: props.pagedNavigation.value ? props.numberOfMonths.value : 1 }),
weekStartsOn: props.weekStartsOn.value,
locale: props.locale.value,
fixedWeeks: props.fixedWeeks,
numberOfMonths: props.numberOfMonths,
fixedWeeks: props.fixedWeeks.value,
numberOfMonths: props.numberOfMonths.value,
})

props.placeholder.value = newGrid[0].value.set({ day: 1 })
}

watch(props.placeholder, (value, oldValue) => {
if (!isEqualDay(value, oldValue)) {
grid.value = createMonths({
dateObj: value,
weekStartsOn: props.weekStartsOn,
locale: props.locale.value,
fixedWeeks: props.fixedWeeks,
numberOfMonths: props.numberOfMonths,
})
}
watch(props.placeholder, (value) => {
if (visibleView.value.some(month => isSameMonth(month, value)))
return
grid.value = createMonths({
dateObj: value,
weekStartsOn: props.weekStartsOn.value,
locale: props.locale.value,
fixedWeeks: props.fixedWeeks.value,
numberOfMonths: props.numberOfMonths.value,
})
})

watch([props.locale, props.weekStartsOn, props.fixedWeeks, props.numberOfMonths], () => {
grid.value = createMonths({
dateObj: props.placeholder.value,
weekStartsOn: props.weekStartsOn.value,
locale: props.locale.value,
fixedWeeks: props.fixedWeeks.value,
numberOfMonths: props.numberOfMonths.value,
})
})

const headingValue = computed(() => {
Expand Down Expand Up @@ -205,7 +215,7 @@ export function useCalendar(props: UseCalendarProps) {
return content
})

const fullCalendarLabel = computed(() => `${props.calendarLabel ?? 'Event Date'}, ${headingValue.value}`)
const fullCalendarLabel = computed(() => `${props.calendarLabel.value ?? 'Event Date'}, ${headingValue.value}`)

return {
isDateDisabled,
Expand Down
12 changes: 6 additions & 6 deletions packages/radix-vue/src/RangeCalendar/RangeCalendarRoot.vue
Original file line number Diff line number Diff line change
Expand Up @@ -201,17 +201,17 @@ const {
} = useCalendar({
locale,
placeholder,
weekStartsOn: props.weekStartsOn,
fixedWeeks: props.fixedWeeks,
numberOfMonths: props.numberOfMonths,
weekStartsOn,
fixedWeeks,
numberOfMonths,
minValue,
maxValue,
disabled,
weekdayFormat: props.weekdayFormat,
pagedNavigation: props.pagedNavigation,
weekdayFormat,
pagedNavigation,
isDateDisabled: propsIsDateDisabled.value,
isDateUnavailable: propsIsDateUnavailable.value,
calendarLabel: calendarLabel.value,
calendarLabel,
})
const {
Expand Down

0 comments on commit fc0f503

Please sign in to comment.