summaryrefslogtreecommitdiffhomepage
path: root/internal/tui/components
diff options
context:
space:
mode:
authoradamdottv <[email protected]>2025-05-30 08:29:37 -0500
committeradamdottv <[email protected]>2025-05-30 08:29:37 -0500
commit9bf024f8bee8ed94218bb492f42639e411ed752e (patch)
tree48755fd42eaa4272f4752ff6cef2f9c98f0a94d6 /internal/tui/components
parent189d0e5fb2fc728c639952dd17fef1abdf251c18 (diff)
downloadopencode-9bf024f8bee8ed94218bb492f42639e411ed752e.tar.gz
opencode-9bf024f8bee8ed94218bb492f42639e411ed752e.zip
wip: refactoring tui
Diffstat (limited to 'internal/tui/components')
-rw-r--r--internal/tui/components/chat/sidebar.go10
-rw-r--r--internal/tui/components/qr/qr.go58
2 files changed, 65 insertions, 3 deletions
diff --git a/internal/tui/components/chat/sidebar.go b/internal/tui/components/chat/sidebar.go
index 4a85784fc..4e77c75b8 100644
--- a/internal/tui/components/chat/sidebar.go
+++ b/internal/tui/components/chat/sidebar.go
@@ -9,6 +9,7 @@ import (
"github.com/charmbracelet/lipgloss"
"github.com/sst/opencode/internal/config"
"github.com/sst/opencode/internal/tui/app"
+ "github.com/sst/opencode/internal/tui/components/qr"
"github.com/sst/opencode/internal/tui/state"
"github.com/sst/opencode/internal/tui/styles"
"github.com/sst/opencode/internal/tui/theme"
@@ -52,6 +53,11 @@ func (m *sidebarCmp) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
func (m *sidebarCmp) View() string {
baseStyle := styles.BaseStyle()
+ qrcode := ""
+ if m.app.Session.ShareID != nil {
+ url := "https://dev.opencode.ai/share?id="
+ qrcode, _, _ = qr.Generate(url + m.app.Session.Id)
+ }
return baseStyle.
Width(m.width).
@@ -64,9 +70,7 @@ func (m *sidebarCmp) View() string {
" ",
m.sessionSection(),
" ",
- lspsConfigured(m.width),
- " ",
- m.modifiedFiles(),
+ qrcode,
),
)
}
diff --git a/internal/tui/components/qr/qr.go b/internal/tui/components/qr/qr.go
new file mode 100644
index 000000000..42a60bb5e
--- /dev/null
+++ b/internal/tui/components/qr/qr.go
@@ -0,0 +1,58 @@
+package qr
+
+import (
+ "strings"
+
+ "github.com/charmbracelet/lipgloss"
+ "github.com/sst/opencode/internal/tui/theme"
+ "rsc.io/qr"
+)
+
+var tops_bottoms = []rune{' ', '▀', '▄', '█'}
+
+// Generate a text string to a QR code, which you can write to a terminal or file.
+func Generate(text string) (string, int, error) {
+ code, err := qr.Encode(text, qr.Level(0))
+ if err != nil {
+ return "", 0, err
+ }
+
+ t := theme.CurrentTheme()
+ if t == nil {
+ return "", 0, err
+ }
+
+ // Create lipgloss style for QR code with theme colors
+ qrStyle := lipgloss.NewStyle().
+ Foreground(t.Text()).
+ Background(t.Background())
+
+ var result strings.Builder
+
+ // content
+ for y := 0; y < code.Size-1; y += 2 {
+ var line strings.Builder
+ for x := 0; x < code.Size; x += 1 {
+ var num int8
+ if code.Black(x, y) {
+ num += 1
+ }
+ if code.Black(x, y+1) {
+ num += 2
+ }
+ line.WriteRune(tops_bottoms[num])
+ }
+ result.WriteString(qrStyle.Render(line.String()) + "\n")
+ }
+
+ // add lower border when required (only required when QR size is odd)
+ if code.Size%2 == 1 {
+ var borderLine strings.Builder
+ for range code.Size {
+ borderLine.WriteRune('▀')
+ }
+ result.WriteString(qrStyle.Render(borderLine.String()) + "\n")
+ }
+
+ return result.String(), code.Size, nil
+}