@stackoverflow/backstage-plugin-stack-overflow-teams 1.6.1 → 1.6.3
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/dist/api/StackOverflowAPI.esm.js +125 -0
- package/dist/api/StackOverflowAPI.esm.js.map +1 -0
- package/dist/components/StackOverflow/StackOverflowMe.esm.js +125 -0
- package/dist/components/StackOverflow/StackOverflowMe.esm.js.map +1 -0
- package/dist/components/StackOverflow/StackOverflowPostQuestionModal.esm.js +803 -0
- package/dist/components/StackOverflow/StackOverflowPostQuestionModal.esm.js.map +1 -0
- package/dist/components/StackOverflow/StackOverflowPosts.esm.js +444 -0
- package/dist/components/StackOverflow/StackOverflowPosts.esm.js.map +1 -0
- package/dist/components/StackOverflow/StackOverflowSearchResultListItem.esm.js +175 -0
- package/dist/components/StackOverflow/StackOverflowSearchResultListItem.esm.js.map +1 -0
- package/dist/components/StackOverflow/StackOverflowTags.esm.js +127 -0
- package/dist/components/StackOverflow/StackOverflowTags.esm.js.map +1 -0
- package/dist/components/StackOverflow/StackOverflowUsers.esm.js +226 -0
- package/dist/components/StackOverflow/StackOverflowUsers.esm.js.map +1 -0
- package/dist/components/StackOverflow/TiptapEditor.esm.js +312 -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 +48 -0
- package/dist/components/StackOverflowAuth/StackAuthCallback.esm.js.map +1 -0
- package/dist/components/StackOverflowAuth/StackAuthFailed.esm.js +38 -0
- package/dist/components/StackOverflowAuth/StackAuthFailed.esm.js.map +1 -0
- package/dist/components/StackOverflowAuth/StackAuthLoading.esm.js +22 -0
- package/dist/components/StackOverflowAuth/StackAuthLoading.esm.js.map +1 -0
- package/dist/components/StackOverflowAuth/StackAuthStart.esm.js +238 -0
- package/dist/components/StackOverflowAuth/StackAuthStart.esm.js.map +1 -0
- package/dist/components/StackOverflowAuth/StackAuthSuccess.esm.js +40 -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 +27 -0
- package/dist/icons/StackOverflowIcon.esm.js.map +1 -0
- package/dist/index.d.ts +47 -0
- package/dist/index.esm.js +19 -0
- package/dist/index.esm.js.map +1 -0
- package/dist/package.json.esm.js +6 -0
- package/dist/package.json.esm.js.map +1 -0
- package/dist/pages/StackOverflowHub.esm.js +138 -0
- package/dist/pages/StackOverflowHub.esm.js.map +1 -0
- package/dist/pages/StackOverflowTeamsPage.esm.js +43 -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 +13 -7
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StackAuthStart.esm.js","sources":["../../../src/components/StackOverflowAuth/StackAuthStart.tsx"],"sourcesContent":["import { useState, useEffect } from 'react';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { stackoverflowteamsApiRef } from '../../api';\nimport Button from '@mui/material/Button';\nimport Typography from '@mui/material/Typography';\nimport Box from '@mui/material/Box';\nimport TextField from '@mui/material/TextField';\nimport Paper from '@mui/material/Paper';\nimport InputAdornment from '@mui/material/InputAdornment';\nimport IconButton from '@mui/material/IconButton';\nimport Snackbar from '@mui/material/Snackbar';\nimport Alert from '@mui/material/Alert';\nimport Link from '@mui/material/Link';\nimport VisibilityIcon from '@mui/icons-material/Visibility';\nimport VisibilityOffIcon from '@mui/icons-material/VisibilityOff';\nimport { useStackOverflowStyles } from '../StackOverflow/hooks';\nimport { StackOverflowIcon } from '../../icons';\n\nexport const StackOverflowAuthStart = () => {\n const stackOverflowTeamsApi = useApi(stackoverflowteamsApiRef);\n const classes = useStackOverflowStyles();\n const [authError, setAuthError] = useState<string | null>(null);\n const [accessToken, setAccessToken] = useState<string>('');\n const [showToken, setShowToken] = useState<boolean>(false);\n const [isSubmitting, setIsSubmitting] = useState<boolean>(false);\n const [tokenSuccess, setTokenSuccess] = useState<boolean>(false);\n const [teamName, setTeamName] = useState<string | null>(null);\n const [isLoading, setIsLoading] = useState<boolean>(true);\n\n useEffect(() => {\n const fetchTeamName = async () => {\n try {\n setIsLoading(true);\n const teamNameValue = await stackOverflowTeamsApi.getTeamName();\n setTeamName(teamNameValue);\n } catch (error) {\n setAuthError('Failed to fetch Stack Overflow Internal instance information.');\n } finally {\n setIsLoading(false);\n }\n };\n\n fetchTeamName();\n }, [stackOverflowTeamsApi]);\n\n // Determine if user is on basic or business plan based on the teamName\n const isBasicOrBusinessPlan = Boolean(teamName)\n\n const handleAuth = async () => {\n try {\n setAuthError(null); // Clear previous errors when retrying\n const authUrl = await stackOverflowTeamsApi.startAuth();\n window.location.href = authUrl;\n } catch (error) {\n setAuthError(\n 'Something went wrong during authentication. Please try again.',\n );\n }\n };\n\n const handleTokenSubmit = async () => {\n if (!accessToken.trim()) {\n setAuthError('Access token cannot be empty');\n return;\n }\n\n setIsSubmitting(true);\n setAuthError(null);\n\n try {\n const success = await stackOverflowTeamsApi.submitAccessToken(\n accessToken,\n );\n\n if (success) {\n setTokenSuccess(true);\n setAccessToken('');\n window.location.reload();\n } else {\n setAuthError(\n 'Failed to validate token. Please check your token and try again.',\n );\n }\n } catch (error) {\n setAuthError('Network error. Please try again.');\n } finally {\n setIsSubmitting(false);\n }\n };\n\n if (isLoading) {\n return (\n <Box\n display=\"flex\"\n flexDirection=\"column\"\n alignItems=\"center\"\n justifyContent=\"center\"\n height=\"100vh\"\n >\n <Typography variant=\"body1\">Loading Stack Overflow Internal configuration...</Typography>\n </Box>\n );\n }\n\n return (\n <Box\n display=\"flex\"\n flexDirection=\"column\"\n alignItems=\"center\"\n justifyContent=\"center\"\n height=\"100vh\"\n bgcolor=\"background.default\"\n >\n <Paper\n elevation={3}\n sx={{\n padding: 4,\n width: '100%',\n maxWidth: '500px',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n }}\n >\n <StackOverflowIcon />\n <Typography variant=\"h5\" gutterBottom>\n Stack Internal\n </Typography>\n\n {/* Standard OAuth login - only displayed if NOT on basic/business plan */}\n {!isBasicOrBusinessPlan && (\n <Box width=\"100%\" mb={3}>\n <Typography\n variant=\"body1\"\n color=\"textSecondary\"\n align=\"center\"\n gutterBottom\n >\n Connect with your Stack Internal Enterprise account\n </Typography>\n\n <Box mt={2} display=\"flex\" justifyContent=\"center\">\n <Button\n variant=\"contained\"\n className={classes.button}\n onClick={handleAuth}\n disabled={isSubmitting}\n fullWidth\n >\n Login with Stack Overflow Internal\n </Button>\n </Box>\n </Box>\n )}\n\n {/* Manual PAT token input for basic/business plans */}\n {isBasicOrBusinessPlan && (\n <Box width=\"100%\">\n <Typography\n variant=\"body1\"\n color=\"textSecondary\"\n align=\"center\"\n gutterBottom\n >\n Enter your Personal Access Token (PAT)\n </Typography>\n\n <Typography\n variant=\"body2\"\n color=\"textSecondary\"\n align=\"center\"\n gutterBottom\n >\n <Link\n href=\"https://stackoverflowteams.help/en/articles/10908790-personal-access-tokens-pats-for-api-authentication\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n color=\"primary\"\n >\n Learn how to generate a Personal Access Token\n </Link>\n </Typography>\n\n <TextField\n fullWidth\n label=\"Personal Access Token\"\n variant=\"outlined\"\n margin=\"normal\"\n value={accessToken}\n onChange={e => setAccessToken(e.target.value)}\n type={showToken ? 'text' : 'password'}\n disabled={isSubmitting}\n InputProps={{\n endAdornment: (\n <InputAdornment position=\"end\">\n <IconButton\n aria-label=\"toggle token visibility\"\n onClick={() => setShowToken(!showToken)}\n edge=\"end\"\n >\n {showToken ? <VisibilityOffIcon /> : <VisibilityIcon />}\n </IconButton>\n </InputAdornment>\n ),\n }}\n />\n\n <Box mt={2}>\n <Button\n variant=\"contained\"\n color=\"primary\"\n fullWidth\n onClick={handleTokenSubmit}\n disabled={isSubmitting || !accessToken.trim()}\n className={classes.button}\n >\n {isSubmitting ? 'Validating...' : 'Submit Token'}\n </Button>\n </Box>\n </Box>\n )}\n {authError && (\n <Typography\n variant=\"body2\"\n color=\"error\"\n sx={{ maxWidth: '100%', textAlign: 'center', mt: 2 }}\n >\n {authError}\n </Typography>\n )}\n </Paper>\n\n <Snackbar\n open={tokenSuccess}\n autoHideDuration={6000}\n onClose={() => setTokenSuccess(false)}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'center' }}\n >\n <Alert severity=\"success\" variant=\"filled\">\n Stack Overflow Internal token accepted successfully!\n </Alert>\n </Snackbar>\n </Box>\n );\n};"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;AAkBO,MAAM,yBAAyB,MAAM;AAC1C,EAAA,MAAM,qBAAA,GAAwB,OAAO,wBAAwB,CAAA;AAC7D,EAAA,MAAM,UAAU,sBAAA,EAAuB;AACvC,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAAwB,IAAI,CAAA;AAC9D,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAAiB,EAAE,CAAA;AACzD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAAkB,KAAK,CAAA;AACzD,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,SAAkB,KAAK,CAAA;AAC/D,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,SAAkB,KAAK,CAAA;AAC/D,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,SAAwB,IAAI,CAAA;AAC5D,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAAkB,IAAI,CAAA;AAExD,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,gBAAgB,YAAY;AAChC,MAAA,IAAI;AACF,QAAA,YAAA,CAAa,IAAI,CAAA;AACjB,QAAA,MAAM,aAAA,GAAgB,MAAM,qBAAA,CAAsB,WAAA,EAAY;AAC9D,QAAA,WAAA,CAAY,aAAa,CAAA;AAAA,MAC3B,SAAS,KAAA,EAAO;AACd,QAAA,YAAA,CAAa,+DAA+D,CAAA;AAAA,MAC9E,CAAA,SAAE;AACA,QAAA,YAAA,CAAa,KAAK,CAAA;AAAA,MACpB;AAAA,IACF,CAAA;AAEA,IAAA,aAAA,EAAc;AAAA,EAChB,CAAA,EAAG,CAAC,qBAAqB,CAAC,CAAA;AAG1B,EAAA,MAAM,qBAAA,GAAwB,QAAQ,QAAQ,CAAA;AAE9C,EAAA,MAAM,aAAa,YAAY;AAC7B,IAAA,IAAI;AACF,MAAA,YAAA,CAAa,IAAI,CAAA;AACjB,MAAA,MAAM,OAAA,GAAU,MAAM,qBAAA,CAAsB,SAAA,EAAU;AACtD,MAAA,MAAA,CAAO,SAAS,IAAA,GAAO,OAAA;AAAA,IACzB,SAAS,KAAA,EAAO;AACd,MAAA,YAAA;AAAA,QACE;AAAA,OACF;AAAA,IACF;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,oBAAoB,YAAY;AACpC,IAAA,IAAI,CAAC,WAAA,CAAY,IAAA,EAAK,EAAG;AACvB,MAAA,YAAA,CAAa,8BAA8B,CAAA;AAC3C,MAAA;AAAA,IACF;AAEA,IAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,IAAA,YAAA,CAAa,IAAI,CAAA;AAEjB,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,MAAM,qBAAA,CAAsB,iBAAA;AAAA,QAC1C;AAAA,OACF;AAEA,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,QAAA,cAAA,CAAe,EAAE,CAAA;AACjB,QAAA,MAAA,CAAO,SAAS,MAAA,EAAO;AAAA,MACzB,CAAA,MAAO;AACL,QAAA,YAAA;AAAA,UACE;AAAA,SACF;AAAA,MACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,YAAA,CAAa,kCAAkC,CAAA;AAAA,IACjD,CAAA,SAAE;AACA,MAAA,eAAA,CAAgB,KAAK,CAAA;AAAA,IACvB;AAAA,EACF,CAAA;AAEA,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,uBACE,GAAA;AAAA,MAAC,GAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAQ,MAAA;AAAA,QACR,aAAA,EAAc,QAAA;AAAA,QACd,UAAA,EAAW,QAAA;AAAA,QACX,cAAA,EAAe,QAAA;AAAA,QACf,MAAA,EAAO,OAAA;AAAA,QAEP,QAAA,kBAAA,GAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,OAAA,EAAQ,QAAA,EAAA,kDAAA,EAAgD;AAAA;AAAA,KAC9E;AAAA,EAEJ;AAEA,EAAA,uBACE,IAAA;AAAA,IAAC,GAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAQ,MAAA;AAAA,MACR,aAAA,EAAc,QAAA;AAAA,MACd,UAAA,EAAW,QAAA;AAAA,MACX,cAAA,EAAe,QAAA;AAAA,MACf,MAAA,EAAO,OAAA;AAAA,MACP,OAAA,EAAQ,oBAAA;AAAA,MAER,QAAA,EAAA;AAAA,wBAAA,IAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,CAAA;AAAA,YACX,EAAA,EAAI;AAAA,cACF,OAAA,EAAS,CAAA;AAAA,cACT,KAAA,EAAO,MAAA;AAAA,cACP,QAAA,EAAU,OAAA;AAAA,cACV,OAAA,EAAS,MAAA;AAAA,cACT,aAAA,EAAe,QAAA;AAAA,cACf,UAAA,EAAY;AAAA,aACd;AAAA,YAEA,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,iBAAA,EAAA,EAAkB,CAAA;AAAA,kCAClB,UAAA,EAAA,EAAW,OAAA,EAAQ,IAAA,EAAK,YAAA,EAAY,MAAC,QAAA,EAAA,gBAAA,EAEtC,CAAA;AAAA,cAGC,CAAC,qBAAA,oBACA,IAAA,CAAC,OAAI,KAAA,EAAM,MAAA,EAAO,IAAI,CAAA,EACpB,QAAA,EAAA;AAAA,gCAAA,GAAA;AAAA,kBAAC,UAAA;AAAA,kBAAA;AAAA,oBACC,OAAA,EAAQ,OAAA;AAAA,oBACR,KAAA,EAAM,eAAA;AAAA,oBACN,KAAA,EAAM,QAAA;AAAA,oBACN,YAAA,EAAY,IAAA;AAAA,oBACb,QAAA,EAAA;AAAA;AAAA,iBAED;AAAA,oCAEC,GAAA,EAAA,EAAI,EAAA,EAAI,GAAG,OAAA,EAAQ,MAAA,EAAO,gBAAe,QAAA,EACxC,QAAA,kBAAA,GAAA;AAAA,kBAAC,MAAA;AAAA,kBAAA;AAAA,oBACC,OAAA,EAAQ,WAAA;AAAA,oBACR,WAAW,OAAA,CAAQ,MAAA;AAAA,oBACnB,OAAA,EAAS,UAAA;AAAA,oBACT,QAAA,EAAU,YAAA;AAAA,oBACV,SAAA,EAAS,IAAA;AAAA,oBACV,QAAA,EAAA;AAAA;AAAA,iBAED,EACF;AAAA,eAAA,EACF,CAAA;AAAA,cAID,qBAAA,oBACC,IAAA,CAAC,GAAA,EAAA,EAAI,KAAA,EAAM,MAAA,EACT,QAAA,EAAA;AAAA,gCAAA,GAAA;AAAA,kBAAC,UAAA;AAAA,kBAAA;AAAA,oBACC,OAAA,EAAQ,OAAA;AAAA,oBACR,KAAA,EAAM,eAAA;AAAA,oBACN,KAAA,EAAM,QAAA;AAAA,oBACN,YAAA,EAAY,IAAA;AAAA,oBACb,QAAA,EAAA;AAAA;AAAA,iBAED;AAAA,gCAEA,GAAA;AAAA,kBAAC,UAAA;AAAA,kBAAA;AAAA,oBACC,OAAA,EAAQ,OAAA;AAAA,oBACR,KAAA,EAAM,eAAA;AAAA,oBACN,KAAA,EAAM,QAAA;AAAA,oBACN,YAAA,EAAY,IAAA;AAAA,oBAEZ,QAAA,kBAAA,GAAA;AAAA,sBAAC,IAAA;AAAA,sBAAA;AAAA,wBACC,IAAA,EAAK,yGAAA;AAAA,wBACL,MAAA,EAAO,QAAA;AAAA,wBACP,GAAA,EAAI,qBAAA;AAAA,wBACJ,KAAA,EAAM,SAAA;AAAA,wBACP,QAAA,EAAA;AAAA;AAAA;AAED;AAAA,iBACF;AAAA,gCAEA,GAAA;AAAA,kBAAC,SAAA;AAAA,kBAAA;AAAA,oBACC,SAAA,EAAS,IAAA;AAAA,oBACT,KAAA,EAAM,uBAAA;AAAA,oBACN,OAAA,EAAQ,UAAA;AAAA,oBACR,MAAA,EAAO,QAAA;AAAA,oBACP,KAAA,EAAO,WAAA;AAAA,oBACP,QAAA,EAAU,CAAA,CAAA,KAAK,cAAA,CAAe,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,oBAC5C,IAAA,EAAM,YAAY,MAAA,GAAS,UAAA;AAAA,oBAC3B,QAAA,EAAU,YAAA;AAAA,oBACV,UAAA,EAAY;AAAA,sBACV,YAAA,kBACE,GAAA,CAAC,cAAA,EAAA,EAAe,QAAA,EAAS,KAAA,EACvB,QAAA,kBAAA,GAAA;AAAA,wBAAC,UAAA;AAAA,wBAAA;AAAA,0BACC,YAAA,EAAW,yBAAA;AAAA,0BACX,OAAA,EAAS,MAAM,YAAA,CAAa,CAAC,SAAS,CAAA;AAAA,0BACtC,IAAA,EAAK,KAAA;AAAA,0BAEJ,QAAA,EAAA,SAAA,mBAAY,GAAA,CAAC,iBAAA,EAAA,EAAkB,CAAA,uBAAM,cAAA,EAAA,EAAe;AAAA;AAAA,uBACvD,EACF;AAAA;AAEJ;AAAA,iBACF;AAAA,gCAEA,GAAA,CAAC,GAAA,EAAA,EAAI,EAAA,EAAI,CAAA,EACP,QAAA,kBAAA,GAAA;AAAA,kBAAC,MAAA;AAAA,kBAAA;AAAA,oBACC,OAAA,EAAQ,WAAA;AAAA,oBACR,KAAA,EAAM,SAAA;AAAA,oBACN,SAAA,EAAS,IAAA;AAAA,oBACT,OAAA,EAAS,iBAAA;AAAA,oBACT,QAAA,EAAU,YAAA,IAAgB,CAAC,WAAA,CAAY,IAAA,EAAK;AAAA,oBAC5C,WAAW,OAAA,CAAQ,MAAA;AAAA,oBAElB,yBAAe,eAAA,GAAkB;AAAA;AAAA,iBACpC,EACF;AAAA,eAAA,EACF,CAAA;AAAA,cAED,SAAA,oBACC,GAAA;AAAA,gBAAC,UAAA;AAAA,gBAAA;AAAA,kBACC,OAAA,EAAQ,OAAA;AAAA,kBACR,KAAA,EAAM,OAAA;AAAA,kBACN,IAAI,EAAE,QAAA,EAAU,QAAQ,SAAA,EAAW,QAAA,EAAU,IAAI,CAAA,EAAE;AAAA,kBAElD,QAAA,EAAA;AAAA;AAAA;AACH;AAAA;AAAA,SAEJ;AAAA,wBAEA,GAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAM,YAAA;AAAA,YACN,gBAAA,EAAkB,GAAA;AAAA,YAClB,OAAA,EAAS,MAAM,eAAA,CAAgB,KAAK,CAAA;AAAA,YACpC,YAAA,EAAc,EAAE,QAAA,EAAU,QAAA,EAAU,YAAY,QAAA,EAAS;AAAA,YAEzD,8BAAC,KAAA,EAAA,EAAM,QAAA,EAAS,SAAA,EAAU,OAAA,EAAQ,UAAS,QAAA,EAAA,sDAAA,EAE3C;AAAA;AAAA;AACF;AAAA;AAAA,GACF;AAEJ;;;;"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { Box, Typography, Button } from '@mui/material';
|
|
3
|
+
import { StackOverflowIcon } from '../../icons/StackOverflowIcon.esm.js';
|
|
4
|
+
import 'react';
|
|
5
|
+
import '@backstage/core-plugin-api';
|
|
6
|
+
import '../../api/StackOverflowAPI.esm.js';
|
|
7
|
+
import { useStackOverflowStyles } from '../StackOverflow/hooks/useStackOverflowStyles.esm.js';
|
|
8
|
+
import { useNavigate } from 'react-router-dom';
|
|
9
|
+
|
|
10
|
+
const StackAuthSuccess = () => {
|
|
11
|
+
const classes = useStackOverflowStyles();
|
|
12
|
+
const navigate = useNavigate();
|
|
13
|
+
return /* @__PURE__ */ jsxs(
|
|
14
|
+
Box,
|
|
15
|
+
{
|
|
16
|
+
display: "flex",
|
|
17
|
+
flexDirection: "column",
|
|
18
|
+
alignItems: "center",
|
|
19
|
+
justifyContent: "center",
|
|
20
|
+
height: "100vh",
|
|
21
|
+
children: [
|
|
22
|
+
/* @__PURE__ */ jsx(StackOverflowIcon, {}),
|
|
23
|
+
/* @__PURE__ */ jsx(Box, { mt: 2, children: /* @__PURE__ */ jsx(Typography, { variant: "h5", children: "You have successfully logged in with Stack Overflow Internal!" }) }),
|
|
24
|
+
/* @__PURE__ */ jsx(Box, { mt: 1, children: /* @__PURE__ */ jsx(Typography, { variant: "body1", children: "You can now access all Stack Overflow Internal features from Backstage" }) }),
|
|
25
|
+
/* @__PURE__ */ jsx(Box, { mt: 2, children: /* @__PURE__ */ jsx(
|
|
26
|
+
Button,
|
|
27
|
+
{
|
|
28
|
+
variant: "contained",
|
|
29
|
+
className: classes.button,
|
|
30
|
+
onClick: () => navigate("/stack-overflow-teams"),
|
|
31
|
+
children: "Return to Stack Internal"
|
|
32
|
+
}
|
|
33
|
+
) })
|
|
34
|
+
]
|
|
35
|
+
}
|
|
36
|
+
);
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
export { StackAuthSuccess };
|
|
40
|
+
//# sourceMappingURL=StackAuthSuccess.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StackAuthSuccess.esm.js","sources":["../../../src/components/StackOverflowAuth/StackAuthSuccess.tsx"],"sourcesContent":["// eslint-disable-next-line no-restricted-imports\nimport { Box, Button, Typography } from '@mui/material';\nimport { StackOverflowIcon } from '../../icons';\nimport { useStackOverflowStyles } from '../StackOverflow/hooks';\nimport { useNavigate } from 'react-router-dom'\n\nexport const StackAuthSuccess = () => {\n const classes = useStackOverflowStyles();\n const navigate = useNavigate();\n return (\n <Box\n display=\"flex\"\n flexDirection=\"column\"\n alignItems=\"center\"\n justifyContent=\"center\"\n height=\"100vh\"\n >\n <StackOverflowIcon />\n <Box mt={2}>\n <Typography variant=\"h5\" >\n You have successfully logged in with Stack Overflow Internal!\n </Typography>\n </Box>\n <Box mt={1}>\n <Typography variant=\"body1\" >\n You can now access all Stack Overflow Internal features from Backstage\n </Typography>\n </Box>\n <Box mt={2}>\n <Button\n variant=\"contained\"\n className={classes.button}\n onClick={() => navigate('/stack-overflow-teams')}\n >\n Return to Stack Internal\n </Button>\n </Box>\n </Box>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;AAMO,MAAM,mBAAmB,MAAM;AACpC,EAAA,MAAM,UAAU,sBAAA,EAAuB;AACvC,EAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,EAAA,uBACE,IAAA;AAAA,IAAC,GAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAQ,MAAA;AAAA,MACR,aAAA,EAAc,QAAA;AAAA,MACd,UAAA,EAAW,QAAA;AAAA,MACX,cAAA,EAAe,QAAA;AAAA,MACf,MAAA,EAAO,OAAA;AAAA,MAEP,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,iBAAA,EAAA,EAAkB,CAAA;AAAA,wBACnB,GAAA,CAAC,OAAI,EAAA,EAAI,CAAA,EACT,8BAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,IAAA,EAAM,QAAA,EAAA,+DAAA,EAE1B,CAAA,EACA,CAAA;AAAA,wBACA,GAAA,CAAC,OAAI,EAAA,EAAI,CAAA,EACT,8BAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,OAAA,EAAS,QAAA,EAAA,wEAAA,EAE7B,CAAA,EACA,CAAA;AAAA,wBACA,GAAA,CAAC,GAAA,EAAA,EAAI,EAAA,EAAI,CAAA,EACT,QAAA,kBAAA,GAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAQ,WAAA;AAAA,YACR,WAAW,OAAA,CAAQ,MAAA;AAAA,YACnB,OAAA,EAAS,MAAM,QAAA,CAAS,uBAAuB,CAAA;AAAA,YAChD,QAAA,EAAA;AAAA;AAAA,SAED,EACA;AAAA;AAAA;AAAA,GACF;AAEJ;;;;"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
2
|
+
|
|
3
|
+
const LogoutIcon = () => {
|
|
4
|
+
return /* @__PURE__ */ jsx(
|
|
5
|
+
"svg",
|
|
6
|
+
{
|
|
7
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
8
|
+
width: "25",
|
|
9
|
+
height: "25",
|
|
10
|
+
fill: "none",
|
|
11
|
+
viewBox: "0 0 512 512",
|
|
12
|
+
children: /* @__PURE__ */ jsx(
|
|
13
|
+
"path",
|
|
14
|
+
{
|
|
15
|
+
fill: "#ff8d19",
|
|
16
|
+
d: "M377.9 105.9L500.7 228.7c7.2 7.2 11.3 17.1 11.3 27.3s-4.1 20.1-11.3 27.3L377.9 406.1c-6.4 6.4-15 9.9-24 9.9c-18.7 0-33.9-15.2-33.9-33.9l0-62.1-128 0c-17.7 0-32-14.3-32-32l0-64c0-17.7 14.3-32 32-32l128 0 0-62.1c0-18.7 15.2-33.9 33.9-33.9c9 0 17.6 3.6 24 9.9zM160 96L96 96c-17.7 0-32 14.3-32 32l0 256c0 17.7 14.3 32 32 32l64 0c17.7 0 32 14.3 32 32s-14.3 32-32 32l-64 0c-53 0-96-43-96-96L0 128C0 75 43 32 96 32l64 0c17.7 0 32 14.3 32 32s-14.3 32-32 32z"
|
|
17
|
+
}
|
|
18
|
+
)
|
|
19
|
+
}
|
|
20
|
+
);
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
export { LogoutIcon };
|
|
24
|
+
//# sourceMappingURL=LogoutIcon.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LogoutIcon.esm.js","sources":["../../src/icons/LogoutIcon.tsx"],"sourcesContent":["export const LogoutIcon = () => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"25\"\n height=\"25\"\n fill=\"none\"\n viewBox=\"0 0 512 512\"\n >\n <path\n fill=\"#ff8d19\"\n d=\"M377.9 105.9L500.7 228.7c7.2 7.2 11.3 17.1 11.3 27.3s-4.1 20.1-11.3 27.3L377.9 406.1c-6.4 6.4-15 9.9-24 9.9c-18.7 0-33.9-15.2-33.9-33.9l0-62.1-128 0c-17.7 0-32-14.3-32-32l0-64c0-17.7 14.3-32 32-32l128 0 0-62.1c0-18.7 15.2-33.9 33.9-33.9c9 0 17.6 3.6 24 9.9zM160 96L96 96c-17.7 0-32 14.3-32 32l0 256c0 17.7 14.3 32 32 32l64 0c17.7 0 32 14.3 32 32s-14.3 32-32 32l-64 0c-53 0-96-43-96-96L0 128C0 75 43 32 96 32l64 0c17.7 0 32 14.3 32 32s-14.3 32-32 32z\"\n />\n </svg>\n );\n};\n"],"names":[],"mappings":";;AAAO,MAAM,aAAa,MAAM;AAC9B,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAM,4BAAA;AAAA,MACN,KAAA,EAAM,IAAA;AAAA,MACN,MAAA,EAAO,IAAA;AAAA,MACP,IAAA,EAAK,MAAA;AAAA,MACL,OAAA,EAAQ,aAAA;AAAA,MAER,QAAA,kBAAA,GAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,SAAA;AAAA,UACL,CAAA,EAAE;AAAA;AAAA;AACJ;AAAA,GACF;AAEJ;;;;"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
+
|
|
3
|
+
const StackOverflowIcon = () => {
|
|
4
|
+
return /* @__PURE__ */ jsxs(
|
|
5
|
+
"svg",
|
|
6
|
+
{
|
|
7
|
+
viewBox: "0 0 125 125",
|
|
8
|
+
width: "25",
|
|
9
|
+
height: "25",
|
|
10
|
+
fill: "none",
|
|
11
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
12
|
+
children: [
|
|
13
|
+
/* @__PURE__ */ jsx("path", { d: "M84.021 75.825v31H11v-31H0v42h95v-42H84.021z", fill: "#BCBBBB" }),
|
|
14
|
+
/* @__PURE__ */ jsx(
|
|
15
|
+
"path",
|
|
16
|
+
{
|
|
17
|
+
d: "M21.057 96.825H74v-10H21.057v10zm1.058-23.915l51.428 10.794 2.117-10.265L24.23 62.645 22.115 72.91zm6.773-24.656l47.618 22.222 4.445-9.524L33.33 38.73l-4.444 9.524zm13.227-23.386l40.423 33.65 6.773-8.042-40.53-33.65-6.666 8.042zM68.147 0L59.68 6.243l31.323 42.222 8.465-6.243L68.147 0z",
|
|
18
|
+
fill: "#F48024"
|
|
19
|
+
}
|
|
20
|
+
)
|
|
21
|
+
]
|
|
22
|
+
}
|
|
23
|
+
);
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
export { StackOverflowIcon };
|
|
27
|
+
//# sourceMappingURL=StackOverflowIcon.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StackOverflowIcon.esm.js","sources":["../../src/icons/StackOverflowIcon.tsx"],"sourcesContent":["/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * Stack Overflow Internal Icon\n * @public\n */\nexport const StackOverflowIcon = () => {\n return (\n <svg\n viewBox=\"0 0 125 125\"\n width=\"25\"\n height=\"25\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M84.021 75.825v31H11v-31H0v42h95v-42H84.021z\" fill=\"#BCBBBB\" />\n <path\n d=\"M21.057 96.825H74v-10H21.057v10zm1.058-23.915l51.428 10.794 2.117-10.265L24.23 62.645 22.115 72.91zm6.773-24.656l47.618 22.222 4.445-9.524L33.33 38.73l-4.444 9.524zm13.227-23.386l40.423 33.65 6.773-8.042-40.53-33.65-6.666 8.042zM68.147 0L59.68 6.243l31.323 42.222 8.465-6.243L68.147 0z\"\n fill=\"#F48024\"\n />\n </svg>\n );\n};\n"],"names":[],"mappings":";;AAoBO,MAAM,oBAAoB,MAAM;AACrC,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAQ,aAAA;AAAA,MACR,KAAA,EAAM,IAAA;AAAA,MACN,MAAA,EAAO,IAAA;AAAA,MACP,IAAA,EAAK,MAAA;AAAA,MACL,KAAA,EAAM,4BAAA;AAAA,MAEN,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,8CAAA,EAA+C,IAAA,EAAK,SAAA,EAAU,CAAA;AAAA,wBACtE,GAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,CAAA,EAAE,+RAAA;AAAA,YACF,IAAA,EAAK;AAAA;AAAA;AACP;AAAA;AAAA,GACF;AAEJ;;;;"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import * as _backstage_core_plugin_api from '@backstage/core-plugin-api';
|
|
3
|
+
import { ResultHighlight } from '@backstage/plugin-search-common';
|
|
4
|
+
|
|
5
|
+
declare const stackOverflowTeamsPlugin: _backstage_core_plugin_api.BackstagePlugin<{
|
|
6
|
+
root: _backstage_core_plugin_api.RouteRef<undefined>;
|
|
7
|
+
}, {}, {}>;
|
|
8
|
+
declare const StackOverflowTeamsPage: () => react_jsx_runtime.JSX.Element;
|
|
9
|
+
|
|
10
|
+
declare const StackOverflowQuestions: () => react_jsx_runtime.JSX.Element;
|
|
11
|
+
|
|
12
|
+
declare const StackOverflowTags: () => react_jsx_runtime.JSX.Element;
|
|
13
|
+
|
|
14
|
+
declare const StackOverflowUsers: () => react_jsx_runtime.JSX.Element;
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Props for {@link StackOverflowSearchResultListItem}
|
|
18
|
+
*
|
|
19
|
+
* @public
|
|
20
|
+
*/
|
|
21
|
+
type StackOverflowSearchResultListItemProps = {
|
|
22
|
+
result?: any;
|
|
23
|
+
icon?: React.ReactNode;
|
|
24
|
+
rank?: number;
|
|
25
|
+
highlight?: ResultHighlight;
|
|
26
|
+
};
|
|
27
|
+
declare const StackOverflowSearchResultListItem: (props: StackOverflowSearchResultListItemProps) => react_jsx_runtime.JSX.Element | null;
|
|
28
|
+
|
|
29
|
+
declare const StackOverflowPostQuestionModal: () => react_jsx_runtime.JSX.Element;
|
|
30
|
+
|
|
31
|
+
declare const StackOverflowMe: () => react_jsx_runtime.JSX.Element | null;
|
|
32
|
+
|
|
33
|
+
declare const StackOverflowCallback: () => react_jsx_runtime.JSX.Element;
|
|
34
|
+
|
|
35
|
+
declare const StackOverflowAuthStart: () => react_jsx_runtime.JSX.Element;
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Stack Overflow Internal Icon
|
|
39
|
+
* @public
|
|
40
|
+
*/
|
|
41
|
+
declare const StackOverflowIcon: () => react_jsx_runtime.JSX.Element;
|
|
42
|
+
|
|
43
|
+
declare const LogoutIcon: () => react_jsx_runtime.JSX.Element;
|
|
44
|
+
|
|
45
|
+
declare const StackOverflowHub: () => react_jsx_runtime.JSX.Element;
|
|
46
|
+
|
|
47
|
+
export { LogoutIcon, StackOverflowAuthStart, StackOverflowCallback, StackOverflowHub, StackOverflowIcon, StackOverflowMe, StackOverflowPostQuestionModal, StackOverflowQuestions, StackOverflowSearchResultListItem, StackOverflowTags, StackOverflowTeamsPage, StackOverflowUsers, stackOverflowTeamsPlugin };
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export { StackOverflowTeamsPage, stackOverflowTeamsPlugin } from './plugin.esm.js';
|
|
2
|
+
export { StackOverflowQuestions } from './components/StackOverflow/StackOverflowPosts.esm.js';
|
|
3
|
+
export { StackOverflowTags } from './components/StackOverflow/StackOverflowTags.esm.js';
|
|
4
|
+
export { StackOverflowUsers } from './components/StackOverflow/StackOverflowUsers.esm.js';
|
|
5
|
+
export { StackOverflowSearchResultListItem } from './components/StackOverflow/StackOverflowSearchResultListItem.esm.js';
|
|
6
|
+
export { StackOverflowPostQuestionModal } from './components/StackOverflow/StackOverflowPostQuestionModal.esm.js';
|
|
7
|
+
export { StackOverflowMe } from './components/StackOverflow/StackOverflowMe.esm.js';
|
|
8
|
+
export { StackOverflowCallback } from './components/StackOverflowAuth/StackAuthCallback.esm.js';
|
|
9
|
+
export { StackOverflowAuthStart } from './components/StackOverflowAuth/StackAuthStart.esm.js';
|
|
10
|
+
export { StackOverflowIcon } from './icons/StackOverflowIcon.esm.js';
|
|
11
|
+
export { LogoutIcon } from './icons/LogoutIcon.esm.js';
|
|
12
|
+
export { StackOverflowHub } from './pages/StackOverflowHub.esm.js';
|
|
13
|
+
import 'react/jsx-runtime';
|
|
14
|
+
import 'react';
|
|
15
|
+
import '@backstage/core-plugin-api';
|
|
16
|
+
import './api/StackOverflowAPI.esm.js';
|
|
17
|
+
import 'react-router-dom';
|
|
18
|
+
import '@mui/material';
|
|
19
|
+
//# sourceMappingURL=index.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package.json.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { useState, useEffect } from 'react';
|
|
3
|
+
import packageJson from '../package.json.esm.js';
|
|
4
|
+
import { Grid, Paper, Box, Typography, Tooltip } from '@material-ui/core';
|
|
5
|
+
import Help from '@material-ui/icons/Help';
|
|
6
|
+
import QuestionAnswer from '@material-ui/icons/QuestionAnswer';
|
|
7
|
+
import PersonIcon from '@material-ui/icons/Person';
|
|
8
|
+
import LocalOffer from '@material-ui/icons/LocalOffer';
|
|
9
|
+
import People from '@material-ui/icons/People';
|
|
10
|
+
import { Page, Header, HeaderLabel, Content, ContentHeader } from '@backstage/core-components';
|
|
11
|
+
import { useApi } from '@backstage/core-plugin-api';
|
|
12
|
+
import { stackoverflowteamsApiRef } from '../api/StackOverflowAPI.esm.js';
|
|
13
|
+
import { StackOverflowQuestions } from '../components/StackOverflow/StackOverflowPosts.esm.js';
|
|
14
|
+
import { StackOverflowTags } from '../components/StackOverflow/StackOverflowTags.esm.js';
|
|
15
|
+
import { StackOverflowUsers } from '../components/StackOverflow/StackOverflowUsers.esm.js';
|
|
16
|
+
import '@material-ui/core/Divider';
|
|
17
|
+
import '@material-ui/core/ListItem';
|
|
18
|
+
import '@material-ui/core/ListItemText';
|
|
19
|
+
import '@material-ui/core/ListItemIcon';
|
|
20
|
+
import '@material-ui/core/Box';
|
|
21
|
+
import '@material-ui/core/Chip';
|
|
22
|
+
import '@backstage/plugin-search-react';
|
|
23
|
+
import '@mui/material/Chip';
|
|
24
|
+
import '@mui/material/Modal';
|
|
25
|
+
import '@mui/material/Box';
|
|
26
|
+
import '@mui/material/TextField';
|
|
27
|
+
import '@mui/material/Button';
|
|
28
|
+
import '@mui/material/Typography';
|
|
29
|
+
import '@mui/material/Link';
|
|
30
|
+
import '@mui/material/Paper';
|
|
31
|
+
import '@mui/material/Alert';
|
|
32
|
+
import '@mui/material/AlertTitle';
|
|
33
|
+
import '@mui/material/List';
|
|
34
|
+
import '@mui/material/ListItem';
|
|
35
|
+
import '@mui/material/ListItemIcon';
|
|
36
|
+
import '@mui/material/ListItemText';
|
|
37
|
+
import '@mui/material/Grid';
|
|
38
|
+
import '@mui/material/Card';
|
|
39
|
+
import '@mui/material/CardContent';
|
|
40
|
+
import '@mui/icons-material/CheckCircle';
|
|
41
|
+
import '@mui/icons-material/Info';
|
|
42
|
+
import '@mui/icons-material/Lightbulb';
|
|
43
|
+
import '@mui/icons-material/Code';
|
|
44
|
+
import '@mui/icons-material/Title';
|
|
45
|
+
import '@mui/icons-material/Description';
|
|
46
|
+
import '@mui/icons-material/LocalOffer';
|
|
47
|
+
import '@mui/icons-material/Group';
|
|
48
|
+
import '@mui/icons-material/Person';
|
|
49
|
+
import '@mui/icons-material/Close';
|
|
50
|
+
import '@mui/material/IconButton';
|
|
51
|
+
import '../components/StackOverflow/hooks/useStackOverflowStyles.esm.js';
|
|
52
|
+
import '@tiptap/react';
|
|
53
|
+
import '@tiptap/starter-kit';
|
|
54
|
+
import '@tiptap/extensions';
|
|
55
|
+
import '@mui/material/Toolbar';
|
|
56
|
+
import '@mui/material/Divider';
|
|
57
|
+
import '@mui/material/styles';
|
|
58
|
+
import '@mui/icons-material';
|
|
59
|
+
import '@mui/material/CircularProgress';
|
|
60
|
+
import { StackOverflowMe } from '../components/StackOverflow/StackOverflowMe.esm.js';
|
|
61
|
+
|
|
62
|
+
const StackOverflowHub = () => {
|
|
63
|
+
const api = useApi(stackoverflowteamsApiRef);
|
|
64
|
+
const [teamName, setTeamName] = useState("");
|
|
65
|
+
const [baseUrl, setBaseUrl] = useState("");
|
|
66
|
+
useEffect(() => {
|
|
67
|
+
const fetchHeaderData = async () => {
|
|
68
|
+
try {
|
|
69
|
+
const [teamNameResult, baseUrlResult] = await Promise.all([
|
|
70
|
+
api.getTeamName(),
|
|
71
|
+
api.getBaseUrl()
|
|
72
|
+
]);
|
|
73
|
+
setTeamName(teamNameResult);
|
|
74
|
+
setBaseUrl(baseUrlResult);
|
|
75
|
+
} catch (error) {
|
|
76
|
+
setBaseUrl("Error retrieving BaseUrl/Team");
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
fetchHeaderData();
|
|
80
|
+
}, [api]);
|
|
81
|
+
const instanceValue = teamName || baseUrl || "Loading...";
|
|
82
|
+
return /* @__PURE__ */ jsxs(Page, { themeId: "plugin", children: [
|
|
83
|
+
/* @__PURE__ */ jsxs(Header, { title: "Welcome to Stack Internal!", subtitle: "Your team's collective knowledge at your fingertips.", children: [
|
|
84
|
+
/* @__PURE__ */ jsx(HeaderLabel, { label: "Connected to", value: instanceValue }),
|
|
85
|
+
/* @__PURE__ */ jsx(HeaderLabel, { label: "Plugin Version", value: `v${packageJson.version}` })
|
|
86
|
+
] }),
|
|
87
|
+
/* @__PURE__ */ jsxs(Content, { children: [
|
|
88
|
+
/* @__PURE__ */ jsx(ContentHeader, { title: "Stack Internal" }),
|
|
89
|
+
/* @__PURE__ */ jsxs(Grid, { container: true, spacing: 3, children: [
|
|
90
|
+
/* @__PURE__ */ jsx(Grid, { item: true, xs: 12, md: 8, children: /* @__PURE__ */ jsx(Paper, { elevation: 3, children: /* @__PURE__ */ jsxs(Box, { p: 3, children: [
|
|
91
|
+
/* @__PURE__ */ jsxs(Box, { display: "flex", justifyContent: "space-between", alignItems: "center", children: [
|
|
92
|
+
/* @__PURE__ */ jsxs(Box, { display: "flex", alignItems: "center", children: [
|
|
93
|
+
/* @__PURE__ */ jsx(QuestionAnswer, { style: { marginRight: 8 } }),
|
|
94
|
+
/* @__PURE__ */ jsx(Typography, { variant: "h5", gutterBottom: true, children: "Questions" })
|
|
95
|
+
] }),
|
|
96
|
+
/* @__PURE__ */ jsx(Tooltip, { title: "Browse and search through your team's questions and articles.", children: /* @__PURE__ */ jsx(Help, {}) })
|
|
97
|
+
] }),
|
|
98
|
+
/* @__PURE__ */ jsx(Box, { mt: 1, children: /* @__PURE__ */ jsx(StackOverflowQuestions, {}) })
|
|
99
|
+
] }) }) }),
|
|
100
|
+
/* @__PURE__ */ jsx(Grid, { item: true, xs: 12, md: 4, children: /* @__PURE__ */ jsxs(Grid, { container: true, spacing: 3, children: [
|
|
101
|
+
/* @__PURE__ */ jsx(Grid, { item: true, xs: 12, children: /* @__PURE__ */ jsx(Paper, { elevation: 3, children: /* @__PURE__ */ jsx(Box, { p: 3, children: /* @__PURE__ */ jsxs(Box, { display: "flex", justifyContent: "space-between", alignItems: "flex-start", mb: 2, children: [
|
|
102
|
+
/* @__PURE__ */ jsxs(Box, { flex: 1, children: [
|
|
103
|
+
/* @__PURE__ */ jsxs(Box, { display: "flex", alignItems: "center", mb: 2, children: [
|
|
104
|
+
/* @__PURE__ */ jsx(PersonIcon, { style: { marginRight: 8 } }),
|
|
105
|
+
/* @__PURE__ */ jsx(Typography, { variant: "h6", children: "My Profile" })
|
|
106
|
+
] }),
|
|
107
|
+
/* @__PURE__ */ jsx(StackOverflowMe, {})
|
|
108
|
+
] }),
|
|
109
|
+
/* @__PURE__ */ jsx(Tooltip, { title: "Information from your Stack Internal profile.", children: /* @__PURE__ */ jsx(Help, {}) })
|
|
110
|
+
] }) }) }) }),
|
|
111
|
+
/* @__PURE__ */ jsx(Grid, { item: true, xs: 12, children: /* @__PURE__ */ jsx(Paper, { elevation: 3, children: /* @__PURE__ */ jsxs(Box, { p: 2, children: [
|
|
112
|
+
/* @__PURE__ */ jsxs(Box, { display: "flex", justifyContent: "space-between", alignItems: "center", mb: 1, children: [
|
|
113
|
+
/* @__PURE__ */ jsxs(Box, { display: "flex", alignItems: "center", children: [
|
|
114
|
+
/* @__PURE__ */ jsx(LocalOffer, { style: { marginRight: 8 } }),
|
|
115
|
+
/* @__PURE__ */ jsx(Typography, { variant: "h6", children: "Tags" })
|
|
116
|
+
] }),
|
|
117
|
+
/* @__PURE__ */ jsx(Tooltip, { title: "Popular tags used in your team to categorize and organize questions", children: /* @__PURE__ */ jsx(Help, {}) })
|
|
118
|
+
] }),
|
|
119
|
+
/* @__PURE__ */ jsx(Box, { mt: 1, children: /* @__PURE__ */ jsx(StackOverflowTags, {}) })
|
|
120
|
+
] }) }) })
|
|
121
|
+
] }) }),
|
|
122
|
+
/* @__PURE__ */ jsx(Grid, { item: true, xs: 12, children: /* @__PURE__ */ jsx(Paper, { elevation: 3, children: /* @__PURE__ */ jsxs(Box, { p: 3, children: [
|
|
123
|
+
/* @__PURE__ */ jsxs(Box, { display: "flex", justifyContent: "space-between", alignItems: "center", mb: 2, children: [
|
|
124
|
+
/* @__PURE__ */ jsxs(Box, { display: "flex", alignItems: "center", children: [
|
|
125
|
+
/* @__PURE__ */ jsx(People, { style: { marginRight: 8 } }),
|
|
126
|
+
/* @__PURE__ */ jsx(Typography, { variant: "h5", children: "Team Members" })
|
|
127
|
+
] }),
|
|
128
|
+
/* @__PURE__ */ jsx(Tooltip, { title: "Team members, their role, reputation scores.", children: /* @__PURE__ */ jsx(Help, {}) })
|
|
129
|
+
] }),
|
|
130
|
+
/* @__PURE__ */ jsx(Box, { mt: 2, children: /* @__PURE__ */ jsx(StackOverflowUsers, {}) })
|
|
131
|
+
] }) }) })
|
|
132
|
+
] })
|
|
133
|
+
] })
|
|
134
|
+
] });
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
export { StackOverflowHub };
|
|
138
|
+
//# sourceMappingURL=StackOverflowHub.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StackOverflowHub.esm.js","sources":["../../src/pages/StackOverflowHub.tsx"],"sourcesContent":["import { useEffect, useState } from 'react';\nimport packageJson from '../../package.json'\nimport { Typography, Grid, Box, Paper, Tooltip } from '@material-ui/core';\nimport Help from '@material-ui/icons/Help';\nimport QuestionAnswer from '@material-ui/icons/QuestionAnswer';\nimport Person from '@material-ui/icons/Person';\nimport LocalOffer from '@material-ui/icons/LocalOffer';\nimport People from '@material-ui/icons/People';\nimport {\n Header,\n Page,\n Content,\n ContentHeader,\n HeaderLabel,\n} from '@backstage/core-components';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { stackoverflowteamsApiRef } from '../api';\nimport {\n StackOverflowQuestions,\n StackOverflowTags,\n StackOverflowUsers,\n StackOverflowMe\n} from '../components/StackOverflow';\n\nexport const StackOverflowHub = () => {\n const api = useApi(stackoverflowteamsApiRef);\n const [teamName, setTeamName] = useState('');\n const [baseUrl, setBaseUrl] = useState('');\n\n useEffect(() => {\n const fetchHeaderData = async () => {\n try {\n const [teamNameResult, baseUrlResult] = await Promise.all([\n api.getTeamName(),\n api.getBaseUrl()\n ]);\n setTeamName(teamNameResult);\n setBaseUrl(baseUrlResult);\n } catch (error) {\n setBaseUrl('Error retrieving BaseUrl/Team')\n }\n };\n\n fetchHeaderData();\n }, [api]);\n\n // Use teamName if available, otherwise fall back to baseUrl\n const instanceValue = teamName || baseUrl || \"Loading...\";\n\n return (\n <Page themeId=\"plugin\">\n <Header title=\"Welcome to Stack Internal!\" subtitle=\"Your team's collective knowledge at your fingertips.\">\n <HeaderLabel label=\"Connected to\" value={instanceValue} />\n <HeaderLabel label=\"Plugin Version\" value={`v${packageJson.version}`} />\n </Header>\n <Content>\n <ContentHeader title=\"Stack Internal\"/>\n <Grid container spacing={3}>\n {/* Main Questions Section */}\n <Grid item xs={12} md={8}>\n <Paper elevation={3}>\n <Box p={3}>\n <Box display=\"flex\" justifyContent=\"space-between\" alignItems=\"center\">\n <Box display=\"flex\" alignItems=\"center\">\n <QuestionAnswer style={{ marginRight: 8 }} />\n <Typography variant=\"h5\" gutterBottom>\n Questions\n </Typography>\n </Box>\n <Tooltip title=\"Browse and search through your team's questions and articles.\">\n \n <Help />\n \n </Tooltip>\n </Box>\n <Box mt={1}>\n <StackOverflowQuestions />\n </Box>\n </Box>\n </Paper>\n </Grid>\n\n {/* User Info & Tags Section */}\n <Grid item xs={12} md={4}>\n <Grid container spacing={3}>\n {/* StackOverflowMe Section */}\n <Grid item xs={12}>\n <Paper elevation={3}>\n <Box p={3}>\n <Box display=\"flex\" justifyContent=\"space-between\" alignItems=\"flex-start\" mb={2}>\n <Box flex={1}>\n <Box display=\"flex\" alignItems=\"center\" mb={2}>\n <Person style={{ marginRight: 8 }} />\n <Typography variant=\"h6\">\n My Profile\n </Typography>\n </Box>\n <StackOverflowMe />\n </Box>\n <Tooltip title=\"Information from your Stack Internal profile.\">\n \n <Help />\n \n </Tooltip>\n </Box>\n </Box>\n </Paper>\n </Grid>\n {/* Tags Section */}\n <Grid item xs={12}>\n <Paper elevation={3}>\n <Box p={2}>\n <Box display=\"flex\" justifyContent=\"space-between\" alignItems=\"center\" mb={1}>\n <Box display=\"flex\" alignItems=\"center\">\n <LocalOffer style={{ marginRight: 8 }} />\n <Typography variant=\"h6\">\n Tags\n </Typography>\n </Box>\n <Tooltip title=\"Popular tags used in your team to categorize and organize questions\">\n \n <Help />\n \n </Tooltip>\n </Box>\n <Box mt={1}>\n <StackOverflowTags />\n </Box>\n </Box>\n </Paper>\n </Grid>\n </Grid>\n </Grid>\n\n {/* Users Section */}\n <Grid item xs={12}>\n <Paper elevation={3}>\n <Box p={3}>\n <Box display=\"flex\" justifyContent=\"space-between\" alignItems=\"center\" mb={2}>\n <Box display=\"flex\" alignItems=\"center\">\n <People style={{ marginRight: 8 }} />\n <Typography variant=\"h5\">\n Team Members\n </Typography>\n </Box>\n <Tooltip title=\"Team members, their role, reputation scores.\">\n \n <Help />\n \n </Tooltip>\n </Box>\n <Box mt={2}>\n <StackOverflowUsers />\n </Box>\n </Box>\n </Paper>\n </Grid>\n </Grid>\n </Content>\n </Page>\n);\n};"],"names":["Person"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwBO,MAAM,mBAAmB,MAAM;AACpC,EAAA,MAAM,GAAA,GAAM,OAAO,wBAAwB,CAAA;AAC3C,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,SAAS,EAAE,CAAA;AAC3C,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAAS,EAAE,CAAA;AAEzC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,kBAAkB,YAAY;AAClC,MAAA,IAAI;AACF,QAAA,MAAM,CAAC,cAAA,EAAgB,aAAa,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,UACxD,IAAI,WAAA,EAAY;AAAA,UAChB,IAAI,UAAA;AAAW,SAChB,CAAA;AACD,QAAA,WAAA,CAAY,cAAc,CAAA;AAC1B,QAAA,UAAA,CAAW,aAAa,CAAA;AAAA,MAC1B,SAAS,KAAA,EAAO;AACd,QAAA,UAAA,CAAW,+BAA+B,CAAA;AAAA,MAC5C;AAAA,IACF,CAAA;AAEA,IAAA,eAAA,EAAgB;AAAA,EAClB,CAAA,EAAG,CAAC,GAAG,CAAC,CAAA;AAGR,EAAA,MAAM,aAAA,GAAgB,YAAY,OAAA,IAAW,YAAA;AAE7C,EAAA,uBACA,IAAA,CAAC,IAAA,EAAA,EAAK,OAAA,EAAQ,QAAA,EACZ,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,MAAA,EAAA,EAAO,KAAA,EAAM,4BAAA,EAA6B,QAAA,EAAS,sDAAA,EAClD,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,WAAA,EAAA,EAAY,KAAA,EAAM,cAAA,EAAe,KAAA,EAAO,aAAA,EAAe,CAAA;AAAA,sBACxD,GAAA,CAAC,eAAY,KAAA,EAAM,gBAAA,EAAiB,OAAO,CAAA,CAAA,EAAI,WAAA,CAAY,OAAO,CAAA,CAAA,EAAI;AAAA,KAAA,EACxE,CAAA;AAAA,yBACC,OAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,aAAA,EAAA,EAAc,OAAM,gBAAA,EAAgB,CAAA;AAAA,sBACrC,IAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAS,IAAA,EAAC,SAAS,CAAA,EAEvB,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAI,IAAA,EAAC,EAAA,EAAI,IAAI,EAAA,EAAI,CAAA,EACrB,QAAA,kBAAA,GAAA,CAAC,KAAA,EAAA,EAAM,SAAA,EAAW,CAAA,EAChB,QAAA,kBAAA,IAAA,CAAC,GAAA,EAAA,EAAI,GAAG,CAAA,EACN,QAAA,EAAA;AAAA,0BAAA,IAAA,CAAC,OAAI,OAAA,EAAQ,MAAA,EAAO,cAAA,EAAe,eAAA,EAAgB,YAAW,QAAA,EAC5D,QAAA,EAAA;AAAA,4BAAA,IAAA,CAAC,GAAA,EAAA,EAAI,OAAA,EAAQ,MAAA,EAAO,UAAA,EAAW,QAAA,EAC7B,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,cAAA,EAAA,EAAe,KAAA,EAAO,EAAE,WAAA,EAAa,GAAE,EAAG,CAAA;AAAA,kCAC1C,UAAA,EAAA,EAAW,OAAA,EAAQ,IAAA,EAAK,YAAA,EAAY,MAAC,QAAA,EAAA,WAAA,EAEtC;AAAA,aAAA,EACF,CAAA;AAAA,gCACC,OAAA,EAAA,EAAQ,KAAA,EAAM,+DAAA,EAEX,QAAA,kBAAA,GAAA,CAAC,QAAK,CAAA,EAEV;AAAA,WAAA,EACF,CAAA;AAAA,8BACC,GAAA,EAAA,EAAI,EAAA,EAAI,CAAA,EACL,QAAA,kBAAA,GAAA,CAAC,0BAAuB,CAAA,EAC5B;AAAA,SAAA,EACF,GACF,CAAA,EACF,CAAA;AAAA,wBAGA,GAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAI,IAAA,EAAC,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,CAAA,EACrB,QAAA,kBAAA,IAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAS,IAAA,EAAC,SAAS,CAAA,EAEvB,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,IAAA,EAAA,EAAK,MAAI,IAAA,EAAC,EAAA,EAAI,IACb,QAAA,kBAAA,GAAA,CAAC,KAAA,EAAA,EAAM,SAAA,EAAW,CAAA,EAChB,QAAA,kBAAA,GAAA,CAAC,GAAA,EAAA,EAAI,GAAG,CAAA,EACN,QAAA,kBAAA,IAAA,CAAC,OAAI,OAAA,EAAQ,MAAA,EAAO,gBAAe,eAAA,EAAgB,UAAA,EAAW,YAAA,EAAa,EAAA,EAAI,CAAA,EAC7E,QAAA,EAAA;AAAA,4BAAA,IAAA,CAAC,GAAA,EAAA,EAAI,MAAM,CAAA,EACT,QAAA,EAAA;AAAA,8BAAA,IAAA,CAAC,OAAI,OAAA,EAAQ,MAAA,EAAO,UAAA,EAAW,QAAA,EAAS,IAAI,CAAA,EAC1C,QAAA,EAAA;AAAA,gCAAA,GAAA,CAACA,UAAA,EAAA,EAAO,KAAA,EAAO,EAAE,WAAA,EAAa,GAAE,EAAG,CAAA;AAAA,gCACnC,GAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,IAAA,EAAK,QAAA,EAAA,YAAA,EAEzB;AAAA,eAAA,EACF,CAAA;AAAA,kCACC,eAAA,EAAA,EAAgB;AAAA,aAAA,EACnB,CAAA;AAAA,gCACC,OAAA,EAAA,EAAQ,KAAA,EAAM,+CAAA,EAEX,QAAA,kBAAA,GAAA,CAAC,QAAK,CAAA,EAEV;AAAA,WAAA,EACF,CAAA,EACF,GACF,CAAA,EACF,CAAA;AAAA,0BAEA,GAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAI,IAAA,EAAC,EAAA,EAAI,EAAA,EACb,QAAA,kBAAA,GAAA,CAAC,KAAA,EAAA,EAAM,SAAA,EAAW,CAAA,EAChB,QAAA,kBAAA,IAAA,CAAC,GAAA,EAAA,EAAI,GAAG,CAAA,EACN,QAAA,EAAA;AAAA,4BAAA,IAAA,CAAC,GAAA,EAAA,EAAI,SAAQ,MAAA,EAAO,cAAA,EAAe,iBAAgB,UAAA,EAAW,QAAA,EAAS,IAAI,CAAA,EACzE,QAAA,EAAA;AAAA,8BAAA,IAAA,CAAC,GAAA,EAAA,EAAI,OAAA,EAAQ,MAAA,EAAO,UAAA,EAAW,QAAA,EAC7B,QAAA,EAAA;AAAA,gCAAA,GAAA,CAAC,UAAA,EAAA,EAAW,KAAA,EAAO,EAAE,WAAA,EAAa,GAAE,EAAG,CAAA;AAAA,gCACvC,GAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,IAAA,EAAK,QAAA,EAAA,MAAA,EAEzB;AAAA,eAAA,EACF,CAAA;AAAA,kCACC,OAAA,EAAA,EAAQ,KAAA,EAAM,qEAAA,EAEX,QAAA,kBAAA,GAAA,CAAC,QAAK,CAAA,EAEV;AAAA,aAAA,EACF,CAAA;AAAA,gCACC,GAAA,EAAA,EAAI,EAAA,EAAI,CAAA,EACP,QAAA,kBAAA,GAAA,CAAC,qBAAkB,CAAA,EACrB;AAAA,WAAA,EACF,GACF,CAAA,EACF;AAAA,SAAA,EACF,CAAA,EACF,CAAA;AAAA,wBAGA,GAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAI,IAAA,EAAC,EAAA,EAAI,EAAA,EACb,QAAA,kBAAA,GAAA,CAAC,KAAA,EAAA,EAAM,SAAA,EAAW,CAAA,EAChB,QAAA,kBAAA,IAAA,CAAC,GAAA,EAAA,EAAI,GAAG,CAAA,EACN,QAAA,EAAA;AAAA,0BAAA,IAAA,CAAC,GAAA,EAAA,EAAI,SAAQ,MAAA,EAAO,cAAA,EAAe,iBAAgB,UAAA,EAAW,QAAA,EAAS,IAAI,CAAA,EACzE,QAAA,EAAA;AAAA,4BAAA,IAAA,CAAC,GAAA,EAAA,EAAI,OAAA,EAAQ,MAAA,EAAO,UAAA,EAAW,QAAA,EAC7B,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,MAAA,EAAA,EAAO,KAAA,EAAO,EAAE,WAAA,EAAa,GAAE,EAAG,CAAA;AAAA,8BACnC,GAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,IAAA,EAAK,QAAA,EAAA,cAAA,EAEzB;AAAA,aAAA,EACF,CAAA;AAAA,gCACC,OAAA,EAAA,EAAQ,KAAA,EAAM,8CAAA,EAEX,QAAA,kBAAA,GAAA,CAAC,QAAK,CAAA,EAEV;AAAA,WAAA,EACF,CAAA;AAAA,8BACC,GAAA,EAAA,EAAI,EAAA,EAAI,CAAA,EACP,QAAA,kBAAA,GAAA,CAAC,sBAAmB,CAAA,EACtB;AAAA,SAAA,EACF,GACF,CAAA,EACF;AAAA,OAAA,EACF;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEF;;;;"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { useState, useEffect } from 'react';
|
|
3
|
+
import { useApi } from '@backstage/core-plugin-api';
|
|
4
|
+
import { stackoverflowteamsApiRef } from '../api/StackOverflowAPI.esm.js';
|
|
5
|
+
import { useLocation } from 'react-router-dom';
|
|
6
|
+
import { StackOverflowCallback } from '../components/StackOverflowAuth/StackAuthCallback.esm.js';
|
|
7
|
+
import { StackOverflowAuthStart } from '../components/StackOverflowAuth/StackAuthStart.esm.js';
|
|
8
|
+
import { StackOverflowHub } from './StackOverflowHub.esm.js';
|
|
9
|
+
import { StackAuthLoading } from '../components/StackOverflowAuth/StackAuthLoading.esm.js';
|
|
10
|
+
|
|
11
|
+
const StackOverflowTeamsPage = () => {
|
|
12
|
+
const stackOverflowTeamsApi = useApi(stackoverflowteamsApiRef);
|
|
13
|
+
const location = useLocation();
|
|
14
|
+
const [authStatus, setAuthStatus] = useState("loading");
|
|
15
|
+
useEffect(() => {
|
|
16
|
+
const checkAuth = async () => {
|
|
17
|
+
try {
|
|
18
|
+
const isLoggedIn = await stackOverflowTeamsApi.getAuthStatus();
|
|
19
|
+
setAuthStatus(isLoggedIn ? "authenticated" : "unauthenticated");
|
|
20
|
+
} catch (error) {
|
|
21
|
+
setAuthStatus("unauthenticated");
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
if (location.search.includes("code=")) {
|
|
25
|
+
setAuthStatus("callback");
|
|
26
|
+
} else {
|
|
27
|
+
checkAuth();
|
|
28
|
+
}
|
|
29
|
+
}, [location.search, stackOverflowTeamsApi]);
|
|
30
|
+
if (authStatus === "loading") {
|
|
31
|
+
return /* @__PURE__ */ jsx(StackAuthLoading, {});
|
|
32
|
+
}
|
|
33
|
+
if (authStatus === "callback") {
|
|
34
|
+
return /* @__PURE__ */ jsx(StackOverflowCallback, {});
|
|
35
|
+
}
|
|
36
|
+
if (authStatus === "authenticated") {
|
|
37
|
+
return /* @__PURE__ */ jsx(StackOverflowHub, {});
|
|
38
|
+
}
|
|
39
|
+
return /* @__PURE__ */ jsx(StackOverflowAuthStart, {});
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
export { StackOverflowTeamsPage };
|
|
43
|
+
//# sourceMappingURL=StackOverflowTeamsPage.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StackOverflowTeamsPage.esm.js","sources":["../../src/pages/StackOverflowTeamsPage.tsx"],"sourcesContent":["import { useEffect, useState } from 'react';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { stackoverflowteamsApiRef } from '../api';\nimport { useLocation } from 'react-router-dom';\nimport { StackOverflowCallback, StackOverflowAuthStart } from '../components/StackOverflowAuth';\nimport { StackOverflowHub } from './StackOverflowHub'; // Your main hub page\nimport { StackAuthLoading } from '../components/StackOverflowAuth/StackAuthLoading';\n\nexport const StackOverflowTeamsPage = () => {\n const stackOverflowTeamsApi = useApi(stackoverflowteamsApiRef);\n const location = useLocation();\n const [authStatus, setAuthStatus] = useState<'loading' | 'authenticated' | 'unauthenticated' | 'callback'>('loading');\n\n useEffect(() => {\n const checkAuth = async () => {\n try {\n const isLoggedIn = await stackOverflowTeamsApi.getAuthStatus();\n setAuthStatus(isLoggedIn ? 'authenticated' : 'unauthenticated');\n } catch (error) {\n setAuthStatus('unauthenticated');\n }\n };\n\n // If the user is returning from an OAuth callback, handle it first\n if (location.search.includes('code=')) {\n setAuthStatus('callback');\n } else {\n checkAuth();\n }\n }, [location.search, stackOverflowTeamsApi]);\n\n if (authStatus === 'loading') {\n return <StackAuthLoading />;\n }\n\n if (authStatus === 'callback') {\n return <StackOverflowCallback />;\n }\n\n if (authStatus === 'authenticated') {\n return <StackOverflowHub />;\n }\n\n return <StackOverflowAuthStart />;\n};\n"],"names":[],"mappings":";;;;;;;;;;AAQO,MAAM,yBAAyB,MAAM;AAC1C,EAAA,MAAM,qBAAA,GAAwB,OAAO,wBAAwB,CAAA;AAC7D,EAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,SAAuE,SAAS,CAAA;AAEpH,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,YAAY,YAAY;AAC5B,MAAA,IAAI;AACF,QAAA,MAAM,UAAA,GAAa,MAAM,qBAAA,CAAsB,aAAA,EAAc;AAC7D,QAAA,aAAA,CAAc,UAAA,GAAa,kBAAkB,iBAAiB,CAAA;AAAA,MAChE,SAAS,KAAA,EAAO;AACd,QAAA,aAAA,CAAc,iBAAiB,CAAA;AAAA,MACjC;AAAA,IACF,CAAA;AAGA,IAAA,IAAI,QAAA,CAAS,MAAA,CAAO,QAAA,CAAS,OAAO,CAAA,EAAG;AACrC,MAAA,aAAA,CAAc,UAAU,CAAA;AAAA,IAC1B,CAAA,MAAO;AACL,MAAA,SAAA,EAAU;AAAA,IACZ;AAAA,EACF,CAAA,EAAG,CAAC,QAAA,CAAS,MAAA,EAAQ,qBAAqB,CAAC,CAAA;AAE3C,EAAA,IAAI,eAAe,SAAA,EAAW;AAC5B,IAAA,2BAAQ,gBAAA,EAAA,EAAiB,CAAA;AAAA,EAC3B;AAEA,EAAA,IAAI,eAAe,UAAA,EAAY;AAC7B,IAAA,2BAAQ,qBAAA,EAAA,EAAsB,CAAA;AAAA,EAChC;AAEA,EAAA,IAAI,eAAe,eAAA,EAAiB;AAClC,IAAA,2BAAQ,gBAAA,EAAA,EAAiB,CAAA;AAAA,EAC3B;AAEA,EAAA,2BAAQ,sBAAA,EAAA,EAAuB,CAAA;AACjC;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { createPlugin, createApiFactory, fetchApiRef, discoveryApiRef, createRoutableExtension } from '@backstage/core-plugin-api';
|
|
2
|
+
import { rootRouteRef } from './routes.esm.js';
|
|
3
|
+
import { createStackOverflowApi, stackoverflowteamsApiRef } from './api/StackOverflowAPI.esm.js';
|
|
4
|
+
|
|
5
|
+
const stackOverflowTeamsPlugin = createPlugin({
|
|
6
|
+
id: "stack-overflow-teams",
|
|
7
|
+
apis: [
|
|
8
|
+
createApiFactory({
|
|
9
|
+
api: stackoverflowteamsApiRef,
|
|
10
|
+
deps: { discoveryApi: discoveryApiRef, fetchApi: fetchApiRef },
|
|
11
|
+
factory: ({ discoveryApi, fetchApi }) => createStackOverflowApi(discoveryApi, fetchApi)
|
|
12
|
+
})
|
|
13
|
+
],
|
|
14
|
+
routes: {
|
|
15
|
+
root: rootRouteRef
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
const StackOverflowTeamsPage = stackOverflowTeamsPlugin.provide(
|
|
19
|
+
createRoutableExtension({
|
|
20
|
+
name: "StackOverflowTeamsPage",
|
|
21
|
+
component: () => import('./pages/index.esm.js').then((m) => m.StackOverflowTeamsPage),
|
|
22
|
+
mountPoint: rootRouteRef
|
|
23
|
+
})
|
|
24
|
+
);
|
|
25
|
+
|
|
26
|
+
export { StackOverflowTeamsPage, stackOverflowTeamsPlugin };
|
|
27
|
+
//# sourceMappingURL=plugin.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.esm.js","sources":["../src/plugin.ts"],"sourcesContent":["import {\n createApiFactory,\n createPlugin,\n createRoutableExtension,\n discoveryApiRef,\n fetchApiRef,\n} from '@backstage/core-plugin-api';\n\nimport { rootRouteRef } from './routes';\nimport { createStackOverflowApi, stackoverflowteamsApiRef } from './api';\n\nexport const stackOverflowTeamsPlugin = createPlugin({\n id: 'stack-overflow-teams',\n apis: [\n createApiFactory({\n api: stackoverflowteamsApiRef,\n deps: { discoveryApi: discoveryApiRef, fetchApi: fetchApiRef },\n factory: ({ discoveryApi, fetchApi }) => createStackOverflowApi(discoveryApi, fetchApi)\n })\n ],\n routes: {\n root: rootRouteRef,\n },\n});\n\nexport const StackOverflowTeamsPage = stackOverflowTeamsPlugin.provide(\n createRoutableExtension({\n name: 'StackOverflowTeamsPage',\n component: () =>\n import('./pages/').then(m => m.StackOverflowTeamsPage),\n mountPoint: rootRouteRef,\n }),\n);\n"],"names":[],"mappings":";;;;AAWO,MAAM,2BAA2B,YAAA,CAAa;AAAA,EACnD,EAAA,EAAI,sBAAA;AAAA,EACJ,IAAA,EAAM;AAAA,IACJ,gBAAA,CAAiB;AAAA,MACf,GAAA,EAAK,wBAAA;AAAA,MACL,IAAA,EAAM,EAAE,YAAA,EAAc,eAAA,EAAiB,UAAU,WAAA,EAAY;AAAA,MAC7D,OAAA,EAAS,CAAC,EAAE,YAAA,EAAc,UAAS,KAAM,sBAAA,CAAuB,cAAc,QAAQ;AAAA,KACvF;AAAA,GACH;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM;AAAA;AAEV,CAAC;AAEM,MAAM,yBAAyB,wBAAA,CAAyB,OAAA;AAAA,EAC7D,uBAAA,CAAwB;AAAA,IACtB,IAAA,EAAM,wBAAA;AAAA,IACN,SAAA,EAAW,MACT,OAAO,sBAAU,EAAE,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,sBAAsB,CAAA;AAAA,IACvD,UAAA,EAAY;AAAA,GACb;AACH;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routes.esm.js","sources":["../src/routes.ts"],"sourcesContent":["import { createRouteRef } from '@backstage/core-plugin-api';\n\nexport const rootRouteRef = createRouteRef({\n id: 'stack-overflow-teams',\n});\n"],"names":[],"mappings":";;AAEO,MAAM,eAAe,cAAA,CAAe;AAAA,EACzC,EAAA,EAAI;AACN,CAAC;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decodeHtml.esm.js","sources":["../../src/utils/decodeHtml.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport function decodeHtml(input: string) {\n const textContainer = document.createElement('textarea');\n textContainer.innerHTML = input;\n return textContainer.value;\n}"],"names":[],"mappings":"AAgBO,SAAS,WAAW,KAAA,EAAe;AACxC,EAAA,MAAM,aAAA,GAAgB,QAAA,CAAS,aAAA,CAAc,UAAU,CAAA;AACvD,EAAA,aAAA,CAAc,SAAA,GAAY,KAAA;AAC1B,EAAA,OAAO,aAAA,CAAc,KAAA;AACvB;;;;"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
function getTimeAgo(dateString) {
|
|
2
|
+
const now = /* @__PURE__ */ new Date();
|
|
3
|
+
const date = new Date(dateString);
|
|
4
|
+
const timeDiff = now.getTime() - date.getTime();
|
|
5
|
+
const seconds = Math.floor(timeDiff / 1e3);
|
|
6
|
+
const minutes = Math.floor(seconds / 60);
|
|
7
|
+
const hours = Math.floor(minutes / 60);
|
|
8
|
+
const days = Math.floor(hours / 24);
|
|
9
|
+
const months = Math.floor(days / 30);
|
|
10
|
+
const years = Math.floor(days / 365);
|
|
11
|
+
if (years > 0) {
|
|
12
|
+
return `${years} year${years > 1 ? "s" : ""} ago`;
|
|
13
|
+
}
|
|
14
|
+
if (months > 0) {
|
|
15
|
+
return `${months} month${months > 1 ? "s" : ""} ago`;
|
|
16
|
+
}
|
|
17
|
+
if (days > 0) {
|
|
18
|
+
return `${days} day${days > 1 ? "s" : ""} ago`;
|
|
19
|
+
}
|
|
20
|
+
if (hours > 0) {
|
|
21
|
+
return `${hours} hour${hours > 1 ? "s" : ""} ago`;
|
|
22
|
+
}
|
|
23
|
+
if (minutes > 0) {
|
|
24
|
+
return `${minutes} minute${minutes > 1 ? "s" : ""} ago`;
|
|
25
|
+
}
|
|
26
|
+
return `${seconds} second${seconds > 1 ? "s" : ""} ago`;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export { getTimeAgo };
|
|
30
|
+
//# sourceMappingURL=getTimeAgo.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getTimeAgo.esm.js","sources":["../../src/utils/getTimeAgo.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport function getTimeAgo(dateString: string) {\n const now = new Date();\n const date = new Date(dateString);\n const timeDiff = now.getTime() - date.getTime();\n\n const seconds = Math.floor(timeDiff / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n const days = Math.floor(hours / 24);\n const months = Math.floor(days / 30);\n const years = Math.floor(days / 365);\n\n if (years > 0) {\n return `${years} year${years > 1 ? 's' : ''} ago`;\n }\n if (months > 0) {\n return `${months} month${months > 1 ? 's' : ''} ago`;\n }\n if (days > 0) {\n return `${days} day${days > 1 ? 's' : ''} ago`;\n }\n if (hours > 0) {\n return `${hours} hour${hours > 1 ? 's' : ''} ago`;\n }\n if (minutes > 0) {\n return `${minutes} minute${minutes > 1 ? 's' : ''} ago`;\n }\n return `${seconds} second${seconds > 1 ? 's' : ''} ago`;\n}\n\n\n"],"names":[],"mappings":"AAgBO,SAAS,WAAW,UAAA,EAAoB;AAC7C,EAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,EAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,UAAU,CAAA;AAChC,EAAA,MAAM,QAAA,GAAW,GAAA,CAAI,OAAA,EAAQ,GAAI,KAAK,OAAA,EAAQ;AAE9C,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,QAAA,GAAW,GAAI,CAAA;AAC1C,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,EAAE,CAAA;AACvC,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,EAAE,CAAA;AACrC,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,EAAE,CAAA;AAClC,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,IAAA,GAAO,EAAE,CAAA;AACnC,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,IAAA,GAAO,GAAG,CAAA;AAEnC,EAAA,IAAI,QAAQ,CAAA,EAAG;AACb,IAAA,OAAO,GAAG,KAAK,CAAA,KAAA,EAAQ,KAAA,GAAQ,CAAA,GAAI,MAAM,EAAE,CAAA,IAAA,CAAA;AAAA,EAC7C;AACA,EAAA,IAAI,SAAS,CAAA,EAAG;AACd,IAAA,OAAO,GAAG,MAAM,CAAA,MAAA,EAAS,MAAA,GAAS,CAAA,GAAI,MAAM,EAAE,CAAA,IAAA,CAAA;AAAA,EAChD;AACA,EAAA,IAAI,OAAO,CAAA,EAAG;AACZ,IAAA,OAAO,GAAG,IAAI,CAAA,IAAA,EAAO,IAAA,GAAO,CAAA,GAAI,MAAM,EAAE,CAAA,IAAA,CAAA;AAAA,EAC1C;AACA,EAAA,IAAI,QAAQ,CAAA,EAAG;AACb,IAAA,OAAO,GAAG,KAAK,CAAA,KAAA,EAAQ,KAAA,GAAQ,CAAA,GAAI,MAAM,EAAE,CAAA,IAAA,CAAA;AAAA,EAC7C;AACA,EAAA,IAAI,UAAU,CAAA,EAAG;AACf,IAAA,OAAO,GAAG,OAAO,CAAA,OAAA,EAAU,OAAA,GAAU,CAAA,GAAI,MAAM,EAAE,CAAA,IAAA,CAAA;AAAA,EACnD;AACA,EAAA,OAAO,GAAG,OAAO,CAAA,OAAA,EAAU,OAAA,GAAU,CAAA,GAAI,MAAM,EAAE,CAAA,IAAA,CAAA;AACnD;;;;"}
|
package/package.json
CHANGED
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stackoverflow/backstage-plugin-stack-overflow-teams",
|
|
3
|
-
"version": "1.6.
|
|
4
|
-
"main": "dist/index.esm.js",
|
|
5
|
-
"types": "dist/index.d.ts",
|
|
3
|
+
"version": "1.6.3",
|
|
4
|
+
"main": "./dist/index.esm.js",
|
|
5
|
+
"types": "./dist/index.d.ts",
|
|
6
6
|
"license": "Apache-2.0",
|
|
7
7
|
"publishConfig": {
|
|
8
|
-
"access": "public"
|
|
9
|
-
"main": "dist/index.esm.js",
|
|
10
|
-
"types": "dist/index.d.ts"
|
|
8
|
+
"access": "public"
|
|
11
9
|
},
|
|
12
10
|
"backstage": {
|
|
13
11
|
"role": "frontend-plugin",
|
|
@@ -76,5 +74,13 @@
|
|
|
76
74
|
"files": [
|
|
77
75
|
"dist",
|
|
78
76
|
"config.d.ts"
|
|
79
|
-
]
|
|
77
|
+
],
|
|
78
|
+
"typesVersions": {
|
|
79
|
+
"*": {
|
|
80
|
+
"index": [
|
|
81
|
+
"dist/index.d.ts"
|
|
82
|
+
]
|
|
83
|
+
}
|
|
84
|
+
},
|
|
85
|
+
"module": "./dist/index.esm.js"
|
|
80
86
|
}
|