From 1e350bb0cfb4b7fbd539815e16de2d4b48edf3c9 Mon Sep 17 00:00:00 2001 From: LordMathis Date: Tue, 6 May 2025 21:02:09 +0200 Subject: [PATCH] Migrate git api to ts --- app/src/api/git.ts | 49 +++++++++++++++++++ app/src/api/notes.js | 30 ------------ app/src/components/editor/ContentView.jsx | 2 +- .../modals/workspace/CreateWorkspaceModal.jsx | 2 +- .../navigation/WorkspaceSwitcher.jsx | 2 +- app/src/contexts/WorkspaceContext.jsx | 2 +- app/src/hooks/useFileContent.js | 2 +- app/src/hooks/useFileList.js | 2 +- app/src/hooks/useFileOperations.js | 2 +- app/src/hooks/useGitOperations.js | 2 +- app/src/hooks/useLastOpenedFile.js | 2 +- app/src/hooks/useProfileSettings.js | 2 +- app/src/types/git.ts | 1 + app/src/utils/remarkWikiLinks.ts | 2 +- 14 files changed, 61 insertions(+), 41 deletions(-) create mode 100644 app/src/api/git.ts delete mode 100644 app/src/api/notes.js create mode 100644 app/src/types/git.ts diff --git a/app/src/api/git.ts b/app/src/api/git.ts new file mode 100644 index 0000000..d76091d --- /dev/null +++ b/app/src/api/git.ts @@ -0,0 +1,49 @@ +import { API_BASE_URL } from '@/types/authApi'; +import { apiCall } from './api'; + +/** + * pullChanges fetches the latest changes from the remote repository + * @param workspaceName - The name of the workspace + * @returns {Promise} A promise that resolves to a message indicating the result of the pull operation + */ +export const pullChanges = async (workspaceName: string): Promise => { + const response = await apiCall( + `${API_BASE_URL}/workspaces/${encodeURIComponent(workspaceName)}/git/pull`, + { + method: 'POST', + } + ); + const data = await response.json(); + if (!('message' in data)) { + throw new Error('Invalid pull response received from API'); + } + return data.message; +}; + +/** + * pushChanges pushes the local changes to the remote repository + * @param workspaceName - The name of the workspace + * @returns {Promise} A promise that resolves to the commit hash of the pushed changes + */ +export const commitAndPush = async ( + workspaceName: string, + message: string +): Promise => { + const response = await apiCall( + `${API_BASE_URL}/workspaces/${encodeURIComponent( + workspaceName + )}/git/commit`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ message }), + } + ); + const data = await response.json(); + if (!('commitHash' in data)) { + throw new Error('Invalid commit response received from API'); + } + return data.commitHash as CommitHash; +}; diff --git a/app/src/api/notes.js b/app/src/api/notes.js deleted file mode 100644 index 01fe725..0000000 --- a/app/src/api/notes.js +++ /dev/null @@ -1,30 +0,0 @@ -import { API_BASE_URL } from '../utils/constants'; -import { apiCall } from './auth'; - -export const pullChanges = async (workspaceName) => { - const response = await apiCall( - `${API_BASE_URL}/workspaces/${workspaceName}/git/pull`, - { - method: 'POST', - } - ); - return response.json(); -}; - -export const commitAndPush = async (workspaceName, message) => { - const response = await apiCall( - `${API_BASE_URL}/workspaces/${workspaceName}/git/commit`, - { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ message }), - } - ); - return response.json(); -}; - -export const getFileUrl = (workspaceName, filePath) => { - return `${API_BASE_URL}/workspaces/${workspaceName}/files/${filePath}`; -}; diff --git a/app/src/components/editor/ContentView.jsx b/app/src/components/editor/ContentView.jsx index 7c075b5..5235339 100644 --- a/app/src/components/editor/ContentView.jsx +++ b/app/src/components/editor/ContentView.jsx @@ -2,7 +2,7 @@ import React from 'react'; import { Text, Center } from '@mantine/core'; import Editor from './Editor'; import MarkdownPreview from './MarkdownPreview'; -import { getFileUrl } from '../../api/notes'; +import { getFileUrl } from '../../api/git'; import { isImageFile } from '../../utils/fileHelpers'; const ContentView = ({ diff --git a/app/src/components/modals/workspace/CreateWorkspaceModal.jsx b/app/src/components/modals/workspace/CreateWorkspaceModal.jsx index 75048f2..1fd8e9b 100644 --- a/app/src/components/modals/workspace/CreateWorkspaceModal.jsx +++ b/app/src/components/modals/workspace/CreateWorkspaceModal.jsx @@ -1,7 +1,7 @@ import React, { useState } from 'react'; import { Modal, TextInput, Button, Group, Box } from '@mantine/core'; import { useModalContext } from '../../../contexts/ModalContext'; -import { createWorkspace } from '../../../api/notes'; +import { createWorkspace } from '../../../api/git'; import { notifications } from '@mantine/notifications'; const CreateWorkspaceModal = ({ onWorkspaceCreated }) => { diff --git a/app/src/components/navigation/WorkspaceSwitcher.jsx b/app/src/components/navigation/WorkspaceSwitcher.jsx index 77be4ee..6a0fd2a 100644 --- a/app/src/components/navigation/WorkspaceSwitcher.jsx +++ b/app/src/components/navigation/WorkspaceSwitcher.jsx @@ -17,7 +17,7 @@ import { import { IconFolders, IconSettings, IconFolderPlus } from '@tabler/icons-react'; import { useWorkspace } from '../../contexts/WorkspaceContext'; import { useModalContext } from '../../contexts/ModalContext'; -import { listWorkspaces } from '../../api/notes'; +import { listWorkspaces } from '../../api/git'; import CreateWorkspaceModal from '../modals/workspace/CreateWorkspaceModal'; const WorkspaceSwitcher = () => { diff --git a/app/src/contexts/WorkspaceContext.jsx b/app/src/contexts/WorkspaceContext.jsx index 5fee428..af23277 100644 --- a/app/src/contexts/WorkspaceContext.jsx +++ b/app/src/contexts/WorkspaceContext.jsx @@ -14,7 +14,7 @@ import { updateLastWorkspaceName, deleteWorkspace, listWorkspaces, -} from '../api/notes'; +} from '../api/git'; import { DEFAULT_WORKSPACE_SETTINGS } from '../utils/constants'; const WorkspaceContext = createContext(); diff --git a/app/src/hooks/useFileContent.js b/app/src/hooks/useFileContent.js index 4c20937..b524a12 100644 --- a/app/src/hooks/useFileContent.js +++ b/app/src/hooks/useFileContent.js @@ -1,5 +1,5 @@ import { useState, useCallback, useEffect } from 'react'; -import { fetchFileContent } from '../api/notes'; +import { fetchFileContent } from '../api/git'; import { isImageFile } from '../utils/fileHelpers'; import { DEFAULT_FILE } from '../utils/constants'; import { useWorkspace } from '../contexts/WorkspaceContext'; diff --git a/app/src/hooks/useFileList.js b/app/src/hooks/useFileList.js index 2505f30..9e8e80a 100644 --- a/app/src/hooks/useFileList.js +++ b/app/src/hooks/useFileList.js @@ -1,5 +1,5 @@ import { useState, useCallback } from 'react'; -import { fetchFileList } from '../api/notes'; +import { fetchFileList } from '../api/git'; import { useWorkspace } from '../contexts/WorkspaceContext'; export const useFileList = () => { diff --git a/app/src/hooks/useFileOperations.js b/app/src/hooks/useFileOperations.js index 5f86469..7b313db 100644 --- a/app/src/hooks/useFileOperations.js +++ b/app/src/hooks/useFileOperations.js @@ -1,6 +1,6 @@ import { useCallback } from 'react'; import { notifications } from '@mantine/notifications'; -import { saveFileContent, deleteFile } from '../api/notes'; +import { saveFileContent, deleteFile } from '../api/git'; import { useWorkspace } from '../contexts/WorkspaceContext'; import { useGitOperations } from './useGitOperations'; diff --git a/app/src/hooks/useGitOperations.js b/app/src/hooks/useGitOperations.js index 7399e28..bf8d68c 100644 --- a/app/src/hooks/useGitOperations.js +++ b/app/src/hooks/useGitOperations.js @@ -1,6 +1,6 @@ import { useCallback } from 'react'; import { notifications } from '@mantine/notifications'; -import { pullChanges, commitAndPush } from '../api/notes'; +import { pullChanges, commitAndPush } from '../api/git'; import { useWorkspace } from '../contexts/WorkspaceContext'; export const useGitOperations = () => { diff --git a/app/src/hooks/useLastOpenedFile.js b/app/src/hooks/useLastOpenedFile.js index e49ff02..eee230e 100644 --- a/app/src/hooks/useLastOpenedFile.js +++ b/app/src/hooks/useLastOpenedFile.js @@ -1,5 +1,5 @@ import { useCallback } from 'react'; -import { getLastOpenedFile, updateLastOpenedFile } from '../api/notes'; +import { getLastOpenedFile, updateLastOpenedFile } from '../api/git'; import { useWorkspace } from '../contexts/WorkspaceContext'; export const useLastOpenedFile = () => { diff --git a/app/src/hooks/useProfileSettings.js b/app/src/hooks/useProfileSettings.js index 27a1155..6ffcdec 100644 --- a/app/src/hooks/useProfileSettings.js +++ b/app/src/hooks/useProfileSettings.js @@ -1,6 +1,6 @@ import { useState, useCallback } from 'react'; import { notifications } from '@mantine/notifications'; -import { updateProfile, deleteProfile } from '../api/notes'; +import { updateProfile, deleteProfile } from '../api/git'; export function useProfileSettings() { const [loading, setLoading] = useState(false); diff --git a/app/src/types/git.ts b/app/src/types/git.ts new file mode 100644 index 0000000..cb768b9 --- /dev/null +++ b/app/src/types/git.ts @@ -0,0 +1 @@ +type CommitHash = string; diff --git a/app/src/utils/remarkWikiLinks.ts b/app/src/utils/remarkWikiLinks.ts index 569501e..343eb34 100644 --- a/app/src/utils/remarkWikiLinks.ts +++ b/app/src/utils/remarkWikiLinks.ts @@ -1,5 +1,5 @@ import { visit } from 'unist-util-visit'; -import { lookupFileByName, getFileUrl } from '../api/notes'; +import { lookupFileByName, getFileUrl } from '../api/git'; import { InlineContainerType, MARKDOWN_REGEX } from '../types/markdown'; import { Node } from 'unist'; import { Parent } from 'unist';