Skip to content

Instantly share code, notes, and snippets.

View SergeyPetrachkov's full-sized avatar
:octocat:

Sergey Petrachkov SergeyPetrachkov

:octocat:
View GitHub Profile
@SergeyPetrachkov
SergeyPetrachkov / Copyable.swift
Created January 11, 2018 10:08
Copyable in Swift
public protocol Copyable {
init(other: Self)
}
public extension Copyable {
public func copy() -> Self {
return Self.init(other: self)
}
}
@SergeyPetrachkov
SergeyPetrachkov / RoundedInitialsAvatar.swift
Created January 11, 2018 10:13
Create image with specified color and text inside like Telegram's conversation default avatar
extension UIImage {
static func roundedTextAvatar(text: String?,
color: UIColor,
circular: Bool,
textAttributes: [NSAttributedStringKey: Any]?,
size: CGSize) -> UIImage? {
let scale = Float(UIScreen.main.scale)
UIGraphicsBeginImageContextWithOptions(size, false, CGFloat(scale))
let context = UIGraphicsGetCurrentContext()
@SergeyPetrachkov
SergeyPetrachkov / StringInitials.swift
Created January 11, 2018 10:15
Get string initials Swift
extension String {
public var initials: String {
var finalString = String()
var words = components(separatedBy: .whitespacesAndNewlines)
if let firstCharacter = words.first?.first {
finalString.append(String(firstCharacter))
words.removeFirst()
}
@SergeyPetrachkov
SergeyPetrachkov / ChatsService.swift
Created September 3, 2018 06:59
chats service for medium article
protocol ChatsService {
func getChats(request: GetConversationsRequest) throws -> [Message]
func getChatMessages(request: GetConversationMessagesRequest) throws -> [Message]
func submitMessage(request: SubmitMessageRequest) throws -> Message
func getUnreadMessagesNumber() throws -> Int
}
@SergeyPetrachkov
SergeyPetrachkov / RemoteChatsProvider.swift
Last active September 3, 2018 07:03
remote chats provider for medium article
class RemoteChatsProvider: ChatsProvider {
func getChats(request: GetConversationsRequest) throws -> [Message] {
var items: [MessageDto] = []
var outputError: Error? = nil
let dispatchGroup = DispatchGroup()
dispatchGroup.enter()
CompanyMessagesAPI.companyMessagesGetConversations(request: request, completion: { (successfulResponse, error) in
do {
items = try SwaggerApiResponseHandler.unwrapResponse((successfulResponse, error))
extension SwaggerClientAPI {
private enum HeadersKeys: String {
case authorization = "Authorization"
}
class func setBearer(_ token: String) {
SwaggerClientAPI.customHeaders = [HeadersKeys.authorization.rawValue: "Bearer \(token)"]
}
class func clearBearer() {
SwaggerClientAPI.customHeaders.removeValue(forKey: HeadersKeys.authorization.rawValue)
}
class ConversationsListInteractor: ConversationsListInteractorInput {
let chatsProvider: ChatsService = Assembler.container.resolve(ChatsProvider.self)!
weak var output: ConversationsListInteractorOutput?
// MARK: - Input
func requestItems(request: ConversationsList.DataContext.Request) {
DispatchQueue(label: "ConversationsListInteractor").async {
do {
let items = try self.chatsProvider.getChats(request: GetConversationsRequest(skip: request.skip, take: request.take))
let models = items.map({ ConversationsListModel(currentModel: $0) })
@SergeyPetrachkov
SergeyPetrachkov / UIImageView+Siberia.swift
Last active September 18, 2018 09:02
UIImageView+Siberia.swift
if let data = self.currentModel.imageData {
view.avatarImage.image = UIImage(data: data)
} else {
view.avatarImage.setImage(string: currentModel.username, color: UIColor.gray, circular: true, textAttributes: nil)
}
@SergeyPetrachkov
SergeyPetrachkov / GradientExample.swift
Created September 20, 2018 01:40
GradientExample.swift
let gradientView = UIView(frame: CGRect(x: 0, y: self.textLabel.frame.maxY - 100, width: 375, height: 100))
self.view.addSubview(gradientView)
let gradientLayer: CAGradientLayer = CAGradientLayer()
gradientLayer.frame = gradientView.bounds
// colors of your overlay. [0] - start color, [1] - end color
gradientLayer.colors = [UIColor(white: 1, alpha: 0.95).cgColor, UIColor(white: 1, alpha: 0.6).cgColor]
gradientLayer.startPoint = CGPoint(x: 0, y: 0)
gradientLayer.endPoint = CGPoint(x: 0, y: 1)
gradientView.layer.addSublayer(gradientLayer)
// rotate view 180 degrees
gradientLayer.startPoint = CGPoint(x: 0, y: 0)
gradientLayer.endPoint = CGPoint(x: 0, y: 1)