Skip to content

Commit

Permalink
v0.0.1 - 템플릿, 소스코드 업로드 기능 (#1)
Browse files Browse the repository at this point in the history
* chore: gitignore에 .env 추가

* chore: axios, dotenv 설치

* feat(src): extension - 템플릿, 소스코드 업로드 기능
  • Loading branch information
Jaymyong66 authored Aug 23, 2024
1 parent 0f657e4 commit 77cd874
Show file tree
Hide file tree
Showing 4 changed files with 256 additions and 81 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,5 @@ dist
node_modules
.vscode-test/
*.vsix

.env
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@
"webpack-cli": "^5.1.4"
},
"dependencies": {
"axios": "^1.7.2"
"axios": "^1.7.2",
"dotenv": "^16.4.5"
}
}
204 changes: 204 additions & 0 deletions src/extension.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,204 @@
import * as vscode from 'vscode';
import axios from 'axios';
import * as dotenv from 'dotenv';

dotenv.config();

const API_URL = process.env.API_URL;

async function getGitHubToken(): Promise<string | null> {
try {
const session = await vscode.authentication.getSession('github', ['repo'], {
createIfNone: true,
});
if (session) {
return session.accessToken;
}
} catch (error) {
vscode.window.showErrorMessage('깃헙 로그인에 실패했습니다: ' + error);
}
return null;
}

export function activate(context: vscode.ExtensionContext) {
context.subscriptions.push(
vscode.commands.registerCommand('extension.addCodeSnippet', async () => {
const editor = vscode.window.activeTextEditor;

if (editor) {
const selection = editor.selection;
const selectedText = editor.document.getText(selection);

if (selectedText) {
try {
const filename = await vscode.window.showInputBox({
prompt: '소스코드의 파일 명을 입력해주세요',
});

if (!filename) {
vscode.window.showErrorMessage('파일 명은 필수 입력 사항입니다!');
return;
}

const snippets = context.workspaceState.get<any[]>('snippets', []);
snippets.push({
filename: filename,
content: selectedText,
ordinal: snippets.length + 1,
});

// 깃헙 로그인 토큰 가져오기
// const session = await vscode.authentication.getSession(
// 'github',
// ['repo'],
// { createIfNone: true }
// );
// if (session) {
// return session.accessToken;
// }

const token = await getGitHubToken();

await context.workspaceState.update('snippets', snippets);
vscode.window.showInformationMessage(
`소스코드가 성공적으로 추가 되었어요! ${token}`
);
} catch (error: unknown) {
if (error instanceof Error) {
vscode.window.showErrorMessage(
`소스코드 추가가 실패했어요: ${error.message}`
);
} else {
vscode.window.showErrorMessage(
'소스코드 추가가 실패했어요: 알 수 없는 에러입니다. 잠시 후 다시 시도해주세요'
);
}
}
} else {
vscode.window.showErrorMessage('선택된 코드가 없습니다!');
}
}
})
);

context.subscriptions.push(
vscode.commands.registerCommand('extension.sendAllSnippets', async () => {
const snippets = context.workspaceState.get<any[]>('snippets', []);

if (snippets.length === 0) {
vscode.window.showErrorMessage('보낼 소스 코드가 없어요!');
return;
}

try {
const title = await vscode.window.showInputBox({
prompt: '템플릿 명을 입력해주세요',
});

if (!title) {
vscode.window.showErrorMessage('템플릿 명은 필수 입력 사항입니다!');
return;
}

const requestBody = {
title: title,
snippets: snippets,
};

const response = await axios.post(`${API_URL}/templates`, requestBody);
vscode.window.showInformationMessage(
'템플릿이 코드잽에 성공적으로 업로드되었어요!'
);

// 저장된 소스코드들을 제출 후 clear 해야함
await context.workspaceState.update('snippets', []);
} catch (error: unknown) {
if (axios.isAxiosError(error)) {
vscode.window.showErrorMessage(
`템플릿 업로드에 실패했어요: ${error.message}`
);
} else if (error instanceof Error) {
vscode.window.showErrorMessage(
`템플릿 업로드에 실패했어요: ${error.message}`
);
} else {
vscode.window.showErrorMessage(
'템플릿 업로드에 실패했어요: 알 수 없는 에러입니다. 잠시 후 다시 시도해주세요'
);
}
}
})
);

context.subscriptions.push(
vscode.commands.registerCommand('extension.sendSingleSnippet', async () => {
const editor = vscode.window.activeTextEditor;

if (editor) {
const selection = editor.selection;
const selectedText = editor.document.getText(selection);

if (selectedText) {
try {
const title = await vscode.window.showInputBox({
prompt: '템플릿 명을 입력해주세요.',
});

if (!title) {
vscode.window.showErrorMessage(
'템플릿 명은 필수 입력 사항입니다!'
);
return;
}

const filename = await vscode.window.showInputBox({
prompt: '소스코드의 파일 명을 입력해주세요',
});

if (!filename) {
vscode.window.showErrorMessage('파일 명은 필수 입력 사항입니다!');
return;
}

const requestBody = {
title: title,
snippets: [
{
filename: filename,
content: selectedText,
ordinal: 1,
},
],
};

const response = await axios.post(
`${API_URL}/templates`,
requestBody
);
vscode.window.showInformationMessage(
'템플릿이 코드잽에 성공적으로 업로드되었어요!'
);
} catch (error: unknown) {
if (axios.isAxiosError(error)) {
vscode.window.showErrorMessage(
`템플릿 업로드에 실패했어요: ${error.message}`
);
} else if (error instanceof Error) {
vscode.window.showErrorMessage(
`템플릿 업로드에 실패했어요: ${error.message}`
);
} else {
vscode.window.showErrorMessage(
'템플릿 업로드에 실패했어요: 알 수 없는 에러입니다. 잠시 후 다시 시도해주세요'
);
}
}
} else {
vscode.window.showErrorMessage('선택된 코드가 없습니다!');
}
}
})
);
}

export function deactivate() {}
Loading

0 comments on commit 77cd874

Please sign in to comment.