Skip to content

Commit e7fe5f6

Browse files
Akpjunior94Ifycode
authored andcommitted
FIX: Allow issues to be submitted using the user's GitHub username in Collabocate
1 parent a7797d3 commit e7fe5f6

File tree

6 files changed

+95
-22
lines changed

6 files changed

+95
-22
lines changed

src/@core/api-client.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ const API_BASE_URL= process.env.REACT_APP_BACKEND_API_URL;
22

33
// Custom fetch API client
44
export const apiClient = async <T>(endpoint: string, options: RequestInit = {}): Promise<T> => {
5-
const token = typeof window !== 'undefined' ? localStorage.getItem('collabocate_authToken') : ''; // Get token from localStorage
5+
const token = typeof window !== 'undefined' ? localStorage.getItem('authToken') : ''; // Get token from localStorage
66

77
const headers: HeadersInit = {
88
'Content-Type': 'application/json',

src/@core/auth.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
export const signInWithGithub = async () => {
2+
const githubAuthUrl = `${process.env.REACT_APP_BACKEND_API_URL}/auth/github`;
3+
window.location.href = githubAuthUrl; // Redirect user to github Auth
4+
};

src/@core/submitIssue.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,13 @@ export const submitIssue = async (issueData: Issue_POST_RequestBody): Promise<Is
88
});
99
console.log('Issue submitted successfully:', response);
1010
return response;
11+
};
12+
13+
export const submitAnonymousIssue = async (issueData: Issue_POST_RequestBody): Promise<IssueResponse> => {
14+
const response = await apiClient<IssueResponse>('/external/github/issues-unauthenticated', {
15+
method: 'POST',
16+
body: JSON.stringify(issueData)
17+
});
18+
console.log('Issue submitted successfully:', response);
19+
return response;
1120
};
Lines changed: 56 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,35 @@
11
import { useState } from 'react';
22
import { createContainer } from 'unstated-next';
3-
import { submitIssue } from '../../@core/submitIssue';
3+
import { submitIssue, submitAnonymousIssue } from '../../@core/submitIssue';
44
import { GitHubIssueTemplateContainer } from './useTemplate';
5+
import { signInWithGithub } from '../../@core/auth';
56

