feat: support multiple terminal fonts (#17257)

Fixes: https://github.com/coder/coder/issues/15024
This commit is contained in:
Marcin Tojek
2025-04-07 14:30:10 +02:00
committed by GitHub
parent 30f41cdd42
commit 743d308eb3
29 changed files with 815 additions and 230 deletions

View File

@ -6,6 +6,7 @@ import (
"errors"
"fmt"
"net/http"
"slices"
"github.com/go-chi/chi/v5"
"github.com/go-chi/render"
@ -976,7 +977,7 @@ func (api *API) userAppearanceSettings(rw http.ResponseWriter, r *http.Request)
user = httpmw.UserParam(r)
)
themePreference, err := api.Database.GetUserAppearanceSettings(ctx, user.ID)
themePreference, err := api.Database.GetUserThemePreference(ctx, user.ID)
if err != nil {
if !errors.Is(err, sql.ErrNoRows) {
httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{
@ -989,8 +990,22 @@ func (api *API) userAppearanceSettings(rw http.ResponseWriter, r *http.Request)
themePreference = ""
}
terminalFont, err := api.Database.GetUserTerminalFont(ctx, user.ID)
if err != nil {
if !errors.Is(err, sql.ErrNoRows) {
httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{
Message: "Error reading user settings.",
Detail: err.Error(),
})
return
}
terminalFont = ""
}
httpapi.Write(ctx, rw, http.StatusOK, codersdk.UserAppearanceSettings{
ThemePreference: themePreference,
TerminalFont: codersdk.TerminalFontName(terminalFont),
})
}
@ -1015,23 +1030,47 @@ func (api *API) putUserAppearanceSettings(rw http.ResponseWriter, r *http.Reques
return
}
updatedSettings, err := api.Database.UpdateUserAppearanceSettings(ctx, database.UpdateUserAppearanceSettingsParams{
if !isValidFontName(params.TerminalFont) {
httpapi.Write(ctx, rw, http.StatusBadRequest, codersdk.Response{
Message: "Unsupported font family.",
})
return
}
updatedThemePreference, err := api.Database.UpdateUserThemePreference(ctx, database.UpdateUserThemePreferenceParams{
UserID: user.ID,
ThemePreference: params.ThemePreference,
})
if err != nil {
httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{
Message: "Internal error updating user.",
Message: "Internal error updating user theme preference.",
Detail: err.Error(),
})
return
}
updatedTerminalFont, err := api.Database.UpdateUserTerminalFont(ctx, database.UpdateUserTerminalFontParams{
UserID: user.ID,
TerminalFont: string(params.TerminalFont),
})
if err != nil {
httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{
Message: "Internal error updating user terminal font.",
Detail: err.Error(),
})
return
}
httpapi.Write(ctx, rw, http.StatusOK, codersdk.UserAppearanceSettings{
ThemePreference: updatedSettings.Value,
ThemePreference: updatedThemePreference.Value,
TerminalFont: codersdk.TerminalFontName(updatedTerminalFont.Value),
})
}
func isValidFontName(font codersdk.TerminalFontName) bool {
return slices.Contains(codersdk.TerminalFontNames, font)
}
// @Summary Update user password
// @ID update-user-password
// @Security CoderSessionToken