Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 10 additions & 4 deletions src/@core/api-client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ const API_BASE_URL= process.env.REACT_APP_BACKEND_API_URL;

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

const headers: HeadersInit = {
'Content-Type': 'application/json',
Expand All @@ -16,13 +16,19 @@ export const apiClient = async <T>(endpoint: string, options: RequestInit = {}):
headers,
});

const data = await response.json();

if (!response.ok) {
const errorData = await response.json();
throw new Error(errorData.message || `Error ${response.status}: ${response.statusText}`);
// 🔥 throw structured error instead of plain Error
throw {
status: response.status,
message: data?.error?.message || response.statusText,
raw: data
};
}

// Type casting to ensure that response data is in the expected format
return (await response.json()) as T;
return data as T;
} catch (error) {
console.log(`API Error [${API_BASE_URL}${endpoint}]:`, error);
throw error;
Expand Down
4 changes: 4 additions & 0 deletions src/@core/auth.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
export const signInWithGithub = async () => {
const githubAuthUrl = `${process.env.REACT_APP_BACKEND_API_URL}/auth/github`;
window.location.href = githubAuthUrl; // Redirect user to github Auth
};
9 changes: 9 additions & 0 deletions src/@core/submitIssue.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,13 @@ export const submitIssue = async (issueData: Issue_POST_RequestBody): Promise<Is
});
console.log('Issue submitted successfully:', response);
return response;
};

export const submitAnonymousIssue = async (issueData: Issue_POST_RequestBody): Promise<IssueResponse> => {
const response = await apiClient<IssueResponse>('/external/github/issues-unauthenticated', {
method: 'POST',
body: JSON.stringify(issueData)
});
console.log('Issue submitted successfully:', response);
return response;
};
64 changes: 46 additions & 18 deletions src/components/@hooks_state/useSubmitIssue.ts
Original file line number Diff line number Diff line change
@@ -1,26 +1,24 @@
import { useState } from 'react';
import { useEffect, useState } from 'react';
import { createContainer } from 'unstated-next';
import { submitIssue } from '../../@core/submitIssue';
import { submitIssue, submitAnonymousIssue } from '../../@core/submitIssue';
import { GitHubIssueTemplateContainer } from './useTemplate';

