mirror of
https://github.com/aljazceru/notedeck.git
synced 2025-12-23 11:14:19 +01:00
@@ -4,6 +4,7 @@ use async_openai::{
|
|||||||
Client,
|
Client,
|
||||||
};
|
};
|
||||||
use chrono::{Duration, Local};
|
use chrono::{Duration, Local};
|
||||||
|
use egui::{Align, Key, KeyboardShortcut, Layout, Modifiers};
|
||||||
use egui_wgpu::RenderState;
|
use egui_wgpu::RenderState;
|
||||||
use futures::StreamExt;
|
use futures::StreamExt;
|
||||||
use nostrdb::Transaction;
|
use nostrdb::Transaction;
|
||||||
@@ -140,27 +141,57 @@ You are an AI agent for the nostr protocol called Dave, created by Damus. nostr
|
|||||||
should_send
|
should_send
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn chat_margin(ctx: &egui::Context) -> i8 {
|
||||||
|
if notedeck::ui::is_narrow(ctx) {
|
||||||
|
20
|
||||||
|
} else {
|
||||||
|
100
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn chat_frame(ctx: &egui::Context) -> egui::Frame {
|
||||||
|
let margin = Self::chat_margin(ctx);
|
||||||
|
egui::Frame::new().inner_margin(egui::Margin {
|
||||||
|
left: margin,
|
||||||
|
right: margin,
|
||||||
|
top: 50,
|
||||||
|
bottom: 0,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
fn render(&mut self, app_ctx: &AppContext, ui: &mut egui::Ui) {
|
fn render(&mut self, app_ctx: &AppContext, ui: &mut egui::Ui) {
|
||||||
// Scroll area for chat messages
|
// Scroll area for chat messages
|
||||||
egui::Frame::new()
|
egui::Frame::NONE.show(ui, |ui| {
|
||||||
.inner_margin(egui::Margin {
|
ui.with_layout(Layout::bottom_up(Align::Min), |ui| {
|
||||||
left: 50,
|
let margin = Self::chat_margin(ui.ctx());
|
||||||
right: 50,
|
|
||||||
top: 50,
|
egui::Frame::new()
|
||||||
bottom: 50,
|
.outer_margin(egui::Margin {
|
||||||
})
|
left: margin,
|
||||||
.show(ui, |ui| {
|
right: margin,
|
||||||
|
top: 0,
|
||||||
|
bottom: 100,
|
||||||
|
})
|
||||||
|
.inner_margin(egui::Margin::same(8))
|
||||||
|
.fill(ui.visuals().extreme_bg_color)
|
||||||
|
//.stroke(stroke)
|
||||||
|
.corner_radius(12.0)
|
||||||
|
.show(ui, |ui| {
|
||||||
|
self.inputbox(app_ctx, ui);
|
||||||
|
});
|
||||||
|
|
||||||
egui::ScrollArea::vertical()
|
egui::ScrollArea::vertical()
|
||||||
.stick_to_bottom(true)
|
.stick_to_bottom(true)
|
||||||
.auto_shrink([false; 2])
|
.auto_shrink([false; 2])
|
||||||
.show(ui, |ui| {
|
.show(ui, |ui| {
|
||||||
ui.vertical(|ui| {
|
Self::chat_frame(ui.ctx()).show(ui, |ui| {
|
||||||
self.render_chat(ui);
|
ui.vertical(|ui| {
|
||||||
})
|
self.render_chat(ui);
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
self.inputbox(app_ctx, ui);
|
|
||||||
});
|
});
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
fn render_chat(&self, ui: &mut egui::Ui) {
|
fn render_chat(&self, ui: &mut egui::Ui) {
|
||||||
@@ -221,15 +252,34 @@ You are an AI agent for the nostr protocol called Dave, created by Damus. nostr
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn handle_send(&mut self, app_ctx: &AppContext, ui: &egui::Ui) {
|
||||||
|
self.chat.push(Message::User(self.input.clone()));
|
||||||
|
self.send_user_message(app_ctx, ui.ctx());
|
||||||
|
self.input.clear();
|
||||||
|
}
|
||||||
|
|
||||||
fn inputbox(&mut self, app_ctx: &AppContext, ui: &mut egui::Ui) {
|
fn inputbox(&mut self, app_ctx: &AppContext, ui: &mut egui::Ui) {
|
||||||
|
//ui.add_space(Self::chat_margin(ui.ctx()) as f32);
|
||||||
ui.horizontal(|ui| {
|
ui.horizontal(|ui| {
|
||||||
ui.add(egui::TextEdit::multiline(&mut self.input));
|
ui.with_layout(Layout::right_to_left(Align::Max), |ui| {
|
||||||
ui.add_space(8.0);
|
let r = ui.add(
|
||||||
if ui.button("Send").clicked() {
|
egui::TextEdit::multiline(&mut self.input)
|
||||||
self.chat.push(Message::User(self.input.clone()));
|
.desired_width(f32::INFINITY)
|
||||||
self.send_user_message(app_ctx, ui.ctx());
|
.return_key(KeyboardShortcut::new(
|
||||||
self.input.clear();
|
Modifiers {
|
||||||
}
|
shift: true,
|
||||||
|
..Default::default()
|
||||||
|
},
|
||||||
|
Key::Enter,
|
||||||
|
))
|
||||||
|
.hint_text(egui::RichText::new("Ask dave anything...").weak())
|
||||||
|
.frame(false),
|
||||||
|
);
|
||||||
|
|
||||||
|
if r.has_focus() && ui.input(|i| i.key_pressed(egui::Key::Enter)) {
|
||||||
|
self.handle_send(app_ctx, ui);
|
||||||
|
}
|
||||||
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user