Lewati ke konten utama

Interval Waktu

Atribut timeInterval adalah aturan pengulangan, bukan daftar slot: tanggal acuan, rentang waktu harian, dan tanda pengulangan. Resolusikan menjadi pasangan [start, end] konkret untuk jendela yang sebenarnya Anda render dengan pembantu tingkat atas expandAttributeTimeIntervals, expandTimeIntervals, dan penjaga tipe isTimeIntervalAttribute.

import { expandAttributeTimeIntervals } from 'oneentry';

const slots = expandAttributeTimeIntervals(page.attributeValues.interval, {
from: '2025-04-01',
to: '2025-04-30',
});
// [['2025-04-14T09:00:00.000Z', '2025-04-14T10:00:00.000Z'], …]

Ketiga pembantu tersebut adalah murni — mereka tidak mengubah input mereka dan tidak melakukan permintaan.

Di mana jadwal berada

API mengembalikan jadwal dalam dua bentuk, dan keduanya diterima oleh pembantu:

BentukDi mana menemukannyaMembawa
Entitas (ITimeIntervalEntitySchedule)attributeValues[marker].value[].values[] di halaman, produk, blok, dan set atributrentang dates dengan pasangan times
Formulir (ITimeIntervalSchedule)attributes[].localizeInfos.intervals[] di formulirrange dengan intervals yang membawa slot period dalam menit

expandAttributeTimeIntervals(attr, window)

Jalur satu panggilan untuk atribut entitas: ia menjelajahi grup dan jadwal atribut, memperluas masing-masing dan menggabungkan hasilnya. Penggabungan itu penting — deduplikasi dan pengurutan hanya berlaku dalam satu jadwal, jadi menggabungkan grup secara manual dapat menghasilkan slot yang duplikat atau tidak terurut.

Apa pun yang bukan atribut timeInterval menghasilkan array kosong, jadi aman untuk memanggilnya tanpa memeriksa type terlebih dahulu.

import { expandAttributeTimeIntervals } from 'oneentry';

const page = await Pages.getPageByUrl('booking');

const slots = expandAttributeTimeIntervals(page.attributeValues.interval, {
from: '2025-04-01',
to: '2025-04-30',
});

expandTimeIntervals(schedule, window)

Menyelesaikan satu jadwal. Gunakan ini ketika Anda sudah memegang satu — terutama pada formulir, yang jadwalnya sudah diketik di localizeInfos.intervals:

import { expandTimeIntervals } from 'oneentry';

const form = await Forms.getFormByMarker('booking_form');
const field = form.attributes.find((a) => a.marker === 'schedule');

const slots = (field?.localizeInfos.intervals ?? []).flatMap((schedule) =>
expandTimeIntervals(schedule, { from: '2025-05-01', to: '2025-05-31' }),
);

isTimeIntervalAttribute(attr)

IAttributeValue.value diketik unknown, karena bentuknya tergantung pada type. Penjaga tipe ini mempersempit atribut menjadi ITimeIntervalAttributeValue, yang memungkinkan Anda mengakses jadwal tanpa perlu casting:

import { isTimeIntervalAttribute } from 'oneentry';

const attr = page.attributeValues.interval;

if (isTimeIntervalAttribute(attr)) {
attr.value[0].values[0].dates; // fully typed
}

Jendela

const window = { from: '2025-04-01', to: '2025-04-30' };
  • from dan to menerima Date, string ISO, atau milidetik epoch.
  • Kedua batas adalah inklusif dan dibandingkan pada granularitas hari UTC — bagian waktu dari from/to diabaikan.
  • Jendela adalah wajib: jadwal adalah aturan pengulangan yang terbuka, dan hanya Anda yang tahu seberapa jauh ia harus diselesaikan.

