qcal/jcal/src/App.tsx

46 lines
1.6 KiB
TypeScript
Raw Normal View History

2023-07-15 15:37:25 -04:00
import React from 'react';
2023-04-22 19:02:25 -04:00
import {Calendar} from './Calendar';
2023-07-15 16:10:46 -04:00
import {gregorianJDN, JulianMonth} from '@common/gregorian';
import {DayChanger} from '@common/ui/DayChanger';
2023-04-22 19:02:25 -04:00
import {jdnJulian} from '@common/julian';
2023-07-15 15:37:25 -04:00
import {GregorianJumper} from '@common/dateJump';
2023-07-15 16:10:46 -04:00
import MonthBasedApp from '@common/ui/MonthBasedApp';
2023-04-22 19:02:25 -04:00
// Not real limitations other than JS number precision.
2023-07-15 15:37:25 -04:00
const START_JDN = gregorianJDN(-10_000_000_000_000, 1, 1);
const END_JDN = gregorianJDN(10_000_000_000_000, 12, 31);
2023-04-22 19:02:25 -04:00
2023-07-15 16:10:46 -04:00
export default class App extends MonthBasedApp<number, JulianMonth> {
override parseYearMonth(year: string, month: string) {
if (+month < 1 || +month > 12)
return null;
return {year: +year, month: +month as JulianMonth};
2023-04-22 19:02:25 -04:00
}
2023-07-15 16:10:46 -04:00
override defaultSelector(todayJDN: number) {
const [year, month] = jdnJulian(todayJDN);
return {year, month};
2023-04-22 19:02:25 -04:00
}
2023-07-15 15:37:25 -04:00
goToJDN = (jdn: number) => {
const [year, month] = jdnJulian(jdn);
2023-07-15 16:10:46 -04:00
this.setState({selector: {year, month}});
2023-07-15 15:37:25 -04:00
};
2023-04-22 19:02:25 -04:00
render() {
2023-07-15 16:10:46 -04:00
const {selector: {year, month}, todayJDN} = this.state;
2023-04-22 19:02:25 -04:00
return <>
<Calendar
2023-07-15 16:10:46 -04:00
year={year} month={month} todayJDN={todayJDN}
onSwitch={(year, month) => this.setState({selector: {year, month}})}/>
2023-04-22 19:02:25 -04:00
<DayChanger onDateChange={this.onDateChange}/>
<div className="navigate">
<h4>Go to a date</h4>
2023-07-15 23:09:42 -04:00
<GregorianJumper minJDN={START_JDN} maxJDN={END_JDN} initialJDN={todayJDN} onJump={this.goToJDN}/>
2023-04-22 19:02:25 -04:00
</div>
</>;
}
}