Skip to content
This repository has been archived by the owner on Mar 27, 2023. It is now read-only.

Commit

Permalink
Adds column for storing api endpoint
Browse files Browse the repository at this point in the history
  • Loading branch information
osahyoun committed Oct 2, 2018
1 parent f75f773 commit f851dd5
Show file tree
Hide file tree
Showing 25 changed files with 308 additions and 224 deletions.
7 changes: 7 additions & 0 deletions app/admin/registered_target_endpoint.rb
@@ -0,0 +1,7 @@
# frozen_string_literal: true

ActiveAdmin.register RegisteredTargetEndpoint do
actions :all

permit_params :url, :name, :description
end
44 changes: 20 additions & 24 deletions app/controllers/api/emails_controller.rb
Expand Up @@ -13,31 +13,26 @@ def create
end
end

def create_constituency_targets_email
endpoint = "https://pzeb4jmr4l.execute-api.us-east-1.amazonaws.com/dev/germany/#{params[:postcode]}"
resp = HTTParty.get(endpoint)
targets = JSON.parse(resp.body)

PensionEmailSender.run(params[:page_id], constituency_targets_email_params(targets))
render json: resp.body
end

def create_pension_email
create_constituency_targets_email
reg_endpoint = plugin.registered_target_endpoint

# return
target_data = if reg_endpoint
targets =
EmailTool::TargetsFinder.new(
postcode: params[:postcode],
endpoint: reg_endpoint.url
)

endpoint = "https://pzeb4jmr4l.execute-api.us-east-1.amazonaws.com/dev/germany/#{params[:postcode]}"
constituency_targets_email_params(targets)
else
pension_email_params
end

resp = HTTParty.get(endpoint)
# JSON.parse(resp.body)
PensionEmailSender.run(params[:page_id], target_data)
action = ManageAction.create(action_params)
write_member_cookie(action.member_id)

# PensionEmailSender.run(params[:page_id], pension_email_params)
# action = ManageAction.create(action_params)
# write_member_cookie(action.member_id)
#
# render js: "window.location = '#{PageFollower.new_from_page(page).follow_up_path}'"
render json: resp.body
render js: "window.location = '#{PageFollower.new_from_page(page).follow_up_path}'"
end

private
Expand All @@ -60,10 +55,7 @@ def constituency_targets_email_params(targets)
.symbolize_keys
.slice(:body, :subject, :from_email, :from_name)

data[:targets] = targets.map do |target|
{ target_name: "#{target['last_name']}, #{target['first_name']}", target_email: target['email_1'] }
end

data[:targets] = targets
data
end

Expand Down Expand Up @@ -95,4 +87,8 @@ def action_params
def page
Page.find(params[:page_id])
end

