'use strict'; import React from 'react'; import WebhookStore from '../../stores/webhook_store'; import WebhookActions from '../../actions/webhook_actions'; import GlobalNotificationModel from '../../models/global_notification_model'; import GlobalNotificationActions from '../../actions/global_notification_actions'; import Form from '../ascribe_forms/form'; import Property from '../ascribe_forms/property'; import AclProxy from '../acl_proxy'; import ActionPanel from '../ascribe_panel/action_panel'; import CollapsibleParagraph from '../ascribe_collapsible/collapsible_paragraph'; import ApiUrls from '../../constants/api_urls'; import AscribeSpinner from '../ascribe_spinner'; import { getLangText } from '../../utils/lang_utils'; let WebhookSettings = React.createClass({ propTypes: { defaultExpanded: React.PropTypes.bool }, getInitialState() { return WebhookStore.getState(); }, componentDidMount() { WebhookStore.listen(this.onChange); WebhookActions.fetchWebhooks(); WebhookActions.fetchWebhookEvents(); }, componentWillUnmount() { WebhookStore.unlisten(this.onChange); }, onChange(state) { this.setState(state); }, onRemoveWebhook(webhookId) { return (event) => { WebhookActions.removeWebhook(webhookId); let notification = new GlobalNotificationModel(getLangText('Webhook deleted'), 'success', 2000); GlobalNotificationActions.appendGlobalNotification(notification); }; }, handleCreateSuccess() { this.refs.webhookCreateForm.reset(); WebhookActions.fetchWebhooks(true); let notification = new GlobalNotificationModel(getLangText('Webhook successfully created'), 'success', 5000); GlobalNotificationActions.appendGlobalNotification(notification); }, getWebhooks(){ let content = <AscribeSpinner color='dark-blue' size='lg'/>; if (this.state.webhooks) { content = this.state.webhooks.map(function(webhook, i) { const event = webhook.event.split('.')[0]; return ( <ActionPanel name={webhook.event} key={i} content={ <div> <div className='ascribe-panel-title'> {event.toUpperCase()} </div> <div className="ascribe-panel-subtitle"> {webhook.target} </div> </div> } buttons={ <div className="pull-right"> <div className="pull-right"> <button className="pull-right btn btn-tertiary btn-sm" onClick={this.onRemoveWebhook(webhook.id)}> {getLangText('DELETE')} </button> </div> </div> }/> ); }, this); } return content; }, getEvents() { if (this.state.webhookEvents && this.state.webhookEvents.length) { return ( <Property name='event' label={getLangText('Select the event to trigger a webhook', '...')}> <select name="events"> {this.state.webhookEvents.map((event, i) => { return ( <option name={i} key={i} value={ event + '.webhook' }> { event.toUpperCase() } </option> ); })} </select> </Property>); } return null; }, render() { return ( <CollapsibleParagraph title={getLangText('Webhooks')} defaultExpanded={this.props.defaultExpanded}> <div> <p> Webhooks allow external services to receive notifications from ascribe. Currently we support webhook notifications when someone transfers, consigns, loans or shares (by email) a work to you. </p> <p> To get started, simply choose the prefered action that you want to be notified upon and supply a target url. </p> </div> <AclProxy show={this.state.webhookEvents && this.state.webhookEvents.length}> <Form ref="webhookCreateForm" url={ApiUrls.webhooks} handleSuccess={this.handleCreateSuccess}> { this.getEvents() } <Property name='target' label={getLangText('Redirect Url')}> <input type="text" placeholder={getLangText('Enter the url to be triggered')} required/> </Property> <hr /> </Form> </AclProxy> {this.getWebhooks()} </CollapsibleParagraph> ); } }); export default WebhookSettings;