func()

in pkg/selector/outputs/bubbletea.go [74:184]


func (m BubbleTeaModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
	switch msg := msg.(type) {
	case tea.KeyMsg:
		// don't listen for input if currently typing into text field
		if m.tableModel.filterTextInput.Focused() {
			break
		} else if m.sortingModel.sortTextInput.Focused() {
			// see if we should sort and switch states to table
			if m.currentState == stateSorting && msg.String() == "enter" {
				jsonPath := m.sortingModel.sortTextInput.Value()

				sortDirection := sorter.SortAscending
				if m.sortingModel.isDescending {
					sortDirection = sorter.SortDescending
				}

				var err error
				m.tableModel, err = m.tableModel.sortTable(jsonPath, sortDirection)
				if err != nil {
					m.sortingModel.sortTextInput.SetValue(jsonPathError)
					break
				}

				m.currentState = stateTable

				m.sortingModel.sortTextInput.Blur()
			}

			break
		}

		// check for quit or change in state
		switch msg.String() {
		case "ctrl+c", "q":
			return m, tea.Quit
		case "e":
			// switch from table state to verbose state
			if m.currentState == stateTable {
				// get focused instance type
				focusedRow := m.tableModel.table.HighlightedRow()
				focusedInstance, ok := focusedRow.Data[instanceTypeKey].(*instancetypes.Details)
				if !ok {
					break
				}

				// set content of view
				m.verboseModel.focusedInstanceName = focusedInstance.InstanceType
				m.verboseModel.viewport.SetContent(VerboseInstanceTypeOutput([]*instancetypes.Details{focusedInstance})[0])

				// move viewport to top of printout
				m.verboseModel.viewport.SetYOffset(0)

				// switch from table state to verbose state
				m.currentState = stateVerbose
			}
		case "s":
			// switch from table view to sorting view
			if m.currentState == stateTable {
				m.currentState = stateSorting
			}
		case "enter":
			// sort and switch states to table
			if m.currentState == stateSorting {
				sortFilter := string(m.sortingModel.shorthandList.SelectedItem().(item))

				sortDirection := sorter.SortAscending
				if m.sortingModel.isDescending {
					sortDirection = sorter.SortDescending
				}

				var err error
				m.tableModel, err = m.tableModel.sortTable(sortFilter, sortDirection)
				if err != nil {
					m.sortingModel.sortTextInput.SetValue("INVALID SHORTHAND VALUE")
					break
				}

				m.currentState = stateTable

				m.sortingModel.sortTextInput.Blur()
			}
		case "esc":
			// switch from sorting state or verbose state to table state
			if m.currentState == stateSorting || m.currentState == stateVerbose {
				m.currentState = stateTable
			}
		}
	case tea.WindowSizeMsg:
		// This is needed to handle a bug with bubble tea
		// where resizing causes misprints (https://github.com/Evertras/bubble-table/issues/121)
		termenv.ClearScreen() //nolint:staticcheck

		// handle screen resizing
		m.tableModel = m.tableModel.resizeView(msg)
		m.verboseModel = m.verboseModel.resizeView(msg)
		m.sortingModel = m.sortingModel.resizeView(msg)
	}

	var cmd tea.Cmd
	// update currently active state
	switch m.currentState {
	case stateTable:
		m.tableModel, cmd = m.tableModel.update(msg)
	case stateVerbose:
		m.verboseModel, cmd = m.verboseModel.update(msg)
	case stateSorting:
		m.sortingModel, cmd = m.sortingModel.update(msg)
	}

	return m, cmd
}