UNPKG

@selfcommunity/react-ui

Version:

React UI Components to integrate a Community created with SelfCommunity Platform.

147 lines (138 loc) 5.46 kB
import { __rest } from "tslib"; import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime"; import { useMemo } from 'react'; import { styled } from '@mui/material/styles'; import { Box, Typography } from '@mui/material'; import { defineMessages, useIntl } from 'react-intl'; import { camelCase, Logger } from '@selfcommunity/utils'; import { SCPreferences, useSCFetchUser, useSCPreferences } from '@selfcommunity/react-core'; import { DEFAULT_FIELDS } from '../../constants/UserProfile'; import UserInfoSkeleton from './Skeleton'; import classNames from 'classnames'; import { useThemeProps } from '@mui/system'; import { SCUserProfileFields } from '../../types'; import { SCOPE_SC_UI } from '../../constants/Errors'; import Tags, { TagsComponentType } from '../../shared/Tags'; import { PREFIX } from './constants'; const messages = defineMessages({ realName: { id: 'ui.userInfo.realName', defaultMessage: 'ui.userInfo.realName' }, dateJoined: { id: 'ui.userInfo.dateJoined', defaultMessage: 'ui.userInfo.dateJoined' }, bio: { id: 'ui.userInfo.bio', defaultMessage: 'ui.userInfo.bio' }, location: { id: 'ui.userInfo.location', defaultMessage: 'ui.userInfo.location' }, dateOfBirth: { id: 'ui.userInfo.dateOfBirth', defaultMessage: 'ui.userInfo.dateOfBirth' }, description: { id: 'ui.userInfo.description', defaultMessage: 'ui.userInfo.description' }, gender: { id: 'ui.userInfo.gender', defaultMessage: 'ui.userInfo.gender' }, website: { id: 'ui.userInfo.website', defaultMessage: 'ui.userInfo.website' }, tags: { id: 'ui.userInfo.website', defaultMessage: 'ui.userInfo.website' }, fieldLink: { id: 'ui.userInfo.fieldLink', defaultMessage: 'ui.userInfo.fieldLink' } }); const classes = { root: `${PREFIX}-root`, field: `${PREFIX}-field` }; const Root = styled(Box, { name: PREFIX, slot: 'Root' })(() => ({})); /** * > API documentation for the Community-JS User Info component. Learn about the available props and the CSS API. #### Import ```jsx import {UserInfo} from '@selfcommunity/react-ui'; ``` #### Component Name The name `SCUserInfo` can be used when providing style overrides in the theme. #### CSS |Rule Name|Global class|Description| |---|---|---| |root|.SCUserInfo-root|Styles applied to the root element.| |field|.SCUserInfo-field|Styles applied to the field element.| * @param inProps */ export default function UserInfo(inProps) { // PROPS const props = useThemeProps({ props: inProps, name: PREFIX }); const { className = null, userId = null, user = null, fields = [...DEFAULT_FIELDS] } = props, rest = __rest(props, ["className", "userId", "user", "fields"]); // STATE const { scUser } = useSCFetchUser({ id: userId, user }); // INTL const intl = useIntl(); // PREFERENCES const scPreferences = useSCPreferences(); const metadataDefinitions = useMemo(() => { if (scPreferences.preferences && SCPreferences.CONFIGURATIONS_USER_METADATA_DEFINITIONS in scPreferences.preferences) { try { return JSON.parse(scPreferences.preferences[SCPreferences.CONFIGURATIONS_USER_METADATA_DEFINITIONS].value); } catch (e) { Logger.error(SCOPE_SC_UI, 'Error on parse user metadata.'); return {}; } } return null; }, [scPreferences.preferences]); // FIELDS const _fields = [...fields, ...Object.keys(metadataDefinitions)]; // RENDER const renderField = (user, field) => { switch (field) { case SCUserProfileFields.DATE_JOINED: case SCUserProfileFields.DATE_OF_BIRTH: return `${intl.formatDate(user[field], { year: 'numeric', month: 'numeric', day: 'numeric' })}`; case SCUserProfileFields.TAGS: return (_jsx(Tags, { tags: user.tags.filter((t) => t.visible), type: TagsComponentType.LIST, direction: 'row', TagChipProps: { clickable: false, disposable: false } })); case SCUserProfileFields.WEBSITE: return (_jsx("a", Object.assign({ href: user[field], target: '_blank' }, { children: user[field] }))); default: return user[field]; } }; if (!scUser || !metadataDefinitions) { return _jsx(UserInfoSkeleton, {}); } if (_fields.length === 0) { return null; } return (_jsx(Root, Object.assign({ className: classNames(classes.root, className) }, rest, { children: _fields.map((field) => { if (scUser[field]) { if (field === SCUserProfileFields.TAGS) { return scUser[field].length > 0 ? (_jsx(Box, Object.assign({ className: classes.field }, { children: renderField(scUser, field) }), field)) : null; } return (_jsxs(Box, Object.assign({ className: classes.field }, { children: [_jsx(Typography, Object.assign({ variant: "h6" }, { children: metadataDefinitions[field] ? metadataDefinitions[field].label : intl.formatMessage(messages[camelCase(field)]) })), _jsx(Typography, Object.assign({ variant: "body2" }, { children: renderField(scUser, field) }))] }), field)); } return null; }) }))); }