@selfcommunity/react-ui
Version:
React UI Components to integrate a Community created with SelfCommunity Platform.
197 lines (196 loc) • 14.3 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const tslib_1 = require("tslib");
const jsx_runtime_1 = require("react/jsx-runtime");
const lab_1 = require("@mui/lab");
const material_1 = require("@mui/material");
const system_1 = require("@mui/system");
const api_services_1 = require("@selfcommunity/api-services");
const react_core_1 = require("@selfcommunity/react-core");
const utils_1 = require("@selfcommunity/utils");
const react_1 = require("react");
const react_intl_1 = require("react-intl");
require("swiper/css");
const Errors_1 = require("../../constants/Errors");
const Pagination_1 = require("../../constants/Pagination");
const widget_1 = require("../../utils/widget");
const Widget_1 = tslib_1.__importDefault(require("../Widget"));
const constants_1 = require("./constants");
const Skeleton_1 = tslib_1.__importDefault(require("./Skeleton"));
const TabContentComponent_1 = tslib_1.__importDefault(require("./TabContentComponent"));
const types_1 = require("./types");
const HiddenPlaceholder_1 = tslib_1.__importDefault(require("../../shared/HiddenPlaceholder"));
const classes = {
root: `${constants_1.PREFIX}-root`,
content: `${constants_1.PREFIX}-content`,
title: `${constants_1.PREFIX}-title`,
tabsWrapper: `${constants_1.PREFIX}-tabs-wrapper`,
tabLabelWrapper: `${constants_1.PREFIX}-tab-label-wrapper`,
tabPanel: `${constants_1.PREFIX}-tab-panel`
};
const Root = (0, system_1.styled)(Widget_1.default, {
name: constants_1.PREFIX,
slot: 'Root',
overridesResolver: (_props, styles) => styles.root
})(() => ({}));
function EventMembersWidget(inProps) {
// PROPS
const props = (0, material_1.useThemeProps)({
props: inProps,
name: constants_1.PREFIX
});
const { event, eventId, userProps = {}, endpointQueryParams = { limit: 5, offset: Pagination_1.DEFAULT_PAGINATION_OFFSET }, cacheStrategy, dialogProps, limit = 5 } = props, rest = tslib_1.__rest(props, ["event", "eventId", "userProps", "endpointQueryParams", "cacheStrategy", "dialogProps", "limit"]);
// STATE
const [participants, dispatchParticipants] = (0, react_1.useReducer)(widget_1.dataWidgetReducer, {
isLoadingNext: false,
next: null,
cacheKey: react_core_1.SCCache.getWidgetStateCacheKey(react_core_1.SCCache.USER_PARTECIPANTS_EVENTS_STATE_CACHE_PREFIX_KEY, eventId || event.id),
cacheStrategy,
visibleItems: limit
}, widget_1.stateWidgetInitializer);
const [invited, dispatchInvited] = (0, react_1.useReducer)(widget_1.dataWidgetReducer, {
isLoadingNext: false,
next: null,
cacheKey: react_core_1.SCCache.getWidgetStateCacheKey(react_core_1.SCCache.USER_INVITED_EVENTS_STATE_CACHE_PREFIX_KEY, eventId || event.id),
cacheStrategy,
visibleItems: limit
}, widget_1.stateWidgetInitializer);
const [requests, dispatchRequests] = (0, react_1.useReducer)(widget_1.dataWidgetReducer, {
isLoadingNext: false,
next: null,
cacheKey: react_core_1.SCCache.getWidgetStateCacheKey(react_core_1.SCCache.USER_REQUESTS_EVENTS_STATE_CACHE_PREFIX_KEY, eventId || event.id),
cacheStrategy,
visibleItems: limit
}, widget_1.stateWidgetInitializer);
const [participantsCount, setParticipantsCount] = (0, react_1.useState)(participants.count);
const [invitedCount, setInvitedCount] = (0, react_1.useState)(invited.count);
const [requestsCount, setRequestsCount] = (0, react_1.useState)(requests.count);
const [requestsUsers, setRequestsUsers] = (0, react_1.useState)(requests.results);
const [tabValue, setTabValue] = (0, react_1.useState)(types_1.TabContentType.PARTICIPANTS);
const [refresh, setRefresh] = (0, react_1.useState)(null);
// CONTEXT
const scUserContext = (0, react_core_1.useSCUser)();
// HOOKS
const { scEvent } = (0, react_core_1.useSCFetchEvent)({ id: eventId, event });
// CONSTS
const hasAllow = (0, react_1.useMemo)(() => { var _a; return ((_a = scUserContext.user) === null || _a === void 0 ? void 0 : _a.id) === (scEvent === null || scEvent === void 0 ? void 0 : scEvent.managed_by.id); }, [scUserContext, scEvent]);
const title = (0, react_1.useMemo)(() => {
switch (tabValue) {
case types_1.TabContentType.REQUESTS:
return 'ui.eventMembersWidget.requests';
case types_1.TabContentType.INVITED:
return 'ui.eventMembersWidget.invited';
case types_1.TabContentType.PARTICIPANTS:
default:
return 'ui.eventMembersWidget.participants';
}
}, [tabValue]);
// CALLBACKS
const _initParticipants = (0, react_1.useCallback)(() => {
if (!participants.initialized && !participants.isLoadingNext) {
dispatchParticipants({ type: widget_1.actionWidgetTypes.LOADING_NEXT });
api_services_1.EventService.getUsersGoingToEvent(scEvent.id, Object.assign({}, endpointQueryParams))
.then((payload) => {
dispatchParticipants({ type: widget_1.actionWidgetTypes.LOAD_NEXT_SUCCESS, payload: Object.assign(Object.assign({}, payload), { initialized: true }) });
setParticipantsCount(payload.count);
})
.catch((error) => {
dispatchParticipants({ type: widget_1.actionWidgetTypes.LOAD_NEXT_FAILURE, payload: { errorLoadNext: error } });
utils_1.Logger.error(Errors_1.SCOPE_SC_UI, error);
});
}
}, [participants.isLoadingNext, participants.initialized, scEvent, endpointQueryParams, dispatchParticipants, setParticipantsCount]);
const _initInvited = (0, react_1.useCallback)(() => {
if (!invited.initialized && !invited.isLoadingNext && hasAllow) {
dispatchInvited({ type: widget_1.actionWidgetTypes.LOADING_NEXT });
api_services_1.EventService.getEventInvitedUsers(scEvent.id, Object.assign({}, endpointQueryParams))
.then((payload) => {
dispatchInvited({ type: widget_1.actionWidgetTypes.LOAD_NEXT_SUCCESS, payload: Object.assign(Object.assign({}, payload), { initialized: true }) });
setInvitedCount(payload.count);
})
.catch((error) => {
dispatchInvited({ type: widget_1.actionWidgetTypes.LOAD_NEXT_FAILURE, payload: { errorLoadNext: error } });
utils_1.Logger.error(Errors_1.SCOPE_SC_UI, error);
});
}
}, [invited.isLoadingNext, invited.initialized, scEvent, hasAllow, endpointQueryParams, dispatchInvited, setInvitedCount]);
const _initRequests = (0, react_1.useCallback)(() => {
if (!requests.initialized && !requests.isLoadingNext && hasAllow) {
dispatchRequests({ type: widget_1.actionWidgetTypes.LOADING_NEXT });
api_services_1.EventService.getEventWaitingApprovalSubscribers(scEvent.id, Object.assign({}, endpointQueryParams))
.then((payload) => {
dispatchRequests({ type: widget_1.actionWidgetTypes.LOAD_NEXT_SUCCESS, payload: Object.assign(Object.assign({}, payload), { initialized: true }) });
setRequestsCount(payload.count);
setRequestsUsers(payload.results);
})
.catch((error) => {
dispatchRequests({ type: widget_1.actionWidgetTypes.LOAD_NEXT_FAILURE, payload: { errorLoadNext: error } });
utils_1.Logger.error(Errors_1.SCOPE_SC_UI, error);
});
}
}, [requests.isLoadingNext, requests.initialized, scEvent, hasAllow, endpointQueryParams, dispatchRequests, setRequestsCount, setRequestsUsers]);
// EFFECTS
(0, react_1.useEffect)(() => {
let _t;
if (scUserContext.user && scEvent) {
_t = setTimeout(() => {
if (refresh === types_1.TabContentType.PARTICIPANTS) {
_initParticipants();
setRefresh(null);
}
else if (refresh === types_1.TabContentType.INVITED) {
_initInvited();
setRefresh(null);
}
else {
_initParticipants();
_initInvited();
_initRequests();
}
});
return () => {
clearTimeout(_t);
};
}
}, [scUserContext.user, scEvent, refresh, _initParticipants, _initInvited, _initRequests]);
(0, react_1.useEffect)(() => {
if (participants.initialized && scEvent && Boolean((eventId !== undefined && scEvent.id !== eventId) || (event && scEvent.id !== event.id))) {
dispatchParticipants({ type: widget_1.actionWidgetTypes.RESET, payload: {} });
dispatchRequests({ type: widget_1.actionWidgetTypes.RESET, payload: {} });
dispatchInvited({ type: widget_1.actionWidgetTypes.RESET, payload: {} });
}
}, [participants.initialized, scEvent, eventId, event, dispatchParticipants, dispatchInvited, dispatchRequests]);
// HANDLERS
const handleTabChange = (0, react_1.useCallback)((_evt, newTabValue) => {
setTabValue(newTabValue);
}, [setTabValue]);
const handleRefresh = (0, react_1.useCallback)((_tabValue) => {
if (_tabValue === types_1.TabContentType.PARTICIPANTS) {
dispatchParticipants({ type: widget_1.actionWidgetTypes.RESET });
}
else if (_tabValue === types_1.TabContentType.INVITED) {
dispatchInvited({ type: widget_1.actionWidgetTypes.RESET });
}
setRefresh(_tabValue);
}, [dispatchParticipants, dispatchInvited, setRefresh]);
if (!scUserContext.user) {
return (0, jsx_runtime_1.jsx)(HiddenPlaceholder_1.default, {});
}
if (!scEvent ||
!participants.initialized ||
(scEvent && ((eventId !== undefined && scEvent.id !== eventId) || (event && scEvent.id !== event.id))) ||
(tabValue === types_1.TabContentType.PARTICIPANTS && participants.isLoadingNext && !participants.initialized)) {
return (0, jsx_runtime_1.jsx)(Skeleton_1.default, {});
}
return ((0, jsx_runtime_1.jsx)(Root, Object.assign({ className: classes.root }, rest, { children: (0, jsx_runtime_1.jsxs)(material_1.CardContent, Object.assign({ className: classes.content }, { children: [(0, jsx_runtime_1.jsx)(material_1.Typography, Object.assign({ variant: "h5", className: classes.title }, { children: (0, jsx_runtime_1.jsx)(react_intl_1.FormattedMessage, { id: title, defaultMessage: title }) })), (0, jsx_runtime_1.jsxs)(lab_1.TabContext, Object.assign({ value: tabValue }, { children: [(0, jsx_runtime_1.jsxs)(lab_1.TabList, Object.assign({ className: classes.tabsWrapper, onChange: handleTabChange, textColor: "primary", indicatorColor: "primary", variant: "fullWidth" }, { children: [(0, jsx_runtime_1.jsx)(material_1.Tab, { label: (0, jsx_runtime_1.jsxs)(material_1.Stack, Object.assign({ className: classes.tabLabelWrapper }, { children: [(0, jsx_runtime_1.jsx)(material_1.Typography, Object.assign({ variant: "h3" }, { children: participantsCount })), (0, jsx_runtime_1.jsx)(material_1.Typography, Object.assign({ variant: "subtitle2" }, { children: (0, jsx_runtime_1.jsx)(react_intl_1.FormattedMessage, { id: "ui.eventMembersWidget.participants", defaultMessage: "ui.eventMembersWidget.participants" }) }))] })), value: types_1.TabContentType.PARTICIPANTS }), hasAllow && ((0, jsx_runtime_1.jsx)(material_1.Tab, { label: (0, jsx_runtime_1.jsxs)(material_1.Stack, Object.assign({ className: classes.tabLabelWrapper }, { children: [(0, jsx_runtime_1.jsx)(material_1.Typography, Object.assign({ variant: "h3" }, { children: invitedCount })), (0, jsx_runtime_1.jsx)(material_1.Typography, Object.assign({ variant: "subtitle2" }, { children: (0, jsx_runtime_1.jsx)(react_intl_1.FormattedMessage, { id: "ui.eventMembersWidget.invited", defaultMessage: "ui.eventMembersWidget.invited" }) }))] })), value: types_1.TabContentType.INVITED })), hasAllow && ((0, jsx_runtime_1.jsx)(material_1.Tab, { label: (0, jsx_runtime_1.jsxs)(material_1.Stack, Object.assign({ className: classes.tabLabelWrapper }, { children: [(0, jsx_runtime_1.jsx)(material_1.Typography, Object.assign({ variant: "h3" }, { children: requestsCount })), (0, jsx_runtime_1.jsx)(material_1.Typography, Object.assign({ variant: "subtitle2" }, { children: (0, jsx_runtime_1.jsx)(react_intl_1.FormattedMessage, { id: "ui.eventMembersWidget.requests", defaultMessage: "ui.eventMembersWidget.requests" }) }))] })), value: types_1.TabContentType.REQUESTS }))] })), (0, jsx_runtime_1.jsx)(lab_1.TabPanel, Object.assign({ value: types_1.TabContentType.PARTICIPANTS, className: classes.tabPanel }, { children: (0, jsx_runtime_1.jsx)(TabContentComponent_1.default, { tabValue: types_1.TabContentType.PARTICIPANTS, state: participants, dispatch: dispatchParticipants, userProps: userProps, dialogProps: dialogProps, handleRefresh: handleRefresh }) })), hasAllow && ((0, jsx_runtime_1.jsx)(lab_1.TabPanel, Object.assign({ value: types_1.TabContentType.INVITED, className: classes.tabPanel }, { children: (0, jsx_runtime_1.jsx)(TabContentComponent_1.default, { tabValue: types_1.TabContentType.INVITED, state: invited, dispatch: dispatchInvited, userProps: userProps, dialogProps: dialogProps, actionProps: {
scEvent,
setCount: setInvitedCount
}, handleRefresh: handleRefresh }) }))), hasAllow && ((0, jsx_runtime_1.jsx)(lab_1.TabPanel, Object.assign({ value: types_1.TabContentType.REQUESTS, className: classes.tabPanel }, { children: (0, jsx_runtime_1.jsx)(TabContentComponent_1.default, { tabValue: types_1.TabContentType.REQUESTS, state: requests, dispatch: dispatchRequests, userProps: userProps, dialogProps: dialogProps, actionProps: {
scEvent,
count: requestsCount,
setCount: setRequestsCount,
users: requestsUsers,
setUsers: setRequestsUsers
}, handleRefresh: handleRefresh }) })))] }))] })) })));
}
exports.default = EventMembersWidget;