diff --git a/webclient/app.js b/webclient/app.js
index c091f8c6cf..17b2bb6e8f 100644
--- a/webclient/app.js
+++ b/webclient/app.js
@@ -31,6 +31,7 @@ var matrixWebClient = angular.module('matrixWebClient', [
'eventStreamService',
'eventHandlerService',
'notificationService',
+ 'modelService',
'infinite-scroll',
'ui.bootstrap',
'monospaced.elastic'
diff --git a/webclient/components/matrix/event-handler-service.js b/webclient/components/matrix/event-handler-service.js
index e63584510b..84b2a220e7 100644
--- a/webclient/components/matrix/event-handler-service.js
+++ b/webclient/components/matrix/event-handler-service.js
@@ -27,8 +27,8 @@ Typically, this service will store events or broadcast them to any listeners
if typically all the $on method would do is update its own $scope.
*/
angular.module('eventHandlerService', [])
-.factory('eventHandlerService', ['matrixService', '$rootScope', '$q', '$timeout', 'mPresence', 'notificationService',
-function(matrixService, $rootScope, $q, $timeout, mPresence, notificationService) {
+.factory('eventHandlerService', ['matrixService', '$rootScope', '$q', '$timeout', 'mPresence', 'notificationService', 'modelService',
+function(matrixService, $rootScope, $q, $timeout, mPresence, notificationService, modelService) {
var ROOM_CREATE_EVENT = "ROOM_CREATE_EVENT";
var MSG_EVENT = "MSG_EVENT";
var MEMBER_EVENT = "MEMBER_EVENT";
diff --git a/webclient/components/matrix/model-service.js b/webclient/components/matrix/model-service.js
new file mode 100644
index 0000000000..c10e5185ad
--- /dev/null
+++ b/webclient/components/matrix/model-service.js
@@ -0,0 +1,98 @@
+/*
+Copyright 2014 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+'use strict';
+
+/*
+This service serves as the entry point for all models in the app. If access to
+underlying data in a room is required, then this service should be used as the
+dependency.
+*/
+// NB: This is more explicit than linking top-level models to $rootScope
+// in that by adding this service as a dep you are clearly saying "this X
+// needs access to the underlying data store", rather than polluting the
+// $rootScope.
+angular.module('modelService', [])
+.factory('modelService', ['matrixService', function(matrixService) {
+
+ /***** Room Object *****/
+ var Room = function Room(room_id) {
+ this.room_id = room_id;
+ this.old_room_state = RoomState();
+ this.current_room_state = RoomState();
+ };
+ Room.prototype = {
+ leave: function leave() {
+ return matrixService.leave(this.room_id);
+ }
+ };
+
+ /***** Room State Object *****/
+ var RoomState = function RoomState() {
+ // list of RoomMember
+ this.members = [];
+ // state events, the key is a compound of event type + state_key
+ this.state_events = {};
+ // earliest token
+ this.pagination_token = "";
+ };
+ RoomState.prototype = {
+ // get a state event for this room from this.state_events. State events
+ // are unique per type+state_key tuple, with a lot of events using 0-len
+ // state keys. To make it not Really Annoying to access, this method is
+ // provided which can just be given the type and it will return the
+ // 0-len event by default.
+ state: function state(type, state_key) {
+ if (!state_key) {
+ return this.state_events[type];
+ }
+ return this.state_events[type + state_key];
+ },
+
+ storeState: function storeState(event) {
+ this.state_events[event.type + event.state_key] = event;
+ }
+ };
+
+ /***** Room Member Object *****/
+ var RoomMember = function RoomMember() {
+ this.event = {}; // the m.room.member event representing the RoomMember.
+ this.user = undefined; // the User
+ };
+
+ /***** User Object *****/
+ var User = function User() {
+ this.event = {}; // the m.presence event representing the User.
+ };
+
+ // rooms are stored here when they come in.
+ var rooms = {
+ // roomid: <Room>
+ };
+
+ console.log("Models inited.");
+
+ return {
+
+ getRoom: function(roomId) {
+ if(!rooms[roomId]) {
+ rooms[roomId] = new Room(roomId);
+ }
+ return rooms[roomId];
+ }
+
+ };
+}]);
diff --git a/webclient/index.html b/webclient/index.html
index bc011a6c72..965981f7de 100644
--- a/webclient/index.html
+++ b/webclient/index.html
@@ -42,6 +42,7 @@
<script src="components/matrix/event-stream-service.js"></script>
<script src="components/matrix/event-handler-service.js"></script>
<script src="components/matrix/notification-service.js"></script>
+ <script src="components/matrix/model-service.js"></script>
<script src="components/matrix/presence-service.js"></script>
<script src="components/fileInput/file-input-directive.js"></script>
<script src="components/fileUpload/file-upload-service.js"></script>
|