Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
637462b
add: Voice Bot WebSocket API documentation for real-time interaction
Gabry848 Jan 30, 2026
7a26d2d
fix: adjust recording delay and improve error handling in audio recorder
Gabry848 Jan 30, 2026
2a15438
feat: enhance audio processing and update VAD configuration for impro…
Gabry848 Jan 30, 2026
3ad6964
feat: integrate expo-audio and expo-audio-studio for enhanced voice c…
Gabry848 Feb 2, 2026
317c490
feat: migrate audio processing from expo-audio-studio to @picovoice/r…
Gabry848 Feb 2, 2026
3b24cde
refactor: simplify voice activity detection and related states in aud…
Gabry848 Feb 2, 2026
215d5c3
refactor: rename botservice imports to textBotService for consistency
Gabry848 Feb 2, 2026
71bc3bc
refactor: remove sendInterrupt and update audio sending mechanism to …
Gabry848 Feb 2, 2026
39143a1
refactor: streamline disconnect and cleanup processes in voice chat f…
Gabry848 Feb 3, 2026
82801f2
refactor: enhance voice chat state management and recording logic
Gabry848 Feb 3, 2026
10237a2
refactor: enhance voice chat functionality with mute/unmute feature a…
Gabry848 Feb 3, 2026
95c6e21
refactor: enhance voice chat message handling with unified message st…
Gabry848 Feb 4, 2026
c7379af
refactor: improve voice chat message handling with new Message and To…
Gabry848 Feb 4, 2026
7f46687
fix: resolved the icon in the entry for open the voice chat
Gabry848 Feb 4, 2026
3f26ce5
add: creata la versione alpha della visualizzazione dei widget nella …
Gabry848 Feb 5, 2026
ff7dce4
feat: migliroata la visualizzazione dei task risolvendo un errore di …
Gabry848 Feb 5, 2026
8db0473
remove: removed the widget from the voice chat
Gabry848 Feb 6, 2026
e9d6ae3
add: aggiunto il nuobvo calendario in stile google calendar che verra…
Gabry848 Feb 6, 2026
cb0bded
chore: add auto-claude entries to .gitignore
Gabry848 Feb 6, 2026
8430ca0
edit: modficato il bottone per agigugnere un task in calendar2.0
Gabry848 Feb 6, 2026
f615e1f
feat: modificato lo stile del calendar2.0
Gabry848 Feb 6, 2026
5e91d20
feat: migliorato lo stile del calendar2.0 con padding e distranzxa
Gabry848 Feb 6, 2026
ed45f32
refactor: migliora UI del Calendar20 con nuovo modal e view selector
Gabry848 Feb 6, 2026
0bc2293
add: aggiunte animazioni per il modal in calendaView
Gabry848 Feb 6, 2026
4433833
add: migliorato il calendar20 e aggiutna la funzionta di creare un ta…
Gabry848 Feb 6, 2026
a4caae9
feat: integrate calendar functionality in VoiceChatModal for task man…
Gabry848 Feb 7, 2026
e789e59
refactor: usa componente Task nel VoiceChatModal per consistenza con …
Gabry848 Feb 7, 2026
d3bae4b
feat: add animated loading dots and smooth state transitions in Voice…
Gabry848 Feb 7, 2026
b8940ba
fix: resolve recursive loop in TaskCacheService causing app freeze af…
Gabry848 Feb 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 9 additions & 1 deletion .claude/settings.local.json
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,15 @@
"Bash(powershell -Command \"Get-Content ''e:\\\\MyTaskly\\\\MyTaskly-app\\\\src\\\\locales\\\\en.json'' | Select-Object -Last 20\")",
"Bash(powershell -Command \"Get-Content ''e:\\\\MyTaskly\\\\MyTaskly-app\\\\src\\\\locales\\\\it.json'' | Select-Object -Last 20\")",
"Bash(npm ls:*)",
"Bash(curl:*)"
"Bash(curl:*)",
"Bash(export NVM_DIR=\"$HOME/.nvm\")",
"Bash([ -s \"$NVM_DIR/nvm.sh\" ])",
"Bash(. \"$NVM_DIR/nvm.sh\")",
"Bash(npm test:*)",
"Bash(xargs:*)",
"WebFetch(domain:www.npmjs.com)",
"WebFetch(domain:docs.expo.dev)",
"WebFetch(domain:github.com)"
],
"deny": [],
"defaultMode": "acceptEdits"
Expand Down
11 changes: 11 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -51,3 +51,14 @@ docs/
# Firebase secrets

*firebase-adminsdk*.json

# Auto Claude data directory
.auto-claude/

