{"version":3,"sources":["types.ts","modules/expression-helpers/actions.ts","modules/resync-requests/actions.ts","modules/column-mappings/selectors.ts","modules/comments/actions.ts","modules/api/request.ts","modules/auth/selectors.ts","modules/expression-helpers/selectors.ts","modules/api/access-management.ts","modules/api/auth.ts","modules/api/column-mappings.ts","modules/api/comments.ts","modules/api/configs.ts","modules/api/connectors.ts","modules/api/delete-resources.ts","modules/api/dry-runs.ts","modules/api/expression-helpers.ts","modules/api/groups.ts","modules/api/jobs.ts","modules/api/networks.ts","modules/api/notifications.ts","modules/api/organizational-overviews.ts","modules/api/resync-requests.ts","modules/api/role-mappings.ts","modules/api/revisions.ts","modules/api/sync-protocols.ts","modules/api/synced-users.ts","modules/api/index.ts","modules/dry-runs/actions.ts","modules/synced-users/actions.ts","components/logo/logo.module.css","modules/group-mappings/selectors.ts","modules/revisions/actions.ts","modules/api/group-mappings.ts","modules/auth/tokens.ts","modules/organizational-overviews/actions.ts","modules/sync-protocols/actions.ts","modules/routes.ts","../node_modules/@speakap/expression-engine/node_modules/escodegen/node_modules/source-map/lib/source-map sync","components/column-mappings/column-mappings-form/column-mappings-field-examples.tsx","components/column-mappings/column-mappings-form/column-mappings-form-input.tsx","components/column-mappings/column-mappings-form/column-mappings-form-array.tsx","components/column-mappings/column-mappings-form/column-mappings-form-radio.tsx","components/column-mappings/column-mappings-form/column-mappings-utils.tsx","components/column-mappings/column-mappings-form/column-mappings-form-object.tsx","modules/role-mappings/selectors.ts","modules/sync-protocols/selectors.ts","modules/synced-users/selectors.ts","components/logo/logo.tsx","components/logo/index.tsx","components/logo/Speakap user sync - colour.png","modules/notifications/actions.ts","modules/configs/actions.ts","modules/group-mappings/actions.ts","components/login/login.tsx","components/auth/auth.tsx","modules/history.ts","modules/access-management/reducer.ts","modules/auth/reducer.ts","modules/column-mappings/reducer.ts","modules/comments/reducer.ts","modules/configs/reducer.ts","modules/connectors/reducer.ts","modules/delete-resources/reducer.ts","modules/dry-runs/reducer.ts","modules/expression-helpers/reducer.ts","modules/group-mappings/reducer.ts","modules/networks/reducer.ts","modules/networks-recent/reducer.ts","modules/notifications/reducer.ts","modules/organizational-overviews/reducer.ts","modules/resync-requests/reducer.ts","modules/revisions/reducer.ts","modules/role-mappings/reducer.ts","modules/runs/reducer.ts","modules/sync-protocols/reducer.ts","modules/synced-users/reducer.ts","modules/reducer.ts","modules/store.ts","index.tsx","modules/connectors/actions.ts","modules/column-mappings/actions.ts","modules/auth/actions.ts","modules/delete-resources/actions.ts","components/column-mappings/column-mappings-form/column-mappings-form.module.css","modules/connectors/selectors.ts","modules/networks/actions.ts","modules/configs/selectors.ts","modules/access-management/actions.ts","modules/runs/actions.ts","modules/role-mappings/actions.ts"],"names":["LOADING_STATES","FETCH_EXPRESSION_HELPERS_REQUEST","FETCH_EXPRESSION_HELPERS_SUCCESS","FETCH_EXPRESSION_HELPERS_ERROR","fetchExpressionHelpers","async","dispatch","getState","state","selectExpressionHelpersLoadingState","INITIAL","selectExpressionHelpersItems","type","expressionHelpers","getExpressionHelpers","expressionHelpersLookup","mapHelpersToLookup","payload","staticFunctions","functions","CREATE_RESYNC_REQUEST_REQUEST","CREATE_RESYNC_REQUEST_SUCCESS","CREATE_RESYNC_REQUEST_ERROR","CREATE_RESYNC_REQUEST_RESET","CONFIRM_RESYNC_REQUEST_REQUEST","CONFIRM_RESYNC_REQUEST_SUCCESS","CONFIRM_RESYNC_REQUEST_ERROR","resetRequest","createRequest","networkId","syncedUser","createResyncRequest","id","error","notification","message","get","Error","confirmRequest","resyncToken","confirmResyncRequest","success","selectColumnMappings","columnMappings","selectColumnMappingsItems","createSelector","items","selectColumnMappingsResults","results","selectColumnMappingsList","map","selectEdit","loadingState","edit","selectEditLoadingState","selectApplyColumnMapping","applyColumnMapping","selectApplyColumnMappingUsers","users","selectApplyColumnMappingConfigName","configName","selectColumnMappingsNetworkId","FETCH_COMMENTS_REQUEST","FETCH_COMMENTS_SUCCESS","FETCH_COMMENTS_ERROR","SUBMIT_COMMENT_REQUEST","SUBMIT_COMMENT_SUCCESS","SUBMIT_COMMENT_ERROR","fetchComments","comments","getComments","createComment","comment","newComment","postComment","REACT_APP_USER_SYNC_API","process","securedAxios","axios","create","baseURL","interceptors","request","use","config","headers","authorization","getToken","selectAuth","auth","selectUser","user","selectUserLoadingState","userLoadingState","selectLogoutLoadingState","logoutLoadingState","selectGoogleLoadingState","googleLoadingState","selectLoginLoadingState","loginLoadingState","selectExpressionHelpers","getSpeakapUsers","then","data","createSpeakapUser","speakapUser","post","updateSpeakapUser","put","deleteSpeakapUser","userId","delete","getUserSyncUser","getAuthenticationUrl","redirectUri","encodeURIComponent","url","logoutUserSyncUser","removeToken","loginSpeakapUser","username","password","accessToken","getColumnMappings","restParams","params","postNewColumnMapping","columnMapping","postUpdatedColumnMapping","activeRevisionId","getConfigs","postNewConfig","postUpdatedConfig","syncUsers","dryRunToken","skipMismatch","name","toString","getConnectors","getImportUsers","postNewConnector","connector","postUpdatedConnector","extendAxiosConfig","axiosConfig","ConnectorType","ManualUpload","extendManualUpload","formData","FormData","append","file","postRuns","extendedAxiosConfig","method","getConnectorStats","connectorId","deleteResourceByName","resourceType","resourceName","getDryRuns","getGroups","postJob","job","patchJob","jobId","patch","deleteJob","getNetworks","limit","offset","getNetworkRoles","roles","getNotifications","postNewNotification","updateNotification","deleteNotification","notificationId","getSubscribers","postNewSubscriber","subscriber","putSubscriber","sendEmailsForNotification","status","email","sendScheduleNotification","jobPost","patchScheduleNotification","jobPatch","getEmailsNotificationOverview","emails","getOrganizationalOverview","syncedUserId","getRoleMappings","postNewRoleMapping","roleMapping","postUpdatedRoleMapping","getColumnMappingsRevisions","columnMappingsName","mappings","getGroupMappingsRevisions","groupMappingsName","getGroupMappingsByName","getRoleMappingsRevisions","roleMappingsName","getRoleMappingsByName","getConnectorsRevisions","connectorsName","getConnectorsByName","getConfigsRevisions","configsName","getConfigsByName","getSyncProtocols","protocols","getSyncRequestHistories","syncProtocolId","syncRequestHistories","getSyncedUsers","syncedUsers","getSyncHistory","syncHistory","DISMISS_RESULTS","FETCH_RESULTS_REQUEST","FETCH_RESULTS_SUCCESS","FETCH_RESULTS_ERROR","dismissResults","fetchResults","errorMessage","FETCH_SYNCED_USERS_REQUEST","FETCH_SYNCED_USERS_SUCCESS","FETCH_SYNCED_USERS_ERROR","FETCH_SYNCED_USERS_BATCH","fetchSyncedUsers","currentNetworkId","selectSyncedUsersNetworkId","hasMoreSyncedUsers","newSyncedUsers","length","module","exports","selectGroupMappings","groupMappings","selectBuilder","builder","selectUpdateSuggestions","updateSuggestions","selectUpdateSuggestionsLoadingState","selectSubjects","subjects","selectObjects","objects","selectGroupMappingsItems","selectGroupMappingsResults","selectGroupMappingsList","selectGroups","groups","selectGroupsItems","selectGroupsResults","selectGroupsList","selectGroupsLoadingState","selectGroupsNetworkId","selectGroupMappingsNetworkId","selectPrepareForm","prepareForm","selectPrepareFormLoadingState","selectPrepareFormScimUsers","scimUsers","FETCH_REVISIONS_REQUEST","FETCH_REVISIONS_SUCCESS","FETCH_REVISIONS_ERROR","fetchRevisions","getResources","resources","fetchColumnMappingsRevisions","fetchGroupMappingsRevisions","fetchRoleMappingsRevisions","fetchConnectorsRevisions","fetchConfigsRevisions","getGroupMappings","postNewGroupMapping","groupMapping","postUpdatedGroupMapping","getGroupMappingRules","rules","URL","location","href","searchParams","history","replaceState","localStorage","setItem","getItem","removeItem","FETCH_ORGANIZATIONAL_OVERVIEW_REQUEST","FETCH_ORGANIZATIONAL_OVERVIEW_SUCCESS","FETCH_ORGANIZATIONAL_OVERVIEW_ERROR","fetchOrganizationalOverview","FETCH_SYNC_PROTOCOLS_REQUEST","FETCH_SYNC_PROTOCOLS_SUCCESS","FETCH_SYNC_PROTOCOLS_ERROR","fetchSyncProtocols","onMount","selectSyncProtocolsOffset","response","hasMore","addRegexp","route","regexp","pathToRegexp","pathname","end","columnMappingItem","label","columnMappingName","connectorItem","connectorName","groupMappingItem","groupMappingName","roleMappingItem","roleMappingName","invitationMessages","newColumnMappingItem","newConnectorItem","newGroupMappingItem","newRoleMappingItem","configItem","children","configOrganizationalOverview","pathId","configs","schedule","syncProtocols","notifications","routes","accessManagement","webpackEmptyContext","req","e","code","keys","resolve","FieldExample","selector","value","useDispatch","useSelector","selectConfigName","importUsers","useEffect","prepareColumnMappingExamples","SPEAKAP_PARAM_BAG_SCHEMA","FETCHING","template","set","externalId","userName","mapColumns","flattenScimUser","examples","uniq","compact","join","React","createElement","className","styles","applyColumnMappingError","createInputField","field","props","form","removeButton","modalButton","key","required","modal","example","initialValue","push","Row","align","gutter","lg","Col","inputLabel","Badge","dot","Tooltip","title","placement","InfoCircleOutlined","Form","Item","extra","getFieldValue","undefined","FieldExamples","slice","applyColumnMappingWarning","WarningOutlined","Input","placeholder","addonAfter","addonBefore","createArrayField","fields","options","setDirty","setItems","useState","setFieldsValue","arrayLabel","justify","Button","onClick","addItem","Fragment","item","index","arrayWrapper","size","shape","icon","CloseOutlined","itemIndex","newItems","filter","formItems","fieldKey","fieldSelector","restField","selectPrimary","valuePropName","Checkbox","createRadioButton","SCIM_ENTERPRISE_USER_SCHEMA","func","validations","validatePrimary","restProps","option","replace","fieldOption","FieldComponent","removeExtrasFromColumnMappingTemplate","additionalFields","extras","defaultRole","login","birthday","sms","activityControlExempt","isEmpty","omit","getFields","buildColumnMappingBody","values","fixedValues","fromPairs","toPairs","RegExp","columnMappingBody","unflatten","delimiter","extendColumnMappingTemplateWithExtras","validateColumnMappingBody","_option$validations","some","primary","selectRoleMappings","roleMappings","selectRoleMappingsItems","selectRoleMappingsResults","selectRoleMappingsList","selectRoleMappingsNetworkId","selectSyncProtocolState","selectSyncProtocolLoadingState","selectSyncProtocols","selectSyncProtocolsHasMore","selectSyncedUsersState","selectSyncedUsersLoadingState","selectSyncedUsers","selectIsLoadingMore","isLoadingMore","Logo","Link","to","cx","logo","medium","large","image","alt","src","userSyncLogo","FETCH_NOTIFICATIONS_REQUEST","FETCH_NOTIFICATIONS_SUCCESS","FETCH_NOTIFICATIONS_ERROR","FETCH_NETWORK_SUBSCRIBERS_REQUEST","FETCH_NETWORK_SUBSCRIBERS_SUCCESS","FETCH_NETWORK_SUBSCRIBERS_ERROR","SUBMIT_NOTIFICATION_REQUEST","SUBMIT_NOTIFICATION_SUCCESS","SUBMIT_NOTIFICATION_ERROR","UPDATE_NOTIFICATION_REQUEST","UPDATE_NOTIFICATION_SUCCESS","UPDATE_NOTIFICATION_ERROR","DELETE_NOTIFICATION_REQUEST","DELETE_NOTIFICATION_SUCCESS","DELETE_NOTIFICATION_ERROR","SUBMIT_SUBSCRIBER_REQUEST","SUBMIT_SUBSCRIBER_SUCCESS","SUBMIT_SUBSCRIBER_ERROR","SEND_EMAIL_NOTIFICATION_REQUEST","SEND_EMAIL_NOTIFICATION_SUCCESS","SEND_EMAIL_NOTIFICATION_ERROR","SEND_EMAIL_NOTIFICATION_RESET","SCHEDULE_NOTIFICATION_REQUEST","SCHEDULE_NOTIFICATION_SUCCESS","SCHEDULE_NOTIFICATION_ERROR","SET_EDIT_SUBSCRIBER","SET_EDIT_NOTIFICATION","setEditSubscriber","mode","setEditNotification","fetchNotifications","submitNewNotification","newNotification","postUpdateNotification","enhancedNotification","postDeleteNotification","sendEmailsNotification","notificationObject","warning","sendEmailsReset","fetchNetworkSubscribers","subscribers","submitNewSubscriber","newSubscriber","updateSubscriber","scheduleNotification","scheduleObject","updateScheduleNotification","active","CREATE_NEW_CONFIG_START","CREATE_NEW_CONFIG_STOP","EDIT_CONFIG_START","EDIT_CONFIG_STOP","FETCH_CONFIGS_REQUEST","FETCH_CONFIGS_SUCCESS","FETCH_CONFIGS_ERROR","SET_SCHEDULE_REQUEST","SET_SCHEDULE_SUCCESS","SET_SCHEDULE_ERROR","SYNC_USERS_REQUEST","SYNC_USERS_SUCCESS","SYNC_USERS_ERROR","SUBMIT_NEW_CONFIG_REQUEST","SUBMIT_NEW_CONFIG_SUCCESS","SUBMIT_NEW_CONFIG_ERROR","SUBMIT_UPDATED_CONFIG_REQUEST","SUBMIT_UPDATED_CONFIG_SUCCESS","SUBMIT_UPDATED_CONFIG_ERROR","SET_SELECTED_CONFIG","UNSET_SCHEDULE_REQUEST","UNSET_SCHEDULE_SUCCESS","UNSET_SCHEDULE_ERROR","UPDATE_EDIT_CONFIG","setSelectedConfig","createNewConfigStart","createNewConfigStop","editConfigStart","editConfigStop","fetchConfigs","setNewSchedule","resourceIdentifier","updateSchedule","jobRequest","submitNewConfig","submitUpdatedConfig","syncUsersToSpeakap","LOCKED","updateEditConfig","updates","FETCH_GROUP_MAPPINGS_REQUEST","FETCH_GROUP_MAPPINGS_SUCCESS","FETCH_GROUP_MAPPINGS_ERROR","FETCH_SUGGESTIONS_REQUEST","FETCH_SUGGESTIONS_ERROR","SET_SUGGESTIONS","UPDATE_SUGGESTIONS_REQUEST","UPDATE_SUGGESTIONS_ERROR","UPDATE_SUGGESTIONS_SUCCESS","SUBMIT_NEW_GROUP_MAPPING_REQUEST","SUBMIT_NEW_GROUP_MAPPING_SUCCESS","SUBMIT_UPDATED_GROUP_MAPPING_REQUEST","SUBMIT_UPDATED_GROUP_MAPPING_SUCCESS","SUBMIT_GROUP_MAPPING_ERROR","FETCH_GROUPS_REQUEST","FETCH_GROUPS_SUCCESS","FETCH_GROUPS_ERROR","PREPARE_FORM_REQUEST","PREPARE_FORM_SUCCESS","PREPARE_FORM_ERROR","fetchGroupMappings","fetchGroups","force","submitNewGroupMapping","submitUpdatedGroupMapping","goBack","prepareConnectors","selectConnectorsItems","fetchImportUsers","getSubjectKey","without","prepareGroupMappingsForm","selectedConfig","loadGroups","getSelectedConfig","selectConfigItems","editConfig","selectEditItem","resourcesToPrepare","fetchColumnMappings","Promise","all","updatedState","selectImportUsersItems","utils","isArray","paramBag","sortBy","subject","toLowerCase","Login","useForm","validateFields","style","marginTop","span","alignItems","display","justifyContent","onFinish","onSubmit","loginUser","layout","htmlType","LoginOutlined","loading","Divider","GoogleOutlined","block","backgroundColor","color","redirectToGoogle","Auth","fetchUserSyncUser","SUCCESSFUL","ERROR","Spin","delay","createBrowserHistory","initialState","deleteUser","editUser","networksReducer","action","produce","draft","FETCH_SPEAKAP_USERS_REQUEST","FETCH_SPEAKAP_USERS_SUCCESS","FETCH_SPEAKAP_USERS_ERROR","SUBMIT_SPEAKAP_USER_REQUEST","SUBMIT_SPEAKAP_USER_ERROR","SUBMIT_SPEAKAP_USER_SUCCESS","SET_EDIT_SPEAKAP_USER","UPDATE_SPEAKAP_USER_SUCCESS","DELETE_SPEAKAP_USER_REQUEST","DELETE_SPEAKAP_USER_SUCCESS","DELETE_SPEAKAP_USER_ERROR","FETCH_USERSYNC_USER_REQUEST","FETCH_USERSYNC_USER_SUCCESS","FETCH_USERSYNC_USER_ERROR","LOGOUT_USERSYNC_USER_REQUEST","LOGOUT_USERSYNC_USER_SUCCESS","LOGOUT_USERSYNC_USER_ERROR","FETCH_GOOGLE_URL_REQUEST","FETCH_GOOGLE_URL_SUCCESS","FETCH_GOOGLE_URL_ERROR","LOGIN_SPEAKAP_USER_REQUEST","LOGIN_SPEAKAP_USER_SUCCESS","LOGIN_SPEAKAP_USER_ERROR","columnMappingsReducer","FETCH_COLUMN_MAPPINGS_REQUEST","FETCH_COLUMN_MAPPINGS_SUCCESS","dictionary","keyBy","Object","sort","FETCH_COLUMN_MAPPINGS_ERROR","APPLY_COLUMN_MAPPINGS_REQUEST","APPLY_COLUMN_MAPPINGS_SUCCESS","APPLY_COLUMN_MAPPINGS_ERROR","SUBMIT_NEW_COLUMN_MAPPING_REQUEST","SUBMIT_UPDATED_COLUMN_MAPPING_REQUEST","SUBMIT_NEW_COLUMN_MAPPING_SUCCESS","SUBMIT_UPDATED_COLUMN_MAPPING_SUCCESS","includes","SUBMIT_COLUMN_MAPPING_ERROR","DELETE_RESOURCE_SUCCESS","submitLoadingState","revisionsReducer","editItem","newItem","stats","atime","filename","mtime","FETCH_CONNECTORS_REQUEST","FETCH_CONNECTORS_SUCCESS","connectors","FETCH_CONNECTORS_ERROR","FETCH_IMPORT_USERS_REQUEST","SUBMIT_RUNS_SUCCESS","FETCH_IMPORT_USERS_SUCCESS","FETCH_IMPORT_USERS_ERROR","SUBMIT_NEW_CONNECTOR_REQUEST","SUBMIT_UPDATED_CONNECTOR_REQUEST","SUBMIT_NEW_CONNECTOR_SUCCESS","SUBMIT_UPDATED_CONNECTOR_SUCCESS","SUBMIT_CONNECTOR_ERROR","FETCH_CONNECTOR_STATS_REQUEST","FETCH_CONNECTOR_STATS_SUCCESS","FETCH_CONNECTOR_STATS_ERROR","DELETE_RESOURCE_REQUEST","DELETE_RESOURCE_ERROR","groupsMap","currentUsers","available","inactiveUsers","invalidRoles","logEntries","missingGroups","speakapSyncRequests","showResults","getMissingGroups","missingGroupLogEntries","logEntry","groupBy","groupId","group","getInvalidRoles","invalidRoleLogEntries","roleId","role","getInactiveUsers","LOCATION_CHANGE","groupMappingsReducer","sortedGroups","parentId","parent","activeNetworkId","activeNetworkName","activeNetworkSubdomain","totalItems","FETCH_NETWORKS_SUCCESS","FETCH_NETWORKS_ERROR","FETCH_NETWORKS_PARTIAL_SUCCESS","FETCH_NETWORKS_PARTIAL_ERROR","SET_ACTIVE_NETWORK","networkName","networkSubdomain","FETCH_NETWORK_ROLES_REQUEST","FETCH_NETWORK_ROLES_SUCCESS","FETCH_NETWORK_ROLES_ERROR","lastActive","Date","toISOString","editNotification","editSubscriber","sendNotification","organizationalOverviewReducer","confirm","resyncRequestsReducer","resyncResponse","syncProtocol","roleMappingsReducer","FETCH_ROLE_MAPPINGS_REQUEST","FETCH_ROLE_MAPPINGS_SUCCESS","FETCH_ROLE_MAPPINGS_ERROR","SUBMIT_NEW_ROLE_MAPPING_REQUEST","SUBMIT_UPDATED_ROLE_MAPPING_REQUEST","SUBMIT_NEW_ROLE_MAPPING_SUCCESS","SUBMIT_UPDATED_ROLE_MAPPING_SUCCESS","SUBMIT_ROLE_MAPPING_ERROR","SUBMIT_RUNS_REQUEST","SUBMIT_RUNS_ERROR","syncProtocolsReducer","syncedUsersReducer","reducer","combineReducers","scheduleLoadingState","newConfig","updatedConfig","replaceField","deleteResources","dryRuns","networks","networksRecent","organizationalOverview","resyncRequests","revisions","router","connectRouter","runs","persistConfig","storage","whitelist","persistedReducer","persistReducer","store","createStore","composeWithDevTools","applyMiddleware","routerMiddleware","thunk","persistor","persistStore","LoadableRouter","loadable","ReactDOM","render","ConfigProvider","theme","token","colorLink","colorPrimary","colorText","colorTextHeading","fontFamily","Provider","PersistGate","ConnectedRouter","document","querySelector","fetchConnectors","selectConnectorsNetworkId","currentConnectorId","selectImportUsersConnectorId","NOT_FOUND","runsErrorMessage","submitRuns","submitNewConnector","submitUpdatedConnector","fetchConnectorStats","submitNewColumnMapping","submitUpdatedColumnMapping","currentConfigName","selectEditItemConfig","logoutUser","origin","window","deleteResource","selectConnectors","selectConnectorsResults","selectConnectorsList","selectImportUsers","selectImportUsersLoadingState","selectConnectorStats","selectConnectorStatsValue","fetchNetworks","allNetworks","hasMoreNetworks","newNetworks","fetchNetworkRoles","setActiveNetwork","selectConfigsState","selectConfigResults","selectConfig","find","selectConfigsList","selectConfigsLoadingState","selectEditItemLoadingState","selectScheduleLoadingState","selectConnectorName","selectColumnMappingName","selectGroupMappingName","selectRoleMappingName","selectIsCreatingConfig","selectIsSubmittingNewConfig","selectScheduledStatus","syncOnUpload","selectSyncUsersLoadingState","setEditSpeakapUser","fetchSpeakapUsers","submitSpeakapUser","postUpdateSpeakapUser","postDeleteSpeakapUser","fetchRoleMappings","submitNewRoleMapping","submitUpdatedRoleMapping"],"mappings":"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","file":"static/js/main.5b12a1cd.chunk.js","sourcesContent":["export enum LOADING_STATES {\n INITIAL = \"INITIAL\",\n FETCHING = \"FETCHING\",\n SUCCESSFUL = \"SUCCESSFUL\",\n ERROR = \"ERROR\",\n}\n","import { ExpressionHelpersLookup } from \"@speakap/types\";\nimport { ThunkAction } from \"redux-thunk\";\nimport { mapHelpersToLookup } from \"@speakap/expression-engine\";\nimport staticFunctions from \"@speakap/expression-engine/dist/functions.json\";\n\nimport { ApplicationState } from \"../reducer\";\nimport { LOADING_STATES } from \"../../types\";\nimport { getExpressionHelpers } from \"../api\";\nimport { selectExpressionHelpersItems, selectExpressionHelpersLoadingState } from \"./selectors\";\n\nexport const FETCH_EXPRESSION_HELPERS_REQUEST = \"FETCH_EXPRESSION_HELPERS_REQUEST\";\nexport const FETCH_EXPRESSION_HELPERS_SUCCESS = \"FETCH_EXPRESSION_HELPERS_SUCCESS\";\nexport const FETCH_EXPRESSION_HELPERS_ERROR = \"FETCH_EXPRESSION_HELPERS_ERROR\";\n\ninterface FetchExpressionHelpersRequestAction {\n type: typeof FETCH_EXPRESSION_HELPERS_REQUEST;\n}\n\ninterface FetchExpressionHelpersSuccessAction {\n type: typeof FETCH_EXPRESSION_HELPERS_SUCCESS;\n payload: ExpressionHelpersLookup;\n}\n\ninterface FetchExpressionHelpersErrorAction {\n type: typeof FETCH_EXPRESSION_HELPERS_ERROR;\n payload: ExpressionHelpersLookup;\n}\n\nexport type ExpressionHelpersActions =\n | FetchExpressionHelpersRequestAction\n | FetchExpressionHelpersSuccessAction\n | FetchExpressionHelpersErrorAction;\n\ntype Thunk = ThunkAction, ApplicationState, void, ExpressionHelpersActions>;\n\nexport const fetchExpressionHelpers = (): Thunk => async (\n dispatch,\n getState,\n) => {\n const state = getState();\n const loadingState = selectExpressionHelpersLoadingState(state);\n if (loadingState !== LOADING_STATES.INITIAL) {\n return selectExpressionHelpersItems(state);\n }\n dispatch({\n type: FETCH_EXPRESSION_HELPERS_REQUEST,\n });\n try {\n const expressionHelpers = await getExpressionHelpers();\n const expressionHelpersLookup = mapHelpersToLookup(expressionHelpers);\n dispatch({\n payload: expressionHelpersLookup,\n type: FETCH_EXPRESSION_HELPERS_SUCCESS,\n });\n return expressionHelpersLookup;\n } catch {\n const expressionHelpersLookup = mapHelpersToLookup(staticFunctions.functions);\n dispatch({\n payload: expressionHelpersLookup,\n type: FETCH_EXPRESSION_HELPERS_ERROR,\n });\n return expressionHelpersLookup;\n }\n};\n","import { SyncProtocol, SyncedUser, ResyncResponse, SyncRequestHistory } from \"@speakap/types\";\nimport { ThunkAction } from \"redux-thunk\";\nimport { get } from \"lodash\";\nimport { notification } from \"antd\";\n\nimport { ApplicationState } from \"../reducer\";\nimport { createResyncRequest, confirmResyncRequest } from \"../api\";\n\nexport const CREATE_RESYNC_REQUEST_REQUEST = \"CREATE_RESYNC_REQUEST_REQUEST\";\nexport const CREATE_RESYNC_REQUEST_SUCCESS = \"CREATE_RESYNC_REQUEST_SUCCESS\";\nexport const CREATE_RESYNC_REQUEST_ERROR = \"CREATE_RESYNC_REQUEST_ERROR\";\nexport const CREATE_RESYNC_REQUEST_RESET = \"CREATE_RESYNC_REQUEST_RESET\";\n\nexport const CONFIRM_RESYNC_REQUEST_REQUEST = \"CONFIRM_RESYNC_REQUEST_REQUEST\";\nexport const CONFIRM_RESYNC_REQUEST_SUCCESS = \"CONFIRM_RESYNC_REQUEST_SUCCESS\";\nexport const CONFIRM_RESYNC_REQUEST_ERROR = \"CONFIRM_RESYNC_REQUEST_ERROR\";\n\ninterface CreateResyncRequestRequestAction {\n type: typeof CREATE_RESYNC_REQUEST_REQUEST;\n payload: SyncedUser;\n}\n\ninterface CreateResyncRequestSuccessAction {\n type: typeof CREATE_RESYNC_REQUEST_SUCCESS;\n payload: ResyncResponse;\n}\n\ninterface CreateResyncRequestErrorAction {\n type: typeof CREATE_RESYNC_REQUEST_ERROR;\n}\n\ninterface CreateResyncRequestResetAction {\n type: typeof CREATE_RESYNC_REQUEST_RESET;\n}\n\ninterface ConfirmResyncRequestRequestAction {\n type: typeof CONFIRM_RESYNC_REQUEST_REQUEST;\n}\n\ninterface ConfirmResyncRequestSuccessAction {\n type: typeof CONFIRM_RESYNC_REQUEST_SUCCESS;\n payload: {\n syncProtocol: SyncProtocol;\n syncRequestHistories: Array;\n };\n}\n\ninterface ConfirmResyncRequestErrorAction {\n type: typeof CONFIRM_RESYNC_REQUEST_ERROR;\n}\n\nexport type ResyncRequestsActions =\n | CreateResyncRequestSuccessAction\n | CreateResyncRequestRequestAction\n | CreateResyncRequestErrorAction\n | CreateResyncRequestResetAction\n | ConfirmResyncRequestSuccessAction\n | ConfirmResyncRequestRequestAction\n | ConfirmResyncRequestErrorAction;\n\nexport const resetRequest = (): CreateResyncRequestResetAction => ({\n type: \"CREATE_RESYNC_REQUEST_RESET\",\n});\n\ntype Thunk = ThunkAction;\n\nexport const createRequest = (\n networkId: string,\n syncedUser: SyncedUser,\n): Thunk> => async dispatch => {\n try {\n dispatch({ payload: syncedUser, type: CREATE_RESYNC_REQUEST_REQUEST });\n\n const response = await createResyncRequest(networkId, syncedUser.id);\n dispatch({ payload: response, type: CREATE_RESYNC_REQUEST_SUCCESS });\n } catch (error) {\n notification.error({\n message: get(\n error,\n [\"response\", \"data\"],\n error instanceof Error ? error.message : \"Error\",\n ),\n });\n dispatch({\n message: error instanceof Error ? error.message : \"Error\",\n type: CREATE_RESYNC_REQUEST_ERROR,\n });\n }\n};\n\nexport const confirmRequest = (\n networkId: string,\n resyncToken: string,\n): Thunk> => async dispatch => {\n try {\n dispatch({ type: CONFIRM_RESYNC_REQUEST_REQUEST });\n\n const response = await confirmResyncRequest(networkId, resyncToken);\n dispatch({ payload: response, type: CONFIRM_RESYNC_REQUEST_SUCCESS });\n notification.success({ message: \"User was successfully reinvited\" });\n } catch (error) {\n notification.error({\n message: get(\n error,\n [\"response\", \"data\"],\n error instanceof Error ? error.message : \"Error\",\n ),\n });\n dispatch({\n message: error instanceof Error ? error.message : \"Error\",\n type: CONFIRM_RESYNC_REQUEST_ERROR,\n });\n }\n};\n","import { createSelector } from \"reselect\";\n\nimport { ApplicationState } from \"../reducer\";\nimport { ColumnMappingsState } from \"./reducer\";\n\nconst selectColumnMappings = (state: ApplicationState): ColumnMappingsState => state.columnMappings;\n\nexport const selectColumnMappingsItems = createSelector(selectColumnMappings, ({ items }) => items);\n\nconst selectColumnMappingsResults = createSelector(selectColumnMappings, ({ results }) => results);\n\nexport const selectColumnMappingsList = createSelector(\n [selectColumnMappingsItems, selectColumnMappingsResults],\n (items, results) => results.map(id => items[id]),\n);\n\nexport const selectColumnMappingsLoadingState = createSelector(\n selectColumnMappings,\n ({ loadingState }) => loadingState,\n);\n\nconst selectEdit = createSelector(selectColumnMappings, ({ edit }) => edit);\n\nexport const selectEditLoadingState = createSelector(\n selectEdit,\n ({ loadingState }) => loadingState,\n);\n\nconst selectApplyColumnMapping = createSelector(\n selectColumnMappings,\n ({ applyColumnMapping }) => applyColumnMapping,\n);\n\nexport const selectApplyColumnMappingUsers = createSelector(\n selectApplyColumnMapping,\n ({ users }) => users,\n);\n\nexport const selectApplyColumnMappingLoadingState = createSelector(\n selectApplyColumnMapping,\n ({ loadingState }) => loadingState,\n);\n\nexport const selectApplyColumnMappingConfigName = createSelector(\n selectApplyColumnMapping,\n ({ configName }) => configName,\n);\n\nexport const selectColumnMappingsNetworkId = createSelector(\n selectColumnMappings,\n ({ networkId }) => networkId,\n);\n","import { Comment, CommentRequestBody } from \"@speakap/types\";\nimport { ThunkAction } from \"redux-thunk\";\nimport { notification } from \"antd\";\n\nimport { ApplicationState } from \"../reducer\";\nimport { getComments, postComment } from \"../api\";\n\nexport const FETCH_COMMENTS_REQUEST = \"FETCH_COMMENTS_REQUEST\";\nexport const FETCH_COMMENTS_SUCCESS = \"FETCH_COMMENTS_SUCCESS\";\nexport const FETCH_COMMENTS_ERROR = \"FETCH_COMMENTS_ERROR\";\n\nexport const SUBMIT_COMMENT_REQUEST = \"SUBMIT_COMMENT_REQUEST\";\nexport const SUBMIT_COMMENT_SUCCESS = \"SUBMIT_COMMENT_SUCCESS\";\nexport const SUBMIT_COMMENT_ERROR = \"SUBMIT_COMMENT_ERROR\";\n\ninterface FetchCommentsRequestAction {\n type: typeof FETCH_COMMENTS_REQUEST;\n}\n\ninterface FetchCommentsSuccessAction {\n type: typeof FETCH_COMMENTS_SUCCESS;\n payload: Array;\n}\n\ninterface FetchCommentsErrorAction {\n type: typeof FETCH_COMMENTS_ERROR;\n}\n\ninterface SubmitCommentRequestAction {\n type: typeof SUBMIT_COMMENT_REQUEST;\n}\n\ninterface SubmitCommentSuccessAction {\n type: typeof SUBMIT_COMMENT_SUCCESS;\n payload: Comment;\n}\n\ninterface SubmitCommentErrorAction {\n type: typeof SUBMIT_COMMENT_ERROR;\n}\n\nexport type CommentsActions =\n | FetchCommentsRequestAction\n | FetchCommentsSuccessAction\n | FetchCommentsErrorAction\n | SubmitCommentRequestAction\n | SubmitCommentSuccessAction\n | SubmitCommentErrorAction;\n\ntype Thunk = ThunkAction, ApplicationState, void, CommentsActions>;\n\nexport const fetchComments = (\n networkId: string,\n): Thunk | undefined> => async dispatch => {\n dispatch({\n type: FETCH_COMMENTS_REQUEST,\n });\n try {\n const comments = await getComments(networkId);\n dispatch({\n payload: comments,\n type: FETCH_COMMENTS_SUCCESS,\n });\n return comments;\n } catch {\n dispatch({\n type: FETCH_COMMENTS_ERROR,\n });\n }\n};\n\nexport const createComment = (\n comment: CommentRequestBody,\n): Thunk => async dispatch => {\n dispatch({\n type: SUBMIT_COMMENT_REQUEST,\n });\n try {\n const newComment = await postComment(comment);\n dispatch({\n payload: newComment,\n type: SUBMIT_COMMENT_SUCCESS,\n });\n return newComment;\n } catch {\n notification.error({\n message: \"Could not send comment\",\n });\n dispatch({\n type: SUBMIT_COMMENT_ERROR,\n });\n }\n};\n","import axios, { AxiosRequestConfig } from \"axios\";\n\nimport { getToken } from \"../auth/tokens\";\n\nconst { REACT_APP_USER_SYNC_API } = process.env;\n\nconst securedAxios = axios.create({ baseURL: REACT_APP_USER_SYNC_API });\n\nsecuredAxios.interceptors.request.use((config: AxiosRequestConfig) => {\n config.headers.authorization = `Bearer ${getToken()}`;\n\n return config;\n});\n\nexport default securedAxios;\n","import { createSelector } from \"reselect\";\n\nimport { ApplicationState } from \"../reducer\";\nimport { AuthState } from \"./reducer\";\n\nconst selectAuth = (state: ApplicationState): AuthState => state.auth;\n\nexport const selectUser = createSelector(selectAuth, ({ user }) => user);\n\nexport const selectUserLoadingState = createSelector(\n selectAuth,\n ({ userLoadingState }) => userLoadingState,\n);\n\nexport const selectLogoutLoadingState = createSelector(\n selectAuth,\n ({ logoutLoadingState }) => logoutLoadingState,\n);\n\nexport const selectGoogleLoadingState = createSelector(\n selectAuth,\n ({ googleLoadingState }) => googleLoadingState,\n);\n\nexport const selectLoginLoadingState = createSelector(\n selectAuth,\n ({ loginLoadingState }) => loginLoadingState,\n);\n","import { createSelector } from \"reselect\";\n\nimport { ApplicationState } from \"../reducer\";\nimport { ExpressionHelpersState } from \"./reducer\";\n\nconst selectExpressionHelpers = (state: ApplicationState): ExpressionHelpersState =>\n state.expressionHelpers;\n\nexport const selectExpressionHelpersLoadingState = createSelector(\n selectExpressionHelpers,\n ({ loadingState }) => loadingState,\n);\nexport const selectExpressionHelpersItems = createSelector(\n selectExpressionHelpers,\n ({ items }) => items,\n);\n","import { UserSyncUser, SpeakapUserPostPayload } from \"@speakap/types\";\n\nimport axios from \"./request\";\n\nexport const getSpeakapUsers = (networkId: string): Promise> =>\n axios.get(`/speakap-users?networkId=${networkId}`).then(({ data }) => data.users);\n\nexport const createSpeakapUser = (speakapUser: SpeakapUserPostPayload): Promise =>\n axios.post(\"/speakap-users\", speakapUser).then(({ data }) => data.user);\n\nexport const updateSpeakapUser = (user: UserSyncUser): Promise =>\n axios.put(`/speakap-users/${user.id}`, user).then(({ data }) => data.user);\n\nexport const deleteSpeakapUser = (userId: number, networkId: string): Promise =>\n axios.delete(`/speakap-users/${userId}/networks/${networkId}`);\n","import { UserSyncUser } from \"@speakap/types\";\n\nimport axios from \"./request\";\nimport { removeToken } from \"../auth/tokens\";\n\nconst getUserSyncUser = (): Promise => axios.get(\"/me\").then(({ data }) => data);\n\nconst getAuthenticationUrl = (redirectUri: string): Promise =>\n axios\n .get(`/authenticate?redirect_uri=${encodeURIComponent(redirectUri)}`)\n .then(({ data }) => data.url);\n\nconst logoutUserSyncUser = (): Promise => axios.get(\"/logout\").then(() => removeToken());\n\nconst loginSpeakapUser = (username: string, password: string): Promise =>\n axios\n .post(\"/speakap-login\", {\n password,\n username,\n })\n .then(({ data }) => data.accessToken);\n\nexport { getUserSyncUser, getAuthenticationUrl, logoutUserSyncUser, loginSpeakapUser };\n","import { ColumnMapping, ColumnMappingRequestBody } from \"@speakap/types\";\n\nimport axios from \"./request\";\n\ninterface GetColumnMappingsParams {\n networkId: string;\n active?: boolean;\n name?: string;\n}\n\ninterface GetColumnMappingsResponse {\n mappings: Array;\n}\n\nexport const getColumnMappings = ({\n networkId,\n ...restParams\n}: GetColumnMappingsParams): Promise =>\n axios\n .get(`/networks/${networkId}/column-mappings/`, { params: restParams })\n .then(({ data }) => data);\n\nexport const postNewColumnMapping = (\n columnMapping: ColumnMappingRequestBody,\n): Promise =>\n axios\n .post(`/networks/${columnMapping.networkId}/column-mappings/`, columnMapping)\n .then(({ data }) => data);\n\nexport const postUpdatedColumnMapping = (\n activeRevisionId: number,\n columnMapping: ColumnMappingRequestBody,\n): Promise =>\n axios\n .post(\n `/networks/${columnMapping.networkId}/column-mappings/?active_revision_id=${activeRevisionId}`,\n columnMapping,\n )\n .then(({ data }) => data);\n","import { CommentRequestBody, Comment } from \"@speakap/types\";\n\nimport axios from \"./request\";\n\nexport const getComments = (networkId: string): Promise> =>\n axios.get(`/networks/${networkId}/network-comments`).then(({ data }) => data.comments);\n\nexport const postComment = (comment: CommentRequestBody): Promise =>\n axios\n .post(`/networks/${comment.networkId}/network-comments/`, comment)\n .then(({ data }) => data);\n","import { ConfigRequestBody, EnhancedConfig, Config } from \"@speakap/types\";\n\nimport axios from \"./request\";\n\ninterface GetConfigsParams {\n networkId: string;\n}\n\ninterface GetConfigsResponse {\n configs: Array;\n}\n\nexport const getConfigs = (params: GetConfigsParams): Promise =>\n axios.get(`/networks/${params.networkId}/configs/`).then(({ data }) => data);\n\nexport const postNewConfig = (config: ConfigRequestBody): Promise =>\n axios.post(`/networks/${config.networkId}/configs/`, config).then(({ data }) => data);\n\nexport const postUpdatedConfig = (\n activeRevisionId: number,\n config: ConfigRequestBody,\n): Promise =>\n axios\n .post(\n `/networks/${config.networkId}/configs/?active_revision_id=${activeRevisionId}`,\n config,\n )\n .then(({ data }) => data);\n\nexport const syncUsers = (\n config: Config,\n dryRunToken: string,\n skipMismatch = false,\n): Promise =>\n axios.post(\n `/networks/${config.networkId}/configs/${\n config.name\n }/sync-requests/${dryRunToken}?skip_mismatch=${skipMismatch.toString()}`,\n {\n config,\n },\n );\n\nexport const getConfigsByName = (networkId: string, name: string): Promise> =>\n axios.get(`/networks/${networkId}/configs/name/${name}`).then(({ data }) => data);\n","import { AxiosRequestConfig } from \"axios\";\nimport {\n Connector,\n ConnectorRequestBody,\n ConnectorRun,\n ConnectorStats,\n ConnectorType,\n ImportUser,\n} from \"@speakap/types\";\n\nimport axios from \"./request\";\n\ninterface GetConnectorsParams {\n networkId: string;\n}\n\ninterface GetConnectorsResponse {\n connectors: Array;\n}\n\ninterface GetImportUsersResponse {\n importUsers: Array;\n}\nexport interface ManualUploadPayload {\n file: File;\n}\n\nexport interface PostRunsParams {\n networkId?: string;\n connector: Connector;\n data?: RunsPayload;\n}\n\nexport type RunsPayload = ManualUploadPayload;\n\nexport const getConnectors = (params: GetConnectorsParams): Promise =>\n axios.get(`/networks/${params.networkId}/connectors/`).then(({ data }) => data);\n\nexport const getImportUsers = ({ id, networkId }: Connector): Promise =>\n axios.get(`/networks/${networkId}/connectors/${id}/runs/most-recent/`).then(({ data }) => data);\n\nexport const postNewConnector = (connector: ConnectorRequestBody): Promise =>\n axios.post(`/networks/${connector.networkId}/connectors/`, connector).then(({ data }) => data);\n\nexport const postUpdatedConnector = (\n activeRevisionId: number,\n connector: ConnectorRequestBody,\n): Promise =>\n axios\n .post(\n `/networks/${connector.networkId}/connectors/?active_revision_id=${activeRevisionId}`,\n connector,\n )\n .then(({ data }) => data);\n\nconst extendManualUpload = (\n axiosConfig: AxiosRequestConfig,\n params: PostRunsParams,\n): AxiosRequestConfig => {\n const formData = new FormData();\n if (!params.data) {\n throw new Error('Cannot upload file without \"file\"');\n }\n formData.append(\"file\", params.data.file);\n\n return {\n ...axiosConfig,\n data: formData,\n headers: {\n ...axiosConfig.headers,\n \"Content-Type\": \"multipart/form-data\",\n },\n };\n};\n\nconst extendAxiosConfig = (\n axiosConfig: AxiosRequestConfig,\n params: PostRunsParams,\n): AxiosRequestConfig => {\n const { connector } = params;\n\n if (connector.type === ConnectorType.ManualUpload) {\n return extendManualUpload(axiosConfig, params);\n }\n\n return axiosConfig;\n};\n\nexport const postRuns = (params: PostRunsParams): Promise => {\n const { connector } = params;\n const url = `/networks/${connector.networkId}/connectors/${connector.id}/runs/`;\n\n const axiosConfig: AxiosRequestConfig = {\n method: \"post\",\n url,\n };\n\n const extendedAxiosConfig = extendAxiosConfig(axiosConfig, params);\n\n return axios(extendedAxiosConfig).then(({ data }) => data);\n};\n\nexport const getConnectorsByName = (networkId: string, name: string): Promise> =>\n axios.get(`/networks/${networkId}/connectors/name/${name}`).then(({ data }) => data);\n\nexport const getConnectorStats = (\n networkId: string,\n connectorId: number,\n): Promise =>\n axios.get(`/networks/${networkId}/connectors/${connectorId}/stats`).then(({ data }) => data);\n","import axios from \"./request\";\n\nexport type DeleteResourceType =\n | \"configs\"\n | \"connectors\"\n | \"column-mappings\"\n | \"group-mappings\"\n | \"role-mappings\";\n\nexport const deleteResourceByName = (\n networkId: string,\n resourceType: DeleteResourceType,\n resourceName: string,\n): Promise => axios.delete(`/networks/${networkId}/${resourceType}/name/${resourceName}`);\n","import { Config, DryRunsResponse, ColumnMapping, GroupMapping } from \"@speakap/types\";\n\nimport axios from \"./request\";\n\ninterface GetDryRunsParams {\n columnMapping?: ColumnMapping;\n config: Config;\n groupMapping?: GroupMapping;\n}\n\nexport const getDryRuns = (params: GetDryRunsParams): Promise =>\n axios.post(`/networks/${params.config.networkId}/dry-runs`, params).then(({ data }) => data);\n","import { ExpressionHelper } from \"@speakap/types\";\n\nimport axios from \"./request\";\n\nexport const getExpressionHelpers = (): Promise> =>\n axios.get(\"/functions.json\").then(({ data }) => data.functions);\n","/* eslint-disable @typescript-eslint/no-unused-vars */\nimport { SpeakapGroup } from \"@speakap/types\";\n\nimport axios from \"./request\";\n\ninterface GetGroupsParams {\n networkId: string;\n}\n\ninterface GetGroupsResponse {\n groups: Array;\n}\n\nexport const getGroups = (params: GetGroupsParams): Promise =>\n axios.get(`/networks/${params.networkId}/groups/`).then(({ data }) => data);\n","import { Config, Job, JobPatchRequest, JobPostRequest } from \"@speakap/types\";\n\nimport axios from \"./request\";\n\nexport const postJob = (config: Config, job: Omit): Promise =>\n axios.post(`/networks/${config.networkId}/sync-jobs/`, job).then(({ data }) => data);\n\nexport const patchJob = (config: Config, jobId: string, job: JobPatchRequest): Promise =>\n axios\n .patch(`/networks/${config.networkId}/sync-jobs/${jobId}/`, job)\n .then(({ data }) => data);\n\nexport const deleteJob = (config: Config, jobId: string): Promise =>\n axios.delete(`/networks/${config.networkId}/sync-jobs/${jobId}/`);\n","import { Network } from \"@speakap/types\";\n\nimport axios from \"./request\";\n\ninterface GetNetworksResponse {\n networks: Array;\n totalItems: number;\n}\n\nexport const getNetworks = (limit: number, offset: number): Promise =>\n axios\n .get(\"/networks/\", {\n params: { limit, offset },\n })\n .then(({ data }) => data);\n\nexport const getNetworkRoles = (networkId: string): Promise> =>\n axios.get(`/networks/${networkId}/roles`).then(({ data }) => data.roles);\n","import {\n EnhancedNotification,\n NotificationRequestBody,\n Subscriber,\n SubscriberRequestBody,\n EmailNotificationRequestBody,\n JobPostRequest,\n Job,\n Email,\n JobPatchRequest,\n} from \"@speakap/types\";\n\nimport axios from \"./request\";\n\ninterface GetNotificationsResponse {\n notifications: Array;\n}\n\ninterface GetSubscribersResponse {\n subscribers: Array;\n}\n\nexport const getNotifications = (networkId: string): Promise =>\n axios.get(`/networks/${networkId}/notifications/`).then(({ data }) => data);\n\nexport const postNewNotification = (\n notification: NotificationRequestBody,\n): Promise =>\n axios\n .post(`/networks/${notification.networkId}/notifications/`, notification)\n .then(({ data }) => data);\n\nexport const updateNotification = (\n notification: EnhancedNotification,\n): Promise =>\n axios\n .put(`/networks/${notification.networkId}/notifications/${notification.id}/`, notification)\n .then(({ data }) => data);\n\nexport const deleteNotification = (\n networkId: string,\n notificationId: number,\n): Promise =>\n axios\n .delete(`/networks/${networkId}/notifications/${notificationId}/`)\n .then(({ data }) => data);\n\nexport const getSubscribers = (networkId: string): Promise =>\n axios.get(`/networks/${networkId}/subscribers/`).then(({ data }) => data);\n\nexport const postNewSubscriber = (\n subscriber: SubscriberRequestBody,\n networkId: string,\n): Promise =>\n axios.post(`/networks/${networkId}/subscribers/`, subscriber).then(({ data }) => data);\n\nexport const putSubscriber = (subscriber: Subscriber, networkId: string): Promise =>\n axios\n .put(`/networks/${networkId}/subscribers/${subscriber.id}`, subscriber)\n .then(({ data }) => data);\n\nexport const sendEmailsForNotification = (\n notification: EmailNotificationRequestBody,\n): Promise<{ status: number; email: Email }> =>\n axios\n .post(`/networks/${notification.networkId}/emails/`, notification)\n .then(({ status, data }) => ({ email: data, status }));\n\nexport const sendScheduleNotification = (\n jobPost: Omit,\n): Promise =>\n axios\n .post(`/networks/${jobPost.networkId}/notification-jobs/`, jobPost)\n .then(({ data }) => data);\n\nexport const patchScheduleNotification = (\n jobPatch: JobPatchRequest,\n networkId: string,\n jobId: string,\n): Promise =>\n axios\n .patch(`/networks/${networkId}/notification-jobs/${jobId}`, jobPatch)\n .then(({ data }) => data);\n\nexport const getEmailsNotificationOverview = (\n networkId: string,\n notificationId: number,\n): Promise> =>\n axios\n .get(`/networks/${networkId}/notifications/${notificationId}/emails`)\n .then(({ data }) => data.emails);\n","import { ScimUser, SpeakapGroup } from \"@speakap/types\";\n\nimport axios from \"./request\";\n\ninterface GetOrganizationalOverviewParams {\n networkId: string;\n configName: string;\n}\n\ninterface GetOrganizationalOverviewResponse {\n groups: Array;\n users: Array;\n}\n\nexport const getOrganizationalOverview = ({\n networkId,\n configName,\n}: GetOrganizationalOverviewParams): Promise =>\n axios\n .get(`/networks/${networkId}/configs/${configName}/organizational-overview`)\n .then(({ data }) => data);\n","import {\n SyncProtocol,\n ResyncResponse,\n ImportResyncRequest,\n SyncRequestHistory,\n} from \"@speakap/types\";\n\nimport axios from \"./request\";\n\nexport const createResyncRequest = async (\n networkId: string,\n syncedUserId: number,\n): Promise => {\n const request: ImportResyncRequest = {\n syncedUserId,\n type: \"import\",\n };\n\n const { data } = await axios.post(`/networks/${networkId}/resync-requests`, request);\n return data;\n};\n\nexport const confirmResyncRequest = (\n networkId: string,\n resyncToken: string,\n): Promise<{ syncProtocol: SyncProtocol; syncRequestHistories: Array }> =>\n axios.post(`/networks/${networkId}/resync-confirms`, { resyncToken }).then(({ data }) => data);\n","import { RoleMapping, RoleMappingRequestBody } from \"@speakap/types\";\n\nimport axios from \"./request\";\n\ninterface GetRoleMappingsParams {\n networkId: string;\n}\n\ninterface GetRoleMappingsResponse {\n mappings: Array;\n}\n\nexport const getRoleMappings = (params: GetRoleMappingsParams): Promise =>\n axios.get(`/networks/${params.networkId}/role-mappings/`).then(({ data }) => data);\n\nexport const postNewRoleMapping = (roleMapping: RoleMappingRequestBody): Promise =>\n axios\n .post(`/networks/${roleMapping.networkId}/role-mappings/`, roleMapping)\n .then(({ data }) => data);\n\nexport const postUpdatedRoleMapping = (\n activeRevisionId: number,\n roleMapping: RoleMapping,\n): Promise =>\n axios\n .post(\n `/networks/${roleMapping.networkId}/role-mappings/?active_revision_id=${activeRevisionId}`,\n roleMapping,\n )\n .then(({ data }) => data);\n\nexport const getRoleMappingsByName = (\n networkId: string,\n name: string,\n): Promise> =>\n axios.get(`/networks/${networkId}/role-mappings/name/${name}`).then(({ data }) => data);\n","import { getColumnMappings } from \"./column-mappings\";\nimport { getConfigsByName } from \"./configs\";\nimport { getConnectorsByName } from \"./connectors\";\nimport { getGroupMappingsByName } from \"./group-mappings\";\nimport { getRoleMappingsByName } from \"./role-mappings\";\n\nexport interface BaseResource {\n id: number;\n name: string;\n createdAt: string;\n createdBy: number;\n}\n\nexport const getColumnMappingsRevisions = (\n networkId: string,\n columnMappingsName: string,\n): (() => Promise>) => () =>\n getColumnMappings({ name: columnMappingsName, networkId }).then(({ mappings }) => mappings);\n\nexport const getGroupMappingsRevisions = (\n networkId: string,\n groupMappingsName: string,\n): (() => Promise>) => () =>\n getGroupMappingsByName(networkId, groupMappingsName);\n\nexport const getRoleMappingsRevisions = (\n networkId: string,\n roleMappingsName: string,\n): (() => Promise>) => () => getRoleMappingsByName(networkId, roleMappingsName);\n\nexport const getConnectorsRevisions = (\n networkId: string,\n connectorsName: string,\n): (() => Promise>) => () => getConnectorsByName(networkId, connectorsName);\n\nexport const getConfigsRevisions = (\n networkId: string,\n configsName: string,\n): (() => Promise>) => () => getConfigsByName(networkId, configsName);\n","import { SyncProtocol, SyncRequestHistory } from \"@speakap/types\";\n\nimport axios from \"./request\";\n\ninterface GetSyncProtocolsParams {\n networkId: string;\n limit: number;\n offset: number;\n}\n\nexport const getSyncProtocols = ({\n networkId,\n limit,\n offset,\n}: GetSyncProtocolsParams): Promise> =>\n axios\n .get(`/networks/${networkId}/sync-protocols?limit=${limit}&offset=${offset}`)\n .then(({ data }) => data.protocols);\n\ninterface GetSyncRequestHistoriesParams {\n networkId: string;\n syncProtocolId: number;\n}\n\nexport const getSyncRequestHistories = ({\n syncProtocolId,\n networkId,\n}: GetSyncRequestHistoriesParams): Promise> =>\n axios\n .get(`/networks/${networkId}/sync-protocols/${syncProtocolId}/sync-request-histories`)\n .then(({ data }) => data.syncRequestHistories);\n","import { SyncedUser, SyncedUserHistory } from \"@speakap/types\";\n\nimport axios from \"./request\";\n\nexport const getSyncedUsers = (\n networkId: string,\n limit: number,\n offset: number,\n): Promise> =>\n axios\n .get(`/networks/${networkId}/synced-users`, { params: { limit, offset } })\n .then(({ data }) => data.syncedUsers);\n\ninterface GetSyncHistoryParams {\n networkId: string;\n syncedUserId: number;\n}\n\nexport const getSyncHistory = ({\n networkId,\n syncedUserId,\n}: GetSyncHistoryParams): Promise> =>\n axios\n .get(`/networks/${networkId}/synced-users/${syncedUserId}/sync-history`)\n .then(({ data }) => data.syncHistory);\n","export * from \"./access-management\";\nexport * from \"./auth\";\nexport * from \"./column-mappings\";\nexport * from \"./comments\";\nexport * from \"./configs\";\nexport * from \"./connectors\";\nexport * from \"./delete-resources\";\nexport * from \"./dry-runs\";\nexport * from \"./expression-helpers\";\nexport * from \"./group-mappings\";\nexport * from \"./groups\";\nexport * from \"./jobs\";\nexport * from \"./networks\";\nexport * from \"./notifications\";\nexport * from \"./organizational-overviews\";\nexport * from \"./resync-requests\";\nexport * from \"./revisions\";\nexport * from \"./role-mappings\";\nexport * from \"./sync-protocols\";\nexport * from \"./synced-users\";\n","import { Config, DryRunsResponse, GroupMapping, ColumnMapping } from \"@speakap/types\";\nimport { ThunkAction } from \"redux-thunk\";\nimport { get } from \"lodash\";\nimport { notification } from \"antd\";\n\nimport { ApplicationState } from \"../reducer\";\nimport { getDryRuns } from \"../api\";\n\nexport const DISMISS_RESULTS = \"speakap/dry-runs/DISMISS_RESULTS\";\nexport const FETCH_RESULTS_REQUEST = \"FETCH_RESULTS_REQUEST\";\nexport const FETCH_RESULTS_SUCCESS = \"FETCH_RESULTS_SUCCESS\";\nexport const FETCH_RESULTS_ERROR = \"FETCH_RESULTS_ERROR\";\n\ninterface DismissResultsAction {\n type: typeof DISMISS_RESULTS;\n}\n\ninterface FetchResultsRequestAction {\n type: typeof FETCH_RESULTS_REQUEST;\n payload: {\n config: Config;\n };\n}\n\ninterface FetchResultsSuccessAction {\n type: typeof FETCH_RESULTS_SUCCESS;\n payload: DryRunsResponse;\n}\n\ninterface FetchResultsErrorAction {\n type: typeof FETCH_RESULTS_ERROR;\n}\n\nexport type DryRunsActions =\n | DismissResultsAction\n | FetchResultsSuccessAction\n | FetchResultsRequestAction\n | FetchResultsErrorAction;\n\ninterface FetchResultsParams {\n columnMapping?: ColumnMapping;\n config: Config;\n groupMapping?: GroupMapping;\n}\n\ntype Thunk = ThunkAction, ApplicationState, void, DryRunsActions>;\n\nexport const dismissResults = (): DismissResultsAction => ({ type: DISMISS_RESULTS });\n\nexport const fetchResults = (params: FetchResultsParams): Thunk => async dispatch => {\n try {\n dispatch({ payload: params, type: FETCH_RESULTS_REQUEST });\n\n const response = await getDryRuns(params);\n dispatch({ payload: response, type: FETCH_RESULTS_SUCCESS });\n } catch (error) {\n const errorMessage =\n get(error, [\"response\", \"data\", \"message\"]) ||\n get(error, [\"response\", \"data\"], error instanceof Error ? error.message : \"Error\");\n dispatch({ message: errorMessage, type: FETCH_RESULTS_ERROR });\n notification.error({\n message: errorMessage,\n });\n }\n};\n","import { SyncedUser } from \"@speakap/types\";\nimport { ThunkAction } from \"redux-thunk\";\nimport { get } from \"lodash\";\nimport { notification } from \"antd\";\n\nimport { ApplicationState } from \"../reducer\";\nimport { getSyncedUsers } from \"../api\";\nimport { selectSyncedUsersNetworkId } from \"./selectors\";\n\nexport const FETCH_SYNCED_USERS_REQUEST = \"FETCH_SYNCED_USERS_REQUEST\";\nexport const FETCH_SYNCED_USERS_SUCCESS = \"FETCH_SYNCED_USERS_SUCCESS\";\nexport const FETCH_SYNCED_USERS_ERROR = \"FETCH_SYNCED_USERS_ERROR\";\nexport const FETCH_SYNCED_USERS_BATCH = \"FETCH_SYNCED_USERS_BATCH\";\n\ninterface FetchSyncedUsersRequestAction {\n type: typeof FETCH_SYNCED_USERS_REQUEST;\n payload: string;\n}\n\ninterface FetchSyncedUsersSuccessAction {\n type: typeof FETCH_SYNCED_USERS_SUCCESS;\n}\n\ninterface FetchSyncedUsersErrorAction {\n type: typeof FETCH_SYNCED_USERS_ERROR;\n payload: string;\n}\n\ninterface FetchSyncedUsersBatchAction {\n type: typeof FETCH_SYNCED_USERS_BATCH;\n payload: Array;\n}\n\nexport type SyncedUsersActions =\n | FetchSyncedUsersSuccessAction\n | FetchSyncedUsersRequestAction\n | FetchSyncedUsersErrorAction\n | FetchSyncedUsersBatchAction;\n\ntype Thunk = ThunkAction, ApplicationState, void, SyncedUsersActions>;\n\nexport const fetchSyncedUsers = (networkId: string): Thunk => async (dispatch, getState) => {\n try {\n const state = getState();\n const currentNetworkId = selectSyncedUsersNetworkId(state);\n let offset = 0;\n const limit = 1000;\n let hasMoreSyncedUsers = true;\n\n if (currentNetworkId !== networkId) {\n dispatch({ payload: networkId, type: FETCH_SYNCED_USERS_REQUEST });\n\n while (hasMoreSyncedUsers) {\n const newSyncedUsers = await getSyncedUsers(networkId, limit, offset);\n\n if (newSyncedUsers.length === 0) {\n hasMoreSyncedUsers = false;\n } else {\n dispatch({\n payload: newSyncedUsers,\n type: FETCH_SYNCED_USERS_BATCH,\n });\n offset += limit;\n }\n }\n\n dispatch({ type: FETCH_SYNCED_USERS_SUCCESS });\n }\n } catch (error) {\n const message = get(\n error,\n \"response.data\",\n error instanceof Error ? error.message : \"Error\",\n );\n dispatch({\n payload: error instanceof Error ? error.message : \"Error\",\n type: FETCH_SYNCED_USERS_ERROR,\n });\n notification.error({\n message,\n });\n }\n};\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"logo\":\"logo_logo__2PBiY\",\"medium\":\"logo_medium__1wnop\",\"large\":\"logo_large__2bbK0\",\"image\":\"logo_image__37hNN\"};","import { createSelector } from \"reselect\";\n\nimport { ApplicationState } from \"../reducer\";\nimport { GroupMappingsState } from \"./reducer\";\n\nconst selectGroupMappings = (state: ApplicationState): GroupMappingsState => state.groupMappings;\n\nexport const selectBuilder = createSelector(selectGroupMappings, ({ builder }) => builder);\n\nexport const selectBuilderLoadingState = createSelector(\n selectBuilder,\n ({ loadingState }) => loadingState,\n);\n\nexport const selectUpdateSuggestions = createSelector(\n selectGroupMappings,\n ({ updateSuggestions }) => updateSuggestions,\n);\n\nexport const selectUpdateSuggestionsLoadingState = createSelector(\n selectUpdateSuggestions,\n ({ loadingState }) => loadingState,\n);\n\nexport const selectSubjects = createSelector(selectBuilder, ({ subjects }) => subjects);\n\nexport const selectObjects = createSelector(selectBuilder, ({ objects }) => objects);\n\nexport const selectGroupMappingsItems = createSelector(selectGroupMappings, ({ items }) => items);\n\nconst selectGroupMappingsResults = createSelector(selectGroupMappings, ({ results }) => results);\n\nexport const selectGroupMappingsList = createSelector(\n [selectGroupMappingsItems, selectGroupMappingsResults],\n (items, results) => results.map(id => items[id]),\n);\n\nexport const selectGroupMappingsLoadingState = createSelector(\n selectGroupMappings,\n ({ loadingState }) => loadingState,\n);\n\nconst selectEdit = createSelector(selectGroupMappings, ({ edit }) => edit);\n\nexport const selectEditLoadingState = createSelector(\n selectEdit,\n ({ loadingState }) => loadingState,\n);\n\nconst selectGroups = createSelector(selectGroupMappings, ({ groups }) => groups);\n\nexport const selectGroupsItems = createSelector(selectGroups, ({ items }) => items);\n\nconst selectGroupsResults = createSelector(selectGroups, ({ results }) => results);\n\nexport const selectGroupsList = createSelector(\n [selectGroupsItems, selectGroupsResults],\n (items, results) => results.map(id => items[id]),\n);\n\nexport const selectGroupsLoadingState = createSelector(\n selectGroups,\n ({ loadingState }) => loadingState,\n);\n\nexport const selectGroupsNetworkId = createSelector(selectGroups, ({ networkId }) => networkId);\n\nexport const selectGroupMappingsNetworkId = createSelector(\n selectGroupMappings,\n ({ networkId }) => networkId,\n);\n\nconst selectPrepareForm = createSelector(selectGroupMappings, ({ prepareForm }) => prepareForm);\n\nexport const selectPrepareFormLoadingState = createSelector(\n selectPrepareForm,\n ({ loadingState }) => loadingState,\n);\n\nexport const selectPrepareFormScimUsers = createSelector(\n selectPrepareForm,\n ({ scimUsers }) => scimUsers,\n);\n","import { ThunkAction } from \"redux-thunk\";\n\nimport { ApplicationState } from \"../reducer\";\nimport {\n BaseResource,\n getColumnMappingsRevisions,\n getGroupMappingsRevisions,\n getConnectorsRevisions,\n getConfigsRevisions,\n getRoleMappingsRevisions,\n} from \"../api\";\n\nexport const FETCH_REVISIONS_REQUEST = \"FETCH_REVISIONS_REQUEST\";\nexport const FETCH_REVISIONS_SUCCESS = \"FETCH_REVISIONS_SUCCESS\";\nexport const FETCH_REVISIONS_ERROR = \"FETCH_REVISIONS_ERROR\";\n\ninterface FetchRevisionsRequestAction {\n type: typeof FETCH_REVISIONS_REQUEST;\n}\n\ninterface FetchRevisionsSuccessAction {\n type: typeof FETCH_REVISIONS_SUCCESS;\n payload: Array;\n}\n\ninterface FetchRevisionsErrorAction {\n type: typeof FETCH_REVISIONS_ERROR;\n}\n\nexport type RevisionsActions =\n | FetchRevisionsRequestAction\n | FetchRevisionsSuccessAction\n | FetchRevisionsErrorAction;\n\ntype Thunk = ThunkAction, ApplicationState, void, RevisionsActions>;\n\nconst fetchRevisions = (\n getResources: () => Promise>,\n): Thunk | undefined> => async dispatch => {\n dispatch({\n type: FETCH_REVISIONS_REQUEST,\n });\n try {\n const resources = await getResources();\n dispatch({\n payload: resources,\n type: FETCH_REVISIONS_SUCCESS,\n });\n return resources;\n } catch {\n dispatch({\n type: FETCH_REVISIONS_ERROR,\n });\n }\n};\n\nexport const fetchColumnMappingsRevisions = (\n networkId: string,\n columnMappingsName: string,\n): Thunk | undefined> => dispatch =>\n dispatch(fetchRevisions(getColumnMappingsRevisions(networkId, columnMappingsName)));\n\nexport const fetchGroupMappingsRevisions = (\n networkId: string,\n groupMappingsName: string,\n): Thunk | undefined> => dispatch =>\n dispatch(fetchRevisions(getGroupMappingsRevisions(networkId, groupMappingsName)));\n\nexport const fetchRoleMappingsRevisions = (\n networkId: string,\n roleMappingsName: string,\n): Thunk | undefined> => dispatch =>\n dispatch(fetchRevisions(getRoleMappingsRevisions(networkId, roleMappingsName)));\n\nexport const fetchConnectorsRevisions = (\n networkId: string,\n connectorsName: string,\n): Thunk | undefined> => dispatch =>\n dispatch(fetchRevisions(getConnectorsRevisions(networkId, connectorsName)));\n\nexport const fetchConfigsRevisions = (\n networkId: string,\n configsName: string,\n): Thunk | undefined> => dispatch =>\n dispatch(fetchRevisions(getConfigsRevisions(networkId, configsName)));\n","import { GroupMapping, GroupMappingRequestBody, ScimUser, GroupMappingRule } from \"@speakap/types\";\n\nimport axios from \"./request\";\n\ninterface GetGroupMappingsParams {\n networkId: string;\n}\n\ninterface GetGroupMappingsResponse {\n mappings: Array;\n}\n\nexport const getGroupMappings = (\n params: GetGroupMappingsParams,\n): Promise =>\n axios.get(`/networks/${params.networkId}/group-mappings/`).then(({ data }) => data);\n\nexport const postNewGroupMapping = (groupMapping: GroupMappingRequestBody): Promise =>\n axios\n .post(`/networks/${groupMapping.networkId}/group-mappings/`, groupMapping)\n .then(({ data }) => data);\n\nexport const postUpdatedGroupMapping = (\n activeRevisionId: number,\n groupMapping: GroupMapping,\n): Promise =>\n axios\n .post(\n `/networks/${groupMapping.networkId}/group-mappings/?active_revision_id=${activeRevisionId}`,\n groupMapping,\n )\n .then(({ data }) => data);\n\nexport const getGroupMappingRules = (\n groupMapping: GroupMapping,\n users: Array,\n): Promise>> =>\n axios\n .post(`/networks/${groupMapping.networkId}/group-mappings/${groupMapping.id}/rules`, {\n users,\n })\n .then(({ data }) => data.rules);\n\nexport const getGroupMappingsByName = (\n networkId: string,\n name: string,\n): Promise> =>\n axios.get(`/networks/${networkId}/group-mappings/name/${name}`).then(({ data }) => data);\n","const USERSYNC_USER_TOKEN = \"usersync:token\";\n\nconst getToken = (): string | null => {\n const url = new URL(location.href);\n const accessToken = url.searchParams.get(\"access_token\");\n\n if (accessToken) {\n url.searchParams.delete(\"access_token\");\n history.replaceState(null, \"\", url.toString());\n localStorage.setItem(USERSYNC_USER_TOKEN, accessToken);\n }\n\n return localStorage.getItem(USERSYNC_USER_TOKEN);\n};\n\nconst removeToken = (): void => localStorage.removeItem(USERSYNC_USER_TOKEN);\n\nexport { getToken, removeToken };\n","import { SpeakapGroup, ScimUser } from \"@speakap/types\";\nimport { ThunkAction } from \"redux-thunk\";\n\nimport { ApplicationState } from \"../reducer\";\nimport { getOrganizationalOverview } from \"../api\";\n\nexport const FETCH_ORGANIZATIONAL_OVERVIEW_REQUEST = \"FETCH_ORGANIZATIONAL_OVERVIEW_REQUEST\";\nexport const FETCH_ORGANIZATIONAL_OVERVIEW_SUCCESS = \"FETCH_ORGANIZATIONAL_OVERVIEW_SUCCESS\";\nexport const FETCH_ORGANIZATIONAL_OVERVIEW_ERROR = \"FETCH_ORGANIZATIONAL_OVERVIEW_ERROR\";\n\ninterface FetchOrganizationalOverviewsRequestAction {\n type: typeof FETCH_ORGANIZATIONAL_OVERVIEW_REQUEST;\n}\n\ninterface FetchOrganizationalOverviewsSuccessAction {\n type: typeof FETCH_ORGANIZATIONAL_OVERVIEW_SUCCESS;\n payload: {\n groups: Array;\n users: Array;\n };\n}\n\ninterface FetchOrganizationalOverviewsErrorAction {\n type: typeof FETCH_ORGANIZATIONAL_OVERVIEW_ERROR;\n}\n\nexport type OrganizationalOverviewActions =\n | FetchOrganizationalOverviewsSuccessAction\n | FetchOrganizationalOverviewsRequestAction\n | FetchOrganizationalOverviewsErrorAction;\n\ntype Thunk = ThunkAction;\n\nexport const fetchOrganizationalOverview = (\n networkId: string,\n configName: string,\n): Thunk> => async dispatch => {\n try {\n dispatch({ type: FETCH_ORGANIZATIONAL_OVERVIEW_REQUEST });\n\n const response = await getOrganizationalOverview({ configName, networkId });\n dispatch({ payload: response, type: FETCH_ORGANIZATIONAL_OVERVIEW_SUCCESS });\n } catch (error) {\n dispatch({\n message: error instanceof Error ? error.message : \"Error\",\n type: FETCH_ORGANIZATIONAL_OVERVIEW_ERROR,\n });\n }\n};\n","import { SyncProtocol } from \"@speakap/types\";\nimport { ThunkAction } from \"redux-thunk\";\nimport { get } from \"lodash\";\nimport { notification } from \"antd\";\n\nimport { ApplicationState } from \"../reducer\";\nimport { getSyncProtocols } from \"../api\";\nimport { selectSyncProtocolsOffset } from \"./selectors\";\n\nexport const FETCH_SYNC_PROTOCOLS_REQUEST = \"FETCH_SYNC_PROTOCOLS_REQUEST\";\nexport const FETCH_SYNC_PROTOCOLS_SUCCESS = \"FETCH_SYNC_PROTOCOLS_SUCCESS\";\nexport const FETCH_SYNC_PROTOCOLS_ERROR = \"FETCH_SYNC_PROTOCOLS_ERROR\";\n\ninterface FetchSyncProtocolsRequestAction {\n type: typeof FETCH_SYNC_PROTOCOLS_REQUEST;\n}\n\ninterface FetchSyncProtocolsSuccessAction {\n type: typeof FETCH_SYNC_PROTOCOLS_SUCCESS;\n payload: {\n protocols: Array;\n limit: number;\n hasMore: boolean;\n };\n}\n\ninterface FetchSyncProtocolsErrorAction {\n type: typeof FETCH_SYNC_PROTOCOLS_ERROR;\n}\n\nexport type SyncProtocolActions =\n | FetchSyncProtocolsSuccessAction\n | FetchSyncProtocolsRequestAction\n | FetchSyncProtocolsErrorAction;\n\ntype Thunk = ThunkAction, ApplicationState, void, SyncProtocolActions>;\n\nconst limit = 10;\n\nexport const fetchSyncProtocols = (networkId: string, onMount: boolean): Thunk => async (\n dispatch,\n getState,\n) => {\n try {\n if (onMount) {\n dispatch({ type: FETCH_SYNC_PROTOCOLS_REQUEST });\n }\n const offset = selectSyncProtocolsOffset(getState());\n const response = await getSyncProtocols({ limit, networkId, offset });\n dispatch({\n payload: { hasMore: response.length === limit, limit, protocols: response },\n type: FETCH_SYNC_PROTOCOLS_SUCCESS,\n });\n } catch (error) {\n const message = get(\n error,\n \"response.data\",\n error instanceof Error ? error.message : \"Error\",\n );\n dispatch({\n message: error instanceof Error ? error.message : \"Error\",\n type: FETCH_SYNC_PROTOCOLS_ERROR,\n });\n notification.error({\n message,\n });\n }\n};\n","import { pathToRegexp } from \"path-to-regexp\";\n\nexport interface Route {\n children?: Record;\n label: (...args: Array) => string;\n pathname: string;\n url: (...args: Array) => string;\n}\n\nexport interface RouteWithRegexp extends Route {\n regexp: RegExp;\n}\n\nconst addRegexp = (route: Route): RouteWithRegexp => ({\n ...route,\n regexp: pathToRegexp(route.pathname, [], { end: false }),\n});\n\nconst columnMappingItem = addRegexp({\n label: (networkId: string, configName: string, columnMappingName: string) => columnMappingName,\n pathname: \"/networks/:networkId/configs/:configName/column-mappings/:columnMappingName\",\n url: (networkId: string, configName: string, columnMappingName: string) =>\n `/networks/${networkId}/configs/${configName}/column-mappings/${columnMappingName}`,\n});\n\nconst connectorItem = addRegexp({\n label: (networkId: string, configName: string, connectorName: string) => connectorName,\n pathname: \"/networks/:networkId/configs/:configName/connectors/:connectorName\",\n url: (networkId: string, configName: string, connectorName: string) =>\n `/networks/${networkId}/configs/${configName}/connectors/${connectorName}`,\n});\n\nconst groupMappingItem = addRegexp({\n label: (networkId: string, configName: string, groupMappingName: string) => groupMappingName,\n pathname: \"/networks/:networkId/configs/:configName/group-mappings/:groupMappingName\",\n url: (networkId: string, configName: string, groupMappingName: string) =>\n `/networks/${networkId}/configs/${configName}/group-mappings/${groupMappingName}`,\n});\n\nconst roleMappingItem = addRegexp({\n label: (networkId: string, configName: string, roleMappingName: string) => roleMappingName,\n pathname: \"/networks/:networkId/configs/:configName/role-mappings/:roleMappingName\",\n url: (networkId: string, configName: string, roleMappingName: string) =>\n `/networks/${networkId}/configs/${configName}/role-mappings/${roleMappingName}`,\n});\n\nconst invitationMessages = addRegexp({\n label: () => \"Invitation messages\",\n pathname: \"/networks/:networkId/configs/:configName/invitation-messages\",\n url: (networkId: string, configName: string) =>\n `/networks/${networkId}/configs/${configName}/invitation-messages`,\n});\n\nconst newColumnMappingItem = addRegexp({\n label: () => \"New column mapping\",\n pathname: \"/networks/:networkId/configs/:configName/new-column-mapping\",\n url: (networkId: string, configName: string) =>\n `/networks/${networkId}/configs/${configName}/new-column-mapping`,\n});\n\nconst newConnectorItem = addRegexp({\n label: () => \"New connector\",\n pathname: \"/networks/:networkId/configs/:configName/new-connector\",\n url: (networkId: string, configName: string) =>\n `/networks/${networkId}/configs/${configName}/new-connector`,\n});\n\nconst newGroupMappingItem = addRegexp({\n label: () => \"New group mapping\",\n pathname: \"/networks/:networkId/configs/:configName/new-group-mapping\",\n url: (networkId: string, configName: string) =>\n `/networks/${networkId}/configs/${configName}/new-group-mapping`,\n});\n\nconst newRoleMappingItem = addRegexp({\n label: () => \"New role mapping\",\n pathname: \"/networks/:networkId/configs/:configName/new-role-mapping\",\n url: (networkId: string, configName: string) =>\n `/networks/${networkId}/configs/${configName}/new-role-mapping`,\n});\n\nconst configItem = addRegexp({\n children: {\n columnMappingItem,\n connectorItem,\n groupMappingItem,\n newColumnMappingItem,\n newConnectorItem,\n newGroupMappingItem,\n newRoleMappingItem,\n roleMappingItem,\n } as Record,\n label: (networkId: string, configName: string) => configName,\n pathname: \"/networks/:networkId/configs/:configName\",\n url: (networkId: string, configName: string) => `/networks/${networkId}/configs/${configName}`,\n});\n\nconst configOrganizationalOverview = addRegexp({\n label: () => \"Organizational overview\",\n pathname: \"/organizational-overviews/:pathId\",\n url: (pathId: string) => `/organizational-overviews/${pathId}`,\n});\n\nconst configs = addRegexp({\n children: { configItem } as Record,\n label: () => \"Configs\",\n pathname: \"/networks/:networkId/configs\",\n url: (networkId: string): string => `/networks/${networkId}/configs`,\n});\n\nconst schedule = addRegexp({\n label: () => \"Schedule\",\n pathname: \"/networks/:networkId/configs/:configName/schedule\",\n url: (networkId: string, configName: string) =>\n `/networks/${networkId}/configs/${configName}/schedule`,\n});\n\nconst syncProtocols = addRegexp({\n label: () => \"Sync logs\",\n pathname: \"/networks/:networkId/sync-protocols\",\n url: (networkId: string): string => `/networks/${networkId}/sync-protocols`,\n});\n\nconst syncedUsers = addRegexp({\n label: () => \"Synced users\",\n pathname: \"/networks/:networkId/synced-users\",\n url: (networkId: string): string => `/networks/${networkId}/synced-users`,\n});\n\nconst notifications = addRegexp({\n label: () => \"Notifications\",\n pathname: \"/networks/:networkId/notifications\",\n url: (networkId: string): string => `/networks/${networkId}/notifications`,\n});\n\nconst accessManagement = addRegexp({\n label: () => \"Access management\",\n pathname: \"/networks/:networkId/access-management\",\n url: (networkId: string): string => `/networks/${networkId}/access-management`,\n});\n\nconst routes = {\n accessManagement,\n columnMappingItem,\n configItem,\n configOrganizationalOverview,\n configs,\n connectorItem,\n groupMappingItem,\n invitationMessages,\n newColumnMappingItem,\n newConnectorItem,\n newGroupMappingItem,\n newRoleMappingItem,\n notifications,\n roleMappingItem,\n schedule,\n syncProtocols,\n syncedUsers,\n};\n\nexport type RouteKey = keyof typeof routes;\n\nexport default routes;\n","function webpackEmptyContext(req) {\n\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\te.code = 'MODULE_NOT_FOUND';\n\tthrow e;\n}\nwebpackEmptyContext.keys = function() { return []; };\nwebpackEmptyContext.resolve = webpackEmptyContext;\nmodule.exports = webpackEmptyContext;\nwebpackEmptyContext.id = 187;","import { ColumnMappingTemplate, SPEAKAP_PARAM_BAG_SCHEMA } from \"@speakap/types\";\nimport React, { useEffect } from \"react\";\nimport { get, set, compact, uniq } from \"lodash\";\nimport { mapColumns, flattenScimUser } from \"@speakap/expression-engine\";\nimport { useSelector, useDispatch } from \"react-redux\";\n\nimport { LOADING_STATES } from \"../../../types\";\nimport { fetchExpressionHelpers } from \"../../../modules/expression-helpers/actions\";\nimport { prepareColumnMappingExamples } from \"../../../modules/column-mappings/actions\";\nimport { selectApplyColumnMappingUsers } from \"../../../modules/column-mappings/selectors\";\nimport { selectConfigName } from \"../../../modules/configs/selectors\";\nimport {\n selectExpressionHelpersItems,\n selectExpressionHelpersLoadingState,\n} from \"../../../modules/expression-helpers/selectors\";\nimport styles from \"./column-mappings-form.module.css\";\n\ninterface FieldExampleProps {\n selector: Array;\n value?: string;\n}\n\nconst FieldExample = ({ selector, value }: FieldExampleProps): JSX.Element | null => {\n const dispatch = useDispatch();\n const configName = useSelector(selectConfigName);\n const importUsers = useSelector(selectApplyColumnMappingUsers);\n const loadingState = useSelector(selectExpressionHelpersLoadingState);\n const expressionHelpers = useSelector(selectExpressionHelpersItems);\n useEffect(() => {\n if (configName) {\n dispatch(prepareColumnMappingExamples(configName));\n }\n }, [configName]);\n useEffect(() => {\n dispatch(fetchExpressionHelpers());\n }, []);\n if (\n selector[0] === SPEAKAP_PARAM_BAG_SCHEMA ||\n loadingState === LOADING_STATES.FETCHING ||\n loadingState === LOADING_STATES.INITIAL\n ) {\n return null;\n }\n const template: ColumnMappingTemplate = set(\n {\n externalId: \"\",\n userName: \"\",\n },\n selector,\n value,\n );\n try {\n const scimUsers = importUsers.map(user =>\n mapColumns(\n flattenScimUser(user) as Record,\n template,\n expressionHelpers,\n ),\n );\n const examples = uniq(compact(scimUsers.map(user => get(user, selector)))).join(\", \");\n\n return
{examples}
;\n } catch (error) {\n return (\n
\n {error instanceof Error ? error.message : \"Error\"}\n
\n );\n }\n};\n\nexport default FieldExample;\n","import { InfoCircleOutlined, WarningOutlined } from \"@ant-design/icons\";\nimport React from \"react\";\nimport { Row, Col, Badge, Form, Input, Tooltip } from \"antd\";\nimport { get } from \"lodash\";\n\nimport FieldExamples from \"./column-mappings-field-examples\";\nimport { FieldOption, FieldComponentProps } from \"./column-mappings-utils\";\nimport styles from \"./column-mappings-form.module.css\";\n\nexport function createInputField(\n field: Omit & { key: Array | string },\n) {\n return function InputFieldComponent(props: FieldComponentProps) {\n const { form, columnMapping, removeButton, modalButton } = props;\n const { label, selector, key, required, modal = true, example } = field;\n const initialValue = get(columnMapping, selector, \"\");\n const rules = [];\n\n if (required) {\n rules.push({\n message: `Please select a value for \"${label}\"!`,\n required: true,\n });\n }\n\n return (\n \n \n {required ? {label} : label}\n \n \n \n {example ? : null}\n \n \n \n \n \n {\n \" Make sure that the target column has valid ISO country codes or the column is normalized\"\n }\n \n ) : modal ? (\n \n ) : label === \"Target\" ? (\n \n Make sure that your target name does not include whitespaces and\n does not overlap with other field names\n \n ) : (\n \n Make sure to wrap your text in quotes (") for this field\n \n )\n }\n >\n \n \n \n \n );\n };\n}\n","import { CloseOutlined } from \"@ant-design/icons\";\nimport React, { useState } from \"react\";\nimport { Row, Col, Button } from \"antd\";\nimport { get } from \"lodash\";\n\nimport { FieldOption, FieldComponentProps } from \"./column-mappings-utils\";\nimport { createInputField } from \"./column-mappings-form-input\";\nimport { createRadioButton } from \"./column-mappings-form-radio\";\nimport styles from \"./column-mappings-form.module.css\";\n\ninterface ArrayFieldOptions {\n selectPrimary?: boolean;\n}\n\nexport function createArrayField(fields: Array, options: ArrayFieldOptions = {}) {\n return function(field: FieldOption) {\n return function ArrayFieldComponent(props: FieldComponentProps) {\n const { form, columnMapping, removeButton, modalButton, setDirty } = props;\n const { label, selector, key } = field;\n\n const [items, setItems] = useState(get(columnMapping, selector, []));\n const { getFieldValue, setFieldsValue } = form;\n\n const addItem = (): void => {\n setItems([...items, {}]);\n setDirty(true);\n };\n const removeItem = (itemIndex: number): void => {\n const newItems = items.filter((item: T, index: number) => itemIndex !== index);\n const formItems = getFieldValue(key);\n setFieldsValue({\n [key]: formItems.filter((item: T, index: number) => itemIndex !== index),\n });\n setItems(newItems);\n setDirty(true);\n };\n\n return (\n \n \n {label}\n \n \n \n \n \n \n {removeButton}\n \n <>\n {items.map((item: T, index: number) => (\n
\n }\n onClick={() => removeItem(index)}\n />\n {fields.map(\n ({\n key: fieldKey,\n selector: fieldSelector,\n ...restField\n }) =>\n createInputField({\n ...restField,\n key: [key, index, fieldKey],\n selector: [\n ...selector,\n `${index}`,\n ...fieldSelector,\n ],\n })({\n columnMapping,\n form,\n modalButton,\n setDirty,\n }),\n )}\n {options.selectPrimary &&\n createRadioButton({\n key: [key, index, \"primary\"],\n label: \"Primary\",\n selector: [...selector, `${index}`, \"primary\"],\n value: index,\n })({\n columnMapping,\n form,\n setDirty,\n })}\n
\n ))}\n \n \n
\n );\n };\n };\n}\n","import React from \"react\";\nimport { Row, Col, Form, Checkbox } from \"antd\";\nimport { get } from \"lodash\";\n\nimport { FieldOption, FieldComponentProps } from \"./column-mappings-utils\";\nimport styles from \"./column-mappings-form.module.css\";\n\nexport function createRadioButton(\n field: Omit & { value: number; key: string | Array },\n) {\n return function RadioButtonComponent(props: FieldComponentProps) {\n const { columnMapping } = props;\n const { label, selector, key } = field;\n const initialValue = get(columnMapping, selector, false);\n\n return (\n \n \n {label}\n \n \n \n \n \n \n \n );\n };\n}\n","import { ColumnMapping, ColumnMappingRequestBody, ColumnMappingTemplate } from \"@speakap/types\";\nimport { FormInstance } from \"antd/lib/form/Form\";\nimport { get, fromPairs, toPairs, some, omit, isEmpty } from \"lodash\";\nimport { notification } from \"antd\";\nimport { unflatten } from \"flat\";\n\nimport { createArrayField } from \"./column-mappings-form-array\";\nimport { createInputField } from \"./column-mappings-form-input\";\nimport { createObjectField } from \"./column-mappings-form-object\";\n\nconst SCIM_ENTERPRISE_USER_SCHEMA = \"urn:ietf:params:scim:schemas:extension:enterprise:2.0:User\";\nconst SPEAKAP_PARAM_BAG_SCHEMA = \"urn:speakap:params:scim:bag\";\n\nexport const DELIMITER = \"__\";\nexport const KEY_DELIMITER = \"%%\";\n\ninterface FieldValidations {\n validatePrimary?: boolean;\n}\n\nexport interface FieldOption {\n example?: string;\n label: string;\n selector: Array;\n key: string;\n required?: boolean;\n modal?: boolean;\n validations?: FieldValidations;\n}\n\nexport interface FieldComponentProps {\n form: FormInstance;\n setDirty: (value: boolean) => void;\n removeButton?: JSX.Element;\n modalButton?: (\n field: Omit & { key: Array | string },\n ) => JSX.Element;\n columnMapping?: Partial;\n}\n\nexport interface FieldComponentOption extends FieldOption {\n FieldComponent: (props: FieldComponentProps) => JSX.Element;\n}\n\nexport const options: Array = [\n {\n func: createInputField,\n label: \"External id\",\n required: true,\n selector: [\"template\", \"externalId\"],\n },\n {\n func: createInputField,\n label: \"Activity Control Exempt\",\n selector: [\"extras\", \"activityControlExempt\"],\n },\n {\n func: createInputField,\n label: \"Default role\",\n modal: false,\n selector: [\"extras\", \"defaultRole\"],\n },\n {\n func: createInputField,\n label: \"Login\",\n selector: [\"extras\", \"login\"],\n },\n {\n func: createInputField,\n label: \"Birthday\",\n selector: [\"extras\", \"birthday\"],\n },\n {\n func: createInputField,\n label: \"SMS\",\n selector: [\"extras\", \"sms\"],\n },\n {\n func: createInputField,\n label: \"Family name\",\n selector: [\"template\", \"name\", \"familyName\"],\n },\n {\n func: createInputField,\n label: \"Given name\",\n selector: [\"template\", \"name\", \"givenName\"],\n },\n {\n func: createInputField,\n label: \"Formatted name\",\n selector: [\"template\", \"name\", \"formatted\"],\n },\n {\n func: createInputField,\n label: \"Middle name\",\n selector: [\"template\", \"name\", \"middleName\"],\n },\n {\n func: createInputField,\n label: \"Honorifix prefix\",\n selector: [\"template\", \"name\", \"honorifixPrefix\"],\n },\n {\n func: createInputField,\n label: \"Honorifix suffix\",\n selector: [\"template\", \"name\", \"honorifixSuffix\"],\n },\n {\n func: createArrayField(\n [\n {\n example: \"NL, DE\",\n key: \"country\",\n label: \"Country code\",\n selector: [\"country\"],\n },\n {\n example: \"Main Street 10, 11234\",\n key: \"formatted\",\n label: \"Formatted\",\n selector: [\"formatted\"],\n },\n {\n example: \"Amsterdam\",\n key: \"locality\",\n label: \"Locality\",\n selector: [\"locality\"],\n },\n {\n example: \"1541 JE\",\n key: \"postalCode\",\n label: \"Postal code\",\n selector: [\"postalCode\"],\n },\n {\n example: \"Noord-Holland\",\n key: \"region\",\n label: \"Region\",\n selector: [\"region\"],\n },\n {\n example: \"Raadhuisstraat 102\",\n key: \"streetAddress\",\n label: \"Street address\",\n selector: [\"streetAddress\"],\n },\n { example: '\"work\"', key: \"type\", label: \"Type\", selector: [\"type\"] },\n ],\n { selectPrimary: true },\n ),\n label: \"Addresses\",\n selector: [\"template\", \"addresses\"],\n },\n {\n func: createArrayField(\n [\n {\n example: \"test@test.com\",\n key: \"value\",\n label: \"Value\",\n required: true,\n selector: [\"value\"],\n },\n {\n example: \"work\",\n key: \"type\",\n label: \"Type\",\n modal: false,\n selector: [\"type\"],\n },\n ],\n { selectPrimary: true },\n ),\n label: \"Emails\",\n selector: [\"template\", \"emails\"],\n validations: {\n validatePrimary: true,\n },\n },\n {\n func: createInputField,\n label: \"Active\",\n selector: [\"template\", \"active\"],\n },\n {\n func: createInputField,\n label: \"Display name\",\n selector: [\"template\", \"displayName\"],\n },\n {\n func: createInputField,\n label: \"Locale\",\n selector: [\"template\", \"locale\"],\n },\n {\n func: createInputField,\n label: \"Nick name\",\n selector: [\"template\", \"nickName\"],\n },\n {\n func: createInputField,\n label: \"Password\",\n selector: [\"template\", \"password\"],\n },\n {\n func: createArrayField(\n [\n {\n key: \"value\",\n label: \"Value\",\n required: true,\n selector: [\"value\"],\n },\n {\n key: \"type\",\n label: \"Type\",\n modal: false,\n selector: [\"type\"],\n },\n ],\n { selectPrimary: true },\n ),\n label: \"Phone numbers\",\n selector: [\"template\", \"phoneNumbers\"],\n },\n {\n example: \"en, nl-NL, nl, de-DE, nl-BE, en-GB\",\n func: createInputField,\n label: \"Preferred language code\",\n selector: [\"template\", \"preferredLanguage\"],\n },\n {\n func: createInputField,\n label: \"Title\",\n selector: [\"template\", \"title\"],\n },\n {\n func: createInputField,\n label: \"Timezone\",\n selector: [\"template\", \"timezone\"],\n },\n {\n func: createInputField,\n label: \"User type\",\n selector: [\"template\", \"userType\"],\n },\n {\n func: createInputField,\n label: \"Cost center\",\n selector: [\"template\", SCIM_ENTERPRISE_USER_SCHEMA, \"costCenter\"],\n },\n {\n func: createInputField,\n label: \"Department\",\n selector: [\"template\", SCIM_ENTERPRISE_USER_SCHEMA, \"department\"],\n },\n {\n func: createInputField,\n label: \"Division\",\n selector: [\"template\", SCIM_ENTERPRISE_USER_SCHEMA, \"division\"],\n },\n {\n func: createInputField,\n label: \"Employee number\",\n selector: [\"template\", SCIM_ENTERPRISE_USER_SCHEMA, \"employeeNumber\"],\n },\n {\n func: createInputField,\n label: \"Organization\",\n selector: [\"template\", SCIM_ENTERPRISE_USER_SCHEMA, \"organization\"],\n },\n {\n func: createObjectField([\n {\n key: \"value\",\n label: \"Value\",\n required: true,\n selector: [\"value\"],\n },\n {\n key: \"display\",\n label: \"Display\",\n selector: [\"display\"],\n },\n ]),\n label: \"Manager\",\n selector: [\"template\", SCIM_ENTERPRISE_USER_SCHEMA, \"manager\"],\n },\n {\n func: createArrayField([\n {\n key: \"key\",\n label: \"Target\",\n modal: false,\n required: true,\n selector: [\"key\"],\n },\n {\n key: \"value\",\n label: \"Source\",\n required: true,\n selector: [\"value\"],\n },\n ]),\n label: \"Additional fields\",\n selector: [\"template\", SPEAKAP_PARAM_BAG_SCHEMA],\n },\n].map(option => {\n /**\n * Transforming a selector to a key that is a string is a little bit complicated only because\n * there is a . (dot) in the key of the enterprise user in the SCIM type. That is why selector\n * is an array so that _.get() does not get confused. And KEY_DELIMITER is necessary so that\n * form.getFieldDecorator(key, {}) does not get confused.\n */\n const key = option.selector\n .map(selector => selector.replace(/\\./g, KEY_DELIMITER))\n .join(DELIMITER);\n const fieldOption: FieldOption = {\n example: option.example,\n key,\n label: option.label,\n modal: option.modal,\n required: option.required,\n selector: option.selector,\n validations: option.validations,\n };\n\n return {\n ...fieldOption,\n FieldComponent: option.func(fieldOption),\n };\n});\n\n// We have some very common fields in Speakap like \"role\" and \"login\",\n// that do not have any representation in our SCIM profile. In order\n// to not add a SCIM bag every time we use these fields, we let the UI\n// do that for us. Under the hood we are still using the SCIM bag, but\n// in the UI they are rendered as there own fields and they are not part\n// of the \"Additional fields\" anymore.\n// \"extras\" only play a role in this file. They get populated when a\n// column mapping template is parsed and removed when a column mapping\n// is submitted to the api.\n// If you want to add a field to \"extras\" edit this file in four places:\n// - add it to the \"options\" array.\n// - add it to the ColumnMappingExtras interface\n// - handle it in removeExtrasFromColumnMappingTemplate()\n// - handle it in extendColumnMappingTemplateWithExtras()\ninterface ColumnMappingExtras {\n defaultRole?: string;\n login?: string;\n birthday?: string;\n sms?: string;\n activityControlExempt?: string;\n}\n\nexport const removeExtrasFromColumnMappingTemplate = (\n columnMapping?: Partial & { extras?: ColumnMappingExtras },\n): (Partial & { extras?: ColumnMappingExtras }) | undefined => {\n if (columnMapping) {\n if (!columnMapping.template) {\n return columnMapping;\n }\n let additionalFields = columnMapping.template[SPEAKAP_PARAM_BAG_SCHEMA];\n const extras: ColumnMappingExtras = {};\n if (additionalFields) {\n additionalFields = additionalFields.filter(field => {\n if (field.key === \"role\") {\n extras.defaultRole = field.value;\n return false;\n } else if (field.key === \"login\") {\n extras.login = field.value;\n return false;\n } else if (field.key === \"birthday\") {\n extras.birthday = field.value;\n return false;\n } else if (field.key === \"sms\") {\n extras.sms = field.value;\n return false;\n } else if (field.key === \"activityControlExempt\") {\n extras.activityControlExempt = field.value;\n return false;\n }\n return true;\n });\n }\n return {\n ...columnMapping,\n extras: isEmpty(extras) ? undefined : extras,\n template:\n additionalFields && additionalFields.length === 0\n ? omit(columnMapping.template, SPEAKAP_PARAM_BAG_SCHEMA)\n : { ...columnMapping.template, [SPEAKAP_PARAM_BAG_SCHEMA]: additionalFields },\n };\n }\n};\n\nconst extendColumnMappingTemplateWithExtras = (\n extras: ColumnMappingExtras,\n columnMappingBody: ColumnMappingRequestBody,\n): ColumnMappingTemplate => {\n let additionalFields = columnMappingBody.template[SPEAKAP_PARAM_BAG_SCHEMA] || [];\n\n if (extras.defaultRole) {\n additionalFields = [\n ...additionalFields.filter(field => field.key !== \"role\"),\n {\n key: \"role\",\n value: extras.defaultRole,\n },\n ];\n }\n if (extras.login) {\n additionalFields = [\n ...additionalFields.filter(field => field.key !== \"login\"),\n {\n key: \"login\",\n value: extras.login,\n },\n ];\n }\n if (extras.birthday) {\n additionalFields = [\n ...additionalFields.filter(field => field.key !== \"birthday\"),\n {\n key: \"birthday\",\n value: extras.birthday,\n },\n ];\n }\n if (extras.sms) {\n additionalFields = [\n ...additionalFields.filter(field => field.key !== \"sms\"),\n {\n key: \"sms\",\n value: extras.sms,\n },\n ];\n }\n if (extras.activityControlExempt) {\n additionalFields = [\n ...additionalFields.filter(field => field.key !== \"activityControlExempt\"),\n {\n key: \"activityControlExempt\",\n value: extras.activityControlExempt,\n },\n ];\n }\n\n return {\n ...columnMappingBody.template,\n [SPEAKAP_PARAM_BAG_SCHEMA]: additionalFields,\n };\n};\n\n/**\n * getFields gets a list of fields that are already part of columnMapping. If columnMapping is\n * not set, return userName and externalId as required fields.\n */\nexport const getFields = (\n columnMapping?: Partial & { extras?: ColumnMappingExtras },\n): Array => {\n if (!columnMapping) {\n return [[\"template\", \"externalId\"].join(DELIMITER)];\n }\n\n return options.filter(({ selector }) => get(columnMapping, selector)).map(({ key }) => key);\n};\n\nexport const buildColumnMappingBody = (\n values: Record,\n): ColumnMappingRequestBody => {\n const fixedValues = fromPairs(\n toPairs(values).map(([key, value]) => [\n key.replace(new RegExp(KEY_DELIMITER, \"g\"), \".\"),\n value,\n ]),\n );\n const {\n extras,\n ...columnMappingBody\n }: ColumnMappingRequestBody & {\n extras?: ColumnMappingExtras;\n } = unflatten(fixedValues, {\n delimiter: DELIMITER,\n });\n\n if (extras) {\n columnMappingBody.template = extendColumnMappingTemplateWithExtras(\n extras,\n columnMappingBody,\n );\n }\n\n return columnMappingBody;\n};\n\nexport const validateColumnMappingBody = (columnMappingBody: ColumnMappingRequestBody): boolean => {\n for (const option of options) {\n const values = get(columnMappingBody, option.selector);\n if (values && option.validations?.validatePrimary && !some(values, { primary: true })) {\n notification.error({\n message: `Please mark one item of \"${option.label}\" as primary.`,\n });\n return false;\n }\n }\n\n return true;\n};\n","import React from \"react\";\nimport { Row, Col } from \"antd\";\n\nimport { FieldOption, FieldComponentProps } from \"./column-mappings-utils\";\nimport { createInputField } from \"./column-mappings-form-input\";\nimport styles from \"./column-mappings-form.module.css\";\n\nexport function createObjectField(fields: Array) {\n return function(field: FieldOption) {\n return function ObjectFieldComponent(props: FieldComponentProps) {\n const { removeButton, ...restProps } = props;\n const { label, selector, key } = field;\n\n return (\n \n \n {label}\n \n \n \n {removeButton}\n \n
\n {fields.map(\n ({ key: fieldKey, selector: fieldSelector, ...restField }) =>\n createInputField({\n ...restField,\n key: `${key}.${fieldKey}`,\n selector: [...selector, ...fieldSelector],\n })(restProps),\n )}\n
\n \n
\n );\n };\n };\n}\n","import { createSelector } from \"reselect\";\n\nimport { ApplicationState } from \"../reducer\";\nimport { RoleMappingsState } from \"./reducer\";\n\nconst selectRoleMappings = (state: ApplicationState): RoleMappingsState => state.roleMappings;\n\nexport const selectRoleMappingsItems = createSelector(selectRoleMappings, ({ items }) => items);\nconst selectRoleMappingsResults = createSelector(selectRoleMappings, ({ results }) => results);\n\nexport const selectRoleMappingsList = createSelector(\n [selectRoleMappingsItems, selectRoleMappingsResults],\n (items, results) => results.map(id => items[id]),\n);\n\nexport const selectRoleMappingsLoadingState = createSelector(\n selectRoleMappings,\n ({ loadingState }) => loadingState,\n);\n\nconst selectEdit = createSelector(selectRoleMappings, ({ edit }) => edit);\n\nexport const selectEditLoadingState = createSelector(\n selectEdit,\n ({ loadingState }) => loadingState,\n);\n\nexport const selectRoleMappingsNetworkId = createSelector(\n selectRoleMappings,\n ({ networkId }) => networkId,\n);\n","import { createSelector } from \"reselect\";\n\nimport { ApplicationState } from \"../reducer\";\nimport { SyncProtocolState } from \"./reducer\";\n\nconst selectSyncProtocolState = (state: ApplicationState): SyncProtocolState => state.syncProtocols;\n\nexport const selectSyncProtocolLoadingState = createSelector(\n selectSyncProtocolState,\n ({ loadingState }) => loadingState,\n);\nexport const selectSyncProtocols = createSelector(\n selectSyncProtocolState,\n ({ protocols }) => protocols,\n);\nexport const selectSyncProtocolsHasMore = createSelector(\n selectSyncProtocolState,\n ({ hasMore }) => hasMore,\n);\nexport const selectSyncProtocolsOffset = createSelector(\n selectSyncProtocolState,\n ({ offset }) => offset,\n);\n","import { createSelector } from \"reselect\";\n\nimport { ApplicationState } from \"../reducer\";\nimport { SyncedUsersState } from \"./reducer\";\n\nconst selectSyncedUsersState = (state: ApplicationState): SyncedUsersState => state.syncedUsers;\n\nexport const selectSyncedUsersLoadingState = createSelector(\n selectSyncedUsersState,\n ({ loadingState }) => loadingState,\n);\nexport const selectSyncedUsers = createSelector(\n selectSyncedUsersState,\n ({ syncedUsers }) => syncedUsers,\n);\nexport const selectSyncedUsersNetworkId = createSelector(\n selectSyncedUsersState,\n ({ networkId }) => networkId,\n);\n\nexport const selectIsLoadingMore = createSelector(\n selectSyncedUsersState,\n ({ isLoadingMore }) => isLoadingMore,\n);\n","import { Link } from \"react-router-dom\";\nimport React from \"react\";\nimport cx from \"classnames\";\n\nimport styles from \"./logo.module.css\";\nimport userSyncLogo from \"./Speakap user sync - colour.png\";\n\ninterface LogoProps {\n size?: \"medium\" | \"large\";\n}\n\nconst Logo = ({ size = \"medium\" }: LogoProps): JSX.Element => (\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n /* @ts-ignore */\n \n \"Speakap\n \n);\n\nexport default Logo;\n","export { default } from \"./logo\";\n","module.exports = __webpack_public_path__ + \"static/media/Speakap user sync - colour.f000c2b5.png\";","import {\n EnhancedNotification,\n NotificationRequestBody,\n Subscriber,\n SubscriberRequestBody,\n EmailNotificationRequestBody,\n JobPostRequest,\n Job,\n Email,\n JobPatchRequest,\n} from \"@speakap/types\";\nimport { ThunkAction } from \"redux-thunk\";\nimport { get } from \"lodash\";\nimport { notification } from \"antd\";\n\nimport { ApplicationState } from \"../reducer\";\nimport {\n getNotifications,\n getSubscribers,\n postNewNotification,\n postNewSubscriber,\n sendEmailsForNotification,\n sendScheduleNotification,\n updateNotification,\n putSubscriber,\n deleteNotification,\n patchScheduleNotification,\n} from \"../api\";\n\nexport const FETCH_NOTIFICATIONS_REQUEST = \"FETCH_NOTIFICATIONS_REQUEST\";\nexport const FETCH_NOTIFICATIONS_SUCCESS = \"FETCH_NOTIFICATIONS_SUCCESS\";\nexport const FETCH_NOTIFICATIONS_ERROR = \"FETCH_NOTIFICATIONS_ERROR\";\n\nexport const FETCH_NETWORK_SUBSCRIBERS_REQUEST = \"FETCH_NETWORK_SUBSCRIBERS_REQUEST\";\nexport const FETCH_NETWORK_SUBSCRIBERS_SUCCESS = \"FETCH_NETWORK_SUBSCRIBERS_SUCCESS\";\nexport const FETCH_NETWORK_SUBSCRIBERS_ERROR = \"FETCH_NETWORK_SUBSCRIBERS_ERROR\";\n\nexport const SUBMIT_NOTIFICATION_REQUEST = \"SUBMIT_NOTIFICATION_REQUEST\";\nexport const SUBMIT_NOTIFICATION_SUCCESS = \"SUBMIT_NOTIFICATION_SUCCESS\";\nexport const SUBMIT_NOTIFICATION_ERROR = \"SUBMIT_NOTIFICATION_ERROR\";\n\nexport const UPDATE_NOTIFICATION_REQUEST = \"UPDATE_NOTIFICATION_REQUEST\";\nexport const UPDATE_NOTIFICATION_SUCCESS = \"UPDATE_NOTIFICATION_SUCCESS\";\nexport const UPDATE_NOTIFICATION_ERROR = \"UPDATE_NOTIFICATION_ERROR\";\n\nexport const DELETE_NOTIFICATION_REQUEST = \"DELETE_NOTIFICATION_REQUEST\";\nexport const DELETE_NOTIFICATION_SUCCESS = \"DELETE_NOTIFICATION_SUCCESS\";\nexport const DELETE_NOTIFICATION_ERROR = \"DELETE_NOTIFICATION_ERROR\";\n\nexport const SUBMIT_SUBSCRIBER_REQUEST = \"SUBMIT_SUBSCRIBER_REQUEST\";\nexport const SUBMIT_SUBSCRIBER_SUCCESS = \"SUBMIT_SUBSCRIBER_SUCCESS\";\nexport const SUBMIT_SUBSCRIBER_ERROR = \"SUBMIT_SUBSCRIBER_ERROR\";\n\nexport const SEND_EMAIL_NOTIFICATION_REQUEST = \"SEND_EMAIL_NOTIFICATION_REQUEST\";\nexport const SEND_EMAIL_NOTIFICATION_SUCCESS = \"SEND_EMAIL_NOTIFICATION_SUCCESS\";\nexport const SEND_EMAIL_NOTIFICATION_ERROR = \"SEND_EMAIL_NOTIFICATION_ERROR\";\nexport const SEND_EMAIL_NOTIFICATION_RESET = \"SEND_EMAIL_NOTIFICATION_RESET\";\n\nexport const SCHEDULE_NOTIFICATION_REQUEST = \"SCHEDULE_NOTIFICATION_REQUEST\";\nexport const SCHEDULE_NOTIFICATION_SUCCESS = \"SCHEDULE_NOTIFICATION_SUCCESS\";\nexport const SCHEDULE_NOTIFICATION_ERROR = \"SCHEDULE_NOTIFICATION_ERROR\";\n\nexport const SET_EDIT_SUBSCRIBER = \"SET_EDIT_SUBSCRIBER\";\nexport const SET_EDIT_NOTIFICATION = \"SET_EDIT_NOTIFICATION\";\n\ninterface FetchNotificationsRequestAction {\n type: typeof FETCH_NOTIFICATIONS_REQUEST;\n}\n\ninterface FetchNotificationsSuccessAction {\n type: typeof FETCH_NOTIFICATIONS_SUCCESS;\n payload: Array;\n}\n\ninterface FetchNotificationsErrorAction {\n type: typeof FETCH_NOTIFICATIONS_ERROR;\n}\n\ninterface FetchSubscribersRequestAction {\n type: typeof FETCH_NETWORK_SUBSCRIBERS_REQUEST;\n}\n\ninterface FetchSubscribersSuccessAction {\n type: typeof FETCH_NETWORK_SUBSCRIBERS_SUCCESS;\n payload: Array;\n}\n\ninterface FetchSubscribersErrorAction {\n type: typeof FETCH_NETWORK_SUBSCRIBERS_ERROR;\n}\n\ninterface SubmitNotificationRequestAction {\n type: typeof SUBMIT_NOTIFICATION_REQUEST;\n}\n\ninterface SubmitNotificationSuccessAction {\n type: typeof SUBMIT_NOTIFICATION_SUCCESS;\n payload: EnhancedNotification;\n}\n\ninterface SubmitNotificationErrorAction {\n type: typeof SUBMIT_NOTIFICATION_ERROR;\n}\n\ninterface UpdateNotificationRequestAction {\n type: typeof UPDATE_NOTIFICATION_REQUEST;\n}\n\ninterface UpdateNotificationSuccessAction {\n type: typeof UPDATE_NOTIFICATION_SUCCESS;\n payload: EnhancedNotification;\n}\n\ninterface UpdateNotificationErrorAction {\n type: typeof UPDATE_NOTIFICATION_ERROR;\n}\n\ninterface DeleteNotificationRequestAction {\n type: typeof DELETE_NOTIFICATION_REQUEST;\n}\n\ninterface DeleteNotificationSuccessAction {\n type: typeof DELETE_NOTIFICATION_SUCCESS;\n payload: number;\n}\n\ninterface DeleteNotificationErrorAction {\n type: typeof DELETE_NOTIFICATION_ERROR;\n}\n\ninterface SubmitSubscriberRequestAction {\n type: typeof SUBMIT_SUBSCRIBER_REQUEST;\n}\n\ninterface SubmitSubscriberSuccessAction {\n type: typeof SUBMIT_SUBSCRIBER_SUCCESS;\n payload: Subscriber;\n}\n\ninterface SubmitSubscriberErrorAction {\n type: typeof SUBMIT_SUBSCRIBER_ERROR;\n}\n\ninterface SendEmailNotificationRequestAction {\n type: typeof SEND_EMAIL_NOTIFICATION_REQUEST;\n}\n\ninterface SendEmailNotificationSuccessAction {\n type: typeof SEND_EMAIL_NOTIFICATION_SUCCESS;\n payload: {\n status: number;\n email: Email;\n };\n}\n\ninterface SendEmailNotificationErrorAction {\n type: typeof SEND_EMAIL_NOTIFICATION_ERROR;\n}\n\ninterface SendEmailNotificationResetAction {\n type: typeof SEND_EMAIL_NOTIFICATION_RESET;\n}\n\ninterface ScheduleNotificationRequestAction {\n type: typeof SCHEDULE_NOTIFICATION_REQUEST;\n}\n\ninterface ScheduleNotificationSuccessAction {\n type: typeof SCHEDULE_NOTIFICATION_SUCCESS;\n payload: Job;\n}\n\ninterface ScheduleNotificationErrorAction {\n type: typeof SCHEDULE_NOTIFICATION_ERROR;\n}\n\ninterface SetEditSubscriberAction {\n type: typeof SET_EDIT_SUBSCRIBER;\n payload: {\n subscriber?: Subscriber;\n mode: \"new\" | \"edit\" | \"closed\";\n };\n}\n\ninterface SetEditNotificationAction {\n type: typeof SET_EDIT_NOTIFICATION;\n payload: {\n notification?: EnhancedNotification;\n mode: \"new\" | \"edit\" | \"closed\";\n };\n}\n\nexport type NotificationsActions =\n | FetchNotificationsRequestAction\n | FetchNotificationsSuccessAction\n | FetchNotificationsErrorAction\n | SubmitNotificationRequestAction\n | SubmitNotificationSuccessAction\n | SubmitNotificationErrorAction\n | FetchSubscribersSuccessAction\n | FetchSubscribersRequestAction\n | FetchSubscribersErrorAction\n | SubmitSubscriberRequestAction\n | SubmitSubscriberSuccessAction\n | SubmitSubscriberErrorAction\n | UpdateNotificationErrorAction\n | UpdateNotificationRequestAction\n | UpdateNotificationSuccessAction\n | DeleteNotificationErrorAction\n | DeleteNotificationRequestAction\n | DeleteNotificationSuccessAction\n | SendEmailNotificationErrorAction\n | SendEmailNotificationRequestAction\n | SendEmailNotificationSuccessAction\n | SendEmailNotificationResetAction\n | ScheduleNotificationErrorAction\n | ScheduleNotificationSuccessAction\n | ScheduleNotificationRequestAction\n | SetEditSubscriberAction\n | SetEditNotificationAction;\n\ntype Thunk = ThunkAction;\n\nexport const setEditSubscriber = ({\n subscriber,\n mode,\n}: {\n subscriber?: Subscriber;\n mode: \"new\" | \"edit\" | \"closed\";\n}): SetEditSubscriberAction => ({\n payload: {\n mode,\n subscriber,\n },\n type: SET_EDIT_SUBSCRIBER,\n});\n\nexport const setEditNotification = ({\n notification,\n mode,\n}: {\n notification?: EnhancedNotification;\n mode: \"new\" | \"edit\" | \"closed\";\n}): SetEditNotificationAction => ({\n payload: {\n mode,\n notification,\n },\n type: SET_EDIT_NOTIFICATION,\n});\n\nexport const fetchNotifications = (networkId: string): Thunk> => async dispatch => {\n try {\n dispatch({ type: FETCH_NOTIFICATIONS_REQUEST });\n\n const response = await getNotifications(networkId);\n dispatch({ payload: response.notifications, type: FETCH_NOTIFICATIONS_SUCCESS });\n } catch (error) {\n dispatch({\n message: error instanceof Error ? error.message : \"Error\",\n type: FETCH_NOTIFICATIONS_ERROR,\n });\n }\n};\n\nexport const submitNewNotification = (\n newNotification: NotificationRequestBody,\n): Thunk> => async dispatch => {\n try {\n dispatch({ type: SUBMIT_NOTIFICATION_REQUEST });\n\n const response = await postNewNotification(newNotification);\n dispatch({ payload: response, type: SUBMIT_NOTIFICATION_SUCCESS });\n notification.success({ message: \"Notification successfully created!\" });\n } catch (error) {\n dispatch({ type: SUBMIT_NOTIFICATION_ERROR });\n\n notification.error({\n message: `Error creating notification: ${get(\n error,\n [\"response\", \"data\"],\n error instanceof Error ? error.message : \"Error\",\n )}`,\n });\n }\n};\n\nexport const postUpdateNotification = (\n enhancedNotification: EnhancedNotification,\n): Thunk> => async dispatch => {\n try {\n dispatch({ payload: enhancedNotification, type: UPDATE_NOTIFICATION_REQUEST });\n\n const response: EnhancedNotification = await updateNotification(enhancedNotification);\n dispatch({ payload: response, type: UPDATE_NOTIFICATION_SUCCESS });\n notification.success({ message: \"Notification successfully updated\" });\n } catch (error) {\n dispatch({ type: UPDATE_NOTIFICATION_ERROR });\n notification.error({\n message: `Error updating notification: ${get(\n error,\n [\"response\", \"data\"],\n error instanceof Error ? error.message : \"Error\",\n )}`,\n });\n }\n};\n\nexport const postDeleteNotification = (\n networkId: string,\n notificationId: number,\n): Thunk> => async dispatch => {\n try {\n dispatch({ type: DELETE_NOTIFICATION_REQUEST });\n\n await deleteNotification(networkId, notificationId);\n dispatch({ payload: notificationId, type: DELETE_NOTIFICATION_SUCCESS });\n notification.success({ message: \"Notification successfully deleted\" });\n } catch (error) {\n dispatch({ type: DELETE_NOTIFICATION_ERROR });\n notification.error({\n message: `Error delete notification: ${get(\n error,\n [\"response\", \"data\"],\n error instanceof Error ? error.message : \"Error\",\n )}`,\n });\n }\n};\n\nexport const sendEmailsNotification = (\n notificationObject: EmailNotificationRequestBody,\n): Thunk> => async dispatch => {\n try {\n dispatch({ type: SEND_EMAIL_NOTIFICATION_REQUEST });\n const { status, email } = await sendEmailsForNotification(notificationObject);\n dispatch({\n payload: {\n email,\n status,\n },\n type: SEND_EMAIL_NOTIFICATION_SUCCESS,\n });\n if (status === 201) {\n notification.success({ message: \"Emails sent successfully\" });\n } else if (status === 204) {\n notification.warning({ message: \"No log entries found\" });\n }\n } catch (error) {\n dispatch({ type: SEND_EMAIL_NOTIFICATION_ERROR });\n notification.error({\n message: `Error sending emails: ${get(\n error,\n [\"response\", \"data\"],\n error instanceof Error ? error.message : \"Error\",\n )}`,\n });\n }\n};\n\nexport const sendEmailsReset = (): SendEmailNotificationResetAction => ({\n type: \"SEND_EMAIL_NOTIFICATION_RESET\",\n});\n\nexport const fetchNetworkSubscribers = (\n networkId: string,\n): Thunk> => async dispatch => {\n try {\n dispatch({ type: FETCH_NETWORK_SUBSCRIBERS_REQUEST });\n\n const response = await getSubscribers(networkId);\n dispatch({ payload: response.subscribers, type: FETCH_NETWORK_SUBSCRIBERS_SUCCESS });\n } catch (error) {\n dispatch({\n message: error instanceof Error ? error.message : \"Error\",\n type: FETCH_NETWORK_SUBSCRIBERS_ERROR,\n });\n }\n};\n\nexport const submitNewSubscriber = (\n newSubscriber: SubscriberRequestBody,\n networkId: string,\n): Thunk> => async dispatch => {\n try {\n dispatch({ type: SUBMIT_SUBSCRIBER_REQUEST });\n\n const response = await postNewSubscriber(newSubscriber, networkId);\n dispatch({ payload: response, type: SUBMIT_SUBSCRIBER_SUCCESS });\n notification.success({ message: \"Subscriber successfully created\" });\n } catch (error) {\n dispatch({ type: SUBMIT_SUBSCRIBER_ERROR });\n notification.error({\n message: `Error creating Subscriber: ${get(\n error,\n [\"response\", \"data\"],\n error instanceof Error ? error.message : \"Error\",\n )}`,\n });\n }\n};\n\nexport const updateSubscriber = (\n subscriber: Subscriber,\n networkId: string,\n): Thunk> => async dispatch => {\n try {\n dispatch({ type: SUBMIT_SUBSCRIBER_REQUEST });\n\n const response = await putSubscriber(subscriber, networkId);\n dispatch({ payload: response, type: SUBMIT_SUBSCRIBER_SUCCESS });\n notification.success({ message: \"Subscriber successfully updated\" });\n } catch (error) {\n dispatch({ type: SUBMIT_SUBSCRIBER_ERROR });\n notification.error({\n message: `Error updating Subscriber: ${get(\n error,\n [\"response\", \"data\"],\n error instanceof Error ? error.message : \"Error\",\n )}`,\n });\n }\n};\n\nexport const scheduleNotification = (\n scheduleObject: Omit,\n): Thunk> => async dispatch => {\n try {\n dispatch({ type: SCHEDULE_NOTIFICATION_REQUEST });\n const response = await sendScheduleNotification(scheduleObject);\n dispatch({ payload: response, type: SCHEDULE_NOTIFICATION_SUCCESS });\n notification.success({ message: \"Notification successfully scheduled\" });\n } catch (error) {\n dispatch({ type: SCHEDULE_NOTIFICATION_ERROR });\n notification.error({\n message: `Error scheduling notification: ${get(\n error,\n [\"response\", \"data\"],\n error instanceof Error ? error.message : \"Error\",\n )}`,\n });\n }\n};\n\nexport const updateScheduleNotification = (\n jobPatch: JobPatchRequest,\n networkId: string,\n jobId: string,\n): Thunk> => async dispatch => {\n try {\n dispatch({ type: SCHEDULE_NOTIFICATION_REQUEST });\n const response = await patchScheduleNotification(jobPatch, networkId, jobId);\n dispatch({ payload: response, type: SCHEDULE_NOTIFICATION_SUCCESS });\n if (jobPatch.schedule) {\n notification.success({ message: \"Schedule successfully updated\" });\n } else if (jobPatch.active) {\n notification.success({ message: \"Schedule successfully unpaused\" });\n } else {\n notification.success({ message: \"Schedule successfully paused\" });\n }\n } catch (error) {\n dispatch({ type: SCHEDULE_NOTIFICATION_ERROR });\n notification.error({\n message: `Error pausing notification: ${get(\n error,\n [\"response\", \"data\"],\n error instanceof Error ? error.message : \"Error\",\n )}`,\n });\n }\n};\n","import { ConfigRequestBody, EnhancedConfig, Job, JobPatchRequest, Config } from \"@speakap/types\";\nimport { LOCKED } from \"http-status-codes\";\nimport { ThunkAction } from \"redux-thunk\";\nimport { get } from \"lodash\";\nimport { notification } from \"antd\";\nimport { push, CallHistoryMethodAction } from \"connected-react-router\";\n\nimport { ApplicationState } from \"../reducer\";\nimport {\n deleteJob,\n getConfigs,\n patchJob,\n postJob,\n postNewConfig,\n postUpdatedConfig,\n syncUsers,\n} from \"../api\";\nimport routes from \"../routes\";\nimport { selectEditItem } from \"./selectors\";\n\nexport const CREATE_NEW_CONFIG_START = \"user-sync/configs/CREATE_NEW_CONFIG_START\";\nexport const CREATE_NEW_CONFIG_STOP = \"user-sync/configs/CREATE_NEW_CONFIG_STOP\";\n\nexport const EDIT_CONFIG_START = \"user-sync/configs/EDIT_CONFIG_START\";\nexport const EDIT_CONFIG_STOP = \"user-sync/configs/EDIT_CONFIG_STOP\";\n\nexport const FETCH_CONFIGS_REQUEST = \"user-sync/configs/FETCH_CONFIGS_REQUEST\";\nexport const FETCH_CONFIGS_SUCCESS = \"user-sync/configs/FETCH_CONFIGS_SUCCESS\";\nexport const FETCH_CONFIGS_ERROR = \"user-sync/configs/FETCH_CONFIGS_ERROR\";\n\nexport const SET_SCHEDULE_REQUEST = \"user-sync/configs/SET_SCHEDULE_REQUEST\";\nexport const SET_SCHEDULE_SUCCESS = \"user-sync/configs/SET_SCHEDULE_SUCCESS\";\nexport const SET_SCHEDULE_ERROR = \"user-sync/configs/SET_SCHEDULE_ERROR\";\n\nexport const SYNC_USERS_REQUEST = \"user-sync/configs/SYNC_USERS_REQUEST\";\nexport const SYNC_USERS_SUCCESS = \"user-sync/configs/SYNC_USERS_SUCCESS\";\nexport const SYNC_USERS_ERROR = \"user-sync/configs/SYNC_USERS_ERROR\";\n\nexport const SUBMIT_NEW_CONFIG_REQUEST = \"user-sync/configs/SUBMIT_NEW_CONFIG_REQUEST\";\nexport const SUBMIT_NEW_CONFIG_SUCCESS = \"user-sync/configs/SUBMIT_NEW_CONFIG_SUCCESS\";\nexport const SUBMIT_NEW_CONFIG_ERROR = \"user-sync/configs/SUBMIT_NEW_CONFIG_ERROR\";\nexport const SUBMIT_UPDATED_CONFIG_REQUEST = \"user-sync/configs/SUBMIT_UPDATED_CONFIG_REQUEST\";\nexport const SUBMIT_UPDATED_CONFIG_SUCCESS = \"user-sync/configs/SUBMIT_UPDATED_CONFIG_SUCCESS\";\nexport const SUBMIT_UPDATED_CONFIG_ERROR = \"user-sync/configs/SUBMIT_UPDATED_CONFIG_ERROR\";\n\nexport const SET_SELECTED_CONFIG = \"user-sync/configs/SET_SELECTED_CONFIG\";\n\nexport const UNSET_SCHEDULE_REQUEST = \"user-sync/configs/UNSET_SCHEDULE_REQUEST\";\nexport const UNSET_SCHEDULE_SUCCESS = \"user-sync/configs/UNSET_SCHEDULE_SUCCESS\";\nexport const UNSET_SCHEDULE_ERROR = \"user-sync/configs/UNSET_SCHEDULE_ERROR\";\n\nexport const UPDATE_EDIT_CONFIG = \"user-sync/configs/UPDATE_EDIT_CONFIG\";\n\ninterface CreateNewConfigStartAction {\n type: typeof CREATE_NEW_CONFIG_START;\n}\n\ninterface CreateNewConfigStopAction {\n type: typeof CREATE_NEW_CONFIG_STOP;\n}\n\ninterface EditConfigStartAction {\n payload: EnhancedConfig;\n type: typeof EDIT_CONFIG_START;\n}\n\ninterface EditConfigStopAction {\n type: typeof EDIT_CONFIG_STOP;\n}\n\ninterface FetchConfigsRequestAction {\n type: typeof FETCH_CONFIGS_REQUEST;\n payload: string;\n}\n\ninterface FetchConfigsSuccessAction {\n type: typeof FETCH_CONFIGS_SUCCESS;\n payload: Array;\n}\n\ninterface FetchConfigsErrorAction {\n type: typeof FETCH_CONFIGS_ERROR;\n}\n\ninterface SetScheduleRequestAction {\n type: typeof SET_SCHEDULE_REQUEST;\n}\n\ninterface SetScheduleSuccessAction {\n payload: Job;\n type: typeof SET_SCHEDULE_SUCCESS;\n}\n\ninterface SetScheduleErrorAction {\n type: typeof SET_SCHEDULE_ERROR;\n}\n\ninterface SubmitNewConfigRequestAction {\n type: typeof SUBMIT_NEW_CONFIG_REQUEST;\n payload: ConfigRequestBody;\n}\n\ninterface SubmitNewConfigSuccessAction {\n type: typeof SUBMIT_NEW_CONFIG_SUCCESS;\n payload: EnhancedConfig;\n}\n\ninterface SubmitNewConfigErrorAction {\n type: typeof SUBMIT_NEW_CONFIG_ERROR;\n}\n\ninterface SubmitUpdatedConfigRequestAction {\n type: typeof SUBMIT_UPDATED_CONFIG_REQUEST;\n payload: { activeRevisionId: number; config: ConfigRequestBody };\n}\n\ninterface SubmitUpdatedConfigSuccessAction {\n type: typeof SUBMIT_UPDATED_CONFIG_SUCCESS;\n payload: EnhancedConfig;\n}\n\ninterface SubmitUpdatedConfigErrorAction {\n type: typeof SUBMIT_UPDATED_CONFIG_ERROR;\n}\n\ninterface SetSelectedConfigAction {\n type: typeof SET_SELECTED_CONFIG;\n payload: string;\n}\n\ninterface SyncUsersRequestAction {\n type: typeof SYNC_USERS_REQUEST;\n}\n\ninterface SyncUsersSuccessAction {\n type: typeof SYNC_USERS_SUCCESS;\n}\n\ninterface SyncUsersErrorAction {\n type: typeof SYNC_USERS_ERROR;\n}\n\ninterface UnsetScheduleRequestAction {\n type: typeof UNSET_SCHEDULE_REQUEST;\n}\n\ninterface UnsetScheduleSuccessAction {\n type: typeof UNSET_SCHEDULE_SUCCESS;\n}\n\ninterface UnsetScheduleErrorAction {\n type: typeof UNSET_SCHEDULE_ERROR;\n}\n\ninterface UpdateEditConfigAction {\n type: typeof UPDATE_EDIT_CONFIG;\n payload: Partial;\n}\n\nexport type ConfigsAction =\n | CreateNewConfigStartAction\n | CreateNewConfigStopAction\n | EditConfigStartAction\n | EditConfigStopAction\n | FetchConfigsRequestAction\n | FetchConfigsSuccessAction\n | FetchConfigsErrorAction\n | SetScheduleRequestAction\n | SetScheduleSuccessAction\n | SetScheduleErrorAction\n | SetSelectedConfigAction\n | SubmitNewConfigRequestAction\n | SubmitNewConfigSuccessAction\n | SubmitNewConfigErrorAction\n | SubmitUpdatedConfigRequestAction\n | SubmitUpdatedConfigSuccessAction\n | SubmitUpdatedConfigErrorAction\n | SyncUsersRequestAction\n | SyncUsersSuccessAction\n | SyncUsersErrorAction\n | UnsetScheduleRequestAction\n | UnsetScheduleSuccessAction\n | UnsetScheduleErrorAction\n | UpdateEditConfigAction;\n\ntype Thunk = ThunkAction<\n Promise,\n ApplicationState,\n void,\n CallHistoryMethodAction | ConfigsAction\n>;\n\nexport const setSelectedConfig = (configName: string): SetSelectedConfigAction => ({\n payload: configName,\n type: SET_SELECTED_CONFIG,\n});\n\nexport const createNewConfigStart = (): CreateNewConfigStartAction => ({\n type: CREATE_NEW_CONFIG_START,\n});\n\nexport const createNewConfigStop = (): CreateNewConfigStopAction => ({\n type: CREATE_NEW_CONFIG_STOP,\n});\n\nexport const editConfigStart = (config: EnhancedConfig): EditConfigStartAction => ({\n payload: config,\n type: EDIT_CONFIG_START,\n});\n\nexport const editConfigStop = (): EditConfigStopAction => ({\n type: EDIT_CONFIG_STOP,\n});\n\nexport const fetchConfigs = (networkId: string): Thunk => async dispatch => {\n try {\n dispatch({ payload: networkId, type: FETCH_CONFIGS_REQUEST });\n\n const response = await getConfigs({ networkId });\n dispatch({ payload: response.configs, type: FETCH_CONFIGS_SUCCESS });\n } catch (error) {\n dispatch({\n message: error instanceof Error ? error.message : \"Error\",\n type: FETCH_CONFIGS_ERROR,\n });\n }\n};\n\nexport const setNewSchedule = (\n config: EnhancedConfig,\n schedule: string,\n): Thunk<[string | null, Job | null]> => async dispatch => {\n try {\n dispatch({ type: SET_SCHEDULE_REQUEST });\n\n const job = await postJob(config, {\n networkId: config.networkId,\n resourceIdentifier: config.name,\n schedule,\n });\n dispatch({ payload: job, type: SET_SCHEDULE_SUCCESS });\n return [null, job];\n } catch (error) {\n dispatch({ type: SET_SCHEDULE_ERROR });\n return [\n `Error setting schedule: ${error instanceof Error ? error.message : \"Error\"}`,\n null,\n ];\n }\n};\n\nexport const updateSchedule = (\n config: EnhancedConfig,\n jobId: string,\n jobRequest: JobPatchRequest,\n): Thunk<[string | null, Job | null]> => async dispatch => {\n try {\n dispatch({ type: SET_SCHEDULE_REQUEST });\n\n const job = await patchJob(config, jobId, jobRequest);\n dispatch({ payload: job, type: SET_SCHEDULE_SUCCESS });\n\n return [null, job];\n } catch (error) {\n dispatch({ type: SET_SCHEDULE_ERROR });\n return [\n `Error updating schedule: ${error instanceof Error ? error.message : \"Error\"}`,\n null,\n ];\n }\n};\n\nexport const setUpdatedSchedule = (jobRequest: JobPatchRequest): Thunk => async (\n dispatch,\n getState,\n) => {\n const editItem = selectEditItem(getState());\n if (!editItem?.config.job?.id) {\n throw new Error(\"Cannot update schedule without scheduled config\");\n }\n\n try {\n dispatch({ type: SET_SCHEDULE_REQUEST });\n\n const job = await patchJob(editItem.config, editItem.config.job.id, jobRequest);\n dispatch({ payload: job, type: SET_SCHEDULE_SUCCESS });\n\n notification.success({\n message: job.active === false ? \"Schedule suspended\" : \"Schedule updated\",\n });\n } catch (error) {\n dispatch({ type: SET_SCHEDULE_ERROR });\n\n notification.error({\n message: `Error updating schedule: ${error instanceof Error ? error.message : \"Error\"}`,\n });\n\n throw error;\n }\n};\n\nexport const submitNewConfig = (config: ConfigRequestBody): Thunk => async dispatch => {\n try {\n dispatch({ payload: config, type: SUBMIT_NEW_CONFIG_REQUEST });\n\n const response = await postNewConfig(config);\n dispatch({ payload: response, type: SUBMIT_NEW_CONFIG_SUCCESS });\n\n notification.success({ message: \"Successfully created\" });\n dispatch(push(routes.configs.url(config.networkId)));\n } catch (error) {\n dispatch({ type: SUBMIT_NEW_CONFIG_ERROR });\n\n notification.error({\n message: `Error creating config: ${get(\n error,\n [\"response\", \"data\"],\n error instanceof Error ? error.message : \"Error\",\n )}`,\n });\n }\n};\n\nexport const submitUpdatedConfig = (\n activeRevisionId: number,\n config: ConfigRequestBody,\n): Thunk => async dispatch => {\n try {\n dispatch({ payload: { activeRevisionId, config }, type: SUBMIT_UPDATED_CONFIG_REQUEST });\n\n const response = await postUpdatedConfig(activeRevisionId, config);\n dispatch({ payload: response, type: SUBMIT_UPDATED_CONFIG_SUCCESS });\n\n notification.success({ message: \"Successfully updated\" });\n } catch (error) {\n dispatch({ type: SUBMIT_UPDATED_CONFIG_ERROR });\n\n notification.error({\n message: `Error updating config: ${error instanceof Error ? error.message : \"Error\"}`,\n });\n }\n};\n\nexport const syncUsersToSpeakap = (\n config: Config,\n dryRunToken: string,\n skipMismatch = false,\n): Thunk => async dispatch => {\n try {\n dispatch({ type: SYNC_USERS_REQUEST });\n\n await syncUsers(config, dryRunToken, skipMismatch);\n dispatch({ type: SYNC_USERS_SUCCESS });\n dispatch(push(routes.syncProtocols.url(config.networkId)));\n\n notification.success({ message: \"Successfully synced users!\" });\n } catch (error) {\n dispatch({ type: SYNC_USERS_ERROR });\n const message =\n get(error, [\"response\", \"status\"]) === LOCKED\n ? \"This config is currently being synced and was therefore locked. Please try again in a few minutes.\"\n : get(error, \"response.data\", error instanceof Error ? error.message : \"Error\");\n notification.error({\n message,\n });\n }\n};\n\nexport const unsetSchedule = (): Thunk => async (dispatch, getState) => {\n const editItem = selectEditItem(getState());\n if (!editItem?.config.job?.id) {\n throw new Error(\"Cannot unset schedule without scheduled config\");\n }\n\n try {\n dispatch({ type: UNSET_SCHEDULE_REQUEST });\n\n await deleteJob(editItem.config, editItem.config.job.id);\n dispatch({ type: UNSET_SCHEDULE_SUCCESS });\n\n notification.success({ message: \"Schedule unset\" });\n } catch (error) {\n dispatch({ type: UNSET_SCHEDULE_ERROR });\n\n notification.error({\n message: `Error unsetting schedule: ${\n error instanceof Error ? error.message : \"Error\"\n }`,\n });\n\n throw error;\n }\n};\n\nexport const updateEditConfig = (updates: Partial): UpdateEditConfigAction => ({\n payload: updates,\n type: UPDATE_EDIT_CONFIG,\n});\n","import {\n GroupMapping,\n GroupMappingRequestBody,\n SCIM_ENTERPRISE_USER_SCHEMA,\n SPEAKAP_PARAM_BAG_SCHEMA,\n ScimUser,\n SpeakapGroup,\n ConnectorType,\n ParamBagItem,\n EnhancedConfig,\n} from \"@speakap/types\";\nimport { ThunkAction } from \"redux-thunk\";\nimport { get, without, uniq, fromPairs, compact, sortBy, isArray } from \"lodash\";\nimport { goBack, CallHistoryMethodAction } from \"connected-react-router\";\nimport { mapColumns, flattenScimUser } from \"@speakap/expression-engine\";\nimport { notification } from \"antd\";\n\nimport { ApplicationState } from \"../reducer\";\nimport { ConditionOption } from \"../../components/expression-builder/types\";\nimport { LOADING_STATES } from \"../../types\";\nimport { fetchColumnMappings } from \"../column-mappings/actions\";\nimport { fetchExpressionHelpers } from \"../expression-helpers/actions\";\nimport { fetchImportUsers } from \"../connectors/actions\";\nimport { getGroupMappings, getGroups, postNewGroupMapping, postUpdatedGroupMapping } from \"../api\";\nimport { selectColumnMappingsItems } from \"../column-mappings/selectors\";\nimport { selectConfigItems, selectEditItem } from \"../configs/selectors\";\nimport { selectConnectorsItems, selectImportUsersItems } from \"../connectors/selectors\";\nimport {\n selectUpdateSuggestionsLoadingState,\n selectGroupMappingsNetworkId,\n selectGroupsNetworkId,\n} from \"../group-mappings/selectors\";\nimport { submitRuns } from \"../runs/actions\";\nimport * as utils from \"../../components/column-mappings/column-mappings-form/column-mappings-utils\";\n\nexport const FETCH_GROUP_MAPPINGS_REQUEST = \"user-sync/group-mappings/FETCH_GROUP_MAPPINGS_REQUEST\";\nexport const FETCH_GROUP_MAPPINGS_SUCCESS = \"user-sync/group-mappings/FETCH_GROUP_MAPPINGS_SUCCESS\";\nexport const FETCH_GROUP_MAPPINGS_ERROR = \"user-sync/group-mappings/FETCH_GROUP_MAPPINGS_ERROR\";\n\nexport const FETCH_SUGGESTIONS_REQUEST = \"user-sync/group-mappings/FETCH_SUGGESTIONS_REQUEST\";\nexport const FETCH_SUGGESTIONS_ERROR = \"user-sync/group-mappings/FETCH_SUGGESTIONS_ERROR\";\nexport const SET_SUGGESTIONS = \"user-sync/group-mappings/SET_SUGGESTIONS\";\n\nexport const UPDATE_SUGGESTIONS_REQUEST = \"user-sync/group-mappings/UPDATE_SUGGESTIONS_REQUEST\";\nexport const UPDATE_SUGGESTIONS_ERROR = \"user-sync/group-mappings/UPDATE_SUGGESTIONS_ERROR\";\nexport const UPDATE_SUGGESTIONS_SUCCESS = \"user-sync/group-mappings/UPDATE_SUGGESTIONS_SUCCESS\";\n\nexport const SUBMIT_NEW_GROUP_MAPPING_REQUEST =\n \"user-sync/group-mappings/SUBMIT_NEW_GROUP_MAPPING_REQUEST\";\nexport const SUBMIT_NEW_GROUP_MAPPING_SUCCESS =\n \"user-sync/group-mappings/SUBMIT_NEW_GROUP_MAPPING_SUCCESS\";\nexport const SUBMIT_UPDATED_GROUP_MAPPING_REQUEST =\n \"user-sync/group-mappings/SUBMIT_UPDATED_GROUP_MAPPING_REQUEST\";\nexport const SUBMIT_UPDATED_GROUP_MAPPING_SUCCESS =\n \"user-sync/group-mappings/SUBMIT_UPDATED_GROUP_MAPPING_SUCCESS\";\nexport const SUBMIT_GROUP_MAPPING_ERROR = \"user-sync/group-mappings/SUBMIT_GROUP_MAPPING_ERROR\";\n\nexport const FETCH_GROUPS_REQUEST = \"user-sync/group-mappings/FETCH_GROUPS_REQUEST\";\nexport const FETCH_GROUPS_SUCCESS = \"user-sync/group-mappings/FETCH_GROUPS_SUCCESS\";\nexport const FETCH_GROUPS_ERROR = \"user-sync/group-mappings/FETCH_GROUPS_ERROR\";\n\nexport const PREPARE_FORM_REQUEST = \"user-sync/group-mappings/PREPARE_FORM_REQUEST\";\nexport const PREPARE_FORM_SUCCESS = \"user-sync/group-mappings/PREPARE_FORM_SUCCESS\";\nexport const PREPARE_FORM_ERROR = \"user-sync/group-mappings/PREPARE_FORM_ERROR\";\n\ninterface FetchGroupMappingsRequestAction {\n type: typeof FETCH_GROUP_MAPPINGS_REQUEST;\n payload: string;\n}\n\ninterface FetchGroupMappingsSuccessAction {\n type: typeof FETCH_GROUP_MAPPINGS_SUCCESS;\n payload: {\n groupMappings: Array;\n networkId: string;\n };\n}\n\ninterface FetchGroupMappingsErrorAction {\n type: typeof FETCH_GROUP_MAPPINGS_ERROR;\n}\n\ninterface SubmitNewGroupMappingRequestAction {\n type: typeof SUBMIT_NEW_GROUP_MAPPING_REQUEST;\n payload: GroupMappingRequestBody;\n}\n\ninterface SubmitNewGroupMappingSuccessAction {\n type: typeof SUBMIT_NEW_GROUP_MAPPING_SUCCESS;\n payload: GroupMapping;\n}\n\ninterface SubmitUpdatedGroupMappingRequestAction {\n type: typeof SUBMIT_UPDATED_GROUP_MAPPING_REQUEST;\n payload: { activeRevisionId: number; groupMapping: GroupMapping };\n}\n\nexport interface SubmitUpdatedGroupMappingSuccessAction {\n type: typeof SUBMIT_UPDATED_GROUP_MAPPING_SUCCESS;\n payload: GroupMapping;\n}\n\ninterface SubmitGroupMappingErrorAction {\n type: typeof SUBMIT_GROUP_MAPPING_ERROR;\n}\n\ninterface FetchGroupsRequestAction {\n type: typeof FETCH_GROUPS_REQUEST;\n payload: string;\n}\n\ninterface FetchGroupsSuccessAction {\n type: typeof FETCH_GROUPS_SUCCESS;\n payload: {\n networkId: string;\n groups: Array;\n };\n}\n\ninterface FetchGroupsErrorAction {\n type: typeof FETCH_GROUPS_ERROR;\n}\n\ninterface FetchSuggestionsRequestAction {\n type: typeof FETCH_SUGGESTIONS_REQUEST;\n payload: {\n networkId: string;\n configName: string;\n };\n}\n\ninterface FetchSuggestionsErrorAction {\n type: typeof FETCH_SUGGESTIONS_ERROR;\n}\n\ninterface SetSuggestionsPayload {\n subjects: Array;\n objects?: {\n [subjectKey: string]: Array;\n };\n}\n\ninterface SetSuggestions {\n type: typeof SET_SUGGESTIONS;\n payload: SetSuggestionsPayload;\n}\n\ninterface UpdateSuggestionsRequestAction {\n type: typeof UPDATE_SUGGESTIONS_REQUEST;\n}\n\ninterface UpdateSuggestionsErrorAction {\n type: typeof UPDATE_SUGGESTIONS_ERROR;\n}\n\ninterface UpdateSuggestionsSuccessAction {\n type: typeof UPDATE_SUGGESTIONS_SUCCESS;\n}\n\ninterface PrepareFormRequestAction {\n type: typeof PREPARE_FORM_REQUEST;\n payload: {\n networkId: string;\n };\n}\n\ninterface PrepareFormErrorAction {\n type: typeof PREPARE_FORM_ERROR;\n}\n\ninterface PrepareFormSuccessAction {\n type: typeof PREPARE_FORM_SUCCESS;\n payload: {\n networkId: string;\n scimUsers: Array;\n };\n}\n\nexport type GroupMappingsAction =\n | FetchGroupMappingsSuccessAction\n | FetchGroupMappingsRequestAction\n | FetchGroupMappingsErrorAction\n | SubmitNewGroupMappingRequestAction\n | SubmitNewGroupMappingSuccessAction\n | SubmitUpdatedGroupMappingRequestAction\n | SubmitUpdatedGroupMappingSuccessAction\n | SubmitGroupMappingErrorAction\n | FetchGroupsSuccessAction\n | FetchGroupsRequestAction\n | FetchGroupsErrorAction\n | FetchSuggestionsRequestAction\n | FetchSuggestionsErrorAction\n | SetSuggestions\n | UpdateSuggestionsRequestAction\n | UpdateSuggestionsErrorAction\n | UpdateSuggestionsSuccessAction\n | PrepareFormRequestAction\n | PrepareFormSuccessAction\n | PrepareFormErrorAction;\n\ntype Thunk = ThunkAction<\n Promise,\n ApplicationState,\n void,\n CallHistoryMethodAction | GroupMappingsAction\n>;\n\nexport const fetchGroupMappings = (networkId: string): Thunk => async (dispatch, getState) => {\n const currentNetworkId = selectGroupMappingsNetworkId(getState());\n if (networkId !== currentNetworkId) {\n try {\n dispatch({ payload: networkId, type: FETCH_GROUP_MAPPINGS_REQUEST });\n\n const response = await getGroupMappings({ networkId });\n dispatch({\n payload: { groupMappings: response.mappings, networkId },\n type: FETCH_GROUP_MAPPINGS_SUCCESS,\n });\n } catch (error) {\n dispatch({\n message: error instanceof Error ? error.message : \"Error\",\n type: FETCH_GROUP_MAPPINGS_ERROR,\n });\n }\n }\n};\n\nexport const fetchGroups = (networkId: string, force = false): Thunk => async (\n dispatch,\n getState,\n) => {\n const currentNetworkId = selectGroupsNetworkId(getState());\n if (networkId !== currentNetworkId || force) {\n try {\n dispatch({ payload: networkId, type: FETCH_GROUPS_REQUEST });\n\n const response = await getGroups({ networkId });\n dispatch({\n payload: { groups: response.groups, networkId },\n type: FETCH_GROUPS_SUCCESS,\n });\n } catch (error) {\n dispatch({\n message: error instanceof Error ? error.message : \"Error\",\n type: FETCH_GROUPS_ERROR,\n });\n }\n }\n};\n\nexport const submitNewGroupMapping = (\n groupMapping: GroupMappingRequestBody,\n): Thunk => async dispatch => {\n try {\n dispatch({ payload: groupMapping, type: SUBMIT_NEW_GROUP_MAPPING_REQUEST });\n\n const response = await postNewGroupMapping(groupMapping);\n dispatch({ payload: response, type: SUBMIT_NEW_GROUP_MAPPING_SUCCESS });\n return response;\n } catch (error) {\n const errorMessage =\n get(error, [\"response\", \"data\", \"message\"]) ||\n get(error, [\"response\", \"data\"], error instanceof Error ? error.message : \"Error\");\n notification.error({ message: `Error creating group mapping: ${errorMessage}` });\n dispatch({\n message: error instanceof Error ? error.message : \"Error\",\n type: SUBMIT_GROUP_MAPPING_ERROR,\n });\n }\n};\n\nexport const submitUpdatedGroupMapping = (\n activeRevisionId: number,\n groupMapping: GroupMapping,\n): Thunk => async dispatch => {\n try {\n dispatch({\n payload: { activeRevisionId, groupMapping },\n type: SUBMIT_UPDATED_GROUP_MAPPING_REQUEST,\n });\n\n const response = await postUpdatedGroupMapping(activeRevisionId, groupMapping);\n dispatch({ payload: response, type: SUBMIT_UPDATED_GROUP_MAPPING_SUCCESS });\n\n notification.success({ message: \"Successfully updated\" });\n dispatch(goBack());\n } catch (error) {\n notification.error({\n message: get(\n error,\n [\"response\", \"data\"],\n error instanceof Error ? error.message : \"Error\",\n ),\n });\n dispatch({\n message: error instanceof Error ? error.message : \"Error\",\n type: SUBMIT_GROUP_MAPPING_ERROR,\n });\n }\n};\n\nconst setSuggestions = (payload: SetSuggestionsPayload): SetSuggestions => ({\n payload,\n type: SET_SUGGESTIONS,\n});\n\nexport const updateSuggestions = (networkId: string, configName: string): Thunk => async (\n dispatch,\n getState,\n) => {\n try {\n const state = getState();\n const loadingState = selectUpdateSuggestionsLoadingState(state);\n\n if (loadingState === LOADING_STATES.FETCHING) {\n return;\n }\n\n dispatch({ type: UPDATE_SUGGESTIONS_REQUEST });\n\n const config = selectConfigItems(state)[configName];\n if (!config) {\n throw new Error(`No config found with name [${configName}]`);\n }\n if (!config.connectorName) {\n throw new Error(\"Selected config has not connector\");\n }\n\n const connector = selectConnectorsItems(state)[config.connectorName];\n if (!connector) {\n throw new Error(`No connector found with name [${config.connectorName}]`);\n }\n // If connector is manual upload, we cannot update\n // employee data \"behind the scenes\", because users have\n // to actively select an upload file.\n if (connector.type === ConnectorType.ManualUpload) {\n throw new Error(\n `Cannot update suggestions from connector of type ${ConnectorType.ManualUpload}`,\n );\n }\n\n await dispatch(submitRuns({ connector, networkId }));\n // await dispatch(fetchSuggestions(networkId, configName));\n\n dispatch({ type: UPDATE_SUGGESTIONS_SUCCESS });\n } catch (error) {\n console.error(error);\n dispatch({ type: UPDATE_SUGGESTIONS_ERROR });\n }\n};\n\nconst prepareConnectors = (connectorName: string): Thunk => async (dispatch, getState) => {\n const connectors = selectConnectorsItems(getState());\n const connector = connectors[connectorName];\n if (!connector) {\n throw new Error(`Cannot find connector with name [${connectorName}]`);\n }\n await dispatch(fetchImportUsers(connector));\n};\n\nconst getSubjectKey = (selector: Array): string =>\n without(selector.slice(1), SPEAKAP_PARAM_BAG_SCHEMA, SCIM_ENTERPRISE_USER_SCHEMA).join(\"__\");\n\nconst getSelectedConfig = (state: ApplicationState, configName: string): EnhancedConfig => {\n const configs = selectConfigItems(state);\n const config = configs[configName];\n if (!config) {\n throw new Error(`Cannot find config with name [${configName}]`);\n }\n const editConfig = selectEditItem(state);\n if (editConfig?.config.name === configName) {\n return editConfig.config;\n }\n\n return config;\n};\n\nexport const prepareGroupMappingsForm = (\n selectedConfig: string,\n loadGroups = true,\n): Thunk => async (dispatch, getState) => {\n try {\n const state = getState();\n const config = getSelectedConfig(state, selectedConfig);\n dispatch({ payload: { networkId: config.networkId }, type: PREPARE_FORM_REQUEST });\n const connectorName = config.connectorName;\n if (!connectorName) {\n throw new Error(\"Select configuration has not connector attached to it.\");\n }\n\n const resourcesToPrepare = [dispatch(prepareConnectors(connectorName))];\n\n if (loadGroups) {\n resourcesToPrepare.push(dispatch(fetchGroups(config.networkId)));\n }\n\n if (config.columnMappingName) {\n resourcesToPrepare.push(dispatch(fetchColumnMappings(config.networkId)));\n }\n\n await Promise.all(resourcesToPrepare);\n\n const updatedState = getState();\n const importUsers = selectImportUsersItems(updatedState);\n\n if (config.columnMappingName) {\n const columnMapping = selectColumnMappingsItems(updatedState)[config.columnMappingName];\n if (!columnMapping) {\n throw new Error(`No column mapping found with name [${config.columnMappingName}]`);\n }\n\n const expressionHelpers = await dispatch(fetchExpressionHelpers());\n const scimUsers = importUsers.map(user =>\n mapColumns(\n flattenScimUser(user) as Record,\n columnMapping.template,\n expressionHelpers,\n ),\n );\n\n dispatch({\n payload: { networkId: config.networkId, scimUsers: scimUsers as Array },\n type: PREPARE_FORM_SUCCESS,\n });\n\n const fields = utils.options.filter(({ selector }) => {\n const value = get(columnMapping, selector);\n return value && !isArray(value);\n });\n const paramBag: Array = get(\n columnMapping,\n [\"template\", SPEAKAP_PARAM_BAG_SCHEMA],\n [],\n );\n const subjects = sortBy(\n [\n ...fields.map(field => ({\n label: field.label,\n value: getSubjectKey(field.selector),\n })),\n ...paramBag.map(({ key }) => ({\n label: key,\n value: key,\n })),\n ],\n subject => subject.label.toLowerCase(),\n );\n const objects = fromPairs([\n ...fields\n // We need to remove arrays from objects because the do not have a literal value.\n // To work with arrays, we have to use expert mode and use some or every helpers.\n .filter(({ selector }) => !isArray(get(columnMapping, selector)))\n .map(field => {\n const values = uniq(\n compact(scimUsers.map(user => get(user, field.selector.slice(1)))),\n ).map((value: string) => ({\n label: value,\n value: `\"${value}\"`,\n }));\n\n return [getSubjectKey(field.selector), sortBy(values, \"label\")];\n }),\n ...paramBag.map(({ key }) => {\n const values = uniq(\n compact(scimUsers.map(user => get(user, [SPEAKAP_PARAM_BAG_SCHEMA, key]))),\n ).map((value: string) => ({\n label: value,\n value: `\"${value}\"`,\n }));\n\n return [key, sortBy(values, \"label\")];\n }),\n ]);\n\n dispatch(setSuggestions({ objects, subjects }));\n } else {\n const scimUsers = ([...importUsers] as unknown) as Array;\n dispatch({\n payload: { networkId: config.networkId, scimUsers },\n type: PREPARE_FORM_SUCCESS,\n });\n }\n } catch (error) {\n dispatch({ type: PREPARE_FORM_ERROR });\n }\n};\n","import { GoogleOutlined, LoginOutlined } from \"@ant-design/icons\";\nimport React from \"react\";\nimport { Row, Col, Form, Input, Button, Divider } from \"antd\";\nimport { useDispatch, useSelector } from \"react-redux\";\n\nimport { LOADING_STATES } from \"../../types\";\nimport Logo from \"../logo\";\nimport { redirectToGoogle, loginUser } from \"../../modules/auth/actions\";\nimport { selectGoogleLoadingState, selectLoginLoadingState } from \"../../modules/auth/selectors\";\n\nconst Login = (): JSX.Element => {\n const [form] = Form.useForm();\n const { validateFields } = form;\n const dispatch = useDispatch();\n const googleLoadingState = useSelector(selectGoogleLoadingState);\n const loginLoadingState = useSelector(selectLoginLoadingState);\n\n const onSubmit = (): void => {\n validateFields().then(values => {\n dispatch(loginUser(values.username, values.password));\n });\n };\n\n return (\n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n }\n loading={loginLoadingState === LOADING_STATES.FETCHING}\n >\n Login\n \n \n \n
\n \n \n or\n \n \n }\n block\n style={{ backgroundColor: \"#4285F4\", color: \"#fff\" }}\n size=\"large\"\n loading={googleLoadingState === LOADING_STATES.FETCHING}\n onClick={() => dispatch(redirectToGoogle())}\n >\n Login with Google\n \n \n
\n \n
\n );\n};\n\nexport default Login;\n","import React, { useEffect } from \"react\";\nimport { Spin } from \"antd\";\nimport { useSelector, useDispatch } from \"react-redux\";\n\nimport { LOADING_STATES } from \"../../types\";\nimport Login from \"../login\";\nimport { fetchUserSyncUser } from \"../../modules/auth/actions\";\nimport { selectUser, selectUserLoadingState } from \"../../modules/auth/selectors\";\n\ninterface AuthProps {\n children: JSX.Element;\n}\n\nconst Auth = (props: AuthProps): JSX.Element => {\n const user = useSelector(selectUser);\n const loadingState = useSelector(selectUserLoadingState);\n const dispatch = useDispatch();\n\n useEffect(() => {\n if (!user) {\n dispatch(fetchUserSyncUser());\n }\n }, [user]);\n\n if (loadingState === LOADING_STATES.SUCCESSFUL) {\n return props.children;\n }\n\n if (loadingState === LOADING_STATES.ERROR) {\n return ;\n }\n\n return ;\n};\n\nexport default Auth;\n","import { createBrowserHistory } from \"history\";\n\nexport default createBrowserHistory();\n","import { UserSyncUser } from \"@speakap/types\";\nimport produce from \"immer\";\n\nimport {\n FETCH_SPEAKAP_USERS_ERROR,\n FETCH_SPEAKAP_USERS_REQUEST,\n FETCH_SPEAKAP_USERS_SUCCESS,\n AccessManagementActions,\n SUBMIT_SPEAKAP_USER_SUCCESS,\n UPDATE_SPEAKAP_USER_SUCCESS,\n SET_EDIT_SPEAKAP_USER,\n DELETE_SPEAKAP_USER_SUCCESS,\n DELETE_SPEAKAP_USER_REQUEST,\n DELETE_SPEAKAP_USER_ERROR,\n SUBMIT_SPEAKAP_USER_REQUEST,\n SUBMIT_SPEAKAP_USER_ERROR,\n} from \"./actions\";\nimport { LOADING_STATES } from \"../../types\";\n\nexport interface AccessManagementState {\n loadingState: LOADING_STATES;\n users: Array;\n editUser: {\n item?: UserSyncUser;\n loadingState: LOADING_STATES;\n mode: \"new\" | \"edit\" | \"closed\";\n };\n deleteUser: {\n loadingState: LOADING_STATES;\n };\n}\n\nexport const initialState: AccessManagementState = {\n deleteUser: {\n loadingState: LOADING_STATES.INITIAL,\n },\n editUser: {\n loadingState: LOADING_STATES.INITIAL,\n mode: \"closed\",\n },\n loadingState: LOADING_STATES.INITIAL,\n users: [],\n};\n\nconst networksReducer = (\n state: AccessManagementState = initialState,\n action: AccessManagementActions,\n): AccessManagementState =>\n produce(state, (draft: AccessManagementState) => {\n switch (action.type) {\n case FETCH_SPEAKAP_USERS_REQUEST:\n draft.loadingState = LOADING_STATES.FETCHING;\n break;\n case FETCH_SPEAKAP_USERS_SUCCESS:\n draft.loadingState = LOADING_STATES.SUCCESSFUL;\n draft.users = action.payload;\n break;\n case FETCH_SPEAKAP_USERS_ERROR:\n draft.loadingState = LOADING_STATES.ERROR;\n break;\n case SUBMIT_SPEAKAP_USER_REQUEST:\n draft.editUser.loadingState = LOADING_STATES.FETCHING;\n break;\n case SUBMIT_SPEAKAP_USER_ERROR:\n draft.editUser.loadingState = LOADING_STATES.ERROR;\n break;\n case SUBMIT_SPEAKAP_USER_SUCCESS:\n draft.users.push(action.payload);\n draft.editUser.mode = \"closed\";\n draft.editUser.loadingState = LOADING_STATES.SUCCESSFUL;\n break;\n case SET_EDIT_SPEAKAP_USER:\n draft.editUser.item = action.payload.user;\n draft.editUser.mode = action.payload.mode;\n break;\n case UPDATE_SPEAKAP_USER_SUCCESS:\n draft.editUser.mode = \"closed\";\n draft.users = state.users.map(user =>\n user.id === action.payload.id ? action.payload : user,\n );\n break;\n case DELETE_SPEAKAP_USER_REQUEST:\n draft.deleteUser.loadingState = LOADING_STATES.FETCHING;\n break;\n case DELETE_SPEAKAP_USER_SUCCESS:\n draft.users = state.users.filter(user => user.id !== action.payload);\n draft.deleteUser.loadingState = LOADING_STATES.SUCCESSFUL;\n break;\n case DELETE_SPEAKAP_USER_ERROR:\n draft.deleteUser.loadingState = LOADING_STATES.ERROR;\n break;\n }\n });\n\nexport default networksReducer;\n","import { UserSyncUser } from \"@speakap/types\";\nimport produce from \"immer\";\n\nimport {\n AuthActions,\n FETCH_USERSYNC_USER_ERROR,\n FETCH_USERSYNC_USER_REQUEST,\n FETCH_USERSYNC_USER_SUCCESS,\n FETCH_GOOGLE_URL_ERROR,\n FETCH_GOOGLE_URL_REQUEST,\n FETCH_GOOGLE_URL_SUCCESS,\n LOGOUT_USERSYNC_USER_ERROR,\n LOGOUT_USERSYNC_USER_REQUEST,\n LOGOUT_USERSYNC_USER_SUCCESS,\n LOGIN_SPEAKAP_USER_ERROR,\n LOGIN_SPEAKAP_USER_REQUEST,\n LOGIN_SPEAKAP_USER_SUCCESS,\n} from \"./actions\";\nimport { LOADING_STATES } from \"../../types\";\n\nexport interface AuthState {\n user?: UserSyncUser;\n userLoadingState: LOADING_STATES;\n logoutLoadingState: LOADING_STATES;\n googleLoadingState: LOADING_STATES;\n loginLoadingState: LOADING_STATES;\n}\n\nexport const initialState = {\n googleLoadingState: LOADING_STATES.INITIAL,\n loginLoadingState: LOADING_STATES.INITIAL,\n logoutLoadingState: LOADING_STATES.INITIAL,\n user: undefined,\n userLoadingState: LOADING_STATES.INITIAL,\n};\n\nconst networksReducer = (state: AuthState = initialState, action: AuthActions): AuthState =>\n produce(state, (draft: AuthState) => {\n switch (action.type) {\n case FETCH_USERSYNC_USER_REQUEST:\n draft.userLoadingState = LOADING_STATES.FETCHING;\n break;\n case FETCH_USERSYNC_USER_SUCCESS:\n draft.userLoadingState = LOADING_STATES.SUCCESSFUL;\n draft.user = action.payload;\n break;\n case FETCH_USERSYNC_USER_ERROR:\n draft.userLoadingState = LOADING_STATES.ERROR;\n break;\n case LOGOUT_USERSYNC_USER_REQUEST:\n draft.logoutLoadingState = LOADING_STATES.FETCHING;\n break;\n case LOGOUT_USERSYNC_USER_SUCCESS:\n draft.logoutLoadingState = LOADING_STATES.SUCCESSFUL;\n draft.user = undefined;\n break;\n case LOGOUT_USERSYNC_USER_ERROR:\n draft.logoutLoadingState = LOADING_STATES.ERROR;\n break;\n case FETCH_GOOGLE_URL_REQUEST:\n draft.googleLoadingState = LOADING_STATES.FETCHING;\n break;\n case FETCH_GOOGLE_URL_SUCCESS:\n draft.googleLoadingState = LOADING_STATES.SUCCESSFUL;\n break;\n case FETCH_GOOGLE_URL_ERROR:\n draft.googleLoadingState = LOADING_STATES.ERROR;\n break;\n case LOGIN_SPEAKAP_USER_REQUEST:\n draft.loginLoadingState = LOADING_STATES.FETCHING;\n break;\n case LOGIN_SPEAKAP_USER_SUCCESS:\n draft.loginLoadingState = LOADING_STATES.SUCCESSFUL;\n break;\n case LOGIN_SPEAKAP_USER_ERROR:\n draft.loginLoadingState = LOADING_STATES.ERROR;\n break;\n }\n });\n\nexport default networksReducer;\n","import { ColumnMapping, ImportUser } from \"@speakap/types\";\nimport { keyBy } from \"lodash\";\nimport produce from \"immer\";\n\nimport { DELETE_RESOURCE_SUCCESS } from \"../delete-resources/actions\";\nimport {\n FETCH_COLUMN_MAPPINGS_ERROR,\n FETCH_COLUMN_MAPPINGS_REQUEST,\n FETCH_COLUMN_MAPPINGS_SUCCESS,\n SUBMIT_NEW_COLUMN_MAPPING_REQUEST,\n SUBMIT_NEW_COLUMN_MAPPING_SUCCESS,\n SUBMIT_UPDATED_COLUMN_MAPPING_REQUEST,\n SUBMIT_UPDATED_COLUMN_MAPPING_SUCCESS,\n SUBMIT_COLUMN_MAPPING_ERROR,\n APPLY_COLUMN_MAPPINGS_ERROR,\n APPLY_COLUMN_MAPPINGS_REQUEST,\n APPLY_COLUMN_MAPPINGS_SUCCESS,\n} from \"./actions\";\nimport { LOADING_STATES } from \"../../types\";\nimport { UserSyncAction } from \"../actions\";\n\nexport interface ColumnMappingsState {\n readonly loadingState: LOADING_STATES;\n readonly results: ReadonlyArray;\n readonly items: {\n readonly [name: string]: ColumnMapping;\n };\n readonly edit: {\n readonly loadingState: LOADING_STATES;\n };\n readonly applyColumnMapping: {\n readonly configName: string;\n readonly loadingState: LOADING_STATES;\n readonly users: ReadonlyArray;\n };\n readonly networkId: string;\n}\n\nexport const initialState: ColumnMappingsState = {\n applyColumnMapping: {\n configName: \"\",\n loadingState: LOADING_STATES.INITIAL,\n users: [],\n },\n edit: {\n loadingState: LOADING_STATES.INITIAL,\n },\n items: {},\n loadingState: LOADING_STATES.INITIAL,\n networkId: \"\",\n results: [],\n};\n\nconst columnMappingsReducer = (\n state: ColumnMappingsState = initialState,\n action: UserSyncAction,\n): ColumnMappingsState =>\n produce(state, draft => {\n switch (action.type) {\n case FETCH_COLUMN_MAPPINGS_REQUEST:\n draft.loadingState = LOADING_STATES.FETCHING;\n break;\n case FETCH_COLUMN_MAPPINGS_SUCCESS: {\n const dictionary = keyBy(action.payload.columnMappings, \"name\");\n draft.loadingState = LOADING_STATES.SUCCESSFUL;\n draft.items = dictionary;\n draft.results = Object.keys(dictionary).sort();\n draft.networkId = action.payload.networkId;\n break;\n }\n case FETCH_COLUMN_MAPPINGS_ERROR:\n draft.loadingState = LOADING_STATES.ERROR;\n break;\n case APPLY_COLUMN_MAPPINGS_REQUEST:\n draft.applyColumnMapping.configName = action.payload.configName;\n draft.applyColumnMapping.loadingState = LOADING_STATES.FETCHING;\n break;\n case APPLY_COLUMN_MAPPINGS_SUCCESS:\n draft.applyColumnMapping.users = action.payload;\n draft.applyColumnMapping.loadingState = LOADING_STATES.SUCCESSFUL;\n break;\n case APPLY_COLUMN_MAPPINGS_ERROR:\n draft.applyColumnMapping.loadingState = LOADING_STATES.ERROR;\n break;\n case SUBMIT_NEW_COLUMN_MAPPING_REQUEST:\n case SUBMIT_UPDATED_COLUMN_MAPPING_REQUEST:\n draft.edit.loadingState = LOADING_STATES.FETCHING;\n break;\n case SUBMIT_NEW_COLUMN_MAPPING_SUCCESS:\n case SUBMIT_UPDATED_COLUMN_MAPPING_SUCCESS: {\n draft.edit.loadingState = LOADING_STATES.SUCCESSFUL;\n const columnMapping = action.payload;\n draft.items[columnMapping.name] = columnMapping;\n if (!draft.results.includes(columnMapping.name)) {\n draft.results.push(columnMapping.name);\n draft.results.sort();\n }\n break;\n }\n case SUBMIT_COLUMN_MAPPING_ERROR:\n draft.edit.loadingState = LOADING_STATES.ERROR;\n break;\n case DELETE_RESOURCE_SUCCESS: {\n const { resourceType, resourceName } = action.payload;\n if (resourceType === \"column-mappings\") {\n draft.results = draft.results.filter(name => name !== resourceName);\n }\n break;\n }\n }\n });\n\nexport default columnMappingsReducer;\n","import { Comment } from \"@speakap/types\";\nimport produce from \"immer\";\n\nimport {\n CommentsActions,\n FETCH_COMMENTS_ERROR,\n FETCH_COMMENTS_REQUEST,\n FETCH_COMMENTS_SUCCESS,\n SUBMIT_COMMENT_ERROR,\n SUBMIT_COMMENT_REQUEST,\n SUBMIT_COMMENT_SUCCESS,\n} from \"./actions\";\nimport { LOADING_STATES } from \"../../types\";\n\nexport interface CommentsState {\n loadingState: LOADING_STATES;\n items: Array;\n submitLoadingState: LOADING_STATES;\n}\n\nexport const initialState: CommentsState = {\n items: [],\n loadingState: LOADING_STATES.INITIAL,\n submitLoadingState: LOADING_STATES.INITIAL,\n};\n\nconst revisionsReducer = (\n state: CommentsState = initialState,\n action: CommentsActions,\n): CommentsState =>\n produce(state, (draft: CommentsState) => {\n switch (action.type) {\n case FETCH_COMMENTS_REQUEST:\n draft.loadingState = LOADING_STATES.FETCHING;\n break;\n case FETCH_COMMENTS_SUCCESS: {\n draft.loadingState = LOADING_STATES.SUCCESSFUL;\n draft.items = action.payload;\n break;\n }\n case FETCH_COMMENTS_ERROR:\n draft.loadingState = LOADING_STATES.ERROR;\n break;\n case SUBMIT_COMMENT_REQUEST:\n draft.submitLoadingState = LOADING_STATES.FETCHING;\n break;\n case SUBMIT_COMMENT_SUCCESS: {\n draft.submitLoadingState = LOADING_STATES.SUCCESSFUL;\n draft.items.push(action.payload);\n break;\n }\n case SUBMIT_COMMENT_ERROR:\n draft.submitLoadingState = LOADING_STATES.ERROR;\n break;\n }\n });\n\nexport default revisionsReducer;\n","import { Config, EnhancedConfig } from \"@speakap/types\";\nimport { keyBy } from \"lodash\";\nimport produce from \"immer\";\n\nimport {\n CREATE_NEW_CONFIG_START,\n CREATE_NEW_CONFIG_STOP,\n EDIT_CONFIG_START,\n EDIT_CONFIG_STOP,\n FETCH_CONFIGS_REQUEST,\n FETCH_CONFIGS_SUCCESS,\n FETCH_CONFIGS_ERROR,\n SUBMIT_NEW_CONFIG_REQUEST,\n SUBMIT_NEW_CONFIG_SUCCESS,\n SUBMIT_NEW_CONFIG_ERROR,\n SUBMIT_UPDATED_CONFIG_REQUEST,\n SUBMIT_UPDATED_CONFIG_SUCCESS,\n SUBMIT_UPDATED_CONFIG_ERROR,\n SET_SELECTED_CONFIG,\n SYNC_USERS_REQUEST,\n SYNC_USERS_SUCCESS,\n SYNC_USERS_ERROR,\n UPDATE_EDIT_CONFIG,\n SET_SCHEDULE_ERROR,\n SET_SCHEDULE_SUCCESS,\n SET_SCHEDULE_REQUEST,\n UNSET_SCHEDULE_REQUEST,\n UNSET_SCHEDULE_SUCCESS,\n UNSET_SCHEDULE_ERROR,\n} from \"./actions\";\nimport { DELETE_RESOURCE_SUCCESS } from \"../delete-resources/actions\";\nimport { LOADING_STATES } from \"../../types\";\nimport { UserSyncAction } from \"../actions\";\n\nexport interface ConfigsState {\n readonly editItem: {\n readonly config: EnhancedConfig;\n readonly loadingState: LOADING_STATES;\n readonly scheduleLoadingState: LOADING_STATES;\n } | null;\n readonly items: {\n readonly [name: string]: EnhancedConfig;\n };\n readonly loadingState: LOADING_STATES;\n readonly newItem: {\n readonly loadingState: LOADING_STATES;\n } | null;\n readonly results: Array;\n readonly selectedConfig?: string;\n readonly syncUsers: {\n readonly loadingState: LOADING_STATES;\n };\n}\n\nexport const initialState: ConfigsState = {\n editItem: null,\n items: {},\n loadingState: LOADING_STATES.INITIAL,\n newItem: null,\n results: [],\n syncUsers: {\n loadingState: LOADING_STATES.INITIAL,\n },\n};\n\nexport default function configsReducer(\n state: ConfigsState = initialState,\n action: UserSyncAction,\n): ConfigsState {\n switch (action.type) {\n case CREATE_NEW_CONFIG_START:\n return { ...state, newItem: { loadingState: LOADING_STATES.INITIAL } };\n case CREATE_NEW_CONFIG_STOP:\n return { ...state, newItem: null };\n case EDIT_CONFIG_START:\n return {\n ...state,\n editItem: {\n config: action.payload,\n loadingState: LOADING_STATES.INITIAL,\n scheduleLoadingState: LOADING_STATES.INITIAL,\n },\n };\n case EDIT_CONFIG_STOP:\n return { ...state, editItem: null };\n case FETCH_CONFIGS_REQUEST:\n return { ...state, loadingState: LOADING_STATES.FETCHING };\n case FETCH_CONFIGS_SUCCESS:\n return produce(state, draft => {\n const dictionary = keyBy(action.payload, \"name\");\n draft.items = dictionary;\n draft.loadingState = LOADING_STATES.SUCCESSFUL;\n draft.results = Object.keys(dictionary).sort();\n });\n case FETCH_CONFIGS_ERROR:\n return { ...state, loadingState: LOADING_STATES.ERROR };\n case SET_SCHEDULE_REQUEST:\n case UNSET_SCHEDULE_REQUEST:\n return produce(state, draft => {\n if (draft.editItem) {\n draft.editItem.scheduleLoadingState = LOADING_STATES.FETCHING;\n }\n });\n case SET_SCHEDULE_SUCCESS:\n return produce(state, draft => {\n if (draft.editItem) {\n draft.editItem.config.job = action.payload;\n draft.items[draft.editItem.config.name].job = action.payload;\n draft.editItem.scheduleLoadingState = LOADING_STATES.SUCCESSFUL;\n }\n });\n case SET_SCHEDULE_ERROR:\n case UNSET_SCHEDULE_ERROR:\n return produce(state, draft => {\n if (draft.editItem) {\n draft.editItem.scheduleLoadingState = LOADING_STATES.ERROR;\n }\n });\n case SUBMIT_NEW_CONFIG_REQUEST:\n return produce(state, draft => {\n if (draft.newItem) {\n draft.newItem.loadingState = LOADING_STATES.FETCHING;\n }\n });\n case SUBMIT_NEW_CONFIG_SUCCESS:\n return produce(state, draft => {\n const newConfig = action.payload;\n draft.items[newConfig.name] = newConfig;\n draft.results.push(newConfig.name);\n draft.results.sort();\n draft.newItem = null;\n });\n case SUBMIT_NEW_CONFIG_ERROR:\n return produce(state, draft => {\n if (draft.newItem) {\n draft.newItem.loadingState = LOADING_STATES.ERROR;\n }\n });\n case SUBMIT_UPDATED_CONFIG_REQUEST:\n return produce(state, draft => {\n if (draft.editItem) {\n draft.editItem.loadingState = LOADING_STATES.FETCHING;\n }\n });\n case SUBMIT_UPDATED_CONFIG_SUCCESS:\n return produce(state, draft => {\n const updatedConfig = action.payload;\n draft.items[updatedConfig.name] = updatedConfig;\n draft.editItem = null;\n });\n case SUBMIT_UPDATED_CONFIG_ERROR:\n return produce(state, draft => {\n if (draft.editItem) {\n draft.editItem.loadingState = LOADING_STATES.ERROR;\n }\n });\n case SET_SELECTED_CONFIG:\n return produce(state, draft => {\n draft.selectedConfig = action.payload;\n });\n case SYNC_USERS_REQUEST:\n return produce(state, draft => {\n draft.syncUsers.loadingState = LOADING_STATES.FETCHING;\n });\n case SYNC_USERS_SUCCESS:\n return produce(state, draft => {\n draft.syncUsers.loadingState = LOADING_STATES.SUCCESSFUL;\n });\n case SYNC_USERS_ERROR:\n return produce(state, draft => {\n draft.syncUsers.loadingState = LOADING_STATES.ERROR;\n });\n case UNSET_SCHEDULE_SUCCESS:\n return produce(state, draft => {\n if (draft.editItem) {\n delete draft.editItem.config.job;\n delete draft.items[draft.editItem.config.name].job;\n draft.editItem.scheduleLoadingState = LOADING_STATES.SUCCESSFUL;\n }\n });\n case UPDATE_EDIT_CONFIG:\n return produce(state, draft => {\n if (draft.editItem) {\n draft.editItem.config = { ...draft.editItem.config, ...action.payload };\n }\n });\n case DELETE_RESOURCE_SUCCESS:\n return produce(state, draft => {\n if (draft.editItem) {\n let replaceField:\n | keyof Pick<\n Config,\n | \"connectorName\"\n | \"columnMappingName\"\n | \"groupMappingName\"\n | \"roleMappingName\"\n >\n | null = null;\n const { resourceType, resourceName } = action.payload;\n if (resourceType === \"connectors\") {\n replaceField = \"connectorName\";\n } else if (resourceType === \"column-mappings\") {\n replaceField = \"columnMappingName\";\n } else if (resourceType === \"group-mappings\") {\n replaceField = \"groupMappingName\";\n } else if (resourceType === \"role-mappings\") {\n replaceField = \"roleMappingName\";\n } else if (resourceType === \"configs\") {\n draft.results = draft.results.filter(name => name !== resourceName);\n }\n if (replaceField) {\n draft.editItem.config = {\n ...draft.editItem.config,\n [replaceField]: undefined,\n };\n }\n }\n });\n default:\n return state;\n }\n}\n","import { Connector, ImportUser, ConnectorStats } from \"@speakap/types\";\nimport { keyBy } from \"lodash\";\nimport produce from \"immer\";\n\nimport { DELETE_RESOURCE_SUCCESS } from \"../delete-resources/actions\";\nimport {\n FETCH_CONNECTORS_ERROR,\n FETCH_CONNECTORS_REQUEST,\n FETCH_CONNECTORS_SUCCESS,\n FETCH_IMPORT_USERS_ERROR,\n FETCH_IMPORT_USERS_REQUEST,\n FETCH_IMPORT_USERS_SUCCESS,\n SUBMIT_NEW_CONNECTOR_REQUEST,\n SUBMIT_NEW_CONNECTOR_SUCCESS,\n SUBMIT_UPDATED_CONNECTOR_REQUEST,\n SUBMIT_UPDATED_CONNECTOR_SUCCESS,\n SUBMIT_CONNECTOR_ERROR,\n FETCH_CONNECTOR_STATS_ERROR,\n FETCH_CONNECTOR_STATS_SUCCESS,\n FETCH_CONNECTOR_STATS_REQUEST,\n} from \"./actions\";\nimport { LOADING_STATES } from \"../../types\";\nimport { SUBMIT_RUNS_SUCCESS } from \"../runs/actions\";\nimport { UserSyncAction } from \"../actions\";\n\nexport interface ConnectorsState {\n readonly importUsers: {\n readonly connectorId?: number;\n readonly items: Array;\n readonly loadingState: LOADING_STATES;\n };\n readonly edit: {\n readonly loadingState: LOADING_STATES;\n };\n readonly items: {\n readonly [name: string]: Connector;\n };\n readonly loadingState: LOADING_STATES;\n readonly results: ReadonlyArray;\n readonly networkId: string;\n readonly stats: {\n readonly loadingState: LOADING_STATES;\n readonly value: ConnectorStats;\n };\n}\n\nexport const initialState: ConnectorsState = {\n edit: {\n loadingState: LOADING_STATES.INITIAL,\n },\n importUsers: {\n items: [],\n loadingState: LOADING_STATES.INITIAL,\n },\n items: {},\n loadingState: LOADING_STATES.INITIAL,\n networkId: \"\",\n results: [],\n stats: {\n loadingState: LOADING_STATES.INITIAL,\n value: {\n atime: 0,\n filename: \"\",\n mtime: 0,\n size: 0,\n },\n },\n};\n\nconst networksReducer = (\n state: ConnectorsState = initialState,\n action: UserSyncAction,\n): ConnectorsState =>\n produce(state, draft => {\n switch (action.type) {\n case FETCH_CONNECTORS_REQUEST:\n draft.items = {};\n draft.loadingState = LOADING_STATES.FETCHING;\n draft.results = [];\n break;\n case FETCH_CONNECTORS_SUCCESS: {\n const dictionary = keyBy(action.payload.connectors, \"name\");\n draft.loadingState = LOADING_STATES.SUCCESSFUL;\n draft.items = dictionary;\n draft.results = Object.keys(dictionary).sort();\n draft.networkId = action.payload.networkId;\n break;\n }\n case FETCH_CONNECTORS_ERROR:\n draft.loadingState = LOADING_STATES.ERROR;\n break;\n case FETCH_IMPORT_USERS_REQUEST:\n draft.importUsers = {\n connectorId: action.payload,\n items: [],\n loadingState: LOADING_STATES.FETCHING,\n };\n break;\n case SUBMIT_RUNS_SUCCESS:\n case FETCH_IMPORT_USERS_SUCCESS:\n draft.importUsers.loadingState = LOADING_STATES.SUCCESSFUL;\n draft.importUsers.items = action.payload.importUsers;\n draft.importUsers.connectorId = action.payload.connectorId;\n break;\n case FETCH_IMPORT_USERS_ERROR:\n draft.importUsers.loadingState = LOADING_STATES.ERROR;\n draft.importUsers.connectorId = undefined;\n break;\n case SUBMIT_NEW_CONNECTOR_REQUEST:\n case SUBMIT_UPDATED_CONNECTOR_REQUEST:\n draft.edit.loadingState = LOADING_STATES.FETCHING;\n break;\n case SUBMIT_NEW_CONNECTOR_SUCCESS:\n case SUBMIT_UPDATED_CONNECTOR_SUCCESS: {\n draft.edit.loadingState = LOADING_STATES.SUCCESSFUL;\n const connector = action.payload;\n draft.items[connector.name] = connector;\n if (!draft.results.includes(connector.name)) {\n draft.results.push(connector.name);\n draft.results.sort();\n }\n break;\n }\n case SUBMIT_CONNECTOR_ERROR:\n draft.edit.loadingState = LOADING_STATES.ERROR;\n break;\n case DELETE_RESOURCE_SUCCESS: {\n const { resourceType, resourceName } = action.payload;\n if (resourceType === \"connectors\") {\n draft.results = draft.results.filter(name => name !== resourceName);\n }\n break;\n }\n case FETCH_CONNECTOR_STATS_REQUEST:\n draft.stats.loadingState = LOADING_STATES.FETCHING;\n break;\n case FETCH_CONNECTOR_STATS_SUCCESS:\n draft.stats.loadingState = LOADING_STATES.SUCCESSFUL;\n draft.stats.value = action.payload;\n break;\n case FETCH_CONNECTOR_STATS_ERROR:\n draft.stats.loadingState = LOADING_STATES.ERROR;\n break;\n }\n });\n\nexport default networksReducer;\n","import { Config } from \"@speakap/types\";\nimport produce from \"immer\";\n\nimport {\n DeleteResourcesAction,\n DELETE_RESOURCE_ERROR,\n DELETE_RESOURCE_REQUEST,\n DELETE_RESOURCE_SUCCESS,\n} from \"./actions\";\nimport { LOADING_STATES } from \"../../types\";\n\nexport interface DeleteResourcesState {\n loadingState: LOADING_STATES;\n configs?: Array;\n networkId?: string;\n resourceName?: string;\n}\n\nexport const initialState: DeleteResourcesState = {\n loadingState: LOADING_STATES.INITIAL,\n};\n\nconst networksReducer = (\n state: DeleteResourcesState = initialState,\n action: DeleteResourcesAction,\n): DeleteResourcesState =>\n produce(state, draft => {\n switch (action.type) {\n case DELETE_RESOURCE_REQUEST:\n draft.loadingState = LOADING_STATES.FETCHING;\n draft.networkId = action.payload.networkId;\n draft.resourceName = action.payload.resourceName;\n break;\n case DELETE_RESOURCE_SUCCESS:\n draft.loadingState = LOADING_STATES.SUCCESSFUL;\n break;\n case DELETE_RESOURCE_ERROR:\n draft.loadingState = LOADING_STATES.ERROR;\n draft.configs = action.payload;\n break;\n }\n });\n\nexport default networksReducer;\n","import {\n Config,\n DryRunsResponse,\n SpeakapGroup,\n ScimUser,\n MissingGroupLogEntry,\n LogEntry,\n InvalidRoleLogEntry,\n InactiveUserLogEntry,\n} from \"@speakap/types\";\nimport { LocationChangeAction, LOCATION_CHANGE } from \"connected-react-router\";\nimport { keyBy, groupBy, toPairs } from \"lodash\";\nimport produce from \"immer\";\n\nimport {\n DryRunsActions,\n DISMISS_RESULTS,\n FETCH_RESULTS_ERROR,\n FETCH_RESULTS_REQUEST,\n FETCH_RESULTS_SUCCESS,\n} from \"./actions\";\nimport { LOADING_STATES } from \"../../types\";\nimport {\n SUBMIT_UPDATED_COLUMN_MAPPING_SUCCESS,\n SubmitUpdatedColumnMappingSuccessAction,\n} from \"../column-mappings/actions\";\nimport {\n SUBMIT_UPDATED_GROUP_MAPPING_SUCCESS,\n SubmitUpdatedGroupMappingSuccessAction,\n} from \"../group-mappings/actions\";\n\nexport interface DryRunsState {\n loadingState: LOADING_STATES;\n results: DryRunsResponse & {\n missingGroups: Array<{\n groupId: string;\n users: Array;\n }>;\n invalidRoles: Array<{\n roleId: string;\n users: Array;\n }>;\n inactiveUsers: Array>;\n };\n groupsMap: Record;\n config?: Config;\n showResults: boolean;\n}\n\nexport const initialState: DryRunsState = {\n groupsMap: {},\n loadingState: LOADING_STATES.INITIAL,\n results: {\n currentUsers: {\n available: false,\n },\n dryRunToken: \"\",\n groups: [],\n inactiveUsers: [],\n invalidRoles: [],\n logEntries: [],\n missingGroups: [],\n speakapSyncRequests: [],\n users: [],\n },\n showResults: false,\n};\n\nconst getMissingGroups = (\n logEntries: Array,\n): Array<{\n groupId: string;\n users: Array;\n}> => {\n const missingGroupLogEntries = logEntries.filter(\n logEntry => logEntry.type === \"missing_group\",\n ) as Array;\n const missingGroups = toPairs(groupBy(missingGroupLogEntries, \"group.groupId\")).map(\n ([groupId, logEntries]) => ({\n groupId,\n users: logEntries.map(logEntry => (logEntry as MissingGroupLogEntry).group.user),\n }),\n );\n return missingGroups;\n};\n\nconst getInvalidRoles = (\n logEntries: Array,\n): Array<{\n roleId: string;\n users: Array;\n}> => {\n const invalidRoleLogEntries = logEntries.filter(\n logEntry => logEntry.type === \"invalid_role\",\n ) as Array;\n const invalidRoles = toPairs(groupBy(invalidRoleLogEntries, \"role.roleId\")).map(\n ([roleId, logEntries]) => ({\n roleId,\n users: logEntries.map(logEntry => (logEntry as InvalidRoleLogEntry).role.user),\n }),\n );\n return invalidRoles;\n};\n\nconst getInactiveUsers = (logEntries: Array): Array> => {\n const inactiveUserLogEntries = logEntries.filter(\n logEntry => logEntry.type === \"inactive_user\",\n ) as Array;\n return inactiveUserLogEntries.map(logEntry => (logEntry as InactiveUserLogEntry).user);\n};\n\nconst networksReducer = (\n state: DryRunsState = initialState,\n action:\n | DryRunsActions\n | SubmitUpdatedGroupMappingSuccessAction\n | SubmitUpdatedColumnMappingSuccessAction\n | LocationChangeAction,\n): DryRunsState =>\n produce(state, (draft: DryRunsState) => {\n switch (action.type) {\n case FETCH_RESULTS_REQUEST:\n draft.config = action.payload.config;\n draft.loadingState = LOADING_STATES.FETCHING;\n break;\n case FETCH_RESULTS_SUCCESS: {\n draft.loadingState = LOADING_STATES.SUCCESSFUL;\n const logEntries = action.payload.logEntries;\n draft.results = {\n ...action.payload,\n inactiveUsers: getInactiveUsers(logEntries),\n invalidRoles: getInvalidRoles(logEntries),\n missingGroups: getMissingGroups(logEntries),\n };\n draft.groupsMap = keyBy(action.payload.groups, \"id\");\n draft.showResults = true;\n break;\n }\n case FETCH_RESULTS_ERROR:\n draft.loadingState = LOADING_STATES.ERROR;\n break;\n case LOCATION_CHANGE:\n case SUBMIT_UPDATED_COLUMN_MAPPING_SUCCESS:\n case SUBMIT_UPDATED_GROUP_MAPPING_SUCCESS:\n case DISMISS_RESULTS:\n draft.showResults = false;\n break;\n }\n });\n\nexport default networksReducer;\n","import produce from \"immer\";\n\nimport {\n ExpressionHelpersActions,\n FETCH_EXPRESSION_HELPERS_ERROR,\n FETCH_EXPRESSION_HELPERS_REQUEST,\n FETCH_EXPRESSION_HELPERS_SUCCESS,\n} from \"./actions\";\nimport { LOADING_STATES } from \"../../types\";\n\nexport interface ExpressionHelpersState {\n loadingState: LOADING_STATES;\n items: {\n [key: string]: (...args: Array) => string;\n };\n}\n\nexport const initialState: ExpressionHelpersState = {\n items: {},\n loadingState: LOADING_STATES.INITIAL,\n};\n\nconst revisionsReducer = (\n state: ExpressionHelpersState = initialState,\n action: ExpressionHelpersActions,\n): ExpressionHelpersState =>\n produce(state, (draft: ExpressionHelpersState) => {\n switch (action.type) {\n case FETCH_EXPRESSION_HELPERS_REQUEST:\n draft.loadingState = LOADING_STATES.FETCHING;\n break;\n case FETCH_EXPRESSION_HELPERS_SUCCESS: {\n draft.loadingState = LOADING_STATES.SUCCESSFUL;\n draft.items = action.payload;\n break;\n }\n case FETCH_EXPRESSION_HELPERS_ERROR:\n draft.loadingState = LOADING_STATES.ERROR;\n break;\n }\n });\n\nexport default revisionsReducer;\n","import { GroupMapping, SpeakapGroup, ScimUser } from \"@speakap/types\";\nimport { keyBy, sortBy } from \"lodash\";\nimport produce from \"immer\";\n\nimport { ConditionOption } from \"../../components/expression-builder/types\";\nimport { DELETE_RESOURCE_SUCCESS } from \"../delete-resources/actions\";\nimport {\n FETCH_GROUP_MAPPINGS_ERROR,\n FETCH_GROUP_MAPPINGS_REQUEST,\n FETCH_GROUP_MAPPINGS_SUCCESS,\n SUBMIT_NEW_GROUP_MAPPING_REQUEST,\n SUBMIT_NEW_GROUP_MAPPING_SUCCESS,\n SUBMIT_UPDATED_GROUP_MAPPING_REQUEST,\n SUBMIT_UPDATED_GROUP_MAPPING_SUCCESS,\n SUBMIT_GROUP_MAPPING_ERROR,\n FETCH_GROUPS_ERROR,\n FETCH_GROUPS_REQUEST,\n FETCH_GROUPS_SUCCESS,\n FETCH_SUGGESTIONS_REQUEST,\n FETCH_SUGGESTIONS_ERROR,\n SET_SUGGESTIONS,\n UPDATE_SUGGESTIONS_ERROR,\n UPDATE_SUGGESTIONS_REQUEST,\n UPDATE_SUGGESTIONS_SUCCESS,\n PREPARE_FORM_REQUEST,\n PREPARE_FORM_SUCCESS,\n PREPARE_FORM_ERROR,\n} from \"./actions\";\nimport { LOADING_STATES } from \"../../types\";\nimport { UserSyncAction } from \"../actions\";\n\nexport interface SpeakapGroupUI extends SpeakapGroup {\n parent?: SpeakapGroup;\n}\n\nexport interface GroupMappingsState {\n loadingState: LOADING_STATES;\n results: Array;\n items: {\n [name: string]: GroupMapping;\n };\n edit: {\n loadingState: LOADING_STATES;\n };\n groups: {\n loadingState: LOADING_STATES;\n results: Array;\n items: {\n [name: string]: SpeakapGroupUI;\n };\n networkId: string | undefined;\n };\n builder: {\n loadingState: LOADING_STATES;\n subjects: Array;\n objects: {\n [subjectKey: string]: Array;\n };\n };\n updateSuggestions: {\n loadingState: LOADING_STATES;\n };\n networkId: string;\n prepareForm: {\n loadingState: LOADING_STATES;\n networkId: string;\n scimUsers: Array;\n };\n}\n\nexport const initialState: GroupMappingsState = {\n builder: {\n loadingState: LOADING_STATES.INITIAL,\n objects: {},\n subjects: [],\n },\n edit: {\n loadingState: LOADING_STATES.INITIAL,\n },\n groups: {\n items: {},\n loadingState: LOADING_STATES.INITIAL,\n networkId: undefined,\n results: [],\n },\n items: {},\n loadingState: LOADING_STATES.INITIAL,\n networkId: \"\",\n prepareForm: {\n loadingState: LOADING_STATES.INITIAL,\n networkId: \"\",\n scimUsers: [],\n },\n results: [],\n updateSuggestions: {\n loadingState: LOADING_STATES.INITIAL,\n },\n};\n\nconst groupMappingsReducer = (\n state: GroupMappingsState = initialState,\n action: UserSyncAction,\n): GroupMappingsState =>\n produce(state, (draft: GroupMappingsState) => {\n switch (action.type) {\n case FETCH_GROUP_MAPPINGS_REQUEST:\n draft.loadingState = LOADING_STATES.FETCHING;\n break;\n case FETCH_GROUP_MAPPINGS_SUCCESS: {\n const dictionary = keyBy(action.payload.groupMappings, \"name\");\n draft.loadingState = LOADING_STATES.SUCCESSFUL;\n draft.items = dictionary;\n draft.networkId = action.payload.networkId;\n draft.results = Object.keys(dictionary).sort();\n break;\n }\n case FETCH_GROUP_MAPPINGS_ERROR:\n draft.loadingState = LOADING_STATES.ERROR;\n break;\n case SUBMIT_NEW_GROUP_MAPPING_REQUEST:\n case SUBMIT_UPDATED_GROUP_MAPPING_REQUEST:\n draft.edit.loadingState = LOADING_STATES.FETCHING;\n break;\n case SUBMIT_NEW_GROUP_MAPPING_SUCCESS:\n case SUBMIT_UPDATED_GROUP_MAPPING_SUCCESS: {\n draft.edit.loadingState = LOADING_STATES.SUCCESSFUL;\n const groupMapping = action.payload;\n draft.items[groupMapping.name] = groupMapping;\n if (!draft.results.includes(groupMapping.name)) {\n draft.results.push(groupMapping.name);\n draft.results.sort();\n }\n break;\n }\n case SUBMIT_GROUP_MAPPING_ERROR:\n draft.edit.loadingState = LOADING_STATES.ERROR;\n break;\n case FETCH_GROUPS_REQUEST:\n draft.groups.loadingState = LOADING_STATES.FETCHING;\n break;\n case FETCH_GROUPS_SUCCESS: {\n const sortedGroups = sortBy(action.payload.groups, \"name\");\n const dictionary = keyBy(sortedGroups, \"id\");\n for (const group of action.payload.groups) {\n const parentId = group.parentId;\n if (parentId) {\n const parent = dictionary[parentId];\n if (parent) {\n dictionary[group.id].parent = parent;\n }\n }\n }\n draft.groups.loadingState = LOADING_STATES.SUCCESSFUL;\n draft.groups.items = dictionary;\n draft.groups.results = sortedGroups.map(group => group.id);\n draft.groups.networkId = action.payload.networkId;\n break;\n }\n case FETCH_GROUPS_ERROR:\n draft.groups.loadingState = LOADING_STATES.ERROR;\n break;\n case FETCH_SUGGESTIONS_REQUEST:\n draft.builder.loadingState = LOADING_STATES.FETCHING;\n break;\n case FETCH_SUGGESTIONS_ERROR:\n draft.builder.loadingState = LOADING_STATES.ERROR;\n draft.builder.subjects = [];\n draft.builder.objects = {};\n break;\n case SET_SUGGESTIONS:\n draft.builder.loadingState = LOADING_STATES.SUCCESSFUL;\n draft.builder.subjects = action.payload.subjects;\n draft.builder.objects = action.payload.objects || {};\n break;\n case UPDATE_SUGGESTIONS_REQUEST:\n draft.updateSuggestions.loadingState = LOADING_STATES.FETCHING;\n break;\n case UPDATE_SUGGESTIONS_SUCCESS:\n draft.updateSuggestions.loadingState = LOADING_STATES.SUCCESSFUL;\n break;\n case UPDATE_SUGGESTIONS_ERROR:\n draft.updateSuggestions.loadingState = LOADING_STATES.ERROR;\n break;\n case PREPARE_FORM_REQUEST:\n draft.prepareForm.loadingState = LOADING_STATES.FETCHING;\n break;\n case PREPARE_FORM_SUCCESS:\n draft.prepareForm.loadingState = LOADING_STATES.SUCCESSFUL;\n draft.prepareForm.networkId = action.payload.networkId;\n draft.prepareForm.scimUsers = action.payload.scimUsers.filter(\n user => user.active !== false,\n );\n break;\n case PREPARE_FORM_ERROR:\n draft.prepareForm.loadingState = LOADING_STATES.ERROR;\n break;\n case DELETE_RESOURCE_SUCCESS: {\n const { resourceType, resourceName } = action.payload;\n if (resourceType === \"group-mappings\") {\n draft.results = draft.results.filter(name => name !== resourceName);\n }\n break;\n }\n }\n });\n\nexport default groupMappingsReducer;\n","import { Network } from \"@speakap/types\";\nimport produce from \"immer\";\n\nimport { LOADING_STATES } from \"../../types\";\nimport {\n NetworksActions,\n FETCH_NETWORKS_ERROR,\n FETCH_NETWORKS_SUCCESS,\n FETCH_NETWORK_ROLES_ERROR,\n FETCH_NETWORK_ROLES_REQUEST,\n FETCH_NETWORK_ROLES_SUCCESS,\n FETCH_NETWORKS_PARTIAL_ERROR,\n FETCH_NETWORKS_PARTIAL_SUCCESS,\n SET_ACTIVE_NETWORK,\n} from \"./actions\";\n\nexport interface NetworksState {\n activeNetworkId: string;\n activeNetworkName: string;\n activeNetworkSubdomain: string;\n loadingState: LOADING_STATES;\n items: Array;\n roles: {\n loadingState: LOADING_STATES;\n items: Array<{ id: string; name: string }>;\n };\n limit: number;\n offset: number;\n totalItems: number;\n isLoadingMore: boolean;\n}\n\nexport const initialState: NetworksState = {\n activeNetworkId: \"\",\n activeNetworkName: \"\",\n activeNetworkSubdomain: \"\",\n isLoadingMore: false,\n items: [],\n limit: 0,\n loadingState: LOADING_STATES.INITIAL,\n offset: 0,\n roles: {\n items: [],\n loadingState: LOADING_STATES.INITIAL,\n },\n totalItems: 0,\n};\n\nconst networksReducer = (\n state: NetworksState = initialState,\n action: NetworksActions,\n): NetworksState =>\n produce(state, (draft: NetworksState) => {\n switch (action.type) {\n case FETCH_NETWORKS_SUCCESS:\n draft.loadingState = LOADING_STATES.SUCCESSFUL;\n draft.items = action.payload;\n draft.limit = action.limit;\n draft.offset = action.offset;\n draft.totalItems = action.totalItems;\n draft.isLoadingMore = false;\n break;\n case FETCH_NETWORKS_ERROR:\n draft.loadingState = LOADING_STATES.ERROR;\n draft.isLoadingMore = false;\n break;\n case FETCH_NETWORKS_PARTIAL_SUCCESS:\n draft.loadingState = LOADING_STATES.FETCHING;\n draft.items = action.payload;\n draft.limit = action.limit;\n draft.offset = action.offset;\n draft.totalItems = action.totalItems;\n draft.isLoadingMore = true;\n break;\n case FETCH_NETWORKS_PARTIAL_ERROR:\n draft.loadingState = LOADING_STATES.ERROR;\n draft.isLoadingMore = false;\n break;\n case SET_ACTIVE_NETWORK:\n draft.activeNetworkId = action.payload.networkId;\n draft.activeNetworkName = action.payload.networkName;\n draft.activeNetworkSubdomain = action.payload.networkSubdomain;\n break;\n case FETCH_NETWORK_ROLES_REQUEST:\n draft.roles.loadingState = LOADING_STATES.INITIAL;\n break;\n case FETCH_NETWORK_ROLES_SUCCESS:\n draft.roles.loadingState = LOADING_STATES.SUCCESSFUL;\n draft.roles.items = action.payload;\n break;\n case FETCH_NETWORK_ROLES_ERROR:\n draft.roles.loadingState = LOADING_STATES.ERROR;\n break;\n }\n });\n\nexport default networksReducer;\n","import { NetworksActions, SET_ACTIVE_NETWORK } from \"../networks/actions\";\n\nexport type NetworksRecentState = Array<{\n networkId: string;\n networkName: string;\n networkSubdomain: string;\n lastActive: string;\n}>;\n\nexport const initialState = [];\n\nconst networksReducer = (\n state: NetworksRecentState = initialState,\n action: NetworksActions,\n): NetworksRecentState => {\n switch (action.type) {\n case SET_ACTIVE_NETWORK: {\n const { networkId, networkName, networkSubdomain } = action.payload;\n return [\n {\n lastActive: new Date().toISOString(),\n networkId,\n networkName,\n networkSubdomain,\n },\n ...state.filter(item => item.networkId !== action.payload.networkId),\n ];\n }\n default:\n return state;\n }\n};\n\nexport default networksReducer;\n","import { EnhancedNotification, Subscriber, Email } from \"@speakap/types\";\nimport produce from \"immer\";\n\nimport {\n FETCH_NETWORK_SUBSCRIBERS_ERROR,\n FETCH_NETWORK_SUBSCRIBERS_REQUEST,\n FETCH_NETWORK_SUBSCRIBERS_SUCCESS,\n FETCH_NOTIFICATIONS_ERROR,\n FETCH_NOTIFICATIONS_REQUEST,\n FETCH_NOTIFICATIONS_SUCCESS,\n NotificationsActions,\n SCHEDULE_NOTIFICATION_ERROR,\n SCHEDULE_NOTIFICATION_REQUEST,\n SCHEDULE_NOTIFICATION_SUCCESS,\n SEND_EMAIL_NOTIFICATION_ERROR,\n SEND_EMAIL_NOTIFICATION_REQUEST,\n SEND_EMAIL_NOTIFICATION_SUCCESS,\n SUBMIT_NOTIFICATION_ERROR,\n SUBMIT_NOTIFICATION_REQUEST,\n SUBMIT_NOTIFICATION_SUCCESS,\n SUBMIT_SUBSCRIBER_ERROR,\n SUBMIT_SUBSCRIBER_REQUEST,\n SUBMIT_SUBSCRIBER_SUCCESS,\n UPDATE_NOTIFICATION_ERROR,\n UPDATE_NOTIFICATION_REQUEST,\n UPDATE_NOTIFICATION_SUCCESS,\n SET_EDIT_SUBSCRIBER,\n SET_EDIT_NOTIFICATION,\n DELETE_NOTIFICATION_SUCCESS,\n DELETE_NOTIFICATION_REQUEST,\n DELETE_NOTIFICATION_ERROR,\n SEND_EMAIL_NOTIFICATION_RESET,\n} from \"./actions\";\nimport { LOADING_STATES } from \"../../types\";\n\nexport interface NotificationsState {\n loadingState: LOADING_STATES;\n notifications: Array;\n deleteNotification: {\n loadingState: LOADING_STATES;\n };\n scheduleNotification: {\n loadingState: LOADING_STATES;\n };\n sendNotification: {\n loadingState: LOADING_STATES;\n status?: number;\n email?: Email;\n };\n subscribers: {\n items: Array;\n loadingState: LOADING_STATES;\n };\n editSubscriber: {\n item?: Subscriber;\n loadingState: LOADING_STATES;\n mode: \"new\" | \"edit\" | \"closed\";\n };\n editNotification: {\n item?: EnhancedNotification;\n loadingState: LOADING_STATES;\n mode: \"new\" | \"edit\" | \"closed\";\n };\n}\n\nexport const initialState: NotificationsState = {\n deleteNotification: {\n loadingState: LOADING_STATES.INITIAL,\n },\n editNotification: {\n loadingState: LOADING_STATES.INITIAL,\n mode: \"closed\",\n },\n editSubscriber: {\n loadingState: LOADING_STATES.INITIAL,\n mode: \"closed\",\n },\n loadingState: LOADING_STATES.INITIAL,\n notifications: [],\n scheduleNotification: {\n loadingState: LOADING_STATES.INITIAL,\n },\n sendNotification: {\n loadingState: LOADING_STATES.INITIAL,\n },\n subscribers: {\n items: [],\n loadingState: LOADING_STATES.INITIAL,\n },\n};\n\nconst networksReducer = (\n state: NotificationsState = initialState,\n action: NotificationsActions,\n): NotificationsState =>\n produce(state, (draft: NotificationsState) => {\n switch (action.type) {\n case FETCH_NOTIFICATIONS_REQUEST:\n draft.loadingState = LOADING_STATES.FETCHING;\n break;\n case FETCH_NOTIFICATIONS_SUCCESS:\n draft.loadingState = LOADING_STATES.SUCCESSFUL;\n draft.notifications = action.payload;\n break;\n case FETCH_NOTIFICATIONS_ERROR:\n draft.loadingState = LOADING_STATES.ERROR;\n break;\n case SUBMIT_NOTIFICATION_REQUEST:\n draft.editNotification.loadingState = LOADING_STATES.FETCHING;\n break;\n case SUBMIT_NOTIFICATION_SUCCESS:\n draft.notifications.push(action.payload);\n draft.editNotification.mode = \"closed\";\n draft.editNotification.loadingState = LOADING_STATES.SUCCESSFUL;\n break;\n case SUBMIT_NOTIFICATION_ERROR:\n draft.editNotification.loadingState = LOADING_STATES.ERROR;\n break;\n case FETCH_NETWORK_SUBSCRIBERS_REQUEST:\n draft.subscribers.loadingState = LOADING_STATES.FETCHING;\n break;\n case FETCH_NETWORK_SUBSCRIBERS_SUCCESS:\n draft.subscribers.loadingState = LOADING_STATES.SUCCESSFUL;\n draft.subscribers.items = action.payload;\n break;\n case FETCH_NETWORK_SUBSCRIBERS_ERROR:\n draft.subscribers.loadingState = LOADING_STATES.ERROR;\n draft.subscribers.items = [];\n break;\n case SUBMIT_SUBSCRIBER_SUCCESS: {\n if (state.editSubscriber.mode === \"new\") {\n draft.subscribers.items.push(action.payload);\n } else if (state.editSubscriber.mode === \"edit\") {\n draft.subscribers.items = state.subscribers.items.map(subscriber =>\n subscriber.id === action.payload.id ? action.payload : subscriber,\n );\n }\n draft.editSubscriber.loadingState = LOADING_STATES.SUCCESSFUL;\n draft.editSubscriber.mode = \"closed\";\n draft.editSubscriber.item = undefined;\n break;\n }\n case SUBMIT_SUBSCRIBER_REQUEST:\n draft.editSubscriber.loadingState = LOADING_STATES.FETCHING;\n break;\n case SUBMIT_SUBSCRIBER_ERROR:\n draft.editSubscriber.loadingState = LOADING_STATES.ERROR;\n break;\n case SET_EDIT_SUBSCRIBER:\n draft.editSubscriber.item = action.payload.subscriber;\n draft.editSubscriber.mode = action.payload.mode;\n break;\n case SET_EDIT_NOTIFICATION:\n draft.editNotification.item = action.payload.notification;\n draft.editNotification.mode = action.payload.mode;\n break;\n case UPDATE_NOTIFICATION_REQUEST:\n draft.editNotification.loadingState = LOADING_STATES.FETCHING;\n break;\n case UPDATE_NOTIFICATION_ERROR:\n draft.editNotification.loadingState = LOADING_STATES.ERROR;\n break;\n case UPDATE_NOTIFICATION_SUCCESS:\n draft.editNotification.mode = \"closed\";\n draft.notifications = state.notifications.map(notification =>\n notification.id === action.payload.id\n ? { ...action.payload, job: notification.job }\n : notification,\n );\n draft.editNotification.loadingState = LOADING_STATES.SUCCESSFUL;\n break;\n case SEND_EMAIL_NOTIFICATION_SUCCESS:\n draft.sendNotification.loadingState = LOADING_STATES.SUCCESSFUL;\n draft.sendNotification.email = action.payload.email;\n draft.sendNotification.status = action.payload.status;\n break;\n case SEND_EMAIL_NOTIFICATION_ERROR:\n draft.sendNotification.loadingState = LOADING_STATES.ERROR;\n break;\n case SEND_EMAIL_NOTIFICATION_REQUEST:\n draft.sendNotification.loadingState = LOADING_STATES.FETCHING;\n break;\n case SEND_EMAIL_NOTIFICATION_RESET:\n draft.sendNotification.loadingState = LOADING_STATES.INITIAL;\n draft.sendNotification.email = undefined;\n draft.sendNotification.status = undefined;\n break;\n case SCHEDULE_NOTIFICATION_REQUEST:\n draft.scheduleNotification.loadingState = LOADING_STATES.FETCHING;\n break;\n case SCHEDULE_NOTIFICATION_SUCCESS:\n draft.scheduleNotification.loadingState = LOADING_STATES.SUCCESSFUL;\n draft.notifications = state.notifications.map(notification =>\n notification.id === +action.payload.resourceIdentifier\n ? { ...notification, job: action.payload }\n : notification,\n );\n break;\n case SCHEDULE_NOTIFICATION_ERROR:\n draft.scheduleNotification.loadingState = LOADING_STATES.ERROR;\n break;\n case DELETE_NOTIFICATION_REQUEST:\n draft.deleteNotification.loadingState = LOADING_STATES.FETCHING;\n break;\n case DELETE_NOTIFICATION_SUCCESS:\n draft.notifications = state.notifications.filter(\n notification => notification.id !== action.payload,\n );\n break;\n case DELETE_NOTIFICATION_ERROR:\n draft.deleteNotification.loadingState = LOADING_STATES.ERROR;\n break;\n }\n });\n\nexport default networksReducer;\n","import { SpeakapGroup, ScimUser } from \"@speakap/types\";\nimport produce from \"immer\";\n\nimport { LOADING_STATES } from \"../../types\";\nimport {\n OrganizationalOverviewActions,\n FETCH_ORGANIZATIONAL_OVERVIEW_ERROR,\n FETCH_ORGANIZATIONAL_OVERVIEW_REQUEST,\n FETCH_ORGANIZATIONAL_OVERVIEW_SUCCESS,\n} from \"./actions\";\n\nexport interface OrganizationalOverviewState {\n loadingState: LOADING_STATES;\n response: {\n groups: Array;\n users: Array;\n };\n}\n\nexport const initialState = {\n loadingState: LOADING_STATES.INITIAL,\n response: {\n groups: [],\n users: [],\n },\n};\n\nconst organizationalOverviewReducer = (\n state: OrganizationalOverviewState = initialState,\n action: OrganizationalOverviewActions,\n): OrganizationalOverviewState =>\n produce(state, (draft: OrganizationalOverviewState) => {\n switch (action.type) {\n case FETCH_ORGANIZATIONAL_OVERVIEW_REQUEST:\n draft.loadingState = LOADING_STATES.FETCHING;\n break;\n case FETCH_ORGANIZATIONAL_OVERVIEW_SUCCESS:\n draft.loadingState = LOADING_STATES.SUCCESSFUL;\n draft.response = action.payload;\n break;\n case FETCH_ORGANIZATIONAL_OVERVIEW_ERROR:\n draft.loadingState = LOADING_STATES.ERROR;\n draft.response = {\n groups: [],\n users: [],\n };\n break;\n }\n });\n\nexport default organizationalOverviewReducer;\n","import { SyncedUser, SyncProtocol, ResyncResponse, SyncRequestHistory } from \"@speakap/types\";\nimport produce from \"immer\";\n\nimport { LOADING_STATES } from \"../../types\";\nimport {\n ResyncRequestsActions,\n CREATE_RESYNC_REQUEST_ERROR,\n CREATE_RESYNC_REQUEST_SUCCESS,\n CREATE_RESYNC_REQUEST_REQUEST,\n CREATE_RESYNC_REQUEST_RESET,\n CONFIRM_RESYNC_REQUEST_ERROR,\n CONFIRM_RESYNC_REQUEST_SUCCESS,\n CONFIRM_RESYNC_REQUEST_REQUEST,\n} from \"./actions\";\n\nexport interface ResyncRequestsState {\n create: {\n loadingState: LOADING_STATES;\n syncedUser?: SyncedUser;\n resyncResponse?: ResyncResponse;\n };\n confirm: {\n loadingState: LOADING_STATES;\n syncProtocol?: SyncProtocol;\n syncRequestHistories?: Array;\n };\n}\n\nexport const initialState: ResyncRequestsState = {\n confirm: {\n loadingState: LOADING_STATES.INITIAL,\n },\n create: {\n loadingState: LOADING_STATES.INITIAL,\n },\n};\n\nconst resyncRequestsReducer = (\n state: ResyncRequestsState = initialState,\n action: ResyncRequestsActions,\n): ResyncRequestsState =>\n produce(state, (draft: ResyncRequestsState) => {\n switch (action.type) {\n case CREATE_RESYNC_REQUEST_REQUEST:\n draft.create.loadingState = LOADING_STATES.FETCHING;\n draft.create.syncedUser = action.payload;\n draft.create.resyncResponse = undefined;\n break;\n case CREATE_RESYNC_REQUEST_SUCCESS:\n draft.create.loadingState = LOADING_STATES.SUCCESSFUL;\n draft.create.resyncResponse = action.payload;\n break;\n case CREATE_RESYNC_REQUEST_ERROR:\n draft.create.loadingState = LOADING_STATES.ERROR;\n break;\n case CREATE_RESYNC_REQUEST_RESET:\n draft.create.loadingState = LOADING_STATES.INITIAL;\n draft.create.resyncResponse = undefined;\n draft.create.syncedUser = undefined;\n draft.confirm.loadingState = LOADING_STATES.INITIAL;\n draft.confirm.syncProtocol = undefined;\n break;\n case CONFIRM_RESYNC_REQUEST_REQUEST:\n draft.confirm.loadingState = LOADING_STATES.FETCHING;\n break;\n case CONFIRM_RESYNC_REQUEST_SUCCESS:\n draft.confirm.loadingState = LOADING_STATES.SUCCESSFUL;\n draft.confirm.syncProtocol = action.payload.syncProtocol;\n draft.confirm.syncRequestHistories = action.payload.syncRequestHistories;\n break;\n case CONFIRM_RESYNC_REQUEST_ERROR:\n draft.confirm.loadingState = LOADING_STATES.ERROR;\n break;\n }\n });\n\nexport default resyncRequestsReducer;\n","import produce from \"immer\";\n\nimport { BaseResource } from \"../api\";\nimport { LOADING_STATES } from \"../../types\";\nimport {\n RevisionsActions,\n FETCH_REVISIONS_ERROR,\n FETCH_REVISIONS_REQUEST,\n FETCH_REVISIONS_SUCCESS,\n} from \"./actions\";\n\nexport interface RevisionsState {\n loadingState: LOADING_STATES;\n items: Array;\n}\n\nexport const initialState: RevisionsState = {\n items: [],\n loadingState: LOADING_STATES.INITIAL,\n};\n\nconst revisionsReducer = (\n state: RevisionsState = initialState,\n action: RevisionsActions,\n): RevisionsState =>\n produce(state, (draft: RevisionsState) => {\n switch (action.type) {\n case FETCH_REVISIONS_REQUEST:\n draft.loadingState = LOADING_STATES.FETCHING;\n break;\n case FETCH_REVISIONS_SUCCESS: {\n draft.loadingState = LOADING_STATES.SUCCESSFUL;\n draft.items = action.payload;\n break;\n }\n case FETCH_REVISIONS_ERROR:\n draft.loadingState = LOADING_STATES.ERROR;\n break;\n }\n });\n\nexport default revisionsReducer;\n","import { RoleMapping } from \"@speakap/types\";\nimport { keyBy } from \"lodash\";\nimport produce from \"immer\";\n\nimport { DELETE_RESOURCE_SUCCESS } from \"../delete-resources/actions\";\nimport {\n FETCH_ROLE_MAPPINGS_ERROR,\n FETCH_ROLE_MAPPINGS_REQUEST,\n FETCH_ROLE_MAPPINGS_SUCCESS,\n SUBMIT_NEW_ROLE_MAPPING_REQUEST,\n SUBMIT_NEW_ROLE_MAPPING_SUCCESS,\n SUBMIT_UPDATED_ROLE_MAPPING_REQUEST,\n SUBMIT_UPDATED_ROLE_MAPPING_SUCCESS,\n SUBMIT_ROLE_MAPPING_ERROR,\n} from \"./actions\";\nimport { LOADING_STATES } from \"../../types\";\nimport { UserSyncAction } from \"../actions\";\n\nexport interface RoleMappingsState {\n loadingState: LOADING_STATES;\n results: Array;\n items: {\n [name: string]: RoleMapping;\n };\n edit: {\n loadingState: LOADING_STATES;\n };\n networkId: string;\n}\n\nexport const initialState: RoleMappingsState = {\n edit: {\n loadingState: LOADING_STATES.INITIAL,\n },\n items: {},\n loadingState: LOADING_STATES.INITIAL,\n networkId: \"\",\n results: [],\n};\n\nconst roleMappingsReducer = (\n state: RoleMappingsState = initialState,\n action: UserSyncAction,\n): RoleMappingsState =>\n produce(state, (draft: RoleMappingsState) => {\n switch (action.type) {\n case FETCH_ROLE_MAPPINGS_REQUEST:\n draft.loadingState = LOADING_STATES.FETCHING;\n break;\n case FETCH_ROLE_MAPPINGS_SUCCESS: {\n const dictionary = keyBy(action.payload.roleMappings, \"name\");\n draft.loadingState = LOADING_STATES.SUCCESSFUL;\n draft.items = dictionary;\n draft.networkId = action.payload.networkId;\n draft.results = Object.keys(dictionary).sort();\n break;\n }\n case FETCH_ROLE_MAPPINGS_ERROR:\n draft.loadingState = LOADING_STATES.ERROR;\n break;\n case SUBMIT_NEW_ROLE_MAPPING_REQUEST:\n case SUBMIT_UPDATED_ROLE_MAPPING_REQUEST:\n draft.edit.loadingState = LOADING_STATES.FETCHING;\n break;\n case SUBMIT_NEW_ROLE_MAPPING_SUCCESS:\n case SUBMIT_UPDATED_ROLE_MAPPING_SUCCESS: {\n draft.edit.loadingState = LOADING_STATES.SUCCESSFUL;\n const roleMapping = action.payload;\n draft.items[roleMapping.name] = roleMapping;\n if (!draft.results.includes(roleMapping.name)) {\n draft.results.push(roleMapping.name);\n draft.results.sort();\n }\n break;\n }\n case SUBMIT_ROLE_MAPPING_ERROR:\n draft.edit.loadingState = LOADING_STATES.ERROR;\n break;\n case DELETE_RESOURCE_SUCCESS: {\n const { resourceType, resourceName } = action.payload;\n if (resourceType === \"role-mappings\") {\n draft.results = draft.results.filter(name => name !== resourceName);\n }\n break;\n }\n }\n });\n\nexport default roleMappingsReducer;\n","import { ConnectorRun } from \"@speakap/types\";\nimport produce from \"immer\";\n\nimport { LOADING_STATES } from \"../../types\";\nimport {\n RunsActions,\n SUBMIT_RUNS_ERROR,\n SUBMIT_RUNS_REQUEST,\n SUBMIT_RUNS_SUCCESS,\n} from \"./actions\";\n\nexport interface RunsState {\n loadingState: LOADING_STATES;\n results: Array;\n items: {\n [id: number]: ConnectorRun;\n };\n error: {\n connectorName?: string;\n data?: string;\n message: string;\n serviceName?: string;\n };\n}\n\nexport const initialState = {\n error: {\n message: \"\",\n },\n items: {},\n loadingState: LOADING_STATES.INITIAL,\n results: [],\n};\n\nconst networksReducer = (state: RunsState = initialState, action: RunsActions): RunsState =>\n produce(state, (draft: RunsState) => {\n switch (action.type) {\n case SUBMIT_RUNS_REQUEST:\n draft.loadingState = LOADING_STATES.FETCHING;\n break;\n case SUBMIT_RUNS_SUCCESS: {\n draft.loadingState = LOADING_STATES.SUCCESSFUL;\n draft.items[action.payload.id] = action.payload;\n draft.results.push(action.payload.id);\n break;\n }\n case SUBMIT_RUNS_ERROR:\n draft.loadingState = LOADING_STATES.ERROR;\n draft.error = action.payload;\n break;\n }\n });\n\nexport default networksReducer;\n","import { SyncProtocol } from \"@speakap/types\";\n\nimport { LOADING_STATES } from \"../../types\";\nimport {\n SyncProtocolActions,\n FETCH_SYNC_PROTOCOLS_ERROR,\n FETCH_SYNC_PROTOCOLS_REQUEST,\n FETCH_SYNC_PROTOCOLS_SUCCESS,\n} from \"./actions\";\n\nexport interface SyncProtocolState {\n loadingState: LOADING_STATES;\n protocols: Array;\n offset: number;\n hasMore: boolean;\n}\n\nexport const initialState: SyncProtocolState = {\n hasMore: false,\n loadingState: LOADING_STATES.INITIAL,\n offset: 0,\n protocols: [],\n};\n\nconst syncProtocolsReducer = (\n state: SyncProtocolState = initialState,\n action: SyncProtocolActions,\n): SyncProtocolState => {\n switch (action.type) {\n case FETCH_SYNC_PROTOCOLS_REQUEST:\n return {\n hasMore: false,\n loadingState: LOADING_STATES.FETCHING,\n offset: 0,\n protocols: [],\n };\n case FETCH_SYNC_PROTOCOLS_SUCCESS:\n return {\n hasMore: action.payload.hasMore,\n loadingState: LOADING_STATES.SUCCESSFUL,\n offset: state.offset + action.payload.limit,\n protocols: [...state.protocols, ...action.payload.protocols],\n };\n case FETCH_SYNC_PROTOCOLS_ERROR:\n return {\n hasMore: false,\n loadingState: LOADING_STATES.ERROR,\n offset: initialState.offset,\n protocols: state.protocols,\n };\n default:\n return state;\n }\n};\nexport default syncProtocolsReducer;\n","import { SyncedUser } from \"@speakap/types\";\n\nimport { LOADING_STATES } from \"../../types\";\nimport {\n SyncedUsersActions,\n FETCH_SYNCED_USERS_ERROR,\n FETCH_SYNCED_USERS_REQUEST,\n FETCH_SYNCED_USERS_SUCCESS,\n FETCH_SYNCED_USERS_BATCH,\n} from \"./actions\";\n\nexport interface SyncedUsersState {\n loadingState: LOADING_STATES;\n isLoadingMore: boolean;\n networkId: string;\n syncedUsers: Array;\n}\n\nexport const initialState: SyncedUsersState = {\n isLoadingMore: false,\n loadingState: LOADING_STATES.INITIAL,\n networkId: \"\",\n syncedUsers: [],\n};\n\nconst syncedUsersReducer = (\n state: SyncedUsersState = initialState,\n action: SyncedUsersActions,\n): SyncedUsersState => {\n switch (action.type) {\n case FETCH_SYNCED_USERS_REQUEST:\n return {\n ...initialState,\n loadingState: LOADING_STATES.FETCHING,\n networkId: action.payload,\n };\n case FETCH_SYNCED_USERS_BATCH:\n return {\n ...state,\n isLoadingMore: true,\n loadingState: LOADING_STATES.SUCCESSFUL,\n syncedUsers: [...state.syncedUsers, ...action.payload],\n };\n case FETCH_SYNCED_USERS_SUCCESS:\n return {\n ...state,\n isLoadingMore: false,\n loadingState: LOADING_STATES.SUCCESSFUL,\n };\n case FETCH_SYNCED_USERS_ERROR:\n return {\n ...state,\n isLoadingMore: false,\n loadingState: LOADING_STATES.ERROR,\n syncedUsers: [],\n };\n default:\n return state;\n }\n};\n\nexport default syncedUsersReducer;\n","import { combineReducers, Action } from \"redux\";\nimport { connectRouter, RouterState } from \"connected-react-router\";\n\nimport { SET_ACTIVE_NETWORK } from \"./networks/actions\";\nimport accessManagement, { AccessManagementState } from \"./access-management/reducer\";\nimport auth, { AuthState } from \"./auth/reducer\";\nimport columnMappings, { ColumnMappingsState } from \"./column-mappings/reducer\";\nimport comments, { CommentsState } from \"./comments/reducer\";\nimport configs, { ConfigsState } from \"./configs/reducer\";\nimport connectors, { ConnectorsState } from \"./connectors/reducer\";\nimport deleteResources, { DeleteResourcesState } from \"./delete-resources/reducer\";\nimport dryRuns, { DryRunsState } from \"./dry-runs/reducer\";\nimport expressionHelpers, { ExpressionHelpersState } from \"./expression-helpers/reducer\";\nimport groupMappings, { GroupMappingsState } from \"./group-mappings/reducer\";\nimport history from \"./history\";\nimport networks, { NetworksState } from \"./networks/reducer\";\nimport networksRecent, { NetworksRecentState } from \"./networks-recent/reducer\";\nimport notifications, { NotificationsState } from \"./notifications/reducer\";\nimport organizationalOverview, {\n OrganizationalOverviewState,\n} from \"./organizational-overviews/reducer\";\nimport resyncRequests, { ResyncRequestsState } from \"./resync-requests/reducer\";\nimport revisions, { RevisionsState } from \"./revisions/reducer\";\nimport roleMappings, { RoleMappingsState } from \"./role-mappings/reducer\";\nimport runs, { RunsState } from \"./runs/reducer\";\nimport syncProtocols, { SyncProtocolState } from \"./sync-protocols/reducer\";\nimport syncedUsers, { SyncedUsersState } from \"./synced-users/reducer\";\n\nexport interface ApplicationState {\n accessManagement: AccessManagementState;\n auth: AuthState;\n columnMappings: ColumnMappingsState;\n comments: CommentsState;\n configs: ConfigsState;\n connectors: ConnectorsState;\n deleteResources: DeleteResourcesState;\n dryRuns: DryRunsState;\n expressionHelpers: ExpressionHelpersState;\n groupMappings: GroupMappingsState;\n networks: NetworksState;\n notifications: NotificationsState;\n networksRecent: NetworksRecentState;\n organizationalOverview: OrganizationalOverviewState;\n resyncRequests: ResyncRequestsState;\n revisions: RevisionsState;\n roleMappings: RoleMappingsState;\n router: RouterState;\n runs: RunsState;\n syncProtocols: SyncProtocolState;\n syncedUsers: SyncedUsersState;\n}\n\nconst reducer = combineReducers({\n accessManagement,\n auth,\n columnMappings,\n comments,\n configs,\n connectors,\n deleteResources,\n dryRuns,\n expressionHelpers,\n groupMappings,\n networks,\n networksRecent,\n notifications,\n organizationalOverview,\n resyncRequests,\n revisions,\n roleMappings,\n router: connectRouter(history),\n runs,\n syncProtocols,\n syncedUsers,\n});\n\nexport default function(state: ApplicationState | undefined, action: Action): ApplicationState {\n if (action.type === SET_ACTIVE_NETWORK) {\n // When we change the active network, we explicitly reset the entire Redux store\n // (except the auth and networks modules), to prevent lingering network-specific data:\n return reducer(\n state\n ? ({\n auth: state.auth,\n networks: state.networks,\n networksRecent: state.networksRecent,\n router: state.router,\n } as ApplicationState)\n : undefined,\n action,\n );\n } else {\n return reducer(state, action);\n }\n}\n","import { composeWithDevTools } from \"redux-devtools-extension\";\nimport { createStore, applyMiddleware } from \"redux\";\nimport { persistStore, persistReducer } from \"redux-persist\";\nimport { routerMiddleware } from \"connected-react-router\";\nimport storage from \"redux-persist/lib/storage\";\nimport thunk from \"redux-thunk\";\n\nimport history from \"./history\";\nimport reducer from \"./reducer\";\n\nconst persistConfig = {\n key: \"networksRecent\",\n storage,\n whitelist: [\"networksRecent\"],\n};\n\nconst persistedReducer = persistReducer(persistConfig, reducer);\n\nconst store = createStore(\n persistedReducer,\n composeWithDevTools(applyMiddleware(routerMiddleware(history), thunk)),\n);\nconst persistor = persistStore(store);\n\nif (process.env.NODE_ENV !== \"production\" && module.hot) {\n module.hot.accept(\"./reducer\", () => store.replaceReducer(persistedReducer));\n}\n\nexport { persistor, store };\n","/* eslint-disable @typescript-eslint/ban-ts-comment */\nimport { ConfigProvider } from \"antd\";\nimport { ConnectedRouter } from \"connected-react-router\";\nimport { PersistGate } from \"redux-persist/integration/react\";\nimport { Provider } from \"react-redux\";\nimport React from \"react\";\nimport ReactDOM from \"react-dom\";\nimport loadable from \"@loadable/component\";\n\nimport Auth from \"./components/auth\";\nimport history from \"./modules/history\";\nimport { store, persistor } from \"./modules/store\";\n\nconst LoadableRouter = loadable(() => import(\"./components/router\"));\n\nReactDOM.render(\n \n {/* @ts-ignore */}\n \n {/* @ts-ignore */}\n \n {/* @ts-ignore */}\n \n {/* @ts-ignore */}\n \n {/* @ts-ignore */}\n \n \n \n \n \n ,\n document.querySelector(\"#root\"),\n);\n","import { CallHistoryMethodAction } from \"connected-react-router\";\nimport {\n Connector,\n ConnectorRequestBody,\n ConnectorStats,\n ConnectorType,\n ImportUser,\n} from \"@speakap/types\";\nimport { NOT_FOUND } from \"http-status-codes\";\nimport { ThunkAction } from \"redux-thunk\";\nimport { get } from \"lodash\";\nimport { notification } from \"antd\";\n\nimport { ApplicationState } from \"../reducer\";\nimport {\n getConnectors,\n getConnectorStats,\n getImportUsers,\n postNewConnector,\n postUpdatedConnector,\n} from \"../api\";\nimport {\n selectConnectorsNetworkId,\n selectImportUsersConnectorId,\n selectImportUsersItems,\n} from \"./selectors\";\nimport { submitRuns, SubmitRunsSuccessAction } from \"../runs/actions\";\n\nexport const FETCH_CONNECTORS_REQUEST = \"user-sync/connectors/FETCH_CONNECTORS_REQUEST\";\nexport const FETCH_CONNECTORS_SUCCESS = \"user-sync/connectors/FETCH_CONNECTORS_SUCCESS\";\nexport const FETCH_CONNECTORS_ERROR = \"user-sync/connectors/FETCH_CONNECTORS_ERROR\";\n\nexport const FETCH_IMPORT_USERS_REQUEST = \"user-sync/connectors/FETCH_IMPORT_USERS_REQUEST\";\nexport const FETCH_IMPORT_USERS_SUCCESS = \"user-sync/connectors/FETCH_IMPORT_USERS_SUCCESS\";\nexport const FETCH_IMPORT_USERS_ERROR = \"user-sync/connectors/FETCH_IMPORT_USERS_ERROR\";\n\nexport const SUBMIT_NEW_CONNECTOR_REQUEST = \"user-sync/connectors/SUBMIT_NEW_CONNECTOR_REQUEST\";\nexport const SUBMIT_NEW_CONNECTOR_SUCCESS = \"user-sync/connectors/SUBMIT_NEW_CONNECTOR_SUCCESS\";\nexport const SUBMIT_UPDATED_CONNECTOR_REQUEST =\n \"user-sync/connectors/SUBMIT_UPDATED_CONNECTOR_REQUEST\";\nexport const SUBMIT_UPDATED_CONNECTOR_SUCCESS =\n \"user-sync/connectors/SUBMIT_UPDATED_CONNECTOR_SUCCESS\";\nexport const SUBMIT_CONNECTOR_ERROR = \"user-sync/connectors/SUBMIT_CONNECTOR_ERROR\";\n\nexport const FETCH_CONNECTOR_STATS_REQUEST = \"user-sync/connectors/FETCH_CONNECTOR_STATS_REQUEST\";\nexport const FETCH_CONNECTOR_STATS_SUCCESS = \"user-sync/connectors/FETCH_CONNECTOR_STATS_SUCCESS\";\nexport const FETCH_CONNECTOR_STATS_ERROR = \"user-sync/connectors/FETCH_CONNECTOR_STATS_ERROR\";\n\ninterface FetchConnectorsRequestAction {\n type: typeof FETCH_CONNECTORS_REQUEST;\n payload: string;\n}\n\ninterface FetchConnectorsSuccessAction {\n type: typeof FETCH_CONNECTORS_SUCCESS;\n payload: {\n connectors: Array;\n networkId: string;\n };\n}\n\ninterface FetchConnectorsErrorAction {\n type: typeof FETCH_CONNECTORS_ERROR;\n}\n\ninterface FetchImportUsersRequestAction {\n type: typeof FETCH_IMPORT_USERS_REQUEST;\n payload: number;\n}\n\ninterface FetchImportUsersSuccessAction {\n type: typeof FETCH_IMPORT_USERS_SUCCESS;\n payload: {\n connectorId: number;\n importUsers: Array;\n };\n}\n\ninterface FetchImportUsersErrorAction {\n type: typeof FETCH_IMPORT_USERS_ERROR;\n}\n\ninterface SubmitNewConnectorRequestAction {\n type: typeof SUBMIT_NEW_CONNECTOR_REQUEST;\n payload: ConnectorRequestBody;\n}\n\ninterface SubmitNewConnectorSuccessAction {\n type: typeof SUBMIT_NEW_CONNECTOR_SUCCESS;\n payload: Connector;\n}\n\ninterface SubmitUpdatedConnectorRequestAction {\n type: typeof SUBMIT_UPDATED_CONNECTOR_REQUEST;\n payload: { activeRevisionId: number; connector: ConnectorRequestBody };\n}\n\ninterface SubmitUpdatedConnectorSuccessAction {\n type: typeof SUBMIT_UPDATED_CONNECTOR_SUCCESS;\n payload: Connector;\n}\n\ninterface SubmitConnectorErrorAction {\n type: typeof SUBMIT_CONNECTOR_ERROR;\n}\n\ninterface FetchConnectorStatsRequestAction {\n type: typeof FETCH_CONNECTOR_STATS_REQUEST;\n}\n\ninterface FetchConnectorStatsSuccessAction {\n type: typeof FETCH_CONNECTOR_STATS_SUCCESS;\n payload: ConnectorStats;\n}\n\ninterface FetchConnectorStatsErrorAction {\n type: typeof FETCH_CONNECTOR_STATS_ERROR;\n}\n\nexport type ConnectorsAction =\n | FetchConnectorsSuccessAction\n | FetchConnectorsRequestAction\n | FetchConnectorsErrorAction\n | FetchImportUsersRequestAction\n | FetchImportUsersSuccessAction\n | FetchImportUsersErrorAction\n | SubmitNewConnectorRequestAction\n | SubmitNewConnectorSuccessAction\n | SubmitUpdatedConnectorRequestAction\n | SubmitUpdatedConnectorSuccessAction\n | SubmitConnectorErrorAction\n | SubmitRunsSuccessAction\n | FetchConnectorStatsRequestAction\n | FetchConnectorStatsSuccessAction\n | FetchConnectorStatsErrorAction;\n\ntype Thunk = ThunkAction<\n Promise,\n ApplicationState,\n void,\n CallHistoryMethodAction | ConnectorsAction\n>;\n\nexport const fetchConnectors = (networkId: string): Thunk => async (dispatch, getState) => {\n const currentNetworkId = selectConnectorsNetworkId(getState());\n if (networkId !== currentNetworkId) {\n try {\n dispatch({ payload: networkId, type: FETCH_CONNECTORS_REQUEST });\n\n const response = await getConnectors({ networkId });\n dispatch({\n payload: { connectors: response.connectors, networkId },\n type: FETCH_CONNECTORS_SUCCESS,\n });\n } catch (error) {\n dispatch({\n message: error instanceof Error ? error.message : \"Error\",\n type: FETCH_CONNECTORS_ERROR,\n });\n }\n }\n};\n\nexport const fetchImportUsers = (\n connector: Connector,\n): Thunk<[null | string, null | Array]> => async (dispatch, getState) => {\n const state = getState();\n const currentConnectorId = selectImportUsersConnectorId(state);\n const connectorId = connector.id;\n if (!currentConnectorId || currentConnectorId !== connectorId) {\n try {\n dispatch({ payload: connectorId, type: FETCH_IMPORT_USERS_REQUEST });\n\n const { importUsers } = await getImportUsers(connector);\n dispatch({\n payload: { connectorId, importUsers },\n type: FETCH_IMPORT_USERS_SUCCESS,\n });\n return [null, importUsers];\n } catch (error) {\n let errorMessage =\n get(error, [\"response\", \"data\", \"message\"]) ||\n get(error, [\"response\", \"data\"], error instanceof Error ? error.message : \"Error\");\n if (\n get(error, [\"response\", \"status\"]) === NOT_FOUND &&\n connector.type !== ConnectorType.ManualUpload\n ) {\n const [runsErrorMessage, importUsers] = await dispatch(submitRuns({ connector }));\n if (importUsers) {\n return [null, importUsers];\n }\n errorMessage = runsErrorMessage;\n }\n dispatch({ message: errorMessage, type: FETCH_IMPORT_USERS_ERROR });\n return [errorMessage, null];\n }\n } else if (currentConnectorId === connectorId) {\n return [null, selectImportUsersItems(state)];\n } else {\n return [\"Cannot fetch export file\", null];\n }\n};\n\nexport const submitNewConnector = (\n connector: ConnectorRequestBody,\n): Thunk => async dispatch => {\n try {\n dispatch({ payload: connector, type: SUBMIT_NEW_CONNECTOR_REQUEST });\n\n const response = await postNewConnector(connector);\n dispatch({ payload: response, type: SUBMIT_NEW_CONNECTOR_SUCCESS });\n return response;\n } catch (error) {\n const errorMessage =\n get(error, [\"response\", \"data\", \"message\"]) ||\n get(error, [\"response\", \"data\"], error instanceof Error ? error.message : \"Error\");\n notification.error({ message: `Error creating connector: ${errorMessage}` });\n dispatch({\n message: error instanceof Error ? error.message : \"Error\",\n type: SUBMIT_CONNECTOR_ERROR,\n });\n }\n};\n\nexport const submitUpdatedConnector = (\n activeRevisionId: number,\n connector: ConnectorRequestBody,\n): Thunk<[string | null, Connector | null]> => async dispatch => {\n try {\n dispatch({\n payload: { activeRevisionId, connector },\n type: SUBMIT_UPDATED_CONNECTOR_REQUEST,\n });\n\n const response = await postUpdatedConnector(activeRevisionId, connector);\n dispatch({ payload: response, type: SUBMIT_UPDATED_CONNECTOR_SUCCESS });\n return [null, response];\n } catch (error) {\n const errorMessage =\n get(error, [\"response\", \"data\", \"message\"]) ||\n get(error, [\"response\", \"data\"], error instanceof Error ? error.message : \"Error\");\n dispatch({ message: errorMessage, type: SUBMIT_CONNECTOR_ERROR });\n return [errorMessage, null];\n }\n};\n\nexport const fetchConnectorStats = (\n connector: Connector,\n): Thunk<[string | null, ConnectorStats | null]> => async dispatch => {\n try {\n dispatch({\n type: FETCH_CONNECTOR_STATS_REQUEST,\n });\n\n const response = await getConnectorStats(connector.networkId, connector.id);\n dispatch({ payload: response, type: FETCH_CONNECTOR_STATS_SUCCESS });\n return [null, response];\n } catch (error) {\n const errorMessage =\n get(error, [\"response\", \"data\", \"message\"]) ||\n get(error, [\"response\", \"data\"], error instanceof Error ? error.message : \"Error\");\n dispatch({ message: errorMessage, type: FETCH_CONNECTOR_STATS_ERROR });\n return [errorMessage, null];\n }\n};\n","import { CallHistoryMethodAction } from \"connected-react-router\";\nimport { ColumnMapping, ColumnMappingRequestBody, ImportUser } from \"@speakap/types\";\nimport { ThunkAction } from \"redux-thunk\";\nimport { get } from \"lodash\";\nimport { notification } from \"antd\";\n\nimport { ApplicationState } from \"../reducer\";\nimport { fetchImportUsers } from \"../connectors/actions\";\nimport {\n getColumnMappings,\n postNewColumnMapping,\n postUpdatedColumnMapping,\n} from \"../../modules/api\";\nimport { selectApplyColumnMappingConfigName, selectColumnMappingsNetworkId } from \"./selectors\";\nimport { selectConfigItems, selectEditItemConfig } from \"../configs/selectors\";\nimport { selectConnectorsItems, selectImportUsersItems } from \"../connectors/selectors\";\n\nexport const FETCH_COLUMN_MAPPINGS_REQUEST = \"FETCH_COLUMN_MAPPINGS_REQUEST\";\nexport const FETCH_COLUMN_MAPPINGS_SUCCESS = \"FETCH_COLUMN_MAPPINGS_SUCCESS\";\nexport const FETCH_COLUMN_MAPPINGS_ERROR = \"FETCH_COLUMN_MAPPINGS_ERROR\";\n\nexport const SUBMIT_NEW_COLUMN_MAPPING_REQUEST = \"SUBMIT_NEW_COLUMN_MAPPING_REQUEST\";\nexport const SUBMIT_NEW_COLUMN_MAPPING_SUCCESS = \"SUBMIT_NEW_COLUMN_MAPPING_SUCCESS\";\nexport const SUBMIT_UPDATED_COLUMN_MAPPING_REQUEST = \"SUBMIT_UPDATED_COLUMN_MAPPING_REQUEST\";\nexport const SUBMIT_UPDATED_COLUMN_MAPPING_SUCCESS = \"SUBMIT_UPDATED_COLUMN_MAPPING_SUCCESS\";\nexport const SUBMIT_COLUMN_MAPPING_ERROR = \"SUBMIT_COLUMN_MAPPING_ERROR\";\n\nexport const APPLY_COLUMN_MAPPINGS_REQUEST = \"APPLY_COLUMN_MAPPINGS_REQUEST\";\nexport const APPLY_COLUMN_MAPPINGS_SUCCESS = \"APPLY_COLUMN_MAPPINGS_SUCCESS\";\nexport const APPLY_COLUMN_MAPPINGS_ERROR = \"APPLY_COLUMN_MAPPINGS_ERROR\";\n\ninterface FetchColumnMappingsRequestAction {\n type: typeof FETCH_COLUMN_MAPPINGS_REQUEST;\n payload: string;\n}\n\ninterface FetchColumnMappingsSuccessAction {\n type: typeof FETCH_COLUMN_MAPPINGS_SUCCESS;\n payload: {\n columnMappings: Array;\n networkId: string;\n };\n}\n\ninterface FetchColumnMappingsErrorAction {\n type: typeof FETCH_COLUMN_MAPPINGS_ERROR;\n}\n\ninterface SubmitNewColumnMappingRequestAction {\n type: typeof SUBMIT_NEW_COLUMN_MAPPING_REQUEST;\n payload: ColumnMappingRequestBody;\n}\n\ninterface SubmitNewColumnMappingSuccessAction {\n type: typeof SUBMIT_NEW_COLUMN_MAPPING_SUCCESS;\n payload: ColumnMapping;\n}\n\ninterface SubmitUpdatedColumnMappingRequestAction {\n type: typeof SUBMIT_UPDATED_COLUMN_MAPPING_REQUEST;\n payload: { activeRevisionId: number; columnMapping: ColumnMappingRequestBody };\n}\n\nexport interface SubmitUpdatedColumnMappingSuccessAction {\n type: typeof SUBMIT_UPDATED_COLUMN_MAPPING_SUCCESS;\n payload: ColumnMapping;\n}\n\ninterface SubmitColumnMappingErrorAction {\n type: typeof SUBMIT_COLUMN_MAPPING_ERROR;\n}\n\ninterface ApplyColumnMappingsRequestAction {\n type: typeof APPLY_COLUMN_MAPPINGS_REQUEST;\n payload: {\n configName: string;\n };\n}\n\ninterface ApplyColumnMappingsSuccessAction {\n type: typeof APPLY_COLUMN_MAPPINGS_SUCCESS;\n payload: Array;\n}\n\ninterface ApplyColumnMappingsErrorAction {\n type: typeof APPLY_COLUMN_MAPPINGS_ERROR;\n}\n\nexport type ColumnMappingsAction =\n | ApplyColumnMappingsSuccessAction\n | ApplyColumnMappingsRequestAction\n | ApplyColumnMappingsErrorAction\n | FetchColumnMappingsSuccessAction\n | FetchColumnMappingsRequestAction\n | FetchColumnMappingsErrorAction\n | SubmitNewColumnMappingRequestAction\n | SubmitNewColumnMappingSuccessAction\n | SubmitUpdatedColumnMappingRequestAction\n | SubmitUpdatedColumnMappingSuccessAction\n | SubmitColumnMappingErrorAction;\n\ntype Thunk = ThunkAction<\n Promise,\n ApplicationState,\n void,\n CallHistoryMethodAction | ColumnMappingsAction\n>;\n\nexport const fetchColumnMappings = (networkId: string): Thunk => async (dispatch, getState) => {\n const currentNetworkId = selectColumnMappingsNetworkId(getState());\n if (networkId !== currentNetworkId) {\n try {\n dispatch({ payload: networkId, type: FETCH_COLUMN_MAPPINGS_REQUEST });\n\n const response = await getColumnMappings({ active: true, networkId });\n dispatch({\n payload: { columnMappings: response.mappings, networkId },\n type: FETCH_COLUMN_MAPPINGS_SUCCESS,\n });\n } catch (error) {\n dispatch({\n message: error instanceof Error ? error.message : \"Error\",\n type: FETCH_COLUMN_MAPPINGS_ERROR,\n });\n }\n }\n};\n\nexport const submitNewColumnMapping = (\n formData: ColumnMappingRequestBody,\n): Thunk => async dispatch => {\n try {\n dispatch({ payload: formData, type: SUBMIT_NEW_COLUMN_MAPPING_REQUEST });\n\n const response = await postNewColumnMapping(formData);\n dispatch({ payload: response, type: SUBMIT_NEW_COLUMN_MAPPING_SUCCESS });\n return response;\n } catch (error) {\n const errorMessage =\n get(error, [\"response\", \"data\", \"message\"]) ||\n get(error, [\"response\", \"data\"], error instanceof Error ? error.message : \"Error\");\n notification.error({ message: `Error creating column mapping: ${errorMessage}` });\n dispatch({\n message: error instanceof Error ? error.message : \"Error\",\n type: SUBMIT_COLUMN_MAPPING_ERROR,\n });\n }\n};\n\nexport const submitUpdatedColumnMapping = (\n activeRevisionId: number,\n columnMapping: ColumnMappingRequestBody,\n): Thunk<[string | null, ColumnMapping | null]> => async dispatch => {\n try {\n dispatch({\n payload: { activeRevisionId, columnMapping },\n type: SUBMIT_UPDATED_COLUMN_MAPPING_REQUEST,\n });\n\n const response = await postUpdatedColumnMapping(activeRevisionId, columnMapping);\n dispatch({ payload: response, type: SUBMIT_UPDATED_COLUMN_MAPPING_SUCCESS });\n\n return [null, response];\n } catch (error) {\n const errorMessage =\n get(error, [\"response\", \"data\", \"message\"]) ||\n get(error, [\"response\", \"data\"], error instanceof Error ? error.message : \"Error\");\n dispatch({ message: errorMessage, type: SUBMIT_COLUMN_MAPPING_ERROR });\n return [errorMessage, null];\n }\n};\n\nexport const prepareColumnMappingExamples = (configName: string): Thunk => async (\n dispatch,\n getState,\n) => {\n const state = getState();\n const currentConfigName = selectApplyColumnMappingConfigName(state);\n if (configName === currentConfigName) {\n return;\n }\n\n dispatch({ payload: { configName }, type: APPLY_COLUMN_MAPPINGS_REQUEST });\n\n try {\n const configs = selectConfigItems(state);\n const editConfig = selectEditItemConfig(state);\n const config = configs[configName];\n if (!config) {\n throw new Error(`Cannot find config with name [${configName}]`);\n }\n const connectorName = editConfig?.connectorName || config.connectorName;\n if (!connectorName) {\n throw new Error(\"Selected configuration has not connector attached to it.\");\n }\n const connectors = selectConnectorsItems(state);\n const connector = connectors[connectorName];\n if (!connector) {\n throw new Error(`Cannot find connector with name [${connectorName}]`);\n }\n await dispatch(fetchImportUsers(connector));\n const importUsers = selectImportUsersItems(getState());\n\n dispatch({ payload: [...importUsers.slice(0, 100)], type: APPLY_COLUMN_MAPPINGS_SUCCESS });\n } catch {\n dispatch({ type: APPLY_COLUMN_MAPPINGS_ERROR });\n }\n};\n","import { ThunkAction } from \"redux-thunk\";\nimport { UserSyncUser } from \"@speakap/types\";\nimport { notification } from \"antd\";\n\nimport { ApplicationState } from \"../reducer\";\nimport {\n getUserSyncUser,\n logoutUserSyncUser,\n getAuthenticationUrl,\n loginSpeakapUser,\n} from \"../api\";\n\nexport const FETCH_USERSYNC_USER_REQUEST = \"FETCH_USERSYNC_USER_REQUEST\";\nexport const FETCH_USERSYNC_USER_SUCCESS = \"FETCH_USERSYNC_USER_SUCCESS\";\nexport const FETCH_USERSYNC_USER_ERROR = \"FETCH_USERSYNC_USER_ERROR\";\n\nexport const FETCH_GOOGLE_URL_REQUEST = \"FETCH_GOOGLE_URL_REQUEST\";\nexport const FETCH_GOOGLE_URL_SUCCESS = \"FETCH_GOOGLE_URL_SUCCESS\";\nexport const FETCH_GOOGLE_URL_ERROR = \"FETCH_GOOGLE_URL_ERROR\";\n\nexport const LOGIN_SPEAKAP_USER_REQUEST = \"LOGIN_SPEAKAP_USER_REQUEST\";\nexport const LOGIN_SPEAKAP_USER_SUCCESS = \"LOGIN_SPEAKAP_USER_SUCCESS\";\nexport const LOGIN_SPEAKAP_USER_ERROR = \"LOGIN_SPEAKAP_USER_ERROR\";\n\nexport const LOGOUT_USERSYNC_USER_REQUEST = \"LOGOUT_USERSYNC_USER_REQUEST\";\nexport const LOGOUT_USERSYNC_USER_SUCCESS = \"LOGOUT_USERSYNC_USER_SUCCESS\";\nexport const LOGOUT_USERSYNC_USER_ERROR = \"LOGOUT_USERSYNC_USER_ERROR\";\n\ninterface FetchUserSyncUserRequestAction {\n type: typeof FETCH_USERSYNC_USER_REQUEST;\n}\n\ninterface FetchUserSyncUserSuccessAction {\n type: typeof FETCH_USERSYNC_USER_SUCCESS;\n payload: UserSyncUser;\n}\n\ninterface FetchUserSyncUserErrorAction {\n type: typeof FETCH_USERSYNC_USER_ERROR;\n}\n\ninterface FetchGoogleUrlRequestAction {\n type: typeof FETCH_GOOGLE_URL_REQUEST;\n}\n\ninterface FetchGoogleUrlSuccessAction {\n type: typeof FETCH_GOOGLE_URL_SUCCESS;\n}\n\ninterface FetchGoogleUrlErrorAction {\n type: typeof FETCH_GOOGLE_URL_ERROR;\n}\n\ninterface LoginSpeakapUserRequestAction {\n type: typeof LOGIN_SPEAKAP_USER_REQUEST;\n}\n\ninterface LoginSpeakapUserSuccessAction {\n type: typeof LOGIN_SPEAKAP_USER_SUCCESS;\n}\n\ninterface LoginSpeakapUserErrorAction {\n type: typeof LOGIN_SPEAKAP_USER_ERROR;\n}\n\ninterface LogoutUserSyncUserRequestAction {\n type: typeof LOGOUT_USERSYNC_USER_REQUEST;\n}\n\ninterface LogoutUserSyncUserSuccessAction {\n type: typeof LOGOUT_USERSYNC_USER_SUCCESS;\n}\n\ninterface LogoutUserSyncUserErrorAction {\n type: typeof LOGOUT_USERSYNC_USER_ERROR;\n}\n\nexport type AuthActions =\n | FetchUserSyncUserRequestAction\n | FetchUserSyncUserSuccessAction\n | FetchUserSyncUserErrorAction\n | FetchGoogleUrlRequestAction\n | FetchGoogleUrlSuccessAction\n | FetchGoogleUrlErrorAction\n | LoginSpeakapUserRequestAction\n | LoginSpeakapUserSuccessAction\n | LoginSpeakapUserErrorAction\n | LogoutUserSyncUserRequestAction\n | LogoutUserSyncUserSuccessAction\n | LogoutUserSyncUserErrorAction;\n\ntype Thunk = ThunkAction, ApplicationState, void, AuthActions>;\n\nexport const fetchUserSyncUser = (): Thunk => async dispatch => {\n try {\n dispatch({ type: FETCH_USERSYNC_USER_REQUEST });\n\n const response = await getUserSyncUser();\n dispatch({ payload: response, type: FETCH_USERSYNC_USER_SUCCESS });\n } catch (error) {\n dispatch({ type: FETCH_USERSYNC_USER_ERROR });\n }\n};\n\nexport const logoutUser = (): Thunk => async dispatch => {\n try {\n dispatch({ type: LOGOUT_USERSYNC_USER_REQUEST });\n\n await logoutUserSyncUser();\n dispatch({ type: LOGOUT_USERSYNC_USER_SUCCESS });\n } catch (error) {\n dispatch({ type: LOGOUT_USERSYNC_USER_ERROR });\n }\n};\n\nexport const redirectToGoogle = (): Thunk => async dispatch => {\n try {\n dispatch({ type: FETCH_GOOGLE_URL_REQUEST });\n\n const url = await getAuthenticationUrl(`${location.origin}${location.pathname}`);\n window.location.href = url;\n dispatch({ type: FETCH_GOOGLE_URL_SUCCESS });\n } catch (error) {\n notification.error({\n message: \"Could not redirect to Google. Please try again later.\",\n });\n dispatch({ type: FETCH_GOOGLE_URL_ERROR });\n }\n};\n\nexport const loginUser = (username: string, password: string): Thunk => async dispatch => {\n try {\n dispatch({ type: LOGIN_SPEAKAP_USER_REQUEST });\n\n const accessToken = await loginSpeakapUser(username, password);\n const url = new URL(location.href);\n url.searchParams.append(\"access_token\", accessToken);\n window.location.href = url.toString();\n dispatch({ type: LOGIN_SPEAKAP_USER_SUCCESS });\n } catch (error) {\n notification.error({\n message: \"Could not login\",\n });\n dispatch({ type: LOGIN_SPEAKAP_USER_ERROR });\n }\n};\n","import { Config } from \"@speakap/types\";\nimport { ThunkAction } from \"redux-thunk\";\nimport { get } from \"lodash\";\n\nimport { ApplicationState } from \"../reducer\";\nimport { deleteResourceByName, DeleteResourceType } from \"../api\";\n\nexport const DELETE_RESOURCE_REQUEST = \"user-sync/resources/DELETE_RESOURCE_REQUEST\";\nexport const DELETE_RESOURCE_SUCCESS = \"user-sync/resources/DELETE_RESOURCE_SUCCESS\";\nexport const DELETE_RESOURCE_ERROR = \"user-sync/resources/DELETE_RESOURCE_ERROR\";\n\ninterface DeleteConnectorRequestAction {\n type: typeof DELETE_RESOURCE_REQUEST;\n payload: {\n resourceName: string;\n networkId: string;\n resourceType: DeleteResourceType;\n };\n}\n\ninterface DeleteConnectorSuccessAction {\n type: typeof DELETE_RESOURCE_SUCCESS;\n payload: {\n resourceName: string;\n networkId: string;\n resourceType: DeleteResourceType;\n };\n}\n\ninterface DeleteConnectorErrorAction {\n type: typeof DELETE_RESOURCE_ERROR;\n payload: Array;\n}\n\nexport type DeleteResourcesAction =\n | DeleteConnectorRequestAction\n | DeleteConnectorSuccessAction\n | DeleteConnectorErrorAction;\n\ntype Thunk = ThunkAction, ApplicationState, void, DeleteResourcesAction>;\n\nexport const deleteResource = (\n networkId: string,\n resourceType: DeleteResourceType,\n resourceName: string,\n): Thunk => async dispatch => {\n try {\n const payload = { networkId, resourceName, resourceType };\n dispatch({\n payload,\n type: DELETE_RESOURCE_REQUEST,\n });\n\n await deleteResourceByName(networkId, resourceType, resourceName);\n dispatch({\n payload,\n type: DELETE_RESOURCE_SUCCESS,\n });\n return true;\n } catch (error) {\n dispatch({\n payload: get(error, [\"response\", \"data\", \"configs\"]) as Array,\n type: DELETE_RESOURCE_ERROR,\n });\n return false;\n }\n};\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"bottom\":\"column-mappings-form_bottom__3foei\",\"top\":\"column-mappings-form_top__w-R2q\",\"inputLabel\":\"column-mappings-form_inputLabel__wrDEw\",\"arrayLabel\":\"column-mappings-form_arrayLabel__fQwat\",\"arrayWrapper\":\"column-mappings-form_arrayWrapper__gkeh6\",\"selectedColumn\":\"column-mappings-form_selectedColumn__1pJVD\",\"applyColumnMappingWarning\":\"column-mappings-form_applyColumnMappingWarning__3yu7I\",\"applyColumnMappingError\":\"column-mappings-form_applyColumnMappingError__1W-rq\",\"applyColumnMapping\":\"column-mappings-form_applyColumnMapping__1i24o\"};","import { createSelector } from \"reselect\";\n\nimport { ApplicationState } from \"../reducer\";\nimport { ConnectorsState } from \"./reducer\";\n\nconst selectConnectors = (state: ApplicationState): ConnectorsState => state.connectors;\n\nexport const selectConnectorsItems = createSelector(selectConnectors, ({ items }) => items);\n\nconst selectConnectorsResults = createSelector(selectConnectors, ({ results }) => results);\n\nexport const selectConnectorsList = createSelector(\n [selectConnectorsItems, selectConnectorsResults],\n (items, results) => results.map(id => items[id]),\n);\n\nexport const selectConnectorsLoadingState = createSelector(\n selectConnectors,\n ({ loadingState }) => loadingState,\n);\n\nconst selectEdit = createSelector(selectConnectors, ({ edit }) => edit);\n\nexport const selectEditLoadingState = createSelector(\n selectEdit,\n ({ loadingState }) => loadingState,\n);\n\nconst selectImportUsers = createSelector(selectConnectors, ({ importUsers }) => importUsers);\n\nexport const selectImportUsersLoadingState = createSelector(\n selectImportUsers,\n ({ loadingState }) => loadingState,\n);\n\nexport const selectImportUsersItems = createSelector(selectImportUsers, ({ items }) => items);\n\nexport const selectImportUsersConnectorId = createSelector(\n selectImportUsers,\n ({ connectorId }) => connectorId,\n);\n\nexport const selectConnectorsNetworkId = createSelector(\n selectConnectors,\n ({ networkId }) => networkId,\n);\n\nconst selectConnectorStats = createSelector(selectConnectors, ({ stats }) => stats);\n\nexport const selectConnectorStatsLoadingState = createSelector(\n selectConnectorStats,\n ({ loadingState }) => loadingState,\n);\n\nexport const selectConnectorStatsValue = createSelector(selectConnectorStats, ({ value }) => value);\n","import { Dispatch } from \"redux\";\nimport { Network } from \"@speakap/types\";\nimport { ThunkAction } from \"redux-thunk\";\n\nimport { ApplicationState } from \"../reducer\";\nimport { getNetworks, getNetworkRoles } from \"../api\";\n\nexport const FETCH_NETWORKS_REQUEST = \"FETCH_NETWORKS_REQUEST\";\nexport const FETCH_NETWORKS_SUCCESS = \"FETCH_NETWORKS_SUCCESS\";\nexport const FETCH_NETWORKS_ERROR = \"FETCH_NETWORKS_ERROR\";\nexport const SET_ACTIVE_NETWORK = \"SET_ACTIVE_NETWORK\";\n\nexport const FETCH_NETWORK_ROLES_REQUEST = \"FETCH_NETWORK_ROLES_REQUEST\";\nexport const FETCH_NETWORK_ROLES_SUCCESS = \"FETCH_NETWORK_ROLES_SUCCESS\";\nexport const FETCH_NETWORK_ROLES_ERROR = \"FETCH_NETWORK_ROLES_ERROR\";\n\nexport const FETCH_NETWORKS_PARTIAL_REQUEST = \"FETCH_NETWORKS_PARTIAL_REQUEST\";\nexport const FETCH_NETWORKS_PARTIAL_SUCCESS = \"FETCH_NETWORKS_PARTIAL_SUCCESS\";\nexport const FETCH_NETWORKS_PARTIAL_ERROR = \"FETCH_NETWORKS_PARTIAL_ERROR\";\n\ninterface FetchNetworksPartialRequestAction {\n type: typeof FETCH_NETWORKS_PARTIAL_REQUEST;\n}\n\ninterface FetchNetworksPartialSuccessAction {\n type: typeof FETCH_NETWORKS_PARTIAL_SUCCESS;\n payload: Array;\n limit: number;\n offset: number;\n totalItems: number;\n}\n\ninterface FetchNetworksPartialErrorAction {\n type: typeof FETCH_NETWORKS_PARTIAL_ERROR;\n}\n\ninterface FetchNetworksRequestAction {\n type: typeof FETCH_NETWORKS_REQUEST;\n}\n\ninterface FetchNetworksSuccessAction {\n type: typeof FETCH_NETWORKS_SUCCESS;\n payload: Array;\n limit: number;\n offset: number;\n totalItems: number;\n}\n\ninterface FetchNetworksErrorAction {\n type: typeof FETCH_NETWORKS_ERROR;\n}\n\ninterface SetActiveNetworkAction {\n payload: { networkId: string; networkName: string; networkSubdomain: string };\n type: typeof SET_ACTIVE_NETWORK;\n}\ninterface FetchNetworkRolesRequestAction {\n type: typeof FETCH_NETWORK_ROLES_REQUEST;\n}\n\ninterface FetchNetworkRolesSuccessAction {\n type: typeof FETCH_NETWORK_ROLES_SUCCESS;\n payload: Array<{ id: string; name: string }>;\n}\n\ninterface FetchNetworkRolesErrorAction {\n type: typeof FETCH_NETWORK_ROLES_ERROR;\n}\n\nexport type NetworksActions =\n | FetchNetworksSuccessAction\n | FetchNetworksRequestAction\n | FetchNetworksErrorAction\n | SetActiveNetworkAction\n | FetchNetworkRolesSuccessAction\n | FetchNetworkRolesRequestAction\n | FetchNetworkRolesErrorAction\n | FetchNetworksPartialRequestAction\n | FetchNetworksPartialSuccessAction\n | FetchNetworksPartialErrorAction;\n\ntype Thunk = ThunkAction;\n\nconst BATCH_SIZE = 50;\n\nexport const fetchNetworks = (): ThunkAction<\n Promise,\n ApplicationState,\n void,\n NetworksActions\n> => async (dispatch: Dispatch) => {\n dispatch({ type: FETCH_NETWORKS_REQUEST });\n\n try {\n let allNetworks: Array = [];\n let offset = 0;\n let hasMoreNetworks = true;\n\n while (hasMoreNetworks) {\n const response = await getNetworks(BATCH_SIZE, offset);\n const newNetworks = response.networks;\n\n allNetworks = [...allNetworks, ...newNetworks];\n offset += BATCH_SIZE;\n\n dispatch({\n limit: BATCH_SIZE,\n offset,\n payload: allNetworks,\n type: FETCH_NETWORKS_PARTIAL_SUCCESS,\n });\n\n if (newNetworks.length < BATCH_SIZE) {\n hasMoreNetworks = false;\n }\n }\n\n dispatch({\n limit: BATCH_SIZE,\n offset,\n payload: allNetworks,\n type: FETCH_NETWORKS_SUCCESS,\n });\n } catch (error) {\n dispatch({\n message: error instanceof Error ? error.message : \"Error\",\n type: FETCH_NETWORKS_ERROR,\n });\n }\n};\n\nexport const fetchNetworkRoles = (networkId: string): Thunk> => async dispatch => {\n try {\n dispatch({ type: FETCH_NETWORK_ROLES_REQUEST });\n\n const response = await getNetworkRoles(networkId);\n dispatch({ payload: response, type: FETCH_NETWORK_ROLES_SUCCESS });\n } catch (error) {\n dispatch({\n message: error instanceof Error ? error.message : \"Error\",\n type: FETCH_NETWORK_ROLES_ERROR,\n });\n }\n};\n\nexport const setActiveNetwork = (\n networkId: string,\n networkName: string,\n networkSubdomain: string,\n): SetActiveNetworkAction => ({\n payload: { networkId, networkName, networkSubdomain },\n type: SET_ACTIVE_NETWORK,\n});\n","import { createSelector } from \"reselect\";\n\nimport { ApplicationState } from \"../reducer\";\nimport { ConfigsState } from \"./reducer\";\nimport { LOADING_STATES } from \"../../types\";\nimport { selectConnectorsItems } from \"../connectors/selectors\";\n\nconst selectConfigsState = (state: ApplicationState): ConfigsState => state.configs;\n\nexport const selectConfigItems = createSelector(selectConfigsState, ({ items }) => items);\n\nconst selectConfigResults = createSelector(selectConfigsState, ({ results }) => results);\n\nexport const selectConfig = createSelector(\n selectConfigsState,\n (state: ApplicationState, configName: string) => configName,\n ({ items }, configName) => Object.values(items).find(config => config.name === configName),\n);\n\nexport const selectConfigsList = createSelector(\n [selectConfigItems, selectConfigResults],\n (items, results) => results.map(id => items[id]),\n);\n\nexport const selectConfigsLoadingState = createSelector(\n selectConfigsState,\n ({ loadingState }) => loadingState,\n);\n\nexport const selectEditItem = createSelector(selectConfigsState, ({ editItem }) => editItem);\nexport const selectEditItemLoadingState = createSelector(selectEditItem, editItem => {\n if (editItem) {\n return editItem.loadingState;\n }\n});\nexport const selectEditItemConfig = createSelector(selectEditItem, editItem => {\n if (editItem) {\n return editItem.config;\n }\n});\nexport const selectScheduleLoadingState = createSelector(selectEditItem, editItem => {\n if (editItem) {\n return editItem.scheduleLoadingState;\n }\n});\nexport const selectConnectorName = createSelector(selectEditItem, editItem => {\n if (editItem) {\n return editItem.config.connectorName;\n }\n});\nexport const selectColumnMappingName = createSelector(selectEditItem, editItem => {\n if (editItem) {\n return editItem.config.columnMappingName;\n }\n});\nexport const selectGroupMappingName = createSelector(selectEditItem, editItem => {\n if (editItem) {\n return editItem.config.groupMappingName;\n }\n});\nexport const selectRoleMappingName = createSelector(selectEditItem, editItem => {\n if (editItem) {\n return editItem.config.roleMappingName;\n }\n});\n\nexport const selectIsCreatingConfig = createSelector(\n selectConfigsState,\n ({ newItem }) => !!newItem,\n);\n\nexport const selectIsSubmittingNewConfig = createSelector(selectConfigsState, ({ newItem }) =>\n newItem ? newItem.loadingState === LOADING_STATES.FETCHING : false,\n);\n\nexport const selectConfigName = createSelector(\n selectConfigsState,\n ({ selectedConfig }) => selectedConfig,\n);\n\nexport const selectScheduledStatus = createSelector(\n [selectConfig, selectConnectorsItems],\n (config, connectors) => {\n if (config) {\n if (config.job) {\n return config.job.active ? \"yes\" : \"paused\";\n }\n\n if (config.connectorName) {\n const connector = connectors[config.connectorName];\n if (connector?.type === \"sftp_upload\") {\n return connector.syncOnUpload;\n }\n }\n }\n\n return \"no\";\n },\n);\n\nexport const selectSyncUsersLoadingState = createSelector(\n selectConfigsState,\n state => state.syncUsers.loadingState,\n);\n","import { ThunkAction } from \"redux-thunk\";\nimport { UserSyncUser, SpeakapUserPostPayload } from \"@speakap/types\";\nimport { get, sortBy } from \"lodash\";\nimport { notification } from \"antd\";\n\nimport { ApplicationState } from \"../reducer\";\nimport { createSpeakapUser, getSpeakapUsers, deleteSpeakapUser, updateSpeakapUser } from \"../api\";\n\nexport const FETCH_SPEAKAP_USERS_REQUEST = \"FETCH_SPEAKAP_USERS_REQUEST\";\nexport const FETCH_SPEAKAP_USERS_SUCCESS = \"FETCH_SPEAKAP_USERS_SUCCESS\";\nexport const FETCH_SPEAKAP_USERS_ERROR = \"FETCH_SPEAKAP_USERS_ERROR\";\n\nexport const SUBMIT_SPEAKAP_USER_REQUEST = \"SUBMIT_SPEAKAP_USER_REQUEST\";\nexport const SUBMIT_SPEAKAP_USER_SUCCESS = \"SUBMIT_SPEAKAP_USER_SUCCESS\";\nexport const SUBMIT_SPEAKAP_USER_ERROR = \"SUBMIT_SPEAKAP_USER_ERROR\";\n\nexport const UPDATE_SPEAKAP_USER_REQUEST = \"UPDATE_SPEAKAP_USER_REQUEST\";\nexport const UPDATE_SPEAKAP_USER_SUCCESS = \"UPDATE_SPEAKAP_USER_SUCCESS\";\nexport const UPDATE_SPEAKAP_USER_ERROR = \"UPDATE_SPEAKAP_USER_ERROR\";\n\nexport const DELETE_SPEAKAP_USER_REQUEST = \"DELETE_SPEAKAP_USER_REQUEST\";\nexport const DELETE_SPEAKAP_USER_SUCCESS = \"DELETE_SPEAKAP_USER_SUCCESS\";\nexport const DELETE_SPEAKAP_USER_ERROR = \"DELETE_SPEAKAP_USER_ERROR\";\n\nexport const SET_EDIT_SPEAKAP_USER = \"SET_EDIT_SPEAKAP_USER\";\n\ninterface FetchSpeakapUsersRequestAction {\n type: typeof FETCH_SPEAKAP_USERS_REQUEST;\n}\n\ninterface FetchSpeakapUsersSuccessAction {\n type: typeof FETCH_SPEAKAP_USERS_SUCCESS;\n payload: Array;\n}\n\ninterface FetchSpeakapUsersErrorAction {\n type: typeof FETCH_SPEAKAP_USERS_ERROR;\n}\n\ninterface SubmitSpeakapUserRequestAction {\n type: typeof SUBMIT_SPEAKAP_USER_REQUEST;\n}\n\ninterface SubmitSpeakapUserSuccessAction {\n type: typeof SUBMIT_SPEAKAP_USER_SUCCESS;\n payload: UserSyncUser;\n}\n\ninterface SubmitSpeakapUserErrorAction {\n type: typeof SUBMIT_SPEAKAP_USER_ERROR;\n}\n\ninterface UpdateSpeakapUserRequestAction {\n type: typeof UPDATE_SPEAKAP_USER_REQUEST;\n}\n\ninterface UpdateSpeakapUserSuccessAction {\n type: typeof UPDATE_SPEAKAP_USER_SUCCESS;\n payload: UserSyncUser;\n}\n\ninterface UpdateSpeakapUserErrorAction {\n type: typeof UPDATE_SPEAKAP_USER_ERROR;\n}\n\ninterface DeleteSpeakapUserRequestAction {\n type: typeof DELETE_SPEAKAP_USER_REQUEST;\n}\n\ninterface DeleteSpeakapUserSuccessAction {\n type: typeof DELETE_SPEAKAP_USER_SUCCESS;\n payload: number;\n}\n\ninterface DeleteSpeakapUserErrorAction {\n type: typeof DELETE_SPEAKAP_USER_ERROR;\n}\n\ninterface SetEditSpeakapUserAction {\n type: typeof SET_EDIT_SPEAKAP_USER;\n payload: {\n user?: UserSyncUser;\n mode: \"new\" | \"edit\" | \"closed\";\n };\n}\n\nexport type AccessManagementActions =\n | FetchSpeakapUsersRequestAction\n | FetchSpeakapUsersSuccessAction\n | FetchSpeakapUsersErrorAction\n | SubmitSpeakapUserRequestAction\n | SubmitSpeakapUserSuccessAction\n | SubmitSpeakapUserErrorAction\n | UpdateSpeakapUserErrorAction\n | UpdateSpeakapUserRequestAction\n | UpdateSpeakapUserSuccessAction\n | DeleteSpeakapUserErrorAction\n | DeleteSpeakapUserRequestAction\n | DeleteSpeakapUserSuccessAction\n | SetEditSpeakapUserAction;\n\ntype Thunk = ThunkAction;\n\nexport const setEditSpeakapUser = ({\n user,\n mode,\n}: {\n user?: UserSyncUser;\n mode: \"new\" | \"edit\" | \"closed\";\n}): SetEditSpeakapUserAction => ({\n payload: {\n mode,\n user,\n },\n type: SET_EDIT_SPEAKAP_USER,\n});\n\nexport const fetchSpeakapUsers = (networkId: string): Thunk> => async dispatch => {\n try {\n dispatch({ type: FETCH_SPEAKAP_USERS_REQUEST });\n\n const response = await getSpeakapUsers(networkId);\n dispatch({ payload: sortBy(response, \"name\"), type: FETCH_SPEAKAP_USERS_SUCCESS });\n } catch (error) {\n dispatch({\n message: error instanceof Error ? error.message : \"Error\",\n type: FETCH_SPEAKAP_USERS_ERROR,\n });\n }\n};\n\nexport const submitSpeakapUser = (\n user: SpeakapUserPostPayload,\n): Thunk> => async dispatch => {\n try {\n dispatch({ type: SUBMIT_SPEAKAP_USER_REQUEST });\n\n const response = await createSpeakapUser(user);\n dispatch({ payload: response, type: SUBMIT_SPEAKAP_USER_SUCCESS });\n notification.success({ message: \"User successfully created!\" });\n } catch (error) {\n dispatch({ type: SUBMIT_SPEAKAP_USER_ERROR });\n\n notification.error({\n message: `Error creating user: ${get(\n error,\n [\"response\", \"data\"],\n error instanceof Error ? error.message : \"Error\",\n )}`,\n });\n }\n};\n\nexport const postUpdateSpeakapUser = (\n user: UserSyncUser,\n): Thunk> => async dispatch => {\n try {\n dispatch({ type: UPDATE_SPEAKAP_USER_REQUEST });\n\n const response = await updateSpeakapUser(user);\n dispatch({ payload: response, type: UPDATE_SPEAKAP_USER_SUCCESS });\n notification.success({ message: \"User successfully updated\" });\n } catch (error) {\n dispatch({ type: UPDATE_SPEAKAP_USER_ERROR });\n notification.error({\n message: `Error updating user: ${get(\n error,\n [\"response\", \"data\"],\n error instanceof Error ? error.message : \"Error\",\n )}`,\n });\n }\n};\n\nexport const postDeleteSpeakapUser = (\n userId: number,\n networkId: string,\n): Thunk> => async dispatch => {\n try {\n dispatch({ type: DELETE_SPEAKAP_USER_REQUEST });\n\n await deleteSpeakapUser(userId, networkId);\n dispatch({ payload: userId, type: DELETE_SPEAKAP_USER_SUCCESS });\n notification.success({ message: \"User successfully deleted\" });\n } catch (error) {\n dispatch({ type: DELETE_SPEAKAP_USER_ERROR });\n notification.error({\n message: `Error delete user: ${get(\n error,\n [\"response\", \"data\"],\n error instanceof Error ? error.message : \"Error\",\n )}`,\n });\n }\n};\n","import { ConnectorRun, ImportUser } from \"@speakap/types\";\nimport { ThunkAction } from \"redux-thunk\";\nimport { get } from \"lodash\";\n\nimport { ApplicationState } from \"../reducer\";\nimport { postRuns, PostRunsParams } from \"../api\";\n\nexport const SUBMIT_RUNS_REQUEST = \"SUBMIT_RUNS_REQUEST\";\nexport const SUBMIT_RUNS_SUCCESS = \"SUBMIT_RUNS_SUCCESS\";\nexport const SUBMIT_RUNS_ERROR = \"SUBMIT_RUNS_ERROR\";\n\ninterface SubmitRunsRequestAction {\n type: typeof SUBMIT_RUNS_REQUEST;\n}\n\nexport interface SubmitRunsSuccessAction {\n type: typeof SUBMIT_RUNS_SUCCESS;\n payload: ConnectorRun;\n}\n\ninterface SubmitRunsErrorAction {\n type: typeof SUBMIT_RUNS_ERROR;\n payload: {\n connectorName?: string;\n data?: string;\n message: string;\n serviceName?: string;\n };\n}\n\nexport type RunsActions = SubmitRunsRequestAction | SubmitRunsSuccessAction | SubmitRunsErrorAction;\n\nexport function submitRuns(\n payload: PostRunsParams,\n): ThunkAction<\n Promise<[null | string, null | Array]>,\n ApplicationState,\n void,\n RunsActions\n> {\n return async dispatch => {\n try {\n dispatch({ type: SUBMIT_RUNS_REQUEST });\n\n const response = await postRuns(payload);\n dispatch({ payload: response, type: SUBMIT_RUNS_SUCCESS });\n return [null, response.importUsers];\n } catch (error) {\n const errorMessage =\n get(error, [\"response\", \"data\", \"message\"]) ||\n get(error, [\"response\", \"data\"], error instanceof Error ? error.message : \"Error\");\n dispatch({ payload: errorMessage, type: SUBMIT_RUNS_ERROR });\n return [errorMessage, null];\n }\n };\n}\n","import { RoleMappingRequestBody, RoleMapping } from \"@speakap/types\";\nimport { ThunkAction } from \"redux-thunk\";\nimport { get } from \"lodash\";\nimport { goBack, CallHistoryMethodAction } from \"connected-react-router\";\nimport { notification } from \"antd\";\n\nimport { ApplicationState } from \"../reducer\";\nimport { getRoleMappings, postNewRoleMapping, postUpdatedRoleMapping } from \"../api\";\nimport { selectRoleMappingsNetworkId } from \"./selectors\";\n\nexport const FETCH_ROLE_MAPPINGS_REQUEST = \"user-sync/role-mappings/FETCH_ROLE_MAPPINGS_REQUEST\";\nexport const FETCH_ROLE_MAPPINGS_SUCCESS = \"user-sync/role-mappings/FETCH_ROLE_MAPPINGS_SUCCESS\";\nexport const FETCH_ROLE_MAPPINGS_ERROR = \"user-sync/role-mappings/FETCH_ROLE_MAPPINGS_ERROR\";\n\nexport const SUBMIT_NEW_ROLE_MAPPING_REQUEST =\n \"user-sync/role-mappings/SUBMIT_NEW_ROLE_MAPPING_REQUEST\";\nexport const SUBMIT_NEW_ROLE_MAPPING_SUCCESS =\n \"user-sync/role-mappings/SUBMIT_NEW_ROLE_MAPPING_SUCCESS\";\nexport const SUBMIT_UPDATED_ROLE_MAPPING_REQUEST =\n \"user-sync/role-mappings/SUBMIT_UPDATED_ROLE_MAPPING_REQUEST\";\nexport const SUBMIT_UPDATED_ROLE_MAPPING_SUCCESS =\n \"user-sync/role-mappings/SUBMIT_UPDATED_ROLE_MAPPING_SUCCESS\";\nexport const SUBMIT_ROLE_MAPPING_ERROR = \"user-sync/role-mappings/SUBMIT_ROLE_MAPPING_ERROR\";\n\ninterface FetchRoleMappingsRequestAction {\n type: typeof FETCH_ROLE_MAPPINGS_REQUEST;\n payload: string;\n}\n\ninterface FetchRoleMappingsSuccessAction {\n type: typeof FETCH_ROLE_MAPPINGS_SUCCESS;\n payload: {\n roleMappings: Array;\n networkId: string;\n };\n}\n\ninterface FetchRoleMappingsErrorAction {\n type: typeof FETCH_ROLE_MAPPINGS_ERROR;\n}\n\ninterface SubmitNewRoleMappingRequestAction {\n type: typeof SUBMIT_NEW_ROLE_MAPPING_REQUEST;\n payload: RoleMappingRequestBody;\n}\n\ninterface SubmitNewRoleMappingSuccessAction {\n type: typeof SUBMIT_NEW_ROLE_MAPPING_SUCCESS;\n payload: RoleMapping;\n}\n\ninterface SubmitUpdatedRoleMappingRequestAction {\n type: typeof SUBMIT_UPDATED_ROLE_MAPPING_REQUEST;\n payload: { activeRevisionId: number; roleMapping: RoleMapping };\n}\n\nexport interface SubmitUpdatedRoleMappingSuccessAction {\n type: typeof SUBMIT_UPDATED_ROLE_MAPPING_SUCCESS;\n payload: RoleMapping;\n}\n\ninterface SubmitRoleMappingErrorAction {\n type: typeof SUBMIT_ROLE_MAPPING_ERROR;\n}\n\nexport type RoleMappingsAction =\n | FetchRoleMappingsSuccessAction\n | FetchRoleMappingsRequestAction\n | FetchRoleMappingsErrorAction\n | SubmitNewRoleMappingRequestAction\n | SubmitNewRoleMappingSuccessAction\n | SubmitUpdatedRoleMappingRequestAction\n | SubmitUpdatedRoleMappingSuccessAction\n | SubmitRoleMappingErrorAction;\n\ntype Thunk = ThunkAction<\n Promise,\n ApplicationState,\n void,\n CallHistoryMethodAction | RoleMappingsAction\n>;\n\nexport const fetchRoleMappings = (networkId: string): Thunk => async (dispatch, getState) => {\n const currentNetworkId = selectRoleMappingsNetworkId(getState());\n if (networkId !== currentNetworkId) {\n try {\n dispatch({ payload: networkId, type: FETCH_ROLE_MAPPINGS_REQUEST });\n\n const response = await getRoleMappings({ networkId });\n dispatch({\n payload: { networkId, roleMappings: response.mappings },\n type: FETCH_ROLE_MAPPINGS_SUCCESS,\n });\n } catch (error) {\n dispatch({\n message: error instanceof Error ? error.message : \"Error\",\n type: FETCH_ROLE_MAPPINGS_ERROR,\n });\n }\n }\n};\n\nexport const submitNewRoleMapping = (\n roleMapping: RoleMappingRequestBody,\n): Thunk => async dispatch => {\n try {\n dispatch({ payload: roleMapping, type: SUBMIT_NEW_ROLE_MAPPING_REQUEST });\n\n const response = await postNewRoleMapping(roleMapping);\n dispatch({ payload: response, type: SUBMIT_NEW_ROLE_MAPPING_SUCCESS });\n return response;\n } catch (error) {\n const errorMessage =\n get(error, [\"response\", \"data\", \"message\"]) ||\n get(error, [\"response\", \"data\"], error instanceof Error ? error.message : \"Error\");\n notification.error({ message: `Error creating role mapping: ${errorMessage}` });\n dispatch({\n message: error instanceof Error ? error.message : \"Error\",\n type: SUBMIT_ROLE_MAPPING_ERROR,\n });\n }\n};\n\nexport const submitUpdatedRoleMapping = (\n activeRevisionId: number,\n roleMapping: RoleMapping,\n): Thunk => async dispatch => {\n try {\n dispatch({\n payload: { activeRevisionId, roleMapping },\n type: SUBMIT_UPDATED_ROLE_MAPPING_REQUEST,\n });\n\n const response = await postUpdatedRoleMapping(activeRevisionId, roleMapping);\n dispatch({ payload: response, type: SUBMIT_UPDATED_ROLE_MAPPING_SUCCESS });\n\n notification.success({ message: \"Successfully updated\" });\n dispatch(goBack());\n } catch (error) {\n notification.error({\n message: get(\n error,\n [\"response\", \"data\"],\n error instanceof Error ? error.message : \"Error\",\n ),\n });\n dispatch({\n message: error instanceof Error ? error.message : \"Error\",\n type: SUBMIT_ROLE_MAPPING_ERROR,\n });\n }\n};\n"],"sourceRoot":""}