badoo / Chatto

A lightweight framework to build chat applications, made in Swift
MIT License
4.48k stars 592 forks source link

Convert to Swift code #374

Open saroar opened 6 years ago

saroar commented 6 years ago

var chat = new Webchat(window.location.host);

//Define what a chat is.
function Webchat(hostname) {

    //Declarations
    var chat = this;
    var username = "";
    var displayName = "";
    var avatar = "";

    //Start Lifecycle
    chat.socket = new WebSocket('ws://' + hostname + '/chat', 'chat');

    //Start Chat Sequence On New Chat
    chat.socket.onopen = function() {
        chat.promptUserInfo();
    }

    //Get & Send Basic Info to Server
    chat.promptUserInfo = function() {
        while (!username) {
            username = prompt('What is your gravatar email? (anything but blank works)');
        }

        while (!displayName) {
            displayName = prompt('What do you want to be called?');
        }

        var hash = md5(username.toLowerCase());
        avatar = "https://www.gravatar.com/avatar/" + hash;

        chat.start(username, avatar, displayName);
    }

    //Actually setup the chat window and start talking
    chat.start = function(email, avatarImageURI, name) {
        var json = JSON.stringify({"email":email, "avatar":avatarImageURI, "displayName": name});
        chat.socket.send(json);
        showChatWindow(); //This triggers the animation that shows the main window, defined in animations.js
    }

    //Append New Messages to the Chat Window
    chat.appendMessage = function(message, avatar, selfSent) {

        var messageSection = document.querySelector('.messages');

        var div = document.createElement('div');
        div.className = 'message';

        var image = document.createElement('img');
        image.className = 'avatar';
        image.src = avatar;
        image.alt = 'Avatar';

        var span = document.createElement('span');
        span.innerHTML = message;

        if (selfSent) {
            div.className += ' self';
        }

        div.appendChild(image);
        div.appendChild(span);

        messageSection.appendChild(div);
        messageSection.scrollTop = messageSection.scrollHeight;
    }

    //Send New Messages to Server
    chat.sendMessage = function(message) {
        var json = JSON.stringify({"email": username, "avatar": avatar, "displayName": displayName, "message": message});
        chat.socket.send(json);
    }

    //Receive New Messages from the Server
    chat.socket.onmessage = function(received) {
        var jsonAry = JSON.parse(received.data);
        var message = jsonAry["message"];
        var avatar = jsonAry["avatar"];
        var selfSent = false;
        chat.appendMessage(message, avatar, selfSent);
    }

    //Handle Chat Text Submission
    $('form').on('submit', function(form) {
         form.preventDefault();

         var text = $('.sendbar-input').val();

         chat.appendMessage(text, avatar, true);
         chat.sendMessage(text);

         $('.sendbar-input').val('');
     });
};```

i have this code in front end with js script I like to convert it into a swift code for my ios is anybody can help about yes i am using Chatto for my chat app 
thank advance 

note: sorry i know its not issue but i am learning chatto how to use it 
i have written my back api with swift server side app 
saroar commented 6 years ago

is anybody can idea how i can convert it into chatto ?

import UIKit
import Starscream

final class ViewController: UIViewController {

  // MARK: - Properties
  var username = ""
  var socket = WebSocket(url: URL(string: "ws://localhost:8181/api/v1/chat")!, protocols: ["chat"])

  // MARK: - IBOutlets
  @IBOutlet var emojiLabel: UILabel!
  @IBOutlet var usernameLabel: UILabel!

  // MARK: - View Life Cycle
  override func viewDidLoad() {
    super.viewDidLoad()

    socket.delegate = self
    socket.connect()

    navigationItem.hidesBackButton = true
  }

  deinit {
    socket.disconnect(forceTimeout: 0)
    socket.delegate = nil
  }
}

// MARK: - IBActions
extension ViewController {

  @IBAction func selectedEmojiUnwind(unwindSegue: UIStoryboardSegue) {
    guard let viewController = unwindSegue.source as? CollectionViewController,
      let emoji = viewController.selectedEmoji() else {
        return
    }

    sendMessage(emoji)
  }
}

// MARK: - FilePrivate
extension ViewController {

  fileprivate func sendMessage(_ message: String) {
    socket.write(string: message)
  }

  fileprivate func messageReceived(_ message: String, senderName: String) {
    emojiLabel.text = message
    usernameLabel.text = senderName
  }
}

// MARK: - WebSocketDelegate
extension ViewController : WebSocketDelegate {

  public func websocketDidConnect(_ socket: Starscream.WebSocket) {
    socket.write(string: username)
  }

  public func websocketDidDisconnect(_ socket: Starscream.WebSocket, error: NSError?) {
    performSegue(withIdentifier: "websocketDisconnected", sender: self)
  }

  /* Message format:
   * {"type":"message","data":{"time":1472513071731,"text":"😍","author":"iPhone Simulator","color":"orange"}}
   */
  public func websocketDidReceiveMessage(_ socket: Starscream.WebSocket, text: String) {
    guard let data = text.data(using: .utf16),
      let jsonData = try? JSONSerialization.jsonObject(with: data),
      let jsonDict = jsonData as? [String: Any],
      let messageType = jsonDict["type"] as? String else {
        return
    }

    if messageType == "message",
      let messageData = jsonDict["data"] as? [String: Any],
      let messageAuthor = messageData["author"] as? String,
      let messageText = messageData["text"] as? String {

      messageReceived(messageText, senderName: messageAuthor)
    }
  }

  public func websocketDidReceiveData(_ socket: Starscream.WebSocket, data: Data) {
    // Noop - Must implement since it's not optional in the protocol
  }
}