@stackoverflow/backstage-plugin-stack-overflow-teams 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +91 -0
- package/config.d.ts +71 -0
- package/dist/api/StackOverflowAPI.esm.js +125 -0
- package/dist/api/StackOverflowAPI.esm.js.map +1 -0
- package/dist/components/StackOverflow/StackOverflowMe.esm.js +110 -0
- package/dist/components/StackOverflow/StackOverflowMe.esm.js.map +1 -0
- package/dist/components/StackOverflow/StackOverflowPostQuestionModal.esm.js +406 -0
- package/dist/components/StackOverflow/StackOverflowPostQuestionModal.esm.js.map +1 -0
- package/dist/components/StackOverflow/StackOverflowPosts.esm.js +402 -0
- package/dist/components/StackOverflow/StackOverflowPosts.esm.js.map +1 -0
- package/dist/components/StackOverflow/StackOverflowSearchResultListItem.esm.js +147 -0
- package/dist/components/StackOverflow/StackOverflowSearchResultListItem.esm.js.map +1 -0
- package/dist/components/StackOverflow/StackOverflowTags.esm.js +117 -0
- package/dist/components/StackOverflow/StackOverflowTags.esm.js.map +1 -0
- package/dist/components/StackOverflow/StackOverflowUsers.esm.js +193 -0
- package/dist/components/StackOverflow/StackOverflowUsers.esm.js.map +1 -0
- package/dist/components/StackOverflow/TiptapEditor.esm.js +308 -0
- package/dist/components/StackOverflow/TiptapEditor.esm.js.map +1 -0
- package/dist/components/StackOverflow/hooks/useStackOverflowData.esm.js +128 -0
- package/dist/components/StackOverflow/hooks/useStackOverflowData.esm.js.map +1 -0
- package/dist/components/StackOverflow/hooks/useStackOverflowSearch.esm.js +53 -0
- package/dist/components/StackOverflow/hooks/useStackOverflowSearch.esm.js.map +1 -0
- package/dist/components/StackOverflow/hooks/useStackOverflowStyles.esm.js +39 -0
- package/dist/components/StackOverflow/hooks/useStackOverflowStyles.esm.js.map +1 -0
- package/dist/components/StackOverflowAuth/StackAuthCallback.esm.js +47 -0
- package/dist/components/StackOverflowAuth/StackAuthCallback.esm.js.map +1 -0
- package/dist/components/StackOverflowAuth/StackAuthFailed.esm.js +35 -0
- package/dist/components/StackOverflowAuth/StackAuthFailed.esm.js.map +1 -0
- package/dist/components/StackOverflowAuth/StackAuthLoading.esm.js +20 -0
- package/dist/components/StackOverflowAuth/StackAuthLoading.esm.js.map +1 -0
- package/dist/components/StackOverflowAuth/StackAuthStart.esm.js +225 -0
- package/dist/components/StackOverflowAuth/StackAuthStart.esm.js.map +1 -0
- package/dist/components/StackOverflowAuth/StackAuthSuccess.esm.js +37 -0
- package/dist/components/StackOverflowAuth/StackAuthSuccess.esm.js.map +1 -0
- package/dist/icons/LogoutIcon.esm.js +24 -0
- package/dist/icons/LogoutIcon.esm.js.map +1 -0
- package/dist/icons/StackOverflowIcon.esm.js +25 -0
- package/dist/icons/StackOverflowIcon.esm.js.map +1 -0
- package/dist/index.d.ts +48 -0
- package/dist/index.esm.js +18 -0
- package/dist/index.esm.js.map +1 -0
- package/dist/package.json.esm.js +98 -0
- package/dist/package.json.esm.js.map +1 -0
- package/dist/pages/StackOverflowHub.esm.js +82 -0
- package/dist/pages/StackOverflowHub.esm.js.map +1 -0
- package/dist/pages/StackOverflowTeamsPage.esm.js +42 -0
- package/dist/pages/StackOverflowTeamsPage.esm.js.map +1 -0
- package/dist/pages/index.esm.js +3 -0
- package/dist/pages/index.esm.js.map +1 -0
- package/dist/plugin.esm.js +27 -0
- package/dist/plugin.esm.js.map +1 -0
- package/dist/routes.esm.js +8 -0
- package/dist/routes.esm.js.map +1 -0
- package/dist/utils/decodeHtml.esm.js +8 -0
- package/dist/utils/decodeHtml.esm.js.map +1 -0
- package/dist/utils/getTimeAgo.esm.js +30 -0
- package/dist/utils/getTimeAgo.esm.js.map +1 -0
- package/package.json +88 -0
|
@@ -0,0 +1,406 @@
|
|
|
1
|
+
import React, { useState, useCallback, useMemo, useEffect } from 'react';
|
|
2
|
+
import { useApi } from '@backstage/core-plugin-api';
|
|
3
|
+
import Chip from '@material-ui/core/Chip';
|
|
4
|
+
import { stackoverflowteamsApiRef } from '../../api/StackOverflowAPI.esm.js';
|
|
5
|
+
import Modal from '@mui/material/Modal';
|
|
6
|
+
import Box from '@mui/material/Box';
|
|
7
|
+
import TextField from '@mui/material/TextField';
|
|
8
|
+
import Button from '@mui/material/Button';
|
|
9
|
+
import Typography from '@mui/material/Typography';
|
|
10
|
+
import Link from '@mui/material/Link';
|
|
11
|
+
import Paper from '@mui/material/Paper';
|
|
12
|
+
import Alert from '@mui/material/Alert';
|
|
13
|
+
import AlertTitle from '@mui/material/AlertTitle';
|
|
14
|
+
import List from '@mui/material/List';
|
|
15
|
+
import ListItem from '@mui/material/ListItem';
|
|
16
|
+
import ListItemIcon from '@mui/material/ListItemIcon';
|
|
17
|
+
import ListItemText from '@mui/material/ListItemText';
|
|
18
|
+
import Grid from '@mui/material/Grid';
|
|
19
|
+
import Card from '@mui/material/Card';
|
|
20
|
+
import CardContent from '@mui/material/CardContent';
|
|
21
|
+
import CheckCircleIcon from '@mui/icons-material/CheckCircle';
|
|
22
|
+
import InfoIcon from '@mui/icons-material/Info';
|
|
23
|
+
import LightbulbIcon from '@mui/icons-material/Lightbulb';
|
|
24
|
+
import CodeIcon from '@mui/icons-material/Code';
|
|
25
|
+
import TitleIcon from '@mui/icons-material/Title';
|
|
26
|
+
import DescriptionIcon from '@mui/icons-material/Description';
|
|
27
|
+
import LocalOfferIcon from '@mui/icons-material/LocalOffer';
|
|
28
|
+
import GroupIcon from '@mui/icons-material/Group';
|
|
29
|
+
import PersonIcon from '@mui/icons-material/Person';
|
|
30
|
+
import { useStackOverflowStyles } from './hooks/useStackOverflowStyles.esm.js';
|
|
31
|
+
import { TiptapEditor } from './TiptapEditor.esm.js';
|
|
32
|
+
import CircularProgress from '@mui/material/CircularProgress';
|
|
33
|
+
import { debounce } from '@material-ui/core';
|
|
34
|
+
|
|
35
|
+
const isMac = () => {
|
|
36
|
+
return typeof navigator !== "undefined" && navigator.platform.toUpperCase().indexOf("MAC") >= 0;
|
|
37
|
+
};
|
|
38
|
+
const getModifierKey = () => {
|
|
39
|
+
const isApple = isMac();
|
|
40
|
+
return {
|
|
41
|
+
symbol: isApple ? "\u2318" : "Ctrl",
|
|
42
|
+
text: isApple ? "Cmd" : "Ctrl"
|
|
43
|
+
};
|
|
44
|
+
};
|
|
45
|
+
const StackOverflowPostQuestionModal = () => {
|
|
46
|
+
const stackOverflowApi = useApi(stackoverflowteamsApiRef);
|
|
47
|
+
const [title, setTitle] = useState("");
|
|
48
|
+
const [body, setBody] = useState("");
|
|
49
|
+
const [tags, setTags] = useState([]);
|
|
50
|
+
const [tagInput, setTagInput] = useState("");
|
|
51
|
+
const [focusedField, setFocusedField] = useState(null);
|
|
52
|
+
const [isAuthenticated, setIsAuthenticated] = useState(false);
|
|
53
|
+
const [loading, setLoading] = useState(false);
|
|
54
|
+
const [error, setError] = useState(null);
|
|
55
|
+
const [success, setSuccess] = useState(false);
|
|
56
|
+
const [open, setOpen] = useState(false);
|
|
57
|
+
const [titleValidation, setTitleValidation] = useState("");
|
|
58
|
+
const [bodyValidation, setBodyValidation] = useState("");
|
|
59
|
+
const [tagsValidation, setTagsValidation] = useState("");
|
|
60
|
+
const classes = useStackOverflowStyles();
|
|
61
|
+
const [titleStarted, setTitleStarted] = useState(false);
|
|
62
|
+
const [bodyStarted, setBodyStarted] = useState(false);
|
|
63
|
+
const [tagsStarted, setTagsStarted] = useState(false);
|
|
64
|
+
const [popularTags, setPopularTags] = useState([]);
|
|
65
|
+
const [loadingTags, setLoadingTags] = useState(false);
|
|
66
|
+
const [tagError, setTagError] = useState(null);
|
|
67
|
+
const [tagSearchResults, setTagSearchResults] = useState([]);
|
|
68
|
+
const [searchingTags, setSearchingTags] = useState(false);
|
|
69
|
+
const [showCreateTagOption, setShowCreateTagOption] = useState(false);
|
|
70
|
+
const fetchPopularTags = useCallback(async function fetchPopularTags2() {
|
|
71
|
+
if (!isAuthenticated) return;
|
|
72
|
+
setLoadingTags(true);
|
|
73
|
+
setTagError(null);
|
|
74
|
+
try {
|
|
75
|
+
const response = await stackOverflowApi.getTags();
|
|
76
|
+
const topTags = response.items?.slice(0, 10) || [];
|
|
77
|
+
setPopularTags(topTags);
|
|
78
|
+
} catch (err) {
|
|
79
|
+
setTagError("Failed to load tags.");
|
|
80
|
+
setPopularTags([]);
|
|
81
|
+
} finally {
|
|
82
|
+
setLoadingTags(false);
|
|
83
|
+
}
|
|
84
|
+
}, [stackOverflowApi, isAuthenticated]);
|
|
85
|
+
const searchTags = useMemo(
|
|
86
|
+
() => debounce(async (searchTerm) => {
|
|
87
|
+
if (!searchTerm.trim() || !isAuthenticated) {
|
|
88
|
+
setTagSearchResults([]);
|
|
89
|
+
setShowCreateTagOption(false);
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
setSearchingTags(true);
|
|
93
|
+
try {
|
|
94
|
+
const response = await stackOverflowApi.getTags(searchTerm.trim());
|
|
95
|
+
const results = response.items || [];
|
|
96
|
+
setTagSearchResults(results);
|
|
97
|
+
setShowCreateTagOption(results.length === 0);
|
|
98
|
+
} catch (err) {
|
|
99
|
+
setTagSearchResults([]);
|
|
100
|
+
setShowCreateTagOption(true);
|
|
101
|
+
} finally {
|
|
102
|
+
setSearchingTags(false);
|
|
103
|
+
}
|
|
104
|
+
}, 500),
|
|
105
|
+
[stackOverflowApi, isAuthenticated]
|
|
106
|
+
);
|
|
107
|
+
const modifierKey = getModifierKey();
|
|
108
|
+
function validateTitle(value) {
|
|
109
|
+
if (titleStarted && value.trim().length < 15) {
|
|
110
|
+
setTitleValidation("Title should be at least 15 characters for clarity.");
|
|
111
|
+
} else {
|
|
112
|
+
setTitleValidation("");
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
const validateBody = useCallback(function validateBody2(value) {
|
|
116
|
+
const textContent = value.replace(/<[^>]*>/g, "");
|
|
117
|
+
if (bodyStarted && textContent.trim().length < 30) {
|
|
118
|
+
setBodyValidation("Please provide more detail (minimum 30 characters).");
|
|
119
|
+
} else {
|
|
120
|
+
setBodyValidation("");
|
|
121
|
+
}
|
|
122
|
+
}, [bodyStarted]);
|
|
123
|
+
const validateTags = useCallback(function validateTags2() {
|
|
124
|
+
if (tagsStarted && tags.length === 0) {
|
|
125
|
+
setTagsValidation("At least one tag is required.");
|
|
126
|
+
} else {
|
|
127
|
+
setTagsValidation("");
|
|
128
|
+
}
|
|
129
|
+
}, [tagsStarted, tags]);
|
|
130
|
+
useEffect(() => {
|
|
131
|
+
const openModal = async () => {
|
|
132
|
+
const authStatus = await stackOverflowApi.getAuthStatus();
|
|
133
|
+
setIsAuthenticated(authStatus);
|
|
134
|
+
setSuccess(false);
|
|
135
|
+
setOpen(true);
|
|
136
|
+
};
|
|
137
|
+
window.addEventListener("openAskQuestionModal", openModal);
|
|
138
|
+
return () => {
|
|
139
|
+
window.removeEventListener("openAskQuestionModal", openModal);
|
|
140
|
+
};
|
|
141
|
+
}, [stackOverflowApi]);
|
|
142
|
+
useEffect(() => {
|
|
143
|
+
if (open && isAuthenticated && popularTags.length === 0) {
|
|
144
|
+
fetchPopularTags();
|
|
145
|
+
}
|
|
146
|
+
}, [open, isAuthenticated, fetchPopularTags, popularTags.length]);
|
|
147
|
+
useEffect(() => {
|
|
148
|
+
validateTags();
|
|
149
|
+
}, [tags, tagsStarted, validateTags]);
|
|
150
|
+
useEffect(() => {
|
|
151
|
+
validateBody(body);
|
|
152
|
+
}, [body, bodyStarted, validateBody]);
|
|
153
|
+
const handleSubmit = async () => {
|
|
154
|
+
validateTitle(title);
|
|
155
|
+
validateBody(body);
|
|
156
|
+
validateTags();
|
|
157
|
+
if (titleValidation || bodyValidation || tagsValidation) {
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
const textContent = body.replace(/<[^>]*>/g, "").trim();
|
|
161
|
+
if (!title || !textContent || tags.length === 0) {
|
|
162
|
+
setError("Title, body, and at least one tag are required.");
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
setLoading(true);
|
|
166
|
+
setError(null);
|
|
167
|
+
try {
|
|
168
|
+
const response = await stackOverflowApi.postQuestion(title, body, tags);
|
|
169
|
+
setSuccess(true);
|
|
170
|
+
setTitle("");
|
|
171
|
+
setBody("");
|
|
172
|
+
setTags([]);
|
|
173
|
+
setTagInput("");
|
|
174
|
+
if (response.webUrl) {
|
|
175
|
+
window.open(`${response.webUrl}?r=Backstage_Plugin`, "_blank");
|
|
176
|
+
}
|
|
177
|
+
} catch (err) {
|
|
178
|
+
if (err instanceof Error) {
|
|
179
|
+
setError(err.message);
|
|
180
|
+
} else {
|
|
181
|
+
setError("An unexpected error occurred.");
|
|
182
|
+
}
|
|
183
|
+
} finally {
|
|
184
|
+
setLoading(false);
|
|
185
|
+
}
|
|
186
|
+
};
|
|
187
|
+
const handleTagAdd = () => {
|
|
188
|
+
const newTags = tagInput.split(/[\s,]+/).map((tag) => tag.trim()).filter((tag) => tag.length > 0 && !tags.includes(tag));
|
|
189
|
+
if (newTags.length > 0 && tags.length + newTags.length <= 5) {
|
|
190
|
+
setTags([...tags, ...newTags]);
|
|
191
|
+
if (!tagsStarted) setTagsStarted(true);
|
|
192
|
+
}
|
|
193
|
+
setTagInput("");
|
|
194
|
+
setTagSearchResults([]);
|
|
195
|
+
};
|
|
196
|
+
const handleLoginRedirect = () => {
|
|
197
|
+
setOpen(false);
|
|
198
|
+
window.location.href = "/stack-overflow-teams";
|
|
199
|
+
};
|
|
200
|
+
const handleBodyChange = (value) => {
|
|
201
|
+
if (!bodyStarted) setBodyStarted(true);
|
|
202
|
+
setBody(value);
|
|
203
|
+
};
|
|
204
|
+
const handleBodyFocus = () => {
|
|
205
|
+
setFocusedField("body");
|
|
206
|
+
};
|
|
207
|
+
const renderTitleTips = () => /* @__PURE__ */ React.createElement(Box, { sx: { height: "100%", display: "flex", flexDirection: "column" } }, /* @__PURE__ */ React.createElement(Typography, { variant: "h6", gutterBottom: true, sx: { display: "flex", alignItems: "center", gap: 1 } }, /* @__PURE__ */ React.createElement(TitleIcon, { color: "primary" }), "Writing a Good Title"), /* @__PURE__ */ React.createElement(Card, { elevation: 2, sx: { mb: 2 } }, /* @__PURE__ */ React.createElement(CardContent, null, /* @__PURE__ */ React.createElement(Typography, { variant: "subtitle2", fontWeight: "bold", sx: { display: "flex", alignItems: "center", gap: 1, mb: 1 } }, /* @__PURE__ */ React.createElement(CheckCircleIcon, { color: "success", fontSize: "small" }), "Good Title Examples"), /* @__PURE__ */ React.createElement(Paper, { elevation: 1, sx: { p: 1.5, bgcolor: "success.50", mb: 1 } }, /* @__PURE__ */ React.createElement(Typography, { variant: "body2", color: "success.main" }, '\u2713 "How to handle async errors in React useEffect hook?"')), /* @__PURE__ */ React.createElement(Paper, { elevation: 1, sx: { p: 1.5, bgcolor: "success.50", mb: 1 } }, /* @__PURE__ */ React.createElement(Typography, { variant: "body2", color: "success.main" }, '\u2713 "Why does my Docker container fail to connect to PostgreSQL?"')), /* @__PURE__ */ React.createElement(Paper, { elevation: 1, sx: { p: 1.5, bgcolor: "error.50" } }, /* @__PURE__ */ React.createElement(Typography, { variant: "body2", color: "error.main" }, `\u2717 "Help! My code doesn't work!"`)))), /* @__PURE__ */ React.createElement(Card, { elevation: 2 }, /* @__PURE__ */ React.createElement(CardContent, null, /* @__PURE__ */ React.createElement(Typography, { variant: "subtitle2", fontWeight: "bold", sx: { mb: 1 } }, "Title Tips"), /* @__PURE__ */ React.createElement(List, null, /* @__PURE__ */ React.createElement(ListItem, null, /* @__PURE__ */ React.createElement(ListItemIcon, null, /* @__PURE__ */ React.createElement(InfoIcon, { color: "info", fontSize: "small" })), /* @__PURE__ */ React.createElement(ListItemText, { primary: "Be specific about your problem" })), /* @__PURE__ */ React.createElement(ListItem, null, /* @__PURE__ */ React.createElement(ListItemIcon, null, /* @__PURE__ */ React.createElement(InfoIcon, { color: "info", fontSize: "small" })), /* @__PURE__ */ React.createElement(ListItemText, { primary: "Include relevant technologies" })), /* @__PURE__ */ React.createElement(ListItem, null, /* @__PURE__ */ React.createElement(ListItemIcon, null, /* @__PURE__ */ React.createElement(InfoIcon, { color: "info", fontSize: "small" })), /* @__PURE__ */ React.createElement(ListItemText, { primary: "Avoid vague terms like 'doesn't work'" }))))));
|
|
208
|
+
const renderBodyTips = () => /* @__PURE__ */ React.createElement(Box, { sx: { height: "100%", display: "flex", flexDirection: "column" } }, /* @__PURE__ */ React.createElement(Typography, { variant: "h6", gutterBottom: true, sx: { display: "flex", alignItems: "center", gap: 1 } }, /* @__PURE__ */ React.createElement(DescriptionIcon, { color: "primary" }), "Explaining the issue in more detail"), /* @__PURE__ */ React.createElement(Card, { elevation: 2, sx: { mb: 2 } }, /* @__PURE__ */ React.createElement(CardContent, null, /* @__PURE__ */ React.createElement(Typography, { variant: "subtitle2", fontWeight: "bold", sx: { display: "flex", alignItems: "center", gap: 1, mb: 1 } }, /* @__PURE__ */ React.createElement(CodeIcon, { color: "info", fontSize: "small" }), "Rich Text Formatting"), /* @__PURE__ */ React.createElement(Typography, { variant: "body2", color: "text.secondary", sx: { mb: 1 } }, "Use the toolbar to format your text with bold, italic, code blocks, lists, and more. Keyboard shortcuts: ", modifierKey.text, "+B (bold), ", modifierKey.text, "+I (italic), ", modifierKey.text, "+U (underline), ", modifierKey.text, "+E (code)."))), /* @__PURE__ */ React.createElement(Card, { elevation: 2 }, /* @__PURE__ */ React.createElement(CardContent, null, /* @__PURE__ */ React.createElement(Typography, { variant: "subtitle2", fontWeight: "bold", sx: { mb: 1 } }, "Structure Your Question"), /* @__PURE__ */ React.createElement(List, null, /* @__PURE__ */ React.createElement(ListItem, null, /* @__PURE__ */ React.createElement(ListItemIcon, null, /* @__PURE__ */ React.createElement(CheckCircleIcon, { color: "success", fontSize: "small" })), /* @__PURE__ */ React.createElement(ListItemText, { primary: "What you're trying to achieve" })), /* @__PURE__ */ React.createElement(ListItem, null, /* @__PURE__ */ React.createElement(ListItemIcon, null, /* @__PURE__ */ React.createElement(CheckCircleIcon, { color: "success", fontSize: "small" })), /* @__PURE__ */ React.createElement(ListItemText, { primary: "What you've tried so far" })), /* @__PURE__ */ React.createElement(ListItem, null, /* @__PURE__ */ React.createElement(ListItemIcon, null, /* @__PURE__ */ React.createElement(CheckCircleIcon, { color: "success", fontSize: "small" })), /* @__PURE__ */ React.createElement(ListItemText, { primary: "Expected vs actual results" })), /* @__PURE__ */ React.createElement(ListItem, null, /* @__PURE__ */ React.createElement(ListItemIcon, null, /* @__PURE__ */ React.createElement(CheckCircleIcon, { color: "success", fontSize: "small" })), /* @__PURE__ */ React.createElement(ListItemText, { primary: "Error messages (if any)" }))))));
|
|
209
|
+
const renderTagsTips = () => /* @__PURE__ */ React.createElement(Box, { sx: { height: "100%", display: "flex", flexDirection: "column" } }, /* @__PURE__ */ React.createElement(Typography, { variant: "h6", gutterBottom: true, sx: { display: "flex", alignItems: "center", gap: 1 } }, /* @__PURE__ */ React.createElement(LocalOfferIcon, { color: "primary" }), "Choosing Tags"), /* @__PURE__ */ React.createElement(Card, { elevation: 2, sx: { mb: 2 } }, /* @__PURE__ */ React.createElement(CardContent, null, /* @__PURE__ */ React.createElement(Typography, { variant: "subtitle2", fontWeight: "bold", sx: { pb: 1 } }, "Popular Tags"), loadingTags && /* @__PURE__ */ React.createElement(Box, { sx: { display: "flex", justifyContent: "center", alignItems: "center", py: 2 } }, /* @__PURE__ */ React.createElement(CircularProgress, { size: 24 }), /* @__PURE__ */ React.createElement(Typography, { variant: "body2", sx: { ml: 1 } }, "Loading popular tags...")), !loadingTags && tagError && /* @__PURE__ */ React.createElement(Typography, { variant: "body2", color: "error", sx: { mb: 2 } }, tagError), /* @__PURE__ */ React.createElement(Box, { sx: { display: "flex", flexWrap: "wrap", gap: 1, mb: 2 } }, popularTags.map((tag) => /* @__PURE__ */ React.createElement(
|
|
210
|
+
Chip,
|
|
211
|
+
{
|
|
212
|
+
key: tag.name,
|
|
213
|
+
label: `${tag.name}`,
|
|
214
|
+
size: "medium",
|
|
215
|
+
variant: "outlined",
|
|
216
|
+
onClick: () => !tags.includes(tag.name) && tags.length < 5 && setTags([...tags, tag.name]),
|
|
217
|
+
disabled: tags.includes(tag.name) || tags.length >= 5
|
|
218
|
+
}
|
|
219
|
+
))), !loadingTags && !tagError && popularTags.length > 0 && /* @__PURE__ */ React.createElement(Typography, { variant: "body2", color: "text.secondary" }, "Click on any popular tag above to add them quickly."), !loadingTags && !tagError && popularTags.length === 0 && /* @__PURE__ */ React.createElement(Typography, { variant: "body2", color: "text.secondary" }, "No popular tags available."))), /* @__PURE__ */ React.createElement(Card, { elevation: 2 }, /* @__PURE__ */ React.createElement(CardContent, null, /* @__PURE__ */ React.createElement(Typography, { variant: "subtitle2", fontWeight: "bold", sx: { mb: 1 } }, "Tag Guidelines"), /* @__PURE__ */ React.createElement(List, null, /* @__PURE__ */ React.createElement(ListItem, null, /* @__PURE__ */ React.createElement(ListItemIcon, null, /* @__PURE__ */ React.createElement(InfoIcon, { color: "info", fontSize: "small" })), /* @__PURE__ */ React.createElement(ListItemText, { primary: "Use 1-5 tags that describe your question" })), /* @__PURE__ */ React.createElement(ListItem, null, /* @__PURE__ */ React.createElement(ListItemIcon, null, /* @__PURE__ */ React.createElement(InfoIcon, { color: "info", fontSize: "small" })), /* @__PURE__ */ React.createElement(ListItemText, { primary: "Try to use existing tags" })), /* @__PURE__ */ React.createElement(ListItem, null, /* @__PURE__ */ React.createElement(ListItemIcon, null, /* @__PURE__ */ React.createElement(InfoIcon, { color: "info", fontSize: "small" })), /* @__PURE__ */ React.createElement(ListItemText, { primary: "Add relevant tools and platforms" }))))));
|
|
220
|
+
const renderMentionTips = () => /* @__PURE__ */ React.createElement(Box, { sx: { height: "100%", display: "flex", flexDirection: "column" } }, /* @__PURE__ */ React.createElement(Typography, { variant: "h6", gutterBottom: true, sx: { display: "flex", alignItems: "center", gap: 1 } }, /* @__PURE__ */ React.createElement(GroupIcon, { color: "primary" }), "Asking Team Members"), /* @__PURE__ */ React.createElement(Card, { elevation: 2, sx: { mb: 2 } }, /* @__PURE__ */ React.createElement(CardContent, null, /* @__PURE__ */ React.createElement(Typography, { variant: "subtitle2", fontWeight: "bold", sx: { display: "flex", alignItems: "center", gap: 1, mb: 1 } }, /* @__PURE__ */ React.createElement(PersonIcon, { color: "info", fontSize: "small" }), "When to Mention Someone"), /* @__PURE__ */ React.createElement(List, null, /* @__PURE__ */ React.createElement(ListItem, null, /* @__PURE__ */ React.createElement(ListItemIcon, null, /* @__PURE__ */ React.createElement(CheckCircleIcon, { color: "success", fontSize: "small" })), /* @__PURE__ */ React.createElement(ListItemText, { primary: "They're an expert in the relevant area" })), /* @__PURE__ */ React.createElement(ListItem, null, /* @__PURE__ */ React.createElement(ListItemIcon, null, /* @__PURE__ */ React.createElement(CheckCircleIcon, { color: "success", fontSize: "small" })), /* @__PURE__ */ React.createElement(ListItemText, { primary: "They've worked on similar problems" })), /* @__PURE__ */ React.createElement(ListItem, null, /* @__PURE__ */ React.createElement(ListItemIcon, null, /* @__PURE__ */ React.createElement(CheckCircleIcon, { color: "success", fontSize: "small" })), /* @__PURE__ */ React.createElement(ListItemText, { primary: "They're the owner of the code in question" }))))), /* @__PURE__ */ React.createElement(Card, { elevation: 2 }, /* @__PURE__ */ React.createElement(CardContent, null, /* @__PURE__ */ React.createElement(Typography, { variant: "subtitle2", fontWeight: "bold", sx: { mb: 1 } }, "Mention Guidelines"), /* @__PURE__ */ React.createElement(Typography, { variant: "body2", color: "text.secondary", sx: { mb: 1 } }, "Type usernames or group names. You can mention:"), /* @__PURE__ */ React.createElement(List, null, /* @__PURE__ */ React.createElement(ListItem, null, /* @__PURE__ */ React.createElement(ListItemIcon, null, /* @__PURE__ */ React.createElement(InfoIcon, { color: "info", fontSize: "small" })), /* @__PURE__ */ React.createElement(ListItemText, { primary: "Individual team members (@john.doe)" })), /* @__PURE__ */ React.createElement(ListItem, null, /* @__PURE__ */ React.createElement(ListItemIcon, null, /* @__PURE__ */ React.createElement(InfoIcon, { color: "info", fontSize: "small" })), /* @__PURE__ */ React.createElement(ListItemText, { primary: "Team groups (@frontend-team)" }))))));
|
|
221
|
+
const renderDefaultTips = () => /* @__PURE__ */ React.createElement(Box, { sx: { height: "100%", display: "flex", flexDirection: "column" } }, /* @__PURE__ */ React.createElement(Typography, { variant: "h6", gutterBottom: true, sx: { display: "flex", alignItems: "center", gap: 1 } }, /* @__PURE__ */ React.createElement(LightbulbIcon, { color: "primary" }), "Writing a Good Question"), /* @__PURE__ */ React.createElement(Card, { elevation: 2, sx: { mb: 2 } }, /* @__PURE__ */ React.createElement(CardContent, null, /* @__PURE__ */ React.createElement(Typography, { variant: "subtitle2", fontWeight: "bold", sx: { display: "flex", alignItems: "center", gap: 1, mb: 1 } }, /* @__PURE__ */ React.createElement(InfoIcon, { color: "info", fontSize: "small" }), "Quick Tips"), /* @__PURE__ */ React.createElement(List, null, /* @__PURE__ */ React.createElement(ListItem, null, /* @__PURE__ */ React.createElement(ListItemIcon, null, /* @__PURE__ */ React.createElement(CheckCircleIcon, { color: "success", fontSize: "small" })), /* @__PURE__ */ React.createElement(ListItemText, { primary: "Be specific and clear in your title" })), /* @__PURE__ */ React.createElement(ListItem, null, /* @__PURE__ */ React.createElement(ListItemIcon, null, /* @__PURE__ */ React.createElement(CheckCircleIcon, { color: "success", fontSize: "small" })), /* @__PURE__ */ React.createElement(ListItemText, { primary: "Include relevant code and error messages" })), /* @__PURE__ */ React.createElement(ListItem, null, /* @__PURE__ */ React.createElement(ListItemIcon, null, /* @__PURE__ */ React.createElement(CheckCircleIcon, { color: "success", fontSize: "small" })), /* @__PURE__ */ React.createElement(ListItemText, { primary: "Tag your question appropriately" }))))));
|
|
222
|
+
const renderRightPanel = () => {
|
|
223
|
+
switch (focusedField) {
|
|
224
|
+
case "title":
|
|
225
|
+
return renderTitleTips();
|
|
226
|
+
case "body":
|
|
227
|
+
return renderBodyTips();
|
|
228
|
+
case "tags":
|
|
229
|
+
return renderTagsTips();
|
|
230
|
+
case "mentions":
|
|
231
|
+
return renderMentionTips();
|
|
232
|
+
default:
|
|
233
|
+
return renderDefaultTips();
|
|
234
|
+
}
|
|
235
|
+
};
|
|
236
|
+
const renderQuestionForm = () => /* @__PURE__ */ React.createElement(Box, { sx: { height: "100%" } }, /* @__PURE__ */ React.createElement(Box, { sx: { mb: 3 } }, /* @__PURE__ */ React.createElement(Typography, { variant: "subtitle1", fontWeight: "bold", gutterBottom: true }, "Title"), /* @__PURE__ */ React.createElement(Typography, { variant: "body2", color: "text.secondary", sx: { mb: 1 } }, "Be specific and imagine you're asking a question to another person."), /* @__PURE__ */ React.createElement(
|
|
237
|
+
TextField,
|
|
238
|
+
{
|
|
239
|
+
fullWidth: true,
|
|
240
|
+
variant: "outlined",
|
|
241
|
+
value: title,
|
|
242
|
+
onChange: (e) => {
|
|
243
|
+
if (!titleStarted) setTitleStarted(true);
|
|
244
|
+
setTitle(e.target.value);
|
|
245
|
+
validateTitle(e.target.value);
|
|
246
|
+
},
|
|
247
|
+
onFocus: () => setFocusedField("title"),
|
|
248
|
+
error: titleStarted && !!titleValidation,
|
|
249
|
+
helperText: titleStarted ? titleValidation : "",
|
|
250
|
+
placeholder: "e.g., How to handle authentication in React components?"
|
|
251
|
+
}
|
|
252
|
+
)), /* @__PURE__ */ React.createElement(Box, { sx: { mb: 3 } }, /* @__PURE__ */ React.createElement(Typography, { variant: "subtitle1", fontWeight: "bold", gutterBottom: true }, "What are the details of your problem?"), /* @__PURE__ */ React.createElement(Typography, { variant: "body2", color: "text.secondary", sx: { mb: 1 } }, "Introduce the problem and expand on what you put in the title. Use the formatting toolbar to style your text."), /* @__PURE__ */ React.createElement(
|
|
253
|
+
TiptapEditor,
|
|
254
|
+
{
|
|
255
|
+
content: body,
|
|
256
|
+
onUpdate: handleBodyChange,
|
|
257
|
+
onFocus: handleBodyFocus,
|
|
258
|
+
placeholder: "Describe your problem in detail. Include any error messages, code snippets, and what you've tried so far...",
|
|
259
|
+
error: bodyStarted && !!bodyValidation,
|
|
260
|
+
modifierKey
|
|
261
|
+
}
|
|
262
|
+
), bodyStarted && bodyValidation && /* @__PURE__ */ React.createElement(Typography, { variant: "caption", color: "error", sx: { mt: 1, display: "block" } }, bodyValidation)), /* @__PURE__ */ React.createElement(Box, { sx: { mb: 3, position: "relative" } }, /* @__PURE__ */ React.createElement(Typography, { variant: "subtitle1", fontWeight: "bold", gutterBottom: true }, "Tags"), /* @__PURE__ */ React.createElement(Typography, { variant: "body2", color: "text.secondary", sx: { mb: 1 } }, "At least one tag is required."), /* @__PURE__ */ React.createElement(
|
|
263
|
+
TextField,
|
|
264
|
+
{
|
|
265
|
+
fullWidth: true,
|
|
266
|
+
variant: "outlined",
|
|
267
|
+
value: tagInput,
|
|
268
|
+
onChange: (e) => {
|
|
269
|
+
const value = e.target.value;
|
|
270
|
+
setTagInput(value);
|
|
271
|
+
setShowCreateTagOption(false);
|
|
272
|
+
const lastTag = value.split(/[\s,]/).pop()?.trim() || "";
|
|
273
|
+
if (lastTag.length >= 2) {
|
|
274
|
+
searchTags(lastTag);
|
|
275
|
+
} else {
|
|
276
|
+
setTagSearchResults([]);
|
|
277
|
+
}
|
|
278
|
+
if (value.includes(",") || value.includes(" ")) {
|
|
279
|
+
handleTagAdd();
|
|
280
|
+
}
|
|
281
|
+
},
|
|
282
|
+
onFocus: () => setFocusedField("tags"),
|
|
283
|
+
onKeyDown: (e) => e.key === "Enter" && handleTagAdd(),
|
|
284
|
+
placeholder: "e.g., react, javascript, authentication",
|
|
285
|
+
error: !!tagsValidation
|
|
286
|
+
}
|
|
287
|
+
), (tagSearchResults.length > 0 || searchingTags || tagInput.trim() && tagSearchResults.length === 0 && !searchingTags) && /* @__PURE__ */ React.createElement(
|
|
288
|
+
Paper,
|
|
289
|
+
{
|
|
290
|
+
elevation: 3,
|
|
291
|
+
sx: {
|
|
292
|
+
position: "absolute",
|
|
293
|
+
zIndex: 1e3,
|
|
294
|
+
width: "100%",
|
|
295
|
+
maxHeight: 200,
|
|
296
|
+
overflow: "auto",
|
|
297
|
+
mt: 1
|
|
298
|
+
}
|
|
299
|
+
},
|
|
300
|
+
searchingTags && /* @__PURE__ */ React.createElement(Box, { sx: { p: 2, display: "flex", alignItems: "center", gap: 1 } }, /* @__PURE__ */ React.createElement(CircularProgress, { size: 16 }), /* @__PURE__ */ React.createElement(Typography, { variant: "body2" }, "Searching tags...")),
|
|
301
|
+
tagSearchResults.map((tag) => /* @__PURE__ */ React.createElement(
|
|
302
|
+
ListItem,
|
|
303
|
+
{
|
|
304
|
+
key: tag.name,
|
|
305
|
+
onClick: () => {
|
|
306
|
+
if (!tags.includes(tag.name) && tags.length < 5) {
|
|
307
|
+
setTags([...tags, tag.name]);
|
|
308
|
+
if (!tagsStarted) setTagsStarted(true);
|
|
309
|
+
}
|
|
310
|
+
setTagInput("");
|
|
311
|
+
setTagSearchResults([]);
|
|
312
|
+
},
|
|
313
|
+
sx: {
|
|
314
|
+
cursor: "pointer",
|
|
315
|
+
"&:hover": { backgroundColor: "action.hover" }
|
|
316
|
+
}
|
|
317
|
+
},
|
|
318
|
+
/* @__PURE__ */ React.createElement(
|
|
319
|
+
ListItemText,
|
|
320
|
+
{
|
|
321
|
+
primary: tag.name,
|
|
322
|
+
secondary: `${tag.postCount} posts`
|
|
323
|
+
}
|
|
324
|
+
)
|
|
325
|
+
)),
|
|
326
|
+
tagInput.trim() && showCreateTagOption && /* @__PURE__ */ React.createElement(
|
|
327
|
+
ListItem,
|
|
328
|
+
{
|
|
329
|
+
onClick: () => {
|
|
330
|
+
const trimmedTag = tagInput.trim();
|
|
331
|
+
if (trimmedTag && !tags.includes(trimmedTag) && tags.length < 5) {
|
|
332
|
+
setTags([...tags, trimmedTag]);
|
|
333
|
+
if (!tagsStarted) setTagsStarted(true);
|
|
334
|
+
setShowCreateTagOption(false);
|
|
335
|
+
}
|
|
336
|
+
setTagInput("");
|
|
337
|
+
setTagSearchResults([]);
|
|
338
|
+
},
|
|
339
|
+
sx: {
|
|
340
|
+
cursor: "pointer",
|
|
341
|
+
"&:hover": { backgroundColor: "action.hover" },
|
|
342
|
+
borderTop: tagSearchResults.length > 0 ? "1px solid" : "none",
|
|
343
|
+
borderColor: "divider"
|
|
344
|
+
}
|
|
345
|
+
},
|
|
346
|
+
/* @__PURE__ */ React.createElement(
|
|
347
|
+
ListItemText,
|
|
348
|
+
{
|
|
349
|
+
primary: /* @__PURE__ */ React.createElement(Box, { sx: { display: "flex", alignItems: "center", gap: 1 } }, /* @__PURE__ */ React.createElement(Typography, null, 'Create "', tagInput.trim(), '"'), /* @__PURE__ */ React.createElement(Chip, { size: "small", label: "New", color: "primary", variant: "outlined" })),
|
|
350
|
+
secondary: "This will create a new tag"
|
|
351
|
+
}
|
|
352
|
+
)
|
|
353
|
+
)
|
|
354
|
+
), tags.length > 0 && /* @__PURE__ */ React.createElement(Box, { sx: { display: "flex", flexWrap: "wrap", gap: 1, mt: 1 } }, tags.map((tag, index) => /* @__PURE__ */ React.createElement(
|
|
355
|
+
Chip,
|
|
356
|
+
{
|
|
357
|
+
key: index,
|
|
358
|
+
label: tag,
|
|
359
|
+
onDelete: () => setTags(tags.filter((t) => t !== tag)),
|
|
360
|
+
size: "medium",
|
|
361
|
+
variant: "outlined",
|
|
362
|
+
color: "primary"
|
|
363
|
+
}
|
|
364
|
+
)))), error && /* @__PURE__ */ React.createElement(Alert, { severity: "error", sx: { mb: 2 } }, error), /* @__PURE__ */ React.createElement(Box, { my: 3, sx: { borderTop: 1, borderColor: "divider", pt: 2, display: "flex", gap: 2 } }, /* @__PURE__ */ React.createElement(
|
|
365
|
+
Button,
|
|
366
|
+
{
|
|
367
|
+
variant: "contained",
|
|
368
|
+
className: classes.button,
|
|
369
|
+
size: "large",
|
|
370
|
+
onClick: handleSubmit,
|
|
371
|
+
disabled: loading || !isAuthenticated,
|
|
372
|
+
sx: { flex: 2 }
|
|
373
|
+
},
|
|
374
|
+
loading ? "Posting Question..." : "Post Your Question"
|
|
375
|
+
), /* @__PURE__ */ React.createElement(Button, { onClick: () => setOpen(false), variant: "outlined", size: "large", sx: { flex: 1 } }, "Cancel")));
|
|
376
|
+
const renderContent = () => {
|
|
377
|
+
if (!isAuthenticated) {
|
|
378
|
+
return /* @__PURE__ */ React.createElement(Box, { sx: { textAlign: "center", py: 4 } }, /* @__PURE__ */ React.createElement(Typography, { color: "error", variant: "h6" }, "Authentication Required"), /* @__PURE__ */ React.createElement(Typography, { sx: { mt: 1, mb: 2 } }, "Please", " ", /* @__PURE__ */ React.createElement(Link, { component: "button", onClick: handleLoginRedirect }, "log in"), " ", "to use this feature."));
|
|
379
|
+
}
|
|
380
|
+
if (success) {
|
|
381
|
+
return /* @__PURE__ */ React.createElement(Box, { sx: { textAlign: "center", py: 4, display: "flex", justifyContent: "center" } }, /* @__PURE__ */ React.createElement(Alert, { severity: "success" }, /* @__PURE__ */ React.createElement(AlertTitle, null, "Question Posted Successfully!"), "Your question has been posted and will open in a new tab."));
|
|
382
|
+
}
|
|
383
|
+
return /* @__PURE__ */ React.createElement(Grid, { container: true, spacing: 4, sx: { height: "80vh" } }, /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 12, md: 8 }, renderQuestionForm()), /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 12, md: 4 }, renderRightPanel()));
|
|
384
|
+
};
|
|
385
|
+
return /* @__PURE__ */ React.createElement(Modal, { open, onClose: () => setOpen(false) }, /* @__PURE__ */ React.createElement(
|
|
386
|
+
Box,
|
|
387
|
+
{
|
|
388
|
+
sx: {
|
|
389
|
+
position: "absolute",
|
|
390
|
+
top: "50%",
|
|
391
|
+
left: "50%",
|
|
392
|
+
transform: "translate(-50%, -50%)",
|
|
393
|
+
width: success ? { xs: "full" } : { xs: "95vw", sm: "90vw", md: "80vw", lg: "80vw", xl: "70vw" },
|
|
394
|
+
maxHeight: "90vh",
|
|
395
|
+
bgcolor: "background.paper",
|
|
396
|
+
boxShadow: 24,
|
|
397
|
+
borderRadius: 2,
|
|
398
|
+
overflow: "hidden"
|
|
399
|
+
}
|
|
400
|
+
},
|
|
401
|
+
/* @__PURE__ */ React.createElement(Box, { sx: { p: 3, maxHeight: "90vh", overflow: "auto" } }, /* @__PURE__ */ React.createElement(Box, { sx: { display: "flex", justifyContent: "space-between", alignItems: "center", mb: 3 } }, /* @__PURE__ */ React.createElement(Typography, { variant: "h5", className: classes.title, fontWeight: "bold" }, "Ask a question on Stack Overflow for Teams"), /* @__PURE__ */ React.createElement(Button, { onClick: () => setOpen(false), color: "inherit", sx: { minWidth: "auto", p: 1 } }, "\u2715")), renderContent())
|
|
402
|
+
));
|
|
403
|
+
};
|
|
404
|
+
|
|
405
|
+
export { StackOverflowPostQuestionModal };
|
|
406
|
+
//# sourceMappingURL=StackOverflowPostQuestionModal.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StackOverflowPostQuestionModal.esm.js","sources":["../../../src/components/StackOverflow/StackOverflowPostQuestionModal.tsx"],"sourcesContent":["import React, { useState, useEffect, useCallback, useMemo } from 'react';\nimport { useApi } from '@backstage/core-plugin-api';\nimport Chip from '@material-ui/core/Chip'\nimport { stackoverflowteamsApiRef } from '../../api';\nimport Modal from '@mui/material/Modal';\nimport Box from '@mui/material/Box';\nimport TextField from '@mui/material/TextField';\nimport Button from '@mui/material/Button';\nimport Typography from '@mui/material/Typography';\nimport Link from '@mui/material/Link';\nimport Paper from '@mui/material/Paper';\nimport Alert from '@mui/material/Alert';\nimport AlertTitle from '@mui/material/AlertTitle';\nimport List from '@mui/material/List';\nimport ListItem from '@mui/material/ListItem';\nimport ListItemIcon from '@mui/material/ListItemIcon';\nimport ListItemText from '@mui/material/ListItemText';\nimport Grid from '@mui/material/Grid';\nimport Card from '@mui/material/Card';\nimport CardContent from '@mui/material/CardContent';\nimport CheckCircleIcon from '@mui/icons-material/CheckCircle';\nimport InfoIcon from '@mui/icons-material/Info';\nimport LightbulbIcon from '@mui/icons-material/Lightbulb';\nimport CodeIcon from '@mui/icons-material/Code';\nimport TitleIcon from '@mui/icons-material/Title';\nimport DescriptionIcon from '@mui/icons-material/Description';\nimport LocalOfferIcon from '@mui/icons-material/LocalOffer';\nimport GroupIcon from '@mui/icons-material/Group';\nimport PersonIcon from '@mui/icons-material/Person';\nimport { useStackOverflowStyles } from './hooks';\nimport { TiptapEditor } from './TiptapEditor';\nimport type { Tag } from '../../types'\nimport CircularProgress from '@mui/material/CircularProgress';\nimport { debounce } from '@material-ui/core';\n\n// Utility function to detect Mac\nconst isMac = () => {\n return typeof navigator !== 'undefined' && navigator.platform.toUpperCase().indexOf('MAC') >= 0;\n};\n\n// Apple keyboards are... different :)\nconst getModifierKey = () => {\n const isApple = isMac();\n return {\n symbol: isApple ? '⌘' : 'Ctrl',\n text: isApple ? 'Cmd' : 'Ctrl'\n };\n};\n\nexport const StackOverflowPostQuestionModal = () => {\n const stackOverflowApi = useApi(stackoverflowteamsApiRef);\n const [title, setTitle] = useState('');\n const [body, setBody] = useState(''); // This will now contain HTML from TiptapEditor\n const [tags, setTags] = useState<string[]>([]);\n const [tagInput, setTagInput] = useState('');\n // Mentioning users is not supported on the API (yet)\n // const [mentionedUsers, setMentionedUsers] = useState<string[]>([]); \n // const [userInput, setUserInput] = useState('');\n const [focusedField, setFocusedField] = useState<string | null>(null);\n const [isAuthenticated, setIsAuthenticated] = useState(false);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [success, setSuccess] = useState(false);\n const [open, setOpen] = useState(false);\n const [titleValidation, setTitleValidation] = useState('');\n const [bodyValidation, setBodyValidation] = useState('');\n const [tagsValidation, setTagsValidation] = useState('');\n const classes = useStackOverflowStyles();\n const [titleStarted, setTitleStarted] = useState(false);\n const [bodyStarted, setBodyStarted] = useState(false);\n const [tagsStarted, setTagsStarted] = useState(false);\n\n // Get popular tags\n const [popularTags, setPopularTags] = useState<Tag[]>([])\n const [loadingTags, setLoadingTags] = useState(false)\n const [tagError, setTagError] = useState<string | null>(null)\n\n // Autopopulate tags\n const [tagSearchResults, setTagSearchResults] = useState<Tag[]>([]);\n const [searchingTags, setSearchingTags] = useState(false);\n const [showCreateTagOption, setShowCreateTagOption] = useState(false);\n\n const fetchPopularTags = useCallback(async function fetchPopularTags() {\n if (!isAuthenticated) return;\n\n setLoadingTags(true);\n setTagError(null);\n\n try {\n const response = await stackOverflowApi.getTags();\n const topTags = response.items?.slice(0, 10) || [];\n setPopularTags(topTags);\n } catch (err) {\n setTagError('Failed to load tags.')\n setPopularTags([])\n } finally {\n setLoadingTags(false);\n }\n }, [stackOverflowApi, isAuthenticated])\n\n const searchTags = useMemo(\n () => debounce(async (searchTerm: string) => {\n if (!searchTerm.trim() || !isAuthenticated) {\n setTagSearchResults([]);\n setShowCreateTagOption(false);\n return;\n }\n setSearchingTags(true);\n try {\n const response = await stackOverflowApi.getTags(searchTerm.trim());\n const results = response.items || [];\n setTagSearchResults(results);\n setShowCreateTagOption(results.length === 0); // Show create option only when no results found!\n } catch (err) {\n setTagSearchResults([]);\n setShowCreateTagOption(true); // Show create option if search fails, will keep this for now, since is highly unlikely that this fails without all other things being broken\n } finally {\n setSearchingTags(false);\n }\n }, 500),\n [stackOverflowApi, isAuthenticated]\n );\n \n // Get modifier key info\n const modifierKey = getModifierKey();\n \n function validateTitle(value: string) {\n if (titleStarted && value.trim().length < 15) {\n setTitleValidation('Title should be at least 15 characters for clarity.');\n } else {\n setTitleValidation('');\n }\n }\n \n const validateBody = useCallback(function validateBody(value: string) {\n // Strip HTML tags for character count validation\n const textContent = value.replace(/<[^>]*>/g, '');\n if (bodyStarted && textContent.trim().length < 30) {\n setBodyValidation('Please provide more detail (minimum 30 characters).');\n } else {\n setBodyValidation('');\n }\n }, [bodyStarted])\n \n const validateTags = useCallback (function validateTags() {\n if (tagsStarted && tags.length === 0) {\n setTagsValidation('At least one tag is required.');\n } else {\n setTagsValidation('');\n }\n }, [tagsStarted, tags])\n \n useEffect(() => {\n const openModal = async () => {\n const authStatus = await stackOverflowApi.getAuthStatus();\n setIsAuthenticated(authStatus);\n setSuccess(false);\n setOpen(true);\n };\n window.addEventListener('openAskQuestionModal', openModal);\n return () => {\n window.removeEventListener('openAskQuestionModal', openModal);\n };\n }, [stackOverflowApi]);\n \n useEffect(() => {\n if (open && isAuthenticated && popularTags.length === 0) {\n fetchPopularTags();\n }\n }, [open, isAuthenticated, fetchPopularTags, popularTags.length]);\n\n useEffect(() => {\n validateTags();\n }, [tags, tagsStarted, validateTags]);\n \n useEffect(() => {\n validateBody(body);\n }, [body, bodyStarted, validateBody]);\n \n const handleSubmit = async () => {\n validateTitle(title);\n validateBody(body);\n validateTags();\n if (titleValidation || bodyValidation || tagsValidation) {\n return;\n }\n // Check if body has actual content (not just HTML tags)\n const textContent = body.replace(/<[^>]*>/g, '').trim();\n if (!title || !textContent || tags.length === 0) {\n setError('Title, body, and at least one tag are required.');\n return;\n }\n setLoading(true);\n setError(null);\n try {\n const response = await stackOverflowApi.postQuestion(title, body, tags);\n setSuccess(true);\n // We reset everything\n setTitle('');\n setBody('');\n setTags([]);\n setTagInput('');\n // setMentionedUsers([]);\n // setUserInput('');\n if (response.webUrl) {\n window.open(`${response.webUrl}?r=Backstage_Plugin`, '_blank');\n }\n } catch (err) {\n if (err instanceof Error) {\n setError(err.message);\n } else {\n setError('An unexpected error occurred.');\n }\n } finally {\n setLoading(false);\n }\n };\n \n const handleTagAdd = () => {\n const newTags = tagInput\n .split(/[\\s,]+/)\n .map(tag => tag.trim())\n .filter(tag => tag.length > 0 && !tags.includes(tag));\n \n if (newTags.length > 0 && tags.length + newTags.length <= 5) {\n setTags([...tags, ...newTags]);\n if (!tagsStarted) setTagsStarted(true);\n }\n setTagInput('');\n setTagSearchResults([]);\n };\n \n // This can be uncommented in future once mentioning users over API v3 is supported\n\n // const handleUserAdd = () => {\n // const newUsers = userInput\n // .split(/[\\s,]+/)\n // .map(user => user.trim().replace('@', ''))\n // .filter(user => user.length > 0 && !mentionedUsers.includes(user));\n \n // if (newUsers.length > 0) {\n // setMentionedUsers([...mentionedUsers, ...newUsers]);\n // }\n // setUserInput('');\n // };\n \n const handleLoginRedirect = () => {\n setOpen(false);\n window.location.href = '/stack-overflow-teams';\n };\n \n // Handler for TiptapEditor changes\n const handleBodyChange = (value: string) => {\n if (!bodyStarted) setBodyStarted(true);\n setBody(value);\n };\n \n const handleBodyFocus = () => {\n setFocusedField('body');\n };\n \n const renderTitleTips = () => (\n <Box sx={{ height: '100%', display: 'flex', flexDirection: 'column' }}>\n <Typography variant=\"h6\" gutterBottom sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <TitleIcon color=\"primary\" />\n Writing a Good Title\n </Typography>\n \n <Card elevation={2} sx={{ mb: 2 }}>\n <CardContent>\n <Typography variant=\"subtitle2\" fontWeight=\"bold\" sx={{ display: 'flex', alignItems: 'center', gap: 1, mb: 1 }}>\n <CheckCircleIcon color=\"success\" fontSize=\"small\" />\n Good Title Examples\n </Typography>\n <Paper elevation={1} sx={{ p: 1.5, bgcolor: 'success.50', mb: 1 }}>\n <Typography variant=\"body2\" color=\"success.main\">\n ✓ \"How to handle async errors in React useEffect hook?\"\n </Typography>\n </Paper>\n <Paper elevation={1} sx={{ p: 1.5, bgcolor: 'success.50', mb: 1 }}>\n <Typography variant=\"body2\" color=\"success.main\">\n ✓ \"Why does my Docker container fail to connect to PostgreSQL?\"\n </Typography>\n </Paper>\n <Paper elevation={1} sx={{ p: 1.5, bgcolor: 'error.50' }}>\n <Typography variant=\"body2\" color=\"error.main\">\n ✗ \"Help! My code doesn't work!\"\n </Typography>\n </Paper>\n </CardContent>\n </Card>\n <Card elevation={2}>\n <CardContent>\n <Typography variant=\"subtitle2\" fontWeight=\"bold\" sx={{ mb: 1 }}>\n Title Tips\n </Typography>\n <List>\n <ListItem>\n <ListItemIcon><InfoIcon color=\"info\" fontSize=\"small\" /></ListItemIcon>\n <ListItemText primary=\"Be specific about your problem\" />\n </ListItem>\n <ListItem>\n <ListItemIcon><InfoIcon color=\"info\" fontSize=\"small\" /></ListItemIcon>\n <ListItemText primary=\"Include relevant technologies\" />\n </ListItem>\n <ListItem>\n <ListItemIcon><InfoIcon color=\"info\" fontSize=\"small\" /></ListItemIcon>\n <ListItemText primary=\"Avoid vague terms like 'doesn't work'\" />\n </ListItem>\n </List>\n </CardContent>\n </Card>\n </Box>\n );\n \n const renderBodyTips = () => (\n <Box sx={{ height: '100%', display: 'flex', flexDirection: 'column' }}>\n <Typography variant=\"h6\" gutterBottom sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <DescriptionIcon color=\"primary\" />\n Explaining the issue in more detail\n </Typography>\n \n <Card elevation={2} sx={{ mb: 2 }}>\n <CardContent>\n <Typography variant=\"subtitle2\" fontWeight=\"bold\" sx={{ display: 'flex', alignItems: 'center', gap: 1, mb: 1 }}>\n <CodeIcon color=\"info\" fontSize=\"small\" />\n Rich Text Formatting\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ mb: 1 }}>\n Use the toolbar to format your text with bold, italic, code blocks, lists, and more. Keyboard shortcuts: {modifierKey.text}+B (bold), {modifierKey.text}+I (italic), {modifierKey.text}+U (underline), {modifierKey.text}+E (code).\n </Typography>\n </CardContent>\n </Card>\n <Card elevation={2}>\n <CardContent>\n <Typography variant=\"subtitle2\" fontWeight=\"bold\" sx={{ mb: 1 }}>\n Structure Your Question\n </Typography>\n <List>\n <ListItem>\n <ListItemIcon><CheckCircleIcon color=\"success\" fontSize=\"small\" /></ListItemIcon>\n <ListItemText primary=\"What you're trying to achieve\" />\n </ListItem>\n <ListItem>\n <ListItemIcon><CheckCircleIcon color=\"success\" fontSize=\"small\" /></ListItemIcon>\n <ListItemText primary=\"What you've tried so far\" />\n </ListItem>\n <ListItem>\n <ListItemIcon><CheckCircleIcon color=\"success\" fontSize=\"small\" /></ListItemIcon>\n <ListItemText primary=\"Expected vs actual results\" />\n </ListItem>\n <ListItem>\n <ListItemIcon><CheckCircleIcon color=\"success\" fontSize=\"small\" /></ListItemIcon>\n <ListItemText primary=\"Error messages (if any)\" />\n </ListItem>\n </List>\n </CardContent>\n </Card>\n </Box>\n );\n \n const renderTagsTips = () => (\n <Box sx={{ height: '100%', display: 'flex', flexDirection: 'column' }}>\n <Typography variant=\"h6\" gutterBottom sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <LocalOfferIcon color=\"primary\" />\n Choosing Tags\n </Typography>\n \n <Card elevation={2} sx={{ mb: 2 }}>\n <CardContent>\n <Typography variant=\"subtitle2\" fontWeight=\"bold\" sx={{ pb: 1 }}>\n Popular Tags\n </Typography>\n \n {loadingTags && (\n <Box sx={{ display: 'flex', justifyContent: 'center', alignItems: 'center', py: 2 }}>\n <CircularProgress size={24} />\n <Typography variant=\"body2\" sx={{ ml: 1 }}>\n Loading popular tags...\n </Typography>\n </Box>\n )}\n {!loadingTags && tagError && (\n <Typography variant=\"body2\" color=\"error\" sx={{ mb: 2 }}>\n {tagError}\n </Typography>\n )}\n <Box sx={{ display: 'flex', flexWrap: 'wrap', gap: 1, mb: 2 }}>\n {popularTags.map(tag => (\n <Chip\n key={tag.name}\n label={`${tag.name}`}\n size=\"medium\"\n variant=\"outlined\"\n onClick={() => !tags.includes(tag.name) && tags.length < 5 && setTags([...tags, tag.name])}\n disabled={tags.includes(tag.name) || tags.length >= 5}\n />\n ))}\n </Box>\n {!loadingTags && !tagError && popularTags.length > 0 && (\n <Typography variant=\"body2\" color=\"text.secondary\">\n Click on any popular tag above to add them quickly.\n </Typography>\n )}\n {!loadingTags && !tagError && popularTags.length === 0 && (\n <Typography variant=\"body2\" color=\"text.secondary\">\n No popular tags available.\n </Typography>\n )}\n </CardContent>\n </Card>\n <Card elevation={2}>\n <CardContent>\n <Typography variant=\"subtitle2\" fontWeight=\"bold\" sx={{ mb: 1 }}>\n Tag Guidelines\n </Typography>\n <List>\n <ListItem>\n <ListItemIcon><InfoIcon color=\"info\" fontSize=\"small\" /></ListItemIcon>\n <ListItemText primary=\"Use 1-5 tags that describe your question\" />\n </ListItem>\n <ListItem>\n <ListItemIcon><InfoIcon color=\"info\" fontSize=\"small\" /></ListItemIcon>\n <ListItemText primary=\"Try to use existing tags\" />\n </ListItem>\n <ListItem>\n <ListItemIcon><InfoIcon color=\"info\" fontSize=\"small\" /></ListItemIcon>\n <ListItemText primary=\"Add relevant tools and platforms\" />\n </ListItem>\n </List>\n </CardContent>\n </Card>\n </Box>\n );\n \n const renderMentionTips = () => (\n <Box sx={{ height: '100%', display: 'flex', flexDirection: 'column' }}>\n <Typography variant=\"h6\" gutterBottom sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <GroupIcon color=\"primary\" />\n Asking Team Members\n </Typography>\n \n <Card elevation={2} sx={{ mb: 2 }}>\n <CardContent>\n <Typography variant=\"subtitle2\" fontWeight=\"bold\" sx={{ display: 'flex', alignItems: 'center', gap: 1, mb: 1 }}>\n <PersonIcon color=\"info\" fontSize=\"small\" />\n When to Mention Someone\n </Typography>\n <List>\n <ListItem>\n <ListItemIcon><CheckCircleIcon color=\"success\" fontSize=\"small\" /></ListItemIcon>\n <ListItemText primary=\"They're an expert in the relevant area\" />\n </ListItem>\n <ListItem>\n <ListItemIcon><CheckCircleIcon color=\"success\" fontSize=\"small\" /></ListItemIcon>\n <ListItemText primary=\"They've worked on similar problems\" />\n </ListItem>\n <ListItem>\n <ListItemIcon><CheckCircleIcon color=\"success\" fontSize=\"small\" /></ListItemIcon>\n <ListItemText primary=\"They're the owner of the code in question\" />\n </ListItem>\n </List>\n </CardContent>\n </Card>\n <Card elevation={2}>\n <CardContent>\n <Typography variant=\"subtitle2\" fontWeight=\"bold\" sx={{ mb: 1 }}>\n Mention Guidelines\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ mb: 1 }}>\n Type usernames or group names. You can mention:\n </Typography>\n <List>\n <ListItem>\n <ListItemIcon><InfoIcon color=\"info\" fontSize=\"small\" /></ListItemIcon>\n <ListItemText primary=\"Individual team members (@john.doe)\" />\n </ListItem>\n <ListItem>\n <ListItemIcon><InfoIcon color=\"info\" fontSize=\"small\" /></ListItemIcon>\n <ListItemText primary=\"Team groups (@frontend-team)\" />\n </ListItem>\n </List>\n </CardContent>\n </Card>\n </Box>\n );\n \n const renderDefaultTips = () => (\n <Box sx={{ height: '100%', display: 'flex', flexDirection: 'column' }}>\n <Typography variant=\"h6\" gutterBottom sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <LightbulbIcon color=\"primary\" />\n Writing a Good Question\n </Typography>\n \n <Card elevation={2} sx={{ mb: 2 }}>\n <CardContent>\n <Typography variant=\"subtitle2\" fontWeight=\"bold\" sx={{ display: 'flex', alignItems: 'center', gap: 1, mb: 1 }}>\n <InfoIcon color=\"info\" fontSize=\"small\" />\n Quick Tips\n </Typography>\n <List>\n <ListItem>\n <ListItemIcon><CheckCircleIcon color=\"success\" fontSize=\"small\" /></ListItemIcon>\n <ListItemText primary=\"Be specific and clear in your title\" />\n </ListItem>\n <ListItem>\n <ListItemIcon><CheckCircleIcon color=\"success\" fontSize=\"small\" /></ListItemIcon>\n <ListItemText primary=\"Include relevant code and error messages\" />\n </ListItem>\n <ListItem>\n <ListItemIcon><CheckCircleIcon color=\"success\" fontSize=\"small\" /></ListItemIcon>\n <ListItemText primary=\"Tag your question appropriately\" />\n </ListItem>\n </List>\n </CardContent>\n </Card>\n </Box>\n );\n \n const renderRightPanel = () => {\n switch (focusedField) {\n case 'title':\n return renderTitleTips();\n case 'body':\n return renderBodyTips();\n case 'tags':\n return renderTagsTips();\n case 'mentions':\n return renderMentionTips();\n default:\n return renderDefaultTips();\n }\n };\n \n const renderQuestionForm = () => (\n <Box sx={{ height: '100%' }}>\n <Box sx={{ mb: 3 }}>\n <Typography variant=\"subtitle1\" fontWeight=\"bold\" gutterBottom>\n Title\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ mb: 1 }}>\n Be specific and imagine you're asking a question to another person.\n </Typography>\n <TextField\n fullWidth\n variant=\"outlined\"\n value={title}\n onChange={e => {\n if (!titleStarted) setTitleStarted(true);\n setTitle(e.target.value);\n validateTitle(e.target.value);\n }}\n onFocus={() => setFocusedField('title')}\n error={titleStarted && !!titleValidation}\n helperText={titleStarted ? titleValidation : ''}\n placeholder=\"e.g., How to handle authentication in React components?\"\n />\n </Box>\n <Box sx={{ mb: 3 }}>\n <Typography variant=\"subtitle1\" fontWeight=\"bold\" gutterBottom>\n What are the details of your problem?\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ mb: 1 }}>\n Introduce the problem and expand on what you put in the title. Use the formatting toolbar to style your text.\n </Typography>\n <TiptapEditor\n content={body}\n onUpdate={handleBodyChange}\n onFocus={handleBodyFocus}\n placeholder=\"Describe your problem in detail. Include any error messages, code snippets, and what you've tried so far...\"\n error={bodyStarted && !!bodyValidation}\n modifierKey={modifierKey}\n />\n {bodyStarted && bodyValidation && (\n <Typography variant=\"caption\" color=\"error\" sx={{ mt: 1, display: 'block' }}>\n {bodyValidation}\n </Typography>\n )}\n </Box>\n <Box sx={{ mb: 3, position: 'relative' }}>\n <Typography variant=\"subtitle1\" fontWeight=\"bold\" gutterBottom>\n Tags\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ mb: 1 }}>\n At least one tag is required.\n </Typography>\n <TextField\n fullWidth\n variant=\"outlined\"\n value={tagInput}\n onChange={e => {\n const value = e.target.value;\n setTagInput(value);\n setShowCreateTagOption(false);\n \n // Search for tags as user types\n const lastTag = value.split(/[\\s,]/).pop()?.trim() || '';\n if (lastTag.length >= 2) {\n searchTags(lastTag);\n } else {\n setTagSearchResults([]);\n }\n \n if (value.includes(',') || value.includes(' ')) {\n handleTagAdd();\n }\n }}\n onFocus={() => setFocusedField('tags')}\n onKeyDown={e => e.key === 'Enter' && handleTagAdd()}\n placeholder=\"e.g., react, javascript, authentication\"\n error={!!tagsValidation}\n />\n {(tagSearchResults.length > 0 || searchingTags || (tagInput.trim() && tagSearchResults.length === 0 && !searchingTags)) && (\n <Paper \n elevation={3} \n sx={{ \n position: 'absolute', \n zIndex: 1000, \n width: '100%', \n maxHeight: 200, \n overflow: 'auto',\n mt: 1\n }}\n >\n {searchingTags && (\n <Box sx={{ p: 2, display: 'flex', alignItems: 'center', gap: 1 }}>\n <CircularProgress size={16} />\n <Typography variant=\"body2\">Searching tags...</Typography>\n </Box>\n )}\n {tagSearchResults.map(tag => (\n <ListItem \n key={tag.name}\n onClick={() => {\n if (!tags.includes(tag.name) && tags.length < 5) {\n setTags([...tags, tag.name]);\n if (!tagsStarted) setTagsStarted(true);\n }\n setTagInput('');\n setTagSearchResults([]);\n }}\n sx={{ \n cursor: 'pointer',\n '&:hover': { backgroundColor: 'action.hover' }\n }}\n >\n <ListItemText \n primary={tag.name}\n secondary={`${tag.postCount} posts`}\n />\n </ListItem>\n ))}\n {tagInput.trim() && showCreateTagOption && (\n <ListItem\n onClick={() => {\n const trimmedTag = tagInput.trim();\n if (trimmedTag && !tags.includes(trimmedTag) && tags.length < 5) {\n setTags([...tags, trimmedTag]);\n if (!tagsStarted) setTagsStarted(true);\n setShowCreateTagOption(false);\n }\n setTagInput('');\n setTagSearchResults([]);\n }}\n sx={{ \n cursor: 'pointer',\n '&:hover': { backgroundColor: 'action.hover' },\n borderTop: tagSearchResults.length > 0 ? '1px solid' : 'none',\n borderColor: 'divider'\n }}\n >\n <ListItemText \n primary={\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <Typography>Create \"{tagInput.trim()}\"</Typography>\n <Chip size=\"small\" label=\"New\" color=\"primary\" variant=\"outlined\" />\n </Box>\n }\n secondary=\"This will create a new tag\"\n />\n </ListItem>\n )}\n </Paper>\n )}\n \n {tags.length > 0 && (\n <Box sx={{ display: 'flex', flexWrap: 'wrap', gap: 1, mt: 1 }}>\n {tags.map((tag, index) => (\n <Chip\n key={index}\n label={tag}\n onDelete={() => setTags(tags.filter(t => t !== tag))}\n size=\"medium\"\n variant=\"outlined\"\n color=\"primary\"\n />\n ))}\n </Box>\n )}\n </Box>\n {/* This is the UI for mentioning users (not yet supported on v3)\n <Box sx={{ mb: 3 }}>\n <Typography variant=\"subtitle1\" fontWeight=\"bold\" gutterBottom>\n Ask Team Members (Optional)\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ mb: 1 }}>\n Mention specific team members or groups who might help with your question.\n </Typography>\n <TextField\n fullWidth\n variant=\"outlined\"\n value={userInput}\n onChange={e => {\n setUserInput(e.target.value);\n if (e.target.value.includes(',') || e.target.value.includes(' ')) {\n handleUserAdd();\n }\n }}\n onFocus={() => setFocusedField('mentions')}\n onKeyDown={e => e.key === 'Enter' && handleUserAdd()}\n placeholder=\"e.g., @john.doe, @frontend-team\"\n />\n \n {mentionedUsers.length > 0 && (\n <Box sx={{ display: 'flex', flexWrap: 'wrap', gap: 1, mt: 1 }}>\n {mentionedUsers.map((user, index) => (\n <Chip\n key={index}\n label={`@${user}`}\n onDelete={() => setMentionedUsers(mentionedUsers.filter(u => u !== user))}\n size=\"medium\"\n variant=\"outlined\"\n color=\"secondary\"\n />\n ))}\n </Box>\n )}\n </Box>\n */}\n {error && (\n <Alert severity=\"error\" sx={{ mb: 2 }}>\n {error}\n </Alert>\n )} \n \n <Box my={3} sx={{ borderTop: 1, borderColor: 'divider', pt: 2, display: 'flex', gap: 2 }}>\n <Button\n variant=\"contained\"\n className={classes.button}\n size=\"large\"\n onClick={handleSubmit}\n disabled={loading || !isAuthenticated}\n sx={{ flex: 2 }}\n >\n {loading ? 'Posting Question...' : 'Post Your Question'}\n </Button>\n <Button onClick={() => setOpen(false)} variant=\"outlined\" size=\"large\" sx={{ flex: 1 }}>\n Cancel\n </Button>\n </Box>\n </Box>\n );\n \n const renderContent = () => {\n if (!isAuthenticated) {\n return (\n <Box sx={{ textAlign: 'center', py: 4 }}>\n <Typography color=\"error\" variant=\"h6\">\n Authentication Required\n </Typography>\n <Typography sx={{ mt: 1, mb: 2 }}>\n Please{' '}\n <Link component=\"button\" onClick={handleLoginRedirect}>\n log in\n </Link>{' '}\n to use this feature.\n </Typography>\n </Box>\n );\n }\n if (success) {\n return (\n <Box sx={{ textAlign: 'center', py: 4, display: 'flex', justifyContent: 'center' }}>\n <Alert severity=\"success\">\n <AlertTitle>Question Posted Successfully!</AlertTitle>\n Your question has been posted and will open in a new tab.\n </Alert>\n </Box>\n );\n }\n return (\n <Grid container spacing={4} sx={{ height: '80vh' }}>\n <Grid item xs={12} md={8}>\n {renderQuestionForm()}\n </Grid>\n <Grid item xs={12} md={4} >\n {renderRightPanel()}\n </Grid>\n </Grid>\n );\n };\n \n return (\n <Modal open={open} onClose={() => setOpen(false)}>\n <Box\n sx={{\n position: 'absolute',\n top: '50%',\n left: '50%',\n transform: 'translate(-50%, -50%)',\n width: success \n ? { xs: 'full' }\n : { xs: '95vw', sm: '90vw', md: '80vw', lg: '80vw', xl: '70vw' },\n maxHeight: '90vh',\n bgcolor: 'background.paper',\n boxShadow: 24,\n borderRadius: 2,\n overflow: 'hidden',\n }}\n >\n <Box sx={{ p: 3, maxHeight: '90vh', overflow: 'auto' }}>\n <Box sx={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', mb: 3 }}>\n <Typography variant=\"h5\" className={classes.title} fontWeight=\"bold\">\n Ask a question on Stack Overflow for Teams\n </Typography>\n <Button onClick={() => setOpen(false)} color=\"inherit\" sx={{ minWidth: 'auto', p: 1 }}>\n ✕\n </Button>\n </Box>\n \n {renderContent()}\n </Box>\n </Box>\n </Modal>\n );\n};"],"names":["fetchPopularTags","validateBody","validateTags"],"mappings":"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"}
|