Menu

1.1.8

注目すべき点

バージョン番号については、package.json ファイルの version フィールドを確認してください。

LanguageDetectionAlert 多言語対応の修正

アップデートレベル:1.1.7+ は修正必須、1.1.7- は修正不要。

1.1.7での多言語構造のアップグレード後、LanguageDetectionAlert が多言語テキストを取得する場所が更新されていなかったため、これを修正します。

components/LanguageDetectionAlert.tsx
  // const messages = require(`@/i18n/messages/${currentLocale}.json`); // 削除
  const messages = require(`@/i18n/messages/${currentLocale}/common.json`); // 追加

ログイン検証用の isValidRedirectUrl の共有

アップデートレベル:任意修正。

この変更は、異なるログイン方法間での検証プロセスを同期するためのものです。

URL検証メソッド isValidRedirectUrlapp/auth/confirm/route.ts から独立したファイル app/auth/utils.ts に移動します。

app/auth/utils.ts
const ALLOWED_REDIRECT_HOSTS = (
  process.env.NODE_ENV === 'development'
    ? (process.env.ALLOWED_REDIRECT_HOSTS?.split(',') || [])
    : []
).concat(process.env.NEXT_PUBLIC_SITE_URL!).filter(Boolean) as string[]
 
export function isValidRedirectUrl(url: string): boolean {
  try {
    if (url.startsWith('/api/')) {
      return false;
    }
 
    if (url.startsWith('/')) {
      return true;
    }
 
    const parsedUrl = new URL(url)
 
    return ALLOWED_REDIRECT_HOSTS.includes(parsedUrl.host)
  } catch {
    return false
  }
}

app/auth/callback/route.tsapp/auth/confirm/route.ts の両方で同じURL検証を使用します:

let next = searchParams.get('next') ?? '/'
next = next == 'null' ? '/' : next
 
// 追加
if (!isValidRedirectUrl(next)) {
  console.error('Invalid redirect URL')
  return NextResponse.redirect(new URL(`/redirect-error?code=invalid_redirect`, origin))
}

画像アップロード失敗時の処理を最適化

アップデートレベル:任意修正。

この変更は、画像アップロード失敗後に選択された画像をクリアするためのものです。

app/[locale]/(protected)/dashboard/(admin)/blogs/ImageUpload.tsx
if (
  !presignedUrlActionResponse.success ||
  !presignedUrlActionResponse.data
) {
  setPreviewUrl(null); // 追加、70行目
  toast.error(t("uploadError"), {
    description:
      presignedUrlActionResponse.error || t("presignedUrlError"),
  });
  return "";
}
 
// ...
try {
  // ...
} catch (error) {
  setPreviewUrl(null); // 追加、107行目
  console.error("MDX Image Upload failed:", error);
  toast.error(getErrorMessage(error) || t("upload.uploadErrorUnexpected"));
} finally {
  // ...
}

orders テーブルから period_start と period_end フィールドを削除

アップデートレベル:修正不要。

この変更は意味のないフィールドを削除するものです。残しても削除しても機能に影響はありません。複製されたコードは修正不要とすることをお勧めします。

  1. data/orders.sql から period_startperiod_end の定義を削除します

  2. lib/stripe/webhook-handlers.ts 内の handleInvoicePaid 関数で period_startperiod_end フィールドに関連する行を削除します:

// period_start: invoice.period_start ? new Date(invoice.period_start * 1000).toISOString() : null, // 削除
// period_end: invoice.period_end ? new Date(invoice.period_end * 1000).toISOString() : null, // 削除
  1. Supabase Console Table Editor で period_startperiod_end フィールドを削除します

  2. ローカルの Supabase 型定義を更新します:

supabase gen types typescript --project-id <your-project-id> --schema public > lib/supabase/types.ts

年間サブスクリプションの例

サンプルコード:subscription-yearly ブランチ

ドキュメント:https://nexty.dev/docs/guide/payment/yearly-subscription