# Auto Claude generated files
.auto-claude-security.json
.auto-claude-status
.claude_settings.json
.worktrees/
.security-key
logs/security/
3 changes: 2 additions & 1 deletion app.json
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,8 @@
}
],
"expo-dev-client",
"expo-router"
"expo-router",
"expo-audio"
],
"extra": {
"eas": {
Expand Down
393 changes: 151 additions & 242 deletions package-lock.json

Large diffs are not rendered by default.

4 changes: 3 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
"@expo/vector-icons": "^14.0.2",
"@flyerhq/react-native-chat-ui": "^1.4.3",
"@openspacelabs/react-native-zoomable-view": "^2.3.1",
"@picovoice/react-native-voice-processor": "^1.2.3",
"@react-native-async-storage/async-storage": "^2.2.0",
"@react-native-community/datetimepicker": "8.4.1",
"@react-native-google-signin/google-signin": "^15.0.0",
Expand All @@ -36,6 +37,7 @@
"dotenv": "^17.2.1",
"eventsource": "^4.0.0",
"expo": "~53.0.23",
"expo-audio": "~0.4.9",
"expo-av": "^15.1.7",
"expo-blur": "~14.1.5",
"expo-constants": "~17.1.7",
Expand Down Expand Up @@ -85,7 +87,7 @@
},
"devDependencies": {
"@babel/core": "^7.25.2",
"@react-native-community/cli": "^18.0.0",
"@react-native-community/cli": "^14.0.1",
"@types/jest": "^29.5.12",
"@types/react": "~19.0.10",
"@types/react-test-renderer": "^18.3.0",
Expand Down
78 changes: 48 additions & 30 deletions src/components/BotChat/MessageBubble.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import TaskListBubble from './TaskListBubble'; // Nuovo componente card-based
import TaskTableBubble from './TaskTableBubble'; // Mantieni per backward compatibility
import Markdown from 'react-native-markdown-display'; // Supporto per Markdown
import WidgetBubble from './widgets/WidgetBubble';
import InlineVisualizationWidget from './widgets/InlineVisualizationWidget';
import VisualizationModal from './widgets/VisualizationModal';
import ItemDetailModal from './widgets/ItemDetailModal';
import TaskEditModal from '../Task/TaskEditModal';
Expand All @@ -13,7 +14,7 @@ import CategoryMenu from '../Category/CategoryMenu';
import { Task as TaskType } from '../../services/taskService';
import { updateTask, updateCategory, deleteCategory } from '../../services/taskService';

const MessageBubble: React.FC<MessageBubbleProps> = ({ message, style }) => {
const MessageBubble: React.FC<MessageBubbleProps> = ({ message, style, isVoiceChat = false }) => {
const isBot = message.sender === 'bot';
const fadeAnim = useRef(new Animated.Value(0)).current;
const slideAnim = useRef(new Animated.Value(20)).current;
Expand Down Expand Up @@ -362,38 +363,55 @@ const MessageBubble: React.FC<MessageBubbleProps> = ({ message, style }) => {
{/* WIDGETS SOPRA AL MESSAGGIO (come richiesto dall'utente) */}
{isBot && message.toolWidgets && message.toolWidgets.length > 0 && (
<View style={styles.widgetsContainer}>
{message.toolWidgets.map((widget) => (
<WidgetBubble
key={widget.id}
widget={widget}
onOpenVisualization={handleOpenVisualization}
onOpenItemDetail={handleOpenItemDetail}
onTaskPress={handleTaskPress}
onCategoryPress={handleCategoryPress}
/>
))}
{message.toolWidgets.map((widget) => {
// In voice chat usa InlineVisualizationWidget
if (isVoiceChat) {
return (
<InlineVisualizationWidget
key={widget.id}
widget={widget}
onTaskPress={handleTaskPress}
onCategoryPress={handleCategoryPress}
/>
);
}

// In text chat usa WidgetBubble (comportamento attuale)
return (
<WidgetBubble
key={widget.id}
widget={widget}
onOpenVisualization={handleOpenVisualization}
onOpenItemDetail={handleOpenItemDetail}
onTaskPress={handleTaskPress}
onCategoryPress={handleCategoryPress}
/>
);
})}
</View>
)}

{/* BUBBLE DEL MESSAGGIO */}
<View style={[
styles.messageBubble,
isBot ? styles.botBubble : styles.userBubble
]}>
{renderMessageContent()}
{message.isStreaming && isBot && (
<View style={styles.streamingIndicator}>
<Animated.View style={[styles.streamingDot, { opacity: streamingDot1 }]} />
<Animated.View style={[styles.streamingDot, { opacity: streamingDot2 }]} />
<Animated.View style={[styles.streamingDot, { opacity: streamingDot3 }]} />
</View>
)}
{message.modelType && isBot && !message.isStreaming && (
<Text style={styles.modelType}>
{message.modelType === 'advanced' ? 'Modello avanzato' : 'Modello base'}
</Text>
)}
</View>
{/* BUBBLE DEL MESSAGGIO - renderizza solo se c'è testo */}
{message.text && message.text.trim() !== '' && (
<View style={[
styles.messageBubble,
isBot ? styles.botBubble : styles.userBubble
]}>
{renderMessageContent()}
{message.isStreaming && isBot && (
<View style={styles.streamingIndicator}>
<Animated.View style={[styles.streamingDot, { opacity: streamingDot1 }]} />
<Animated.View style={[styles.streamingDot, { opacity: streamingDot2 }]} />
<Animated.View style={[styles.streamingDot, { opacity: streamingDot3 }]} />
</View>
)}
{message.modelType && isBot && !message.isStreaming && (
<Text style={styles.modelType}>
{message.modelType === 'advanced' ? 'Modello avanzato' : 'Modello base'}
</Text>
)}
</View>
)}

<Text style={[
styles.messageTime,
Expand Down
Loading
Loading