Skip to content
This repository was archived by the owner on Aug 18, 2023. It is now read-only.
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions amplify/backend/api/amplifyDatasource/schema.graphql
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ type AWSTweet @model {
photosURL: [String]
category: AWSCategory @connection(name: "CategorizedTweet")
userVerified: Boolean
quoteTweet: AWSTweet @belongsTo
}

type AWSCategory @model {
Expand Down
8 changes: 3 additions & 5 deletions amplify/generated/models/AWSCategory.swift
Original file line number Diff line number Diff line change
Expand Up @@ -7,16 +7,14 @@ public struct AWSCategory: Model {
public var name: String
public var imageName: String?
public var tweets: List<AWSTweet>?
public var categoryThumbnail: String?

public init(id: String = UUID().uuidString,
name: String,
imageName: String? = "folder",
tweets: List<AWSTweet>? = []
) {
imageName: String? = nil,
tweets: List<AWSTweet>? = []) {
self.id = id
self.name = name
self.imageName = imageName
self.tweets = tweets
}
}
}
2 changes: 1 addition & 1 deletion amplify/generated/models/AWSTweet+Schema.swift
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ extension AWSTweet {
.field(aWSTweet.authorUsername, is: .optional, ofType: .string),
.field(aWSTweet.profileImageURL, is: .optional, ofType: .string),
.field(aWSTweet.photosURL, is: .optional, ofType: .embeddedCollection(of: String.self)),
.belongsTo(aWSTweet.category, is: .optional, ofType: AWSCategory.self, targetName: "awsTweetCategoryId"),
.belongsTo(aWSTweet.category, is: .optional, ofType: AWSCategory.self, targetName: "aWSTweetCategoryId"),
.field(aWSTweet.userVerified, is: .optional, ofType: .bool)
)
}
Expand Down
1 change: 0 additions & 1 deletion brain-marks.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -722,7 +722,6 @@
/* Begin PBXShellScriptBuildPhase section */
FFEBBB802622755F000F475F /* ShellScript */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
buildActionMask = 2147483647;
files = (
);
Expand Down
64 changes: 52 additions & 12 deletions brain-marks/Add/AddURLViewModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,9 @@ final class AddURLViewModel: ObservableObject {

do {
let result = try JSONDecoder().decode(Response.self, from: data)
return createTweet(result)
return await createTweet(result)
} catch {
debugPrint(error)
throw HttpError.cantDecode
}
} else {
Expand Down Expand Up @@ -71,7 +72,22 @@ final class AddURLViewModel: ObservableObject {
return completeURL
}

private func createTweet (_ result: Response) -> ReturnedTweet {
private func getQuoteTweetLink(fromTweetText text: String) -> URL? {
do {
let regex = try NSRegularExpression(pattern: #"http(?:s)?:\/\/t\.co\/([a-zA-Z0-9_]+)"#)
guard let linkMatch = regex.firstMatch(in: text, range: NSRange(location: 0, length: text.utf16.count)) else {
return nil
}
let linkString = (text as NSString).substring(with: linkMatch.range)
return URL(string: linkString)
} catch {
assertionFailure(error.localizedDescription)
return nil
}

}

private func createTweet (_ result: Response) async -> ReturnedTweet {
let user = result.includes.users.first

let authorName = user?.name ?? ""
Expand All @@ -88,16 +104,40 @@ final class AddURLViewModel: ObservableObject {
}
}

let tweetToSave = ReturnedTweet(
id: result.data[0].id,
text: result.data[0].text,
timeStamp: result.data[0].created_at,
authorName: authorName,
authorUsername: authorUsername,
profileImageURL: profileImageURL,
userVerified: userVerified,
photosUrl: photoUrl)
lazy var plainTweet: ReturnedTweet = {
ReturnedTweet(
id: result.data[0].id,
text: result.data[0].text,
timeStamp: result.data[0].created_at,
authorName: authorName,
authorUsername: authorUsername,
profileImageURL: profileImageURL,
userVerified: userVerified,
photosUrl: photoUrl,
quoteTweet: nil
)
}()

return tweetToSave
guard let quoteTweetURL = getQuoteTweetLink(fromTweetText: result.data[0].text) else {
return plainTweet
}

do {
let quoteTweet = try await fetchTweet(url: quoteTweetURL.absoluteString)
return ReturnedTweet(
id: result.data[0].id,
text: result.data[0].text,
timeStamp: result.data[0].created_at,
authorName: authorName,
authorUsername: authorUsername,
profileImageURL: profileImageURL,
userVerified: userVerified,
photosUrl: photoUrl,
quoteTweet: quoteTweet
)
} catch {
debugPrint(error.localizedDescription)
return plainTweet
}
}
}
16 changes: 15 additions & 1 deletion brain-marks/Models/ReturnedTweet.swift
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,20 @@

import Foundation

struct ReturnedTweet: Codable {
class ReturnedTweet: Codable {

init(id: String, text: String, timeStamp: String, authorName: String, authorUsername: String, profileImageURL: String, userVerified: Bool, photosUrl: [String], quoteTweet: ReturnedTweet? = nil) {
self.id = id
self.text = text
self.timeStamp = timeStamp
self.authorName = authorName
self.authorUsername = authorUsername
self.profileImageURL = profileImageURL
self.userVerified = userVerified
self.photosUrl = photosUrl
self.quoteTweet = quoteTweet
}

let id: String
let text: String
let timeStamp: String
Expand All @@ -18,4 +31,5 @@ struct ReturnedTweet: Codable {
let userVerified: Bool

let photosUrl : [String]
let quoteTweet: ReturnedTweet?
}
11 changes: 11 additions & 0 deletions brain-marks/Models/Tweet.swift
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,19 @@

import Foundation

enum ReferencedTweetType: String, Codable {
case replied_to
case quoted
}

struct ReferencedTweet: Codable {
let type: ReferencedTweetType
let id: String
}

struct Tweet: Codable {
let id: String
let text: String
let created_at: String
let referenced_tweets: [ReferencedTweet]
}
1 change: 1 addition & 0 deletions brain-marks/Tweets/Views/TweetCard.swift
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ struct TweetCard: View {
TweetBodyView(tweetBody: tweet.text!.removingUrls())
}
TweetPhotosView(width: 60, maxWidth: 400, photosURL: tweet.photosURL ?? [String]())

if let timeStamp = tweet.timeStamp {
TimeStampView(timeStamp: timeStamp)
}
Expand Down
2 changes: 1 addition & 1 deletion brain-marks/Utilities/RequestBuilder.swift
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ private extension RequestBuilder {
components.path = "/2/tweets"
components.queryItems = [
URLQueryItem(name: "ids", value: id),
URLQueryItem(name: "expansions", value: "author_id,attachments.media_keys"),
URLQueryItem(name: "expansions", value: "author_id,attachments.media_keys,referenced_tweets.id"),
URLQueryItem(name: "tweet.fields", value: "created_at"),
URLQueryItem(name: "user.fields", value: "profile_image_url,verified"),
URLQueryItem(name: "media.fields", value: "preview_image_url,public_metrics,type,url")
Expand Down