summaryrefslogtreecommitdiff
path: root/pkg/ui/views/views.go
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/ui/views/views.go')
-rw-r--r--pkg/ui/views/views.go144
1 files changed, 144 insertions, 0 deletions
diff --git a/pkg/ui/views/views.go b/pkg/ui/views/views.go
new file mode 100644
index 0000000..fa70035
--- /dev/null
+++ b/pkg/ui/views/views.go
@@ -0,0 +1,144 @@
+package views
+
+import (
+ "errors"
+ "os"
+
+ "os/exec"
+
+ tea "github.com/charmbracelet/bubbletea"
+ "github.com/charmbracelet/lipgloss"
+ "golang.org/x/term"
+)
+
+var logo = `
+▗▄▄▖ ▗▄▖ ▗▖ ▗▖ ▗▄▖ ▗▖ ▗▖▗▖ ▗▖ ▗▄▖
+▐▌ ▐▌▐▌ ▐▌▐▌ ▐▌▐▌ ▐▌▐▛▚▖▐▌▐▛▚▖▐▌▐▌ ▐▌
+▐▛▀▚▖▐▛▀▜▌▐▛▀▜▌▐▛▀▜▌▐▌ ▝▜▌▐▌ ▝▜▌▐▛▀▜▌
+▐▌ ▐▌▐▌ ▐▌▐▌ ▐▌▐▌ ▐▌▐▌ ▐▌▐▌ ▐▌▐▌ ▐▌
+`
+
+var (
+ highlightColor = lipgloss.Color("#7ee2a8")
+ errorStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("#ff0000"))
+ altCodeStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("#666666")).Bold(true)
+ windowStyle = lipgloss.NewStyle().BorderForeground(highlightColor).Padding(2, 0).Align(lipgloss.Center).Border(lipgloss.RoundedBorder())
+ inputStyle = lipgloss.NewStyle().Foreground(highlightColor)
+)
+
+// Get terminal size dynamically
+func GetTerminalSize() (width, height int) {
+ fd := int(os.Stdin.Fd())
+ if w, h, err := term.GetSize(fd); err == nil {
+ return w, h
+ }
+ return 80, 24 // Default size if detection fails
+}
+
+// Clear terminal screen
+func ClearScreen() {
+ if len(os.Getenv("DEBUG")) == 0 {
+ cmd := exec.Command("clear")
+ if os.Getenv("OS") == "Windows_NT" {
+ cmd = exec.Command("cmd", "/c", "cls")
+ }
+ cmd.Stdout = os.Stdout
+ cmd.Run()
+ }
+}
+
+func getFormWidth(width int) int {
+ formWidth := width * 2 / 3
+ if formWidth > 80 {
+ formWidth = 80 // Cap at 80 chars for readability
+ } else if formWidth < 40 {
+ formWidth = width - 4 // For small terminals
+ }
+
+ return formWidth
+}
+
+type RahannaModel struct {
+ width int
+ height int
+ currentModel tea.Model
+ auth AuthModel
+ play PlayModel
+}
+
+func NewRahannaModel() RahannaModel {
+ width, height := GetTerminalSize()
+
+ auth := NewAuthModel(width, height)
+ play := NewPlayModel(width, height)
+
+ var currentModel tea.Model = auth
+
+ if _, err := os.Stat(".rahannarc"); !errors.Is(err, os.ErrNotExist) {
+ currentModel = play
+ }
+
+ return RahannaModel{
+ width: width,
+ height: height,
+ currentModel: currentModel,
+ auth: auth,
+ play: play,
+ }
+}
+
+func (m RahannaModel) Init() tea.Cmd {
+ return m.currentModel.Init()
+}
+
+type switchModel struct {
+ model tea.Model
+}
+
+func SwitchModelCmd(model tea.Model) tea.Cmd {
+ s := switchModel{
+ model: model,
+ }
+
+ return func() tea.Msg {
+ return s
+ }
+}
+
+func (m RahannaModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
+ switch msg := msg.(type) {
+ case switchModel:
+ m.currentModel = msg.model
+ return m, nil
+ }
+ var cmd tea.Cmd
+ m.currentModel, cmd = m.currentModel.Update(msg)
+ return m, cmd
+}
+
+func (m RahannaModel) View() string {
+ return m.currentModel.View()
+}
+
+func handleExit(msg tea.Msg) tea.Cmd {
+ switch msg := msg.(type) {
+ case tea.KeyMsg:
+ switch msg.String() {
+ case "ctrl+c":
+ return tea.Quit
+ }
+ }
+
+ return nil
+}
+
+func getLogo(width int) string {
+ logoStyle := lipgloss.NewStyle().
+ Foreground(lipgloss.Color("#7ee2a8")).
+ Bold(true).
+ Align(lipgloss.Center).
+ Width(width)
+
+ return logoStyle.Render(logo)
+
+}