def plugin
@plugin ||= Plugins::EmailPension.find_by id: params[:plugin_id], page_id: page.id
end
end
Empty file.
6 changes: 0 additions & 6 deletions app/javascript/components/EmailEditor/EmailEditor.js
Expand Up @@ -20,11 +20,6 @@ export default class EmailEditor extends Component {
constructor(props: Props) {
super(props);

console.log(
EditorState.createWithContent(
stateFromHTML(interpolateVars(props.body, props.templateVars))
)
);
this.state = {
subject: interpolateVars(props.subject, props.templateVars),
editorState: EditorState.createWithContent(
Expand All @@ -51,7 +46,6 @@ export default class EmailEditor extends Component {

componentDidMount() {
this.update();
console.log(stateToHTML(this.state.editorState.getCurrentContent()));
}

componentDidUpdate() {
Expand Down
17 changes: 17 additions & 0 deletions app/javascript/email_pension/EmailPensionView.scss
@@ -1,3 +1,20 @@
.email-target {
.target-panel {
margin: 20px 0;

&::after {
content: "";
display: table;
clear: both;
}
}
.target-panel-body {
background: white;
border-radius: 5px;
padding: 10px;
}
}

.email-target {
.email-target_box {
border: 1px solid #f8492e;
Expand Down
76 changes: 12 additions & 64 deletions app/javascript/email_pension/EmailRepresentativeView.js
Expand Up @@ -5,70 +5,10 @@ import Input from '../components/SweetInput/SweetInput';
import Button from '../components/Button/Button';
import FormGroup from '../components/Form/FormGroup';
import EmailEditor from '../components/EmailEditor/EmailEditor';
import SelectTarget from './SelectTarget';
import { FormattedMessage, injectIntl } from 'react-intl';
import './EmailPensionView.scss';

import type { Dispatch } from 'redux';

class SelectTarget extends Component {
constructor(props) {
super(props);

this.state = {
postcode: '',
targets: [],
};
}

componentDidMount() {
this.getTarget('10178');
}

getTarget = (postcode: string) => {
this.setState({ postcode: postcode });

if (!postcode) return;
if (postcode.length < 5) return;

fetch(
`https://pzeb4jmr4l.execute-api.us-east-1.amazonaws.com/dev/germany/${postcode}`
)
.then(resp => resp.json())
.then(json => {
this.setState({ targets: json });
const data = { postcode, targets: json };
this.props.handler(data);
});
};

renderTarget({ id, title, first_name, last_name }) {
return (
<p key={id}>
{title} {first_name} {last_name}
</p>
);
}

render() {
const targets = this.state.targets.map(target => this.renderTarget(target));

return (
<div>
<FormGroup>
<Input
name="postcode"
type="text"
label="Enter your postcode"
value={this.state.postcode}
onChange={value => this.getTarget(value)}
/>
</FormGroup>
{targets}
</div>
);
}
}

class EmailRepresentativeView extends Component {
constructor(props) {
super(props);
Expand Down Expand Up @@ -160,13 +100,18 @@ class EmailRepresentativeView extends Component {
from_name: this.state.name,
from_email: this.state.email,
postcode: this.state.postcode,
plugin_id: this.props.pluginId,
};

merge(payload, this.props.formValues);
// this.setState({isSubmitting: true});
this.setState({ isSubmitting: true });

// FIXME Handle errors
$.post(`/api/pages/${this.props.pageId}/pension_emails`, payload);
$.post(`/api/pages/${this.props.pageId}/pension_emails`, payload).fail(
e => {
console.log('Unable to send email', e);
}
);
};

handleTargetSelection(data) {
Expand All @@ -182,7 +127,10 @@ class EmailRepresentativeView extends Component {
<div className="email-target">
<div className="email-target-form">
<form onSubmit={this.onSubmit} className="action-form form--big">
<SelectTarget handler={this.handleTargetSelection.bind(this)} />
<SelectTarget
handler={this.handleTargetSelection.bind(this)}
endpoint={this.props.targetEndpoint}
/>

<div className="email-target-action">
<h3>
Expand Down
113 changes: 113 additions & 0 deletions app/javascript/email_pension/SelectTarget.js
@@ -0,0 +1,113 @@
// @flow
import React, { Component } from 'react';
import { FormattedMessage } from 'react-intl';
import Input from '../components/SweetInput/SweetInput';
import FormGroup from '../components/Form/FormGroup';

class SelectTarget extends Component {
constructor(props) {
super(props);

this.state = {
searching: false,
not_found: false,
postcode: '',
targets: [],
};
}

componentDidMount() {
// this.getTarget('10178');
}

getTarget = (postcode: string) => {
this.setState({ postcode: postcode });

if (!postcode) return;
if (postcode.length < 5) return;

this.setState({ searching: true, not_found: false });
fetch(`${this.props.endpoint}${postcode}`)
.then(resp => {
if (resp.ok) {
return resp.json();
}
throw new Error('not found.');
})
.then(json => {
this.setState({ targets: json, searching: false });
const data = { postcode, targets: json };
this.props.handler(data);
})
.catch(e => {
this.setState({ not_found: true, targets: [], searching: false });
console.log('error', e);
});
};

renderTarget({ id, title, first_name, last_name }) {
return (
<p key={id}>
{title} {first_name} {last_name}
</p>
);
}

render() {
let targets;

if (this.state.not_found) {
targets = (
<FormattedMessage
id="email_tool.select_target.not_found"
defaultMessage="Sorry, we couldn't find a target with this location."
/>
);
} else {
targets = this.state.targets.length ? (
this.state.targets.map(target => this.renderTarget(target))
) : (
<FormattedMessage
id="email_tool.select_target.search_pending"
defaultMessage="Please enter your postal code above."
/>
);
}

return (
<div>
<FormGroup>
<Input
name="postcode"
type="text"
label="Enter your postcode"
value={this.state.postcode}
onChange={value => this.getTarget(value)}
/>
</FormGroup>
<FormGroup>
<div className="target-panel">
<h3>
<FormattedMessage
id="email_tool.section.selected_targets"
defaultMessage="Targets"
/>
</h3>
<div className="target-panel-body">
{this.state.searching ? (
<FormattedMessage
id="email_tool.select_target.searching"
defaultMessage="Searching for targets"
/>
) : (
targets
)}
</div>
</div>
</FormGroup>
</div>
);
}
}

export default SelectTarget;
14 changes: 12 additions & 2 deletions app/javascript/packs/email_pension.js
Expand Up @@ -4,6 +4,7 @@ import { render } from 'react-dom';
import { camelizeKeys } from '../util/util';
import ComponentWrapper from '../components/ComponentWrapper';
import EmailPensionView from '../email_pension/EmailPensionView';
import EmailRepresentativeView from '../email_pension/EmailRepresentativeView';
import type { AppState } from '../state/reducers';

type emailPensionInitialState = {
Expand All @@ -21,13 +22,22 @@ type emailPensionInitialState = {

const store: Store<AppState, *> = window.champaign.store;

window.mountEmailPension = (root: string, props: emailPensionInitialState) => {
window.mountEmailPension = (
root: string,
props: emailPensionInitialState,
targetEndpoint: string
) => {
props = camelizeKeys(props);
store.dispatch({ type: 'email_target:initialize', payload: props });

console.log(targetEndpoint);
render(
<ComponentWrapper store={store} locale={props.locale}>
<EmailPensionView {...props} />
{targetEndpoint === '' ? (
<EmailPensionView {...props} />
) : (
<EmailRepresentativeView {...props} />
)}
</ComponentWrapper>,
document.getElementById(root)
);
Expand Down

0 comments on commit f851dd5

Please sign in to comment.