UNPKG

@pnp/spfx-controls-react

Version:

Reusable React controls for SharePoint Framework solutions

142 lines • 8.58 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.AddComment = void 0; var tslib_1 = require("tslib"); var Stack_1 = require("@fluentui/react/lib/Stack"); var React = tslib_1.__importStar(require("react")); var react_1 = require("react"); var ListItemCommentsStateProvider_1 = require("./../ListItemCommentsStateProvider"); var react_mentions_1 = require("react-mentions"); var react_2 = require("react"); var useAddCommentStyles_1 = require("./useAddCommentStyles"); var constants_1 = require("../../common/constants"); var Button_1 = require("@fluentui/react/lib/Button"); var Text_1 = require("@fluentui/react/lib/Text"); var ECommentAction_1 = require("../../common/ECommentAction"); var __1 = require("../.."); var PeopleSearchService_1 = tslib_1.__importDefault(require("../../../../services/PeopleSearchService")); var sp_http_1 = require("@microsoft/sp-http"); var sp_page_context_1 = require("@microsoft/sp-page-context"); var peoplepicker_1 = require("../../../peoplepicker"); var strings = tslib_1.__importStar(require("ControlStrings")); var AddComment = function (props) { var _a = (0, react_1.useState)(""), commentText = _a[0], setCommentText = _a[1]; var _b = (0, react_1.useState)(false), disableCallingGraph = _b[0], setDisableCallingGraph = _b[1]; var _c = (0, __1.useMsGraphAPI)(), getUsers = _c.getUsers, getSuggestions = _c.getSuggestions; var _d = (0, useAddCommentStyles_1.useAddCommentStyles)(), reactMentionStyles = _d.reactMentionStyles, mentionsClasses = _d.mentionsClasses, componentClasses = _d.componentClasses; var _e = (0, react_1.useState)(true), singleLine = _e[0], setSingleLine = _e[1]; var setlistItemCommentsState = (0, react_1.useContext)(ListItemCommentsStateProvider_1.ListItemCommentsStateContext).setlistItemCommentsState; var _addCommentText = (0, react_1.useRef)({ mentions: [], text: "" }); var serviceScope = (0, react_1.useContext)(__1.AppContext).serviceScope; var _msGraphClientFactory = undefined; var _sPHttpClient = undefined; var _pageContext = undefined; var _peopleSearchService = undefined; serviceScope.whenFinished(function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () { return tslib_1.__generator(this, function (_a) { _msGraphClientFactory = serviceScope.consume(sp_http_1.MSGraphClientFactory.serviceKey); _sPHttpClient = serviceScope.consume(sp_http_1.SPHttpClient.serviceKey); _pageContext = serviceScope.consume(sp_page_context_1.PageContext.serviceKey); _peopleSearchService = new PeopleSearchService_1.default({ absoluteUrl: _pageContext.web.absoluteUrl, msGraphClientFactory: _msGraphClientFactory, spHttpClient: _sPHttpClient }, false); return [2 /*return*/]; }); }); }); var sugestionsContainer = (0, react_1.useRef)(); var _reactMentionStyles = reactMentionStyles; var _onChange = (0, react_2.useCallback)(function (event, newValue, newPlainTextValue, mentions) { _reactMentionStyles = reactMentionStyles; if (newValue) { setSingleLine(false); _reactMentionStyles["&multiLine"].control = { height: 63 }; _addCommentText.current.text = newPlainTextValue; _addCommentText.current.mentions = []; for (var index = 0; index < mentions.length; index++) { var mention = mentions[index]; _addCommentText.current.text = _addCommentText.current.text.replace(mention.display, "@mention{".concat(index, "}")); _addCommentText.current.mentions.push({ email: mention.id, name: mention.display.replace("@", "") }); } } else { setSingleLine(true); _reactMentionStyles["&multiLine"].control = { height: 35 }; _addCommentText.current = { mentions: [], text: "" }; } setCommentText(newValue); }, []); var _addComment = (0, react_2.useCallback)(function () { setlistItemCommentsState({ type: ListItemCommentsStateProvider_1.EListItemCommentsStateTypes.SET_COMMENT_ACTION, payload: ECommentAction_1.ECommentAction.ADD }); setlistItemCommentsState({ type: ListItemCommentsStateProvider_1.EListItemCommentsStateTypes.SET_ADD_COMMENT, payload: _addCommentText.current }); setSingleLine(true); setCommentText(""); }, []); var _searchData = function (search, callback) { var _searchPeople = function () { _peopleSearchService.searchPeople(search, 5, [peoplepicker_1.PrincipalType.User]) .then(function (res) { return res.map(function (user) { return ({ display: user.text, id: user.secondaryText }); }); }) .then(callback) .catch(function () { }); }; if (disableCallingGraph) { _searchPeople(); return; } // Try to get sugested users when user type '@' if (!search) { getSuggestions() .then(function (res) { return res.users.map(function (user) { return ({ display: user.displayName, id: user.mail }); }); }) .then(callback) .catch(function (error) { switch (error.statusCode) { case 403: case 404: // If the user is not allowed to call graph API (e.g. guest users), we need to use the People Search API setDisableCallingGraph(true); break; default: } }); } else { getUsers(search) .then(function (res) { return res.users.map(function (user) { return ({ display: user.displayName, id: user.mail }); }); }) .then(callback) .catch(function (error) { switch (error.statusCode) { case 403: // If the user is not allowed to call graph API (e.g. guest users), we need to use the People Search API setDisableCallingGraph(true); _searchPeople(); break; default: } }); } }; var renderSugestion = (0, react_2.useCallback)(function (suggestion) { var _user = { id: suggestion.id, displayName: suggestion.display, mail: suggestion.id, }; return (React.createElement(React.Fragment, null, React.createElement(Stack_1.Stack, { tokens: { padding: 5 }, styles: { root: { width: 260 } } }, React.createElement(Stack_1.Stack, { horizontal: true, horizontalAlign: "start", tokens: { childrenGap: 10 } }, React.createElement("img", { src: "".concat(constants_1.PHOTO_URL).concat(_user.mail), width: 30, height: 30, style: { borderRadius: "50%" }, alt: _user.displayName }), React.createElement(Stack_1.Stack, { styles: { root: { overflow: "hidden" } } }, React.createElement(Text_1.Text, { styles: { root: { fontWeight: 700 } }, variant: "smallPlus", nowrap: true }, _user.displayName), React.createElement(Text_1.Text, { variant: "small", nowrap: true }, _user.mail)))))); }, []); return (React.createElement(React.Fragment, null, React.createElement("div", { id: "renderSugestions", ref: function (el) { sugestionsContainer.current = el; } }), React.createElement("div", { className: componentClasses.container, style: { height: singleLine ? 35 : "unset" } }, React.createElement(react_mentions_1.MentionsInput, { value: commentText, onChange: _onChange, placeholder: strings.ListItemCommentsPlaceholder, style: _reactMentionStyles, suggestionsPortalHost: sugestionsContainer.current }, React.createElement(react_mentions_1.Mention, { trigger: "@", data: _searchData, renderSuggestion: renderSugestion, displayTransform: function (id, display) { return "@".concat(display); }, className: mentionsClasses.mention })), React.createElement(Stack_1.Stack, { horizontal: true, horizontalAlign: "end", tokens: { padding: 10 } }, React.createElement(Button_1.IconButton, { iconProps: { iconName: "send" }, title: "Send", onClick: function () { _addComment(); } }))))); }; exports.AddComment = AddComment; //# sourceMappingURL=AddComment.js.map