Ada Eklentileri
Rehberler

Olaylar ve zamanlayıcılar

Değişikliklere tepki ver, kendi zamanlamanı kur, Kestirmeler'den komut al.

Eklentin sürekli çalışan bir süreçtir; yalnız update çağrıldığında uyanmak zorunda değil. Olaylara abone olabilir, zamanlayıcı kurabilir ve görünümü istediğin an ctx.render ile değiştirebilirsin.

Olaylara abone olmak

Aboneliği setup içinde kur:

const { activity, events, media, ui } = AdanotchKit;

activity({
  setup(ctx) {
    events.on("media.change", (track) => {
      // track: NowPlaying | null
      ctx.refresh();
    });
    events.on("system.wake", () => ctx.refresh());
  },
  async update() {
    const track = await media.nowPlaying();
    return { compact: { trailing: ui.text(track?.title ?? "—") } };
  },
});

events.on aboneliği kaldıran bir fonksiyon döndürür; events.off(event, handler) da aynı işi yapar.

OlayYükİzin
media.changeNowPlaying | nullmedia.read
battery.changeBatteryStatebattery.read
calendar.changenull; calendar.events()'i yeniden okucalendar.read
reminders.changenullreminders.read
clipboard.change{ text: string | null }clipboard.read
network.change{ online: boolean }—
system.wake / system.sleepnull—
appearance.change{ appearance: "light" | "dark" }—
command{ name: string, data: JSONValue }—

İşleyici async olabilir. İçinde fırlatılan hata günlüğe yazılır, eklentiyi durdurmaz.

refresh: manual

Yalnız olaylarla güncellenen bir eklentide manifest.json'a "refresh": "manual" yaz; Adanotch update'i kendiliğinden çağırmaz, boşuna çalışmaz.

Zamanlayıcılar

setTimeout, setInterval, clearTimeout, clearInterval ve queueMicrotask tarayıcıdaki gibidir. Aynı anda en fazla 200 zamanlayıcı olabilir; setInterval en sık 50 ms'de bir çalışır.

let endsAt: number | null = null;
let tick: number | undefined;

activity({
  onAction(action, ctx) {
    if (action === "start") {
      endsAt = Date.now() + 25 * 60_000;
      clearInterval(tick);
      tick = setInterval(() => {
        if (endsAt && Date.now() >= endsAt) {
          clearInterval(tick);
          endsAt = null;
          AdanotchKit.notify.island({ text: "Mola zamanı", icon: "cup.and.saucer", tone: "success" });
          ctx.refresh();
        }
      }, 1000);
    }
  },
  update() {
    return {
      compact: { trailing: endsAt ? ui.timer(endsAt) : ui.icon("timer") },
      expanded: ui.button("25 dk başlat", "start", { primary: true }),
    };
  },
});

Saniye saymak için yeniden çizme

ui.timer(date) kendi kendine sayar. Her saniye render çağırmana gerek yok; zamanlayıcıyı yalnız süre bittiğinde bir şey yapmak için kur.

Ara güncellemeler: ctx.render

Uzun bir iş sırasında kullanıcıya ilerleme göstermek için:

async update(ctx) {
  ctx.render({ compact: { trailing: ui.icon("arrow.triangle.2.circlepath", { tone: "secondary" }) } });
  const repos = await loadRepos();                       // yavaş
  return { compact: { trailing: ui.badge(String(repos.length)) }, expanded: list(repos) };
}

ctx'in olmadığı yerlerden AdanotchKit.render(view) aynı işi yapar.

Komutlar ve Kestirmeler

Eklentine dışarıdan komut gönderebilirsin. Terminalden:

adanotch ext local.username.pomodoro start 25

Kestirmeler (Shortcuts) uygulamasından ya da herhangi bir yerden URL ile:

adanotch://ext/local.username.pomodoro/start?data=25

Eklentide command olayı olarak gelir. data JSON olarak çözülebiliyorsa çözülür, yoksa metin olarak gelir:

events.on("command", ({ name, data }, ctx) => {
  if (name === "start") startTimer(Number(data) || 25);
  if (name === "stop") stopTimer();
  ctx.refresh();
});

Bu sayede bir Kestirme'yi bir tuş kombinasyonuna, Odak moduna ya da bir otomasyona bağlayıp eklentini tetikleyebilirsin.

Bu sayfada