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.
| Olay | Yük | İzin |
|---|---|---|
media.change | NowPlaying | null | media.read |
battery.change | BatteryState | battery.read |
calendar.change | null; calendar.events()'i yeniden oku | calendar.read |
reminders.change | null | reminders.read |
clipboard.change | { text: string | null } | clipboard.read |
network.change | { online: boolean } | — |
system.wake / system.sleep | null | — |
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 25Kestirmeler (Shortcuts) uygulamasından ya da herhangi bir yerden URL ile:
adanotch://ext/local.username.pomodoro/start?data=25Eklentide 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.