From a1079766bd657c09b80a1f5a94847012ff864654 Mon Sep 17 00:00:00 2001 From: kuannnn Date: Sun, 29 Mar 2026 09:51:11 +0800 Subject: [PATCH] chore: bump version to 0.3.0 Co-Authored-By: Claude Opus 4.6 (1M context) --- package.json | 2 +- src/components/TaskFab.tsx | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index af4d097..eb61375 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@kuannnn/clawtap", - "version": "0.2.3", + "version": "0.3.0", "description": "Mobile UI for AI coding assistants. Real-time sync with Claude Code, Codex CLI, and Gemini CLI via tmux.", "type": "module", "bin": { diff --git a/src/components/TaskFab.tsx b/src/components/TaskFab.tsx index df3ba3c..0897196 100644 --- a/src/components/TaskFab.tsx +++ b/src/components/TaskFab.tsx @@ -1,4 +1,4 @@ -import { useState, useEffect } from 'react'; +import { useState, useEffect, useRef } from 'react'; import type { TaskSnapshot } from '../hooks/useTaskState'; type FabState = 'hidden' | 'visible' | 'fading'; @@ -11,6 +11,7 @@ interface TaskFabProps { export function TaskFab({ snapshot, onClick }: TaskFabProps) { const { completed, total } = snapshot; const [fabState, setFabState] = useState('hidden'); + const hasBeenVisible = useRef(false); const allDone = total > 0 && completed === total; const pct = total > 0 ? completed / total : 0; @@ -18,8 +19,12 @@ export function TaskFab({ snapshot, onClick }: TaskFabProps) { useEffect(() => { if (total === 0) { setFabState('hidden'); + hasBeenVisible.current = false; return; } + // Skip showing FAB if all tasks were already done on first load (reconnect) + if (allDone && !hasBeenVisible.current) return; + hasBeenVisible.current = true; setFabState('visible'); if (allDone) { const timer = setTimeout(() => setFabState('fading'), 3000);