From 4290119b934abe35fab2f49e10c2aabb77fd1878 Mon Sep 17 00:00:00 2001 From: LordMathis Date: Sat, 28 Sep 2024 15:35:52 +0200 Subject: [PATCH] Initial git settings on frontend --- backend/internal/api/routes.go | 2 +- backend/internal/models/settings.go | 12 +-- frontend/src/components/Settings.js | 151 +++++++++++++++++++++++----- frontend/src/services/api.js | 3 +- 4 files changed, 133 insertions(+), 35 deletions(-) diff --git a/backend/internal/api/routes.go b/backend/internal/api/routes.go index b2b8291..eaa81a9 100644 --- a/backend/internal/api/routes.go +++ b/backend/internal/api/routes.go @@ -20,7 +20,7 @@ func SetupRoutes(r chi.Router, db *db.DB, fs *filesystem.FileSystem) { r.Delete("/*", DeleteFile(fs)) }) r.Route("/git", func(r chi.Router) { - r.Post("commit", StageCommitAndPush(fs)) + r.Post("/commit", StageCommitAndPush(fs)) r.Post("/pull", PullChanges(fs)) }) }) diff --git a/backend/internal/models/settings.go b/backend/internal/models/settings.go index 82a5d47..602bd45 100644 --- a/backend/internal/models/settings.go +++ b/backend/internal/models/settings.go @@ -9,12 +9,12 @@ import ( type UserSettings struct { Theme string `json:"theme" validate:"oneof=light dark"` AutoSave bool `json:"autoSave"` - GitEnabled bool `json:"git_enabled"` - GitURL string `json:"git_url" validate:"required_with=GitEnabled"` - GitUser string `json:"git_user" validate:"required_with=GitEnabled"` - GitToken string `json:"git_token" validate:"required_with=GitEnabled"` - GitAutoCommit bool `json:"git_auto_commit"` - GitCommitMsgTemplate string `json:"git_commit_msg_template"` + GitEnabled bool `json:"gitEnabled"` + GitURL string `json:"gitUrl" validate:"required_with=GitEnabled"` + GitUser string `json:"gitUser" validate:"required_with=GitEnabled"` + GitToken string `json:"gitToken" validate:"required_with=GitEnabled"` + GitAutoCommit bool `json:"gitAutoCommit"` + GitCommitMsgTemplate string `json:"gitCommitMsgTemplate"` } type Settings struct { diff --git a/frontend/src/components/Settings.js b/frontend/src/components/Settings.js index 86a43ed..67205c7 100644 --- a/frontend/src/components/Settings.js +++ b/frontend/src/components/Settings.js @@ -1,26 +1,72 @@ -import React, { useState } from 'react'; -import { Modal, Text, Toggle, Tooltip, Spacer, useTheme, useToasts } from '@geist-ui/core'; -import { saveUserSettings } from '../services/api'; +import React, { useState, useEffect, useCallback } from 'react'; +import { Modal, Text, Toggle, Input, Spacer, useTheme, Button, Dot, useToasts } from '@geist-ui/core'; +import { saveUserSettings, fetchUserSettings } from '../services/api'; const Settings = ({ visible, onClose, currentTheme, onThemeChange }) => { const theme = useTheme(); - const [autoSave, setAutoSave] = useState(false); - const userId = 1; const { setToast } = useToasts(); + const [settings, setSettings] = useState({ + autoSave: false, + gitEnabled: false, + gitUrl: '', + gitUser: '', + gitToken: '', + gitAutoCommit: false, + gitCommitMsgTemplate: '', + }); + const [themeSettings, setThemeSettings] = useState(currentTheme); + const [originalSettings, setOriginalSettings] = useState({}); + const [originalTheme, setOriginalTheme] = useState(currentTheme); + const [hasUnsavedChanges, setHasUnsavedChanges] = useState(false); + const [isInitialized, setIsInitialized] = useState(false); + + const loadSettings = useCallback(async () => { + try { + const userSettings = await fetchUserSettings(1); // Assuming user ID 1 for now + const { theme, ...otherSettings } = userSettings.settings; + setSettings(otherSettings); + setThemeSettings(theme); + setOriginalSettings(otherSettings); + setOriginalTheme(theme); + setHasUnsavedChanges(false); + setIsInitialized(true); + } catch (error) { + console.error('Failed to load user settings:', error); + } + }, []); + + useEffect(() => { + if (!isInitialized) { + loadSettings(); + } + }, [isInitialized, loadSettings]); + + useEffect(() => { + const settingsChanged = JSON.stringify(settings) !== JSON.stringify(originalSettings); + const themeChanged = themeSettings !== originalTheme; + setHasUnsavedChanges(settingsChanged || themeChanged); + }, [settings, themeSettings, originalSettings, originalTheme]); + + const handleInputChange = (key, value) => { + setSettings(prev => ({ ...prev, [key]: value })); + }; + + const handleThemeChange = () => { + const newTheme = themeSettings === 'dark' ? 'light' : 'dark'; + setThemeSettings(newTheme); + onThemeChange(newTheme); + }; const handleSubmit = async () => { try { - const savedSettings = await saveUserSettings({ - userId: userId, - settings: { - theme: currentTheme, - autoSave: autoSave - } + await saveUserSettings({ + userId: 1, // Assuming user ID 1 for now + settings: { ...settings, theme: themeSettings }, }); + setOriginalSettings(settings); + setOriginalTheme(themeSettings); + setHasUnsavedChanges(false); setToast({ text: 'Settings saved successfully', type: 'success' }); - // Update local state with saved settings - setAutoSave(savedSettings.settings.autoSave); - onThemeChange(savedSettings.settings.theme); onClose(); } catch (error) { console.error('Failed to save settings:', error); @@ -28,22 +74,21 @@ const Settings = ({ visible, onClose, currentTheme, onThemeChange }) => { } }; - const handleThemeChange = () => { - onThemeChange(currentTheme === 'light' ? 'dark' : 'light'); - }; - - const disabledMessage = "This feature is not yet implemented"; - return ( - Settings + + Settings + {hasUnsavedChanges && ( + + )} +
Appearance
Dark Mode
@@ -51,12 +96,66 @@ const Settings = ({ visible, onClose, currentTheme, onThemeChange }) => {
Editor - -
+
Auto Save - + handleInputChange('autoSave', e.target.checked)} + /> +
+
+ +
+ Git Integration +
+ Enable Git + handleInputChange('gitEnabled', e.target.checked)} + /> +
+
+ handleInputChange('gitUrl', e.target.value)} + disabled={!settings.gitEnabled} + /> + + handleInputChange('gitUser', e.target.value)} + disabled={!settings.gitEnabled} + /> + + handleInputChange('gitToken', e.target.value)} + disabled={!settings.gitEnabled} + /> + +
+ Auto Commit + handleInputChange('gitAutoCommit', e.target.checked)} + disabled={!settings.gitEnabled} + /> +
+ + handleInputChange('gitCommitMsgTemplate', e.target.value)} + disabled={!settings.gitEnabled} + />
-
Cancel diff --git a/frontend/src/services/api.js b/frontend/src/services/api.js index 2f2b50b..3a2280e 100644 --- a/frontend/src/services/api.js +++ b/frontend/src/services/api.js @@ -70,8 +70,7 @@ export const saveUserSettings = async (settings) => { throw new Error(errorData?.message || `HTTP error! status: ${response.status}`); } - const savedSettings = await response.json(); - return savedSettings; + return await response.json(); } catch (error) { console.error('Error saving user settings:', error); throw error;