67
function useSubmitIssueState (){
7-
const { issueBody, setIssueBody, issueTitle, setIssueTitle, setDropdownButtonTitle, dropdownButtonText} = GitHubIssueTemplateContainer.useContainer();
8-
const [toastrMessage, setToastrMessage] = useState<{message: string; issueURL?: string;
9-
issueNumber?: number;} | null>(null);
10-
11-
const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => {
12-
e.preventDefault();
13-
const title = issueTitle.trim();
14-
const body = issueBody.trim();
15-
16-
if (!title || !body) {
17-
setToastrMessage({message:'Issue Title and Body cannot be empty.'});
18-
return;
19-
}
20-
21-
const data = { title, body };
8+
const { issueBody, setIssueBody, issueTitle, setIssueTitle, setDropdownButtonTitle, dropdownButtonText } = GitHubIssueTemplateContainer.useContainer();
9+
const [toastrMessage, setToastrMessage] = useState<{ message: string; issueURL?: string; issueNumber?: number } | null>(null);
10+
const [showButton, setShowButton] = useState<boolean>(false);
11+
const [showGithubLoginButton, setShowGithubLoginButton] = useState<boolean>(false);
12+
13+
14+
const handleButtonClick = () => {
15+
setShowButton(!showButton);
16+
}
17+
18+
const loginWithGithub = () => {
19+
signInWithGithub()
20+
}
21+
22+
// Shared submission logic
23+
const handleSubmission = async (data: { title: string; body: string }, isAnonymous: boolean) => {
24+
try {
25+
// If the user is not authenticated, prompt them to log in
26+
if (!isAnonymous) {
27+
setToastrMessage({ message: 'Please log in to submit an issue.' });
28+
setShowGithubLoginButton(true);
29+
return;
30+
}
31+
const response = isAnonymous ? await submitAnonymousIssue(data) : await submitIssue(data);
2232

23-
const response = await submitIssue(data);
2433
setIssueTitle('');
2534
setIssueBody('');
2635
setToastrMessage({
@@ -29,11 +38,41 @@ function useSubmitIssueState (){
2938
issueNumber: response.data.number,
3039
});
3140
setDropdownButtonTitle(dropdownButtonText);
41+
42+
return response;
43+
} catch (error) {
44+
setToastrMessage({
45+
message: 'Failed to submit issue'
46+
});
47+
throw error;
48+
}
3249
};
3350

51+
// Common validation and submission handler
52+
const validateAndSubmit = async (isAnonymous: boolean) => {
53+
const title = issueTitle.trim();
54+
const body = issueBody.trim();
55+
56+
if (!title || !body) {
57+
setToastrMessage({ message: 'Issue Title and Body cannot be empty.' });
58+
return;
59+
}
60+
61+
return handleSubmission({ title, body }, isAnonymous);
62+
};
63+
// Public handlers
64+
const handleSubmit = () => validateAndSubmit(false);
65+
66+
const handleSubmitAnonymous = () => validateAndSubmit(true);
67+
3468
return {
3569
toastrMessage,
3670
handleSubmit,
71+
handleSubmitAnonymous,
72+
handleButtonClick,
73+
showButton,
74+
loginWithGithub,
75+
showGithubLoginButton
3776
};
3877
}
3978
export const SubmitIssueContainer = createContainer(useSubmitIssueState);

src/components/@section_modal/ModalPopup.tsx

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ export const ModalPopup: React.FunctionComponent<ModalPopupProps> = (props: Moda
1010
const { instanceId, updateInstanceId } = GlobalContainer.useContainer();
1111
console.log('ModalPopup instance_id:', instanceId);
1212
const { issueBody, setIssueBody, issueTitle, setIssueTitle } = GitHubIssueTemplateContainer.useContainer();
13-
const { toastrMessage, handleSubmit } = SubmitIssueContainer.useContainer();
13+
const { toastrMessage, handleSubmit, showButton, handleButtonClick, handleSubmitAnonymous, loginWithGithub, showGithubLoginButton } = SubmitIssueContainer.useContainer();
1414

1515
return (
1616
<>
@@ -26,7 +26,7 @@ export const ModalPopup: React.FunctionComponent<ModalPopupProps> = (props: Moda
2626
</div>
2727
<p className="bb-content-group__collabocate_plugin">Collabocate | GitHub Sync</p>
2828
</header>
29-
<form className="bb-content-group__collabocate_plugin bb-collabocate_form" id="submitIssueForm" onSubmit={handleSubmit} >
29+
<div className="bb-content-group__collabocate_plugin bb-collabocate_form" id="submitIssueForm">
3030
<div>
3131
<label className="bb-collabocate_label" htmlFor="issueTemplates">Choose Report Type</label>
3232
<br />
@@ -42,7 +42,15 @@ export const ModalPopup: React.FunctionComponent<ModalPopupProps> = (props: Moda
4242
<br />
4343
<textarea className="bb-content-group__collabocate_form-inner bb-collabocate_input bb-collabocate_textarea" id="issueBody" onChange={(e) =>setIssueBody(e.target.value)} value={issueBody}></textarea>
4444
</div>
45-
<button className="bb-content-group__collabocate_form-inner bb-collabocate_submit-form-button" id="submitIssueButton">Submit Issue Ticket</button>
45+
<button className="bb-content-group__collabocate_form-inner bb-collabocate_submit-form-button" id="submitIssueButton" onClick={handleButtonClick}>Submit Issue Ticket</button>
46+
{showButton && (
47+
<div className="bb-collabocate_auth-options">
48+
<button className="bb-content-group__collabocate_form-inner bb-collabocate_submit-form-button bb-collabocate_margin-vertical" onClick={handleSubmitAnonymous}>
49+
Continue as Anonymous User
50+
</button>
51+
<button className="bb-content-group__collabocate_form-inner bb-collabocate_submit-form-button" onClick={handleSubmit}>Continue as GitHub User</button>
52+
</div>
53+
)}
4654
{toastrMessage && (
4755
<div>
4856
<div>{toastrMessage.message}</div>
@@ -58,7 +66,10 @@ export const ModalPopup: React.FunctionComponent<ModalPopupProps> = (props: Moda
5866
</div>
5967
</div>
6068
)}
61-
</form>
69+
{showGithubLoginButton && (
70+
<button className="bb-collabocate_github-button" onClick={loginWithGithub}>Login with Github</button>
71+
)}
72+
</div>
6273
</div>
6374
</>
6475
);

src/css/@temporary/bb-modal.css

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,3 +69,13 @@
6969
padding: 16px 0;
7070
border-radius: 10px;
7171
}
72+
73+
.bb-collabocate_margin-vertical {
74+
margin: 12px 0;
75+
}
76+
77+
.bb-collabocate_github-button {
78+
background: black;
79+
padding: 10px;
80+
color: white
81+
}

0 commit comments

Comments
 (0)