function useSubmitIssueState (){
const { issueBody, setIssueBody, issueTitle, setIssueTitle, setDropdownButtonTitle, dropdownButtonText} = GitHubIssueTemplateContainer.useContainer();
const [toastrMessage, setToastrMessage] = useState<{message: string; issueURL?: string;
issueNumber?: number;} | null>(null);

const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => {
e.preventDefault();
const title = issueTitle.trim();
const body = issueBody.trim();

if (!title || !body) {
setToastrMessage({message:'Issue Title and Body cannot be empty.'});
return;
}

const data = { title, body };
const { issueBody, setIssueBody, issueTitle, setIssueTitle, setDropdownButtonTitle, dropdownButtonText } = GitHubIssueTemplateContainer.useContainer();
const [toastrMessage, setToastrMessage] = useState<{ message: string; issueURL?: string; issueNumber?: number } | null>(null);
const [showButton, setShowButton] = useState<boolean>(false);
const [showGithubLoginButton, setShowGithubLoginButton] = useState<boolean>(false);


const handleButtonClick = () => {
setShowButton(!showButton);
}

// Shared submission logic
const handleSubmission = async (data: { title: string; body: string }, isAnonymous: boolean) => {
try {
const response = isAnonymous ? await submitAnonymousIssue(data) : await submitIssue(data);

const response = await submitIssue(data);
setIssueTitle('');
setIssueBody('');
setToastrMessage({
Expand All @@ -29,11 +27,41 @@ function useSubmitIssueState (){
issueNumber: response.data.number,
});
setDropdownButtonTitle(dropdownButtonText);

return response;
} catch (error: any) {
console.log('Error submitting issue:', error);
if (error?.status === 401) {
setShowGithubLoginButton(true);
setToastrMessage({message: 'Please Login as a GitHub User to submit an issue ticket'});
}
}
};

// Common validation and submission handler
const validateAndSubmit = async (isAnonymous: boolean) => {
const title = issueTitle.trim();
const body = issueBody.trim();

if (!title || !body) {
setToastrMessage({ message: 'Issue Title and Body cannot be empty.' });
return;
}

return handleSubmission({ title, body }, isAnonymous);
};
// Public handlers
const handleSubmit = () => validateAndSubmit(false);

const handleSubmitAnonymous = () => validateAndSubmit(true);

return {
toastrMessage,
handleSubmit,
handleSubmitAnonymous,
handleButtonClick,
showButton,
showGithubLoginButton
};
}
export const SubmitIssueContainer = createContainer(useSubmitIssueState);
19 changes: 15 additions & 4 deletions src/components/@section_modal/ModalPopup.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ export const ModalPopup: React.FunctionComponent<ModalPopupProps> = (props: Moda
const { instanceId, updateInstanceId } = GlobalContainer.useContainer();
console.log('ModalPopup instance_id:', instanceId);
const { issueBody, setIssueBody, issueTitle, setIssueTitle } = GitHubIssueTemplateContainer.useContainer();
const { toastrMessage, handleSubmit } = SubmitIssueContainer.useContainer();
const { toastrMessage, handleSubmit, showButton, handleButtonClick, handleSubmitAnonymous, showGithubLoginButton } = SubmitIssueContainer.useContainer();

return (
<>
Expand All @@ -26,7 +26,7 @@ export const ModalPopup: React.FunctionComponent<ModalPopupProps> = (props: Moda
</div>
<p className="bb-content-group__collabocate_plugin">Collabocate | GitHub Sync</p>
</header>
<form className="bb-content-group__collabocate_plugin bb-collabocate_form" id="submitIssueForm" onSubmit={handleSubmit} >
<div className="bb-content-group__collabocate_plugin bb-collabocate_form" id="submitIssueForm">
<div>
<label className="bb-collabocate_label" htmlFor="issueTemplates">Choose Report Type</label>
<br />
Expand All @@ -42,7 +42,15 @@ export const ModalPopup: React.FunctionComponent<ModalPopupProps> = (props: Moda
<br />
<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>
</div>
<button className="bb-content-group__collabocate_form-inner bb-collabocate_submit-form-button" id="submitIssueButton">Submit Issue Ticket</button>
<button className="bb-content-group__collabocate_form-inner bb-collabocate_submit-form-button" id="submitIssueButton" onClick={handleButtonClick}>Submit Issue Ticket</button>
{showButton && (
<div className="bb-collabocate_auth-options">
<button className="bb-content-group__collabocate_form-inner bb-collabocate_submit-form-button bb-collabocate_margin-vertical" onClick={handleSubmitAnonymous}>
Continue as Anonymous User
</button>
<button className="bb-content-group__collabocate_form-inner bb-collabocate_submit-form-button" onClick={handleSubmit}>Continue as GitHub User</button>
</div>
)}
{toastrMessage && (
<div>
<div>{toastrMessage.message}</div>
Expand All @@ -58,7 +66,10 @@ export const ModalPopup: React.FunctionComponent<ModalPopupProps> = (props: Moda
</div>
</div>
)}
</form>
{showGithubLoginButton && (
<a href='http://app.localhost:3000/login' className="bb-collabocate_github-button">Login with Github</a>
)}
</div>
</div>
</>
);
Expand Down
10 changes: 10 additions & 0 deletions src/css/@temporary/bb-modal.css
Original file line number Diff line number Diff line change
Expand Up @@ -69,3 +69,13 @@
padding: 16px 0;
border-radius: 10px;
}

.bb-collabocate_margin-vertical {
margin: 12px 0;
}

.bb-collabocate_github-button {
background: black;
padding: 10px;
color: white
}