85 |
86 |
87 |
90 |
93 |
94 |
95 |
98 |
101 |
104 |
105 |
106 |
109 |
112 |
115 |
116 |
117 |
118 |
119 |
120 |
121 |
122 | );
123 | }
124 | });
125 |
126 | var DialerApp = React.createClass({
127 | getInitialState() {
128 | return {
129 | muted: false,
130 | log: 'Connecting...',
131 | onPhone: false,
132 | countryCode: '1',
133 | currentNumber: '',
134 | isValidNumber: false,
135 | countries: [
136 | { name: 'United States', cc: '1', code: 'us' },
137 | { name: 'Great Britain', cc: '44', code: 'gb' },
138 | { name: 'Colombia', cc: '57', code: 'co' },
139 | { name: 'Ecuador', cc: '593', code: 'ec' },
140 | { name: 'Estonia', cc: '372', code: 'ee' },
141 | { name: 'Germany', cc: '49', code: 'de' },
142 | { name: 'Hong Kong', cc: '852', code: 'hk' },
143 | { name: 'Ireland', cc: '353', code: 'ie' },
144 | { name: 'Singapore', cc: '65', code: 'sg' },
145 | { name: 'Spain', cc: '34', code: 'es' },
146 | { name: 'Brazil', cc: '55', code: 'br' },
147 | ]
148 | }
149 | },
150 |
151 | // Initialize after component creation
152 | componentDidMount() {
153 | var self = this;
154 |
155 | // Fetch Twilio capability token from our Node.js server
156 | $.getJSON('/token').done(function(data) {
157 | Twilio.Device.setup(data.token);
158 | }).fail(function(err) {
159 | console.log(err);
160 | self.setState({log: 'Could not fetch token, see console.log'});
161 | });
162 |
163 | // Configure event handlers for Twilio Device
164 | Twilio.Device.disconnect(function() {
165 | self.setState({
166 | onPhone: false,
167 | log: 'Call ended.'
168 | });
169 | });
170 |
171 | Twilio.Device.ready(function() {
172 | self.log = 'Connected';
173 | });
174 | },
175 |
176 | // Handle country code selection
177 | handleChangeCountryCode(countryCode) {
178 | this.setState({countryCode: countryCode});
179 | },
180 |
181 | // Handle number input
182 | handleChangeNumber(e) {
183 | this.setState({
184 | currentNumber: e.target.value,
185 | isValidNumber: /^([0-9]|#|\*)+$/.test(e.target.value.replace(/[-()\s]/g,''))
186 | });
187 | },
188 |
189 | // Handle muting
190 | handleToggleMute() {
191 | var muted = !this.state.muted;
192 |
193 | this.setState({muted: muted});
194 | Twilio.Device.activeConnection().mute(muted);
195 | },
196 |
197 | // Make an outbound call with the current number,
198 | // or hang up the current call
199 | handleToggleCall() {
200 | if (!this.state.onPhone) {
201 | this.setState({
202 | muted: false,
203 | onPhone: true
204 | })
205 | // make outbound call with current number
206 | var n = '+' + this.state.countryCode + this.state.currentNumber.replace(/\D/g, '');
207 | Twilio.Device.connect({ number: n });
208 | this.setState({log: 'Calling ' + n})
209 | } else {
210 | // hang up call in progress
211 | Twilio.Device.disconnectAll();
212 | }
213 | },
214 |
215 | render: function() {
216 | var self = this;
217 |
218 | return (
219 |
220 |
221 |
222 |
224 |
225 |
226 |
227 |
228 |
229 |
230 |
231 |
232 |
233 | { this.state.onPhone ? : null }
234 |
235 |
236 |
237 | { this.state.onPhone ?
: null }
238 |
239 |
240 |
241 |
242 | );
243 | }
244 | });
245 |
246 | ReactDOM.render(
247 |