@drodil/backstage-plugin-qeta-react 3.56.0 → 3.56.1
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/components/CollectionsContainer/CollectionsContainer.esm.js +2 -1
- package/dist/components/CollectionsContainer/CollectionsContainer.esm.js.map +1 -1
- package/dist/components/FaviconItem/FaviconItem.esm.js +20 -13
- package/dist/components/FaviconItem/FaviconItem.esm.js.map +1 -1
- package/dist/components/FollowedLists/FollowedUsersList.esm.js +1 -0
- package/dist/components/FollowedLists/FollowedUsersList.esm.js.map +1 -1
- package/dist/components/Links/Links.esm.js +1 -0
- package/dist/components/Links/Links.esm.js.map +1 -1
- package/dist/components/PostHighlightList/PostHighlightList.esm.js +1 -0
- package/dist/components/PostHighlightList/PostHighlightList.esm.js.map +1 -1
- package/dist/components/PostsContainer/PostsGridItem.esm.js +6 -11
- package/dist/components/PostsContainer/PostsGridItem.esm.js.map +1 -1
- package/dist/components/TagsAndEntities/UserChip.esm.js +1 -0
- package/dist/components/TagsAndEntities/UserChip.esm.js.map +1 -1
- package/dist/components/Timeline/TimelineItem.esm.js +1 -0
- package/dist/components/Timeline/TimelineItem.esm.js.map +1 -1
- package/dist/components/UsersContainer/UserListItem.esm.js +1 -0
- package/dist/components/UsersContainer/UserListItem.esm.js.map +1 -1
- package/dist/components/UsersContainer/UsersGridItem.esm.js +1 -0
- package/dist/components/UsersContainer/UsersGridItem.esm.js.map +1 -1
- package/dist/hooks/useCollectionsFollow.esm.js +21 -45
- package/dist/hooks/useCollectionsFollow.esm.js.map +1 -1
- package/dist/hooks/useEntityFollow.esm.js +25 -36
- package/dist/hooks/useEntityFollow.esm.js.map +1 -1
- package/dist/hooks/useFavicon.esm.js +52 -0
- package/dist/hooks/useFavicon.esm.js.map +1 -0
- package/dist/hooks/useFollow.esm.js +62 -0
- package/dist/hooks/useFollow.esm.js.map +1 -0
- package/dist/hooks/useTagsFollow.esm.js +22 -39
- package/dist/hooks/useTagsFollow.esm.js.map +1 -1
- package/dist/hooks/useUserFollow.esm.js +22 -39
- package/dist/hooks/useUserFollow.esm.js.map +1 -1
- package/dist/index.d.ts +29 -13
- package/dist/index.esm.js +2 -0
- package/dist/index.esm.js.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UserListItem.esm.js","sources":["../../../src/components/UsersContainer/UserListItem.tsx"],"sourcesContent":["import { UserResponse } from '@drodil/backstage-plugin-qeta-common';\nimport { useRouteRef } from '@backstage/core-plugin-api';\nimport { userRouteRef } from '../../routes';\nimport { useIdentityApi } from '../../hooks';\nimport { useEntityAuthor } from '../../hooks/useEntityAuthor';\nimport {\n Avatar,\n Box,\n makeStyles,\n Tooltip,\n Typography,\n} from '@material-ui/core';\nimport { UserFollowButton } from '../Buttons/UserFollowButton';\nimport Visibility from '@material-ui/icons/Visibility';\nimport QuestionAnswerIcon from '@material-ui/icons/QuestionAnswer';\nimport ThumbUpIcon from '@material-ui/icons/ThumbUp';\nimport CheckCircleIcon from '@material-ui/icons/CheckCircle';\nimport DescriptionIcon from '@material-ui/icons/Description';\nimport LinkIcon from '@material-ui/icons/Link';\nimport EmojiEvents from '@material-ui/icons/EmojiEvents';\nimport { qetaTranslationRef } from '../../translation';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { Link } from 'react-router-dom';\n\nimport { useListItemStyles } from '../../hooks';\n\nconst useStyles = makeStyles(theme => ({\n content: {\n flex: 1,\n minWidth: 0,\n display: 'flex',\n flexDirection: 'column',\n marginLeft: theme.spacing(2),\n },\n title: {\n fontWeight: 600,\n },\n statsWrapper: {\n display: 'flex',\n gap: theme.spacing(3),\n marginLeft: theme.spacing(2),\n alignItems: 'center',\n [theme.breakpoints.down('sm')]: {\n display: 'none',\n },\n },\n statItem: {\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(0.5),\n color: theme.palette.text.secondary,\n },\n actions: {\n marginLeft: theme.spacing(2),\n },\n}));\n\nexport const UserListItem = (props: { user: UserResponse }) => {\n const { user } = props;\n const classes = useStyles();\n const listItemClasses = useListItemStyles();\n const userRoute = useRouteRef(userRouteRef);\n const { t } = useTranslationRef(qetaTranslationRef);\n const {\n name,\n initials,\n user: userEntity,\n secondaryTitle,\n } = useEntityAuthor(user);\n const {\n value: currentUser,\n loading: loadingUser,\n error: userError,\n } = useIdentityApi(api => api.getBackstageIdentity(), []);\n\n const href = `${userRoute()}/${user.userRef}`;\n\n return (\n <Link to={href} className={listItemClasses.root}>\n <Avatar\n src={userEntity?.spec?.profile?.picture}\n alt={name}\n variant=\"rounded\"\n >\n {initials}\n </Avatar>\n <Box className={classes.content}>\n <Tooltip title={secondaryTitle ?? ''} arrow placement=\"top-start\">\n <Typography className={classes.title} noWrap>\n {name}\n </Typography>\n </Tooltip>\n </Box>\n\n <Box className={classes.statsWrapper}>\n <Tooltip title={t('impactCard.reputation')} arrow>\n <div className={classes.statItem}>\n <EmojiEvents fontSize=\"small\" />\n <Typography variant=\"body2\">{user.reputation}</Typography>\n </div>\n </Tooltip>\n <Tooltip title={t('common.questions')} arrow>\n <div className={classes.statItem}>\n <QuestionAnswerIcon fontSize=\"small\" />\n <Typography variant=\"body2\">{user.totalQuestions}</Typography>\n </div>\n </Tooltip>\n <Tooltip title={t('common.answers')} arrow>\n <div className={classes.statItem}>\n <CheckCircleIcon fontSize=\"small\" />\n <Typography variant=\"body2\">{user.totalAnswers}</Typography>\n </div>\n </Tooltip>\n <Tooltip title={t('common.articles')} arrow>\n <div className={classes.statItem}>\n <DescriptionIcon fontSize=\"small\" />\n <Typography variant=\"body2\">{user.totalArticles}</Typography>\n </div>\n </Tooltip>\n <Tooltip title={t('common.links')} arrow>\n <div className={classes.statItem}>\n <LinkIcon fontSize=\"small\" />\n <Typography variant=\"body2\">{user.totalLinks}</Typography>\n </div>\n </Tooltip>\n <Tooltip title={t('common.votes')} arrow>\n <div className={classes.statItem}>\n <ThumbUpIcon fontSize=\"small\" />\n <Typography variant=\"body2\">{user.totalVotes}</Typography>\n </div>\n </Tooltip>\n <Tooltip title={t('common.views')} arrow>\n <div className={classes.statItem}>\n <Visibility fontSize=\"small\" />\n <Typography variant=\"body2\">{user.totalViews}</Typography>\n </div>\n </Tooltip>\n </Box>\n\n {!loadingUser &&\n !userError &&\n currentUser?.userEntityRef !== user.userRef ? (\n <Box\n className={classes.actions}\n onClick={e => {\n e.preventDefault();\n e.stopPropagation();\n }}\n >\n <UserFollowButton userRef={user.userRef} />\n </Box>\n ) : null}\n </Link>\n );\n};\n"],"names":["CheckCircleIcon","ThumbUpIcon"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"UserListItem.esm.js","sources":["../../../src/components/UsersContainer/UserListItem.tsx"],"sourcesContent":["import { UserResponse } from '@drodil/backstage-plugin-qeta-common';\nimport { useRouteRef } from '@backstage/core-plugin-api';\nimport { userRouteRef } from '../../routes';\nimport { useIdentityApi } from '../../hooks';\nimport { useEntityAuthor } from '../../hooks/useEntityAuthor';\nimport {\n Avatar,\n Box,\n makeStyles,\n Tooltip,\n Typography,\n} from '@material-ui/core';\nimport { UserFollowButton } from '../Buttons/UserFollowButton';\nimport Visibility from '@material-ui/icons/Visibility';\nimport QuestionAnswerIcon from '@material-ui/icons/QuestionAnswer';\nimport ThumbUpIcon from '@material-ui/icons/ThumbUp';\nimport CheckCircleIcon from '@material-ui/icons/CheckCircle';\nimport DescriptionIcon from '@material-ui/icons/Description';\nimport LinkIcon from '@material-ui/icons/Link';\nimport EmojiEvents from '@material-ui/icons/EmojiEvents';\nimport { qetaTranslationRef } from '../../translation';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { Link } from 'react-router-dom';\n\nimport { useListItemStyles } from '../../hooks';\n\nconst useStyles = makeStyles(theme => ({\n content: {\n flex: 1,\n minWidth: 0,\n display: 'flex',\n flexDirection: 'column',\n marginLeft: theme.spacing(2),\n },\n title: {\n fontWeight: 600,\n },\n statsWrapper: {\n display: 'flex',\n gap: theme.spacing(3),\n marginLeft: theme.spacing(2),\n alignItems: 'center',\n [theme.breakpoints.down('sm')]: {\n display: 'none',\n },\n },\n statItem: {\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(0.5),\n color: theme.palette.text.secondary,\n },\n actions: {\n marginLeft: theme.spacing(2),\n },\n}));\n\nexport const UserListItem = (props: { user: UserResponse }) => {\n const { user } = props;\n const classes = useStyles();\n const listItemClasses = useListItemStyles();\n const userRoute = useRouteRef(userRouteRef);\n const { t } = useTranslationRef(qetaTranslationRef);\n const {\n name,\n initials,\n user: userEntity,\n secondaryTitle,\n } = useEntityAuthor(user);\n const {\n value: currentUser,\n loading: loadingUser,\n error: userError,\n } = useIdentityApi(api => api.getBackstageIdentity(), []);\n\n const href = `${userRoute()}/${user.userRef}`;\n\n return (\n <Link to={href} className={listItemClasses.root}>\n <Avatar\n src={userEntity?.spec?.profile?.picture}\n alt={name}\n variant=\"rounded\"\n >\n {initials}\n </Avatar>\n <Box className={classes.content}>\n <Tooltip title={secondaryTitle ?? ''} arrow placement=\"top-start\">\n <Typography className={classes.title} noWrap>\n {name}\n </Typography>\n </Tooltip>\n </Box>\n\n <Box className={classes.statsWrapper}>\n <Tooltip title={t('impactCard.reputation')} arrow>\n <div className={classes.statItem}>\n <EmojiEvents fontSize=\"small\" />\n <Typography variant=\"body2\">{user.reputation}</Typography>\n </div>\n </Tooltip>\n <Tooltip title={t('common.questions')} arrow>\n <div className={classes.statItem}>\n <QuestionAnswerIcon fontSize=\"small\" />\n <Typography variant=\"body2\">{user.totalQuestions}</Typography>\n </div>\n </Tooltip>\n <Tooltip title={t('common.answers')} arrow>\n <div className={classes.statItem}>\n <CheckCircleIcon fontSize=\"small\" />\n <Typography variant=\"body2\">{user.totalAnswers}</Typography>\n </div>\n </Tooltip>\n <Tooltip title={t('common.articles')} arrow>\n <div className={classes.statItem}>\n <DescriptionIcon fontSize=\"small\" />\n <Typography variant=\"body2\">{user.totalArticles}</Typography>\n </div>\n </Tooltip>\n <Tooltip title={t('common.links')} arrow>\n <div className={classes.statItem}>\n <LinkIcon fontSize=\"small\" />\n <Typography variant=\"body2\">{user.totalLinks}</Typography>\n </div>\n </Tooltip>\n <Tooltip title={t('common.votes')} arrow>\n <div className={classes.statItem}>\n <ThumbUpIcon fontSize=\"small\" />\n <Typography variant=\"body2\">{user.totalVotes}</Typography>\n </div>\n </Tooltip>\n <Tooltip title={t('common.views')} arrow>\n <div className={classes.statItem}>\n <Visibility fontSize=\"small\" />\n <Typography variant=\"body2\">{user.totalViews}</Typography>\n </div>\n </Tooltip>\n </Box>\n\n {!loadingUser &&\n !userError &&\n currentUser?.userEntityRef !== user.userRef ? (\n <Box\n className={classes.actions}\n onClick={e => {\n e.preventDefault();\n e.stopPropagation();\n }}\n >\n <UserFollowButton userRef={user.userRef} />\n </Box>\n ) : null}\n </Link>\n );\n};\n"],"names":["CheckCircleIcon","ThumbUpIcon"],"mappings":"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"}
|
|
@@ -19,6 +19,7 @@ import 'react-router-dom';
|
|
|
19
19
|
import 'react-use/lib/useDebounce';
|
|
20
20
|
import '../FilterPanel/FilterPanel.esm.js';
|
|
21
21
|
import '../QetaContext/QetaContext.esm.js';
|
|
22
|
+
import 'dataloader';
|
|
22
23
|
import { UserFollowButton } from '../Buttons/UserFollowButton.esm.js';
|
|
23
24
|
import Visibility from '@material-ui/icons/Visibility';
|
|
24
25
|
import QuestionAnswerIcon from '@material-ui/icons/QuestionAnswer';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UsersGridItem.esm.js","sources":["../../../src/components/UsersContainer/UsersGridItem.tsx"],"sourcesContent":["import { UserResponse } from '@drodil/backstage-plugin-qeta-common';\nimport { useRouteRef } from '@backstage/core-plugin-api';\nimport { useEntityPresentation } from '@backstage/plugin-catalog-react';\nimport { userRouteRef } from '../../routes';\nimport { useIdentityApi } from '../../hooks';\nimport { useEntityAuthor } from '../../hooks/useEntityAuthor';\nimport {\n Avatar,\n Box,\n Card,\n CardContent,\n Grid,\n makeStyles,\n Tooltip,\n Typography,\n} from '@material-ui/core';\nimport { UserFollowButton } from '../Buttons/UserFollowButton';\nimport Visibility from '@material-ui/icons/Visibility';\nimport QuestionAnswerIcon from '@material-ui/icons/QuestionAnswer';\nimport ThumbUpIcon from '@material-ui/icons/ThumbUp';\nimport CheckCircleIcon from '@material-ui/icons/CheckCircle';\nimport DescriptionIcon from '@material-ui/icons/Description';\nimport LinkIcon from '@material-ui/icons/Link';\nimport EmojiEvents from '@material-ui/icons/EmojiEvents';\nimport { qetaTranslationRef } from '../../translation.ts';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport useGridItemStyles from '../GridItemStyles/useGridItemStyles';\nimport { ClickableLink } from '../Utility/ClickableLink';\nimport { parseEntityRef, stringifyEntityRef } from '@backstage/catalog-model';\n\nconst useStyles = makeStyles(theme => ({\n statsGrid: {\n marginTop: 'auto',\n },\n statItem: {\n padding: theme.spacing(1),\n borderRadius: theme.shape.borderRadius,\n width: '100%',\n height: '100%',\n justifyContent: 'center',\n },\n flexColumn: {\n display: 'flex',\n flexDirection: 'column',\n },\n}));\n\nexport const UsersGridItem = (props: { user: UserResponse }) => {\n const { user } = props;\n const classes = useGridItemStyles();\n const localClasses = useStyles();\n const userRoute = useRouteRef(userRouteRef);\n const { t } = useTranslationRef(qetaTranslationRef);\n const entityRef = stringifyEntityRef(\n parseEntityRef(user.userRef, { defaultKind: 'user' }),\n );\n const { primaryTitle, Icon } = useEntityPresentation(entityRef);\n const {\n name,\n initials,\n user: userEntity,\n secondaryTitle,\n } = useEntityAuthor(user);\n const {\n value: currentUser,\n loading: loadingUser,\n error: userError,\n } = useIdentityApi(api => api.getBackstageIdentity(), []);\n\n const href = `${userRoute()}/${user.userRef}`;\n\n return (\n <Card className={classes.card}>\n <ClickableLink href={href} ariaLabel={primaryTitle}>\n <Box className={classes.cardHeader} display=\"flex\" alignItems=\"center\">\n {Icon && (\n <Avatar\n src={userEntity?.spec?.profile?.picture}\n className=\"avatar\"\n alt={name}\n variant=\"rounded\"\n style={{ marginRight: 16 }}\n >\n {initials}\n </Avatar>\n )}\n <Box flex={1} minWidth={0}>\n <Tooltip title={secondaryTitle ?? ''} arrow>\n <Typography variant=\"h6\" noWrap>\n {primaryTitle}\n </Typography>\n </Tooltip>\n </Box>\n {!loadingUser &&\n !userError &&\n currentUser?.userEntityRef !== user.userRef ? (\n <Box\n flexShrink={0}\n onClick={e => {\n e.preventDefault();\n e.stopPropagation();\n }}\n >\n <UserFollowButton userRef={user.userRef} />\n </Box>\n ) : null}\n </Box>\n <CardContent\n className={`${classes.cardContent} ${localClasses.flexColumn}`}\n >\n <Grid container spacing={1} className={localClasses.statsGrid}>\n <Grid item xs={3}>\n <Box\n display=\"flex\"\n flexDirection=\"column\"\n alignItems=\"center\"\n className={localClasses.statItem}\n >\n <EmojiEvents fontSize=\"small\" color=\"disabled\" />\n <Typography variant=\"body2\" style={{ fontWeight: 600 }}>\n {user.reputation}\n </Typography>\n <Typography variant=\"caption\" color=\"textSecondary\">\n {t('impactCard.reputation')}\n </Typography>\n </Box>\n </Grid>\n <Grid item xs={3}>\n <Box\n display=\"flex\"\n flexDirection=\"column\"\n alignItems=\"center\"\n className={localClasses.statItem}\n >\n <QuestionAnswerIcon fontSize=\"small\" color=\"disabled\" />\n <Typography variant=\"body2\" style={{ fontWeight: 600 }}>\n {user.totalQuestions}\n </Typography>\n <Typography variant=\"caption\" color=\"textSecondary\">\n {t('common.questions')}\n </Typography>\n </Box>\n </Grid>\n <Grid item xs={3}>\n <Box\n display=\"flex\"\n flexDirection=\"column\"\n alignItems=\"center\"\n className={localClasses.statItem}\n >\n <DescriptionIcon fontSize=\"small\" color=\"disabled\" />\n <Typography variant=\"body2\" style={{ fontWeight: 600 }}>\n {user.totalArticles}\n </Typography>\n <Typography variant=\"caption\" color=\"textSecondary\">\n {t('common.articles')}\n </Typography>\n </Box>\n </Grid>\n <Grid item xs={3}>\n <Box\n display=\"flex\"\n flexDirection=\"column\"\n alignItems=\"center\"\n className={localClasses.statItem}\n >\n <LinkIcon fontSize=\"small\" color=\"disabled\" />\n <Typography variant=\"body2\" style={{ fontWeight: 600 }}>\n {user.totalLinks}\n </Typography>\n <Typography variant=\"caption\" color=\"textSecondary\">\n {t('common.links')}\n </Typography>\n </Box>\n </Grid>\n <Grid item xs={4}>\n <Box\n display=\"flex\"\n flexDirection=\"column\"\n alignItems=\"center\"\n className={localClasses.statItem}\n >\n <CheckCircleIcon fontSize=\"small\" color=\"disabled\" />\n <Typography variant=\"body2\" style={{ fontWeight: 600 }}>\n {user.totalAnswers}\n </Typography>\n <Typography variant=\"caption\" color=\"textSecondary\">\n {t('common.answers')}\n </Typography>\n </Box>\n </Grid>\n <Grid item xs={4}>\n <Box\n display=\"flex\"\n flexDirection=\"column\"\n alignItems=\"center\"\n className={localClasses.statItem}\n >\n <ThumbUpIcon fontSize=\"small\" color=\"disabled\" />\n <Typography variant=\"body2\" style={{ fontWeight: 600 }}>\n {user.totalVotes}\n </Typography>\n <Typography variant=\"caption\" color=\"textSecondary\">\n {t('common.votes')}\n </Typography>\n </Box>\n </Grid>\n <Grid item xs={4}>\n <Box\n display=\"flex\"\n flexDirection=\"column\"\n alignItems=\"center\"\n className={localClasses.statItem}\n >\n <Visibility fontSize=\"small\" color=\"disabled\" />\n <Typography variant=\"body2\" style={{ fontWeight: 600 }}>\n {user.totalViews}\n </Typography>\n <Typography variant=\"caption\" color=\"textSecondary\">\n {t('common.views')}\n </Typography>\n </Box>\n </Grid>\n </Grid>\n </CardContent>\n </ClickableLink>\n </Card>\n );\n};\n"],"names":["CheckCircleIcon","ThumbUpIcon"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"UsersGridItem.esm.js","sources":["../../../src/components/UsersContainer/UsersGridItem.tsx"],"sourcesContent":["import { UserResponse } from '@drodil/backstage-plugin-qeta-common';\nimport { useRouteRef } from '@backstage/core-plugin-api';\nimport { useEntityPresentation } from '@backstage/plugin-catalog-react';\nimport { userRouteRef } from '../../routes';\nimport { useIdentityApi } from '../../hooks';\nimport { useEntityAuthor } from '../../hooks/useEntityAuthor';\nimport {\n Avatar,\n Box,\n Card,\n CardContent,\n Grid,\n makeStyles,\n Tooltip,\n Typography,\n} from '@material-ui/core';\nimport { UserFollowButton } from '../Buttons/UserFollowButton';\nimport Visibility from '@material-ui/icons/Visibility';\nimport QuestionAnswerIcon from '@material-ui/icons/QuestionAnswer';\nimport ThumbUpIcon from '@material-ui/icons/ThumbUp';\nimport CheckCircleIcon from '@material-ui/icons/CheckCircle';\nimport DescriptionIcon from '@material-ui/icons/Description';\nimport LinkIcon from '@material-ui/icons/Link';\nimport EmojiEvents from '@material-ui/icons/EmojiEvents';\nimport { qetaTranslationRef } from '../../translation.ts';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport useGridItemStyles from '../GridItemStyles/useGridItemStyles';\nimport { ClickableLink } from '../Utility/ClickableLink';\nimport { parseEntityRef, stringifyEntityRef } from '@backstage/catalog-model';\n\nconst useStyles = makeStyles(theme => ({\n statsGrid: {\n marginTop: 'auto',\n },\n statItem: {\n padding: theme.spacing(1),\n borderRadius: theme.shape.borderRadius,\n width: '100%',\n height: '100%',\n justifyContent: 'center',\n },\n flexColumn: {\n display: 'flex',\n flexDirection: 'column',\n },\n}));\n\nexport const UsersGridItem = (props: { user: UserResponse }) => {\n const { user } = props;\n const classes = useGridItemStyles();\n const localClasses = useStyles();\n const userRoute = useRouteRef(userRouteRef);\n const { t } = useTranslationRef(qetaTranslationRef);\n const entityRef = stringifyEntityRef(\n parseEntityRef(user.userRef, { defaultKind: 'user' }),\n );\n const { primaryTitle, Icon } = useEntityPresentation(entityRef);\n const {\n name,\n initials,\n user: userEntity,\n secondaryTitle,\n } = useEntityAuthor(user);\n const {\n value: currentUser,\n loading: loadingUser,\n error: userError,\n } = useIdentityApi(api => api.getBackstageIdentity(), []);\n\n const href = `${userRoute()}/${user.userRef}`;\n\n return (\n <Card className={classes.card}>\n <ClickableLink href={href} ariaLabel={primaryTitle}>\n <Box className={classes.cardHeader} display=\"flex\" alignItems=\"center\">\n {Icon && (\n <Avatar\n src={userEntity?.spec?.profile?.picture}\n className=\"avatar\"\n alt={name}\n variant=\"rounded\"\n style={{ marginRight: 16 }}\n >\n {initials}\n </Avatar>\n )}\n <Box flex={1} minWidth={0}>\n <Tooltip title={secondaryTitle ?? ''} arrow>\n <Typography variant=\"h6\" noWrap>\n {primaryTitle}\n </Typography>\n </Tooltip>\n </Box>\n {!loadingUser &&\n !userError &&\n currentUser?.userEntityRef !== user.userRef ? (\n <Box\n flexShrink={0}\n onClick={e => {\n e.preventDefault();\n e.stopPropagation();\n }}\n >\n <UserFollowButton userRef={user.userRef} />\n </Box>\n ) : null}\n </Box>\n <CardContent\n className={`${classes.cardContent} ${localClasses.flexColumn}`}\n >\n <Grid container spacing={1} className={localClasses.statsGrid}>\n <Grid item xs={3}>\n <Box\n display=\"flex\"\n flexDirection=\"column\"\n alignItems=\"center\"\n className={localClasses.statItem}\n >\n <EmojiEvents fontSize=\"small\" color=\"disabled\" />\n <Typography variant=\"body2\" style={{ fontWeight: 600 }}>\n {user.reputation}\n </Typography>\n <Typography variant=\"caption\" color=\"textSecondary\">\n {t('impactCard.reputation')}\n </Typography>\n </Box>\n </Grid>\n <Grid item xs={3}>\n <Box\n display=\"flex\"\n flexDirection=\"column\"\n alignItems=\"center\"\n className={localClasses.statItem}\n >\n <QuestionAnswerIcon fontSize=\"small\" color=\"disabled\" />\n <Typography variant=\"body2\" style={{ fontWeight: 600 }}>\n {user.totalQuestions}\n </Typography>\n <Typography variant=\"caption\" color=\"textSecondary\">\n {t('common.questions')}\n </Typography>\n </Box>\n </Grid>\n <Grid item xs={3}>\n <Box\n display=\"flex\"\n flexDirection=\"column\"\n alignItems=\"center\"\n className={localClasses.statItem}\n >\n <DescriptionIcon fontSize=\"small\" color=\"disabled\" />\n <Typography variant=\"body2\" style={{ fontWeight: 600 }}>\n {user.totalArticles}\n </Typography>\n <Typography variant=\"caption\" color=\"textSecondary\">\n {t('common.articles')}\n </Typography>\n </Box>\n </Grid>\n <Grid item xs={3}>\n <Box\n display=\"flex\"\n flexDirection=\"column\"\n alignItems=\"center\"\n className={localClasses.statItem}\n >\n <LinkIcon fontSize=\"small\" color=\"disabled\" />\n <Typography variant=\"body2\" style={{ fontWeight: 600 }}>\n {user.totalLinks}\n </Typography>\n <Typography variant=\"caption\" color=\"textSecondary\">\n {t('common.links')}\n </Typography>\n </Box>\n </Grid>\n <Grid item xs={4}>\n <Box\n display=\"flex\"\n flexDirection=\"column\"\n alignItems=\"center\"\n className={localClasses.statItem}\n >\n <CheckCircleIcon fontSize=\"small\" color=\"disabled\" />\n <Typography variant=\"body2\" style={{ fontWeight: 600 }}>\n {user.totalAnswers}\n </Typography>\n <Typography variant=\"caption\" color=\"textSecondary\">\n {t('common.answers')}\n </Typography>\n </Box>\n </Grid>\n <Grid item xs={4}>\n <Box\n display=\"flex\"\n flexDirection=\"column\"\n alignItems=\"center\"\n className={localClasses.statItem}\n >\n <ThumbUpIcon fontSize=\"small\" color=\"disabled\" />\n <Typography variant=\"body2\" style={{ fontWeight: 600 }}>\n {user.totalVotes}\n </Typography>\n <Typography variant=\"caption\" color=\"textSecondary\">\n {t('common.votes')}\n </Typography>\n </Box>\n </Grid>\n <Grid item xs={4}>\n <Box\n display=\"flex\"\n flexDirection=\"column\"\n alignItems=\"center\"\n className={localClasses.statItem}\n >\n <Visibility fontSize=\"small\" color=\"disabled\" />\n <Typography variant=\"body2\" style={{ fontWeight: 600 }}>\n {user.totalViews}\n </Typography>\n <Typography variant=\"caption\" color=\"textSecondary\">\n {t('common.views')}\n </Typography>\n </Box>\n </Grid>\n </Grid>\n </CardContent>\n </ClickableLink>\n </Card>\n );\n};\n"],"names":["CheckCircleIcon","ThumbUpIcon"],"mappings":"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"}
|
|
@@ -1,54 +1,30 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { useCallback } from 'react';
|
|
2
2
|
import { useApi } from '@backstage/core-plugin-api';
|
|
3
3
|
import { qetaApiRef } from '../api.esm.js';
|
|
4
|
+
import { useFollow } from './useFollow.esm.js';
|
|
4
5
|
|
|
5
|
-
let followedCollections = void 0;
|
|
6
6
|
const useCollectionsFollow = () => {
|
|
7
|
-
const [collections, setCollections] = useState(
|
|
8
|
-
followedCollections ?? []
|
|
9
|
-
);
|
|
10
|
-
const [loading, setLoading] = useState(followedCollections === void 0);
|
|
11
7
|
const qetaApi = useApi(qetaApiRef);
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
qetaApi.getFollowedCollections().then((res) =>
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
followedCollections?.push(collection);
|
|
28
|
-
});
|
|
29
|
-
},
|
|
30
|
-
[qetaApi]
|
|
31
|
-
);
|
|
32
|
-
const unfollowCollection = useCallback(
|
|
33
|
-
(collection) => {
|
|
34
|
-
qetaApi.unfollowCollection(collection.id).then(() => {
|
|
35
|
-
setCollections((prev) => prev.filter((t) => t.id !== collection.id));
|
|
36
|
-
followedCollections = followedCollections?.filter(
|
|
37
|
-
(t) => t.id !== collection.id
|
|
38
|
-
);
|
|
39
|
-
});
|
|
40
|
-
},
|
|
41
|
-
[qetaApi]
|
|
42
|
-
);
|
|
43
|
-
const isFollowingCollection = useCallback(
|
|
44
|
-
(collection) => Boolean(collections.find((t) => t.id === collection.id)),
|
|
45
|
-
[collections]
|
|
46
|
-
);
|
|
8
|
+
const { items, follow, unfollow, isFollowing, loading } = useFollow("collections", {
|
|
9
|
+
fetchFollowed: useCallback(
|
|
10
|
+
() => qetaApi.getFollowedCollections().then((res) => res.collections),
|
|
11
|
+
[qetaApi]
|
|
12
|
+
),
|
|
13
|
+
followItem: useCallback(
|
|
14
|
+
(collection) => qetaApi.followCollection(collection.id),
|
|
15
|
+
[qetaApi]
|
|
16
|
+
),
|
|
17
|
+
unfollowItem: useCallback(
|
|
18
|
+
(collection) => qetaApi.unfollowCollection(collection.id),
|
|
19
|
+
[qetaApi]
|
|
20
|
+
),
|
|
21
|
+
isEqual: (a, b) => a.id === b.id
|
|
22
|
+
});
|
|
47
23
|
return {
|
|
48
|
-
collections,
|
|
49
|
-
followCollection,
|
|
50
|
-
unfollowCollection,
|
|
51
|
-
isFollowingCollection,
|
|
24
|
+
collections: items,
|
|
25
|
+
followCollection: follow,
|
|
26
|
+
unfollowCollection: unfollow,
|
|
27
|
+
isFollowingCollection: isFollowing,
|
|
52
28
|
loading
|
|
53
29
|
};
|
|
54
30
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useCollectionsFollow.esm.js","sources":["../../src/hooks/useCollectionsFollow.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"useCollectionsFollow.esm.js","sources":["../../src/hooks/useCollectionsFollow.ts"],"sourcesContent":["import { useCallback } from 'react';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { qetaApiRef } from '../api';\nimport { Collection } from '@drodil/backstage-plugin-qeta-common';\nimport { useFollow } from './useFollow';\n\nexport const useCollectionsFollow = () => {\n const qetaApi = useApi(qetaApiRef);\n\n const { items, follow, unfollow, isFollowing, loading } =\n useFollow<Collection>('collections', {\n fetchFollowed: useCallback(\n () => qetaApi.getFollowedCollections().then(res => res.collections),\n [qetaApi],\n ),\n followItem: useCallback(\n (collection: Collection) => qetaApi.followCollection(collection.id),\n [qetaApi],\n ),\n unfollowItem: useCallback(\n (collection: Collection) => qetaApi.unfollowCollection(collection.id),\n [qetaApi],\n ),\n isEqual: (a, b) => a.id === b.id,\n });\n\n return {\n collections: items,\n followCollection: follow,\n unfollowCollection: unfollow,\n isFollowingCollection: isFollowing,\n loading,\n };\n};\n"],"names":[],"mappings":";;;;;AAMO,MAAM,uBAAuB,MAAM;AACxC,EAAM,MAAA,OAAA,GAAU,OAAO,UAAU,CAAA;AAEjC,EAAM,MAAA,EAAE,OAAO,MAAQ,EAAA,QAAA,EAAU,aAAa,OAAQ,EAAA,GACpD,UAAsB,aAAe,EAAA;AAAA,IACnC,aAAe,EAAA,WAAA;AAAA,MACb,MAAM,OAAQ,CAAA,sBAAA,GAAyB,IAAK,CAAA,CAAA,GAAA,KAAO,IAAI,WAAW,CAAA;AAAA,MAClE,CAAC,OAAO;AAAA,KACV;AAAA,IACA,UAAY,EAAA,WAAA;AAAA,MACV,CAAC,UAAA,KAA2B,OAAQ,CAAA,gBAAA,CAAiB,WAAW,EAAE,CAAA;AAAA,MAClE,CAAC,OAAO;AAAA,KACV;AAAA,IACA,YAAc,EAAA,WAAA;AAAA,MACZ,CAAC,UAAA,KAA2B,OAAQ,CAAA,kBAAA,CAAmB,WAAW,EAAE,CAAA;AAAA,MACpE,CAAC,OAAO;AAAA,KACV;AAAA,IACA,SAAS,CAAC,CAAA,EAAG,CAAM,KAAA,CAAA,CAAE,OAAO,CAAE,CAAA;AAAA,GAC/B,CAAA;AAEH,EAAO,OAAA;AAAA,IACL,WAAa,EAAA,KAAA;AAAA,IACb,gBAAkB,EAAA,MAAA;AAAA,IAClB,kBAAoB,EAAA,QAAA;AAAA,IACpB,qBAAuB,EAAA,WAAA;AAAA,IACvB;AAAA,GACF;AACF;;;;"}
|
|
@@ -1,46 +1,35 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { useCallback } from 'react';
|
|
2
2
|
import { useApi } from '@backstage/core-plugin-api';
|
|
3
3
|
import { qetaApiRef } from '../api.esm.js';
|
|
4
|
+
import { useFollow } from './useFollow.esm.js';
|
|
4
5
|
|
|
5
|
-
let followedEntities = void 0;
|
|
6
6
|
const useEntityFollow = () => {
|
|
7
|
-
const [entities, setEntities] = useState(followedEntities ?? []);
|
|
8
|
-
const [loading, setLoading] = useState(followedEntities === void 0);
|
|
9
7
|
const qetaApi = useApi(qetaApiRef);
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
8
|
+
const { items, follow, unfollow, isFollowing, loading } = useFollow(
|
|
9
|
+
"entities",
|
|
10
|
+
{
|
|
11
|
+
fetchFollowed: useCallback(
|
|
12
|
+
() => qetaApi.getFollowedEntities().then((res) => res.entityRefs),
|
|
13
|
+
[qetaApi]
|
|
14
|
+
),
|
|
15
|
+
followItem: useCallback(
|
|
16
|
+
(entityRef) => qetaApi.followEntity(entityRef),
|
|
17
|
+
[qetaApi]
|
|
18
|
+
),
|
|
19
|
+
unfollowItem: useCallback(
|
|
20
|
+
(entityRef) => qetaApi.unfollowEntity(entityRef),
|
|
21
|
+
[qetaApi]
|
|
22
|
+
),
|
|
23
|
+
isEqual: (a, b) => a === b
|
|
19
24
|
}
|
|
20
|
-
}, [qetaApi]);
|
|
21
|
-
const followEntity = useCallback(
|
|
22
|
-
(entityRef) => {
|
|
23
|
-
qetaApi.followEntity(entityRef).then(() => {
|
|
24
|
-
setEntities((prev) => [...prev, entityRef]);
|
|
25
|
-
followedEntities?.push(entityRef);
|
|
26
|
-
});
|
|
27
|
-
},
|
|
28
|
-
[qetaApi]
|
|
29
25
|
);
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
[qetaApi]
|
|
38
|
-
);
|
|
39
|
-
const isFollowingEntity = useCallback(
|
|
40
|
-
(entityRef) => entities.includes(entityRef),
|
|
41
|
-
[entities]
|
|
42
|
-
);
|
|
43
|
-
return { entities, followEntity, unfollowEntity, isFollowingEntity, loading };
|
|
26
|
+
return {
|
|
27
|
+
entities: items,
|
|
28
|
+
followEntity: follow,
|
|
29
|
+
unfollowEntity: unfollow,
|
|
30
|
+
isFollowingEntity: isFollowing,
|
|
31
|
+
loading
|
|
32
|
+
};
|
|
44
33
|
};
|
|
45
34
|
|
|
46
35
|
export { useEntityFollow };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useEntityFollow.esm.js","sources":["../../src/hooks/useEntityFollow.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"useEntityFollow.esm.js","sources":["../../src/hooks/useEntityFollow.ts"],"sourcesContent":["import { useCallback } from 'react';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { qetaApiRef } from '../api';\nimport { useFollow } from './useFollow';\n\nexport const useEntityFollow = () => {\n const qetaApi = useApi(qetaApiRef);\n\n const { items, follow, unfollow, isFollowing, loading } = useFollow<string>(\n 'entities',\n {\n fetchFollowed: useCallback(\n () => qetaApi.getFollowedEntities().then(res => res.entityRefs),\n [qetaApi],\n ),\n followItem: useCallback(\n (entityRef: string) => qetaApi.followEntity(entityRef),\n [qetaApi],\n ),\n unfollowItem: useCallback(\n (entityRef: string) => qetaApi.unfollowEntity(entityRef),\n [qetaApi],\n ),\n isEqual: (a, b) => a === b,\n },\n );\n\n return {\n entities: items,\n followEntity: follow,\n unfollowEntity: unfollow,\n isFollowingEntity: isFollowing,\n loading,\n };\n};\n"],"names":[],"mappings":";;;;;AAKO,MAAM,kBAAkB,MAAM;AACnC,EAAM,MAAA,OAAA,GAAU,OAAO,UAAU,CAAA;AAEjC,EAAA,MAAM,EAAE,KAAO,EAAA,MAAA,EAAQ,QAAU,EAAA,WAAA,EAAa,SAAY,GAAA,SAAA;AAAA,IACxD,UAAA;AAAA,IACA;AAAA,MACE,aAAe,EAAA,WAAA;AAAA,QACb,MAAM,OAAQ,CAAA,mBAAA,GAAsB,IAAK,CAAA,CAAA,GAAA,KAAO,IAAI,UAAU,CAAA;AAAA,QAC9D,CAAC,OAAO;AAAA,OACV;AAAA,MACA,UAAY,EAAA,WAAA;AAAA,QACV,CAAC,SAAA,KAAsB,OAAQ,CAAA,YAAA,CAAa,SAAS,CAAA;AAAA,QACrD,CAAC,OAAO;AAAA,OACV;AAAA,MACA,YAAc,EAAA,WAAA;AAAA,QACZ,CAAC,SAAA,KAAsB,OAAQ,CAAA,cAAA,CAAe,SAAS,CAAA;AAAA,QACvD,CAAC,OAAO;AAAA,OACV;AAAA,MACA,OAAS,EAAA,CAAC,CAAG,EAAA,CAAA,KAAM,CAAM,KAAA;AAAA;AAC3B,GACF;AAEA,EAAO,OAAA;AAAA,IACL,QAAU,EAAA,KAAA;AAAA,IACV,YAAc,EAAA,MAAA;AAAA,IACd,cAAgB,EAAA,QAAA;AAAA,IAChB,iBAAmB,EAAA,WAAA;AAAA,IACnB;AAAA,GACF;AACF;;;;"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { useState, useEffect } from 'react';
|
|
2
|
+
import { useApi } from '@backstage/core-plugin-api';
|
|
3
|
+
import { qetaApiRef } from '../api.esm.js';
|
|
4
|
+
import DataLoader from 'dataloader';
|
|
5
|
+
|
|
6
|
+
const loaderCache = /* @__PURE__ */ new WeakMap();
|
|
7
|
+
const getFaviconLoader = (qetaApi) => {
|
|
8
|
+
const cached = loaderCache.get(qetaApi);
|
|
9
|
+
if (cached) {
|
|
10
|
+
return cached;
|
|
11
|
+
}
|
|
12
|
+
const loader = new DataLoader(
|
|
13
|
+
async (urls) => {
|
|
14
|
+
try {
|
|
15
|
+
const response = await qetaApi.fetchBatchURLMetadata({
|
|
16
|
+
urls: [...urls]
|
|
17
|
+
});
|
|
18
|
+
return urls.map((url) => {
|
|
19
|
+
const metadata = response.metadata?.[url];
|
|
20
|
+
return metadata?.favicon;
|
|
21
|
+
});
|
|
22
|
+
} catch {
|
|
23
|
+
return urls.map(() => void 0);
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
cache: true,
|
|
28
|
+
batchScheduleFn: (callback) => setTimeout(callback, 10),
|
|
29
|
+
maxBatchSize: 50
|
|
30
|
+
}
|
|
31
|
+
);
|
|
32
|
+
loaderCache.set(qetaApi, loader);
|
|
33
|
+
return loader;
|
|
34
|
+
};
|
|
35
|
+
const useFavicon = (url) => {
|
|
36
|
+
const qetaApi = useApi(qetaApiRef);
|
|
37
|
+
const [favicon, setFavicon] = useState(void 0);
|
|
38
|
+
useEffect(() => {
|
|
39
|
+
if (!url) {
|
|
40
|
+
setFavicon(void 0);
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
const loader = getFaviconLoader(qetaApi);
|
|
44
|
+
loader.load(url).then(setFavicon).catch(() => {
|
|
45
|
+
setFavicon(void 0);
|
|
46
|
+
});
|
|
47
|
+
}, [url, qetaApi]);
|
|
48
|
+
return favicon;
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
export { useFavicon };
|
|
52
|
+
//# sourceMappingURL=useFavicon.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useFavicon.esm.js","sources":["../../src/hooks/useFavicon.ts"],"sourcesContent":["import { useEffect, useState } from 'react';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { qetaApiRef } from '../api';\nimport DataLoader from 'dataloader';\nimport { QetaApi } from '@drodil/backstage-plugin-qeta-common';\n\nconst loaderCache = new WeakMap<\n QetaApi,\n DataLoader<string, string | undefined>\n>();\n\nconst getFaviconLoader = (\n qetaApi: QetaApi,\n): DataLoader<string, string | undefined> => {\n const cached = loaderCache.get(qetaApi);\n if (cached) {\n return cached;\n }\n\n const loader = new DataLoader<string, string | undefined>(\n async (urls: readonly string[]) => {\n try {\n const response = await qetaApi.fetchBatchURLMetadata({\n urls: [...urls],\n });\n\n return urls.map(url => {\n const metadata = response.metadata?.[url];\n return metadata?.favicon;\n });\n } catch {\n return urls.map(() => undefined);\n }\n },\n {\n cache: true,\n batchScheduleFn: callback => setTimeout(callback, 10),\n maxBatchSize: 50,\n },\n );\n\n loaderCache.set(qetaApi, loader);\n return loader;\n};\n\nexport const useFavicon = (url?: string): string | undefined => {\n const qetaApi = useApi(qetaApiRef);\n const [favicon, setFavicon] = useState<string | undefined>(undefined);\n\n useEffect(() => {\n if (!url) {\n setFavicon(undefined);\n return;\n }\n\n const loader = getFaviconLoader(qetaApi);\n\n loader\n .load(url)\n .then(setFavicon)\n .catch(() => {\n setFavicon(undefined);\n });\n }, [url, qetaApi]);\n\n return favicon;\n};\n"],"names":[],"mappings":";;;;;AAMA,MAAM,WAAA,uBAAkB,OAGtB,EAAA;AAEF,MAAM,gBAAA,GAAmB,CACvB,OAC2C,KAAA;AAC3C,EAAM,MAAA,MAAA,GAAS,WAAY,CAAA,GAAA,CAAI,OAAO,CAAA;AACtC,EAAA,IAAI,MAAQ,EAAA;AACV,IAAO,OAAA,MAAA;AAAA;AAGT,EAAA,MAAM,SAAS,IAAI,UAAA;AAAA,IACjB,OAAO,IAA4B,KAAA;AACjC,MAAI,IAAA;AACF,QAAM,MAAA,QAAA,GAAW,MAAM,OAAA,CAAQ,qBAAsB,CAAA;AAAA,UACnD,IAAA,EAAM,CAAC,GAAG,IAAI;AAAA,SACf,CAAA;AAED,QAAO,OAAA,IAAA,CAAK,IAAI,CAAO,GAAA,KAAA;AACrB,UAAM,MAAA,QAAA,GAAW,QAAS,CAAA,QAAA,GAAW,GAAG,CAAA;AACxC,UAAA,OAAO,QAAU,EAAA,OAAA;AAAA,SAClB,CAAA;AAAA,OACK,CAAA,MAAA;AACN,QAAO,OAAA,IAAA,CAAK,GAAI,CAAA,MAAM,KAAS,CAAA,CAAA;AAAA;AACjC,KACF;AAAA,IACA;AAAA,MACE,KAAO,EAAA,IAAA;AAAA,MACP,eAAiB,EAAA,CAAA,QAAA,KAAY,UAAW,CAAA,QAAA,EAAU,EAAE,CAAA;AAAA,MACpD,YAAc,EAAA;AAAA;AAChB,GACF;AAEA,EAAY,WAAA,CAAA,GAAA,CAAI,SAAS,MAAM,CAAA;AAC/B,EAAO,OAAA,MAAA;AACT,CAAA;AAEa,MAAA,UAAA,GAAa,CAAC,GAAqC,KAAA;AAC9D,EAAM,MAAA,OAAA,GAAU,OAAO,UAAU,CAAA;AACjC,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAA6B,KAAS,CAAA,CAAA;AAEpE,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,GAAK,EAAA;AACR,MAAA,UAAA,CAAW,KAAS,CAAA,CAAA;AACpB,MAAA;AAAA;AAGF,IAAM,MAAA,MAAA,GAAS,iBAAiB,OAAO,CAAA;AAEvC,IAAA,MAAA,CACG,KAAK,GAAG,CAAA,CACR,KAAK,UAAU,CAAA,CACf,MAAM,MAAM;AACX,MAAA,UAAA,CAAW,KAAS,CAAA,CAAA;AAAA,KACrB,CAAA;AAAA,GACF,EAAA,CAAC,GAAK,EAAA,OAAO,CAAC,CAAA;AAEjB,EAAO,OAAA,OAAA;AACT;;;;"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { useState, useEffect, useCallback } from 'react';
|
|
2
|
+
import { useApi } from '@backstage/core-plugin-api';
|
|
3
|
+
import { qetaApiRef } from '../api.esm.js';
|
|
4
|
+
|
|
5
|
+
const caches = /* @__PURE__ */ new Map();
|
|
6
|
+
const useFollow = (key, options) => {
|
|
7
|
+
const { fetchFollowed, followItem, unfollowItem, isEqual } = options;
|
|
8
|
+
if (!caches.has(key)) {
|
|
9
|
+
caches.set(key, { data: void 0, promise: void 0 });
|
|
10
|
+
}
|
|
11
|
+
const cache = caches.get(key);
|
|
12
|
+
const [items, setItems] = useState(cache.data ?? []);
|
|
13
|
+
const [loading, setLoading] = useState(cache.data === void 0);
|
|
14
|
+
const qetaApi = useApi(qetaApiRef);
|
|
15
|
+
useEffect(() => {
|
|
16
|
+
if (cache.data === void 0) {
|
|
17
|
+
cache.promise ??= fetchFollowed().then((result) => {
|
|
18
|
+
cache.data = result;
|
|
19
|
+
cache.promise = void 0;
|
|
20
|
+
return result;
|
|
21
|
+
});
|
|
22
|
+
cache.promise.then((result) => {
|
|
23
|
+
setItems(result);
|
|
24
|
+
setLoading(false);
|
|
25
|
+
});
|
|
26
|
+
} else {
|
|
27
|
+
setItems(cache.data);
|
|
28
|
+
}
|
|
29
|
+
}, [qetaApi, fetchFollowed, cache]);
|
|
30
|
+
const follow = useCallback(
|
|
31
|
+
(item) => {
|
|
32
|
+
followItem(item).then(() => {
|
|
33
|
+
setItems((prev) => [...prev, item]);
|
|
34
|
+
cache.data?.push(item);
|
|
35
|
+
});
|
|
36
|
+
},
|
|
37
|
+
[followItem, cache]
|
|
38
|
+
);
|
|
39
|
+
const unfollow = useCallback(
|
|
40
|
+
(item) => {
|
|
41
|
+
unfollowItem(item).then(() => {
|
|
42
|
+
setItems((prev) => prev.filter((i) => !isEqual(i, item)));
|
|
43
|
+
cache.data = cache.data?.filter((i) => !isEqual(i, item));
|
|
44
|
+
});
|
|
45
|
+
},
|
|
46
|
+
[unfollowItem, isEqual, cache]
|
|
47
|
+
);
|
|
48
|
+
const isFollowing = useCallback(
|
|
49
|
+
(item) => items.some((i) => isEqual(i, item)),
|
|
50
|
+
[items, isEqual]
|
|
51
|
+
);
|
|
52
|
+
return {
|
|
53
|
+
items,
|
|
54
|
+
follow,
|
|
55
|
+
unfollow,
|
|
56
|
+
isFollowing,
|
|
57
|
+
loading
|
|
58
|
+
};
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
export { useFollow };
|
|
62
|
+
//# sourceMappingURL=useFollow.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useFollow.esm.js","sources":["../../src/hooks/useFollow.ts"],"sourcesContent":["import { useCallback, useEffect, useState } from 'react';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { qetaApiRef } from '../api';\n\ninterface UseFollowOptions<T> {\n fetchFollowed: () => Promise<T[]>;\n followItem: (item: T) => Promise<unknown>;\n unfollowItem: (item: T) => Promise<unknown>;\n isEqual: (a: T, b: T) => boolean;\n}\n\ninterface UseFollowCache<T> {\n data: T[] | undefined;\n promise: Promise<T[]> | undefined;\n}\n\nconst caches = new Map<string, UseFollowCache<any>>();\n\nexport const useFollow = <T>(key: string, options: UseFollowOptions<T>) => {\n const { fetchFollowed, followItem, unfollowItem, isEqual } = options;\n\n // Get or create cache for this key\n if (!caches.has(key)) {\n caches.set(key, { data: undefined, promise: undefined });\n }\n const cache = caches.get(key) as UseFollowCache<T>;\n\n const [items, setItems] = useState<T[]>(cache.data ?? []);\n const [loading, setLoading] = useState(cache.data === undefined);\n const qetaApi = useApi(qetaApiRef);\n\n useEffect(() => {\n if (cache.data === undefined) {\n cache.promise ??= fetchFollowed().then(result => {\n cache.data = result;\n cache.promise = undefined;\n return result;\n });\n cache.promise.then(result => {\n setItems(result);\n setLoading(false);\n });\n } else {\n setItems(cache.data);\n }\n }, [qetaApi, fetchFollowed, cache]);\n\n const follow = useCallback(\n (item: T) => {\n followItem(item).then(() => {\n setItems(prev => [...prev, item]);\n cache.data?.push(item);\n });\n },\n [followItem, cache],\n );\n\n const unfollow = useCallback(\n (item: T) => {\n unfollowItem(item).then(() => {\n setItems(prev => prev.filter(i => !isEqual(i, item)));\n cache.data = cache.data?.filter(i => !isEqual(i, item));\n });\n },\n [unfollowItem, isEqual, cache],\n );\n\n const isFollowing = useCallback(\n (item: T) => items.some(i => isEqual(i, item)),\n [items, isEqual],\n );\n\n return {\n items,\n follow,\n unfollow,\n isFollowing,\n loading,\n };\n};\n"],"names":[],"mappings":";;;;AAgBA,MAAM,MAAA,uBAAa,GAAiC,EAAA;AAEvC,MAAA,SAAA,GAAY,CAAI,GAAA,EAAa,OAAiC,KAAA;AACzE,EAAA,MAAM,EAAE,aAAA,EAAe,UAAY,EAAA,YAAA,EAAc,SAAY,GAAA,OAAA;AAG7D,EAAA,IAAI,CAAC,MAAA,CAAO,GAAI,CAAA,GAAG,CAAG,EAAA;AACpB,IAAA,MAAA,CAAO,IAAI,GAAK,EAAA,EAAE,MAAM,KAAW,CAAA,EAAA,OAAA,EAAS,QAAW,CAAA;AAAA;AAEzD,EAAM,MAAA,KAAA,GAAQ,MAAO,CAAA,GAAA,CAAI,GAAG,CAAA;AAE5B,EAAM,MAAA,CAAC,OAAO,QAAQ,CAAA,GAAI,SAAc,KAAM,CAAA,IAAA,IAAQ,EAAE,CAAA;AACxD,EAAA,MAAM,CAAC,OAAS,EAAA,UAAU,IAAI,QAAS,CAAA,KAAA,CAAM,SAAS,KAAS,CAAA,CAAA;AAC/D,EAAM,MAAA,OAAA,GAAU,OAAO,UAAU,CAAA;AAEjC,EAAA,SAAA,CAAU,MAAM;AACd,IAAI,IAAA,KAAA,CAAM,SAAS,KAAW,CAAA,EAAA;AAC5B,MAAA,KAAA,CAAM,OAAY,KAAA,aAAA,EAAgB,CAAA,IAAA,CAAK,CAAU,MAAA,KAAA;AAC/C,QAAA,KAAA,CAAM,IAAO,GAAA,MAAA;AACb,QAAA,KAAA,CAAM,OAAU,GAAA,KAAA,CAAA;AAChB,QAAO,OAAA,MAAA;AAAA,OACR,CAAA;AACD,MAAM,KAAA,CAAA,OAAA,CAAQ,KAAK,CAAU,MAAA,KAAA;AAC3B,QAAA,QAAA,CAAS,MAAM,CAAA;AACf,QAAA,UAAA,CAAW,KAAK,CAAA;AAAA,OACjB,CAAA;AAAA,KACI,MAAA;AACL,MAAA,QAAA,CAAS,MAAM,IAAI,CAAA;AAAA;AACrB,GACC,EAAA,CAAC,OAAS,EAAA,aAAA,EAAe,KAAK,CAAC,CAAA;AAElC,EAAA,MAAM,MAAS,GAAA,WAAA;AAAA,IACb,CAAC,IAAY,KAAA;AACX,MAAW,UAAA,CAAA,IAAI,CAAE,CAAA,IAAA,CAAK,MAAM;AAC1B,QAAA,QAAA,CAAS,CAAQ,IAAA,KAAA,CAAC,GAAG,IAAA,EAAM,IAAI,CAAC,CAAA;AAChC,QAAM,KAAA,CAAA,IAAA,EAAM,KAAK,IAAI,CAAA;AAAA,OACtB,CAAA;AAAA,KACH;AAAA,IACA,CAAC,YAAY,KAAK;AAAA,GACpB;AAEA,EAAA,MAAM,QAAW,GAAA,WAAA;AAAA,IACf,CAAC,IAAY,KAAA;AACX,MAAa,YAAA,CAAA,IAAI,CAAE,CAAA,IAAA,CAAK,MAAM;AAC5B,QAAS,QAAA,CAAA,CAAA,IAAA,KAAQ,KAAK,MAAO,CAAA,CAAA,CAAA,KAAK,CAAC,OAAQ,CAAA,CAAA,EAAG,IAAI,CAAC,CAAC,CAAA;AACpD,QAAM,KAAA,CAAA,IAAA,GAAO,MAAM,IAAM,EAAA,MAAA,CAAO,OAAK,CAAC,OAAA,CAAQ,CAAG,EAAA,IAAI,CAAC,CAAA;AAAA,OACvD,CAAA;AAAA,KACH;AAAA,IACA,CAAC,YAAc,EAAA,OAAA,EAAS,KAAK;AAAA,GAC/B;AAEA,EAAA,MAAM,WAAc,GAAA,WAAA;AAAA,IAClB,CAAC,SAAY,KAAM,CAAA,IAAA,CAAK,OAAK,OAAQ,CAAA,CAAA,EAAG,IAAI,CAAC,CAAA;AAAA,IAC7C,CAAC,OAAO,OAAO;AAAA,GACjB;AAEA,EAAO,OAAA;AAAA,IACL,KAAA;AAAA,IACA,MAAA;AAAA,IACA,QAAA;AAAA,IACA,WAAA;AAAA,IACA;AAAA,GACF;AACF;;;;"}
|
|
@@ -1,50 +1,33 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { useCallback } from 'react';
|
|
2
2
|
import { useApi } from '@backstage/core-plugin-api';
|
|
3
3
|
import { qetaApiRef } from '../api.esm.js';
|
|
4
|
+
import { useFollow } from './useFollow.esm.js';
|
|
4
5
|
|
|
5
|
-
let followedTags = void 0;
|
|
6
6
|
const useTagsFollow = () => {
|
|
7
|
-
const [tags, setTags] = useState(followedTags ?? []);
|
|
8
|
-
const [loading, setLoading] = useState(followedTags === void 0);
|
|
9
7
|
const qetaApi = useApi(qetaApiRef);
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
8
|
+
const { items, follow, unfollow, isFollowing, loading } = useFollow(
|
|
9
|
+
"tags",
|
|
10
|
+
{
|
|
11
|
+
fetchFollowed: useCallback(
|
|
12
|
+
() => qetaApi.getFollowedTags().then((res) => res.tags),
|
|
13
|
+
[qetaApi]
|
|
14
|
+
),
|
|
15
|
+
followItem: useCallback(
|
|
16
|
+
(tag) => qetaApi.followTag(tag),
|
|
17
|
+
[qetaApi]
|
|
18
|
+
),
|
|
19
|
+
unfollowItem: useCallback(
|
|
20
|
+
(tag) => qetaApi.unfollowTag(tag),
|
|
21
|
+
[qetaApi]
|
|
22
|
+
),
|
|
23
|
+
isEqual: (a, b) => a === b
|
|
19
24
|
}
|
|
20
|
-
}, [qetaApi]);
|
|
21
|
-
const followTag = useCallback(
|
|
22
|
-
(tag) => {
|
|
23
|
-
qetaApi.followTag(tag).then(() => {
|
|
24
|
-
setTags((prev) => [...prev, tag]);
|
|
25
|
-
followedTags?.push(tag);
|
|
26
|
-
});
|
|
27
|
-
},
|
|
28
|
-
[qetaApi]
|
|
29
|
-
);
|
|
30
|
-
const unfollowTag = useCallback(
|
|
31
|
-
(tag) => {
|
|
32
|
-
qetaApi.unfollowTag(tag).then(() => {
|
|
33
|
-
setTags((prev) => prev.filter((t) => t !== tag));
|
|
34
|
-
followedTags = followedTags?.filter((t) => t !== tag);
|
|
35
|
-
});
|
|
36
|
-
},
|
|
37
|
-
[qetaApi]
|
|
38
|
-
);
|
|
39
|
-
const isFollowingTag = useCallback(
|
|
40
|
-
(tag) => tags.includes(tag),
|
|
41
|
-
[tags]
|
|
42
25
|
);
|
|
43
26
|
return {
|
|
44
|
-
tags,
|
|
45
|
-
followTag,
|
|
46
|
-
unfollowTag,
|
|
47
|
-
isFollowingTag,
|
|
27
|
+
tags: items,
|
|
28
|
+
followTag: follow,
|
|
29
|
+
unfollowTag: unfollow,
|
|
30
|
+
isFollowingTag: isFollowing,
|
|
48
31
|
loading
|
|
49
32
|
};
|
|
50
33
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useTagsFollow.esm.js","sources":["../../src/hooks/useTagsFollow.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"useTagsFollow.esm.js","sources":["../../src/hooks/useTagsFollow.ts"],"sourcesContent":["import { useCallback } from 'react';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { qetaApiRef } from '../api';\nimport { useFollow } from './useFollow';\n\nexport const useTagsFollow = () => {\n const qetaApi = useApi(qetaApiRef);\n\n const { items, follow, unfollow, isFollowing, loading } = useFollow<string>(\n 'tags',\n {\n fetchFollowed: useCallback(\n () => qetaApi.getFollowedTags().then(res => res.tags),\n [qetaApi],\n ),\n followItem: useCallback(\n (tag: string) => qetaApi.followTag(tag),\n [qetaApi],\n ),\n unfollowItem: useCallback(\n (tag: string) => qetaApi.unfollowTag(tag),\n [qetaApi],\n ),\n isEqual: (a, b) => a === b,\n },\n );\n\n return {\n tags: items,\n followTag: follow,\n unfollowTag: unfollow,\n isFollowingTag: isFollowing,\n loading,\n };\n};\n"],"names":[],"mappings":";;;;;AAKO,MAAM,gBAAgB,MAAM;AACjC,EAAM,MAAA,OAAA,GAAU,OAAO,UAAU,CAAA;AAEjC,EAAA,MAAM,EAAE,KAAO,EAAA,MAAA,EAAQ,QAAU,EAAA,WAAA,EAAa,SAAY,GAAA,SAAA;AAAA,IACxD,MAAA;AAAA,IACA;AAAA,MACE,aAAe,EAAA,WAAA;AAAA,QACb,MAAM,OAAQ,CAAA,eAAA,GAAkB,IAAK,CAAA,CAAA,GAAA,KAAO,IAAI,IAAI,CAAA;AAAA,QACpD,CAAC,OAAO;AAAA,OACV;AAAA,MACA,UAAY,EAAA,WAAA;AAAA,QACV,CAAC,GAAA,KAAgB,OAAQ,CAAA,SAAA,CAAU,GAAG,CAAA;AAAA,QACtC,CAAC,OAAO;AAAA,OACV;AAAA,MACA,YAAc,EAAA,WAAA;AAAA,QACZ,CAAC,GAAA,KAAgB,OAAQ,CAAA,WAAA,CAAY,GAAG,CAAA;AAAA,QACxC,CAAC,OAAO;AAAA,OACV;AAAA,MACA,OAAS,EAAA,CAAC,CAAG,EAAA,CAAA,KAAM,CAAM,KAAA;AAAA;AAC3B,GACF;AAEA,EAAO,OAAA;AAAA,IACL,IAAM,EAAA,KAAA;AAAA,IACN,SAAW,EAAA,MAAA;AAAA,IACX,WAAa,EAAA,QAAA;AAAA,IACb,cAAgB,EAAA,WAAA;AAAA,IAChB;AAAA,GACF;AACF;;;;"}
|