Semantik pengulangan

  • dates[0] / range[0] adalah fase pengulangan dan hari valid pertama — tidak ada yang lebih awal yang dikeluarkan, betapa pun lebar jendelanya.
  • dates[1] / range[1] mengakhiri validitas. Ketika tidak meluas melewati awal, jadwal terikat pada hari tunggal itu; dengan tanda pengulangan diatur, pengulangan kemudian terbuka dan jendela saja yang membatasi hasil.
  • inEveryWeek mengulang setiap 7 hari dari acuan.
  • inEveryMonth mengulang pada hari yang sama dalam sebulan, melewatkan bulan yang terlalu pendek.
  • Dengan kedua tanda diatur, aturan mingguan berlaku — yang selalu dimaksudkan dalam praktik.
  • Dengan tidak ada tanda, jadwal adalah rentang tanggal biasa: setiap harinya menghasilkan slot.
  • Hasilnya dideduplikasi dan diurutkan berdasarkan awal, kemudian berdasarkan akhir.
  • Semua aritmetika adalah UTC, jadi hasilnya tidak tergantung pada zona waktu mesin.

Migrasi dari bidang timeIntervals

Versi SDK sebelumnya menyuntikkan array timeIntervals yang dihitung ke dalam setiap nilai atribut timeInterval. Bidang itu tidak lagi ada. Itu menghasilkan satu tahun penuh slot terlepas dari apa yang dibutuhkan pemanggil — satu atribut dengan slot per jam diperluas menjadi sekitar 2.000 baris JSON, dan periode slot yang lebih halus mencapai megabyte, cukup untuk melewati batas cache data framework. Itu juga tidak pernah dinyatakan dalam antarmuka atau skema mana pun, jadi konsumen TypeScript hanya bisa mengaksesnya melalui casting.

// before — read the pre-computed field
const slots = page.attributeValues.interval.value[0].values[0].timeIntervals;

// now — expand the window you actually render
import { expandAttributeTimeIntervals } from 'oneentry';

const slots = expandAttributeTimeIntervals(page.attributeValues.interval, {
from: '2025-04-01',
to: '2025-04-30',
});

Data sumber yang diperluas (dates/range, times/intervals, inEveryWeek, inEveryMonth) tidak berubah dan masih ada di setiap jadwal — tidak ada yang hilang, itu hanya diselesaikan sesuai permintaan alih-alih secara langsung, dan aturan kompak adalah yang di-cache.

Metode _addTimeIntervalsToSchedules dan _addTimeIntervalsToFormSchedules juga dihapus dari setiap modul (meskipun dengan awalan _ mereka dapat dipanggil, misalnya Pages._addTimeIntervalsToSchedules). Gunakan expandTimeIntervals sebagai gantinya.

Tipe

Semua ini diekspor dari akar paket dan dari oneentry/types (lihat Mengimpor Tipe):

TipeMendeskripsikan
ITimeIntervalAttributeValueSebuah IAttributeValue yang dipersempit menjadi type: 'timeInterval', yang value-nya adalah array grup
ITimeIntervalGroupSatu entri dari value atribut — jadwal yang berbagi intervalId
ITimeIntervalEntityScheduleSatu jadwal entitas: dates, times, inEveryWeek, inEveryMonth
ITimeIntervalScheduleSatu jadwal formulir: range, intervals, inEveryWeek, inEveryMonth
ITimeIntervalRangeRentang harian dengan start, end, dan slot period dalam menit (null saat tidak dipotong)
ITimeIntervalPointTitik dalam sehari - { hours, minutes }
ITimeIntervalWindowJendela ekspansi - { from, to }
TimeIntervalPairSatu slot yang diselesaikan - [start, end], keduanya adalah string ISO 8601 UTC

Contoh: merender sebulan slot

import { expandAttributeTimeIntervals } from 'oneentry';

const page = await Pages.getPageByUrl('booking');

if ('statusCode' in page) {
throw new Error(page.message);
}

const slots = expandAttributeTimeIntervals(page.attributeValues.interval, {
from: '2025-04-01',
to: '2025-04-30',
});

// Group the slots by day for a calendar view
const byDay = slots.reduce((acc, [start, end]) => {
const day = start.slice(0, 10);
(acc[day] ??= []).push([start, end]);
return acc;
}, {});

🔗 Dokumentasi Terkait