From 35a0bbb8674cdb58ebeb30e7192d670485e735fd Mon Sep 17 00:00:00 2001 From: pdmarf <135653545+pdmarf@users.noreply.github.com> Date: Fri, 24 Apr 2026 09:15:48 +0100 Subject: [PATCH] v1.0.37: send setSettings and setState simultaneously to avoid flash Previously setSettings was awaited first (causing blue flash), then setState was called. Now both are sent in the same Promise.all so Stream Deck processes setState in the same batch, overriding the visual reset from setSettings with no visible blue transition. Co-Authored-By: Claude Sonnet 4.6 --- com.pdma.notion-timer.sdPlugin/bin/plugin.js | 10 ++++------ .../bin/plugin.js.sig | 3 +-- com.pdma.notion-timer.sdPlugin/manifest.json | 2 +- notion-timer.streamDeckPlugin | Bin 99189 -> 99198 bytes src/plugin.ts | 14 ++++++-------- version.json | 2 +- 6 files changed, 13 insertions(+), 18 deletions(-) diff --git a/com.pdma.notion-timer.sdPlugin/bin/plugin.js b/com.pdma.notion-timer.sdPlugin/bin/plugin.js index 14e91b5..b715cfb 100644 --- a/com.pdma.notion-timer.sdPlugin/bin/plugin.js +++ b/com.pdma.notion-timer.sdPlugin/bin/plugin.js @@ -6438,7 +6438,7 @@ async function stopTimer(token, entryId) { } // src/plugin.ts -var CURRENT_VERSION = "1.0.36"; +var CURRENT_VERSION = "1.0.37"; var GITEA_BASE = "https://gitea.pdmarf.co.uk/pdm/stream_deck_notion_timer/raw/branch/stable-rebuild"; var SIGNING_PUBLIC_KEY = `-----BEGIN PUBLIC KEY----- MCowBQYDK2VwAyEAN7ko8TUpuPzPAJuKAZCRjV0c4ZSlou5d9pUAF6o12b4= @@ -6623,9 +6623,8 @@ var TimerToggle = class extends SingletonAction { if (activeEntryId) { await stopTimer(global.notionToken, activeEntryId); const stopped = { ...ev.payload.settings, activeEntryId: null }; - await ev.action.setSettings(stopped); this.settingsCache.set(ev.action.id, stopped); - await Promise.all([ev.action.setState(0), ev.action.setTitle(title)]); + await Promise.all([ev.action.setSettings(stopped), ev.action.setState(0), ev.action.setTitle(title)]); await setRunningEntry(null); } else { const prevEntryId = await getRunningEntryId(); @@ -6636,8 +6635,8 @@ var TimerToggle = class extends SingletonAction { const otherSettings = this.settingsCache.get(other.id); if (otherSettings?.activeEntryId === prevEntryId) { const stopped = { ...otherSettings, activeEntryId: null }; - await other.setSettings(stopped); this.settingsCache.set(other.id, stopped); + await Promise.all([other.setSettings(stopped), other.setState(0), other.setTitle(buttonTitle(otherSettings.projectName || ""))]); } } } @@ -6649,9 +6648,8 @@ var TimerToggle = class extends SingletonAction { global.userId ); const started = { ...ev.payload.settings, activeEntryId: entryId }; - await ev.action.setSettings(started); this.settingsCache.set(ev.action.id, started); - await Promise.all([ev.action.setState(1), ev.action.setTitle(`\u23F1 ${title}`)]); + await Promise.all([ev.action.setSettings(started), ev.action.setState(1), ev.action.setTitle(`\u23F1 ${title}`)]); await setRunningEntry(entryId); } } catch (err) { diff --git a/com.pdma.notion-timer.sdPlugin/bin/plugin.js.sig b/com.pdma.notion-timer.sdPlugin/bin/plugin.js.sig index 530bb5d..e65c5ea 100644 --- a/com.pdma.notion-timer.sdPlugin/bin/plugin.js.sig +++ b/com.pdma.notion-timer.sdPlugin/bin/plugin.js.sig @@ -1,2 +1 @@ -Yxek*o -h@= \ No newline at end of file +ȩԝu1B!I- bhݵ Gr7L]x~cᅻdX ޹y9B// \ No newline at end of file diff --git a/com.pdma.notion-timer.sdPlugin/manifest.json b/com.pdma.notion-timer.sdPlugin/manifest.json index 66fe687..a946959 100644 --- a/com.pdma.notion-timer.sdPlugin/manifest.json +++ b/com.pdma.notion-timer.sdPlugin/manifest.json @@ -2,7 +2,7 @@ "Author": "Pete Marfleet", "Description": "Toggle Notion time tracking for a project with a single button press.", "Name": "Notion Timer", - "Version": "1.0.36", + "Version": "1.0.37", "SDKVersion": 2, "Software": { "MinimumVersion": "5.0" }, "OS": [{ "Platform": "mac", "MinimumVersion": "10.11" }], diff --git a/notion-timer.streamDeckPlugin b/notion-timer.streamDeckPlugin index 36eeeed5bda965109330aebbf675cf0533996fe2..01d4fca8aca75d1945c0f7f9d1ae830611e37652 100644 GIT binary patch delta 3031 zcmZ9Oc{J4f8^`Bs&sLUjEi?8OTVs#0WNDHu>RMvRl66qFX^<~Xr6`nTvMV8mWJ_7I zuO&kEv1D+~WUR>yew=&mxxe4(G4mo=3&p0%g z3uRZltIClaDnND8RTXVzwWI%GgxukP08Co|1j59B*!%C)j>!wh7T==F`iI%0IG0q; zDw*^|l`CmgmM+}%Hit`#w7!{7W!n~%ckNqg;Kr#es zm_0<@iF5-6W*^kKSK5hBfBcRuV>=&hpp=)b#Cf#-$OaqaXuYT&GU#n71oAGN5h4!} zg}4RyDc*ATb5Zn9YGgfm=!KX0$VXLWo~q7kFu*Q>I{#&V+a@Nc6p(JFT|9RLo`&o{9d`6da*N)Orh_DEp8>mx@R{| zVna6sFG!_%5caOmrVr@|hdquh-ei?eDtsf% zdwE!|+9y4PM%_yrR`DIfU2f=8SaL-a#K4=J`I9jG&j?(W1641*D;jlN6hs_Ybv-nO z=+LHa4hJOIy#46( zoacpMK0{So>z==MrEGubiN~`QY7}qGBpBi(-``m}Gwuze&Tt3{+zWtU+=t2Rymn=x zi7SUDf z!}PN7=iZjFWI>s*w>Dt{?}qKMEKZwAkIUiKnk_V=b*9*Gv~nU^I>M^bf;l9DqA7|0 zgfe>SSp}kho_UI^{gXr&-!3ez>Cd6)5+lC|TN9o~;X6tWruM3<16Y>#HYbJy8fl8X zBeX(dX{p|w-2Jf4C@0IE!G6D89P&7gh`5fj*Fl-vLOG!~<(7Bzwo;l~14d}Xo4>w8 zBWWjy7Z5yD`HcNXefbIt6TBsFSf&BbudXeF;ERs%4u5^NvYqFbbV6n=wHH4|3f6Zi z+Ks(4$4t3@TWT`UpDOnACBl|v&uuq7eJo=YRn$M-rU0(D-Tv&7$wYB0X2TTtA^CV1 z#lNAZzR0hLq+F2l%tFbdy+%iORbMQ7<)+xu+B3wgQRK4^&vmof)42_hFViw|ow1xQ zATsw_s#r_lILYMSXIBMRE9QY+%piKTDarrw}k_P?nq&9@}f2seQQ(JRz)}C_54PCzXwDwB?hzlIhpBZcI+mI#R*T} zt%kIoGc%Sy`$9yDksy+OEe;pn97(z$S-@CS+A~pA2bUoR6lzj$~Z#$ z0?H9Si8Vg@Xv^(qdTJ*heA4q5_V(Ux^wlTEtBcy9Mj<3Y8R)`hhMqITm@J==ARC&FZ8D5U-# znO@xdq)Ou93;SEjnV=xvp%v|#TnS%GQ|+3KueI^C=J$J$4X{?nVl1z3z^O6Ta2F?W_GKBqr>^k$6}*{x zsz}6nC{{rcD-sb1FEqMw*6Nx`mIa<;xgu3dZ3f;`^4hYu0W=(^mt>*>H#KuSzo{jd zJ-C4Pf=PU&65i2yVWsbQ1zwHvh8q3SxC))sXYW|hOtj)u_67Q025qT1 z#lX6uBO1B@R%c5YxG2n@eL5S27K`f12sHl5JYYU5`-l_vIIsV9=$5~DjI(mJrQf?y z)xG#BuAu`W#X_PJLGMz~*hC zCGwAH)P0TZTIm+znWF7ltOu(LM}^&f@vG7*&7^7SsZ!&)FO=ehxGL%X(Ai~+E6L=A z$hDx4FCl1fZ%gb&*Y|GN)!=;7_vM0$Qk}o0Z)Gg@3n$uY(;NqtI&72Z z$CRt4z7zT<8fmujS`#AL`TSujYW!C-g~^+|5q2i?Te37)HA$iQgXu9;x3vKqrQK^W zyzg60H3ldJfOWhZ7BFT!l*O+_00Q{3Fo30|6AMT&1J(GINWg^g5Lf>#vHgR$cn1)$ zWIV*kqnaq!|6nJ61OzVrQ~O&IuN?(I8QkXZ@CZNxe_S14#z#j11`N&romq(jtQd~{ z_`AnB8n6T=@MY0JFhgQ6{#`U6i#NRoTm{DQIro6;|DFcG0Rjw?n4=B}ycQ1N1q$)z OI6#uc8GA_QkpBSI3&oEB delta 3054 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 diff --git a/src/plugin.ts b/src/plugin.ts index b21f2cd..7671351 100644 --- a/src/plugin.ts +++ b/src/plugin.ts @@ -1,4 +1,4 @@ -const CURRENT_VERSION = "1.0.36"; +const CURRENT_VERSION = "1.0.37"; const GITEA_BASE = "https://gitea.pdmarf.co.uk/pdm/stream_deck_notion_timer/raw/branch/stable-rebuild"; const SIGNING_PUBLIC_KEY = `-----BEGIN PUBLIC KEY----- MCowBQYDK2VwAyEAN7ko8TUpuPzPAJuKAZCRjV0c4ZSlou5d9pUAF6o12b4= @@ -235,10 +235,9 @@ class TimerToggle extends SingletonAction { if (activeEntryId) { await stopTimer(global.notionToken, activeEntryId); const stopped = { ...ev.payload.settings, activeEntryId: null }; - await ev.action.setSettings(stopped); this.settingsCache.set(ev.action.id, stopped); - // Re-assert immediately — before setRunningEntry's async calls - await Promise.all([ev.action.setState(0), ev.action.setTitle(title)]); + // setSettings and setState together so the state reset doesn't flash + await Promise.all([ev.action.setSettings(stopped), ev.action.setState(0), ev.action.setTitle(title)]); await setRunningEntry(null); } else { const prevEntryId = await getRunningEntryId(); @@ -251,8 +250,8 @@ class TimerToggle extends SingletonAction { const otherSettings = this.settingsCache.get(other.id); if (otherSettings?.activeEntryId === prevEntryId) { const stopped = { ...otherSettings, activeEntryId: null }; - await other.setSettings(stopped); this.settingsCache.set(other.id, stopped); + await Promise.all([other.setSettings(stopped), other.setState(0), other.setTitle(buttonTitle(otherSettings.projectName || ""))]); } } } @@ -265,10 +264,9 @@ class TimerToggle extends SingletonAction { global.userId, ); const started = { ...ev.payload.settings, activeEntryId: entryId }; - await ev.action.setSettings(started); this.settingsCache.set(ev.action.id, started); - // Re-assert immediately — before setRunningEntry's async calls - await Promise.all([ev.action.setState(1), ev.action.setTitle(`⏱ ${title}`)]); + // setSettings and setState together so the state reset doesn't flash + await Promise.all([ev.action.setSettings(started), ev.action.setState(1), ev.action.setTitle(`⏱ ${title}`)]); await setRunningEntry(entryId); } } catch (err) { diff --git a/version.json b/version.json index e96f7f9..453a425 100644 --- a/version.json +++ b/version.json @@ -1 +1 @@ -{ "version": "1.0.36" } +{ "version": "1.0.37" }