Advertisement
Guest User

Untitled

a guest
May 24th, 2017
553
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.96 KB | None | 0 0
  1. <template>
  2. <div class="my-app">
  3. <h1>CTI OMNI</h1>
  4. <b-alert class="form col-md-7 col-md-offset-3" variant="danger" dismissible :show="showDismissibleAlert" @dismissed="showDismissibleAlert=false">
  5. {{errorMessage}}
  6. </b-alert>
  7.  
  8. <form class="form col-md-4 col-md-offset-4" v-if="enterName">
  9. <label for="username">Введите ваше имя:</label>
  10. <br>
  11. <input id="username" type="text" class="form-control" v-model="username" v-on:keyup.enter="connectToChat">
  12. <br>
  13. <div v-if="selectedRole.label === 'Оператор'">
  14. <label for="password">Введите ваш пароль:</label><br>
  15. <input id="password" type="password" v-model="password" class="form-control" v-on:keyup.enter="connectToChat">
  16. </div>
  17. <br>
  18. <label for="selectedRole">Ваша роль:</label><br>
  19. <select id="selectedRole" v-model="selectedRole.label" class="form-control">
  20. <option v-for="role in roles">{{ role.label }}</option>
  21. </select>
  22. <br>
  23. <br>
  24. <div v-if="selectedRole.label === 'Клиент'">
  25. <button class="btn btn-primary col-md-6 col-md-offset-3" v-on:click="connectToChat">Войти в чат</button>
  26. </div>
  27. <div v-else>
  28. <button class="btn btn-danger col-md-6 col-md-offset-3" v-on:click="login">Войти в АРМ оператора</button>
  29. </div>
  30. <br>
  31. <br>
  32. </form>
  33. <div id="main-container" v-else>
  34. <div id="users-list">
  35. <h3>Пользователи онлайн:</h3>
  36. <ul>
  37. <transition-group name="user-appear">
  38. <li v-for="user in users" v-bind:key="user.user">
  39. <a @click="enterToPrivate">{{user.user}} ({{user.online_at}})</a>
  40. </li>
  41. </transition-group>
  42. </ul>
  43. </div>
  44. <div id="messages-list">
  45. <ul>
  46. <transition-group name="message-appear">
  47. <li v-for="message in messages" v-bind:key="message">
  48. <div class="message-metadata">
  49. <span class="username">{{message.username}}</span>
  50. <span class="received-at">{{message.received_at}}</span>
  51. </div>
  52.  
  53. {{message.body}}
  54. </li>
  55. </transition-group>
  56. </ul>
  57. </div>
  58. <div id="your-message">
  59. <input type="text" placeholder="What do you have to say?" v-model="message" v-on:keyup.enter="sendMessage">
  60. <span>Token: {{ token.substring(0,80) }}...</span>
  61. <br>
  62. <span>UserId: {{ userId }}</span>
  63. </div>
  64.  
  65. </div>
  66. </div>
  67. </template>
  68.  
  69. <script>
  70. import {
  71. Socket,
  72. Presence
  73. } from "phoenix"
  74.  
  75. import gql from 'graphql-tag'
  76.  
  77. export default {
  78. data() {
  79. return {
  80. socket: null,
  81. channel: null,
  82. messages: [],
  83. message: "",
  84. username: "e.batogov@cti.ru",
  85. password: "qweasd123",
  86. showDismissibleAlert: false,
  87. errorMessage: "",
  88. token: "",
  89. userId: "",
  90. enterName: true,
  91. hello: '',
  92. roles: [{
  93. id: "customer",
  94. label: "Клиент"
  95. },
  96. {
  97. id: "operator",
  98. label: "Оператор"
  99. }
  100. ],
  101. selectedRole: {
  102. id: "operator",
  103. label: "Оператор"
  104. },
  105. users: [],
  106. remoteUsers: ""
  107. }
  108. },
  109. apollo: {
  110. // Apollo specific options
  111. // remoteUsers: gql `query {
  112. // users {
  113. // id
  114. // }
  115. // }`,
  116. },
  117. methods: {
  118. showChat(){
  119. this.enterName = false;
  120. },
  121. login() {
  122. this.$apollo.mutate({
  123. mutation: gql `
  124. mutation UserLogin($username: String!, $password: String!) {
  125. login(email: $username, password: $password) {
  126. userId
  127. token
  128. }
  129. }`,
  130. variables: {
  131. username: this.username,
  132. password: this.password
  133. }
  134. }).then((data) => {
  135. this.showDismissibleAlert = true;
  136. this.errorMessage = "login success";
  137. //
  138. this.token = data.data.login.token;
  139. this.userId = data.data.login.userId;
  140. showChat()
  141.  
  142. }).catch((error) => {
  143. // Error
  144. this.showDismissibleAlert = true;
  145. this.errorMessage = "login failed";
  146. // alert("Login failed");
  147.  
  148. })
  149. },
  150. sendMessage() {
  151. this.channel.push("new_msg", {
  152. body: this.message
  153. })
  154. this.message = ''
  155. },
  156. connectToChat() {
  157. let presences = {}
  158. this.enterName = false
  159. this.socket = new Socket("/socket", {
  160. params: {
  161. username: this.username
  162. }
  163. }),
  164. this.socket.connect()
  165. this.channel = this.socket.channel("room:lobby", {});
  166. this.channel.on("new_msg", payload => {
  167. payload.received_at = new Date(payload.received_at * 1000).toLocaleString();
  168. this.messages.push(payload);
  169. });
  170. this.channel.on("presence_state", state => {
  171. presences = Presence.syncState(presences, state)
  172. this.assignUsers(presences)
  173. })
  174. this.channel.on("presence_diff", diff => {
  175. presences = Presence.syncDiff(presences, diff)
  176. this.assignUsers(presences)
  177. })
  178. this.channel.join()
  179. .receive("ok", response => {
  180. console.log("Joined successfully", response)
  181. })
  182. .receive("error", response => {
  183. console.log("Unable to join", response)
  184. })
  185. },
  186. assignUsers(presences) {
  187. let formatTimestamp = (timestamp) => {
  188. timestamp = parseInt(timestamp)
  189. let date = new Date(timestamp)
  190. return date.toLocaleTimeString()
  191. }
  192. this.users = Presence.list(presences, (user, {
  193. metas: metas
  194. }) => {
  195. return {
  196. user: user,
  197. online_at: formatTimestamp(metas[0].online_at)
  198. }
  199. })
  200. }
  201. }
  202. }
  203. </script>
  204. <style lang="sass">
  205. .my-app {
  206. h1 {
  207. text-align: center;
  208. }
  209. #main-container {
  210. position: absolute;
  211. top: 0;
  212. bottom: 0;
  213. left: 0;
  214. right: 0;
  215. display: flex;
  216. overflow: hidden;
  217. }
  218. #users-list {
  219. background-color: #008bdf;
  220. width: 250px;
  221. height: 100vh;
  222. overflow-y: scroll;
  223. h3 {
  224. font-size: 0.9em;
  225. margin-left: 10px;
  226. color: rgba(255, 255, 255, 0.7);
  227. }
  228. ul {
  229. list-style: none;
  230. padding-left: 20px;
  231. color: rgba(255, 255, 255, 0.9);
  232. li {
  233. &.user-appear-enter-active,
  234. &.user-appear-leave-active {
  235. transition: all 0.2s;
  236. }
  237. &.user-appear-enter,
  238. &.user-appear-leave-active {
  239. opacity: 0;
  240. transform: translateX(-15px);
  241. }
  242. }
  243. }
  244. }
  245. #messages-list {
  246. padding-top: 20px;
  247. padding-left: 20px;
  248. overflow-y: scroll;
  249. flex: 1;
  250. ul {
  251. list-style: none;
  252. padding: 0;
  253. li {
  254. padding: 5px 0;
  255. &.message-appear-enter-active,
  256. &.message-appear-leave-active {
  257. transition: all 0.2s;
  258. }
  259. &.message-appear-enter,
  260. &.message-appear-leave-active {
  261. opacity: 0;
  262. transform: translateY(20px);
  263. }
  264. .message-metadata {
  265. .username {
  266. font-weight: bold;
  267. }
  268. .received-at {
  269. color: rgba(0, 0, 0, 0.4);
  270. margin-left: 5px;
  271. font-size: 0.9em;
  272. }
  273. }
  274. }
  275. }
  276. }
  277. #your-message {
  278. position: fixed;
  279. bottom: 0;
  280. left: 250px;
  281. right: 0;
  282. background: rgba(255, 255, 255, 0.95);
  283. padding: 15px;
  284. input {
  285. width: 100%;
  286. padding: 5px 8px;
  287. border-radius: 3px;
  288. outline: 0;
  289. border: 1px solid #ddd;
  290. }
  291. }
  292. }
  293. </style>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement