コンタクト交換 と 眼科受診 の2カード表示
ログイン後のホーム画面で、コンタクトレンズ交換と眼科受診の前回記録日・次回予定日をそれぞれ表示します。

コンタクトレンズ交換と眼科受診は周期的に発生するため、前回実施日と次回予定日を同じ画面で確認できるようにし、記録から次回予定日の計算までをアプリ内で完結できるシンプルな構成にしています。
既存のカレンダーアプリでは多機能でわかりづらく、予定表などに手書きで記載している場合には通知されることなく見逃してしまう。
実装では コンタクト交換 と 眼科受診 のイベント種類を持ち、コンタクトレンズ交換と眼科受診をそれぞれ独立して記録・表示しています。
記録時に現在の周期設定を取得し、実施日へ日数を加算して 次回予定日 として表示されます。
設定画面から通知ON/OFFと、イベントの種類ごとの通知日の予定前日数を変更できる設定と更新があります。
既存のカレンダーアプリだと見た目のシンプルさがなく、また周期日程を柔軟に変更する場合は面倒。シンプルで使いやすさが必要。
ログイン後のホーム画面で、コンタクトレンズ交換と眼科受診の前回記録日・次回予定日をそれぞれ表示します。

記録ボタンを押すと 既存設定から次回予定日を自動計算します。 既存イベントの前回記録日または次回予定日を画面上で編集でき、前回記録日を変更した場合は周期に応じて次回予定日も再計算します。 次回予定日を変更すると、通知日も自動的に変更されます。

サイドバーから設定を開き、コンタクトレンズ交換周期、眼科受診周期、通知ON/OFF、通知日前日数を変更できます。

`events` に記録履歴、`event_settings` にイベント種別ごとの周期、`user_settings` に通知設定を持たせる前提で実装されています。
記録追加、日付更新、周期更新、通知設定更新を App Router の Server Actions に分け、更新後に必要な画面を再取得する構成です。
`lib/date.ts` でJSTの日付文字列取得、日付妥当性チェック、日数加算を共通化し、予定日の計算に利用しています。
Webプッシュ機能としては外部アプリOneSignalと連携しました。 通知ON/OFFの切り替え時にOneSignalの購読状態も更新し、通知許可イベントを画面設定へ反映する実装があります。