diff --git a/lib/react/message.jsx b/lib/react/message.jsx index e7557da..a1a01f2 100644 --- a/lib/react/message.jsx +++ b/lib/react/message.jsx @@ -1,5 +1,177 @@ "use strict"; +const MessageBrowser = React.createClass({ + getInitialState() { + return { + browserState: "", + messages: [], + page: 0, + limit: 250, + search: "" + } + }, + + handleNextPage(e) { + e.preventDefault(); + const page = this.state.page; + this.setState({ page: page + 1 }); + this.loadMessages(); + }, + + handlePreviousPage(e) { + e.preventDefault(); + const page = this.state.page; + if (page < 1) return; + this.setState({ page: page - 1 }); + this.loadMessages(); + }, + + pageHandlers() { + let previous; + if (this.state.page > 0) { + previous = ( + Prev + ); + } + let next; + if (this.state.messages.length === this.state.limit) { + next = ( + Next + ); + } + return ( +
+ {previous} + + {this.state.page} + + {next} +
+ ); + }, + + loadMessages() { + const limit = this.state.limit; + const page = this.state.page; + let data = { + limit: limit, + page: page + }; + + if (this.state.search.length) { + data.query = this.state.search; + } + + this.setState({ browserState: "Retrieving messages"}); + $.ajax({ + url: "/api/messages", + data: data + }) + .done(data => { + this.setState({ + messages: data.messages, + browserState: "" + }); + }) + .fail(error => { + console.error(error); + this.setState({ + browserState: `Unable to retrieve messages.` + }); + }) + }, + + componentDidMount() { + this.loadMessages(); + }, + + updateLimit(e) { + let newLimit = parseInt(e.target.value, 10); + if (isNaN(newLimit) || newLimit > 250) newLimit = 250; + this.setState({ limit: newLimit }); + }, + + updateSearch(e) { + this.setState({ search: e.target.value }); + }, + + render() { + let browserState; + if (this.state.browserState.length) { + browserState = ( +
+
{this.state.browserState}
+
+ ); + } + const messages = this.state.messages.map(message => { + return ( + + {(new Date(message.createdAt)).toString()} + {message.author.username} + {message.content} + {message._id} + + ); + }); + return ( +
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+ +
+
+
+
+

Page Control

+ {this.pageHandlers()} +
+
+
+
+ {browserState} +
+ + + + + + + + + + + {messages} + +
DateAuthorMessageID
+
+
+ ); + } +}); + var Chatroom = React.createClass({ getInitialState() { return { diff --git a/spec/messages.integration.js b/spec/messages.integration.js index 5f4d72f..42d0085 100644 --- a/spec/messages.integration.js +++ b/spec/messages.integration.js @@ -41,8 +41,7 @@ describe("Messages", () => { describe("JSON Api", () => { it ("returns most recent messages", done => { request(app) - .get("/messages") - .set("Accept", "application/json") + .get("/api/messages") .expect("Content-Type", /json/) .expect(200) .end((error, response) => { @@ -56,11 +55,10 @@ describe("Messages", () => { }); it ("is sensitive to limit", done => { request(app) - .get("/messages") + .get("/api/messages") .query({ limit: 1 }) - .set("Accept", "application/json") .expect("Content-Type", /json/) .expect(200) .end((error, response) => { @@ -76,12 +74,11 @@ describe("Messages", () => { it ("returns a maximum of last 250 messages"); it ("is sensitive to pagination", done => { request(app) - .get("/messages") + .get("/api/messages") .query({ limit: 1, page: 2 }) - .set("Accept", "application/json") .expect("Content-Type", /json/) .expect(200) .end((error, response) => { @@ -96,11 +93,10 @@ describe("Messages", () => { }); it ("is sensitive to search terms", done => { request(app) - .get("/messages") + .get("/api/messages") .query({ query: "5" }) - .set("Accept", "application/json") .expect("Content-Type", /json/) .expect(200) .end((error, response) => { @@ -119,7 +115,6 @@ describe("Messages", () => { it ("renders message browser", done => { request(app) .get("/messages") - .set("Accept", "text/html; charset=utf-8") .expect("Content-Type", /html/) .expect(200) .end((error, response) => { diff --git a/views/index.hbs b/views/index.hbs deleted file mode 100644 index b204b72..0000000 --- a/views/index.hbs +++ /dev/null @@ -1,58 +0,0 @@ -
- {{>menu}} -
-
-
-
-
-
- ENSL Logo -
-
-

Authenticating your ENSL account

-
-
- Loading -
-
-
-
- - -
- -
-
-
-
-
-
-
-{{>foot}} diff --git a/views/messages.hbs b/views/messages.hbs index bb47980..5ba4f88 100644 --- a/views/messages.hbs +++ b/views/messages.hbs @@ -6,10 +6,18 @@

Message Browser

+ +
- +
+ + \ No newline at end of file